diff --git a/.gitignore b/.gitignore index b41eb555e..cdcd23ad8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ test-logs *.pyc docs/_build docs/plugins +*.swp +*.swo +*~ diff --git a/locale/__init__.py b/locale/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/locale/fr.po b/locale/fr.po new file mode 100644 index 000000000..1bc929a46 --- /dev/null +++ b/locale/fr.po @@ -0,0 +1,1043 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-31 13:42+CET\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: callbacks.py:184 +msgid "Error: " +msgstr "Erreur : " + +#: callbacks.py:198 +msgid "Error: I tried to send you an empty message." +msgstr "Erreur : J'ai essayé de vous envoyer un message vide." + +#: callbacks.py:288 +msgid "Missing \"%s\". You may want to quote your arguments with double quotes in order to prevent extra brackets from being evaluated as nested commands." +msgstr "\"%s\" manquant. Vous devriez encadrer vos arguments par des guillements pour éviter que les crochets ne soient évalués comme étant des commandes imbriquées." + +#: callbacks.py:318 +msgid "\"|\" with nothing preceding. I obviously can't do a pipe with nothing before the |." +msgstr "\"|\" avec rien ne le précédant. Je ne peux évidtemment pas faire un pipe avec rien avant le |." + +#: callbacks.py:326 +msgid "Spurious \"%s\". You may want to quote your arguments with double quotes in order to prevent extra brackets from being evaluated as nested commands." +msgstr "\"%s\" en trop. Vous devriez encadrer vos arguments par des guillements pour éviter que les crochets ne soient évalués comme étant des commandes imbriquées." + +#: callbacks.py:335 +msgid "\"|\" with nothing following. I obviously can't do a pipe with nothing after the |." +msgstr "\"|\" avec rien ne le suivant. Je ne peux évidtemment pas faire un pipe avec rien après le |." + +#: callbacks.py:515 +msgid "%s is not a valid %s." +msgstr "%s n'est pas du type '%s'." + +#: callbacks.py:517 +msgid "That's not a valid %s." +msgstr "Ce n'est pas un %s valide." + +#: callbacks.py:595 +msgid "You've attempted more nesting than is currently allowed on this bot." +msgstr "Vous avez essayé de faire plus d'imbrication que ce qui est actuellement autorisé sur ce bot." + +#: callbacks.py:774 +msgid "The command %q is available in the %L plugins. Please specify the plugin whose command you wish to call by using its name as a command before %q." +msgstr "La commande %q est disponible dans les plugins %L. Veuillez spécifier dans quel plugin se trouve la commande que vous souhaitez appeler, en ajoutant le nom du plugin avant %q." + +#: callbacks.py:859 +#: callbacks.py:872 +msgid "(XX more messages)" +msgstr "(XX messages supplémentaires)" + +#: callbacks.py:904 +msgid "more message" +msgstr "message supplémentaire" + +#: callbacks.py:906 +msgid "more messages" +msgstr "messages supplémentaires" + +#: callbacks.py:1006 +msgid "" +"Determines what commands are currently disabled. Such\n" +" commands will not appear in command lists, etc. They will appear not even\n" +" to exist." +msgstr "Détermine quelles commandes sont actuellement désactivées. De telles commandes n'apparaitront pas dans la liste des commandes, etc. Ça sera comme si elles n'existaient pas." + +#: callbacks.py:1197 +msgid "Invalid arguments for %s." +msgstr "Argument invalide pour %s" + +#: callbacks.py:1223 +msgid "The %q command has no help." +msgstr "La commande %q n'a pas d'aide." + +#: commands.py:171 +msgid "integer" +msgstr "entier" + +#: commands.py:182 +msgid "non-integer value" +msgstr "valeur non entière" + +#: commands.py:193 +msgid "floating point number" +msgstr "nombre à virgule flottante" + +#: commands.py:202 +msgid "positive integer" +msgstr "entier positif" + +#: commands.py:206 +msgid "non-negative integer" +msgstr "entier non négatif" + +#: commands.py:209 +msgid "index" +msgstr "index" + +#: commands.py:234 +msgid "number of seconds" +msgstr "nombre de secondes" + +#: commands.py:241 +msgid "boolean" +msgstr "booléen" + +#: commands.py:255 +msgid "do that" +msgstr "faire ça" + +#: commands.py:259 +msgid "I'm not even in %s." +msgstr "Je ne suis pas sur %s." + +#: commands.py:261 +msgid "I need to be opped to %s." +msgstr "Je doit être opé pour %s" + +#: commands.py:278 +msgid "nick or hostmask" +msgstr "nick ou masque d'hôte" + +#: commands.py:330 +#: commands.py:333 +msgid "regular expression" +msgstr "expression régulière" + +#: commands.py:344 +msgid "That nick is too long for this server." +msgstr "Ce nick est trop long pour ce serveur." + +#: commands.py:393 +#: commands.py:412 +msgid "I'm not in %s." +msgstr "Je ne suis pas sur %s" + +#: commands.py:397 +msgid "This command may only be given in a channel that I am in." +msgstr "Cette commande ne peut être donnée que sur un canal sur lequel je suis." + +#: commands.py:410 +msgid "You must be in %s." +msgstr "Vous devez être sur %s" + +#: commands.py:414 +msgid "channel" +msgstr "canal" + +#: commands.py:421 +msgid "%s is not in %s." +msgstr "%s n'est pas sur %s" + +#: commands.py:455 +msgid "You must not give the empty string as an argument." +msgstr "Vous ne pouvez me donner une chaîne vide comme argument." + +#: commands.py:472 +msgid "This message must be sent in a channel." +msgstr "Ce message doit être envoyé sur un canal." + +#: commands.py:513 +msgid "http url" +msgstr "URL HTTP" + +#: commands.py:520 +msgid "command name" +msgstr "nom de commande" + +#: commands.py:528 +msgid "ip" +msgstr "IP" + +#: commands.py:534 +msgid "letter" +msgstr "lettre" + +#: commands.py:566 +msgid "plugin" +msgstr "plugin" + +#: commands.py:574 +msgid "irc color" +msgstr "couleur IRC" + +#: conf.py:104 +msgid "" +"Determines whether this plugin is loaded\n" +" bydefault." +msgstr "Détermine si ce plugin est chargé par défaut." + +#: conf.py:108 +msgid "" +"Determines whether this plugin is\n" +" publicly visible." +msgstr "Détermine si ce plugin est visible publiquement" + +#: conf.py:194 +msgid "Determines the bot's default nick." +msgstr "Détermine le nick par défaut du bot." + +#: conf.py:197 +msgid "" +"Determines what alternative\n" +" nicks will be used if the primary nick (supybot.nick) isn't available. A\n" +" %s in this nick is replaced by the value of supybot.nick when used. If no\n" +" alternates are given, or if all are used, the supybot.nick will be perturbed\n" +" appropriately until an unused nick is found." +msgstr "Détermine quels nicks alternatifs peuvent être utilisés si le nick principal (supybot.nick) n'est pas disponible. Un %s dans ce nick est remplacé par la valeur de supybot.nick. Si aucune alternative n'est donnée, ou si elles sont toutes déjà utilisées, supybot.nick sera modifié jusqu'à ce qu'un nick non utilisé soit trouvé." + +#: conf.py:204 +msgid "" +"Determines the bot's ident string, if the server\n" +" doesn't provide one by default." +msgstr "Détermine l'ident du bot (ce qui précède le @ dans le masque d'hôte), si le serveur n'en fourni par une par défaut." + +#: conf.py:215 +msgid "" +"Determines the user the bot sends to the server.\n" +" A standard user using the current version of the bot will be generated if\n" +" this is left empty." +msgstr "Détermine le nom réel que le bot envoie au serveur (aussi appelé nom d'utilisateur ; il peut contenir des caractères spéciaux et n'est pas obligatoirement unique). Un nom standard contenant la version actuelle du bot sera généré si vous laisser cette variable vide." + +#: conf.py:223 +msgid "Determines what networks the bot will connect to." +msgstr "Détermine à quels réseaux le bot se connecte." + +#: conf.py:264 +msgid "" +"Determines what password will be used on %s. Yes, we know that\n" +" technically passwords are server-specific and not network-specific,\n" +" but this is the best we can do right now." +msgstr "Détermine quel mot de passe sera utilisé sur %s. Oui, nous savons que les mots de passe sont en fait spécifiques aux serveurs et non et réseaux, mais nous pensons que c'est mieux comme ça." + +#: conf.py:268 +msgid "" +"Determines what servers the bot will connect to for %s. Each will\n" +" be tried in order, wrapping back to the first when the cycle is\n" +" completed." +msgstr "Détermine à quels serveurs le bot se connectera pour %s. La connexion se fera d'abord au premier serveur, puis au second si la première est raté, etc. Une fois arrivé à la fin, on recommence du début." + +#: conf.py:272 +msgid "Determines what channels the bot will join only on %s." +msgstr "Détermine quels canaux le bot rejoindra sur ce réseau %s." + +#: conf.py:275 +msgid "" +"Determines whether the bot will attempt to connect with SSL\n" +" sockets to %s." +msgstr "Détermine si le bot tentera de se connecter avec des sockets SSL à %s." + +#: conf.py:278 +msgid "" +"Determines what key (if any) will be used to join the\n" +" channel." +msgstr "Détermine quelle clef (s'il y en a) sera utilisée pour rejoindre le canal." + +#: conf.py:298 +msgid "" +"Determines how timestamps\n" +" printed for human reading should be formatted. Refer to the Python\n" +" documentation for the time module to see valid formatting characters for\n" +" time formats." +msgstr "Détermine quels timestamps sont affichés pour être lus par des humaines. Référez-vous à la documentation Python sur le module time pour plus d'information sur les formats valides." + +#: conf.py:312 +msgid "" +"Determines whether elapsed times will be given\n" +" as \"1 day, 2 hours, 3 minutes, and 15 seconds\" or as \"1d 2h 3m 15s\"." +msgstr "Détermine si un utilise des temps plus courts, c'est à dire par exemple \"1d 2h 3m 15s\" au lieu de \"1 day, 2 hours, 3 minutes, and 15 seconds\"." + +#: conf.py:322 +msgid "" +"Determines the absolute maximum length of\n" +" the bot's reply -- no reply will be passed through the bot with a length\n" +" greater than this." +msgstr "Détermine la longueur maximum absolue des réponses du bot ; le bot n'enverra aucune réponse qui dépassera ce nombre." + +#: conf.py:327 +msgid "" +"Determines whether the bot will break up long\n" +" messages into chunks and allow users to use the 'more' command to get the\n" +" remaining chunks." +msgstr "Détermine si le bot séparera les longs messages en morceaux et permettra aux utilisateurs d'utiliser la commande 'more' pour récupérer les morceaux restants." + +#: conf.py:332 +msgid "" +"Determines what the maximum number of\n" +" chunks (for use with the 'more' command) will be." +msgstr "Détermine quel est le nombre maximum de morceaux (que l'on récupère avec la commande 'more')." + +#: conf.py:336 +msgid "" +"Determines how long individual chunks\n" +" will be. If set to 0, uses our super-tweaked,\n" +" get-the-most-out-of-an-individual-message default." +msgstr "Détermine quelle est la longueur maximale des morceaux. Définir cette variable à 0 permet d'utiliser notre super algorithme pour optimiser cette longueur en fonction des paramètres du serveur." + +#: conf.py:341 +msgid "" +"Determines how many mores will be sent\n" +" instantly (i.e., without the use of the more command, immediately when\n" +" they are formed). Defaults to 1, which means that a more command will be\n" +" required for all but the first chunk." +msgstr "Détermine combien de 'more's sont envoyés immédiatement (c'est à dire, avant l'utilisation de la commande 'more', juste après que l'utilisateur ait envoyé la commande. Par défaut, cela vaut 1, ce qui signifie que seul le premier morceau est envoyé. Avant l'appel de 'more'." + +#: conf.py:347 +msgid "" +"Determines whether the bot will send\n" +" multi-message replies in a single message or in multiple messages. For\n" +" safety purposes (so the bot is less likely to flood) it will normally send\n" +" everything in a single message, using mores if necessary." +msgstr "Détermine si le bot enverra des réponses multi-messages dans un seul message ou dans plusieurs. Pour des raisons de sécurité (le bot est moins susceptible de flooder), il envoie tout dans un seul message, et les utilisateurs peuvent utiliser 'more' si nécessaire." + +#: conf.py:353 +msgid "" +"Determines whether the bot will reply with an\n" +" error message when it is addressed but not given a valid command. If this\n" +" value is False, the bot will remain silent, as long as no other plugins\n" +" override the normal behavior." +msgstr "Détermine si le bot répondra avec un message d'erreur lorsqu'un message lui est adressé, mais qu'il ne s'agit pas d'une commande valide. Si cette valeur est à False, le bot restera silencieux, du moment qu'aucun plugin ne modifie le comportement normal." + +#: conf.py:360 +msgid "" +"Determines whether error messages that result\n" +" from bugs in the bot will show a detailed error message (the uncaught\n" +" exception) or a generic error message." +msgstr "Détermine si les messages d'erreur résultant de bugs seront affichés dans un message d'erreur (l'exception non interceptée) ou si un message d'erreur générique est utilisé." + +#: conf.py:364 +msgid "" +"Determines whether the bot will send error\n" +" messages to users in private. You might want to do this in order to keep\n" +" channel traffic to minimum. This can be used in combination with\n" +" supybot.reply.error.withNotice." +msgstr "Détermine si le bot enverra les messages d'erreur en privé. Vous pouvez vouloir ceci dans le but de limiter le traffic de données sur le canal. Vous pouvez utiliser ceci en combinaison avec supybot.reply.error.withNotice." + +#: conf.py:369 +msgid "" +"Determines whether the bot will send error\n" +" messages to users via NOTICE instead of PRIVMSG. You might want to do this\n" +" so users can ignore NOTICEs from the bot and not have to see error\n" +" messages; or you might want to use it in combination with\n" +" supybot.reply.errorInPrivate so private errors don't open a query window\n" +" in most IRC clients." +msgstr "Détermine si le bot enverra les erreurs par NOTICE plutôt que par PRIVMSG. Vous pouvez faire cela pour que les utilisateurs qui ne veulent pas recevoir de message d'erreur ignorent les NOTICEs du bot. Vous pouvez utiliser cette fonctionnalité en combinaison avec supybot.reply.errorInPrivate, pour que les erreurs en privé n'ouvrent pas une nouvelle fenêtre de requête, sur la plupart des clients." + +#: conf.py:376 +msgid "" +"Determines whether the bot will send an error\n" +" message to users who attempt to call a command for which they do not have\n" +" the necessary capability. You may wish to make this True if you don't want\n" +" users to understand the underlying security system preventing them from\n" +" running certain commands." +msgstr "Détermine si le bot enverra un message d'erreur aux utilisateurs qui tentent d'appeler une commande pour laquelle ils n'ont pas de permission suffisante. Vous pouvez le mettre à True si vous ne voulez pas que les utilisateurs comprennent le système sous-jacent de permissions pour lancer certaines commandes." + +#: conf.py:383 +msgid "" +"Determines whether the bot will reply\n" +" privatelywhen replying in a channel, rather than replying to the whole\n" +" channel." +msgstr "Détermine si le bot répondra en privé, plutôt que de répondre sur le canal." + +#: conf.py:388 +msgid "" +"Determines whether the bot will reply with a\n" +" notice when replying in a channel, rather than replying with a privmsg as\n" +" normal." +msgstr "Détermine si le bot répondra par notice sur un canal plutôt que par privmsg comme d'habitude" + +#: conf.py:394 +msgid "" +"Determines whether the bot will reply with a\n" +" notice when it is sending a private message, in order not to open a /query\n" +" window in clients. This can be overridden by individual users via the user\n" +" configuration variable reply.withNoticeWhenPrivate." +msgstr "Détermine si le bot répondra avec une notice lorsque l'on s'adresse à lui en privé, pour éviter de devoir ouvrir une fenêtre /query. Ceci peut être modifié utilisateur par utilisateur via la varible de configuration reply.withNoticeWhenPrivate." + +#: conf.py:400 +msgid "" +"Determines whether the bot will always prefix\n" +" theuser's nick to its reply to that user's command." +msgstr "Détermine si le bot préfixera toujours le nick de l'utilisateur lors de ses réponses à celui-ci." + +#: conf.py:404 +msgid "" +"Determines whether the bot should attempt to\n" +" reply to all messages even if they don't address it (either via its nick\n" +" or a prefix character). If you set this to True, you almost certainly want\n" +" to set supybot.reply.whenNotCommand to False." +msgstr "Détermine si le bot tentera de répondre à tous les messages, même si ils ne lui sont pas adressés (par son nick ou par un caractère de préfixe). Si vous définissez ceci à True, vous voudrez probablement mettre supybot.reply.whenNotCommand à False." + +#: conf.py:410 +msgid "" +"Determines whether the bot will allow you to\n" +" send channel-related commands outside of that channel. Sometimes people\n" +" find it confusing if a channel-related command (like Filter.outfilter)\n" +" changes the behavior of the channel but was sent outside the channel\n" +" itself." +msgstr "Détermine si le bot vous permettra d'envoyer des commandes liées à un canal en-dehors de ce canal. Parfois, certaines personnes confondent lorsqu'une commande liée à un canal (comme Filter.outfilter) changent le comportement du canal, alors que la commande est envoyée en-dehors du canal." + +#: conf.py:417 +msgid "" +"Determines whether the bot will unidentify\n" +" someone when that person changes his or her nick. Setting this to True\n" +" will cause the bot to track such changes. It defaults to False for a\n" +" little greater security." +msgstr "Détermine si le bot will désidentifiera une personne lorsque celle-ci change son nick. Mettre ceci à True fera que le bot traquera ces changements. Il est par défaut à False pour améliorer légèrement la sécurité." + +#: conf.py:423 +msgid "" +"Determines whether the bot will always join a\n" +" channel when it's invited. If this value is False, the bot will only join\n" +" a channel if the user inviting it has the 'admin' capability (or if it's\n" +" explicitly told to join the channel using the Admin.join command)" +msgstr "Détermine si le bot joindra toujours les canaux sur lesquels il est invité. Si cette valeur est à False, le bot ne joindra un canal que si l'utilisateur l'invitant a la permission 'admin' (ou si il lui a directement envoyé la commande Admin join)" + +#: conf.py:429 +msgid "" +"Supybot normally replies with the full help\n" +" whenever a user misuses a command. If this value is set to True, the bot\n" +" will only reply with the syntax of the command (the first line of the\n" +" help) rather than the full help." +msgstr "Supybot répond normalement avec une aide complète lorsque l'utilisateur se trompe dans une commande. Si cette valeur est à True, le bot ne répondra qu'avec la syntaxe de la commande (la première ligne de l'aide), plutôt que par toute l'aide." + +#: conf.py:443 +msgid "" +"Determines what prefix characters the bot will\n" +" reply to. A prefix character is a single character that the bot will use\n" +" to determine what messages are addressed to it; when there are no prefix\n" +" characters set, it just uses its nick. Each character in this string is\n" +" interpreted individually; you can have multiple prefix chars\n" +" simultaneously, and if any one of them is used as a prefix the bot will\n" +" assume it is being addressed." +msgstr "Détermine à quel caractère de préfixe le bot réagira. Un caractère de préfixe est un caractère servant à indiquer que le message est destiné au bot ; lorsqu'il n'y a pas de caractère de préfixe, vous ne pouvez qu'utiliser le nick du bot. Chaque caractère de cette chaîne sera interprété individuellement ; vous pouvez avoir plusieurs caractères simultanément, et un seul d'entre eux suffira pour s'adresser au bot." + +#: conf.py:452 +msgid "" +"Determines what strings the\n" +" bot will reply to when they are at the beginning of the message. Whereas\n" +" prefix.chars can only be one character (although there can be many of\n" +" them), this variable is a space-separated list of strings, so you can\n" +" set something like '@@ ??' and the bot will reply when a message is\n" +" prefixed by either @@ or ??." +msgstr "Détermine à quelles chaînes le bot répondra lorsqu'elles sont au début du message. Alors que prefex.chars n'est utilisé que pour un caractère seul (même si on peut en utiliser plusieurs), cette variable est une liste de chaînes séparées par des espaces, vous pouvez donc par exemple mettre '@@ ??' et le bot répondra lorsqu'un message est préfixé par @@ ou par ??." + +#: conf.py:459 +msgid "" +"Determines whether the bot will reply when\n" +" people address it by its nick, rather than with a prefix character." +msgstr "Détermine si le bot will répondra lorsque des gens s'adresseront à lui par si nick, au lieu de ne répondre qu'aux caractères de préfixe." + +#: conf.py:462 +msgid "" +"Determines whether the bot will reply when\n" +" people address it by its nick at the end of the message, rather than at\n" +" the beginning." +msgstr "Détermine si le bot répondra lorsque les personnes mettent son nick à la fin d'un message, plutôt qu'au début." + +#: conf.py:466 +msgid "" +"Determines what extra nicks\n" +" the bot will always respond to when addressed by, even if its current nick\n" +" is something else." +msgstr "Détermine à quels nicks supplémentaires le bot répondra lorsqu'on s'adressera à lui par ceux-ci, même si le nick est actuellement utilisé." + +#: conf.py:476 +msgid "The operation succeeded." +msgstr "Opération effectuée avec succès." + +#: conf.py:477 +msgid "" +"Determines what message the bot replies with when a command succeeded.\n" +" If this configuration variable is empty, no success message will be\n" +" sent." +msgstr "Détermine quel message le bot répondra lorsqu'une commande a été effectuée avec succès. Si cette variable de configuration est vide, aucun message de succès ne sera envoyé." + +#: conf.py:482 +msgid "" +"An error has occurred and has been logged.\n" +" Please contact this bot's administrator for more information." +msgstr "Une erreur est survenue et a été logguée. Contactez l'administrateur du bot pour plus d'informations." + +#: conf.py:483 +msgid "" +"\n" +" Determines what error message the bot gives when it wants to be\n" +" ambiguous." +msgstr "Détermine quel message d'erreur le bot donnera, quand il décidera de ne pas être plus précis." + +#: conf.py:488 +msgid "" +"Your hostmask doesn't match or your password\n" +" is wrong." +msgstr "Votre masque d'hôte ne correspond pas, ou votre mot de passe est incorrect." + +#: conf.py:489 +msgid "" +"Determines what message the bot replies with when\n" +" someonetries to use a command that requires being identified or having a\n" +" password and neither credential is correct." +msgstr "Détermine quel message le bot répondra lorsque quelqu'un utiliser une commande qui nécessite d'être identifié." + +#: conf.py:495 +msgid "" +"I can't find %s in my user\n" +" database. If you didn't give a user name, then I might not know what your\n" +" user is, and you'll need to identify before this command might work." +msgstr "Je ne peux trouver %s dans ma base de données d'utilisateurs. Si vous ne m'avez pas donné un nom d'utilisateur, je ne peux savoir qui est cet utilisateur, et vous devrez vous identifier avant que cette commande fonctionne." + +#: conf.py:498 +msgid "" +"Determines what error message the bot replies with when someone tries\n" +" to accessing some information on a user the bot doesn't know about." +msgstr "Détermine quel message d'erreur est envoyé lorsque quelqu'un essaye d'accéder à une information sur un utilisateur que le bot ne connait pas." + +#: conf.py:502 +msgid "" +"You must be registered to use this command.\n" +" If you are already registered, you must either identify (using the identify\n" +" command) or add a hostmask matching your current hostmask (using the\n" +" \"hostmask add\" command)." +msgstr "Vous devez être enregistré(e) pour utiliser cette commande. Si vous êtes déjà enregistré(e), vous devez vous identifier (en utilisant la commande 'identify') ou ajouter un masque d'hôte correspondant à votre masque d'hôte courant (en utilisant la commande 'hostmask add')." + +#: conf.py:505 +msgid "" +"Determines what error message the bot\n" +" replies with when someone tries to do something that requires them to be\n" +" registered but they're not currently recognized." +msgstr "Détermine quel message d'erreur le bot renvoie lorsque quelqu'un essaye de faire quelque chose qui nécessit d'être enregistré, alors qu'il n'est pas reconnu." + +#: conf.py:510 +msgid "" +"You don't have the %s capability. If you\n" +" think that you should have this capability, be sure that you are identified\n" +" before trying again. The 'whoami' command can tell you if you're\n" +" identified." +msgstr "Vous n'avez pas la permission %s. Si vous pensez que vous l'avez, assurez-vous d'être identifié(e) et réessayez. La commande 'whoami' vous dit si vous êtes identifié(e)." + +#: conf.py:513 +msgid "" +"Determines what error message is given when the bot\n" +" is telling someone they aren't cool enough to use the command they tried to\n" +" use." +msgstr "Détermine quel message d'erreur est donné lorsqu'un utilisateur tente d'utiliser une commande à laquelle il n'y pas accès." + +#: conf.py:518 +msgid "" +"You're missing some capability you need.\n" +" This could be because you actually possess the anti-capability for the\n" +" capability that's required of you, or because the channel provides that\n" +" anti-capability by default, or because the global capabilities include\n" +" that anti-capability. Or, it could be because the channel or\n" +" supybot.capabilities.default is set to False, meaning that no commands are\n" +" allowed unless explicitly in your capabilities. Either way, you can't do\n" +" what you want to do." +msgstr "Il vous manque une permission. Ceci peut être dû au fait que vous possédez actuellement une anti-permission quant à la commande que vous tentez d'utiliser, ou que le canal fourni cette anti-capacité par défaut, ou parce que les permissions globales incluent cette anti-capacité. Cela peut également être du au fait que supybot.capabilities.default est défini à False, ce qui signifit qu'une commande n'est autorisée par défaut (elles doivent être autorisées une par une par un administrateur). En clair, vous ne pouvez pas le faire." + +#: conf.py:526 +msgid "" +"Determines what generic error message is given when the bot is telling\n" +" someone that they aren't cool enough to use the command they tried to use,\n" +" and the author of the code calling errorNoCapability didn't provide an\n" +" explicit capability for whatever reason." +msgstr "Détermine le message d'erreur générique qui est donné par le bot pour dire à quelqu'un qu'il n'a pas les permissions requises pour utiliser une commande qu'il essaye d'utiliser, si l'auteur du code appelant errorNoCapability ne fourni pas d'information explicite sur la raison de ce refus." + +#: conf.py:532 +msgid "" +"That operation cannot be done in a\n" +" channel." +msgstr "Cette opération ne peut être faite sur un canal." + +#: conf.py:533 +msgid "" +"Determines what error messages the bot sends to people\n" +" who try to do things in a channel that really should be done in\n" +" private." +msgstr "Détermine quel message d'erreur le bot envoie aux personnes qui tentent de faire quelque chose sur un canal, alors que cela doit être fait en privé." + +#: conf.py:538 +msgid "" +"This may be a bug. If you think it is,\n" +" please file a bug report at\n" +" ." +msgstr "Ceci semble être un bug. Si vous pensez que c'en est un, veillez à envoyer un rapport de bug sur ." + +#: conf.py:541 +msgid "" +"Determines what message the bot sends when it thinks you've\n" +" encountered a bug that the developers don't know about." +msgstr "Détermine quel message le bot envoie quand il pense que l'on a rencontré un bug que les développeurs ne connaissent pas." + +#: conf.py:548 +msgid "" +"A floating point number of seconds to throttle\n" +" snarfed URLs, in order to prevent loops between two bots snarfing the same\n" +" URLs and having the snarfed URL in the output of the snarf message." +msgstr "Un nombre à virgule flottante correspondant au temps (en secondes) à attendre avant de 'snarfer' la même URL, dans le but d'éviter que deux bots entrent ainsi en boucle infinie." + +#: conf.py:553 +msgid "" +"Determines the number of seconds\n" +" between running the upkeep function that flushes (commits) open databases,\n" +" collects garbage, and records some useful statistics at the debugging\n" +" level." +msgstr "Détermine le nombre de secondes entre deux exécutions de la fonction upkeep, qui rafraichit les bases de données ouvertes, vide le cache, et enregistre des statistiques utiles pour le débogage." + +#: conf.py:559 +msgid "" +"Determines whether the bot will periodically\n" +" flush data and configuration files to disk. Generally, the only time\n" +" you'll want to set this to False is when you want to modify those\n" +" configuration files by hand and don't want the bot to flush its current\n" +" version over your modifications. Do note that if you change this to False\n" +" inside the bot, your changes won't be flushed. To make this change\n" +" permanent, you must edit the registry yourself." +msgstr "Détermine si le bot rafraichira périodiquement les fichiers de données et de configuration sur le disque. Générallement, on ne défini ceci à False que lorsque l'on veut modifier ces fichiers de configuration à la main, et que l'on ne veut pas que le bot supprime les modifications en écrivant par-dessus. Notez que si vous définissez ceci à False, les changements apportés aux fichiers n'auront pas pour autant une influence sur le bot. Si vous voulez rendre ce changement définitif, vous devez éditer le registre vous-même." + +#: conf.py:584 +msgid "" +"Determines what characters are valid for quoting\n" +" arguments to commands in order to prevent them from being tokenized.\n" +" " +msgstr "Détermine quels caractères sont valides pour citer des arguments à des commandes, pour leur éviter d'être tokénisés." + +#: conf.py:591 +msgid "" +"Determines whether the bot will allow nested\n" +" commands, which rule. You definitely should keep this on." +msgstr "Détermine si le bot autorisera les commandes commandes imbriquées sur ce bot, ce qui est une fonctionnalité génial. Vous devriez vraiment garder ceci actif." + +#: conf.py:594 +msgid "" +"Determines what the maximum number of\n" +" nested commands will be; users will receive an error if they attempt\n" +" commands more nested than this." +msgstr "Détermine le nombre maximum de commandes imbriquées ; les utilisateurs recevront une erreur si ils tentent d'en mettre plus." + +#: conf.py:602 +msgid "" +"Supybot allows you to specify what brackets are\n" +" used for your nested commands. Valid sets of brackets include [], <>, and\n" +" {} (). [] has strong historical motivation, as well as being the brackets\n" +" that don't require shift. <> or () might be slightly superior because they\n" +" cannot occur in a nick. If this string is empty, nested commands will\n" +" not be allowed in this channel." +msgstr "Supybot vous permet de spécifier quels crochets sont utilisés pour vos commandes imbriquées. Sont disponibles : [], <>, {}, et (). [] est très largement le plus utilisé, car leur utilisation est la plus simple pour des claviers qwerty. <> et () tirent leur avantage du fait qu'ils ne peuvent apparaître dans un nick. Si cette chaîne est vide, les commandes imbriquées ne seront pas autorisées sur ce canal." + +#: conf.py:609 +msgid "" +"Supybot allows nested commands. Enabling this\n" +" option will allow nested commands with a syntax similar to UNIX pipes, for\n" +" example: 'bot: foo | bar'." +msgstr "Supybot permet les commandes imbriquées. Activer cette option permettra aux commandes imbriquées d'utiliser une syntaxe similaire aux 'pipes' UNIX, par exemple : 'bot: foo | bar'." + +#: conf.py:614 +msgid "" +"Determines what commands have default\n" +" plugins set, and which plugins are set to be the default for each of those\n" +" commands." +msgstr "Détermine, lorsque l'on appelle une commande appartenant à plusieurs plugins, lequel sera choisi par défaut pour chacune de ces commandes." + +#: conf.py:620 +msgid "" +"Determines what plugins automatically get precedence over all\n" +" other plugins when selecting a default plugin for a command. By\n" +" default, this includes the standard loaded plugins. You probably\n" +" shouldn't change this if you don't know what you're doing; if you do\n" +" know what you're doing, then also know that this set is\n" +" case-sensitive." +msgstr "Détermine quels plugins sont prioritaires sur tous les autres lorsque l'on recherche le plugin par défaut d'une commande. Par défaut, cela inclu les plugins standards chargés. Vous ne devriez probablement pas changer ceci, à moins de savoir ce que vous faites ; si vous savez ce que vous faites, sachez que les noms de plugins sont sensibles à la classe." + +#: conf.py:635 +msgid "" +"Determines whether the bot will defend itself\n" +" against command-flooding." +msgstr "Détermine si le bot se défendra contre les attaques par flood de commandes." + +#: conf.py:638 +msgid "" +"Determines how many commands users are\n" +" allowed per minute. If a user sends more than this many commands in any\n" +" 60 second period, he or she will be ignored for\n" +" supybot.abuse.flood.command.punishment seconds." +msgstr "Détermine le nombre maximum de commandes qu'un utilisateur peut envoyer en une minute. Si un utilisateur dépasse cette limite, il sera ignoré supybot.abuse.flood.command.punishment secondes." + +#: conf.py:643 +msgid "" +"Determines how many seconds the bot\n" +" will ignore users who flood it with commands." +msgstr "Détermine combien de secondes le bot ignorera les utilisateurs qui le floodent de commandes." + +#: conf.py:647 +msgid "" +"Determines whether the bot will defend itself\n" +" against invalid command-flooding." +msgstr "Détermine si le bot se défendra contre le flood de commandes invalides." + +#: conf.py:650 +msgid "" +"Determines how many invalid commands users\n" +" are allowed per minute. If a user sends more than this many invalid\n" +" commands in any 60 second period, he or she will be ignored for\n" +" supybot.abuse.flood.command.invalid.punishment seconds. Typically, this\n" +" value is lower than supybot.abuse.flood.command.maximum, since it's far\n" +" less likely (and far more annoying) for users to flood with invalid\n" +" commands than for them to flood with valid commands." +msgstr "Détermine le nombre maximum de commandes invalies qu'un utilisateur peut envoyer en une minute. Si un utilisateur dépasse cette limite, il sera ignoré supybot.abuse.flood.command.invalid.punishment secondes. Typiquement, cette valeur est plus petite que value is lower than supybot.abuse.flood.command.maximum, car il est plus probable que les utilisateurs floodent avec des commandes invalides qu'avec des commandes valides." + +#: conf.py:658 +msgid "" +"Determines how many seconds the bot\n" +" will ignore users who flood it with invalid commands. Typically, this\n" +" value is higher than supybot.abuse.flood.command.punishment, since it's far\n" +" less likely (and far more annoying) for users to flood witih invalid\n" +" commands than for them to flood with valid commands." +msgstr "Détermine combien de secondes le bot ignorera les utilisateurs qui le floodent de commandes invalides. Typiquement,cette valeur est plus grande que value is lower than supybot.abuse.flood.command.punishment, car il est plus probable que les utilisateurs floodent avec des commandes invalides qu'avec des commandes valides." + +#: conf.py:664 +msgid "" +"Determines whether the bot will notify people\n" +" that they're being ignored for invalid command flooding." +msgstr "Détermine si le bot notifiera les personnes lorsqu'elles se font ignorer pour flood de commande." + +#: conf.py:673 +msgid "" +"Determines the default length of time a\n" +" driver should block waiting for input." +msgstr "Détermine la durée par défaut durant laquelle un moteur réseau peut être bloquant, en attente de données entrantes." + +#: conf.py:680 +msgid "" +"Determines what driver module the bot\n" +" will use. Socket, a simple driver based on timeout sockets, is used by\n" +" default because it's simple and stable. Twisted is very stable and simple,\n" +" and if you've got Twisted installed, is probably your best bet." +msgstr "Détermine quel moteur réseau le bot utilisera. Socket, est un simple moteur basé sur des sockets bloquantes à timeout ; c'est celui utilisé par défaut. Twisted est très stable et simple, et, si vous avez Twisted installé, c'est probablement le meilleur choix." + +#: conf.py:686 +msgid "" +"Determines the maximum time the bot will\n" +" wait before attempting to reconnect to an IRC server. The bot may, of\n" +" course, reconnect earlier if possible." +msgstr "Détermine le temps maximum durant lequel le bot attendra avant de se reconnecter à un serveur IRC. Le bot peut, bien sûr, se reconnecter plus tôt, si c'est possible." + +#: conf.py:735 +msgid "" +"Determines what directory configuration data is\n" +" put into." +msgstr "Détermine dans quel répertoire les données de configuration sont." + +#: conf.py:738 +msgid "Determines what directory data is put into." +msgstr "Détermine dans quel répertoire les données sont." + +#: conf.py:740 +msgid "" +"Determines what directory backup data is put\n" +" into." +msgstr "Détermine dans quel répertoire les sauvegardes des données sont." + +#: conf.py:743 +msgid "" +"Determines what directory temporary files\n" +" are put into." +msgstr "Détermine dans quel répertoire les fichiers temporaires sont." + +#: conf.py:750 +msgid "" +"Determines what directories\n" +" the bot will look for plugins in. Accepts a comma-separated list of\n" +" strings.\n" +" This means that to add another directory, you can nest the former value and\n" +" add a new one. E.g. you can say: bot: 'config supybot.directories.plugins\n" +" [config supybot.directories.plugins], newPluginDirectory'." +msgstr "Détermine dans quel répertoire le bot recherchera les plugins. Accepte une liste de chaînes séparées par des virgules. Ce qui signifit que si vous voulez ajouter un autre répertoire, vous pouvez imbriquer la forme actuelle la nouvelle. Par exemple, vous pouvez dire : 'config supybot.directories.plugins [config supybot.directories.plugins], nouveauRepertoireDePlugins'." + +#: conf.py:758 +msgid "" +"Determines what plugins will\n" +" be loaded." +msgstr "Détermine quels plugins seront chargés." + +#: conf.py:761 +msgid "" +"Determines whether the bot will always load\n" +" important plugins (Admin, Channel, Config, Misc, Owner, and User)\n" +" regardless of what their configured state is. Generally, if these plugins\n" +" are configured not to load, you didn't do it on purpose, and you still\n" +" want them to load. Users who don't want to load these plugins are smart\n" +" enough to change the value of this variable appropriately :)" +msgstr "Détermine si le bot chargera toujours les plugins importants (Admin, Channel, Config, Misc, Owner, et User), peu importe l'état de la configuration. Généralement, si ces plugins sont configurés pour ne pas être chargés, vous ne pourrez plus les charger, et finalement, vous voudrez le faire. Les utilisateurs qui ne souhaitent pas charger ces plugins sont suffisement intelligents pour changer la valeur de cette variable de façon appropriée :)" + +#: conf.py:784 +msgid "" +"Determines what databases are available for use. If this\n" +" value is not configured (that is, if its value is empty) then sane defaults\n" +" will be provided." +msgstr "Détermine quelles bases de données sont disponibles. si cette valeur n'est pas configurée (c'est à dire si sa valeur est vide), alors une manière par défaut saine sera utilisée." + +#: conf.py:790 +msgid "" +"Determines what filename will be used\n" +" for the users database. This file will go into the directory specified by\n" +" the supybot.directories.conf variable." +msgstr "Détermine quel nom de fichier sera utilisé pour la base de données des utilisateurs. Ce fichiers ira dans le répertoire spécifié par la variable supybot.directories.conf." + +#: conf.py:794 +msgid "" +"Determines how long it takes identification to\n" +" time out. If the value is less than or equal to zero, identification never\n" +" times out." +msgstr "Détermine combien de temps au maximum un utilisateur peut rester identifié. Si cette valeur est inférieure ou égale à zéro, l'identification n'expirera jamais." + +#: conf.py:798 +msgid "" +"Determines whether the bot will allow users to\n" +" unregister their users. This can wreak havoc with already-existing\n" +" databases, so by default we don't allow it. Enable this at your own risk.\n" +" (Do also note that this does not prevent the owner of the bot from using\n" +" the unregister command.)\n" +" " +msgstr "Détermine si le bot autorisera les utilisateurs à se désenregistrer. Ceci peut provoquer des dégâts avec des bases de données déjà existantes, donc, nous ne l'autorisons pas par défaut. Activez ceci à vos risques et périls. (Notez également que ceci n'empêche pas le propriétaire du bot de se désenregistrer.)" + +#: conf.py:807 +msgid "" +"Determines what filename will be used\n" +" for the ignores database. This file will go into the directory specified\n" +" by the supybot.directories.conf variable." +msgstr "Détermine quel nom de fichier sera utilisé pour stocker la base de données d'ignorance. Ce fichiers ira dans le répertoire spécifié par la variable supybot.directories.conf." + +#: conf.py:813 +msgid "" +"Determines what filename will be used\n" +" for the channels database. This file will go into the directory specified\n" +" by the supybot.directories.conf variable." +msgstr "Détermine quel nom de fichier sera utilisé pour stocker la base de données de canaux. Ce fichiers ira dans le répertoire spécifié par la variable supybot.directories.conf." + +#: conf.py:843 +msgid "" +"Determines whether database-based plugins that\n" +" can be channel-specific will be so. This can be overridden by individual\n" +" channels. Do note that the bot needs to be restarted immediately after\n" +" changing this variable or your db plugins may not work for your channel;\n" +" also note that you may wish to set\n" +" supybot.databases.plugins.channelSpecific.link appropriately if you wish\n" +" to share a certain channel's databases globally." +msgstr "Détermine si des plugins basés sur une base de données peuvent être spécifiques à un canal. Ceci peut être surchargé pour chaque canal. Notez que le bot doit être redémarré immédiatement après avoir changé cette variable, ou vos plugins basés sur une base de données pourraient ne pas marcher pour votre canal ; notez également qui vous pouvez vouloir définir supybot.databases.plugins.channelSpecific.link de manière appropriée si vous voulez partager les bases de données de certains canaux." + +#: conf.py:851 +msgid "" +"Determines what channel global\n" +" (non-channel-specific) databases will be considered a part of. This is\n" +" helpful if you've been running channel-specific for awhile and want to turn\n" +" the databases for your primary channel into global databases. If\n" +" supybot.databases.plugins.channelSpecific.link.allow prevents linking, the\n" +" current channel will be used. Do note that the bot needs to be restarted\n" +" immediately after changing this variable or your db plugins may not work\n" +" for your channel." +msgstr "Détermine quelles bases de données de canaux seront considérées comme faisant partie de la base de données globale. Ceci est utile si vous utilisez une base de données spécifique à un canal depuis longtemps, et que vous voulez faire passer les bases de données de votre canal principal en bases de données globales. Si supybot.databases.plugins.channelSpecific.link.allow empêche la liaison, le canal courant sera utilisé. Notez que le bot doit être redémarré immédiatement après avoir changé cette variable ou vos plugins basés sur une base de données pourraient ne pas fonctionner." + +#: conf.py:860 +msgid "" +"Determines whether another channel's global\n" +" (non-channel-specific) databases will be allowed to link to this channel's\n" +" databases. Do note that the bot needs to be restarted immediately after\n" +" changing this variable or your db plugins may not work for your channel.\n" +" " +msgstr "Détermine si les bases de données globales d'un autre canal peuvent êtres liées à celles de ce canal. Notez que le bot doit être redémarré immédiatement après avoir changé cette variable ou vos plugins basés sur une base de données pourraient ne pas marcher pour votre canal." + +#: conf.py:877 +msgid "" +"Determines\n" +" whether CDB databases will be allowed as a database implementation." +msgstr "Détermine si les bases de données CDB seront autorisées comme implémentation de base de données." + +#: conf.py:880 +msgid "" +"Determines how often CDB databases will have\n" +" their modifications flushed to disk. When the number of modified records\n" +" is greater than this fraction of the total number of records, the database\n" +" will be entirely flushed to disk." +msgstr "Détermine la fréquence de sauvegarde des bases de données CDB sur le disque. Lorsque le nombre d'enregistrements modifiés est plus grand que le nombre d'enregistrements non modifiés, la base de données sera entièrement enregistrée sur le disque." + +#: conf.py:965 +msgid "" +"Determines what will be used as the\n" +" default banmask style." +msgstr "Détermine le style de masque de bannissement utilisé par défaut." + +#: conf.py:969 +msgid "" +"Determines whether the bot will strictly follow\n" +" the RFC; currently this only affects what strings are considered to be\n" +" nicks. If you're using a server or a network that requires you to message\n" +" a nick such as services@this.network.server then you you should set this to\n" +" False." +msgstr "Détermine si le bot suivra strictement la RFC ; actuellement, cela n'affecte que les chaînes considérées comme des nicks. Si vous utilisez un serveur ou un réseau qui requiert que vous envoyiez un message à un nick tel queservices@this.network.server, vous devriez défini ceci à False." + +#: conf.py:976 +msgid "" +"Determines what user modes the bot will request\n" +" from the server when it first connects. Many people might choose +i; some\n" +" networks allow +x, which indicates to the auth services on those networks\n" +" that you should be given a fake host." +msgstr "Détermine quels modes d'utilisateur le bot demandera au serveur lorsqu'il s'y connecte. Certaines personnes voudront le +i ; certains réseaux autorisent +x, ce qui indique aux services du réseau que l'on veut 'cloaker' (masquer) notre masque d'hôte." + +#: conf.py:982 +msgid "" +"Determines what vhost the bot will bind to before\n" +" connecting to the IRC server." +msgstr "Détermine quelle vhost le bot bindera avant de se connecter au serveur IRC." + +#: conf.py:986 +msgid "" +"Determines how many old messages the bot will\n" +" keep around in its history. Changing this variable will not take effect\n" +" until the bot is restarted." +msgstr "Détermine combien de vieux messages le bot gardera dans son historique. Changer cette variable ne prend effet qu'après avoir redémarré le bot." + +#: conf.py:991 +msgid "" +"A floating point number of seconds to throttle\n" +" queued messages -- that is, messages will not be sent faster than once per\n" +" throttleTime seconds." +msgstr "Un nombre à virgule flottante, correspondant à la mise en attente des messages à envoyé ; c'est à dire que les messages ne seront pas envoyé plus vite que 1 par throttleTime secondes." + +#: conf.py:996 +msgid "" +"Determines whether the bot will send PINGs to\n" +" the server it's connected to in order to keep the connection alive and\n" +" discover earlier when it breaks. Really, this option only exists for\n" +" debugging purposes: you always should make it True unless you're testing\n" +" some strange server issues." +msgstr "Détermine si le bot enverra des PINGs au serveurs auxquels il est connecté dans le but de garder la connexion active et détecter plus tôt lorsqu'elle est rompue. En fait, cette option existe surtout pour le débogage : vous devriez toujours laisser cette option à True excepté si il vous arrive des trucs bizarres avec le serveur." + +#: conf.py:1003 +msgid "" +"Determines the number of seconds between sending\n" +" pings to the server, if pings are being sent to the server." +msgstr "Détermine le nombre de secondes entre deux envois de PING au serveur, si les pings sont envoyés au serveur." + +#: conf.py:1008 +msgid "" +"Determines whether the bot will refuse\n" +" duplicate messages to be queued for delivery to the server. This is a\n" +" safety mechanism put in place to prevent plugins from sending the same\n" +" message multiple times; most of the time it doesn't matter, unless you're\n" +" doing certain kinds of plugin hacking." +msgstr "Détermine si le bot refusera de dupliquer les messages à mettre dans la queue d'envoi un serveur. C'est un mécanisme de sécurité mis en place pour éviter que les plugins envoient le même message plusieurs fois ; la plupart du temps, vous n'avez pas à vous en préoccuper, à moins que vous ne bidouilliez des plugins." + +#: conf.py:1016 +msgid "" +"Determines how many seconds must elapse between\n" +" JOINs sent to the server." +msgstr "Détermine combien de secondes doivent s'écouler entre deux envois de JOIN au serveur." + +#: conf.py:1024 +msgid "" +"Determines how many bytes the bot will\n" +" 'peek' at when looking through a URL for a doctype or title or something\n" +" similar. It'll give up after it reads this many bytes, even if it hasn't\n" +" found what it was looking for." +msgstr "Détermine combien d'octets le bot 'regarder' lorsqu'il cherchera le doctype, le title, ou autre chose dans une URL. Après avoir lu ces octets, le bot abandonnera sa recherche." + +#: conf.py:1030 +msgid "" +"Determines what proxy all HTTP requests should go\n" +" through. The value should be of the form 'host:port'." +msgstr "Détermine par quel proxy toutes les requêtes HTTP devraient passer. Cette valeur doit être de la forme 'host:port', ou être vide s'il n'y a pas de proxy." + +#: conf.py:1039 +msgid "" +"Determines whether the bot will ignore\n" +" unregistered users by default. Of course, that'll make it particularly\n" +" hard for those users to register or identify with the bot, but that's your\n" +" problem to solve." +msgstr "Détermine si le bot ignorera par défaut les utilisateurs qui ne sont pas enregistrés. Bien sûr, cela rendra très difficile pour les utilisateurs de s'enregistrer ou de s'identifier, mais c'est votre problème." + +#: conf.py:1053 +msgid "" +"A string that is the external IP of the bot. If this is the\n" +" empty string, the bot will attempt to find out its IP dynamically (though\n" +" sometimes that doesn't work, hence this variable)." +msgstr "Une chaîne qui est une IP externe du bot. Si elle est vide, le bot recherchera cette IP dynamiquement (ce qui, parfois, ne marche pas ; dans ce cas, utilisez cette variable)." + +#: conf.py:1067 +msgid "" +"Determines what the default timeout for socket\n" +" objects will be. This means that *all* sockets will timeout when this many\n" +" seconds has gone by (unless otherwise modified by the author of the code\n" +" that uses the sockets)." +msgstr "Détermine quel timeout est utilisé par défaut pour les sockets. Ceci signifit que *toutes* les sockets expireront au bout de cette durée (à moins que l'auteur du code n'ait changé cette valeur)." + +#: conf.py:1073 +msgid "" +"Determines what file the bot should write its PID\n" +" (Process ID) to, so you can kill it more easily. If it's left unset (as is\n" +" the default) then no PID file will be written. A restart is required for\n" +" changes to this variable to take effect." +msgstr "Détermine dans quel fichier le bot écrit son PID (Process ID), ce qui vous permet de le killer plus facilement. Si cette valeur est laissée vide, le PID ne sera écrit dans aucun fichier. Un redémarrage est requis pour que cette variable prenne effet." + +#: conf.py:1083 +msgid "" +"Determines whether the bot will automatically\n" +" thread all commands." +msgstr "Détermine si le bot threadera automatiquement toutes les commandes." + +#: conf.py:1086 +msgid "" +"Determines whether the bot will automatically\n" +" flush all flushers *very* often. Useful for debugging when you don't know\n" +" what's breaking or when, but think that it might be logged." +msgstr "Détermine si le bot videra automatiquement le cache *très* souvent. Utile pour déboguer lorsque vous ne savez pas ce qui ne marche pas, mais que vous pensez que ça peut être loggué." + +#: questions.py:60 +msgid "Sorry, that response was not an option." +msgstr "Désolé, cette réponse n'est pas l'une des options." + +#: questions.py:106 +msgid "Sorry, you must enter a value." +msgstr "Désolé, vous devez entrer une valeur." + +#: questions.py:126 +msgid "Enter password: " +msgstr "Entrez un mot de passe : " + +#: questions.py:128 +msgid "Re-enter password: " +msgstr "Entrez à nouveau le mot de passe : " + +#: questions.py:141 +msgid "Passwords don't match." +msgstr "Les mots de passe ne correspondent pas." + diff --git a/locale/fr.py b/locale/fr.py new file mode 100644 index 000000000..2a6884ea1 --- /dev/null +++ b/locale/fr.py @@ -0,0 +1,100 @@ +# -*- encoding: utf8 -*- +### +# Copyright (c) 2010, Valentin Lorentz +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +""" +Supybot utility functions localization in French. +""" + +def pluralize(s): + """Returns the plural of s. + """ + lowered = s.lower() + if lowered.endswith('ou') and \ + lowered in ['bijou', 'caillou', 'chou', 'genou', 'hibou', 'joujou', + 'pou']: + return s + 'x' + elif lowered.endswith('al') and \ + lowered not in ['bal', 'carnaval', 'chacal', 'festival', 'récital', + 'régal', 'cal', 'étal', 'aval', 'caracal', 'val', 'choral', + 'corral', 'galgal', 'gayal']: + return s[0:-2] + 'aux' + elif lowered.endswith('ail') and \ + lowered not in ['bail', 'corail', 'émail', 'soupirail', 'travail', + 'ventail', 'vitrail', 'aspirail', 'fermail']: + return s[0:-3] + 'aux' + elif lowered.endswith('eau'): + return s + 'x' + elif lowered == 'pare-feu': + return s + elif lowered.endswith('eu') and \ + lowered not in ['bleu', 'pneu', 'émeu', 'enfeu']: + # Note: when 'lieu' is a fish, it has a 's' ; else, it has a 'x' + return s + 'x' + else: + return s + 's' + +def depluralize(s): + """Returns the singular of s.""" + lowered = s.lower() + if lowered.endswith('aux') and \ + lowered in ['baux', 'coraux', 'émaux', 'soupiraux', 'travaux', + 'ventaux', 'vitraux', 'aspiraux', 'fermaux']: + return s[0:-3] + 'ail' + elif lowered.endswith('aux'): + return s[0:-3] + 'al' + else: + return s[0:-1] + +def ordinal(i): + """Returns i + the ordinal indicator for the number. + + Example: ordinal(3) => '3ème' + """ + i = int(i) + if i == 1: + return '1er' + else: + return '%sème' % i + +def be(i): + """Returns the form of the verb 'être' based on the number i.""" + # Note: this function is used only for the third person + if i == 1: + return 'est' + else: + return 'sont' + +def has(i): + """Returns the form of the verb 'avoir' based on the number i.""" + # Note: this function is used only for the third person + if i == 1: + return 'a' + else: + return 'ont' diff --git a/locale/messages.pot b/locale/messages.pot new file mode 100644 index 000000000..ca9e49443 --- /dev/null +++ b/locale/messages.pot @@ -0,0 +1,1042 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-31 13:42+CET\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: ./callbacks.py:184 +msgid "Error: " +msgstr "" + +#: ./callbacks.py:198 +msgid "Error: I tried to send you an empty message." +msgstr "" + +#: ./callbacks.py:288 +msgid "Missing \"%s\". You may want to quote your arguments with double quotes in order to prevent extra brackets from being evaluated as nested commands." +msgstr "" + +#: ./callbacks.py:318 +msgid "\"|\" with nothing preceding. I obviously can't do a pipe with nothing before the |." +msgstr "" + +#: ./callbacks.py:326 +msgid "Spurious \"%s\". You may want to quote your arguments with double quotes in order to prevent extra brackets from being evaluated as nested commands." +msgstr "" + +#: ./callbacks.py:335 +msgid "\"|\" with nothing following. I obviously can't do a pipe with nothing after the |." +msgstr "" + +#: ./callbacks.py:515 +msgid "%s is not a valid %s." +msgstr "" + +#: ./callbacks.py:517 +msgid "That's not a valid %s." +msgstr "" + +#: ./callbacks.py:595 +msgid "You've attempted more nesting than is currently allowed on this bot." +msgstr "" + +#: ./callbacks.py:774 +msgid "The command %q is available in the %L plugins. Please specify the plugin whose command you wish to call by using its name as a command before %q." +msgstr "" + +#: ./callbacks.py:859 ./callbacks.py:872 +msgid "(XX more messages)" +msgstr "" + +#: ./callbacks.py:904 +msgid "more message" +msgstr "" + +#: ./callbacks.py:906 +msgid "more messages" +msgstr "" + +#: ./callbacks.py:1006 +msgid "" +"Determines what commands are currently disabled. Such\n" +" commands will not appear in command lists, etc. They will appear not even\n" +" to exist." +msgstr "" + +#: ./callbacks.py:1197 +msgid "Invalid arguments for %s." +msgstr "" + +#: ./callbacks.py:1223 +msgid "The %q command has no help." +msgstr "" + +#: ./commands.py:171 +msgid "integer" +msgstr "" + +#: ./commands.py:182 +msgid "non-integer value" +msgstr "" + +#: ./commands.py:193 +msgid "floating point number" +msgstr "" + +#: ./commands.py:202 +msgid "positive integer" +msgstr "" + +#: ./commands.py:206 +msgid "non-negative integer" +msgstr "" + +#: ./commands.py:209 +msgid "index" +msgstr "" + +#: ./commands.py:234 +msgid "number of seconds" +msgstr "" + +#: ./commands.py:241 +msgid "boolean" +msgstr "" + +#: ./commands.py:255 +msgid "do that" +msgstr "" + +#: ./commands.py:259 +msgid "I'm not even in %s." +msgstr "" + +#: ./commands.py:261 +msgid "I need to be opped to %s." +msgstr "" + +#: ./commands.py:278 +msgid "nick or hostmask" +msgstr "" + +#: ./commands.py:330 ./commands.py:333 +msgid "regular expression" +msgstr "" + +#: ./commands.py:344 +msgid "That nick is too long for this server." +msgstr "" + +#: ./commands.py:393 ./commands.py:412 +msgid "I'm not in %s." +msgstr "" + +#: ./commands.py:397 +msgid "This command may only be given in a channel that I am in." +msgstr "" + +#: ./commands.py:410 +msgid "You must be in %s." +msgstr "" + +#: ./commands.py:414 +msgid "channel" +msgstr "" + +#: ./commands.py:421 +msgid "%s is not in %s." +msgstr "" + +#: ./commands.py:455 +msgid "You must not give the empty string as an argument." +msgstr "" + +#: ./commands.py:472 +msgid "This message must be sent in a channel." +msgstr "" + +#: ./commands.py:513 +msgid "http url" +msgstr "" + +#: ./commands.py:520 +msgid "command name" +msgstr "" + +#: ./commands.py:528 +msgid "ip" +msgstr "" + +#: ./commands.py:534 +msgid "letter" +msgstr "" + +#: ./commands.py:566 +msgid "plugin" +msgstr "" + +#: ./commands.py:574 +msgid "irc color" +msgstr "" + +#: ./conf.py:104 +msgid "" +"Determines whether this plugin is loaded\n" +" bydefault." +msgstr "" + +#: ./conf.py:108 +msgid "" +"Determines whether this plugin is\n" +" publicly visible." +msgstr "" + +#: ./conf.py:194 +msgid "Determines the bot's default nick." +msgstr "" + +#: ./conf.py:197 +msgid "" +"Determines what alternative\n" +" nicks will be used if the primary nick (supybot.nick) isn't available. A\n" +" %s in this nick is replaced by the value of supybot.nick when used. If no\n" +" alternates are given, or if all are used, the supybot.nick will be perturbed\n" +" appropriately until an unused nick is found." +msgstr "" + +#: ./conf.py:204 +msgid "" +"Determines the bot's ident string, if the server\n" +" doesn't provide one by default." +msgstr "" + +#: ./conf.py:215 +msgid "" +"Determines the user the bot sends to the server.\n" +" A standard user using the current version of the bot will be generated if\n" +" this is left empty." +msgstr "" + +#: ./conf.py:223 +msgid "Determines what networks the bot will connect to." +msgstr "" + +#: ./conf.py:264 +msgid "" +"Determines what password will be used on %s. Yes, we know that\n" +" technically passwords are server-specific and not network-specific,\n" +" but this is the best we can do right now." +msgstr "" + +#: ./conf.py:268 +msgid "" +"Determines what servers the bot will connect to for %s. Each will\n" +" be tried in order, wrapping back to the first when the cycle is\n" +" completed." +msgstr "" + +#: ./conf.py:272 +msgid "Determines what channels the bot will join only on %s." +msgstr "" + +#: ./conf.py:275 +msgid "" +"Determines whether the bot will attempt to connect with SSL\n" +" sockets to %s." +msgstr "" + +#: ./conf.py:278 +msgid "" +"Determines what key (if any) will be used to join the\n" +" channel." +msgstr "" + +#: ./conf.py:298 +msgid "" +"Determines how timestamps\n" +" printed for human reading should be formatted. Refer to the Python\n" +" documentation for the time module to see valid formatting characters for\n" +" time formats." +msgstr "" + +#: ./conf.py:312 +msgid "" +"Determines whether elapsed times will be given\n" +" as \"1 day, 2 hours, 3 minutes, and 15 seconds\" or as \"1d 2h 3m 15s\"." +msgstr "" + +#: ./conf.py:322 +msgid "" +"Determines the absolute maximum length of\n" +" the bot's reply -- no reply will be passed through the bot with a length\n" +" greater than this." +msgstr "" + +#: ./conf.py:327 +msgid "" +"Determines whether the bot will break up long\n" +" messages into chunks and allow users to use the 'more' command to get the\n" +" remaining chunks." +msgstr "" + +#: ./conf.py:332 +msgid "" +"Determines what the maximum number of\n" +" chunks (for use with the 'more' command) will be." +msgstr "" + +#: ./conf.py:336 +msgid "" +"Determines how long individual chunks\n" +" will be. If set to 0, uses our super-tweaked,\n" +" get-the-most-out-of-an-individual-message default." +msgstr "" + +#: ./conf.py:341 +msgid "" +"Determines how many mores will be sent\n" +" instantly (i.e., without the use of the more command, immediately when\n" +" they are formed). Defaults to 1, which means that a more command will be\n" +" required for all but the first chunk." +msgstr "" + +#: ./conf.py:347 +msgid "" +"Determines whether the bot will send\n" +" multi-message replies in a single message or in multiple messages. For\n" +" safety purposes (so the bot is less likely to flood) it will normally send\n" +" everything in a single message, using mores if necessary." +msgstr "" + +#: ./conf.py:353 +msgid "" +"Determines whether the bot will reply with an\n" +" error message when it is addressed but not given a valid command. If this\n" +" value is False, the bot will remain silent, as long as no other plugins\n" +" override the normal behavior." +msgstr "" + +#: ./conf.py:360 +msgid "" +"Determines whether error messages that result\n" +" from bugs in the bot will show a detailed error message (the uncaught\n" +" exception) or a generic error message." +msgstr "" + +#: ./conf.py:364 +msgid "" +"Determines whether the bot will send error\n" +" messages to users in private. You might want to do this in order to keep\n" +" channel traffic to minimum. This can be used in combination with\n" +" supybot.reply.error.withNotice." +msgstr "" + +#: ./conf.py:369 +msgid "" +"Determines whether the bot will send error\n" +" messages to users via NOTICE instead of PRIVMSG. You might want to do this\n" +" so users can ignore NOTICEs from the bot and not have to see error\n" +" messages; or you might want to use it in combination with\n" +" supybot.reply.errorInPrivate so private errors don't open a query window\n" +" in most IRC clients." +msgstr "" + +#: ./conf.py:376 +msgid "" +"Determines whether the bot will send an error\n" +" message to users who attempt to call a command for which they do not have\n" +" the necessary capability. You may wish to make this True if you don't want\n" +" users to understand the underlying security system preventing them from\n" +" running certain commands." +msgstr "" + +#: ./conf.py:383 +msgid "" +"Determines whether the bot will reply\n" +" privatelywhen replying in a channel, rather than replying to the whole\n" +" channel." +msgstr "" + +#: ./conf.py:388 +msgid "" +"Determines whether the bot will reply with a\n" +" notice when replying in a channel, rather than replying with a privmsg as\n" +" normal." +msgstr "" + +#: ./conf.py:394 +msgid "" +"Determines whether the bot will reply with a\n" +" notice when it is sending a private message, in order not to open a /query\n" +" window in clients. This can be overridden by individual users via the user\n" +" configuration variable reply.withNoticeWhenPrivate." +msgstr "" + +#: ./conf.py:400 +msgid "" +"Determines whether the bot will always prefix\n" +" theuser's nick to its reply to that user's command." +msgstr "" + +#: ./conf.py:404 +msgid "" +"Determines whether the bot should attempt to\n" +" reply to all messages even if they don't address it (either via its nick\n" +" or a prefix character). If you set this to True, you almost certainly want\n" +" to set supybot.reply.whenNotCommand to False." +msgstr "" + +#: ./conf.py:410 +msgid "" +"Determines whether the bot will allow you to\n" +" send channel-related commands outside of that channel. Sometimes people\n" +" find it confusing if a channel-related command (like Filter.outfilter)\n" +" changes the behavior of the channel but was sent outside the channel\n" +" itself." +msgstr "" + +#: ./conf.py:417 +msgid "" +"Determines whether the bot will unidentify\n" +" someone when that person changes his or her nick. Setting this to True\n" +" will cause the bot to track such changes. It defaults to False for a\n" +" little greater security." +msgstr "" + +#: ./conf.py:423 +msgid "" +"Determines whether the bot will always join a\n" +" channel when it's invited. If this value is False, the bot will only join\n" +" a channel if the user inviting it has the 'admin' capability (or if it's\n" +" explicitly told to join the channel using the Admin.join command)" +msgstr "" + +#: ./conf.py:429 +msgid "" +"Supybot normally replies with the full help\n" +" whenever a user misuses a command. If this value is set to True, the bot\n" +" will only reply with the syntax of the command (the first line of the\n" +" help) rather than the full help." +msgstr "" + +#: ./conf.py:443 +msgid "" +"Determines what prefix characters the bot will\n" +" reply to. A prefix character is a single character that the bot will use\n" +" to determine what messages are addressed to it; when there are no prefix\n" +" characters set, it just uses its nick. Each character in this string is\n" +" interpreted individually; you can have multiple prefix chars\n" +" simultaneously, and if any one of them is used as a prefix the bot will\n" +" assume it is being addressed." +msgstr "" + +#: ./conf.py:452 +msgid "" +"Determines what strings the\n" +" bot will reply to when they are at the beginning of the message. Whereas\n" +" prefix.chars can only be one character (although there can be many of\n" +" them), this variable is a space-separated list of strings, so you can\n" +" set something like '@@ ??' and the bot will reply when a message is\n" +" prefixed by either @@ or ??." +msgstr "" + +#: ./conf.py:459 +msgid "" +"Determines whether the bot will reply when\n" +" people address it by its nick, rather than with a prefix character." +msgstr "" + +#: ./conf.py:462 +msgid "" +"Determines whether the bot will reply when\n" +" people address it by its nick at the end of the message, rather than at\n" +" the beginning." +msgstr "" + +#: ./conf.py:466 +msgid "" +"Determines what extra nicks\n" +" the bot will always respond to when addressed by, even if its current nick\n" +" is something else." +msgstr "" + +#: ./conf.py:476 +msgid "The operation succeeded." +msgstr "" + +#: ./conf.py:477 +msgid "" +"Determines what message the bot replies with when a command succeeded.\n" +" If this configuration variable is empty, no success message will be\n" +" sent." +msgstr "" + +#: ./conf.py:482 +msgid "" +"An error has occurred and has been logged.\n" +" Please contact this bot's administrator for more information." +msgstr "" + +#: ./conf.py:483 +msgid "" +"\n" +" Determines what error message the bot gives when it wants to be\n" +" ambiguous." +msgstr "" + +#: ./conf.py:488 +msgid "" +"Your hostmask doesn't match or your password\n" +" is wrong." +msgstr "" + +#: ./conf.py:489 +msgid "" +"Determines what message the bot replies with when\n" +" someonetries to use a command that requires being identified or having a\n" +" password and neither credential is correct." +msgstr "" + +#: ./conf.py:495 +msgid "" +"I can't find %s in my user\n" +" database. If you didn't give a user name, then I might not know what your\n" +" user is, and you'll need to identify before this command might work." +msgstr "" + +#: ./conf.py:498 +msgid "" +"Determines what error message the bot replies with when someone tries\n" +" to accessing some information on a user the bot doesn't know about." +msgstr "" + +#: ./conf.py:502 +msgid "" +"You must be registered to use this command.\n" +" If you are already registered, you must either identify (using the identify\n" +" command) or add a hostmask matching your current hostmask (using the\n" +" \"hostmask add\" command)." +msgstr "" + +#: ./conf.py:505 +msgid "" +"Determines what error message the bot\n" +" replies with when someone tries to do something that requires them to be\n" +" registered but they're not currently recognized." +msgstr "" + +#: ./conf.py:510 +msgid "" +"You don't have the %s capability. If you\n" +" think that you should have this capability, be sure that you are identified\n" +" before trying again. The 'whoami' command can tell you if you're\n" +" identified." +msgstr "" + +#: ./conf.py:513 +msgid "" +"Determines what error message is given when the bot\n" +" is telling someone they aren't cool enough to use the command they tried to\n" +" use." +msgstr "" + +#: ./conf.py:518 +msgid "" +"You're missing some capability you need.\n" +" This could be because you actually possess the anti-capability for the\n" +" capability that's required of you, or because the channel provides that\n" +" anti-capability by default, or because the global capabilities include\n" +" that anti-capability. Or, it could be because the channel or\n" +" supybot.capabilities.default is set to False, meaning that no commands are\n" +" allowed unless explicitly in your capabilities. Either way, you can't do\n" +" what you want to do." +msgstr "" + +#: ./conf.py:526 +msgid "" +"Determines what generic error message is given when the bot is telling\n" +" someone that they aren't cool enough to use the command they tried to use,\n" +" and the author of the code calling errorNoCapability didn't provide an\n" +" explicit capability for whatever reason." +msgstr "" + +#: ./conf.py:532 +msgid "" +"That operation cannot be done in a\n" +" channel." +msgstr "" + +#: ./conf.py:533 +msgid "" +"Determines what error messages the bot sends to people\n" +" who try to do things in a channel that really should be done in\n" +" private." +msgstr "" + +#: ./conf.py:538 +msgid "" +"This may be a bug. If you think it is,\n" +" please file a bug report at\n" +" ." +msgstr "" + +#: ./conf.py:541 +msgid "" +"Determines what message the bot sends when it thinks you've\n" +" encountered a bug that the developers don't know about." +msgstr "" + +#: ./conf.py:548 +msgid "" +"A floating point number of seconds to throttle\n" +" snarfed URLs, in order to prevent loops between two bots snarfing the same\n" +" URLs and having the snarfed URL in the output of the snarf message." +msgstr "" + +#: ./conf.py:553 +msgid "" +"Determines the number of seconds\n" +" between running the upkeep function that flushes (commits) open databases,\n" +" collects garbage, and records some useful statistics at the debugging\n" +" level." +msgstr "" + +#: ./conf.py:559 +msgid "" +"Determines whether the bot will periodically\n" +" flush data and configuration files to disk. Generally, the only time\n" +" you'll want to set this to False is when you want to modify those\n" +" configuration files by hand and don't want the bot to flush its current\n" +" version over your modifications. Do note that if you change this to False\n" +" inside the bot, your changes won't be flushed. To make this change\n" +" permanent, you must edit the registry yourself." +msgstr "" + +#: ./conf.py:584 +msgid "" +"Determines what characters are valid for quoting\n" +" arguments to commands in order to prevent them from being tokenized.\n" +" " +msgstr "" + +#: ./conf.py:591 +msgid "" +"Determines whether the bot will allow nested\n" +" commands, which rule. You definitely should keep this on." +msgstr "" + +#: ./conf.py:594 +msgid "" +"Determines what the maximum number of\n" +" nested commands will be; users will receive an error if they attempt\n" +" commands more nested than this." +msgstr "" + +#: ./conf.py:602 +msgid "" +"Supybot allows you to specify what brackets are\n" +" used for your nested commands. Valid sets of brackets include [], <>, and\n" +" {} (). [] has strong historical motivation, as well as being the brackets\n" +" that don't require shift. <> or () might be slightly superior because they\n" +" cannot occur in a nick. If this string is empty, nested commands will\n" +" not be allowed in this channel." +msgstr "" + +#: ./conf.py:609 +msgid "" +"Supybot allows nested commands. Enabling this\n" +" option will allow nested commands with a syntax similar to UNIX pipes, for\n" +" example: 'bot: foo | bar'." +msgstr "" + +#: ./conf.py:614 +msgid "" +"Determines what commands have default\n" +" plugins set, and which plugins are set to be the default for each of those\n" +" commands." +msgstr "" + +#: ./conf.py:620 +msgid "" +"Determines what plugins automatically get precedence over all\n" +" other plugins when selecting a default plugin for a command. By\n" +" default, this includes the standard loaded plugins. You probably\n" +" shouldn't change this if you don't know what you're doing; if you do\n" +" know what you're doing, then also know that this set is\n" +" case-sensitive." +msgstr "" + +#: ./conf.py:635 +msgid "" +"Determines whether the bot will defend itself\n" +" against command-flooding." +msgstr "" + +#: ./conf.py:638 +msgid "" +"Determines how many commands users are\n" +" allowed per minute. If a user sends more than this many commands in any\n" +" 60 second period, he or she will be ignored for\n" +" supybot.abuse.flood.command.punishment seconds." +msgstr "" + +#: ./conf.py:643 +msgid "" +"Determines how many seconds the bot\n" +" will ignore users who flood it with commands." +msgstr "" + +#: ./conf.py:647 +msgid "" +"Determines whether the bot will defend itself\n" +" against invalid command-flooding." +msgstr "" + +#: ./conf.py:650 +msgid "" +"Determines how many invalid commands users\n" +" are allowed per minute. If a user sends more than this many invalid\n" +" commands in any 60 second period, he or she will be ignored for\n" +" supybot.abuse.flood.command.invalid.punishment seconds. Typically, this\n" +" value is lower than supybot.abuse.flood.command.maximum, since it's far\n" +" less likely (and far more annoying) for users to flood with invalid\n" +" commands than for them to flood with valid commands." +msgstr "" + +#: ./conf.py:658 +msgid "" +"Determines how many seconds the bot\n" +" will ignore users who flood it with invalid commands. Typically, this\n" +" value is higher than supybot.abuse.flood.command.punishment, since it's far\n" +" less likely (and far more annoying) for users to flood witih invalid\n" +" commands than for them to flood with valid commands." +msgstr "" + +#: ./conf.py:664 +msgid "" +"Determines whether the bot will notify people\n" +" that they're being ignored for invalid command flooding." +msgstr "" + +#: ./conf.py:673 +msgid "" +"Determines the default length of time a\n" +" driver should block waiting for input." +msgstr "" + +#: ./conf.py:680 +msgid "" +"Determines what driver module the bot\n" +" will use. Socket, a simple driver based on timeout sockets, is used by\n" +" default because it's simple and stable. Twisted is very stable and simple,\n" +" and if you've got Twisted installed, is probably your best bet." +msgstr "" + +#: ./conf.py:686 +msgid "" +"Determines the maximum time the bot will\n" +" wait before attempting to reconnect to an IRC server. The bot may, of\n" +" course, reconnect earlier if possible." +msgstr "" + +#: ./conf.py:735 +msgid "" +"Determines what directory configuration data is\n" +" put into." +msgstr "" + +#: ./conf.py:738 +msgid "Determines what directory data is put into." +msgstr "" + +#: ./conf.py:740 +msgid "" +"Determines what directory backup data is put\n" +" into." +msgstr "" + +#: ./conf.py:743 +msgid "" +"Determines what directory temporary files\n" +" are put into." +msgstr "" + +#: ./conf.py:750 +msgid "" +"Determines what directories\n" +" the bot will look for plugins in. Accepts a comma-separated list of\n" +" strings.\n" +" This means that to add another directory, you can nest the former value and\n" +" add a new one. E.g. you can say: bot: 'config supybot.directories.plugins\n" +" [config supybot.directories.plugins], newPluginDirectory'." +msgstr "" + +#: ./conf.py:758 +msgid "" +"Determines what plugins will\n" +" be loaded." +msgstr "" + +#: ./conf.py:761 +msgid "" +"Determines whether the bot will always load\n" +" important plugins (Admin, Channel, Config, Misc, Owner, and User)\n" +" regardless of what their configured state is. Generally, if these plugins\n" +" are configured not to load, you didn't do it on purpose, and you still\n" +" want them to load. Users who don't want to load these plugins are smart\n" +" enough to change the value of this variable appropriately :)" +msgstr "" + +#: ./conf.py:784 +msgid "" +"Determines what databases are available for use. If this\n" +" value is not configured (that is, if its value is empty) then sane defaults\n" +" will be provided." +msgstr "" + +#: ./conf.py:790 +msgid "" +"Determines what filename will be used\n" +" for the users database. This file will go into the directory specified by\n" +" the supybot.directories.conf variable." +msgstr "" + +#: ./conf.py:794 +msgid "" +"Determines how long it takes identification to\n" +" time out. If the value is less than or equal to zero, identification never\n" +" times out." +msgstr "" + +#: ./conf.py:798 +msgid "" +"Determines whether the bot will allow users to\n" +" unregister their users. This can wreak havoc with already-existing\n" +" databases, so by default we don't allow it. Enable this at your own risk.\n" +" (Do also note that this does not prevent the owner of the bot from using\n" +" the unregister command.)\n" +" " +msgstr "" + +#: ./conf.py:807 +msgid "" +"Determines what filename will be used\n" +" for the ignores database. This file will go into the directory specified\n" +" by the supybot.directories.conf variable." +msgstr "" + +#: ./conf.py:813 +msgid "" +"Determines what filename will be used\n" +" for the channels database. This file will go into the directory specified\n" +" by the supybot.directories.conf variable." +msgstr "" + +#: ./conf.py:843 +msgid "" +"Determines whether database-based plugins that\n" +" can be channel-specific will be so. This can be overridden by individual\n" +" channels. Do note that the bot needs to be restarted immediately after\n" +" changing this variable or your db plugins may not work for your channel;\n" +" also note that you may wish to set\n" +" supybot.databases.plugins.channelSpecific.link appropriately if you wish\n" +" to share a certain channel's databases globally." +msgstr "" + +#: ./conf.py:851 +msgid "" +"Determines what channel global\n" +" (non-channel-specific) databases will be considered a part of. This is\n" +" helpful if you've been running channel-specific for awhile and want to turn\n" +" the databases for your primary channel into global databases. If\n" +" supybot.databases.plugins.channelSpecific.link.allow prevents linking, the\n" +" current channel will be used. Do note that the bot needs to be restarted\n" +" immediately after changing this variable or your db plugins may not work\n" +" for your channel." +msgstr "" + +#: ./conf.py:860 +msgid "" +"Determines whether another channel's global\n" +" (non-channel-specific) databases will be allowed to link to this channel's\n" +" databases. Do note that the bot needs to be restarted immediately after\n" +" changing this variable or your db plugins may not work for your channel.\n" +" " +msgstr "" + +#: ./conf.py:877 +msgid "" +"Determines\n" +" whether CDB databases will be allowed as a database implementation." +msgstr "" + +#: ./conf.py:880 +msgid "" +"Determines how often CDB databases will have\n" +" their modifications flushed to disk. When the number of modified records\n" +" is greater than this fraction of the total number of records, the database\n" +" will be entirely flushed to disk." +msgstr "" + +#: ./conf.py:965 +msgid "" +"Determines what will be used as the\n" +" default banmask style." +msgstr "" + +#: ./conf.py:969 +msgid "" +"Determines whether the bot will strictly follow\n" +" the RFC; currently this only affects what strings are considered to be\n" +" nicks. If you're using a server or a network that requires you to message\n" +" a nick such as services@this.network.server then you you should set this to\n" +" False." +msgstr "" + +#: ./conf.py:976 +msgid "" +"Determines what user modes the bot will request\n" +" from the server when it first connects. Many people might choose +i; some\n" +" networks allow +x, which indicates to the auth services on those networks\n" +" that you should be given a fake host." +msgstr "" + +#: ./conf.py:982 +msgid "" +"Determines what vhost the bot will bind to before\n" +" connecting to the IRC server." +msgstr "" + +#: ./conf.py:986 +msgid "" +"Determines how many old messages the bot will\n" +" keep around in its history. Changing this variable will not take effect\n" +" until the bot is restarted." +msgstr "" + +#: ./conf.py:991 +msgid "" +"A floating point number of seconds to throttle\n" +" queued messages -- that is, messages will not be sent faster than once per\n" +" throttleTime seconds." +msgstr "" + +#: ./conf.py:996 +msgid "" +"Determines whether the bot will send PINGs to\n" +" the server it's connected to in order to keep the connection alive and\n" +" discover earlier when it breaks. Really, this option only exists for\n" +" debugging purposes: you always should make it True unless you're testing\n" +" some strange server issues." +msgstr "" + +#: ./conf.py:1003 +msgid "" +"Determines the number of seconds between sending\n" +" pings to the server, if pings are being sent to the server." +msgstr "" + +#: ./conf.py:1008 +msgid "" +"Determines whether the bot will refuse\n" +" duplicate messages to be queued for delivery to the server. This is a\n" +" safety mechanism put in place to prevent plugins from sending the same\n" +" message multiple times; most of the time it doesn't matter, unless you're\n" +" doing certain kinds of plugin hacking." +msgstr "" + +#: ./conf.py:1016 +msgid "" +"Determines how many seconds must elapse between\n" +" JOINs sent to the server." +msgstr "" + +#: ./conf.py:1024 +msgid "" +"Determines how many bytes the bot will\n" +" 'peek' at when looking through a URL for a doctype or title or something\n" +" similar. It'll give up after it reads this many bytes, even if it hasn't\n" +" found what it was looking for." +msgstr "" + +#: ./conf.py:1030 +msgid "" +"Determines what proxy all HTTP requests should go\n" +" through. The value should be of the form 'host:port'." +msgstr "" + +#: ./conf.py:1039 +msgid "" +"Determines whether the bot will ignore\n" +" unregistered users by default. Of course, that'll make it particularly\n" +" hard for those users to register or identify with the bot, but that's your\n" +" problem to solve." +msgstr "" + +#: ./conf.py:1053 +msgid "" +"A string that is the external IP of the bot. If this is the\n" +" empty string, the bot will attempt to find out its IP dynamically (though\n" +" sometimes that doesn't work, hence this variable)." +msgstr "" + +#: ./conf.py:1067 +msgid "" +"Determines what the default timeout for socket\n" +" objects will be. This means that *all* sockets will timeout when this many\n" +" seconds has gone by (unless otherwise modified by the author of the code\n" +" that uses the sockets)." +msgstr "" + +#: ./conf.py:1073 +msgid "" +"Determines what file the bot should write its PID\n" +" (Process ID) to, so you can kill it more easily. If it's left unset (as is\n" +" the default) then no PID file will be written. A restart is required for\n" +" changes to this variable to take effect." +msgstr "" + +#: ./conf.py:1083 +msgid "" +"Determines whether the bot will automatically\n" +" thread all commands." +msgstr "" + +#: ./conf.py:1086 +msgid "" +"Determines whether the bot will automatically\n" +" flush all flushers *very* often. Useful for debugging when you don't know\n" +" what's breaking or when, but think that it might be logged." +msgstr "" + +#: ./questions.py:60 +msgid "Sorry, that response was not an option." +msgstr "" + +#: ./questions.py:106 +msgid "Sorry, you must enter a value." +msgstr "" + +#: ./questions.py:126 +msgid "Enter password: " +msgstr "" + +#: ./questions.py:128 +msgid "Re-enter password: " +msgstr "" + +#: ./questions.py:141 +msgid "Passwords don't match." +msgstr "" + diff --git a/plugins/Admin/config.py b/plugins/Admin/config.py index cbc0f6279..c8995d2ce 100644 --- a/plugins/Admin/config.py +++ b/plugins/Admin/config.py @@ -30,6 +30,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Admin') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Admin/locale/fr.po b/plugins/Admin/locale/fr.po new file mode 100644 index 000000000..88c6d002e --- /dev/null +++ b/plugins/Admin/locale/fr.po @@ -0,0 +1,202 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-16 10:43+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: ProgVal \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: Ascii\n" + +#: plugin.py:54 +msgid "Nick/channel temporarily unavailable." +msgstr "Nick/canal temporairement indisponible" + +#: plugin.py:72 +msgid "Cannot join %s, it's full." +msgstr "Ne peut joindre %s, il est plein." + +#: plugin.py:80 +msgid "Cannot join %s, I was not invited." +msgstr "Ne peut joindre %s, pas invité." + +#: plugin.py:88 +msgid "Cannot join %s, it's banned me." +msgstr "Ne peut joindre %s, j'y suis banni." + +#: plugin.py:96 +msgid "Cannot join %s, my keyword was wrong." +msgstr "Ne peut joindre %s, mon mot de passe est mauvais." + +#: plugin.py:104 +msgid "Cannot join %s, I'm not identified with the NickServ." +msgstr "Ne peut joindre %s, je ne suis pas identifié auprès de NickServ." + +#: plugin.py:134 +msgid "" +" []\n" +"\n" +" Tell the bot to join the given channel. If is given, it is used\n" +" when attempting to join the channel.\n" +" " +msgstr "" +" []\n" +"\n" +"Dit au bot de rejoindre le canal donné. Si la est donnée, elle est utilisée pour rejoindre le canal." + +#: plugin.py:147 +msgid "I'm already too close to maximum number of channels for this network." +msgstr "Je suis déjà sur un nombre de canaux trop grand pour ce réseau." + +#: plugin.py:156 +msgid "" +"takes no arguments\n" +"\n" +" Returns the channels the bot is on. Must be given in private, in order\n" +" to protect the secrecy of secret channels.\n" +" " +msgstr "" +"Ne prend pas d'argument \n" +"\n" +"Retourne les canaux sur lesquels le bot est. Doit être en privé, dans le but d'éviter que les canaux secrets ne soient divulgués." + +#: plugin.py:166 +msgid "I'm not currently in any channels." +msgstr "Je ne suis actuellement sur aucun canal." + +#: plugin.py:172 +msgid "My connection is restricted, I can't change nicks." +msgstr "Ma connexion est restreinte, je ne peux changer de nick." + +#: plugin.py:179 +msgid "Someone else is already using that nick." +msgstr "Quelqu'un d'autre utilise déjà ce nick." + +#: plugin.py:186 +msgid "That nick is currently banned." +msgstr "Ce nick est banni." + +#: plugin.py:193 +msgid "I can't change nicks, the server said %q." +msgstr "Je ne peux changer de nick, le serveur a dit %q." + +#: plugin.py:207 +msgid "" +"[]\n" +"\n" +" Changes the bot's nick to . If no nick is given, returns the\n" +" bot's current nick.\n" +" " +msgstr "" +"[]\n" +"\n" +"Change le nick du bot à . Si aucun nick n'est donné, retourne le nick actuel du bot." + +#: plugin.py:222 +msgid "" +"[] []\n" +"\n" +" Tells the bot to part the list of channels you give it. is\n" +" only necessary if you want the bot to part a channel other than the\n" +" current channel. If is specified, use it as the part\n" +" message.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Dit au bot de partir de la liste de canaux que vous avez donnée. n'est nécessaire que si vous voulez que le bot parte d'un autre canal que l'actuel. Si la est spécifiée, elle est utilisée comme message de départ." + +#: plugin.py:240 +msgid "I'm not in %s." +msgstr "Je ne suis pas sur %s." + +#: plugin.py:252 +msgid "" +" \n" +"\n" +" Gives the user specified by (or the user to whom \n" +" currently maps) the specified capability \n" +" " +msgstr "" +" \n" +"\n" +"Donne la à l'utilisateur spécifié par (ou l'utilisateur à qui correspond )." + +#: plugin.py:272 +msgid "The \"owner\" capability can't be added in the bot. Use the supybot-adduser program (or edit the users.conf file yourself) to add an owner capability." +msgstr "La capabilité \"owner\" ne peut être ajoutée via le bot. Utilisez le programme supybot-adduser (ou éditez le fichier users.conf vous-même) pour ajouter la capacité owner." + +#: plugin.py:283 +msgid "You can't add capabilities you don't have." +msgstr "Vous ne pouvez ajouter des permissions que vous n'avez pas." + +#: plugin.py:288 +msgid "" +" \n" +"\n" +" Takes from the user specified by (or the user to whom\n" +" currently maps) the specified capability \n" +" " +msgstr "" +" \n" +"\n" +"Retire la à l'utilisateur spécifié par le (ou celui à qui correspond le )." + +#: plugin.py:300 +msgid "That user doesn't have that capability." +msgstr "Cet utilisateur n'a pas cette permission." + +#: plugin.py:302 +msgid "You can't remove capabilities you don't have." +msgstr "Vous ne pouvez retirer des permissions que vous n'avez pas." + +#: plugin.py:310 +msgid "" +" []\n" +"\n" +" This will set a persistent ignore on or the hostmask\n" +" currently associated with . is an optional argument\n" +" specifying when (in \"seconds from now\") the ignore will expire; if\n" +" it isn't given, the ignore will never automatically expire.\n" +" " +msgstr "" +" []\n" +"\n" +"Ajoute un masque d'ignorance persistant sur le , ou sur le masque d'hôte de . est un argument optionnel spécifiant quand (en \"secondes à partir de maintenant\") l'ignorance expirera ; si elle n'est pas donnée, l'ignorance n'expirera jamais." + +#: plugin.py:323 +msgid "" +"\n" +"\n" +" This will remove the persistent ignore on or the\n" +" hostmask currently associated with .\n" +" " +msgstr "" +"\n" +"\n" +"Ceci retirera le masque d'ignorance persistant sur le , ou sur le masque d'hôte associé au ." + +#: plugin.py:332 +msgid "%s wasn't in the ignores database." +msgstr "%s n'étais pas dans ma base de données d'ignorance." + +#: plugin.py:337 +msgid "" +"takes no arguments\n" +"\n" +" Lists the hostmasks that the bot is ignoring.\n" +" " +msgstr "" +"Ne prend pas d'argument\n" +"\n" +"Liste les masques d'hôte que le bot ignore." + +#: plugin.py:345 +msgid "I'm not currently globally ignoring anyone." +msgstr "Je n'ignore actuellement personne globalement." + diff --git a/plugins/Admin/messages.pot b/plugins/Admin/messages.pot new file mode 100644 index 000000000..673d31155 --- /dev/null +++ b/plugins/Admin/messages.pot @@ -0,0 +1,187 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-16 10:43+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:54 +#, docstring +msgid "Nick/channel temporarily unavailable." +msgstr "" + +#: plugin.py:72 +msgid "Cannot join %s, it's full." +msgstr "" + +#: plugin.py:80 +msgid "Cannot join %s, I was not invited." +msgstr "" + +#: plugin.py:88 +msgid "Cannot join %s, it's banned me." +msgstr "" + +#: plugin.py:96 +msgid "Cannot join %s, my keyword was wrong." +msgstr "" + +#: plugin.py:104 +msgid "Cannot join %s, I'm not identified with the NickServ." +msgstr "" + +#: plugin.py:134 +#, docstring +msgid "" +" []\n" +"\n" +" Tell the bot to join the given channel. If is given, it is used\n" +" when attempting to join the channel.\n" +" " +msgstr "" + +#: plugin.py:147 +msgid "I'm already too close to maximum number of channels for this network." +msgstr "" + +#: plugin.py:156 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the channels the bot is on. Must be given in private, in order\n" +" to protect the secrecy of secret channels.\n" +" " +msgstr "" + +#: plugin.py:166 +msgid "I'm not currently in any channels." +msgstr "" + +#: plugin.py:172 +msgid "My connection is restricted, I can't change nicks." +msgstr "" + +#: plugin.py:179 +msgid "Someone else is already using that nick." +msgstr "" + +#: plugin.py:186 +msgid "That nick is currently banned." +msgstr "" + +#: plugin.py:193 +msgid "I can't change nicks, the server said %q." +msgstr "" + +#: plugin.py:207 +#, docstring +msgid "" +"[]\n" +"\n" +" Changes the bot's nick to . If no nick is given, returns the\n" +" bot's current nick.\n" +" " +msgstr "" + +#: plugin.py:222 +#, docstring +msgid "" +"[] []\n" +"\n" +" Tells the bot to part the list of channels you give it. is\n" +" only necessary if you want the bot to part a channel other than the\n" +" current channel. If is specified, use it as the part\n" +" message.\n" +" " +msgstr "" + +#: plugin.py:240 +msgid "I'm not in %s." +msgstr "" + +#: plugin.py:252 +#, docstring +msgid "" +" \n" +"\n" +" Gives the user specified by (or the user to whom \n" +" currently maps) the specified capability \n" +" " +msgstr "" + +#: plugin.py:272 +msgid "The \"owner\" capability can't be added in the bot. Use the supybot-adduser program (or edit the users.conf file yourself) to add an owner capability." +msgstr "" + +#: plugin.py:283 +msgid "You can't add capabilities you don't have." +msgstr "" + +#: plugin.py:288 +#, docstring +msgid "" +" \n" +"\n" +" Takes from the user specified by (or the user to whom\n" +" currently maps) the specified capability \n" +" " +msgstr "" + +#: plugin.py:300 +msgid "That user doesn't have that capability." +msgstr "" + +#: plugin.py:302 +msgid "You can't remove capabilities you don't have." +msgstr "" + +#: plugin.py:310 +#, docstring +msgid "" +" []\n" +"\n" +" This will set a persistent ignore on or the hostmask\n" +" currently associated with . is an optional argument\n" +" specifying when (in \"seconds from now\") the ignore will expire; if\n" +" it isn't given, the ignore will never automatically expire.\n" +" " +msgstr "" + +#: plugin.py:323 +#, docstring +msgid "" +"\n" +"\n" +" This will remove the persistent ignore on or the\n" +" hostmask currently associated with .\n" +" " +msgstr "" + +#: plugin.py:332 +msgid "%s wasn't in the ignores database." +msgstr "" + +#: plugin.py:337 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Lists the hostmasks that the bot is ignoring.\n" +" " +msgstr "" + +#: plugin.py:345 +msgid "I'm not currently globally ignoring anyone." +msgstr "" + diff --git a/plugins/Admin/plugin.py b/plugins/Admin/plugin.py index 149d08235..0590f715c 100644 --- a/plugins/Admin/plugin.py +++ b/plugins/Admin/plugin.py @@ -1,5 +1,6 @@ ### # Copyright (c) 2002-2005, Jeremiah Fincher +# Copyright (c) 2010, Valentin Lorentz # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -38,6 +39,8 @@ import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.schedule as schedule import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Admin') class Admin(callbacks.Plugin): def __init__(self, irc): @@ -46,6 +49,7 @@ class Admin(callbacks.Plugin): self.joins = {} self.pendingNickChanges = {} + @internationalizeDocstring def do437(self, irc, msg): """Nick/channel temporarily unavailable.""" target = msg.args[0] @@ -65,7 +69,7 @@ class Admin(callbacks.Plugin): try: channel = msg.args[1] (irc, msg) = self.joins.pop(channel) - irc.error('Cannot join %s, it\'s full.' % channel) + irc.error(_('Cannot join %s, it\'s full.') % channel) except KeyError: self.log.debug('Got 471 without Admin.join being called.') @@ -73,7 +77,7 @@ class Admin(callbacks.Plugin): try: channel = msg.args[1] (irc, msg) = self.joins.pop(channel) - irc.error('Cannot join %s, I was not invited.' % channel) + irc.error(_('Cannot join %s, I was not invited.') % channel) except KeyError: self.log.debug('Got 473 without Admin.join being called.') @@ -81,7 +85,7 @@ class Admin(callbacks.Plugin): try: channel = msg.args[1] (irc, msg) = self.joins.pop(channel) - irc.error('Cannot join %s, it\'s banned me.' % channel) + irc.error(_('Cannot join %s, it\'s banned me.') % channel) except KeyError: self.log.debug('Got 474 without Admin.join being called.') @@ -89,7 +93,7 @@ class Admin(callbacks.Plugin): try: channel = msg.args[1] (irc, msg) = self.joins.pop(channel) - irc.error('Cannot join %s, my keyword was wrong.' % channel) + irc.error(_('Cannot join %s, my keyword was wrong.') % channel) except KeyError: self.log.debug('Got 475 without Admin.join being called.') @@ -97,8 +101,8 @@ class Admin(callbacks.Plugin): try: channel = msg.args[1] (irc, msg) = self.joins.pop(channel) - irc.error('Cannot join %s, I\'m not identified with the NickServ.' - % channel) + irc.error(_('Cannot join %s, I\'m not identified with the ' + 'NickServ.') % channel) except KeyError: self.log.debug('Got 515 without Admin.join being called.') @@ -125,6 +129,7 @@ class Admin(callbacks.Plugin): 'the user lacked the "admin" capability.', channel, msg.prefix) + @internationalizeDocstring def join(self, irc, msg, args, channel, key): """ [] @@ -139,13 +144,14 @@ class Admin(callbacks.Plugin): networkGroup.channels.key.get(channel).setValue(key) maxchannels = irc.state.supported.get('maxchannels', sys.maxint) if len(irc.state.channels) + 1 > maxchannels: - irc.error('I\'m already too close to maximum number of ' - 'channels for this network.', Raise=True) + irc.error(_('I\'m already too close to maximum number of ' + 'channels for this network.'), Raise=True) irc.queueMsg(networkGroup.channels.join(channel)) irc.noReply() self.joins[channel] = (irc, msg) join = wrap(join, ['validChannel', additional('something')]) + @internationalizeDocstring def channels(self, irc, msg, args): """takes no arguments @@ -157,34 +163,34 @@ class Admin(callbacks.Plugin): utils.sortBy(ircutils.toLower, L) irc.reply(format('%L', L)) else: - irc.reply('I\'m not currently in any channels.') + irc.reply(_('I\'m not currently in any channels.')) channels = wrap(channels, ['private']) def do484(self, irc, msg): irc = self.pendingNickChanges.get(irc, None) if irc is not None: - irc.error('My connection is restricted, I can\'t change nicks.') + irc.error(_('My connection is restricted, I can\'t change nicks.')) else: self.log.debug('Got 484 without Admin.nick being called.') def do433(self, irc, msg): irc = self.pendingNickChanges.get(irc, None) if irc is not None: - irc.error('Someone else is already using that nick.') + irc.error(_('Someone else is already using that nick.')) else: self.log.debug('Got 433 without Admin.nick being called.') def do435(self, irc, msg): irc = self.pendingNickChanges.get(irc, None) if irc is not None: - irc.error('That nick is currently banned.') + irc.error(_('That nick is currently banned.')) else: self.log.debug('Got 435 without Admin.nick being called.') def do438(self, irc, msg): irc = self.pendingNickChanges.get(irc, None) if irc is not None: - irc.error(format('I can\'t change nicks, the server said %q.', + irc.error(format(_('I can\'t change nicks, the server said %q.'), msg.args[2]), private=True) else: self.log.debug('Got 438 without Admin.nick being called.') @@ -196,6 +202,7 @@ class Admin(callbacks.Plugin): except KeyError: self.log.debug('Got NICK without Admin.nick being called.') + @internationalizeDocstring def nick(self, irc, msg, args, nick): """[] @@ -210,6 +217,7 @@ class Admin(callbacks.Plugin): irc.reply(irc.nick) nick = wrap(nick, [additional('nick')]) + @internationalizeDocstring def part(self, irc, msg, args, channel, reason): """[] [] @@ -229,7 +237,7 @@ class Admin(callbacks.Plugin): except KeyError: pass if channel not in irc.state.channels: - irc.error('I\'m not in %s.' % channel, Raise=True) + irc.error(_('I\'m not in %s.') % channel, Raise=True) irc.queueMsg(ircmsgs.part(channel, reason or msg.nick)) if msg.nick in irc.state.channels[channel].users: irc.noReply() @@ -239,6 +247,7 @@ class Admin(callbacks.Plugin): class capability(callbacks.Commands): + @internationalizeDocstring def add(self, irc, msg, args, user, capability): """ @@ -260,10 +269,10 @@ class Admin(callbacks.Plugin): # will depend on supybot.capabilities and its child default) but # generally means they can't mess with channel capabilities. if ircutils.strEqual(capability, 'owner'): - irc.error('The "owner" capability can\'t be added in the bot.' - ' Use the supybot-adduser program (or edit the ' + irc.error(_('The "owner" capability can\'t be added in the ' + 'bot. Use the supybot-adduser program (or edit the ' 'users.conf file yourself) to add an owner ' - 'capability.') + 'capability.')) return if ircdb.isAntiCapability(capability) or \ ircdb.checkCapability(msg.prefix, capability): @@ -271,9 +280,10 @@ class Admin(callbacks.Plugin): ircdb.users.setUser(user) irc.replySuccess() else: - irc.error('You can\'t add capabilities you don\'t have.') + irc.error(_('You can\'t add capabilities you don\'t have.')) add = wrap(add, ['otherUser', 'lowered']) + @internationalizeDocstring def remove(self, irc, msg, args, user, capability): """ @@ -287,14 +297,15 @@ class Admin(callbacks.Plugin): ircdb.users.setUser(user) irc.replySuccess() except KeyError: - irc.error('That user doesn\'t have that capability.') + irc.error(_('That user doesn\'t have that capability.')) else: - s = 'You can\'t remove capabilities you don\'t have.' + s = _('You can\'t remove capabilities you don\'t have.') irc.error(s) remove = wrap(remove, ['otherUser','lowered']) class ignore(callbacks.Commands): + @internationalizeDocstring def add(self, irc, msg, args, hostmask, expires): """ [] @@ -307,6 +318,7 @@ class Admin(callbacks.Plugin): irc.replySuccess() add = wrap(add, ['hostmask', additional('expiry', 0)]) + @internationalizeDocstring def remove(self, irc, msg, args, hostmask): """ @@ -317,9 +329,10 @@ class Admin(callbacks.Plugin): ircdb.ignores.remove(hostmask) irc.replySuccess() except KeyError: - irc.error('%s wasn\'t in the ignores database.' % hostmask) + irc.error(_('%s wasn\'t in the ignores database.') % hostmask) remove = wrap(remove, ['hostmask']) + @internationalizeDocstring def list(self, irc, msg, args): """takes no arguments @@ -329,7 +342,7 @@ class Admin(callbacks.Plugin): if ircdb.ignores.hostmasks: irc.reply(format('%L', (map(repr,ircdb.ignores.hostmasks)))) else: - irc.reply('I\'m not currently globally ignoring anyone.') + irc.reply(_('I\'m not currently globally ignoring anyone.')) list = wrap(list) diff --git a/plugins/Alias/config.py b/plugins/Alias/config.py index c83c30a58..4d37ed6a5 100644 --- a/plugins/Alias/config.py +++ b/plugins/Alias/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Alias') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Alias/locale/fr.po b/plugins/Alias/locale/fr.po new file mode 100644 index 000000000..87c3bacbe --- /dev/null +++ b/plugins/Alias/locale/fr.po @@ -0,0 +1,99 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-16 14:10+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:45 +msgid "" +"Returns the channel the msg came over or the channel given in args.\n" +"\n" +" If the channel was given in args, args is modified (the channel is\n" +" removed).\n" +" " +msgstr "" +"Retourne le canal duquel vient le message ou le canal donné en argument.\n" +"\n" +"Si le canal était donné en argument, args est modifié (le canal est supprimé)." + +#: plugin.py:164 +msgid " at least" +msgstr "au moins" + +#: plugin.py:165 +msgid "" +"\n" +"\n" +"Alias for %q." +msgstr "" +"\n" +"\n" +"Alias pour %q." + +#: plugin.py:220 +msgid "" +"\n" +"\n" +" Locks an alias so that no one else can change it.\n" +" " +msgstr "" +"\n" +"\n" +"Vérouille un alias pour que personne d'autre ne puisse le changer." + +#: plugin.py:229 +#: plugin.py:243 +msgid "There is no such alias." +msgstr "Cet alias n'existe pas." + +#: plugin.py:234 +msgid "" +"\n" +"\n" +" Unlocks an alias so that people can define new aliases over it.\n" +" " +msgstr "" +"\n" +"\n" +"Déverrouille un alias de façon à ce que des gens puissent le redéfinir." + +#: plugin.py:254 +msgid "That name isn't valid. Try %q instead." +msgstr "Ce nom n'est pas valide. Essayez plutôt %q." + +#: plugin.py:292 +msgid "" +" \n" +"\n" +" Defines an alias that executes . The \n" +" should be in the standard \"command argument [nestedcommand argument]\"\n" +" arguments to the alias; they'll be filled with the first, second, etc.\n" +" arguments. $1, $2, etc. can be used for required arguments. @1, @2,\n" +" etc. can be used for optional arguments. $* simply means \"all\n" +" remaining arguments,\" and cannot be combined with optional arguments.\n" +" " +msgstr "" +" \n" +"\n" +"Défini un alias qui exécute . L' peut être dans le standard \"commande argument [commandeimbriquee argument]\". Les arguments donnés à l'alias doivent être donnés dans l'ordre. Vous pouvez utiliser $1, $2, etc pour symboliser les arguments obligatoires qui seront donnés à l'alias, et @1, @2, etc pour symboliser ceux optionnels. $* signifie simplement *tous* les arguments restants, et ne peut être combiné avec des arguments optionnels." + +#: plugin.py:315 +msgid "" +"\n" +"\n" +" Removes the given alias, if unlocked.\n" +" " +msgstr "" +"\n" +"\n" +"Supprime l'alias donné, si il n'est pas vérouillé." + diff --git a/plugins/Alias/messages.pot b/plugins/Alias/messages.pot new file mode 100644 index 000000000..ab8d0ac06 --- /dev/null +++ b/plugins/Alias/messages.pot @@ -0,0 +1,87 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-16 14:10+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:45 +#, docstring +msgid "" +"Returns the channel the msg came over or the channel given in args.\n" +"\n" +" If the channel was given in args, args is modified (the channel is\n" +" removed).\n" +" " +msgstr "" + +#: plugin.py:164 +msgid " at least" +msgstr "" + +#: plugin.py:165 +msgid "" +"\n" +"\n" +"Alias for %q." +msgstr "" + +#: plugin.py:220 +#, docstring +msgid "" +"\n" +"\n" +" Locks an alias so that no one else can change it.\n" +" " +msgstr "" + +#: plugin.py:229 plugin.py:243 +msgid "There is no such alias." +msgstr "" + +#: plugin.py:234 +#, docstring +msgid "" +"\n" +"\n" +" Unlocks an alias so that people can define new aliases over it.\n" +" " +msgstr "" + +#: plugin.py:254 +msgid "That name isn't valid. Try %q instead." +msgstr "" + +#: plugin.py:292 +#, docstring +msgid "" +" \n" +"\n" +" Defines an alias that executes . The \n" +" should be in the standard \"command argument [nestedcommand argument]\"\n" +" arguments to the alias; they'll be filled with the first, second, etc.\n" +" arguments. $1, $2, etc. can be used for required arguments. @1, @2,\n" +" etc. can be used for optional arguments. $* simply means \"all\n" +" remaining arguments,\" and cannot be combined with optional arguments.\n" +" " +msgstr "" + +#: plugin.py:315 +#, docstring +msgid "" +"\n" +"\n" +" Removes the given alias, if unlocked.\n" +" " +msgstr "" + diff --git a/plugins/Alias/plugin.py b/plugins/Alias/plugin.py index f90eb29cf..87ce858b6 100644 --- a/plugins/Alias/plugin.py +++ b/plugins/Alias/plugin.py @@ -37,6 +37,8 @@ from supybot.commands import * import supybot.ircutils as ircutils import supybot.registry as registry import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Alias') # Copied from the old privmsgs.py. def getChannel(msg, args=()): @@ -159,9 +161,9 @@ def makeNewAlias(name, alias): self.Proxy(irc, msg, tokens) flexargs = '' if biggestDollar and (wildcard or biggestAt): - flexargs = ' at least' - doc =format('\n\nAlias for %q.', - flexargs, (biggestDollar, 'argument'), alias) + flexargs = _(' at least') + doc =format(_('\n\nAlias for %q.'), + flexargs, (biggestDollar, _('argument')), alias) f = utils.python.changeFunctionName(f, name, doc) return f @@ -213,6 +215,7 @@ class Alias(callbacks.Plugin): except AttributeError: return self.aliases[command[0]][2] + @internationalizeDocstring def lock(self, irc, msg, args, name): """ @@ -223,9 +226,10 @@ class Alias(callbacks.Plugin): conf.supybot.plugins.Alias.aliases.get(name).locked.setValue(True) irc.replySuccess() else: - irc.error('There is no such alias.') + irc.error(_('There is no such alias.')) lock = wrap(lock, [('checkCapability', 'admin'), 'commandName']) + @internationalizeDocstring def unlock(self, irc, msg, args, name): """ @@ -236,7 +240,7 @@ class Alias(callbacks.Plugin): conf.supybot.plugins.Alias.aliases.get(name).locked.setValue(False) irc.replySuccess() else: - irc.error('There is no such alias.') + irc.error(_('There is no such alias.')) unlock = wrap(unlock, [('checkCapability', 'admin'), 'commandName']) _invalidCharsRe = re.compile(r'[\[\]\s]') @@ -247,7 +251,7 @@ class Alias(callbacks.Plugin): raise AliasError, 'Names cannot contain pipes.' realName = callbacks.canonicalName(name) if name != realName: - s = format('That name isn\'t valid. Try %q instead.', realName) + s = format(_('That name isn\'t valid. Try %q instead.'), realName) raise AliasError, s name = realName if self.isCommandMethod(name): @@ -283,6 +287,7 @@ class Alias(callbacks.Plugin): else: raise AliasError, 'There is no such alias.' + @internationalizeDocstring def add(self, irc, msg, args, name, alias): """ @@ -305,6 +310,7 @@ class Alias(callbacks.Plugin): irc.error(str(e)) add = wrap(add, ['commandName', 'text']) + @internationalizeDocstring def remove(self, irc, msg, args, name): """ diff --git a/plugins/Anonymous/config.py b/plugins/Anonymous/config.py index 6fbd75829..51e6ba70b 100644 --- a/plugins/Anonymous/config.py +++ b/plugins/Anonymous/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Anonymous') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -44,20 +46,20 @@ Anonymous = conf.registerPlugin('Anonymous') # conf.registerGlobalValue(Anonymous, 'someConfigVariableName', # registry.Boolean(False, """Help for someConfigVariableName.""")) conf.registerChannelValue(conf.supybot.plugins.Anonymous, - 'requirePresenceInChannel', registry.Boolean(True, """Determines whether + 'requirePresenceInChannel', registry.Boolean(True, _("""Determines whether the bot should require people trying to use this plugin to be in the - channel they wish to anonymously send to.""")) + channel they wish to anonymously send to."""))) conf.registerGlobalValue(conf.supybot.plugins.Anonymous, 'requireRegistration', - registry.Boolean(True, """Determines whether the bot should require people - trying to use this plugin to be registered.""")) + registry.Boolean(True, _("""Determines whether the bot should require + people trying to use this plugin to be registered."""))) conf.registerGlobalValue(conf.supybot.plugins.Anonymous, 'requireCapability', - registry.String('', """Determines what capability (if any) the bot should - require people trying to use this plugin to have.""")) + registry.String('', _("""Determines what capability (if any) the bot should + require people trying to use this plugin to have."""))) conf.registerGlobalValue(conf.supybot.plugins.Anonymous, 'allowPrivateTarget', - registry.Boolean(False, """Determines whether the bot will require targets - of the "say" command to be public (i.e., channels). If this is True, the - bot will allow people to use the "say" command to send private messages to - other users.""")) + registry.Boolean(False, _("""Determines whether the bot will require + targets of the "say" command to be public (i.e., channels). If this is + True, the bot will allow people to use the "say" command to send private + messages to other users."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Anonymous/locale/fr.po b/plugins/Anonymous/locale/fr.po new file mode 100644 index 000000000..527d8bc2a --- /dev/null +++ b/plugins/Anonymous/locale/fr.po @@ -0,0 +1,80 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-16 15:14+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:49 +msgid "" +"Determines whether\n" +" the bot should require people trying to use this plugin to be in the\n" +" channel they wish to anonymously send to." +msgstr "Détermine si le bot requiérera que les gens soient sur le canal pour y envoyer des messages anonymement." + +#: config.py:53 +msgid "" +"Determines whether the bot should require\n" +" people trying to use this plugin to be registered." +msgstr "Détermine si le bot requiérera que les personnes utilisant ce plugin soient enregistrées." + +#: config.py:56 +msgid "" +"Determines what capability (if any) the bot should\n" +" require people trying to use this plugin to have." +msgstr "Détermine quelle permission (s'il y en a une) le bot requiéra que les gens utilisant ce plugin aient." + +#: config.py:59 +msgid "" +"Determines whether the bot will require \n" +" targets of the \"say\" command to be public (i.e., channels). If this is\n" +" True, the bot will allow people to use the \"say\" command to send private\n" +" messages to other users." +msgstr "Détermine si le bot requiérera que les cibles de la commande \"say\" soient publiques (c'est à dire des canaux). Si c'est True, le bot autorisera les personnes à utiliser la commande \"say\" pour envoyer des messages à d'autres utilisateurs en privé." + +#: plugin.py:41 +msgid "" +"This plugin allows users to act through the bot anonymously. The 'do'\n" +" command has the bot perform an anonymous action in a given channel, and\n" +" the 'say' command allows other people to speak through the bot. Since\n" +" this can be fairly well abused, you might want to set\n" +" supybot.plugins.Anonymous.requireCapability so only users with that\n" +" capability can use this plugin. For extra security, you can require that\n" +" the user be *in* the channel they are trying to address anonymously with\n" +" supybot.plugins.Anonymous.requirePresenceInChannel, or you can require\n" +" that the user be registered by setting\n" +" supybot.plugins.Anonymous.requireRegistration.\n" +" " +msgstr "" + +#: plugin.py:81 +msgid "" +" \n" +"\n" +" Sends to . Can only send to if\n" +" supybot.plugins.Anonymous.allowPrivateTarget is True.\n" +" " +msgstr "" +" \n" +"\n" +"Envoie le au . Vous ne pouvez envoyer à que si /cs register ##fschfsch supybot.plugins.Anonymous.allowPrivateTarget vaut True." + +#: plugin.py:95 +msgid "" +" \n" +"\n" +" Performs in .\n" +" " +msgstr "" +" \n" +"\n" +"Effectue l' sur le ." + diff --git a/plugins/Anonymous/messages.pot b/plugins/Anonymous/messages.pot new file mode 100644 index 000000000..53bc52bb4 --- /dev/null +++ b/plugins/Anonymous/messages.pot @@ -0,0 +1,79 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-16 15:14+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:49 +msgid "" +"Determines whether\n" +" the bot should require people trying to use this plugin to be in the\n" +" channel they wish to anonymously send to." +msgstr "" + +#: config.py:53 +msgid "" +"Determines whether the bot should require\n" +" people trying to use this plugin to be registered." +msgstr "" + +#: config.py:56 +msgid "" +"Determines what capability (if any) the bot should\n" +" require people trying to use this plugin to have." +msgstr "" + +#: config.py:59 +msgid "" +"Determines whether the bot will require \n" +" targets of the \"say\" command to be public (i.e., channels). If this is\n" +" True, the bot will allow people to use the \"say\" command to send private\n" +" messages to other users." +msgstr "" + +#: plugin.py:41 +#, docstring +msgid "" +"This plugin allows users to act through the bot anonymously. The 'do'\n" +" command has the bot perform an anonymous action in a given channel, and\n" +" the 'say' command allows other people to speak through the bot. Since\n" +" this can be fairly well abused, you might want to set\n" +" supybot.plugins.Anonymous.requireCapability so only users with that\n" +" capability can use this plugin. For extra security, you can require that\n" +" the user be *in* the channel they are trying to address anonymously with\n" +" supybot.plugins.Anonymous.requirePresenceInChannel, or you can require\n" +" that the user be registered by setting\n" +" supybot.plugins.Anonymous.requireRegistration.\n" +" " +msgstr "" + +#: plugin.py:81 +#, docstring +msgid "" +" \n" +"\n" +" Sends to . Can only send to if\n" +" supybot.plugins.Anonymous.allowPrivateTarget is True.\n" +" " +msgstr "" + +#: plugin.py:95 +#, docstring +msgid "" +" \n" +"\n" +" Performs in .\n" +" " +msgstr "" + diff --git a/plugins/Anonymous/plugin.py b/plugins/Anonymous/plugin.py index 9eb95260d..cdabd7efa 100644 --- a/plugins/Anonymous/plugin.py +++ b/plugins/Anonymous/plugin.py @@ -33,6 +33,8 @@ import supybot.utils as utils from supybot.commands import * import supybot.ircmsgs as ircmsgs import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Anonymous') class Anonymous(callbacks.Plugin): """This plugin allows users to act through the bot anonymously. The 'do' @@ -73,6 +75,7 @@ class Anonymous(callbacks.Plugin): action), Raise=True) + @internationalizeDocstring def say(self, irc, msg, args, target, text): """ @@ -86,6 +89,7 @@ class Anonymous(callbacks.Plugin): irc.noReply() say = wrap(say, [first('nick', 'inChannel'), 'text']) + @internationalizeDocstring def do(self, irc, msg, args, channel, text): """ @@ -97,6 +101,7 @@ class Anonymous(callbacks.Plugin): irc.queueMsg(ircmsgs.action(channel, text)) irc.noReply() do = wrap(do, ['inChannel', 'text']) +Anonymous = internationalizeDocstring(Anonymous) Class = Anonymous diff --git a/plugins/AutoMode/config.py b/plugins/AutoMode/config.py index 98f61349f..052bed457 100644 --- a/plugins/AutoMode/config.py +++ b/plugins/AutoMode/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('AutoMode') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -41,30 +43,33 @@ def configure(advanced): AutoMode = conf.registerPlugin('AutoMode') conf.registerChannelValue(AutoMode, 'enable', - registry.Boolean(True, """Determines whether this plugin is enabled.""")) + registry.Boolean(True, _("""Determines whether this plugin is enabled. + """))) conf.registerGlobalValue(AutoMode, 'owner', - registry.Boolean(True, """Determines whether this plugin will automode owners.""")) + registry.Boolean(True, _("""Determines whether this plugin will automode + owners."""))) conf.registerChannelValue(AutoMode, 'fallthrough', - registry.Boolean(False, """Determines whether the bot will "fall through" to - halfop/voicing when auto-opping is turned off but auto-halfopping/voicing - are turned on.""")) + registry.Boolean(False, _("""Determines whether the bot will "fall through + to halfop/voicing when auto-opping is turned off but + auto-halfopping/voicing are turned on."""))) conf.registerChannelValue(AutoMode, 'op', - registry.Boolean(True, """Determines whether the bot will automatically op - people with the ,op capability when they join the channel.""")) + registry.Boolean(True, _("""Determines whether the bot will automatically + op people with the ,op capability when they join the channel. + """))) conf.registerChannelValue(AutoMode, 'halfop', - registry.Boolean(True, """Determines whether the bot will automatically + registry.Boolean(True, _("""Determines whether the bot will automatically halfop people with the ,halfop capability when they join the - channel.""")) + channel."""))) conf.registerChannelValue(AutoMode, 'voice', - registry.Boolean(True, """Determines whether the bot will automatically + registry.Boolean(True, _("""Determines whether the bot will automatically voice people with the ,voice capability when they join the - channel.""")) + channel."""))) conf.registerChannelValue(AutoMode, 'ban', - registry.Boolean(True, """Determines whether the bot will automatically ban - people who join the channel and are on the banlist.""")) + registry.Boolean(True, _("""Determines whether the bot will automatically + ban people who join the channel and are on the banlist."""))) conf.registerChannelValue(AutoMode.ban, 'period', - registry.PositiveInteger(86400, """Determines how many seconds the bot will - automatically ban a person when banning.""")) + registry.PositiveInteger(86400, _("""Determines how many seconds the bot + will automatically ban a person when banning."""))) diff --git a/plugins/AutoMode/locale/fr.po b/plugins/AutoMode/locale/fr.po new file mode 100644 index 000000000..53c063034 --- /dev/null +++ b/plugins/AutoMode/locale/fr.po @@ -0,0 +1,67 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-16 18:48+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:46 +msgid "" +"Determines whether this plugin is enabled.\n" +" " +msgstr "Détermine si ce plugin est activé." + +#: config.py:49 +msgid "" +"Determines whether this plugin will automode\n" +" owners." +msgstr "Détermine si ce plugin mettra des modes automatiques sur les owners." + +#: config.py:52 +msgid "" +"Determines whether the bot will \"fall through\n" +" to halfop/voicing when auto-opping is turned off but\n" +" auto-halfopping/voicing are turned on." +msgstr "Détermine si le bot ne halfopera/voicera pas lorsque l'auto-op est désactivé, même si l'auto-halfopvoice est activé." + +#: config.py:56 +msgid "" +"Determines whether the bot will automatically\n" +" op people with the ,op capability when they join the channel.\n" +" " +msgstr "Détermine si le bot opera automatiquement les gens qui ont la capacité ,op lorsqu'ils rejoignent le canal." + +#: config.py:60 +msgid "" +"Determines whether the bot will automatically\n" +" halfop people with the ,halfop capability when they join the\n" +" channel." +msgstr "Détermine si le bot halfopera les gens qui ont la capacité ,halfop lorsqu'ils rejoignent le canal." + +#: config.py:64 +msgid "" +"Determines whether the bot will automatically\n" +" voice people with the ,voice capability when they join the\n" +" channel." +msgstr "Détermine si le bot voicera automatiquement les gens avec la capacité ,voice lorsqu'ils rejoingent le canal." + +#: config.py:68 +msgid "" +"Determines whether the bot will automatically\n" +" ban people who join the channel and are on the banlist." +msgstr "Détermine si le bot bannira automatiquement les personnes qui rejoignent le canal et qui sont sur la liste de bannissement." + +#: config.py:71 +msgid "" +"Determines how many seconds the bot\n" +" will automatically ban a person when banning." +msgstr "Détermine combien de secondes durera le bannissement que le bot posera sur une personne." + diff --git a/plugins/AutoMode/messages.pot b/plugins/AutoMode/messages.pot new file mode 100644 index 000000000..d1330c69b --- /dev/null +++ b/plugins/AutoMode/messages.pot @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-16 18:48+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "" +"Determines whether this plugin is enabled.\n" +" " +msgstr "" + +#: config.py:49 +msgid "" +"Determines whether this plugin will automode\n" +" owners." +msgstr "" + +#: config.py:52 +msgid "" +"Determines whether the bot will \"fall through\n" +" to halfop/voicing when auto-opping is turned off but\n" +" auto-halfopping/voicing are turned on." +msgstr "" + +#: config.py:56 +msgid "" +"Determines whether the bot will automatically\n" +" op people with the ,op capability when they join the channel.\n" +" " +msgstr "" + +#: config.py:60 +msgid "" +"Determines whether the bot will automatically\n" +" halfop people with the ,halfop capability when they join the\n" +" channel." +msgstr "" + +#: config.py:64 +msgid "" +"Determines whether the bot will automatically\n" +" voice people with the ,voice capability when they join the\n" +" channel." +msgstr "" + +#: config.py:68 +msgid "" +"Determines whether the bot will automatically\n" +" ban people who join the channel and are on the banlist." +msgstr "" + +#: config.py:71 +msgid "" +"Determines how many seconds the bot\n" +" will automatically ban a person when banning." +msgstr "" + diff --git a/plugins/AutoMode/plugin.py b/plugins/AutoMode/plugin.py index 8c7fd1a69..73f1a64bb 100644 --- a/plugins/AutoMode/plugin.py +++ b/plugins/AutoMode/plugin.py @@ -35,6 +35,8 @@ import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.schedule as schedule import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('AutoMode') class Continue(Exception): pass # Used below, look in the "do" function nested in doJoin. diff --git a/plugins/BadWords/config.py b/plugins/BadWords/config.py index d88d0a5f4..a2b130a4a 100644 --- a/plugins/BadWords/config.py +++ b/plugins/BadWords/config.py @@ -31,12 +31,15 @@ import time import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('BadWords') def configure(advanced): from supybot.questions import output, expect, anything, something, yn conf.registerPlugin('BadWords', True) - if yn('Would you like to add some bad words?'): - words = anything('What words? (separate individual words by spaces)') + if yn(_('Would you like to add some bad words?')): + words = anything(_('What words? (separate individual words by ' + 'spaces)')) conf.supybot.plugins.BadWords.words.set(words) class LastModifiedSetOfStrings(registry.SpaceSeparatedSetOfStrings): @@ -47,14 +50,14 @@ class LastModifiedSetOfStrings(registry.SpaceSeparatedSetOfStrings): BadWords = conf.registerPlugin('BadWords') conf.registerGlobalValue(BadWords, 'words', - LastModifiedSetOfStrings([], """Determines what words are - considered to be 'bad' so the bot won't say them.""")) + LastModifiedSetOfStrings([], _("""Determines what words are + considered to be 'bad' so the bot won't say them."""))) conf.registerGlobalValue(BadWords,'requireWordBoundaries', - registry.Boolean(False, """Determines whether the bot will require bad + registry.Boolean(False, _("""Determines whether the bot will require bad words to be independent words, or whether it will censor them within other words. For instance, if 'darn' is a bad word, then if this is true, 'darn' will be censored, but 'darnit' will not. You probably want this to be - false.""")) + false."""))) class String256(registry.String): def __call__(self): @@ -65,39 +68,39 @@ class String256(registry.String): return self.value conf.registerGlobalValue(BadWords, 'nastyChars', - String256('!@#&', """Determines what characters will replace bad words; a + String256('!@#&', _("""Determines what characters will replace bad words; a chunk of these characters matching the size of the replaced bad word will - be used to replace the bad words you've configured.""")) + be used to replace the bad words you've configured."""))) class ReplacementMethods(registry.OnlySomeStrings): validStrings = ('simple', 'nastyCharacters') conf.registerGlobalValue(BadWords, 'replaceMethod', - ReplacementMethods('nastyCharacters', """Determines the manner in which + ReplacementMethods('nastyCharacters', _("""Determines the manner in which bad words will be replaced. 'nastyCharacters' (the default) will replace a bad word with the same number of 'nasty characters' (like those used in comic books; configurable by supybot.plugins.BadWords.nastyChars). 'simple' will replace a bad word with a simple strings (regardless of the length of the bad word); this string is configurable via - supybot.plugins.BadWords.simpleReplacement.""")) + supybot.plugins.BadWords.simpleReplacement."""))) conf.registerGlobalValue(BadWords,'simpleReplacement', - registry.String('[CENSORED]', """Determines what word will replace bad - words if the replacement method is 'simple'.""")) + registry.String('[CENSORED]', _("""Determines what word will replace bad + words if the replacement method is 'simple'."""))) conf.registerGlobalValue(BadWords, 'stripFormatting', - registry.Boolean(True, """Determines whether the bot will strip + registry.Boolean(True, _("""Determines whether the bot will strip formatting characters from messages before it checks them for bad words. If this is False, it will be relatively trivial to circumvent this plugin's filtering. If it's True, however, it will interact poorly with other - plugins that do coloring or bolding of text.""")) + plugins that do coloring or bolding of text."""))) conf.registerChannelValue(BadWords, 'kick', - registry.Boolean(False, """Determines whether the bot will kick people with - a warning when they use bad words.""")) + registry.Boolean(False, _("""Determines whether the bot will kick people with + a warning when they use bad words."""))) conf.registerChannelValue(BadWords.kick, 'message', - registry.NormalizedString("""You have been kicked for using a word + registry.NormalizedString(_("""You have been kicked for using a word prohibited in the presence of this bot. Please use more appropriate - language in the future.""", """Determines the kick message used by the bot - when kicking users for saying bad words.""")) + language in the future."""), _("""Determines the kick message used by the + bot when kicking users for saying bad words."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/BadWords/locale/fr.po b/plugins/BadWords/locale/fr.po new file mode 100644 index 000000000..f1c08d634 --- /dev/null +++ b/plugins/BadWords/locale/fr.po @@ -0,0 +1,114 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-16 18:51+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:40 +msgid "Would you like to add some bad words?" +msgstr "Voulez-vous ajouter quelques mots interdits ?" + +#: config.py:41 +msgid "What words? (separate individual words by spaces)" +msgstr "Quels mots ? (séparez chaque mot par un espace)" + +#: config.py:53 +msgid "" +"Determines what words are\n" +" considered to be 'bad' so the bot won't say them." +msgstr "Détermine quels mots sont considérés comme interdits, donc le bot ne les dira pas." + +#: config.py:56 +msgid "" +"Determines whether the bot will require bad\n" +" words to be independent words, or whether it will censor them within other\n" +" words. For instance, if 'darn' is a bad word, then if this is true, 'darn'\n" +" will be censored, but 'darnit' will not. You probably want this to be\n" +" false." +msgstr "Détermine si le bot requiert que les gros mots soient indépendants, ou si ils peuvent être dans d'autres mots. Par exemple, si 'pute' est censuré et que c'est True, 'merde' sera censuré, mais pas 'emmerder'. Il est probablement mieux que ceci soit False." + +#: config.py:71 +msgid "" +"Determines what characters will replace bad words; a\n" +" chunk of these characters matching the size of the replaced bad word will\n" +" be used to replace the bad words you've configured." +msgstr "Détermine par quels caractères seront remplacés les gros mots ; un morceau de ces caractères ayant la même taille que le mot remplacé sera utilisé pour remplacer les gros mots que vous avez configurés." + +#: config.py:79 +msgid "" +"Determines the manner in which\n" +" bad words will be replaced. 'nastyCharacters' (the default) will replace a\n" +" bad word with the same number of 'nasty characters' (like those used in\n" +" comic books; configurable by supybot.plugins.BadWords.nastyChars).\n" +" 'simple' will replace a bad word with a simple strings (regardless of the\n" +" length of the bad word); this string is configurable via\n" +" supybot.plugins.BadWords.simpleReplacement." +msgstr "Détermine la manière dont les gros mots sont remplacés. 'nastyCharacters' (par défaut) remplacera un gros mot par le même nombre de 'caractères obscènes' (comme ceux utilisés dans les bandes dessinées ; configurables dans supybot.plugins.BadWords.nastyChars). 'simple' remplacera le mot pas une simple chaîne (peu importe la taille du gros mot) ; cette chaîne est configurable dans supybot.plugins.BadWords.simpleReplacement." + +#: config.py:87 +msgid "" +"Determines what word will replace bad\n" +" words if the replacement method is 'simple'." +msgstr "Détermin quel mot remplacera les mots interdits, si la méthode de remplacement est 'simple'." + +#: config.py:90 +msgid "" +"Determines whether the bot will strip\n" +" formatting characters from messages before it checks them for bad words.\n" +" If this is False, it will be relatively trivial to circumvent this plugin's\n" +" filtering. If it's True, however, it will interact poorly with other\n" +" plugins that do coloring or bolding of text." +msgstr "Détermine si le bot retirera les caractères de formattage avant de vérifier qu'ils contiennent des gros mots. Si ceci est False, ce sera relativement simple de contourner la protection. Si c'est True, toutefois, il fera perdre toute couleur ou formattage des autres plugins" + +#: config.py:97 +msgid "" +"Determines whether the bot will kick people with\n" +" a warning when they use bad words." +msgstr "Détermine si le bot kickera les gens avec un avertissement lorsqu'ils utilisent des gros mots." + +#: plugin.py:110 +msgid "" +"takes no arguments\n" +"\n" +" Returns the list of words being censored.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne une liste de mots qui sont censurés." + +#: plugin.py:120 +msgid "I'm not currently censoring any bad words." +msgstr "Je ne censure actuellement aucun mot." + +#: plugin.py:125 +msgid "" +" [ ...]\n" +"\n" +" Adds all s to the list of words the bot isn't to say.\n" +" " +msgstr "" +" [ ...]\n" +"\n" +"Ajoute tous les mots à la liste des mots que le bot ne doit pas dire." + +#: plugin.py:137 +msgid "" +" [ ...]\n" +"\n" +" Removes a s from the list of words the bot isn't to say.\n" +" " +msgstr "" +" [ ...]\n" +"\n" +"Retire les s de la liste des mots que le bot ne doit pas dire." + diff --git a/plugins/BadWords/messages.pot b/plugins/BadWords/messages.pot new file mode 100644 index 000000000..8363e3e24 --- /dev/null +++ b/plugins/BadWords/messages.pot @@ -0,0 +1,110 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-16 18:51+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:40 +msgid "Would you like to add some bad words?" +msgstr "" + +#: config.py:41 +msgid "What words? (separate individual words by spaces)" +msgstr "" + +#: config.py:53 +msgid "" +"Determines what words are\n" +" considered to be 'bad' so the bot won't say them." +msgstr "" + +#: config.py:56 +msgid "" +"Determines whether the bot will require bad\n" +" words to be independent words, or whether it will censor them within other\n" +" words. For instance, if 'darn' is a bad word, then if this is true, 'darn'\n" +" will be censored, but 'darnit' will not. You probably want this to be\n" +" false." +msgstr "" + +#: config.py:71 +msgid "" +"Determines what characters will replace bad words; a\n" +" chunk of these characters matching the size of the replaced bad word will\n" +" be used to replace the bad words you've configured." +msgstr "" + +#: config.py:79 +msgid "" +"Determines the manner in which\n" +" bad words will be replaced. 'nastyCharacters' (the default) will replace a\n" +" bad word with the same number of 'nasty characters' (like those used in\n" +" comic books; configurable by supybot.plugins.BadWords.nastyChars).\n" +" 'simple' will replace a bad word with a simple strings (regardless of the\n" +" length of the bad word); this string is configurable via\n" +" supybot.plugins.BadWords.simpleReplacement." +msgstr "" + +#: config.py:87 +msgid "" +"Determines what word will replace bad\n" +" words if the replacement method is 'simple'." +msgstr "" + +#: config.py:90 +msgid "" +"Determines whether the bot will strip\n" +" formatting characters from messages before it checks them for bad words.\n" +" If this is False, it will be relatively trivial to circumvent this plugin's\n" +" filtering. If it's True, however, it will interact poorly with other\n" +" plugins that do coloring or bolding of text." +msgstr "" + +#: config.py:97 +msgid "" +"Determines whether the bot will kick people with\n" +" a warning when they use bad words." +msgstr "" + +#: plugin.py:110 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the list of words being censored.\n" +" " +msgstr "" + +#: plugin.py:120 +msgid "I'm not currently censoring any bad words." +msgstr "" + +#: plugin.py:125 +#, docstring +msgid "" +" [ ...]\n" +"\n" +" Adds all s to the list of words the bot isn't to say.\n" +" " +msgstr "" + +#: plugin.py:137 +#, docstring +msgid "" +" [ ...]\n" +"\n" +" Removes a s from the list of words the bot isn't to say.\n" +" " +msgstr "" + diff --git a/plugins/BadWords/plugin.py b/plugins/BadWords/plugin.py index e373567a4..5ea306b00 100644 --- a/plugins/BadWords/plugin.py +++ b/plugins/BadWords/plugin.py @@ -39,6 +39,8 @@ import supybot.ircmsgs as ircmsgs from supybot.commands import * import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('BadWords') class BadWords(callbacks.Privmsg): def __init__(self, irc): @@ -103,6 +105,7 @@ class BadWords(callbacks.Privmsg): s = r'\b%s\b' % s self.regexp = re.compile(s, re.I) + @internationalizeDocstring def list(self, irc, msg, args): """takes no arguments @@ -114,9 +117,10 @@ class BadWords(callbacks.Privmsg): utils.sortBy(str.lower, L) irc.reply(format('%L', L)) else: - irc.reply('I\'m not currently censoring any bad words.') + irc.reply(_('I\'m not currently censoring any bad words.')) list = wrap(list, ['admin']) + @internationalizeDocstring def add(self, irc, msg, args, words): """ [ ...] @@ -128,6 +132,7 @@ class BadWords(callbacks.Privmsg): irc.replySuccess() add = wrap(add, ['admin', many('something')]) + @internationalizeDocstring def remove(self, irc, msg, args, words): """ [ ...] diff --git a/plugins/Channel/config.py b/plugins/Channel/config.py index 023073dde..2e6217435 100644 --- a/plugins/Channel/config.py +++ b/plugins/Channel/config.py @@ -32,6 +32,8 @@ import supybot.conf as conf import supybot.utils as utils import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Channel') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -43,8 +45,8 @@ def configure(advanced): Channel = conf.registerPlugin('Channel') conf.registerChannelValue(Channel, 'alwaysRejoin', - registry.Boolean(True, """Determines whether the bot will always try to - rejoin a channel whenever it's kicked from the channel.""")) + registry.Boolean(True, _("""Determines whether the bot will always try to + rejoin a channel whenever it's kicked from the channel."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Channel/locale/fr.po b/plugins/Channel/locale/fr.po new file mode 100644 index 000000000..b63a969fd --- /dev/null +++ b/plugins/Channel/locale/fr.po @@ -0,0 +1,686 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-25 13:10+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:48 +msgid "" +"Determines whether the bot will always try to\n" +" rejoin a channel whenever it's kicked from the channel." +msgstr "Détermine si le bot tentera toujours de rejoindre un canal duquel il a été kické." + +#: plugin.py:69 +msgid "" +"[] [ ...]\n" +"\n" +" Sets the mode in to , sending the arguments given.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Définit le sur le canal, en envoyant les arguments donnés. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:76 +msgid "change the mode" +msgstr "changer le mode" + +#: plugin.py:80 +msgid "" +"[] []\n" +"\n" +" Sets the channel limit to . If is 0, or isn't given,\n" +" removes the channel limit. is only necessary if the message\n" +" isn't sent in the channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Définit la du canal. Si est 0, ou n'est pas donné, supprime la limite du canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:90 +msgid "change the limit" +msgstr "changer la limite" + +#: plugin.py:95 +msgid "" +"[]\n" +"\n" +" Sets +m on , making it so only ops and voiced users can\n" +" send messages to the channel. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Définit le +m sur le canal, ce qui fait que seuls les ops et les utilisateurs voicés peuvent envoyer des message au canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:102 +msgid "moderate the channel" +msgstr "modérer le canal" + +#: plugin.py:106 +msgid "" +"[]\n" +"\n" +" Sets -m on , making it so everyone can\n" +" send messages to the channel. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Définit le -m sur le , ce qui fait que tout le monde peut à nouveau envoyer des messages au canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:114 +msgid "unmoderate the channel" +msgstr "démodérer le canal" + +#: plugin.py:118 +msgid "" +"[] []\n" +"\n" +" Sets the keyword in to . If is not given, removes\n" +" the keyword requirement to join . is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Définit la du . Si la n'est pas donnée, retire la clef du . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:130 +msgid "change the keyword" +msgstr "changer la clef" + +#: plugin.py:135 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will give all the s\n" +" you provide ops. If you don't provide any s, this will op you.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Si vous avez la permission #canal,op, ceci vous permet de oper tous les s. Si vous ne fournissez aucun , ceci vous opera. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:147 +msgid "op someone" +msgstr "oper quelqu'un" + +#: plugin.py:151 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,halfop capability, this will give all the\n" +" s you provide halfops. If you don't provide any s, this\n" +" will give you halfops. is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Si vous avez la permission #canal,halfop, ceci vous permet de halfoper tous les s. Si vous ne fournissez aucun , ceci vous halfopera. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:163 +msgid "halfop someone" +msgstr "halfoper quelqu'un" + +#: plugin.py:168 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,voice capability, this will voice all the\n" +" s you provide. If you don't provide any s, this will\n" +" voice you. is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Si vous avez la permission #canal,voice, ceci vous permet de voicer tous les s. Si vous ne fournissez aucun , ceci vous voicera. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:190 +msgid "voice someone" +msgstr "voicer quelqu'un" + +#: plugin.py:195 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will remove operator\n" +" privileges from all the nicks given. If no nicks are given, removes\n" +" operator privileges from the person sending the message.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Si vous avez la permission #canal,op, ceci vous permet de déoper tous les s. Si vous ne fournissez aucun , ceci vous déopera. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:202 +msgid "I cowardly refuse to deop myself. If you really want me deopped, tell me to op you and then deop me yourself." +msgstr "Je suis trop couard pour me déoper moi-même. Si vous voulez vraiment me déoper, dîtes-moi de vous oper, et déopez-moi vous-même." + +#: plugin.py:210 +msgid "deop someone" +msgstr "déoper quelqu'un" + +#: plugin.py:215 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will remove half-operator\n" +" privileges from all the nicks given. If no nicks are given, removes\n" +" half-operator privileges from the person sending the message.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Si vous avez la permission #canal,op, ceci vous permet de déhalfoper tous les s. Si vous ne fournissez aucun , ceci vous déhalfopera. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:222 +msgid "I cowardly refuse to dehalfop myself. If you really want me dehalfopped, tell me to op you and then dehalfop me yourself." +msgstr "Je suis trop couard pour me déhalfoper moi-même. Si vous voulez vraiment me déhalfoper, dîtes-moi de vous oper, et déhalfopez-moi vous-même." + +#: plugin.py:230 +msgid "dehalfop someone" +msgstr "déhalfoper quelqu'un" + +#: plugin.py:235 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will remove voice from all\n" +" the nicks given. If no nicks are given, removes voice from the person\n" +" sending the message.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Si vous avez la permission #canal,op, ceci vous permet de dévoicer tous les s. Si vous ne fournissez aucun , ceci vous dévoicera. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:242 +msgid "I cowardly refuse to devoice myself. If you really want me devoiced, tell me to op you and then devoice me yourself." +msgstr "Je suis trop couard pour me dévoicer moi-même. Si vous voulez vraiment me dévoicer, dîtes-moi de vous oper, et dévoicez-moi vous-même." + +#: plugin.py:255 +msgid "" +"[]\n" +"\n" +" If you have the #channel,op capability, this will cause the bot to\n" +" \"cycle\", or PART and then JOIN the channel. is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Si vous avez la capacité #canal,op,, ceci fera \"cycler\" le bot, ou un PART et un JOIN. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:268 +msgid "" +"[] [, , ...] []\n" +"\n" +" Kicks (s) from for . If isn't given,\n" +" uses the nick of the person making the command as the reason.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] [, , ...] []\n" +"\n" +"Kicke le(s) (s) du pour la . Si la raison n'est pas donnée, le nick de la personne envoyant la commande est utilisé. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:276 +msgid "I cowardly refuse to kick myself." +msgstr "Je suis trop couard pour me kicker moi-même." + +#: plugin.py:281 +msgid "The reason you gave is longer than the allowed length for a KICK reason on this server." +msgstr "La raison que vous avez donnée est plus longue que la taille autorisée pour une raison de KICK sur ce serveur." + +#: plugin.py:286 +msgid "kick someone" +msgstr "kicker quelqu'un" + +#: plugin.py:292 +msgid "" +"[] [--{exact,nick,user,host}] [] []\n" +"\n" +" If you have the #channel,op capability, this will kickban for\n" +" as many seconds as you specify, or else (if you specify 0 seconds or\n" +" don't specify a number of seconds) it will ban the person indefinitely.\n" +" --exact bans only the exact hostmask; --nick bans just the nick;\n" +" --user bans just the user, and --host bans just the host. You can\n" +" combine these options as you choose. is a reason to give for\n" +" the kick.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] [--{exact,nick,user,host}] [] []\n" +"\n" +"Si vous avez la capacité #canal,op, ceci kickbannira pendant le nombre de que vous avez spécifiées, ou, si vous n'avez rien indiqué (ou indiqué 0), bannira la personne indéfiniment.--exact ne bannit que le masque d'hôte exacte ; --nick bannit le nick ; --user bannit l'ident ; --host bannit l'hôte. Vous pouvez combiner ces options à votre gré. est une raison que vous donnez pour le kick. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:311 +msgid "I cowardly refuse to kickban myself." +msgstr "Je suis trop couard pour me kickbannir moi-même." + +#: plugin.py:318 +msgid "I haven't seen %s." +msgstr "Je n'ai jamais vu %s." + +#: plugin.py:326 +msgid "I cowardly refuse to ban myself." +msgstr "Je suis trop couard pour me bannir moi-même." + +#: plugin.py:352 +msgid "%s has %s too, you can't ban him/her/it." +msgstr "%s est aussi %s, je ne peux le/la bannir." + +#: plugin.py:364 +msgid "kick or ban someone" +msgstr "kicker ou bannir quelqu'un" + +#: plugin.py:371 +msgid "" +"[] []\n" +"\n" +" Unbans on . If is not given, unbans\n" +" any hostmask currently banned on that matches your current\n" +" hostmask. Especially useful for unbanning yourself when you get\n" +" unexpectedly (or accidentally) banned from the channel. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Débannit le du . Si le n'est pas donné, débannit tous les masques d'hôte qui correspondent à votre masque d'hôte actuel. Particulièrement utile lorsque vous avez été banni(e) de manière inatendue ou accidentelle d'un canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:388 +msgid "All bans on %s matching %s have been removed." +msgstr "Tous les bannissements sur %s correspondant à %s ont été supprimés." + +#: plugin.py:392 +msgid "No bans matching %s were found on %s." +msgstr "Aucun bannissement correspondant à % n'a été trouvé sur %s." + +#: plugin.py:395 +msgid "unban someone" +msgstr "débannir quelqu'un" + +#: plugin.py:400 +msgid "" +"[] \n" +"\n" +" If you have the #channel,op capability, this will invite \n" +" to join . is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Si vous avez la capacité #canal,op, ceci invitera à rejoindre le . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:409 +msgid "invite someone" +msgstr "inviter quelqu'un" + +#: plugin.py:428 +msgid "%s is already in %s." +msgstr "%s est déjà sur %s." + +#: plugin.py:435 +msgid "There is no %s on this network." +msgstr "Il n'y a aucun %s sur ce réseau." + +#: plugin.py:447 +msgid "" +"[]\n" +"\n" +" If you have the #channel,op capability, this will \"lobotomize\" the\n" +" bot, making it silent and unanswering to all requests made in the\n" +" channel. is only necessary if the message isn't sent in\n" +" the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Si vous avez la capacité #canal,op, ceci \"lobotomisera\" le bot, c'est à dire qu'il sera silencieux et ne répondra plus à aucune requête faite sur le canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:462 +msgid "" +"[]\n" +"\n" +" If you have the #channel,op capability, this will unlobotomize the\n" +" bot, making it respond to requests made in the channel again.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Si vous avez la capacité #canal,op, ceci \"dé-lobotomisera\" le bot, c'est à dire qu'il ne sera plus silencieux et répondra à nouveau aux requêtes faites sur le canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:477 +msgid "" +"takes no arguments\n" +"\n" +" Returns the channels in which this bot is lobotomized.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne les canaux sur lesquels le bot est lobotomisé." + +#: plugin.py:492 +msgid "I'm currently lobotomized in %L." +msgstr "Je suis actuellement lobotomisé sur %L." + +#: plugin.py:495 +msgid "I'm not currently lobotomized in any channels that you're in." +msgstr "Je ne suis actuellement lobotomisé sur aucun canal où vous êtes." + +#: plugin.py:502 +msgid "" +"[] []\n" +"\n" +" If you have the #channel,op capability, this will effect a\n" +" persistent ban from interacting with the bot on the given\n" +" (or the current hostmask associated with . Other\n" +" plugins may enforce this ban by actually banning users with\n" +" matching hostmasks when they join. is an optional\n" +" argument specifying when (in \"seconds from now\") the ban should\n" +" expire; if none is given, the ban will never automatically expire.\n" +" is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Si vous avez la capacité #canal,op, ceci affectera un bannisement persistant au spécifié. D'autres plugins pourraient renforcer ce bannissement en bannissant vraiment les utilisateurs correspondant à ce masque d'hôte lorsqu'ils entrent. est un argument option, correspondant à la durée, en secondes, que doit avoir le bannissement." + +#: plugin.py:522 +msgid "" +"[] \n" +"\n" +" If you have the #channel,op capability, this will remove the\n" +" persistent ban on . is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Si vous avez la capacité #canal,op, ceci supprimera le bannissement persistant sur le . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:534 +msgid "There are no persistent bans for that hostmask." +msgstr "Il n'y a pas de bannissement persistant pour ce masque d'hôte." + +#: plugin.py:539 +msgid "" +"[]\n" +"\n" +" If you have the #channel,op capability, this will show you the\n" +" current persistent bans on #channel.\n" +" " +msgstr "" +"[]\n" +"\n" +"Si vous avez la capacité #canal,op, ceci vous affichera la liste des bannissements persistants sur le canal." + +#: plugin.py:549 +msgid "%q (expires %t)" +msgstr "%q (expire dans %t)" + +#: plugin.py:552 +msgid "%q (never expires)" +msgstr "%q (n'expire jamais)" + +#: plugin.py:556 +msgid "There are no persistent bans on %s." +msgstr "Il n'y a pas de bannissement persistant sur %s." + +#: plugin.py:563 +msgid "" +"[] []\n" +"\n" +" If you have the #channel,op capability, this will set a persistent\n" +" ignore on or the hostmask currently\n" +" associated with . is an optional argument\n" +" specifying when (in \"seconds from now\") the ignore will expire; if\n" +" it isn't given, the ignore will never automatically expire.\n" +" is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Vous permet d'ajouter un ignore persistant sur le , ou le masque associé au , à condition d'avoir la capacité #canal,op. est un argument optionnel, correspondant au nombre de secondes durant lesquelles l'ignore sera effectif ; si il n'est pas donné, l'ignore n'expirera jamais. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:581 +msgid "" +"[] \n" +"\n" +" If you have the #channel,op capability, this will remove the\n" +" persistent ignore on in the channel. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Si vous avez la capacité #canal,op, ceci supprimera le masque d'ignorance persistant du sur le canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:593 +msgid "There are no ignores for that hostmask." +msgstr "Il n'y a pas d'ignorance pour ce masque d'hôte." + +#: plugin.py:598 +msgid "" +"[]\n" +"\n" +" Lists the hostmasks that the bot is ignoring on the given channel.\n" +" is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Liste les masques d'hôte que le bot ignore sur le canal donné. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:607 +msgid "I'm not currently ignoring any hostmasks in %q" +msgstr "Je n'ignore actuellement aucun masque d'hôte sur %q." + +#: plugin.py:618 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will give the user\n" +" (or the user to whom maps)\n" +" the capability in the channel. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Vous permet de donner à l'utilisateur (ou celui ayant actuellement le ) la sur le canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:634 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will take from the\n" +" user currently identified as (or the user to whom \n" +" maps) the capability in the channel. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +" Vous permet de prendre la de l'utilisateur (ou celui à qui appartient le , à condition que vous ayez la permission #canal,op. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:653 +msgid "That user didn't have the %L %s." +msgstr "Cet utilisateur n'a pas les %L %s." + +#: plugin.py:662 +msgid "" +"[] {True|False}\n" +"\n" +" If you have the #channel,op capability, this will set the default\n" +" response to non-power-related (that is, not {op, halfop, voice}\n" +" capabilities to be the value you give. is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] {on|off}\n" +"\n" +"Si vous avez la capacité #canal,op, cela vous permet de définir la réponse par défaut relative aux problèmes de pouvoir nécessaire op, halfop, voice). n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:680 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will add the channel\n" +" capability for all users in the channel. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Si vous avez la capacité #canal,op ceci ajoutera la de canal à tous les utilisateurs du canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:695 +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will unset the channel\n" +" capability so each user's specific capability or the\n" +" channel default capability will take precedence. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Si vous avez la capacité #canal,op ceci désactivera le fait que tous les utilisateurs du canal aient la de canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:711 +msgid "capability" +msgstr "permission" + +#: plugin.py:714 +msgid "I do not know about the %L %s." +msgstr "Je ne sais rien à propos des %L %s." + +#: plugin.py:721 +msgid "" +"[]\n" +"\n" +" Returns the capabilities present on the . is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne les capacité présentes sur le . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:733 +msgid "" +"[] [] []\n" +"\n" +" If you have the #channel,op capability, this will disable the \n" +" in . If is provided, will be disabled only\n" +" for that plugin. If only is provided, all commands in the\n" +" given plugin will be disabled. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [] []\n" +"\n" +" Si vous avez la permission #canal,op, ceci désactive la sur le . Si le est fourni, toutes les commandes de ce plugin seront désactivées. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:749 +#: plugin.py:788 +msgid "The %s plugin does not have a command called %s." +msgstr "Le plugin %s n'a pas de commande appelée %s." + +#: plugin.py:756 +#: plugin.py:795 +msgid "No plugin or command named %s could be found." +msgstr "Aucun plugin ou commande appelé %s n'a pû être trouvé." + +#: plugin.py:772 +msgid "" +"[] [] []\n" +"\n" +" If you have the #channel,op capability, this will enable the \n" +" in if it has been disabled. If is provided,\n" +" will be enabled only for that plugin. If only is\n" +" provided, all commands in the given plugin will be enabled. \n" +" is only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [] []\n" +"\n" +"Si vous avez la permission #canal,op, ceci activera la sur le , si elle a auparavant été désactivée. Si le seule la commande de ce plugin sera activée. n'est nécessaire n'est pas envoyé sur le canal lui-même." + +#: plugin.py:809 +msgid "%s was not disabled." +msgstr "%s n'était pas désactivé." + +#: plugin.py:818 +msgid "" +"[]\n" +"\n" +" Returns the nicks in . is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne les nick sur le . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:829 +msgid "You don't have access to that information." +msgstr "Vous n'avez pas accès à cette information" + +#: plugin.py:837 +msgid "" +"Internal message for notifying all the #channel,ops in a channel of\n" +" a given situation." +msgstr "Message interne pour notifier tous les #canal,ops sur un canal d'une situation donnée." + +#: plugin.py:840 +msgid "Alert to all %s ops: %s" +msgstr "Alerte à tous les ops de %s : %s" + +#: plugin.py:842 +msgid " (from %s)" +msgstr "(de %s)" + +#: plugin.py:850 +msgid "" +"[] \n" +"\n" +" Sends to all the users in who have the ,op\n" +" capability.\n" +" " +msgstr "" +"[] \n" +"\n" +"Envoie le à tous les utilisateurs sur qui ont la capacité #canal,op." + diff --git a/plugins/Channel/messages.pot b/plugins/Channel/messages.pot new file mode 100644 index 000000000..ee821ac23 --- /dev/null +++ b/plugins/Channel/messages.pot @@ -0,0 +1,617 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-25 13:10+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:48 +msgid "" +"Determines whether the bot will always try to\n" +" rejoin a channel whenever it's kicked from the channel." +msgstr "" + +#: plugin.py:69 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" Sets the mode in to , sending the arguments given.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:76 +msgid "change the mode" +msgstr "" + +#: plugin.py:80 +#, docstring +msgid "" +"[] []\n" +"\n" +" Sets the channel limit to . If is 0, or isn't given,\n" +" removes the channel limit. is only necessary if the message\n" +" isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:90 +msgid "change the limit" +msgstr "" + +#: plugin.py:95 +#, docstring +msgid "" +"[]\n" +"\n" +" Sets +m on , making it so only ops and voiced users can\n" +" send messages to the channel. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:102 +msgid "moderate the channel" +msgstr "" + +#: plugin.py:106 +#, docstring +msgid "" +"[]\n" +"\n" +" Sets -m on , making it so everyone can\n" +" send messages to the channel. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:114 +msgid "unmoderate the channel" +msgstr "" + +#: plugin.py:118 +#, docstring +msgid "" +"[] []\n" +"\n" +" Sets the keyword in to . If is not given, removes\n" +" the keyword requirement to join . is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:130 +msgid "change the keyword" +msgstr "" + +#: plugin.py:135 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will give all the s\n" +" you provide ops. If you don't provide any s, this will op you.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:147 +msgid "op someone" +msgstr "" + +#: plugin.py:151 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,halfop capability, this will give all the\n" +" s you provide halfops. If you don't provide any s, this\n" +" will give you halfops. is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:163 +msgid "halfop someone" +msgstr "" + +#: plugin.py:168 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,voice capability, this will voice all the\n" +" s you provide. If you don't provide any s, this will\n" +" voice you. is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" + +#: plugin.py:190 +msgid "voice someone" +msgstr "" + +#: plugin.py:195 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will remove operator\n" +" privileges from all the nicks given. If no nicks are given, removes\n" +" operator privileges from the person sending the message.\n" +" " +msgstr "" + +#: plugin.py:202 +msgid "I cowardly refuse to deop myself. If you really want me deopped, tell me to op you and then deop me yourself." +msgstr "" + +#: plugin.py:210 +msgid "deop someone" +msgstr "" + +#: plugin.py:215 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will remove half-operator\n" +" privileges from all the nicks given. If no nicks are given, removes\n" +" half-operator privileges from the person sending the message.\n" +" " +msgstr "" + +#: plugin.py:222 +msgid "I cowardly refuse to dehalfop myself. If you really want me dehalfopped, tell me to op you and then dehalfop me yourself." +msgstr "" + +#: plugin.py:230 +msgid "dehalfop someone" +msgstr "" + +#: plugin.py:235 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will remove voice from all\n" +" the nicks given. If no nicks are given, removes voice from the person\n" +" sending the message.\n" +" " +msgstr "" + +#: plugin.py:242 +msgid "I cowardly refuse to devoice myself. If you really want me devoiced, tell me to op you and then devoice me yourself." +msgstr "" + +#: plugin.py:255 +#, docstring +msgid "" +"[]\n" +"\n" +" If you have the #channel,op capability, this will cause the bot to\n" +" \"cycle\", or PART and then JOIN the channel. is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:268 +#, docstring +msgid "" +"[] [, , ...] []\n" +"\n" +" Kicks (s) from for . If isn't given,\n" +" uses the nick of the person making the command as the reason.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:276 +msgid "I cowardly refuse to kick myself." +msgstr "" + +#: plugin.py:281 +msgid "The reason you gave is longer than the allowed length for a KICK reason on this server." +msgstr "" + +#: plugin.py:286 +msgid "kick someone" +msgstr "" + +#: plugin.py:292 +#, docstring +msgid "" +"[] [--{exact,nick,user,host}] [] []\n" +"\n" +" If you have the #channel,op capability, this will kickban for\n" +" as many seconds as you specify, or else (if you specify 0 seconds or\n" +" don't specify a number of seconds) it will ban the person indefinitely.\n" +" --exact bans only the exact hostmask; --nick bans just the nick;\n" +" --user bans just the user, and --host bans just the host. You can\n" +" combine these options as you choose. is a reason to give for\n" +" the kick.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:311 +msgid "I cowardly refuse to kickban myself." +msgstr "" + +#: plugin.py:318 +msgid "I haven't seen %s." +msgstr "" + +#: plugin.py:326 +msgid "I cowardly refuse to ban myself." +msgstr "" + +#: plugin.py:352 +msgid "%s has %s too, you can't ban him/her/it." +msgstr "" + +#: plugin.py:364 +msgid "kick or ban someone" +msgstr "" + +#: plugin.py:371 +#, docstring +msgid "" +"[] []\n" +"\n" +" Unbans on . If is not given, unbans\n" +" any hostmask currently banned on that matches your current\n" +" hostmask. Especially useful for unbanning yourself when you get\n" +" unexpectedly (or accidentally) banned from the channel. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:388 +msgid "All bans on %s matching %s have been removed." +msgstr "" + +#: plugin.py:392 +msgid "No bans matching %s were found on %s." +msgstr "" + +#: plugin.py:395 +msgid "unban someone" +msgstr "" + +#: plugin.py:400 +#, docstring +msgid "" +"[] \n" +"\n" +" If you have the #channel,op capability, this will invite \n" +" to join . is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:409 +msgid "invite someone" +msgstr "" + +#: plugin.py:428 +msgid "%s is already in %s." +msgstr "" + +#: plugin.py:435 +msgid "There is no %s on this network." +msgstr "" + +#: plugin.py:447 +#, docstring +msgid "" +"[]\n" +"\n" +" If you have the #channel,op capability, this will \"lobotomize\" the\n" +" bot, making it silent and unanswering to all requests made in the\n" +" channel. is only necessary if the message isn't sent in\n" +" the channel itself.\n" +" " +msgstr "" + +#: plugin.py:462 +#, docstring +msgid "" +"[]\n" +"\n" +" If you have the #channel,op capability, this will unlobotomize the\n" +" bot, making it respond to requests made in the channel again.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:477 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the channels in which this bot is lobotomized.\n" +" " +msgstr "" + +#: plugin.py:492 +msgid "I'm currently lobotomized in %L." +msgstr "" + +#: plugin.py:495 +msgid "I'm not currently lobotomized in any channels that you're in." +msgstr "" + +#: plugin.py:502 +#, docstring +msgid "" +"[] []\n" +"\n" +" If you have the #channel,op capability, this will effect a\n" +" persistent ban from interacting with the bot on the given\n" +" (or the current hostmask associated with . Other\n" +" plugins may enforce this ban by actually banning users with\n" +" matching hostmasks when they join. is an optional\n" +" argument specifying when (in \"seconds from now\") the ban should\n" +" expire; if none is given, the ban will never automatically expire.\n" +" is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" + +#: plugin.py:522 +#, docstring +msgid "" +"[] \n" +"\n" +" If you have the #channel,op capability, this will remove the\n" +" persistent ban on . is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:534 +msgid "There are no persistent bans for that hostmask." +msgstr "" + +#: plugin.py:539 +#, docstring +msgid "" +"[]\n" +"\n" +" If you have the #channel,op capability, this will show you the\n" +" current persistent bans on #channel.\n" +" " +msgstr "" + +#: plugin.py:549 +msgid "%q (expires %t)" +msgstr "" + +#: plugin.py:552 +msgid "%q (never expires)" +msgstr "" + +#: plugin.py:556 +msgid "There are no persistent bans on %s." +msgstr "" + +#: plugin.py:563 +#, docstring +msgid "" +"[] []\n" +"\n" +" If you have the #channel,op capability, this will set a persistent\n" +" ignore on or the hostmask currently\n" +" associated with . is an optional argument\n" +" specifying when (in \"seconds from now\") the ignore will expire; if\n" +" it isn't given, the ignore will never automatically expire.\n" +" is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" + +#: plugin.py:581 +#, docstring +msgid "" +"[] \n" +"\n" +" If you have the #channel,op capability, this will remove the\n" +" persistent ignore on in the channel. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:593 +msgid "There are no ignores for that hostmask." +msgstr "" + +#: plugin.py:598 +#, docstring +msgid "" +"[]\n" +"\n" +" Lists the hostmasks that the bot is ignoring on the given channel.\n" +" is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" + +#: plugin.py:607 +msgid "I'm not currently ignoring any hostmasks in %q" +msgstr "" + +#: plugin.py:618 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will give the user\n" +" (or the user to whom maps)\n" +" the capability in the channel. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:634 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will take from the\n" +" user currently identified as (or the user to whom \n" +" maps) the capability in the channel. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:653 +msgid "That user didn't have the %L %s." +msgstr "" + +#: plugin.py:662 +#, docstring +msgid "" +"[] {True|False}\n" +"\n" +" If you have the #channel,op capability, this will set the default\n" +" response to non-power-related (that is, not {op, halfop, voice}\n" +" capabilities to be the value you give. is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:680 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will add the channel\n" +" capability for all users in the channel. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:695 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" If you have the #channel,op capability, this will unset the channel\n" +" capability so each user's specific capability or the\n" +" channel default capability will take precedence. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:711 +msgid "capability" +msgstr "" + +#: plugin.py:714 +msgid "I do not know about the %L %s." +msgstr "" + +#: plugin.py:721 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the capabilities present on the . is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:733 +#, docstring +msgid "" +"[] [] []\n" +"\n" +" If you have the #channel,op capability, this will disable the \n" +" in . If is provided, will be disabled only\n" +" for that plugin. If only is provided, all commands in the\n" +" given plugin will be disabled. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:749 plugin.py:788 +msgid "The %s plugin does not have a command called %s." +msgstr "" + +#: plugin.py:756 plugin.py:795 +msgid "No plugin or command named %s could be found." +msgstr "" + +#: plugin.py:772 +#, docstring +msgid "" +"[] [] []\n" +"\n" +" If you have the #channel,op capability, this will enable the \n" +" in if it has been disabled. If is provided,\n" +" will be enabled only for that plugin. If only is\n" +" provided, all commands in the given plugin will be enabled. \n" +" is only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:809 +msgid "%s was not disabled." +msgstr "" + +#: plugin.py:818 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the nicks in . is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:829 +msgid "You don't have access to that information." +msgstr "" + +#: plugin.py:837 +#, docstring +msgid "" +"Internal message for notifying all the #channel,ops in a channel of\n" +" a given situation." +msgstr "" + +#: plugin.py:840 +msgid "Alert to all %s ops: %s" +msgstr "" + +#: plugin.py:842 +msgid " (from %s)" +msgstr "" + +#: plugin.py:850 +#, docstring +msgid "" +"[] \n" +"\n" +" Sends to all the users in who have the ,op\n" +" capability.\n" +" " +msgstr "" + diff --git a/plugins/Channel/plugin.py b/plugins/Channel/plugin.py index de12e91cc..982c9017a 100644 --- a/plugins/Channel/plugin.py +++ b/plugins/Channel/plugin.py @@ -38,6 +38,8 @@ import supybot.ircmsgs as ircmsgs import supybot.schedule as schedule import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Channel') class Channel(callbacks.Plugin): def __init__(self, irc): @@ -62,6 +64,7 @@ class Channel(callbacks.Plugin): irc.queueMsg(f(nicks[i:i + numModes])) irc.noReply() + @internationalizeDocstring def mode(self, irc, msg, args, channel, modes): """[] [ ...] @@ -70,8 +73,9 @@ class Channel(callbacks.Plugin): itself. """ self._sendMsg(irc, ircmsgs.mode(channel, modes)) - mode = wrap(mode, ['op', ('haveOp', 'change the mode'), many('something')]) + mode = wrap(mode, ['op', ('haveOp', _('change the mode')), many('something')]) + @internationalizeDocstring def limit(self, irc, msg, args, channel, limit): """[] [] @@ -83,9 +87,10 @@ class Channel(callbacks.Plugin): self._sendMsg(irc, ircmsgs.mode(channel, ['+l', limit])) else: self._sendMsg(irc, ircmsgs.mode(channel, ['-l'])) - limit = wrap(limit, ['op', ('haveOp', 'change the limit'), + limit = wrap(limit, ['op', ('haveOp', _('change the limit')), additional('nonNegativeInt', 0)]) + @internationalizeDocstring def moderate(self, irc, msg, args, channel): """[] @@ -94,8 +99,9 @@ class Channel(callbacks.Plugin): message isn't sent in the channel itself. """ self._sendMsg(irc, ircmsgs.mode(channel, ['+m'])) - moderate = wrap(moderate, ['op', ('haveOp', 'moderate the channel')]) + moderate = wrap(moderate, ['op', ('haveOp', _('moderate the channel'))]) + @internationalizeDocstring def unmoderate(self, irc, msg, args, channel): """[] @@ -104,8 +110,10 @@ class Channel(callbacks.Plugin): message isn't sent in the channel itself. """ self._sendMsg(irc, ircmsgs.mode(channel, ['-m'])) - unmoderate = wrap(unmoderate, ['op', ('haveOp', 'unmoderate the channel')]) + unmoderate = wrap(unmoderate, ['op', ('haveOp', + _('unmoderate the channel'))]) + @internationalizeDocstring def key(self, irc, msg, args, channel, key): """[] [] @@ -119,9 +127,10 @@ class Channel(callbacks.Plugin): self._sendMsg(irc, ircmsgs.mode(channel, ['+k', key])) else: self._sendMsg(irc, ircmsgs.mode(channel, ['-k'])) - key = wrap(key, ['op', ('haveOp', 'change the keyword'), + key = wrap(key, ['op', ('haveOp', _('change the keyword')), additional('somethingWithoutSpaces', '')]) + @internationalizeDocstring def op(self, irc, msg, args, channel, nicks): """[] [ ...] @@ -135,8 +144,9 @@ class Channel(callbacks.Plugin): def f(L): return ircmsgs.ops(channel, L) self._sendMsgs(irc, nicks, f) - op = wrap(op, ['op', ('haveOp', 'op someone'), any('nickInChannel')]) + op = wrap(op, ['op', ('haveOp', _('op someone')), any('nickInChannel')]) + @internationalizeDocstring def halfop(self, irc, msg, args, channel, nicks): """[] [ ...] @@ -150,9 +160,10 @@ class Channel(callbacks.Plugin): def f(L): return ircmsgs.halfops(channel, L) self._sendMsgs(irc, nicks, f) - halfop = wrap(halfop, ['halfop', ('haveOp', 'halfop someone'), + halfop = wrap(halfop, ['halfop', ('haveOp', _('halfop someone')), any('nickInChannel')]) + @internationalizeDocstring def voice(self, irc, msg, args, channel, nicks): """[] [ ...] @@ -176,9 +187,10 @@ class Channel(callbacks.Plugin): self._sendMsgs(irc, nicks, f) else: irc.errorNoCapability(capability) - voice = wrap(voice, ['channel', ('haveOp', 'voice someone'), + voice = wrap(voice, ['channel', ('haveOp', _('voice someone')), any('nickInChannel')]) + @internationalizeDocstring def deop(self, irc, msg, args, channel, nicks): """[] [ ...] @@ -187,17 +199,18 @@ class Channel(callbacks.Plugin): operator privileges from the person sending the message. """ if irc.nick in nicks: - irc.error('I cowardly refuse to deop myself. If you really want ' - 'me deopped, tell me to op you and then deop me ' - 'yourself.', Raise=True) + irc.error(_('I cowardly refuse to deop myself. If you really ' + 'want me deopped, tell me to op you and then deop me ' + 'yourself.'), Raise=True) if not nicks: nicks = [msg.nick] def f(L): return ircmsgs.deops(channel, L) self._sendMsgs(irc, nicks, f) - deop = wrap(deop, ['op', ('haveOp', 'deop someone'), + deop = wrap(deop, ['op', ('haveOp', _('deop someone')), any('nickInChannel')]) + @internationalizeDocstring def dehalfop(self, irc, msg, args, channel, nicks): """[] [ ...] @@ -206,17 +219,18 @@ class Channel(callbacks.Plugin): half-operator privileges from the person sending the message. """ if irc.nick in nicks: - irc.error('I cowardly refuse to dehalfop myself. If you really ' + irc.error(_('I cowardly refuse to dehalfop myself. If you really ' 'want me dehalfopped, tell me to op you and then ' - 'dehalfop me yourself.', Raise=True) + 'dehalfop me yourself.'), Raise=True) if not nicks: nicks = [msg.nick] def f(L): return ircmsgs.dehalfops(channel, L) self._sendMsgs(irc, nicks, f) - dehalfop = wrap(dehalfop, ['halfop', ('haveOp', 'dehalfop someone'), + dehalfop = wrap(dehalfop, ['halfop', ('haveOp', _('dehalfop someone')), any('nickInChannel')]) + @internationalizeDocstring def devoice(self, irc, msg, args, channel, nicks): """[] [ ...] @@ -225,9 +239,9 @@ class Channel(callbacks.Plugin): sending the message. """ if irc.nick in nicks: - irc.error('I cowardly refuse to devoice myself. If you really ' + irc.error(_('I cowardly refuse to devoice myself. If you really ' 'want me devoiced, tell me to op you and then devoice ' - 'me yourself.', Raise=True) + 'me yourself.'), Raise=True) if not nicks: nicks = [msg.nick] def f(L): @@ -236,6 +250,7 @@ class Channel(callbacks.Plugin): devoice = wrap(devoice, ['voice', ('haveOp', 'devoice someone'), any('nickInChannel')]) + @internationalizeDocstring def cycle(self, irc, msg, args, channel): """[] @@ -248,6 +263,7 @@ class Channel(callbacks.Plugin): self._sendMsg(irc, networkGroup.channels.join(channel)) cycle = wrap(cycle, ['op']) + @internationalizeDocstring def kick(self, irc, msg, args, channel, nicks, reason): """[] [, , ...] [] @@ -257,19 +273,20 @@ class Channel(callbacks.Plugin): itself. """ if utils.iter.any(lambda n: ircutils.strEqual(n, irc.nick), nicks): - irc.error('I cowardly refuse to kick myself.', Raise=True) + irc.error(_('I cowardly refuse to kick myself.'), Raise=True) if not reason: reason = msg.nick kicklen = irc.state.supported.get('kicklen', sys.maxint) if len(reason) > kicklen: - irc.error('The reason you gave is longer than the allowed ' - 'length for a KICK reason on this server.', + irc.error(_('The reason you gave is longer than the allowed ' + 'length for a KICK reason on this server.'), Raise=True) for nick in nicks: self._sendMsg(irc, ircmsgs.kick(channel, nick, reason)) - kick = wrap(kick, ['op', ('haveOp', 'kick someone'), + kick = wrap(kick, ['op', ('haveOp', _('kick someone')), commalist('nickInChannel'), additional('text')]) + @internationalizeDocstring def kban(self, irc, msg, args, channel, optlist, bannedNick, expiry, reason): """[] [--{exact,nick,user,host}] [] [] @@ -291,14 +308,14 @@ class Channel(callbacks.Plugin): raise callbacks.ArgumentError elif bannedNick == irc.nick: self.log.warning('%q tried to make me kban myself.', msg.prefix) - irc.error('I cowardly refuse to kickban myself.') + irc.error(_('I cowardly refuse to kickban myself.')) return if not reason: reason = msg.nick try: bannedHostmask = irc.state.nickToHostmask(bannedNick) except KeyError: - irc.error(format('I haven\'t seen %s.', bannedNick), Raise=True) + irc.error(format(_('I haven\'t seen %s.'), bannedNick), Raise=True) capability = ircdb.makeChannelCapability(channel, 'op') banmaskstyle = conf.supybot.protocols.irc.banmask banmask = banmaskstyle.makeBanmask(bannedHostmask, [o[0] for o in optlist]) @@ -306,7 +323,7 @@ class Channel(callbacks.Plugin): if ircutils.hostmaskPatternEqual(banmask, irc.prefix): if ircutils.hostmaskPatternEqual(bannedHostmask, irc.prefix): self.log.warning('%q tried to make me kban myself.',msg.prefix) - irc.error('I cowardly refuse to ban myself.') + irc.error(_('I cowardly refuse to ban myself.')) return else: self.log.warning('Using exact hostmask since banmask would ' @@ -332,8 +349,8 @@ class Channel(callbacks.Plugin): if ircdb.checkCapability(bannedHostmask, capability): self.log.warning('%s tried to ban %q, but both have %s', msg.prefix, bannedHostmask, capability) - irc.error(format('%s has %s too, you can\'t ban him/her/it.', - bannedNick, capability)) + irc.error(format(_('%s has %s too, you can\'t ban ' + 'him/her/it.'), bannedNick, capability)) else: doBan() else: @@ -344,11 +361,12 @@ class Channel(callbacks.Plugin): kban = wrap(kban, ['op', getopts({'exact':'', 'nick':'', 'user':'', 'host':''}), - ('haveOp', 'kick or ban someone'), + ('haveOp', _('kick or ban someone')), 'nickInChannel', optional('expiry', 0), additional('text')]) + @internationalizeDocstring def unban(self, irc, msg, args, channel, hostmask): """[] [] @@ -367,16 +385,17 @@ class Channel(callbacks.Plugin): bans.append(banmask) if bans: irc.queueMsg(ircmsgs.unbans(channel, bans)) - irc.replySuccess(format('All bans on %s matching %s ' - 'have been removed.', + irc.replySuccess(format(_('All bans on %s matching %s ' + 'have been removed.'), channel, msg.prefix)) else: - irc.error('No bans matching %s were found on %s.' % + irc.error(_('No bans matching %s were found on %s.') % (msg.prefix, channel)) unban = wrap(unban, ['op', - ('haveOp', 'unban someone'), + ('haveOp', _('unban someone')), additional('hostmask')]) + @internationalizeDocstring def invite(self, irc, msg, args, channel, nick): """[] @@ -387,7 +406,7 @@ class Channel(callbacks.Plugin): nick = nick or msg.nick self._sendMsg(irc, ircmsgs.invite(nick, channel)) self.invites[(irc.getRealIrc(), ircutils.toLower(nick))] = irc - invite = wrap(invite, ['op', ('haveOp', 'invite someone'), + invite = wrap(invite, ['op', ('haveOp', _('invite someone')), additional('nick')]) def do341(self, irc, msg): @@ -406,14 +425,14 @@ class Channel(callbacks.Plugin): nick = ircutils.toLower(nick) replyIrc = self.invites.pop((irc, nick), None) if replyIrc is not None: - replyIrc.error(format('%s is already in %s.', nick, channel)) + replyIrc.error(format(_('%s is already in %s.'), nick, channel)) def do401(self, irc, msg): nick = msg.args[1] nick = ircutils.toLower(nick) replyIrc = self.invites.pop((irc, nick), None) if replyIrc is not None: - replyIrc.error(format('There is no %s on this network.', nick)) + replyIrc.error(format(_('There is no %s on this network.'), nick)) def do504(self, irc, msg): nick = msg.args[1] @@ -423,6 +442,7 @@ class Channel(callbacks.Plugin): replyIrc.error(format('There is no %s on this server.', nick)) class lobotomy(callbacks.Commands): + @internationalizeDocstring def add(self, irc, msg, args, channel): """[] @@ -437,6 +457,7 @@ class Channel(callbacks.Plugin): irc.replySuccess() add = wrap(add, ['op']) + @internationalizeDocstring def remove(self, irc, msg, args, channel): """[] @@ -451,6 +472,7 @@ class Channel(callbacks.Plugin): irc.replySuccess() remove = wrap(remove, ['op']) + @internationalizeDocstring def list(self, irc, msg, args): """takes no arguments @@ -467,14 +489,15 @@ class Channel(callbacks.Plugin): L.append(channel) if L: L.sort() - s = format('I\'m currently lobotomized in %L.', L) + s = format(_('I\'m currently lobotomized in %L.'), L) irc.reply(s) else: - irc.reply('I\'m not currently lobotomized in any channels ' - 'that you\'re in.') + irc.reply(_('I\'m not currently lobotomized in any channels ' + 'that you\'re in.')) list = wrap(list) class ban(callbacks.Commands): + @internationalizeDocstring def add(self, irc, msg, args, channel, banmask, expires): """[] [] @@ -494,6 +517,7 @@ class Channel(callbacks.Plugin): irc.replySuccess() add = wrap(add, ['op', 'banmask', additional('expiry', 0)]) + @internationalizeDocstring def remove(self, irc, msg, args, channel, banmask): """[] @@ -507,9 +531,10 @@ class Channel(callbacks.Plugin): ircdb.channels.setChannel(channel, c) irc.replySuccess() except KeyError: - irc.error('There are no persistent bans for that hostmask.') + irc.error(_('There are no persistent bans for that hostmask.')) remove = wrap(remove, ['op', 'hostmask']) + @internationalizeDocstring def list(self, irc, msg, args, channel): """[] @@ -521,18 +546,19 @@ class Channel(callbacks.Plugin): bans = [] for ban in c.bans: if c.bans[ban]: - bans.append(format('%q (expires %t)', + bans.append(format(_('%q (expires %t)'), ban, c.bans[ban])) else: - bans.append(format('%q (never expires)', + bans.append(format(_('%q (never expires)'), ban, c.bans[ban])) irc.reply(format('%L', bans)) else: - irc.reply(format('There are no persistent bans on %s.', + irc.reply(format(_('There are no persistent bans on %s.'), channel)) list = wrap(list, ['op']) class ignore(callbacks.Commands): + @internationalizeDocstring def add(self, irc, msg, args, channel, banmask, expires): """[] [] @@ -550,6 +576,7 @@ class Channel(callbacks.Plugin): irc.replySuccess() add = wrap(add, ['op', 'banmask', additional('expiry', 0)]) + @internationalizeDocstring def remove(self, irc, msg, args, channel, banmask): """[] @@ -563,9 +590,10 @@ class Channel(callbacks.Plugin): ircdb.channels.setChannel(channel, c) irc.replySuccess() except KeyError: - irc.error('There are no ignores for that hostmask.') + irc.error(_('There are no ignores for that hostmask.')) remove = wrap(remove, ['op', 'hostmask']) + @internationalizeDocstring def list(self, irc, msg, args, channel): """[] @@ -576,8 +604,8 @@ class Channel(callbacks.Plugin): # XXX Add the expirations. c = ircdb.channels.getChannel(channel) if len(c.ignores) == 0: - s = format('I\'m not currently ignoring any hostmasks in %q', - channel) + s = format(_('I\'m not currently ignoring any hostmasks in ' + '%q'), channel) irc.reply(s) else: L = sorted(c.ignores) @@ -585,6 +613,7 @@ class Channel(callbacks.Plugin): list = wrap(list, ['op']) class capability(callbacks.Commands): + @internationalizeDocstring def add(self, irc, msg, args, channel, user, capabilities): """[] [ ...] @@ -600,6 +629,7 @@ class Channel(callbacks.Plugin): irc.replySuccess() add = wrap(add, ['op', 'otherUser', 'capability']) + @internationalizeDocstring def remove(self, irc, msg, args, channel, user, capabilities): """[] [ ...] @@ -620,13 +650,14 @@ class Channel(callbacks.Plugin): s = 'capability' if len(fail) > 1: s = utils.str.pluralize(s) - irc.error(format('That user didn\'t have the %L %s.', fail, s), - Raise=True) + irc.error(format(_('That user didn\'t have the %L %s.'), fail, + s), Raise=True) irc.replySuccess() remove = wrap(remove, ['op', 'otherUser', 'capability']) # XXX This needs to be fix0red to be like Owner.defaultcapability. Or # something else. This is a horrible interface. + @internationalizeDocstring def setdefault(self, irc, msg, args, channel, v): """[] {True|False} @@ -644,6 +675,7 @@ class Channel(callbacks.Plugin): irc.replySuccess() setdefault = wrap(setdefault, ['op', 'boolean']) + @internationalizeDocstring def set(self, irc, msg, args, channel, capabilities): """[] [ ...] @@ -658,6 +690,7 @@ class Channel(callbacks.Plugin): irc.replySuccess() set = wrap(set, ['op', many('capability')]) + @internationalizeDocstring def unset(self, irc, msg, args, channel, capabilities): """[] [ ...] @@ -675,14 +708,15 @@ class Channel(callbacks.Plugin): fail.append(c) ircdb.channels.setChannel(channel, chan) if fail: - s = 'capability' + s = _('capability') if len(fail) > 1: s = utils.str.pluralize(s) - irc.error(format('I do not know about the %L %s.', fail, s), + irc.error(format(_('I do not know about the %L %s.'), fail, s), Raise=True) irc.replySuccess() unset = wrap(unset, ['op', many('capability')]) + @internationalizeDocstring def list(self, irc, msg, args, channel): """[] @@ -694,6 +728,7 @@ class Channel(callbacks.Plugin): irc.reply(' '.join(L)) list = wrap(list, ['channel']) + @internationalizeDocstring def disable(self, irc, msg, args, channel, plugin, command): """[] [] [] @@ -711,15 +746,15 @@ class Channel(callbacks.Plugin): if plugin.isCommand(command): s = '-%s.%s' % (plugin.name(), command) else: - failMsg = format('The %s plugin does not have a command ' - 'called %s.', plugin.name(), command) + failMsg = format(_('The %s plugin does not have a command ' + 'called %s.'), plugin.name(), command) elif command: # findCallbackForCommand if filter(None, irc.findCallbacksForArgs([command])): s = '-%s' % command else: - failMsg = format('No plugin or command named %s could be ' - 'found.', command) + failMsg = format(_('No plugin or command named %s could be ' + 'found.'), command) else: raise callbacks.ArgumentError if failMsg: @@ -732,6 +767,7 @@ class Channel(callbacks.Plugin): optional(('plugin', False)), additional('commandName')]) + @internationalizeDocstring def enable(self, irc, msg, args, channel, plugin, command): """[] [] [] @@ -749,15 +785,15 @@ class Channel(callbacks.Plugin): if plugin.isCommand(command): s = '-%s.%s' % (plugin.name(), command) else: - failMsg = format('The %s plugin does not have a command ' - 'called %s.', plugin.name(), command) + failMsg = format(_('The %s plugin does not have a command ' + 'called %s.'), plugin.name(), command) elif command: # findCallbackForCommand if filter(None, irc.findCallbacksForArgs([command])): s = '-%s' % command else: - failMsg = format('No plugin or command named %s could be ' - 'found.', command) + failMsg = format(_('No plugin or command named %s could be ' + 'found.'), command) else: raise callbacks.ArgumentError if failMsg: @@ -770,13 +806,14 @@ class Channel(callbacks.Plugin): fail.append(s) ircdb.channels.setChannel(channel, chan) if fail: - irc.error(format('%s was not disabled.', s[1:])) + irc.error(format(_('%s was not disabled.'), s[1:])) else: irc.replySuccess() enable = wrap(enable, ['op', optional(('plugin', False)), additional('commandName')]) + @internationalizeDocstring def nicks(self, irc, msg, args, channel): """[] @@ -789,24 +826,26 @@ class Channel(callbacks.Plugin): msg.args[0] != channel and \ (ircutils.isChannel(msg.args[0]) or \ msg.nick not in irc.state.channels[channel].users): - irc.error('You don\'t have access to that information.') + irc.error(_('You don\'t have access to that information.')) L = list(irc.state.channels[channel].users) utils.sortBy(str.lower, L) irc.reply(utils.str.commaAndify(L)) nicks = wrap(nicks, ['inChannel']) + @internationalizeDocstring def alertOps(self, irc, channel, s, frm=None): """Internal message for notifying all the #channel,ops in a channel of a given situation.""" capability = ircdb.makeChannelCapability(channel, 'op') - s = format('Alert to all %s ops: %s', channel, s) + s = format(_('Alert to all %s ops: %s'), channel, s) if frm is not None: - s += format(' (from %s)', frm) + s += format(_(' (from %s)'), frm) for nick in irc.state.channels[channel].users: hostmask = irc.state.nickToHostmask(nick) if ircdb.checkCapability(hostmask, capability): irc.reply(s, to=nick, private=True) + @internationalizeDocstring def alert(self, irc, msg, args, channel, text): """[] diff --git a/plugins/ChannelLogger/config.py b/plugins/ChannelLogger/config.py index eae2ac7a4..f9935e4f4 100644 --- a/plugins/ChannelLogger/config.py +++ b/plugins/ChannelLogger/config.py @@ -30,6 +30,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('ChannelLogger') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -41,50 +43,50 @@ def configure(advanced): ChannelLogger = conf.registerPlugin('ChannelLogger') conf.registerChannelValue(ChannelLogger, 'enable', - registry.Boolean(True, """Determines whether logging is enabled.""")) + registry.Boolean(True, _("""Determines whether logging is enabled."""))) conf.registerGlobalValue(ChannelLogger, 'flushImmediately', - registry.Boolean(False, """Determines whether channel logfiles will be + registry.Boolean(False, _("""Determines whether channel logfiles will be flushed anytime they're written to, rather than being buffered by the - operating system.""")) + operating system."""))) conf.registerChannelValue(ChannelLogger, 'stripFormatting', - registry.Boolean(True, """Determines whether formatting characters (such - as bolding, color, etc.) are removed when writing the logs to disk.""")) + registry.Boolean(True, _("""Determines whether formatting characters (such + as bolding, color, etc.) are removed when writing the logs to disk."""))) conf.registerChannelValue(ChannelLogger, 'timestamp', - registry.Boolean(True, """Determines whether the logs for this channel are - timestamped with the timestamp in supybot.log.timestampFormat.""")) + registry.Boolean(True, _("""Determines whether the logs for this channel are + timestamped with the timestamp in supybot.log.timestampFormat."""))) conf.registerChannelValue(ChannelLogger, 'noLogPrefix', - registry.String('[nolog]', """Determines what string a message should be + registry.String('[nolog]', _("""Determines what string a message should be prefixed with in order not to be logged. If you don't want any such - prefix, just set it to the empty string.""")) + prefix, just set it to the empty string."""))) conf.registerChannelValue(ChannelLogger, 'rotateLogs', - registry.Boolean(False, """Determines whether the bot will automatically + registry.Boolean(False, _("""Determines whether the bot will automatically rotate the logs for this channel. The bot will rotate logs when the timestamp for the log changes. The timestamp is set according to - the 'filenameTimestamp' configuration variable.""")) + the 'filenameTimestamp' configuration variable."""))) conf.registerChannelValue(ChannelLogger, 'filenameTimestamp', - registry.String('%Y-%m-%d', """Determines how to represent the timestamp + registry.String('%Y-%m-%d', _("""Determines how to represent the timestamp used for the filename in rotated logs. When this timestamp changes, the old logfiles will be closed and a new one started. The format characters for the timestamp are in the time.strftime docs at python.org. In order for your logs to be rotated, you'll also have to enable - supybot.plugins.ChannelLogger.rotateLogs.""")) + supybot.plugins.ChannelLogger.rotateLogs."""))) conf.registerGlobalValue(ChannelLogger, 'directories', - registry.Boolean(True, """Determines whether the bot will partition its - channel logs into separate directories based on different criteria.""")) + registry.Boolean(True, _("""Determines whether the bot will partition its + channel logs into separate directories based on different criteria."""))) conf.registerGlobalValue(ChannelLogger.directories, 'network', - registry.Boolean(True, """Determines whether the bot will use a network - directory if using directories.""")) + registry.Boolean(True, _("""Determines whether the bot will use a network + directory if using directories."""))) conf.registerGlobalValue(ChannelLogger.directories, 'channel', - registry.Boolean(True, """Determines whether the bot will use a channel - directory if using directories.""")) + registry.Boolean(True, _("""Determines whether the bot will use a channel + directory if using directories."""))) conf.registerGlobalValue(ChannelLogger.directories, 'timestamp', - registry.Boolean(False, """Determines whether the bot will use a timestamp + registry.Boolean(False, _("""Determines whether the bot will use a timestamp (determined by supybot.plugins.ChannelLogger.directories.timestamp.format) - if using directories.""")) + if using directories."""))) conf.registerGlobalValue(ChannelLogger.directories.timestamp, 'format', - registry.String('%B', """Determines what timestamp format will be used in + registry.String('%B', _("""Determines what timestamp format will be used in the directory stucture for channel logs if - supybot.plugins.ChannelLogger.directories.timestamp is True.""")) + supybot.plugins.ChannelLogger.directories.timestamp is True."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/ChannelLogger/locale/fr.po b/plugins/ChannelLogger/locale/fr.po new file mode 100644 index 000000000..d2561747e --- /dev/null +++ b/plugins/ChannelLogger/locale/fr.po @@ -0,0 +1,95 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 10:02+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:46 +msgid "Determines whether logging is enabled." +msgstr "Détermine si les logs sont activés." + +#: config.py:48 +msgid "" +"Determines whether channel logfiles will be\n" +" flushed anytime they're written to, rather than being buffered by the\n" +" operating system." +msgstr "Détermine si le fichier de logs sera enregistré à chaque fois que l'on y écrit plutôt que d'être mis en buffer par le système d'exploitation." + +#: config.py:52 +msgid "" +"Determines whether formatting characters (such\n" +" as bolding, color, etc.) are removed when writing the logs to disk." +msgstr "Détermine si les caractères de formattage (comme le gras, la couleurs) sont supprimés lors de l'écriture des logs sur le disque." + +#: config.py:55 +msgid "" +"Determines whether the logs for this channel are\n" +" timestamped with the timestamp in supybot.log.timestampFormat." +msgstr "Détermine si les logs de ce canal sont 'timestampés' avec le format dans supybot.log.timestampFormat" + +#: config.py:58 +msgid "" +"Determines what string a message should be\n" +" prefixed with in order not to be logged. If you don't want any such\n" +" prefix, just set it to the empty string." +msgstr "Détermine par quelle chaîne un message doit être préfixé pour ne pas être loggué. Vous ne voulez probablement pas d'un tel préfixe, et simplement définir une chaîne vide." + +#: config.py:62 +msgid "" +"Determines whether the bot will automatically\n" +" rotate the logs for this channel. The bot will rotate logs when the\n" +" timestamp for the log changes. The timestamp is set according to\n" +" the 'filenameTimestamp' configuration variable." +msgstr "Détermine si le bot fera automatiquement une rotation des logs pour ce canal. Le bot fera tourner les logs lorsque leur timestamp changera. Le timestamp est défini par la variable de configuration 'filenameTimestamp'." + +#: config.py:67 +msgid "" +"Determines how to represent the timestamp\n" +" used for the filename in rotated logs. When this timestamp changes, the\n" +" old logfiles will be closed and a new one started. The format characters\n" +" for the timestamp are in the time.strftime docs at python.org. In order\n" +" for your logs to be rotated, you'll also have to enable\n" +" supybot.plugins.ChannelLogger.rotateLogs." +msgstr "Détermine comment représenter le timestamp utilisé pour les noms de fichiers de logs 'tournants'. Lorsque ce timestamp change, l'ancien fichier de logs sera fermé, et un nouveau sera ouvert. Le format du timestamp est le même que celui de time.strftime (documentation disponible sur python.org). Pour avoir des logs 'tournant', vous devez activer supybot.plugins.ChannelLogger.rotateLogs." + +#: config.py:75 +msgid "" +"Determines whether the bot will partition its\n" +" channel logs into separate directories based on different criteria." +msgstr "Détermine si le bot partitionnera les logs de canaux dans des répertoires séparés, en fonction de différents critères." + +#: config.py:78 +msgid "" +"Determines whether the bot will use a network\n" +" directory if using directories." +msgstr "Détermine si le bot utilisera un répertoire par réseau, si il utilise des répertoires." + +#: config.py:81 +msgid "" +"Determines whether the bot will use a channel\n" +" directory if using directories." +msgstr "Détermine si le bot utilisera un répertoire par canal, si il utilise des répertoires." + +#: config.py:84 +msgid "" +"Determines whether the bot will use a timestamp\n" +" (determined by supybot.plugins.ChannelLogger.directories.timestamp.format)\n" +" if using directories." +msgstr "Détermine si le bot utilisera un timestamp (déterminé par supybot.plugins.ChannelLogger.directories.timestamp.format), si il utilise des répertoires." + +#: config.py:88 +msgid "" +"Determines what timestamp format will be used in\n" +" the directory stucture for channel logs if\n" +" supybot.plugins.ChannelLogger.directories.timestamp is True." +msgstr "Détermine quel format de timestamp sera utilisé dans la structure de répertoires pour les logs de canaux si supybot.plugins.ChannelLogger.directories.timestamp est True." + diff --git a/plugins/ChannelLogger/messages.pot b/plugins/ChannelLogger/messages.pot new file mode 100644 index 000000000..57b359a3c --- /dev/null +++ b/plugins/ChannelLogger/messages.pot @@ -0,0 +1,97 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 10:02+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "Determines whether logging is enabled." +msgstr "" + +#: config.py:48 +msgid "" +"Determines whether channel logfiles will be\n" +" flushed anytime they're written to, rather than being buffered by the\n" +" operating system." +msgstr "" + +#: config.py:52 +msgid "" +"Determines whether formatting characters (such\n" +" as bolding, color, etc.) are removed when writing the logs to disk." +msgstr "" + +#: config.py:55 +msgid "" +"Determines whether the logs for this channel are\n" +" timestamped with the timestamp in supybot.log.timestampFormat." +msgstr "" + +#: config.py:58 +msgid "" +"Determines what string a message should be\n" +" prefixed with in order not to be logged. If you don't want any such\n" +" prefix, just set it to the empty string." +msgstr "" + +#: config.py:62 +msgid "" +"Determines whether the bot will automatically\n" +" rotate the logs for this channel. The bot will rotate logs when the\n" +" timestamp for the log changes. The timestamp is set according to\n" +" the 'filenameTimestamp' configuration variable." +msgstr "" + +#: config.py:67 +msgid "" +"Determines how to represent the timestamp\n" +" used for the filename in rotated logs. When this timestamp changes, the\n" +" old logfiles will be closed and a new one started. The format characters\n" +" for the timestamp are in the time.strftime docs at python.org. In order\n" +" for your logs to be rotated, you'll also have to enable\n" +" supybot.plugins.ChannelLogger.rotateLogs." +msgstr "" + +#: config.py:75 +msgid "" +"Determines whether the bot will partition its\n" +" channel logs into separate directories based on different criteria." +msgstr "" + +#: config.py:78 +msgid "" +"Determines whether the bot will use a network\n" +" directory if using directories." +msgstr "" + +#: config.py:81 +msgid "" +"Determines whether the bot will use a channel\n" +" directory if using directories." +msgstr "" + +#: config.py:84 +msgid "" +"Determines whether the bot will use a timestamp\n" +" (determined by supybot.plugins.ChannelLogger.directories.timestamp.format)\n" +" if using directories." +msgstr "" + +#: config.py:88 +msgid "" +"Determines what timestamp format will be used in\n" +" the directory stucture for channel logs if\n" +" supybot.plugins.ChannelLogger.directories.timestamp is True." +msgstr "" + diff --git a/plugins/ChannelLogger/plugin.py b/plugins/ChannelLogger/plugin.py index 93f9b3c06..6296cccbc 100644 --- a/plugins/ChannelLogger/plugin.py +++ b/plugins/ChannelLogger/plugin.py @@ -39,6 +39,8 @@ import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.registry as registry import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('ChannelLogger') class FakeLog(object): def flush(self): diff --git a/plugins/ChannelStats/config.py b/plugins/ChannelStats/config.py index 3e896e999..d8263bf26 100644 --- a/plugins/ChannelStats/config.py +++ b/plugins/ChannelStats/config.py @@ -31,6 +31,9 @@ import re import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring + +_ = PluginInternationalization('ChannelStats') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -54,16 +57,16 @@ class Smileys(registry.Value): ChannelStats = conf.registerPlugin('ChannelStats') conf.registerChannelValue(ChannelStats, 'selfStats', - registry.Boolean(True, """Determines whether the bot will keep channel + registry.Boolean(True, _("""Determines whether the bot will keep channel statistics on itself, possibly skewing the channel stats (especially in - cases where the bot is relaying between channels on a network).""")) + cases where the bot is relaying between channels on a network)."""))) conf.registerChannelValue(ChannelStats, 'smileys', - Smileys(':) ;) ;] :-) :-D :D :P :p (= =)'.split(), """Determines what + Smileys(':) ;) ;] :-) :-D :D :P :p (= =)'.split(), _("""Determines what words (i.e., pieces of text with no spaces in them) are considered - 'smileys' for the purposes of stats-keeping.""")) + 'smileys' for the purposes of stats-keeping."""))) conf.registerChannelValue(ChannelStats, 'frowns', - Smileys(':| :-/ :-\\ :\\ :/ :( :-( :\'('.split(), """Determines what words + Smileys(':| :-/ :-\\ :\\ :/ :( :-( :\'('.split(), _("""Determines what words (i.e., pieces of text with no spaces in them ) are considered 'frowns' for - the purposes of stats-keeping.""")) + the purposes of stats-keeping."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/ChannelStats/locale/fr.po b/plugins/ChannelStats/locale/fr.po new file mode 100644 index 000000000..9ed8d6201 --- /dev/null +++ b/plugins/ChannelStats/locale/fr.po @@ -0,0 +1,196 @@ +# French translations for supybot-i18n package +# Traductions françaises du paquet supybot-i18n. +# Copyright (C) 2010 THE supybot-i18n'S COPYRIGHT HOLDER +# This file is distributed under the same license as the supybot-i package. +# ProgVal , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: supybot-i18n\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-10-10 15:07+CEST\n" +"PO-Revision-Date: 2010-10-10 15:42+0100\n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: config.py:57 +msgid "" +"Determines whether the bot will keep channel\n" +" statistics on itself, possibly skewing the channel stats (especially in\n" +" cases where the bot is relaying between channels on a network)." +msgstr "Détermine si le bot se prendre en compte dans les statistiques du canal, ce qui peut les fausser 'particulièrement dans le cas où le bot relaye entre des canaux)" + +#: config.py:61 +msgid "" +"Determines what\n" +" words (i.e., pieces of text with no spaces in them) are considered\n" +" 'smileys' for the purposes of stats-keeping." +msgstr "Détermine quels mots (c'est à dire, les morceaux de texte sans espace) sont considérés comme smileys par les stats." + +#: config.py:65 +msgid "" +"Determines what words\n" +" (i.e., pieces of text with no spaces in them ) are considered 'frowns' for\n" +" the purposes of stats-keeping." +msgstr "Détermine quels mots (c'est à dire, les morceaux de texte sans espace) sont considérés comme sadleys par les stats." + +#: plugin.py:259 +msgid "I couldn't find you in my user database." +msgstr "Je ne peux vous trouver dans ma base de données." + +#: plugin.py:272 +msgid "%s has sent %n; a total of %n, %n, %n, and %n; %s of those messages %s. %s has joined %n, parted %n, quit %n, kicked someone %n, been kicked %n, changed the topic %n, and changed the mode %n." +msgstr "%s a envoyé %n ; un total de %n, %n, %n, et %n ; %s de ces messages %s. %s est arrivé %n fois, est parti %n fois, a quitté %n fois, a kické %n fois, a été kické %n fois, a changé le topic %n fois, et a changé les modes %n fois." + +#: plugin.py:279 +msgid "character" +msgstr "caractère" + +#: plugin.py:280 +#: plugin.py:363 +msgid "word" +msgstr "mot" + +#: plugin.py:281 +#: plugin.py:364 +msgid "smiley" +msgstr "smiley" + +#: plugin.py:282 +#: plugin.py:365 +msgid "frown" +msgstr "sadley" + +#: plugin.py:284 +#: plugin.py:366 +msgid "was an ACTION" +msgstr "était une action" + +#: plugin.py:285 +#: plugin.py:367 +msgid "were ACTIONs" +msgstr "étaient des ACTIONs" + +#: plugin.py:287 +#: plugin.py:288 +#: plugin.py:289 +#: plugin.py:290 +#: plugin.py:291 +#: plugin.py:292 +#: plugin.py:293 +msgid "time" +msgstr "" + +#: plugin.py:296 +msgid "I have no stats for that %s in %s." +msgstr "Je n'ai pas de statistiques pour %s sur %s." + +#: plugin.py:315 +msgid "There's really no reason why you should have underscores or brackets in your mathematical expression. Please remove them." +msgstr "Il n'y a aucune raison pour que vous ayez des underscores ou des crochets dans vos expressions mathématiques. Veuillez les supprimer." + +#: plugin.py:319 +msgid "You can't use lambda in this command." +msgstr "Vous ne pouvez utiliser lambda dans cette commande." + +#: plugin.py:333 +msgid "stat variable" +msgstr "Variable statistique" + +#: plugin.py:357 +msgid "On %s there %h been %i messages, containing %i characters, %n, %n, and %n; %i of those messages %s. There have been %n, %n, %n, %n, %n, and %n. There %b currently %n and the channel has peaked at %n." +msgstr "Sur %s il y a eu%v %i messages, contenant %i caractères, %n, %n, et %n ; %i de ces messages %s. Il y a eu %n, %n, %n, %n, %n, et %n. Il y a%v actuellement %n et le record du canal est de %n." + +#: plugin.py:368 +msgid "join" +msgstr "arrivée" + +#: plugin.py:369 +msgid "part" +msgstr "départ" + +#: plugin.py:370 +msgid "quit" +msgstr "quit" + +#: plugin.py:371 +msgid "kick" +msgstr "kick" + +#: plugin.py:372 +msgid "mode" +msgstr "mode" + +#: plugin.py:372 +#: plugin.py:373 +msgid "change" +msgstr "changement" + +#: plugin.py:373 +msgid "topic" +msgstr "topic" + +#: plugin.py:375 +#: plugin.py:376 +msgid "user" +msgstr "utilisateur" + +#: plugin.py:379 +msgid "I've never been on %s." +msgstr "Je n'ai jamais été sur %s." + +#~ msgid "" +#~ "[] []\n" +#~ "\n" +#~ " Returns the statistics for on . is " +#~ "only\n" +#~ " necessary if the message isn't sent on the channel itself. If " +#~ "\n" +#~ " isn't given, it defaults to the user sending the command.\n" +#~ " " +#~ msgstr "" +#~ "[] [nom]\n" +#~ "\n" +#~ " Retourne les statistiques pour sur le . n'est " +#~ "nécessaire que si le message n'est pas envoyé sur le canal lui-même. Si " +#~ " n'est pas donné, il correspond par défaut à l'utilisateur envoyant " +#~ "la commande" +#~ msgid "" +#~ "[] \n" +#~ "\n" +#~ " Returns the ranking of users according to the given stat " +#~ "expression.\n" +#~ " Valid variables in the stat expression include 'msgs', 'chars',\n" +#~ " 'words', 'smileys', 'frowns', 'actions', 'joins', 'parts', " +#~ "'quits',\n" +#~ " 'kicks', 'kicked', 'topics', and 'modes'. Any simple " +#~ "mathematical\n" +#~ " expression involving those variables is permitted.\n" +#~ " " +#~ msgstr "" +#~ "[] \n" +#~ "\n" +#~ "Retourne le rang des utilisateurs en fonction de l'expression de " +#~ "statistiques données. Les variables valides dans l'expression de " +#~ "statistiques sont : 'msgs', 'chars', 'words', 'smileys', 'frowns', " +#~ "'actions', 'joins', 'parts', 'quits', 'kicks', 'kicked', 'topics', et " +#~ "'modes'. Toute expression mathématiques simple utilisant ces variables " +#~ "est autorisée." +#~ msgid "" +#~ "[]\n" +#~ "\n" +#~ " Returns the statistics for . is only " +#~ "necessary if\n" +#~ " the message isn't sent on the channel itself.\n" +#~ " " +#~ msgstr "" +#~ "[canal]\n" +#~ "\n" +#~ "Retourne les statistiques pour le . n'est nécessaire que " +#~ "si le message n'est pas envoyé sur le canal lui-même." + diff --git a/plugins/ChannelStats/messages.pot b/plugins/ChannelStats/messages.pot new file mode 100644 index 000000000..0c664ce18 --- /dev/null +++ b/plugins/ChannelStats/messages.pot @@ -0,0 +1,165 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-16 09:41+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:60 +msgid "" +"Determines whether the bot will keep channel\n" +" statistics on itself, possibly skewing the channel stats (especially in\n" +" cases where the bot is relaying between channels on a network)." +msgstr "" + +#: config.py:64 +msgid "" +"Determines what\n" +" words (i.e., pieces of text with no spaces in them) are considered\n" +" 'smileys' for the purposes of stats-keeping." +msgstr "" + +#: config.py:68 +msgid "" +"Determines what words\n" +" (i.e., pieces of text with no spaces in them ) are considered 'frowns' for\n" +" the purposes of stats-keeping." +msgstr "" + +#: plugin.py:246 +#, docstring +msgid "" +"[] []\n" +"\n" +" Returns the statistics for on . is only\n" +" necessary if the message isn't sent on the channel itself. If \n" +" isn't given, it defaults to the user sending the command.\n" +" " +msgstr "" + +#: plugin.py:259 +msgid "I couldn't find you in my user database." +msgstr "" + +#: plugin.py:272 +msgid "%s has sent %n; a total of %n, %n, %n, and %n; %s of those messages %s. %s has joined %n, parted %n, quit %n, kicked someone %n, been kicked %n, changed the topic %n, and changed the mode %n." +msgstr "" + +#: plugin.py:279 +msgid "character" +msgstr "" + +#: plugin.py:280 plugin.py:363 +msgid "word" +msgstr "" + +#: plugin.py:281 plugin.py:364 +msgid "smiley" +msgstr "" + +#: plugin.py:282 plugin.py:365 +msgid "frown" +msgstr "" + +#: plugin.py:284 plugin.py:366 +msgid "was an ACTION" +msgstr "" + +#: plugin.py:285 plugin.py:367 +msgid "were ACTIONs" +msgstr "" + +#: plugin.py:287 plugin.py:288 plugin.py:289 plugin.py:290 plugin.py:291 +#: plugin.py:292 plugin.py:293 +msgid "time" +msgstr "" + +#: plugin.py:296 +msgid "I have no stats for that %s in %s." +msgstr "" + +#: plugin.py:304 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns the ranking of users according to the given stat expression.\n" +" Valid variables in the stat expression include 'msgs', 'chars',\n" +" 'words', 'smileys', 'frowns', 'actions', 'joins', 'parts', 'quits',\n" +" 'kicks', 'kicked', 'topics', and 'modes'. Any simple mathematical\n" +" expression involving those variables is permitted.\n" +" " +msgstr "" + +#: plugin.py:315 +msgid "There's really no reason why you should have underscores or brackets in your mathematical expression. Please remove them." +msgstr "" + +#: plugin.py:319 +msgid "You can't use lambda in this command." +msgstr "" + +#: plugin.py:333 +msgid "stat variable" +msgstr "" + +#: plugin.py:349 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the statistics for . is only necessary if\n" +" the message isn't sent on the channel itself.\n" +" " +msgstr "" + +#: plugin.py:357 +msgid "On %s there %h been %i messages, containing %i characters, %n, %n, and %n; %i of those messages %s. There have been %n, %n, %n, %n, %n, and %n. There %b currently %n and the channel has peaked at %n." +msgstr "" + +#: plugin.py:368 +msgid "join" +msgstr "" + +#: plugin.py:369 +msgid "part" +msgstr "" + +#: plugin.py:370 +msgid "quit" +msgstr "" + +#: plugin.py:371 +msgid "kick" +msgstr "" + +#: plugin.py:372 +msgid "mode" +msgstr "" + +#: plugin.py:372 plugin.py:373 +msgid "change" +msgstr "" + +#: plugin.py:373 +msgid "topic" +msgstr "" + +#: plugin.py:375 plugin.py:376 +msgid "user" +msgstr "" + +#: plugin.py:379 +msgid "I've never been on %s." +msgstr "" + diff --git a/plugins/ChannelStats/plugin.py b/plugins/ChannelStats/plugin.py index d09129bed..0f0e3482b 100644 --- a/plugins/ChannelStats/plugin.py +++ b/plugins/ChannelStats/plugin.py @@ -34,6 +34,7 @@ import types import supybot.log as log import supybot.conf as conf +from supybot.i18n import PluginInternationalization, internationalizeDocstring import supybot.utils as utils import supybot.world as world import supybot.ircdb as ircdb @@ -44,6 +45,8 @@ import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +_ = PluginInternationalization('ChannelStats') + class ChannelStat(irclib.IrcCommandDispatcher): _values = ['actions', 'chars', 'frowns', 'joins', 'kicks','modes', 'msgs', 'parts', 'quits', 'smileys', 'topics', 'words', 'users'] @@ -238,6 +241,7 @@ class ChannelStats(callbacks.Plugin): self.db[channel, id] = UserStat() self.db.channels[channel][id].kicked += 1 + @internationalizeDocstring def stats(self, irc, msg, args, channel, name): """[] [] @@ -252,7 +256,7 @@ class ChannelStats(callbacks.Plugin): id = ircdb.users.getUserId(msg.prefix) name = ircdb.users.getUser(id).name except KeyError: - irc.error('I couldn\'t find you in my user database.') + irc.error(_('I couldn\'t find you in my user database.')) return elif not ircdb.users.hasUser(name): try: @@ -265,36 +269,37 @@ class ChannelStats(callbacks.Plugin): id = ircdb.users.getUserId(name) try: stats = self.db.getUserStats(channel, id) - s = format('%s has sent %n; a total of %n, %n, ' - '%n, and %n; %s of those messages %s' + s = format(_('%s has sent %n; a total of %n, %n, ' + '%n, and %n; %s of those messages %s. ' '%s has joined %n, parted %n, quit %n, ' 'kicked someone %n, been kicked %n, ' 'changed the topic %n, and changed the ' - 'mode %n.', + 'mode %n.'), name, (stats.msgs, 'message'), - (stats.chars, 'character'), - (stats.words, 'word'), - (stats.smileys, 'smiley'), - (stats.frowns, 'frown'), + (stats.chars, _('character')), + (stats.words, _('word')), + (stats.smileys, _('smiley')), + (stats.frowns, _('frown')), stats.actions, - stats.actions == 1 and 'was an ACTION. ' - or 'were ACTIONs. ', + stats.actions == 1 and _('was an ACTION') + or _('were ACTIONs'), name, - (stats.joins, 'time'), - (stats.parts, 'time'), - (stats.quits, 'time'), - (stats.kicks, 'time'), - (stats.kicked, 'time'), - (stats.topics, 'time'), - (stats.modes, 'time')) + (stats.joins, _('time')), + (stats.parts, _('time')), + (stats.quits, _('time')), + (stats.kicks, _('time')), + (stats.kicked, _('time')), + (stats.topics, _('time')), + (stats.modes, _('time'))) irc.reply(s) except KeyError: - irc.error(format('I have no stats for that %s in %s.', + irc.error(format(_('I have no stats for that %s in %s.'), name, channel)) stats = wrap(stats, ['channeldb', additional('something')]) _env = {'__builtins__': types.ModuleType('__builtins__')} _env.update(math.__dict__) + @internationalizeDocstring def rank(self, irc, msg, args, channel, expr): """[] @@ -307,11 +312,11 @@ class ChannelStats(callbacks.Plugin): # XXX I could do this the right way, and abstract out a safe eval, # or I could just copy/paste from the Math plugin. if expr != expr.translate(utils.str.chars, '_[]'): - irc.error('There\'s really no reason why you should have ' + irc.error(_('There\'s really no reason why you should have ' 'underscores or brackets in your mathematical ' - 'expression. Please remove them.', Raise=True) + 'expression. Please remove them.'), Raise=True) if 'lambda' in expr: - irc.error('You can\'t use lambda in this command.', Raise=True) + irc.error(_('You can\'t use lambda in this command.'), Raise=True) expr = expr.lower() users = [] for ((c, id), stats) in self.db.items(): @@ -325,7 +330,7 @@ class ChannelStats(callbacks.Plugin): except ZeroDivisionError: v = float('inf') except NameError, e: - irc.errorInvalid('stat variable', str(e).split()[1]) + irc.errorInvalid(_('stat variable'), str(e).split()[1]) except Exception, e: irc.error(utils.exnToString(e), Raise=True) if id == 0: @@ -339,6 +344,7 @@ class ChannelStats(callbacks.Plugin): irc.reply(s) rank = wrap(rank, ['channeldb', 'text']) + @internationalizeDocstring def channelstats(self, irc, msg, args, channel): """[] @@ -348,29 +354,29 @@ class ChannelStats(callbacks.Plugin): try: stats = self.db.getChannelStats(channel) curUsers = len(irc.state.channels[channel].users) - s = format('On %s there %h been %i messages, containing %i ' + s = format(_('On %s there %h been %i messages, containing %i ' 'characters, %n, %n, and %n; ' '%i of those messages %s. There have been ' '%n, %n, %n, %n, %n, and %n. There %b currently %n ' - 'and the channel has peaked at %n.', + 'and the channel has peaked at %n.'), channel, stats.msgs, stats.msgs, stats.chars, - (stats.words, 'word'), - (stats.smileys, 'smiley'), - (stats.frowns, 'frown'), - stats.actions, stats.actions == 1 and 'was an ACTION' - or 'were ACTIONs', - (stats.joins, 'join'), - (stats.parts, 'part'), - (stats.quits, 'quit'), - (stats.kicks, 'kick'), - (stats.modes, 'mode', 'change'), - (stats.topics, 'topic', 'change'), + (stats.words, _('word')), + (stats.smileys, _('smiley')), + (stats.frowns, _('frown')), + stats.actions, stats.actions == 1 and _('was an ACTION') + or _('were ACTIONs'), + (stats.joins, _('join')), + (stats.parts, _('part')), + (stats.quits, _('quit')), + (stats.kicks, _('kick')), + (stats.modes, _('mode'), _('change')), + (stats.topics, _('topic'), _('change')), curUsers, - (curUsers, 'user'), - (stats.users, 'user')) + (curUsers, _('user')), + (stats.users, _('user'))) irc.reply(s) except KeyError: - irc.error(format('I\'ve never been on %s.', channel)) + irc.error(format(_('I\'ve never been on %s.'), channel)) channelstats = wrap(channelstats, ['channeldb']) diff --git a/plugins/Config/config.py b/plugins/Config/config.py index 878b5051a..7f53e8208 100644 --- a/plugins/Config/config.py +++ b/plugins/Config/config.py @@ -30,6 +30,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Config') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Config/locale/fr.po b/plugins/Config/locale/fr.po new file mode 100644 index 000000000..9eb4cb258 --- /dev/null +++ b/plugins/Config/locale/fr.po @@ -0,0 +1,156 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-12-12 15:02+CET\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:103 +msgid "configuration variable" +msgstr "variable de configuration" + +#: plugin.py:109 +msgid "settable configuration variable" +msgstr "variable de configuration modifiable" + +#: plugin.py:136 +msgid "" +"\n" +"\n" +" Returns the configuration variables available under the given\n" +" configuration . If a variable has values under it, it is\n" +" preceded by an '@' sign. If a variable is a 'ChannelValue', that is,\n" +" it can be separately configured for each channel using the 'channel'\n" +" command in this plugin, it is preceded by an '#' sign.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne les variables de configuration qui sont dans le de configuration. Si la variable a des sous-variables, elle sera précédée par le signe '@'. Si une variable est une 'ChannelValue', elle sera précédée par le signe '#'. Plus d'informations : http://supybot-fr.tk/Configuration" + +#: plugin.py:148 +msgid "There don't seem to be any values in %s." +msgstr "Il semble n'y avoir aucune valeur dans %s." + +#: plugin.py:154 +msgid "" +"\n" +"\n" +" Searches for in the current configuration variables.\n" +" " +msgstr "" +"\n" +"\n" +"Recherche le dans les variables de configuration." + +#: plugin.py:167 +msgid "There were no matching configuration variables." +msgstr "Il n'y a aucune variable de configuration correspondante." + +#: plugin.py:174 +msgid "Global: %s; %s: %s" +msgstr "Globale : %s ; %s : %s" + +#: plugin.py:185 +msgid "That registry variable has no value. Use the list command in this plugin to see what variables are available in this group." +msgstr "Cette variable de registre n'a aucune valeur. Utilisez la commande 'list' sur ce plugin pour voir quelles variables sont disponibles pour ce groupe." + +#: plugin.py:200 +msgid "" +"[] []\n" +"\n" +" If is given, sets the channel configuration variable for \n" +" to for . Otherwise, returns the current channel\n" +" configuration value of . is only necessary if the\n" +" message isn't sent in the channel itself." +msgstr "" +"[] []\n" +"\n" +"Si la est donnée, défini la variable de configuration à sur le . Sinon, retourne la configuration actuelle du pour . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:207 +msgid "That configuration variable is not a channel-specific configuration variable." +msgstr "Cette variable de configuration n'est pas une variable spécifique à un canal." + +#: plugin.py:220 +msgid "" +" []\n" +"\n" +" If is given, sets the value of to . Otherwise,\n" +" returns the current value of . You may omit the leading\n" +" \"supybot.\" in the name if you so choose.\n" +" " +msgstr "" +" []\n" +"\n" +"Si la est donnée, défini la variable de configuration à . Sinon, retourne la configuration actuelle de . Vous pouvez omettre le 'supybot.' au début du ." + +#: plugin.py:234 +msgid "" +"\n" +"\n" +" Returns the description of the configuration variable .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne la description de la variable de configuration ." + +#: plugin.py:242 +msgid " (Current value: %s)" +msgstr " (Valeur courante : %s)" + +#: plugin.py:245 +msgid "That configuration group exists, but seems to have no help. Try \"config list %s\" to see if it has any children values." +msgstr "Ce groupe de configuration existe mais semble ne pas avoir d'aide. Essayez \"config list %s\" pour voir si il a des valeurs filles." + +#: plugin.py:249 +msgid "%s has no help." +msgstr "%s n'a pas d'aide." + +#: plugin.py:254 +msgid "" +"\n" +"\n" +" Returns the default value of the configuration variable .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne la valeur par défaut de la variable de configuration ." + +#: plugin.py:264 +msgid "" +"takes no arguments\n" +"\n" +" Reloads the various configuration files (user database, channel\n" +" database, registry, etc.).\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Recharge les différents fichiers de configuration (base d'utilisateurs, base de canaux, registre, etc.)." + +#: plugin.py:275 +msgid "" +"\n" +"\n" +" Exports the public variables of your configuration to .\n" +" If you want to show someone your configuration file, but you don't\n" +" want that person to be able to see things like passwords, etc., this\n" +" command will export a \"sanitized\" configuration file suitable for\n" +" showing publicly.\n" +" " +msgstr "" +"\n" +"\n" +"Exporte les variables de configuration publiques dans le fichier, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-12-12 15:02+CET\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:103 +msgid "configuration variable" +msgstr "" + +#: plugin.py:109 +msgid "settable configuration variable" +msgstr "" + +#: plugin.py:136 +#, docstring +msgid "" +"\n" +"\n" +" Returns the configuration variables available under the given\n" +" configuration . If a variable has values under it, it is\n" +" preceded by an '@' sign. If a variable is a 'ChannelValue', that is,\n" +" it can be separately configured for each channel using the 'channel'\n" +" command in this plugin, it is preceded by an '#' sign.\n" +" " +msgstr "" + +#: plugin.py:148 +msgid "There don't seem to be any values in %s." +msgstr "" + +#: plugin.py:154 +#, docstring +msgid "" +"\n" +"\n" +" Searches for in the current configuration variables.\n" +" " +msgstr "" + +#: plugin.py:167 +msgid "There were no matching configuration variables." +msgstr "" + +#: plugin.py:174 +msgid "Global: %s; %s: %s" +msgstr "" + +#: plugin.py:185 +msgid "That registry variable has no value. Use the list command in this plugin to see what variables are available in this group." +msgstr "" + +#: plugin.py:200 +#, docstring +msgid "" +"[] []\n" +"\n" +" If is given, sets the channel configuration variable for \n" +" to for . Otherwise, returns the current channel\n" +" configuration value of . is only necessary if the\n" +" message isn't sent in the channel itself." +msgstr "" + +#: plugin.py:207 +msgid "That configuration variable is not a channel-specific configuration variable." +msgstr "" + +#: plugin.py:220 +#, docstring +msgid "" +" []\n" +"\n" +" If is given, sets the value of to . Otherwise,\n" +" returns the current value of . You may omit the leading\n" +" \"supybot.\" in the name if you so choose.\n" +" " +msgstr "" + +#: plugin.py:234 +#, docstring +msgid "" +"\n" +"\n" +" Returns the description of the configuration variable .\n" +" " +msgstr "" + +#: plugin.py:242 +msgid " (Current value: %s)" +msgstr "" + +#: plugin.py:245 +msgid "That configuration group exists, but seems to have no help. Try \"config list %s\" to see if it has any children values." +msgstr "" + +#: plugin.py:249 +msgid "%s has no help." +msgstr "" + +#: plugin.py:254 +#, docstring +msgid "" +"\n" +"\n" +" Returns the default value of the configuration variable .\n" +" " +msgstr "" + +#: plugin.py:264 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Reloads the various configuration files (user database, channel\n" +" database, registry, etc.).\n" +" " +msgstr "" + +#: plugin.py:275 +#, docstring +msgid "" +"\n" +"\n" +" Exports the public variables of your configuration to .\n" +" If you want to show someone your configuration file, but you don't\n" +" want that person to be able to see things like passwords, etc., this\n" +" command will export a \"sanitized\" configuration file suitable for\n" +" showing publicly.\n" +" " +msgstr "" + diff --git a/plugins/Config/plugin.py b/plugins/Config/plugin.py index 0b2dd6fda..d248f4bcd 100644 --- a/plugins/Config/plugin.py +++ b/plugins/Config/plugin.py @@ -41,6 +41,8 @@ from supybot.utils.iter import all import supybot.ircutils as ircutils import supybot.registry as registry import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Config') ### # Now, to setup the registry. @@ -98,13 +100,13 @@ def getConfigVar(irc, msg, args, state): state.args.append(group) del args[0] except registry.InvalidRegistryName, e: - state.errorInvalid('configuration variable', str(e)) + state.errorInvalid(_('configuration variable'), str(e)) addConverter('configVar', getConfigVar) def getSettableConfigVar(irc, msg, args, state): getConfigVar(irc, msg, args, state) if not hasattr(state.args[-1], 'set'): - state.errorInvalid('settable configuration variable', + state.errorInvalid(_('settable configuration variable'), state.args[-1]._name) addConverter('settableConfigVar', getSettableConfigVar) @@ -129,6 +131,7 @@ class Config(callbacks.Plugin): utils.sortBy(str.lower, L) return L + @internationalizeDocstring def list(self, irc, msg, args, group): """ @@ -142,16 +145,18 @@ class Config(callbacks.Plugin): if L: irc.reply(format('%L', L)) else: - irc.error('There don\'t seem to be any values in %s.' % group._name) + irc.error(_('There don\'t seem to be any values in %s.') % + group._name) list = wrap(list, ['configVar']) + @internationalizeDocstring def search(self, irc, msg, args, word): """ Searches for in the current configuration variables. """ L = [] - for (name, _) in conf.supybot.getValues(getChildren=True): + for (name, x) in conf.supybot.getValues(getChildren=True): if word in name.lower(): possibleChannel = registry.split(name)[-1] if not ircutils.isChannel(possibleChannel): @@ -159,14 +164,14 @@ class Config(callbacks.Plugin): if L: irc.reply(format('%L', L)) else: - irc.reply('There were no matching configuration variables.') + irc.reply(_('There were no matching configuration variables.')) search = wrap(search, ['lowered']) # XXX compose with withoutSpaces? def _getValue(self, irc, msg, group, addChannel=False): value = str(group) or ' ' if addChannel and irc.isChannel(msg.args[0]) and not irc.nested: s = str(group.get(msg.args[0])) - value = 'Global: %s; %s: %s' % (value, msg.args[0], s) + value = _('Global: %s; %s: %s') % (value, msg.args[0], s) if hasattr(group, 'value'): if not group._private: irc.reply(value) @@ -177,9 +182,9 @@ class Config(callbacks.Plugin): else: irc.errorNoCapability(capability) else: - irc.error('That registry variable has no value. Use the list ' + irc.error(_('That registry variable has no value. Use the list ' 'command in this plugin to see what variables are ' - 'available in this group.') + 'available in this group.')) def _setValue(self, irc, msg, group, value): capability = getCapability(group._name) @@ -190,6 +195,7 @@ class Config(callbacks.Plugin): else: irc.errorNoCapability(capability) + @internationalizeDocstring def channel(self, irc, msg, args, channel, group, value): """[] [] @@ -198,8 +204,8 @@ class Config(callbacks.Plugin): configuration value of . is only necessary if the message isn't sent in the channel itself.""" if not group.channelValue: - irc.error('That configuration variable is not a channel-specific ' - 'configuration variable.') + irc.error(_('That configuration variable is not a channel-specific ' + 'configuration variable.')) return group = group.get(channel) if value is not None: @@ -209,6 +215,7 @@ class Config(callbacks.Plugin): channel = wrap(channel, ['channel', 'settableConfigVar', additional('text')]) + @internationalizeDocstring def config(self, irc, msg, args, group, value): """ [] @@ -222,6 +229,7 @@ class Config(callbacks.Plugin): self._getValue(irc, msg, group, addChannel=group.channelValue) config = wrap(config, ['settableConfigVar', additional('text')]) + @internationalizeDocstring def help(self, irc, msg, args, group): """ @@ -231,16 +239,17 @@ class Config(callbacks.Plugin): s = group.help() if s: if hasattr(group, 'value') and not group._private: - s += ' (Current value: %s)' % group + s += _(' (Current value: %s)') % group irc.reply(s) else: - irc.reply('That configuration group exists, but seems to have ' - 'no help. Try "config list %s" to see if it has ' - 'any children values.' % group._name) + irc.reply(_('That configuration group exists, but seems to ' + 'have no help. Try "config list %s" to see if it ' + 'has any children values.') % group._name) else: - irc.error('%s has no help.' % group._name) + irc.error(_('%s has no help.') % group._name) help = wrap(help, ['configVar']) + @internationalizeDocstring def default(self, irc, msg, args, group): """ @@ -250,6 +259,7 @@ class Config(callbacks.Plugin): irc.reply(str(v)) default = wrap(default, ['settableConfigVar']) + @internationalizeDocstring def reload(self, irc, msg, args): """takes no arguments @@ -260,6 +270,7 @@ class Config(callbacks.Plugin): irc.replySuccess() reload = wrap(reload, [('checkCapability', 'owner')]) + @internationalizeDocstring def export(self, irc, msg, args, filename): """ diff --git a/plugins/Ctcp/config.py b/plugins/Ctcp/config.py index 3f1f49dc0..8e19f3273 100644 --- a/plugins/Ctcp/config.py +++ b/plugins/Ctcp/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Ctcp') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Ctcp/locale/fr.po b/plugins/Ctcp/locale/fr.po new file mode 100644 index 000000000..0b9193541 --- /dev/null +++ b/plugins/Ctcp/locale/fr.po @@ -0,0 +1,19 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-26 18:57+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:104 +msgid "Supybot, the best Python IRC bot in existence!" +msgstr "Supybot, le meilleur bot IRC en Python au monde !" + diff --git a/plugins/Ctcp/messages.pot b/plugins/Ctcp/messages.pot new file mode 100644 index 000000000..61064f706 --- /dev/null +++ b/plugins/Ctcp/messages.pot @@ -0,0 +1,21 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-26 18:57+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:104 +msgid "Supybot, the best Python IRC bot in existence!" +msgstr "" + diff --git a/plugins/Ctcp/plugin.py b/plugins/Ctcp/plugin.py index e62404083..94dc3e2ed 100644 --- a/plugins/Ctcp/plugin.py +++ b/plugins/Ctcp/plugin.py @@ -36,6 +36,8 @@ import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.schedule as schedule import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Ctcp') class Ctcp(callbacks.PluginRegexp): public = False @@ -98,8 +100,8 @@ class Ctcp(callbacks.PluginRegexp): def ctcpFinger(self, irc, msg, match): "\x01FINGER\x01" self.log.info('Received CTCP FINGER from %s', msg.prefix) - self._reply(irc, msg, - 'FINGER Supybot, the best Python IRC bot in existence!') + self._reply(irc, msg, 'FINGER ' + + _('Supybot, the best Python IRC bot in existence!')) def ctcpSource(self, irc, msg, match): "\x01SOURCE\x01" @@ -116,6 +118,7 @@ class Ctcp(callbacks.PluginRegexp): if version == 'VERSION': self.versions.setdefault(payload, []).append(msg.nick) + @internationalizeDocstring def version(self, irc, msg, args, channel, optlist): """[] [--nicks] diff --git a/plugins/Dict/config.py b/plugins/Dict/config.py index d69bd0f28..4ac2452d3 100644 --- a/plugins/Dict/config.py +++ b/plugins/Dict/config.py @@ -29,22 +29,24 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Dict') def configure(advanced): from supybot.questions import output, expect, anything, something, yn conf.registerPlugin('Dict', True) - output('The default dictd server is dict.org.') - if yn('Would you like to specify a different dictd server?'): + output(_('The default dictd server is dict.org.')) + if yn(_('Would you like to specify a different dictd server?')): server = something('What server?') conf.supybot.plugins.Dict.server.set(server) Dict = conf.registerPlugin('Dict') conf.registerGlobalValue(Dict, 'server', - registry.String('dict.org', """Determines what server the bot will - retrieve definitions from.""")) + registry.String('dict.org', _("""Determines what server the bot will + retrieve definitions from."""))) conf.registerChannelValue(Dict, 'default', - registry.String('', """Determines the default dictionary the bot will + registry.String('', _("""Determines the default dictionary the bot will ask for definitions in. If this value is '*' (without the quotes) the bot - will use all dictionaries to define words.""")) + will use all dictionaries to define words."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Dict/locale/fr.po b/plugins/Dict/locale/fr.po new file mode 100644 index 000000000..2b70d582c --- /dev/null +++ b/plugins/Dict/locale/fr.po @@ -0,0 +1,86 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 10:39+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:38 +msgid "The default dictd server is dict.org." +msgstr "Le serveur dictd par défaut est dict.org" + +#: config.py:39 +msgid "Would you like to specify a different dictd server?" +msgstr "Voulez-vous spécifier un serveur dictd différent ?" + +#: config.py:45 +msgid "" +"Determines what server the bot will\n" +" retrieve definitions from." +msgstr "Détermine de quel serveur le bot récupérera les définitions." + +#: config.py:48 +msgid "" +"Determines the default dictionary the bot will\n" +" ask for definitions in. If this value is '*' (without the quotes) the bot\n" +" will use all dictionaries to define words." +msgstr "Détermine le dictionnaire par défaut dans lequel le bot cherchera les définitions. Si la valeur est '*' (sans les guillemets), le bot utilisera tous les dictionnaires pour définir le mot." + +#: plugin.py:52 +msgid "" +"takes no arguments\n" +"\n" +" Returns the dictionaries valid for the dict command.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne les dictionnaires valides pour la commande dict." + +#: plugin.py:68 +msgid "" +"takes no arguments\n" +"\n" +" Returns a random valid dictionary.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne un dictionnaire valide aléatoire." + +#: plugin.py:83 +msgid "" +"[] \n" +"\n" +" Looks up the definition of on the dictd server specified by\n" +" the supybot.plugins.Dict.server config variable.\n" +" " +msgstr "" +"[] \n" +"\n" +"Recherche la définition du mot sur le serveur dictd spécifié par la variable de configuration supybot.plugins.Dict.server." + +#: plugin.py:106 +msgid "You must give a word to define." +msgstr "Vous devez donner un mot à définir." + +#: plugin.py:112 +msgid "No definition for %q could be found." +msgstr "La définition de %q ne peut être trouvée." + +#: plugin.py:115 +msgid "No definition for %q could be found in %s" +msgstr "La définition de %q ne peut être trouvée dans %s." + +#: plugin.py:127 +msgid "%L responded: %s" +msgstr "%L a répondu : %s" + diff --git a/plugins/Dict/messages.pot b/plugins/Dict/messages.pot new file mode 100644 index 000000000..86e447f6f --- /dev/null +++ b/plugins/Dict/messages.pot @@ -0,0 +1,82 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 10:39+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:38 +msgid "The default dictd server is dict.org." +msgstr "" + +#: config.py:39 +msgid "Would you like to specify a different dictd server?" +msgstr "" + +#: config.py:45 +msgid "" +"Determines what server the bot will\n" +" retrieve definitions from." +msgstr "" + +#: config.py:48 +msgid "" +"Determines the default dictionary the bot will\n" +" ask for definitions in. If this value is '*' (without the quotes) the bot\n" +" will use all dictionaries to define words." +msgstr "" + +#: plugin.py:52 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the dictionaries valid for the dict command.\n" +" " +msgstr "" + +#: plugin.py:68 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns a random valid dictionary.\n" +" " +msgstr "" + +#: plugin.py:83 +#, docstring +msgid "" +"[] \n" +"\n" +" Looks up the definition of on the dictd server specified by\n" +" the supybot.plugins.Dict.server config variable.\n" +" " +msgstr "" + +#: plugin.py:106 +msgid "You must give a word to define." +msgstr "" + +#: plugin.py:112 +msgid "No definition for %q could be found." +msgstr "" + +#: plugin.py:115 +msgid "No definition for %q could be found in %s" +msgstr "" + +#: plugin.py:127 +msgid "%L responded: %s" +msgstr "" + diff --git a/plugins/Dict/plugin.py b/plugins/Dict/plugin.py index 989ee687b..080edd2d5 100644 --- a/plugins/Dict/plugin.py +++ b/plugins/Dict/plugin.py @@ -35,6 +35,8 @@ import supybot.utils as utils from supybot.commands import * import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Dict') try: dictclient = utils.python.universalImport('dictclient', 'local.dictclient') @@ -45,6 +47,7 @@ except ImportError: class Dict(callbacks.Plugin): threaded = True + @internationalizeDocstring def dictionaries(self, irc, msg, args): """takes no arguments @@ -60,6 +63,7 @@ class Dict(callbacks.Plugin): irc.error(utils.web.strError(e)) dictionaries = wrap(dictionaries) + @internationalizeDocstring def random(self, irc, msg, args): """takes no arguments @@ -74,6 +78,7 @@ class Dict(callbacks.Plugin): irc.error(utils.web.strError(e)) random = wrap(random) + @internationalizeDocstring def dict(self, irc, msg, args, words): """[] @@ -98,16 +103,17 @@ class Dict(callbacks.Plugin): 'dictionary: %s.', msg.args[0], default) dictionary = '*' if not words: - irc.error('You must give a word to define.', Raise=True) + irc.error(_('You must give a word to define.'), Raise=True) word = ' '.join(words) definitions = conn.define(dictionary, word) dbs = set() if not definitions: if dictionary == '*': - irc.reply(format('No definition for %q could be found.', word)) + irc.reply(format(_('No definition for %q could be found.'), + word)) else: - irc.reply(format('No definition for %q could be found in %s', - word, ircutils.bold(dictionary))) + irc.reply(format(_('No definition for %q could be found in ' + '%s'), word, ircutils.bold(dictionary))) return L = [] for d in definitions: @@ -118,7 +124,7 @@ class Dict(callbacks.Plugin): L.append('%s: %s' % (db, s)) utils.sortBy(len, L) if dictionary == '*' and len(dbs) > 1: - s = format('%L responded: %s', list(dbs), '; '.join(L)) + s = format(_('%L responded: %s'), list(dbs), '; '.join(L)) else: s = '; '.join(L) irc.reply(s) diff --git a/plugins/Dunno/config.py b/plugins/Dunno/config.py index 8288c806b..819d888ce 100644 --- a/plugins/Dunno/config.py +++ b/plugins/Dunno/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Dunno') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -41,8 +43,8 @@ def configure(advanced): Dunno = conf.registerPlugin('Dunno') conf.registerChannelValue(Dunno, 'prefixNick', - registry.Boolean(True, """Determines whether the bot will prefix the nick - of the user giving an invalid command to the "dunno" response.""")) + registry.Boolean(True, _("""Determines whether the bot will prefix the nick + of the user giving an invalid command to the "dunno" response."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Dunno/locale/fr.po b/plugins/Dunno/locale/fr.po new file mode 100644 index 000000000..957076ab0 --- /dev/null +++ b/plugins/Dunno/locale/fr.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 10:48+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:46 +msgid "" +"Determines whether the bot will prefix the nick\n" +" of the user giving an invalid command to the \"dunno\" response." +msgstr "Détermine si le bot utilisera comme préfixe le nick de l'utilisateur donnant la commande invalide dans la réponse \"dunno\"." + +#: plugin.py:38 +msgid "" +"This plugin was written initially to work with MoobotFactoids, the two\n" +" of them to provide a similar-to-moobot-and-blootbot interface for factoids.\n" +" Basically, it replaces the standard 'Error: is not a valid command.'\n" +" messages with messages kept in a database, able to give more personable\n" +" responses." +msgstr "Ce plugin était à l'origine écrit pour fonctionner avec MoobotFactoids, pour fournir une interface similaire aux factoids de moobot et blootbot. Remplace simplement les message 'Error: is not a valid commande' par des messages configurés dans la base de données, ce qui vous permet de rendre les réponses plus personnalisables." + diff --git a/plugins/Dunno/messages.pot b/plugins/Dunno/messages.pot new file mode 100644 index 000000000..96ba98add --- /dev/null +++ b/plugins/Dunno/messages.pot @@ -0,0 +1,33 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 10:48+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "" +"Determines whether the bot will prefix the nick\n" +" of the user giving an invalid command to the \"dunno\" response." +msgstr "" + +#: plugin.py:38 +#, docstring +msgid "" +"This plugin was written initially to work with MoobotFactoids, the two\n" +" of them to provide a similar-to-moobot-and-blootbot interface for factoids.\n" +" Basically, it replaces the standard 'Error: is not a valid command.'\n" +" messages with messages kept in a database, able to give more personable\n" +" responses." +msgstr "" + diff --git a/plugins/Dunno/plugin.py b/plugins/Dunno/plugin.py index 4f2f040de..4f0738238 100644 --- a/plugins/Dunno/plugin.py +++ b/plugins/Dunno/plugin.py @@ -30,6 +30,8 @@ from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Dunno') class Dunno(plugins.ChannelIdDatabasePlugin): """This plugin was written initially to work with MoobotFactoids, the two @@ -49,7 +51,7 @@ class Dunno(plugins.ChannelIdDatabasePlugin): env = {'command': tokens[0]} dunno = ircutils.standardSubstitute(irc, msg, dunno, env=env) irc.reply(dunno, prefixNick=prefixNick) - +Dunno = internationalizeDocstring(Dunno) Class = Dunno diff --git a/plugins/Factoids/config.py b/plugins/Factoids/config.py index 79b43b654..4f167865f 100644 --- a/plugins/Factoids/config.py +++ b/plugins/Factoids/config.py @@ -30,6 +30,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Factoids') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -46,22 +48,22 @@ class FactoidFormat(registry.TemplatedString): Factoids = conf.registerPlugin('Factoids') conf.registerChannelValue(Factoids, 'learnSeparator', - registry.String('as', """Determines what separator must be used in the + registry.String('as', _("""Determines what separator must be used in the learn command. Defaults to 'as' -- learn as . Users might feel more comfortable with 'is' or something else, so it's - configurable.""")) + configurable."""))) conf.registerChannelValue(Factoids, 'showFactoidIfOnlyOneMatch', - registry.Boolean(True, """Determines whether the bot will reply with the + registry.Boolean(True, _("""Determines whether the bot will reply with the single matching factoid if only one factoid matches when using the search - command.""")) + command."""))) conf.registerChannelValue(Factoids, 'replyWhenInvalidCommand', - registry.Boolean(True, """Determines whether the bot will reply to invalid + registry.Boolean(True, _("""Determines whether the bot will reply to invalid commands by searching for a factoid; basically making the whatis - unnecessary when you want all factoids for a given key.""")) + unnecessary when you want all factoids for a given key."""))) conf.registerChannelValue(Factoids, 'format', - FactoidFormat('$key could be $value.', """Determines the format of + FactoidFormat(_('$key could be $value.'), _("""Determines the format of the response given when a factoid's value is requested. All the standard substitutes apply, in addition to "$key" for the factoid's key and "$value" - for the factoid's value.""")) + for the factoid's value."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Factoids/locale/fr.po b/plugins/Factoids/locale/fr.po new file mode 100644 index 000000000..a9d4b6531 --- /dev/null +++ b/plugins/Factoids/locale/fr.po @@ -0,0 +1,221 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-11-11 12:37+CET\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:45 +msgid "" +"Value must include $value, otherwise the factoid's value would be left\n" +" out." +msgstr "La valeur doit inclure $value, sinon la valeur de la factoid ne serait pas affichée." + +#: config.py:51 +msgid "" +"Determines what separator must be used in the\n" +" learn command. Defaults to 'as' -- learn as . Users might\n" +" feel more comfortable with 'is' or something else, so it's\n" +" configurable." +msgstr "Détermine quel séparateur est utilisé par la commande 'learn'. Par défaut, il s'agit de 'est' : 'learn as . Les utilisateurs sont susceptibles de trouver 'is' plus confortable, ou n'importe quoi, c'est configurable." + +#: config.py:56 +msgid "" +"Determines whether the bot will reply with the\n" +" single matching factoid if only one factoid matches when using the search\n" +" command." +msgstr "Détermine si le bot répondra avec une seule factoid, même si la recherche de l'utilisateur donne plusieurs résultats." + +#: config.py:60 +msgid "" +"Determines whether the bot will reply to invalid\n" +" commands by searching for a factoid; basically making the whatis\n" +" unnecessary when you want all factoids for a given key." +msgstr "Détermine si le bot répondra aux commandes invalides lors de la recherche d'une factoid ; permet simplement de rendre la commande 'whatis' inutile lorsque vous voulez toutes les factoids d'un clef donnée." + +#: config.py:64 +msgid "$key could be $value." +msgstr "$key semble être $value." + +#: config.py:64 +msgid "" +"Determines the format of\n" +" the response given when a factoid's value is requested. All the standard\n" +" substitutes apply, in addition to \"$key\" for the factoid's key and \"$value\"\n" +" for the factoid's value." +msgstr "Détermine le format de la réponse donnée lorsqu'une valeur de factoid est demandée. Tous les substitus standards s'appliquent, en plus de \"$key\" pour la clef de la factoid et \"$value\" pour la valeur de la factoid." + +#: plugin.py:153 +msgid "" +"[] %s \n" +"\n" +" Associates with . is only\n" +" necessary if the message isn't sent on the channel\n" +" itself. The word '%s' is necessary to separate the\n" +" key from the value. It can be changed to another word\n" +" via the learnSeparator registry value.\n" +" " +msgstr "" +"[] %s \n" +"\n" +"Associer la avec la . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même. Le mot '%s' est nécessaire pour séparer la clef de la valeur. Il peut être modifié avec la valeur de registre learnSeparator." + +#: plugin.py:179 +msgid "That's not a valid number for that key." +msgstr "Ce n'est pas un nombre valide pour cette clef." + +#: plugin.py:199 +#: plugin.py:345 +msgid "No factoid matches that key." +msgstr "Aucune factoid ne correspond à cette clef." + +#: plugin.py:211 +msgid "" +"[] []\n" +"\n" +" Looks up the value of in the factoid database. If given a\n" +" number, will return only that exact factoid. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Regarde la valeur de la dans la base de données de factoids. Si un est donné, retourne la factoid exacte. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:222 +#: plugin.py:273 +#: plugin.py:384 +msgid "key id" +msgstr "id de clef" + +#: plugin.py:230 +msgid "" +"[] \n" +"\n" +" Locks the factoid(s) associated with so that they cannot be\n" +" removed or added to. is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Verrouille la/les factoid(s) associé(e) à la , pour qu'elles ne puissent plus être supprimées ou modifiées. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:245 +msgid "" +"[] \n" +"\n" +" Unlocks the factoid(s) associated with so that they can be\n" +" removed or added to. is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Verrouille la/les factoid(s) associé(e) à la , pour qu'elles puissent être supprimées ou modifiées. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:260 +msgid "" +"[] [|*]\n" +"\n" +" Removes the factoid from the factoids database. If there are\n" +" more than one factoid with such a key, a number is necessary to\n" +" determine which one should be removed. A * can be used to remove all\n" +" factoids associated with a key. is only necessary if\n" +" the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [|*]\n" +"\n" +"Enlève la factoid de la base de données. Si il y a plus d'une factoid avec cette clef, un est requis pour déterminer laquelle sera supprimée. Un joker * peut être utilisé pour enlever toutes les factoids avec cette clef. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:285 +msgid "There is no such factoid." +msgstr "Cette factoid n'existe pas." + +#: plugin.py:298 +msgid "Invalid factoid number." +msgstr "Numéro de factoid invalide." + +#: plugin.py:304 +msgid "%s factoids have that key. Please specify which one to remove, or use * to designate all of them." +msgstr "%s factoids ont cette clef. Veuillez spécifier laquelle vous voulez supprimer ou utiliser * pour toutes les désigner." + +#: plugin.py:312 +msgid "" +"[]\n" +"\n" +" Returns a random factoid from the database for . \n" +" is only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne une factoid aléatoire de la base de données pour le canal. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:330 +msgid "I couldn't find a factoid." +msgstr "Je ne peux trouver une factoid" + +#: plugin.py:335 +msgid "" +"[] \n" +"\n" +" Gives information about the factoid(s) associated with .\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Donne des informations sur la/les factoid(s) associée(s) à la . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:358 +msgid "#%i was added by %s at %s" +msgstr "#%i a été ajouté par %s le %s" + +#: plugin.py:369 +msgid "" +"[] \n" +"\n" +" Changes the factoid # associated with according to\n" +" .\n" +" " +msgstr "" +"[] \n" +"\n" +"Change la factoid associée à la , en accord avec l'. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:381 +msgid "I couldn't find any key %q" +msgstr "Je ne peux trouver de clef %q" + +#: plugin.py:396 +msgid "" +"[] [--values] [--{regexp} ] [ ...]\n" +"\n" +" Searches the keyspace for keys matching . If --regexp is given,\n" +" it associated value is taken as a regexp and matched against the keys.\n" +" If --values is given, search the value space instead of the keyspace.\n" +" " +msgstr "" +"[] [--values] [--{regexp} ] [...]\n" +"\n" +"Recherche les clefs correspondant au . Si --regexp est donné, recherche les clefs correspondantes à l'. Si --values est donné, recherche parmi les valeurs, plutôt que parmi les clefs. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:431 +msgid "No keys matched that query." +msgstr "Aucune clef ne correspond à cette requête." + +#: plugin.py:436 +msgid "More than 100 keys matched that query; please narrow your query." +msgstr "Plus de 100 clefs correspondent à votre requête ; veuillez la préciser." + diff --git a/plugins/Factoids/messages.pot b/plugins/Factoids/messages.pot new file mode 100644 index 000000000..5bcd6f497 --- /dev/null +++ b/plugins/Factoids/messages.pot @@ -0,0 +1,202 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-11-11 12:37+CET\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:45 +#, docstring +msgid "" +"Value must include $value, otherwise the factoid's value would be left\n" +" out." +msgstr "" + +#: config.py:51 +msgid "" +"Determines what separator must be used in the\n" +" learn command. Defaults to 'as' -- learn as . Users might\n" +" feel more comfortable with 'is' or something else, so it's\n" +" configurable." +msgstr "" + +#: config.py:56 +msgid "" +"Determines whether the bot will reply with the\n" +" single matching factoid if only one factoid matches when using the search\n" +" command." +msgstr "" + +#: config.py:60 +msgid "" +"Determines whether the bot will reply to invalid\n" +" commands by searching for a factoid; basically making the whatis\n" +" unnecessary when you want all factoids for a given key." +msgstr "" + +#: config.py:64 +msgid "$key could be $value." +msgstr "" + +#: config.py:64 +msgid "" +"Determines the format of\n" +" the response given when a factoid's value is requested. All the standard\n" +" substitutes apply, in addition to \"$key\" for the factoid's key and \"$value\"\n" +" for the factoid's value." +msgstr "" + +#: plugin.py:153 +msgid "" +"[] %s \n" +"\n" +" Associates with . is only\n" +" necessary if the message isn't sent on the channel\n" +" itself. The word '%s' is necessary to separate the\n" +" key from the value. It can be changed to another word\n" +" via the learnSeparator registry value.\n" +" " +msgstr "" + +#: plugin.py:179 +msgid "That's not a valid number for that key." +msgstr "" + +#: plugin.py:199 plugin.py:345 +msgid "No factoid matches that key." +msgstr "" + +#: plugin.py:211 +#, docstring +msgid "" +"[] []\n" +"\n" +" Looks up the value of in the factoid database. If given a\n" +" number, will return only that exact factoid. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:222 plugin.py:273 plugin.py:384 +msgid "key id" +msgstr "" + +#: plugin.py:230 +#, docstring +msgid "" +"[] \n" +"\n" +" Locks the factoid(s) associated with so that they cannot be\n" +" removed or added to. is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:245 +#, docstring +msgid "" +"[] \n" +"\n" +" Unlocks the factoid(s) associated with so that they can be\n" +" removed or added to. is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:260 +#, docstring +msgid "" +"[] [|*]\n" +"\n" +" Removes the factoid from the factoids database. If there are\n" +" more than one factoid with such a key, a number is necessary to\n" +" determine which one should be removed. A * can be used to remove all\n" +" factoids associated with a key. is only necessary if\n" +" the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:285 +msgid "There is no such factoid." +msgstr "" + +#: plugin.py:298 +msgid "Invalid factoid number." +msgstr "" + +#: plugin.py:304 +msgid "%s factoids have that key. Please specify which one to remove, or use * to designate all of them." +msgstr "" + +#: plugin.py:312 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns a random factoid from the database for . \n" +" is only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:330 +msgid "I couldn't find a factoid." +msgstr "" + +#: plugin.py:335 +#, docstring +msgid "" +"[] \n" +"\n" +" Gives information about the factoid(s) associated with .\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:358 +msgid "#%i was added by %s at %s" +msgstr "" + +#: plugin.py:369 +#, docstring +msgid "" +"[] \n" +"\n" +" Changes the factoid # associated with according to\n" +" .\n" +" " +msgstr "" + +#: plugin.py:381 +msgid "I couldn't find any key %q" +msgstr "" + +#: plugin.py:396 +#, docstring +msgid "" +"[] [--values] [--{regexp} ] [ ...]\n" +"\n" +" Searches the keyspace for keys matching . If --regexp is given,\n" +" it associated value is taken as a regexp and matched against the keys.\n" +" If --values is given, search the value space instead of the keyspace.\n" +" " +msgstr "" + +#: plugin.py:431 +msgid "No keys matched that query." +msgstr "" + +#: plugin.py:436 +msgid "More than 100 keys matched that query; please narrow your query." +msgstr "" + diff --git a/plugins/Factoids/plugin.py b/plugins/Factoids/plugin.py index c375d16c8..7a2d8c21f 100644 --- a/plugins/Factoids/plugin.py +++ b/plugins/Factoids/plugin.py @@ -39,6 +39,8 @@ from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Factoids') try: import sqlite @@ -148,14 +150,14 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): else: irc.error('That factoid is locked.') learn = wrap(learn, ['factoid']) - learn._fake__doc__ = """[] %s + learn._fake__doc__ = _("""[] %s Associates with . is only necessary if the message isn't sent on the channel itself. The word '%s' is necessary to separate the key from the value. It can be changed to another word via the learnSeparator registry value. - """ + """) def _lookupFactoid(self, channel, key): @@ -174,7 +176,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): try: irc.reply(factoids[number-1]) except IndexError: - irc.error('That\'s not a valid number for that key.') + irc.error(_('That\'s not a valid number for that key.')) return else: env = {'key': key} @@ -194,7 +196,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): irc.replies(factoidsS, prefixer=prefixer, joiner=', or ', onlyPrefixFirst=True) elif error: - irc.error('No factoid matches that key.') + irc.error(_('No factoid matches that key.')) def invalidCommand(self, irc, msg, tokens): if irc.isChannel(msg.args[0]): @@ -204,6 +206,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): factoids = self._lookupFactoid(channel, key) self._replyFactoids(irc, msg, key, factoids, error=False) + @internationalizeDocstring def whatis(self, irc, msg, args, channel, words): """[] [] @@ -216,12 +219,13 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): if words[-1].isdigit(): number = int(words.pop()) if number <= 0: - irc.errorInvalid('key id') + irc.errorInvalid(_('key id')) key = ' '.join(words) factoids = self._lookupFactoid(channel, key) self._replyFactoids(irc, msg, key, factoids, number) whatis = wrap(whatis, ['channel', many('something')]) + @internationalizeDocstring def lock(self, irc, msg, args, channel, key): """[] @@ -236,6 +240,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): irc.replySuccess() lock = wrap(lock, ['channel', 'text']) + @internationalizeDocstring def unlock(self, irc, msg, args, channel, key): """[] @@ -250,6 +255,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): irc.replySuccess() unlock = wrap(unlock, ['channel', 'text']) + @internationalizeDocstring def forget(self, irc, msg, args, channel, words): """[] [|*] @@ -264,7 +270,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): if words[-1].isdigit(): number = int(words.pop()) if number <= 0: - irc.errorInvalid('key id') + irc.errorInvalid(_('key id')) elif words[-1] == '*': words.pop() number = True @@ -276,9 +282,9 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): WHERE key LIKE %s AND factoids.key_id=keys.id""", key) if cursor.rowcount == 0: - irc.error('There is no such factoid.') + irc.error(_('There is no such factoid.')) elif cursor.rowcount == 1 or number is True: - (id, _) = cursor.fetchone() + (id, foo) = cursor.fetchone() cursor.execute("""DELETE FROM factoids WHERE key_id=%s""", id) cursor.execute("""DELETE FROM keys WHERE key LIKE %s""", key) db.commit() @@ -287,20 +293,21 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): if number is not None: results = cursor.fetchall() try: - (_, id) = results[number-1] + (foo, id) = results[number-1] except IndexError: - irc.error('Invalid factoid number.') + irc.error(_('Invalid factoid number.')) return cursor.execute("DELETE FROM factoids WHERE id=%s", id) db.commit() irc.replySuccess() else: - irc.error('%s factoids have that key. ' + irc.error(_('%s factoids have that key. ' 'Please specify which one to remove, ' - 'or use * to designate all of them.' % + 'or use * to designate all of them.') % cursor.rowcount) forget = wrap(forget, ['channel', many('something')]) + @internationalizeDocstring def random(self, irc, msg, args, channel): """[] @@ -320,9 +327,10 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): L.append('"%s": %s' % (ircutils.bold(key), factoid)) irc.reply('; '.join(L)) else: - irc.error('I couldn\'t find a factoid.') + irc.error(_('I couldn\'t find a factoid.')) random = wrap(random, ['channel']) + @internationalizeDocstring def info(self, irc, msg, args, channel, key): """[] @@ -334,7 +342,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): cursor = db.cursor() cursor.execute("SELECT id, locked FROM keys WHERE key LIKE %s", key) if cursor.rowcount == 0: - irc.error('No factoid matches that key.') + irc.error(_('No factoid matches that key.')) return (id, locked) = map(int, cursor.fetchone()) cursor.execute("""SELECT added_by, added_at FROM factoids @@ -347,7 +355,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): counter += 1 added_at = time.strftime(conf.supybot.reply.format.time(), time.localtime(int(added_at))) - L.append(format('#%i was added by %s at %s', + L.append(format(_('#%i was added by %s at %s'), counter, added_by, added_at)) factoids = '; '.join(L) s = format('Key %q is %s and has %n associated with it: %s', @@ -356,6 +364,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): irc.reply(s) info = wrap(info, ['channel', 'text']) + @internationalizeDocstring def change(self, irc, msg, args, channel, key, number, replacer): """[] @@ -369,10 +378,10 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): WHERE keys.key LIKE %s AND keys.id=factoids.key_id""", key) if cursor.rowcount == 0: - irc.error(format('I couldn\'t find any key %q', key)) + irc.error(format(_('I couldn\'t find any key %q'), key)) return elif cursor.rowcount < number: - irc.errorInvalid('key id') + irc.errorInvalid(_('key id')) (id, fact) = cursor.fetchall()[number-1] newfact = replacer(fact) cursor.execute("UPDATE factoids SET fact=%s WHERE id=%s", newfact, id) @@ -382,6 +391,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): 'factoidId', 'regexpReplacer']) _sqlTrans = string.maketrans('*?', '%_') + @internationalizeDocstring def search(self, irc, msg, args, channel, optlist, globs): """[] [--values] [--{regexp} ] [ ...] @@ -418,13 +428,13 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): sql = sql.replace('TARGET', target) cursor.execute(sql, formats) if cursor.rowcount == 0: - irc.reply('No keys matched that query.') + irc.reply(_('No keys matched that query.')) elif cursor.rowcount == 1 and \ self.registryValue('showFactoidIfOnlyOneMatch', channel): self.whatis(irc, msg, [channel, cursor.fetchone()[0]]) elif cursor.rowcount > 100: - irc.reply('More than 100 keys matched that query; ' - 'please narrow your query.') + irc.reply(_('More than 100 keys matched that query; ' + 'please narrow your query.')) else: keys = [repr(t[0]) for t in cursor.fetchall()] s = format('%L', keys) diff --git a/plugins/Filter/config.py b/plugins/Filter/config.py index dee646c16..cd45fa9cb 100644 --- a/plugins/Filter/config.py +++ b/plugins/Filter/config.py @@ -29,22 +29,24 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Filter') Filter = conf.registerPlugin('Filter') conf.registerGroup(Filter, 'spellit') conf.registerGlobalValue(Filter.spellit, - 'replaceLetters', registry.Boolean(True, """Determines whether or not to - replace letters in the output of spellit.""")) + 'replaceLetters', registry.Boolean(True, _("""Determines whether or not to + replace letters in the output of spellit."""))) conf.registerGlobalValue(Filter.spellit, - 'replacePunctuation', registry.Boolean(True, """Determines whether or not - to replace punctuation in the output of spellit.""")) + 'replacePunctuation', registry.Boolean(True, _("""Determines whether or not + to replace punctuation in the output of spellit."""))) conf.registerGlobalValue(Filter.spellit, - 'replaceNumbers', registry.Boolean(True, """Determines whether or not to - replace numbers in the output of spellit.""")) + 'replaceNumbers', registry.Boolean(True, _("""Determines whether or not to + replace numbers in the output of spellit."""))) conf.registerGroup(Filter, 'shrink') conf.registerChannelValue(Filter.shrink, 'minimum', - registry.PositiveInteger(4, """Determines the minimum number of a letters - in a word before it will be shrunken by the shrink command/filter.""")) + registry.PositiveInteger(4, _("""Determines the minimum number of a letters + in a word before it will be shrunken by the shrink command/filter."""))) def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Filter/locale/fr.po b/plugins/Filter/locale/fr.po new file mode 100644 index 000000000..e32003aa9 --- /dev/null +++ b/plugins/Filter/locale/fr.po @@ -0,0 +1,615 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 11:48+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:38 +msgid "" +"Determines whether or not to\n" +" replace letters in the output of spellit." +msgstr "Détermine si il faut ou non remplacer les lettres dans la sortie de spellit." + +#: config.py:41 +msgid "" +"Determines whether or not\n" +" to replace punctuation in the output of spellit." +msgstr "Détermine si il faut replacer la ponctuation dans la sortie de spellit." + +#: config.py:44 +msgid "" +"Determines whether or not to\n" +" replace numbers in the output of spellit." +msgstr "Détermine si on doit remplacer les nombres dans la sortie de spellit." + +#: config.py:48 +msgid "" +"Determines the minimum number of a letters\n" +" in a word before it will be shrunken by the shrink command/filter." +msgstr "Détermine le nombre minimum de lettre dans un mot pour qu'il soit coupé par la commande/le filtre shrink." + +#: plugin.py:51 +msgid "" +"This plugin offers several commands which transform text in some way.\n" +" It also provides the capability of using such commands to 'filter' the\n" +" output of the bot -- for instance, you could make everything the bot says\n" +" be in leetspeak, or Morse code, or any number of other kinds of filters.\n" +" Not very useful, but definitely quite fun :)" +msgstr "Ce plugin offre quelques commandes qui peuvent être utilisées pour transformer du texte de différentes façons. Il fourni également la possiblité d'utiliser ces commandes pour 'filtrer' la sortie du bot ; par exemple, vous pouvez faire en sorte que tout ce que le bot dit le soit en l33tsp34k, en Morse, ou n'importe lequel des autres filtres. Pas très utile, mais plutôt fun :)" + +#: plugin.py:85 +msgid "" +"[] []\n" +"\n" +" Sets the outFilter of this plugin to be . If no command is\n" +" given, unsets the outFilter. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Définit le filtre de sortie de ce plugin pour être . Si aucune commande n'est définie, supprime le filtre de sortie. n'est nécessaire que si la commande n'est pas envoyée sur le canal lui-même." + +#: plugin.py:98 +msgid "That's not a valid filter command." +msgstr "Ce n'est pas une commande de filtre valide" + +#: plugin.py:108 +msgid "" +"\n" +"\n" +" Removes all the vowels from . (If you're curious why this is\n" +" named 'hebrew' it's because I (jemfinch) thought of it in Hebrew class,\n" +" and printed Hebrew often elides the vowels.)\n" +" " +msgstr "" +"\n" +"\n" +"Retire toutes les voyelles du (si vous êtes curieux de pourquoi elle s'appelle 'hebrew', c'est parce que je (jemfinch) pense que que en Hébreux, il manque souvent les voyelles)." + +#: plugin.py:120 +msgid "" +"\n" +"\n" +" Removes all the spaces from .\n" +" " +msgstr "" +"\n" +"\n" +"Supprime tous les espaces du ." + +#: plugin.py:130 +msgid "" +"\n" +"\n" +" Returns , with all consecutive duplicated letters removed.\n" +" " +msgstr "" +"\n" +"\n" +"Renvoie le texte, avec toutes les lettres consécutives dupliquées supprimées." + +#: plugin.py:143 +msgid "" +"\n" +"\n" +" Returns the binary representation of .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne la représentation binaire du ." + +#: plugin.py:169 +msgid "" +"\n" +"\n" +" Returns a hexstring from the given string; a hexstring is a string\n" +" composed of the hexadecimal value of each character in the string\n" +" " +msgstr "" +"\n" +"\n" +"Retourne une chaîne héxadécimale à partir de la chaîne donnée ; une chaîne héxadécimale est une chaîne composée de la valeur héxadécimale de chaque caractère de la chaîne." + +#: plugin.py:179 +msgid "" +"\n" +"\n" +" Returns the string corresponding to . Obviously,\n" +" must be a string of hexadecimal digits.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne la chaîne correspondant à la . Bien sûr, ne doit contenir que des caractères hexadécimaux." + +#: plugin.py:187 +msgid "Invalid input." +msgstr "Entrée invalide." + +#: plugin.py:192 +msgid "" +"\n" +"\n" +" Rotates 13 characters to the right in the alphabet. Rot13 is\n" +" commonly used for text that simply needs to be hidden from inadvertent\n" +" reading by roaming eyes, since it's easily reversible.\n" +" " +msgstr "" +"\n" +"\n" +"Déplace chaque caractère du de 13 places vers la droite de l'alphabet. Rot13 est courremment utilisé pour les textes qui doivent être cachés des yeux indiscrets, mais être facilement reversible." + +#: plugin.py:203 +msgid "" +"\n" +"\n" +" Returns the lisping version of \n" +" " +msgstr "" +"\n" +"\n" +"Retourne la version zézéyée du texte." + +#: plugin.py:234 +msgid "" +"\n" +"\n" +" Returns the l33tspeak version of \n" +" " +msgstr "" +"\n" +"\n" +"Retourne la version l33t du ." + +#: plugin.py:254 +msgid "" +"\n" +"\n" +" Replies with an especially k-rad translation of .\n" +" " +msgstr "" +"\n" +"\n" +"Répond avec une traduction k-rad du ." + +#: plugin.py:270 +msgid "" +"\n" +"\n" +" Replies with a string where each word is scrambled; i.e., each internal\n" +" letter (that is, all letters but the first and last) are shuffled.\n" +" " +msgstr "" +"\n" +"\n" +"Répond avec une chaîne où chaque mot est mélangé ; c'est à dire que chaque lettre interne (=toute lettre qui n'est pas la première ni la dernière) est mélangée avec les autres." + +#: plugin.py:335 +msgid "" +"\n" +"\n" +" Does the reverse of the morse command.\n" +" " +msgstr "" +"\n" +"\n" +"Fait l'inverse de la commande morse." + +#: plugin.py:352 +msgid "" +"\n" +"\n" +" Gives the Morse code equivalent of a given string.\n" +" " +msgstr "" +"\n" +"\n" +"Donne le code Morse équivalent à la chaîne donnée." + +#: plugin.py:364 +msgid "" +"\n" +"\n" +" Reverses .\n" +" " +msgstr "" +"\n" +"\n" +"Inverse le ." + +#: plugin.py:381 +msgid "" +"\n" +"\n" +" Returns with each character randomly colorized.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le avec chaque caractère coloré de façon aléatoire." + +#: plugin.py:391 +msgid "" +"\n" +"\n" +" Returns colorized like a rainbow.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte colorisé comme un arc-en-ciel." + +#: plugin.py:402 +msgid "" +"\n" +"\n" +" Returns stripped of all color codes.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte en retirant tous les codes de couleur" + +#: plugin.py:411 +msgid "" +"\n" +"\n" +" Returns as if an AOLuser had said it.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le comme si un AOLuser l'avait dit." + +#: plugin.py:438 +msgid "" +"\n" +"\n" +" Returns as if JeffK had said it himself.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le comme si JeffK l'avait dit lui-même." + +#: plugin.py:534 +msgid "ay" +msgstr "ah" + +#: plugin.py:534 +msgid "bee" +msgstr "bé" + +#: plugin.py:534 +msgid "dee" +msgstr "dé" + +#: plugin.py:534 +msgid "see" +msgstr "cé" + +#: plugin.py:535 +msgid "aych" +msgstr "ache" + +#: plugin.py:535 +msgid "ee" +msgstr "euh" + +#: plugin.py:535 +msgid "eff" +msgstr "èf" + +#: plugin.py:535 +msgid "gee" +msgstr "gé" + +#: plugin.py:536 +msgid "ell" +msgstr "èl" + +#: plugin.py:536 +msgid "eye" +msgstr "ih" + +#: plugin.py:536 +msgid "jay" +msgstr "ji" + +#: plugin.py:536 +msgid "kay" +msgstr "ka" + +#: plugin.py:537 +msgid "cue" +msgstr "cu" + +#: plugin.py:537 +msgid "em" +msgstr "èm" + +#: plugin.py:537 +msgid "en" +msgstr "èn" + +#: plugin.py:537 +msgid "oh" +msgstr "oh" + +#: plugin.py:537 +msgid "pee" +msgstr "pé" + +#: plugin.py:538 +msgid "arr" +msgstr "ère" + +#: plugin.py:538 +msgid "ess" +msgstr "èce" + +#: plugin.py:538 +msgid "tee" +msgstr "té" + +#: plugin.py:538 +msgid "you" +msgstr "uh" + +#: plugin.py:539 +msgid "double-you" +msgstr "double-vé" + +#: plugin.py:539 +msgid "ecks" +msgstr "icks" + +#: plugin.py:539 +msgid "vee" +msgstr "vé" + +#: plugin.py:539 +msgid "why" +msgstr "i-grec" + +#: plugin.py:540 +msgid "zee" +msgstr "zèd" + +#: plugin.py:545 +msgid "exclamation point" +msgstr "point d'exclamation" + +#: plugin.py:546 +msgid "quote" +msgstr "guillemet double" + +#: plugin.py:547 +msgid "pound" +msgstr "livre" + +#: plugin.py:548 +msgid "dollar sign" +msgstr "signe du dollar" + +#: plugin.py:549 +msgid "percent" +msgstr "pourcent" + +#: plugin.py:550 +msgid "ampersand" +msgstr "espèrluette" + +#: plugin.py:551 +msgid "single quote" +msgstr "guillemet" + +#: plugin.py:552 +msgid "left paren" +msgstr "parenthèse ouvrante" + +#: plugin.py:553 +msgid "right paren" +msgstr "parenthèse fermante" + +#: plugin.py:554 +msgid "asterisk" +msgstr "asterisque" + +#: plugin.py:555 +msgid "plus" +msgstr "plus" + +#: plugin.py:556 +msgid "comma" +msgstr "virgule" + +#: plugin.py:557 +msgid "minus" +msgstr "moins" + +#: plugin.py:558 +msgid "period" +msgstr "point" + +#: plugin.py:559 +msgid "slash" +msgstr "slash" + +#: plugin.py:560 +msgid "colon" +msgstr "double-point" + +#: plugin.py:561 +msgid "semicolon" +msgstr "point-virgule" + +#: plugin.py:562 +msgid "less than" +msgstr "inférieur" + +#: plugin.py:563 +msgid "equals" +msgstr "moins que" + +#: plugin.py:564 +msgid "greater than" +msgstr "supérieur" + +#: plugin.py:565 +msgid "question mark" +msgstr "point d'exclamation" + +#: plugin.py:566 +msgid "at" +msgstr "arobase" + +#: plugin.py:567 +msgid "left bracket" +msgstr "crochet ouvrant" + +#: plugin.py:568 +msgid "backslash" +msgstr "anti-slash" + +#: plugin.py:569 +msgid "right bracket" +msgstr "crochet fermant" + +#: plugin.py:570 +msgid "caret" +msgstr "accent circonflexe" + +#: plugin.py:571 +msgid "underscore" +msgstr "underscore" + +#: plugin.py:572 +msgid "backtick" +msgstr "accent grave" + +#: plugin.py:573 +msgid "left brace" +msgstr "crochet ouvrant" + +#: plugin.py:574 +msgid "pipe" +msgstr "pipe" + +#: plugin.py:575 +msgid "right brace" +msgstr "crochet fermant" + +#: plugin.py:576 +msgid "tilde" +msgstr "tilde" + +#: plugin.py:579 +msgid "one" +msgstr "un" + +#: plugin.py:579 +msgid "three" +msgstr "trois" + +#: plugin.py:579 +msgid "two" +msgstr "deux" + +#: plugin.py:579 +msgid "zero" +msgstr "zéro" + +#: plugin.py:580 +msgid "five" +msgstr "cinq" + +#: plugin.py:580 +msgid "four" +msgstr "quatre" + +#: plugin.py:580 +msgid "seven" +msgstr "sept" + +#: plugin.py:580 +msgid "six" +msgstr "six" + +#: plugin.py:581 +msgid "eight" +msgstr "huit" + +#: plugin.py:581 +msgid "nine" +msgstr "neuf" + +#: plugin.py:585 +msgid "" +"\n" +"\n" +" Returns , phonetically spelled out.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le , épellé phonétiquement" + +#: plugin.py:615 +msgid "" +"\n" +"\n" +" Returns as GNU/RMS would say it.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le comme si GNU/RMS l'avait dite." + +#: plugin.py:624 +msgid "" +"\n" +"\n" +" Returns with each word longer than\n" +" supybot.plugins.Filter.shrink.minimum being shrunken (i.e., like\n" +" \"internationalization\" becomes \"i18n\").\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte avec chaque mot plus long que supybot.plugins.Filter.shrink.minimum découpé (par exemple, \"internationalization\" devient i18n)" + +#: plugin.py:643 +msgid "" +"\n" +"\n" +" Returns with the l's made into r's and r's made into l's.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le avec les I transormés en r et les r transformés en I." + +#: plugin.py:692 +msgid "" +"\n" +"\n" +" Returns rotated 180 degrees. Only really works for ASCII\n" +" printable characters.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le tourné à 180 degrés. Ne marche pour de bon qu'avec des caractères ASCII imprimables" + diff --git a/plugins/Filter/messages.pot b/plugins/Filter/messages.pot new file mode 100644 index 000000000..ffde04b05 --- /dev/null +++ b/plugins/Filter/messages.pot @@ -0,0 +1,568 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 11:48+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:38 +msgid "" +"Determines whether or not to\n" +" replace letters in the output of spellit." +msgstr "" + +#: config.py:41 +msgid "" +"Determines whether or not\n" +" to replace punctuation in the output of spellit." +msgstr "" + +#: config.py:44 +msgid "" +"Determines whether or not to\n" +" replace numbers in the output of spellit." +msgstr "" + +#: config.py:48 +msgid "" +"Determines the minimum number of a letters\n" +" in a word before it will be shrunken by the shrink command/filter." +msgstr "" + +#: plugin.py:51 +#, docstring +msgid "" +"This plugin offers several commands which transform text in some way.\n" +" It also provides the capability of using such commands to 'filter' the\n" +" output of the bot -- for instance, you could make everything the bot says\n" +" be in leetspeak, or Morse code, or any number of other kinds of filters.\n" +" Not very useful, but definitely quite fun :)" +msgstr "" + +#: plugin.py:85 +#, docstring +msgid "" +"[] []\n" +"\n" +" Sets the outFilter of this plugin to be . If no command is\n" +" given, unsets the outFilter. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:98 +msgid "That's not a valid filter command." +msgstr "" + +#: plugin.py:108 +#, docstring +msgid "" +"\n" +"\n" +" Removes all the vowels from . (If you're curious why this is\n" +" named 'hebrew' it's because I (jemfinch) thought of it in Hebrew class,\n" +" and printed Hebrew often elides the vowels.)\n" +" " +msgstr "" + +#: plugin.py:120 +#, docstring +msgid "" +"\n" +"\n" +" Removes all the spaces from .\n" +" " +msgstr "" + +#: plugin.py:130 +#, docstring +msgid "" +"\n" +"\n" +" Returns , with all consecutive duplicated letters removed.\n" +" " +msgstr "" + +#: plugin.py:143 +#, docstring +msgid "" +"\n" +"\n" +" Returns the binary representation of .\n" +" " +msgstr "" + +#: plugin.py:169 +#, docstring +msgid "" +"\n" +"\n" +" Returns a hexstring from the given string; a hexstring is a string\n" +" composed of the hexadecimal value of each character in the string\n" +" " +msgstr "" + +#: plugin.py:179 +#, docstring +msgid "" +"\n" +"\n" +" Returns the string corresponding to . Obviously,\n" +" must be a string of hexadecimal digits.\n" +" " +msgstr "" + +#: plugin.py:187 +msgid "Invalid input." +msgstr "" + +#: plugin.py:192 +#, docstring +msgid "" +"\n" +"\n" +" Rotates 13 characters to the right in the alphabet. Rot13 is\n" +" commonly used for text that simply needs to be hidden from inadvertent\n" +" reading by roaming eyes, since it's easily reversible.\n" +" " +msgstr "" + +#: plugin.py:203 +#, docstring +msgid "" +"\n" +"\n" +" Returns the lisping version of \n" +" " +msgstr "" + +#: plugin.py:234 +#, docstring +msgid "" +"\n" +"\n" +" Returns the l33tspeak version of \n" +" " +msgstr "" + +#: plugin.py:254 +#, docstring +msgid "" +"\n" +"\n" +" Replies with an especially k-rad translation of .\n" +" " +msgstr "" + +#: plugin.py:270 +#, docstring +msgid "" +"\n" +"\n" +" Replies with a string where each word is scrambled; i.e., each internal\n" +" letter (that is, all letters but the first and last) are shuffled.\n" +" " +msgstr "" + +#: plugin.py:335 +#, docstring +msgid "" +"\n" +"\n" +" Does the reverse of the morse command.\n" +" " +msgstr "" + +#: plugin.py:352 +#, docstring +msgid "" +"\n" +"\n" +" Gives the Morse code equivalent of a given string.\n" +" " +msgstr "" + +#: plugin.py:364 +#, docstring +msgid "" +"\n" +"\n" +" Reverses .\n" +" " +msgstr "" + +#: plugin.py:381 +#, docstring +msgid "" +"\n" +"\n" +" Returns with each character randomly colorized.\n" +" " +msgstr "" + +#: plugin.py:391 +#, docstring +msgid "" +"\n" +"\n" +" Returns colorized like a rainbow.\n" +" " +msgstr "" + +#: plugin.py:402 +#, docstring +msgid "" +"\n" +"\n" +" Returns stripped of all color codes.\n" +" " +msgstr "" + +#: plugin.py:411 +#, docstring +msgid "" +"\n" +"\n" +" Returns as if an AOLuser had said it.\n" +" " +msgstr "" + +#: plugin.py:438 +#, docstring +msgid "" +"\n" +"\n" +" Returns as if JeffK had said it himself.\n" +" " +msgstr "" + +#: plugin.py:534 +msgid "ay" +msgstr "" + +#: plugin.py:534 +msgid "bee" +msgstr "" + +#: plugin.py:534 +msgid "dee" +msgstr "" + +#: plugin.py:534 +msgid "see" +msgstr "" + +#: plugin.py:535 +msgid "aych" +msgstr "" + +#: plugin.py:535 +msgid "ee" +msgstr "" + +#: plugin.py:535 +msgid "eff" +msgstr "" + +#: plugin.py:535 +msgid "gee" +msgstr "" + +#: plugin.py:536 +msgid "ell" +msgstr "" + +#: plugin.py:536 +msgid "eye" +msgstr "" + +#: plugin.py:536 +msgid "jay" +msgstr "" + +#: plugin.py:536 +msgid "kay" +msgstr "" + +#: plugin.py:537 +msgid "cue" +msgstr "" + +#: plugin.py:537 +msgid "em" +msgstr "" + +#: plugin.py:537 +msgid "en" +msgstr "" + +#: plugin.py:537 +msgid "oh" +msgstr "" + +#: plugin.py:537 +msgid "pee" +msgstr "" + +#: plugin.py:538 +msgid "arr" +msgstr "" + +#: plugin.py:538 +msgid "ess" +msgstr "" + +#: plugin.py:538 +msgid "tee" +msgstr "" + +#: plugin.py:538 +msgid "you" +msgstr "" + +#: plugin.py:539 +msgid "double-you" +msgstr "" + +#: plugin.py:539 +msgid "ecks" +msgstr "" + +#: plugin.py:539 +msgid "vee" +msgstr "" + +#: plugin.py:539 +msgid "why" +msgstr "" + +#: plugin.py:540 +msgid "zee" +msgstr "" + +#: plugin.py:545 +msgid "exclamation point" +msgstr "" + +#: plugin.py:546 +msgid "quote" +msgstr "" + +#: plugin.py:547 +msgid "pound" +msgstr "" + +#: plugin.py:548 +msgid "dollar sign" +msgstr "" + +#: plugin.py:549 +msgid "percent" +msgstr "" + +#: plugin.py:550 +msgid "ampersand" +msgstr "" + +#: plugin.py:551 +msgid "single quote" +msgstr "" + +#: plugin.py:552 +msgid "left paren" +msgstr "" + +#: plugin.py:553 +msgid "right paren" +msgstr "" + +#: plugin.py:554 +msgid "asterisk" +msgstr "" + +#: plugin.py:555 +msgid "plus" +msgstr "" + +#: plugin.py:556 +msgid "comma" +msgstr "" + +#: plugin.py:557 +msgid "minus" +msgstr "" + +#: plugin.py:558 +msgid "period" +msgstr "" + +#: plugin.py:559 +msgid "slash" +msgstr "" + +#: plugin.py:560 +msgid "colon" +msgstr "" + +#: plugin.py:561 +msgid "semicolon" +msgstr "" + +#: plugin.py:562 +msgid "less than" +msgstr "" + +#: plugin.py:563 +msgid "equals" +msgstr "" + +#: plugin.py:564 +msgid "greater than" +msgstr "" + +#: plugin.py:565 +msgid "question mark" +msgstr "" + +#: plugin.py:566 +msgid "at" +msgstr "" + +#: plugin.py:567 +msgid "left bracket" +msgstr "" + +#: plugin.py:568 +msgid "backslash" +msgstr "" + +#: plugin.py:569 +msgid "right bracket" +msgstr "" + +#: plugin.py:570 +msgid "caret" +msgstr "" + +#: plugin.py:571 +msgid "underscore" +msgstr "" + +#: plugin.py:572 +msgid "backtick" +msgstr "" + +#: plugin.py:573 +msgid "left brace" +msgstr "" + +#: plugin.py:574 +msgid "pipe" +msgstr "" + +#: plugin.py:575 +msgid "right brace" +msgstr "" + +#: plugin.py:576 +msgid "tilde" +msgstr "" + +#: plugin.py:579 +msgid "one" +msgstr "" + +#: plugin.py:579 +msgid "three" +msgstr "" + +#: plugin.py:579 +msgid "two" +msgstr "" + +#: plugin.py:579 +msgid "zero" +msgstr "" + +#: plugin.py:580 +msgid "five" +msgstr "" + +#: plugin.py:580 +msgid "four" +msgstr "" + +#: plugin.py:580 +msgid "seven" +msgstr "" + +#: plugin.py:580 +msgid "six" +msgstr "" + +#: plugin.py:581 +msgid "eight" +msgstr "" + +#: plugin.py:581 +msgid "nine" +msgstr "" + +#: plugin.py:585 +#, docstring +msgid "" +"\n" +"\n" +" Returns , phonetically spelled out.\n" +" " +msgstr "" + +#: plugin.py:615 +#, docstring +msgid "" +"\n" +"\n" +" Returns as GNU/RMS would say it.\n" +" " +msgstr "" + +#: plugin.py:624 +#, docstring +msgid "" +"\n" +"\n" +" Returns with each word longer than\n" +" supybot.plugins.Filter.shrink.minimum being shrunken (i.e., like\n" +" \"internationalization\" becomes \"i18n\").\n" +" " +msgstr "" + +#: plugin.py:643 +#, docstring +msgid "" +"\n" +"\n" +" Returns with the l's made into r's and r's made into l's.\n" +" " +msgstr "" + +#: plugin.py:692 +#, docstring +msgid "" +"\n" +"\n" +" Returns rotated 180 degrees. Only really works for ASCII\n" +" printable characters.\n" +" " +msgstr "" + diff --git a/plugins/Filter/plugin.py b/plugins/Filter/plugin.py index 23b6277ff..0e126312c 100644 --- a/plugins/Filter/plugin.py +++ b/plugins/Filter/plugin.py @@ -39,6 +39,8 @@ from supybot.commands import * import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Filter') class MyFilterProxy(object): def reply(self, s): @@ -77,6 +79,7 @@ class Filter(callbacks.Plugin): 'scramble', 'morse', 'reverse', 'colorize', 'squish', 'supa1337', 'colorstrip', 'aol', 'rainbow', 'spellit', 'hebrew', 'undup', 'gnu', 'shrink', 'azn', 'uniud'] + @internationalizeDocstring def outfilter(self, irc, msg, args, channel, command): """[] [] @@ -91,7 +94,7 @@ class Filter(callbacks.Plugin): self.outFilters.setdefault(channel, []).append(method) irc.replySuccess() else: - irc.error('That\'s not a valid filter command.') + irc.error(_('That\'s not a valid filter command.')) else: self.outFilters[channel] = [] irc.replySuccess() @@ -99,6 +102,7 @@ class Filter(callbacks.Plugin): [('checkChannelCapability', 'op'), additional('commandName')]) + @internationalizeDocstring def hebrew(self, irc, msg, args, text): """ @@ -110,6 +114,7 @@ class Filter(callbacks.Plugin): irc.reply(text) hebrew = wrap(hebrew, ['text']) + @internationalizeDocstring def squish(self, irc, msg, args, text): """ @@ -119,6 +124,7 @@ class Filter(callbacks.Plugin): irc.reply(text) squish = wrap(squish, ['text']) + @internationalizeDocstring def undup(self, irc, msg, args, text): """ @@ -131,6 +137,7 @@ class Filter(callbacks.Plugin): irc.reply(''.join(L)) undup = wrap(undup, ['text']) + @internationalizeDocstring def binary(self, irc, msg, args, text): """ @@ -156,6 +163,7 @@ class Filter(callbacks.Plugin): irc.reply(''.join(L)) binary = wrap(binary, ['text']) + @internationalizeDocstring def hexlify(self, irc, msg, args, text): """ @@ -165,6 +173,7 @@ class Filter(callbacks.Plugin): irc.reply(text.encode('hex_codec')) hexlify = wrap(hexlify, ['text']) + @internationalizeDocstring def unhexlify(self, irc, msg, args, text): """ @@ -174,9 +183,10 @@ class Filter(callbacks.Plugin): try: irc.reply(text.decode('hex_codec')) except TypeError: - irc.error('Invalid input.') + irc.error(_('Invalid input.')) unhexlify = wrap(unhexlify, ['text']) + @internationalizeDocstring def rot13(self, irc, msg, args, text): """ @@ -187,6 +197,7 @@ class Filter(callbacks.Plugin): irc.reply(text.encode('rot13')) rot13 = wrap(rot13, ['text']) + @internationalizeDocstring def lithp(self, irc, msg, args, text): """ @@ -217,6 +228,7 @@ class Filter(callbacks.Plugin): (re.compile(r'[aA][tT]'), '@'), (re.compile(r'[sS]\b'), 'z'), (re.compile(r'x'), '><'),] + @internationalizeDocstring def leet(self, irc, msg, args, text): """ @@ -236,6 +248,7 @@ class Filter(callbacks.Plugin): ('D', '|)'), ('B', '|3'), ('I', ']['), ('Vv', '\\/'), ('wW', '\\/\\/'), ('d', 'c|'), ('b', '|>'), ('c', '<'), ('h', '|n'),] + @internationalizeDocstring def supa1337(self, irc, msg, args, text): """ @@ -251,6 +264,7 @@ class Filter(callbacks.Plugin): _scrambleRe = re.compile(r'(?:\b|(?![a-zA-Z]))([a-zA-Z])([a-zA-Z]*)' r'([a-zA-Z])(?:\b|(?![a-zA-Z]))') + @internationalizeDocstring def scramble(self, irc, msg, args, text): """ @@ -315,6 +329,7 @@ class Filter(callbacks.Plugin): } _revMorseCode = dict([(y, x) for (x, y) in _morseCode.items()]) _unmorsere = re.compile('([.-]+)') + @internationalizeDocstring def unmorse(self, irc, msg, args, text): """ @@ -331,6 +346,7 @@ class Filter(callbacks.Plugin): irc.reply(text) unmorse = wrap(unmorse, ['text']) + @internationalizeDocstring def morse(self, irc, msg, args, text): """ @@ -342,6 +358,7 @@ class Filter(callbacks.Plugin): irc.reply(' '.join(L)) morse = wrap(morse, ['text']) + @internationalizeDocstring def reverse(self, irc, msg, args, text): """ @@ -350,6 +367,7 @@ class Filter(callbacks.Plugin): irc.reply(text[::-1]) reverse = wrap(reverse, ['text']) + @internationalizeDocstring def _color(self, c, fg=None): if c == ' ': return c @@ -357,6 +375,7 @@ class Filter(callbacks.Plugin): fg = str(random.randint(2, 15)).zfill(2) return '\x03%s%s' % (fg, c) + @internationalizeDocstring def colorize(self, irc, msg, args, text): """ @@ -366,16 +385,18 @@ class Filter(callbacks.Plugin): irc.reply('%s%s' % (''.join(L), '\x03')) colorize = wrap(colorize, ['text']) + @internationalizeDocstring def rainbow(self, irc, msg, args, text): """ Returns colorized like a rainbow. """ - colors = utils.iter.cycle([4, 7, 8, 3, 2, 12, 6]) + colors = utils.iter.cycle(['04', '07', '08', '03', '02', '12', '06']) L = [self._color(c, fg=colors.next()) for c in text] irc.reply(''.join(L) + '\x03') rainbow = wrap(rainbow, ['text']) + @internationalizeDocstring def stripcolor(self, irc, msg, args, text): """ @@ -384,6 +405,7 @@ class Filter(callbacks.Plugin): irc.reply(ircutils.stripColor(text)) stripcolor = wrap(stripcolor, ['text']) + @internationalizeDocstring def aol(self, irc, msg, args, text): """ @@ -410,6 +432,7 @@ class Filter(callbacks.Plugin): irc.reply(text) aol = wrap(aol, ['text']) + @internationalizeDocstring def jeffk(self, irc, msg, args, text): """ @@ -507,52 +530,56 @@ class Filter(callbacks.Plugin): # Keeping these separate so people can just replace the alphabets for # whatever their language of choice _spellLetters = { - 'a': 'ay', 'b': 'bee', 'c': 'see', 'd': 'dee', 'e': 'ee', 'f': 'eff', - 'g': 'gee', 'h': 'aych', 'i': 'eye', 'j': 'jay', 'k': 'kay', 'l': - 'ell', 'm': 'em', 'n': 'en', 'o': 'oh', 'p': 'pee', 'q': 'cue', 'r': - 'arr', 's': 'ess', 't': 'tee', 'u': 'you', 'v': 'vee', 'w': - 'double-you', 'x': 'ecks', 'y': 'why', 'z': 'zee' + 'a': _('ay'), 'b': _('bee'), 'c': _('see'), 'd': _('dee'), + 'e': _('ee'), 'f': _('eff'), 'g': _('gee'), 'h': _('aych'), + 'i': _('eye'), 'j': _('jay'), 'k': _('kay'), 'l': _('ell'), + 'm': _('em'), 'n': _('en'), 'o': _('oh'), 'p': _('pee'), 'q': _('cue'), + 'r': _('arr'), 's': _('ess'), 't': _('tee'), 'u': _('you'), + 'v': _('vee'), 'w': _('double-you'), 'x': _('ecks'), 'y': _('why'), + 'z': _('zee') } for (k, v) in _spellLetters.items(): _spellLetters[k.upper()] = v _spellPunctuation = { - '!': 'exclamation point', - '"': 'quote', - '#': 'pound', - '$': 'dollar sign', - '%': 'percent', - '&': 'ampersand', - '\'': 'single quote', - '(': 'left paren', - ')': 'right paren', - '*': 'asterisk', - '+': 'plus', - ',': 'comma', - '-': 'minus', - '.': 'period', - '/': 'slash', - ':': 'colon', - ';': 'semicolon', - '<': 'less than', - '=': 'equals', - '>': 'greater than', - '?': 'question mark', - '@': 'at', - '[': 'left bracket', - '\\': 'backslash', - ']': 'right bracket', - '^': 'caret', - '_': 'underscore', - '`': 'backtick', - '{': 'left brace', - '|': 'pipe', - '}': 'right brace', - '~': 'tilde' + '!': _('exclamation point'), + '"': _('quote'), + '#': _('pound'), + '$': _('dollar sign'), + '%': _('percent'), + '&': _('ampersand'), + '\'': _('single quote'), + '(': _('left paren'), + ')': _('right paren'), + '*': _('asterisk'), + '+': _('plus'), + ',': _('comma'), + '-': _('minus'), + '.': _('period'), + '/': _('slash'), + ':': _('colon'), + ';': _('semicolon'), + '<': _('less than'), + '=': _('equals'), + '>': _('greater than'), + '?': _('question mark'), + '@': _('at'), + '[': _('left bracket'), + '\\': _('backslash'), + ']': _('right bracket'), + '^': _('caret'), + '_': _('underscore'), + '`': _('backtick'), + '{': _('left brace'), + '|': _('pipe'), + '}': _('right brace'), + '~': _('tilde') } _spellNumbers = { - '0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', - '5': 'five', '6': 'six', '7': 'seven', '8': 'eight', '9': 'nine' + '0': _('zero'), '1': _('one'), '2': _('two'), '3': _('three'), + '4': _('four'), '5': _('five'), '6': _('six'), '7': _('seven'), + '8': _('eight'), '9': _('nine') } + @internationalizeDocstring def spellit(self, irc, msg, args, text): """ @@ -582,6 +609,7 @@ class Filter(callbacks.Plugin): irc.reply(out.getvalue()) spellit = wrap(spellit, ['text']) + @internationalizeDocstring def gnu(self, irc, msg, args, text): """ @@ -590,6 +618,7 @@ class Filter(callbacks.Plugin): irc.reply(' '.join(['GNU/' + s for s in text.split()])) gnu = wrap(gnu, ['text']) + @internationalizeDocstring def shrink(self, irc, msg, args, text): """ @@ -608,6 +637,7 @@ class Filter(callbacks.Plugin): shrink = wrap(shrink, ['text']) _azn_trans = string.maketrans('rlRL', 'lrLR') + @internationalizeDocstring def azn(self, irc, msg, args, text): """ @@ -656,6 +686,7 @@ class Filter(callbacks.Plugin): '_': u'\u203e', 'o': u'o', } + @internationalizeDocstring def uniud(self, irc, msg, args, text): """ @@ -681,6 +712,7 @@ class Filter(callbacks.Plugin): s = '%s \x02 \x02' % ''.join(map(lambda x: x.encode('utf-8'), turned)) irc.reply(s) uniud = wrap(uniud, ['text']) +Filter = internationalizeDocstring(Filter) Class = Filter diff --git a/plugins/Format/config.py b/plugins/Format/config.py index d27e3b988..5a0645d4c 100644 --- a/plugins/Format/config.py +++ b/plugins/Format/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Format') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Format/locale/fr.po b/plugins/Format/locale/fr.po new file mode 100644 index 000000000..52c4bc11b --- /dev/null +++ b/plugins/Format/locale/fr.po @@ -0,0 +1,197 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 12:46+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:43 +msgid "" +"\n" +"\n" +" Returns bolded.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte, en gras" + +#: plugin.py:52 +msgid "" +"\n" +"\n" +" Returns in reverse-video.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte, inversé" + +#: plugin.py:61 +msgid "" +"\n" +"\n" +" Returns underlined.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte, souligné" + +#: plugin.py:70 +msgid "" +" [] \n" +"\n" +" Returns with foreground color and background color\n" +" (if given)\n" +" " +msgstr "" +" [] \n" +"\n" +"Retourne le avec les couleurs de et de l' (si donné)." + +#: plugin.py:80 +msgid "" +" [ ...]\n" +"\n" +" Joins all the arguments together with .\n" +" " +msgstr "" +" [ ...]\n" +"\n" +"Joint tous les arguments en utilisant le ." + +#: plugin.py:89 +msgid "" +" \n" +"\n" +" Replaces with in\n" +" . The first and second arguments must necessarily be the same\n" +" length.\n" +" " +msgstr "" +" \n" +"\n" +"Remplacer des caractères par d'autres. Le premier et le second argument doivent obligatoirement être de la même taille." + +#: plugin.py:96 +msgid " must be the same length as ." +msgstr " doit être de la même taille que " + +#: plugin.py:103 +msgid "" +"\n" +"\n" +" Returns uppercased.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte, en majuscules" + +#: plugin.py:112 +msgid "" +"\n" +"\n" +" Returns lowercased.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte, en minuscules" + +#: plugin.py:121 +msgid "" +"\n" +"\n" +" Returns capitalized.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte, capitalisé" + +#: plugin.py:130 +msgid "" +"\n" +"\n" +" Returns titlecased.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte, mis en majuscules de titre." + +#: plugin.py:139 +msgid "" +"\n" +"\n" +" Returns the text surrounded by double quotes.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le texte, entouré de doubles guillemets." + +#: plugin.py:148 +msgid "" +" \n" +"\n" +" Concatenates two strings. Do keep in mind that this is *not* the same\n" +" thing as join \"\", since if contains spaces, they won't be\n" +" removed by concat.\n" +" " +msgstr "" +" \n" +"\n" +"Concatène les deux chaînes. Notez que ce n'est pas la même chose que de les joindre avec \"\", car, si contient des espaces, ils ne seront pas supprimés par la concaténation." + +#: plugin.py:159 +msgid "" +" \n" +"\n" +" Cuts down to by chopping off the rightmost characters in\n" +" excess of . If is a negative number, it chops that many\n" +" characters off the end of .\n" +" " +msgstr "" +" \n" +"\n" +"Coup le en morceaux de , en découpant les caractères dépassant la . Si la est un nombre négatif, il coupe en comptant à partir de la fin du texte." + +#: plugin.py:170 +msgid "" +" \n" +"\n" +" Returns the th space-separated field of . I.e., if text\n" +" is \"foo bar baz\" and is 2, \"bar\" is returned.\n" +" " +msgstr "" +" \n" +"\n" +"Retourne le -ième élément (séparé par des espaces) du . C'est à dire que si le texte est \"foo bar baz\" et que est 2, \"bar\" sera retourné." + +#: plugin.py:183 +msgid "" +" [ ...]\n" +"\n" +" Expands a Python-style format string using the remaining args. Just be\n" +" sure always to use %s, not %d or %f or whatever, because all the args\n" +" are strings.\n" +" " +msgstr "" +" [ ...]\n" +"\n" + +#: plugin.py:197 +msgid "Not enough arguments for the format string." +msgstr "Pas assez d'arguments pour formatter la chaîne." + diff --git a/plugins/Format/messages.pot b/plugins/Format/messages.pot new file mode 100644 index 000000000..960c03a14 --- /dev/null +++ b/plugins/Format/messages.pot @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 12:46+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:43 +#, docstring +msgid "" +"\n" +"\n" +" Returns bolded.\n" +" " +msgstr "" + +#: plugin.py:52 +#, docstring +msgid "" +"\n" +"\n" +" Returns in reverse-video.\n" +" " +msgstr "" + +#: plugin.py:61 +#, docstring +msgid "" +"\n" +"\n" +" Returns underlined.\n" +" " +msgstr "" + +#: plugin.py:70 +#, docstring +msgid "" +" [] \n" +"\n" +" Returns with foreground color and background color\n" +" (if given)\n" +" " +msgstr "" + +#: plugin.py:80 +#, docstring +msgid "" +" [ ...]\n" +"\n" +" Joins all the arguments together with .\n" +" " +msgstr "" + +#: plugin.py:89 +#, docstring +msgid "" +" \n" +"\n" +" Replaces with in\n" +" . The first and second arguments must necessarily be the same\n" +" length.\n" +" " +msgstr "" + +#: plugin.py:96 +msgid " must be the same length as ." +msgstr "" + +#: plugin.py:103 +#, docstring +msgid "" +"\n" +"\n" +" Returns uppercased.\n" +" " +msgstr "" + +#: plugin.py:112 +#, docstring +msgid "" +"\n" +"\n" +" Returns lowercased.\n" +" " +msgstr "" + +#: plugin.py:121 +#, docstring +msgid "" +"\n" +"\n" +" Returns capitalized.\n" +" " +msgstr "" + +#: plugin.py:130 +#, docstring +msgid "" +"\n" +"\n" +" Returns titlecased.\n" +" " +msgstr "" + +#: plugin.py:139 +#, docstring +msgid "" +"\n" +"\n" +" Returns the text surrounded by double quotes.\n" +" " +msgstr "" + +#: plugin.py:148 +#, docstring +msgid "" +" \n" +"\n" +" Concatenates two strings. Do keep in mind that this is *not* the same\n" +" thing as join \"\", since if contains spaces, they won't be\n" +" removed by concat.\n" +" " +msgstr "" + +#: plugin.py:159 +#, docstring +msgid "" +" \n" +"\n" +" Cuts down to by chopping off the rightmost characters in\n" +" excess of . If is a negative number, it chops that many\n" +" characters off the end of .\n" +" " +msgstr "" + +#: plugin.py:170 +#, docstring +msgid "" +" \n" +"\n" +" Returns the th space-separated field of . I.e., if text\n" +" is \"foo bar baz\" and is 2, \"bar\" is returned.\n" +" " +msgstr "" + +#: plugin.py:183 +#, docstring +msgid "" +" [ ...]\n" +"\n" +" Expands a Python-style format string using the remaining args. Just be\n" +" sure always to use %s, not %d or %f or whatever, because all the args\n" +" are strings.\n" +" " +msgstr "" + +#: plugin.py:197 +msgid "Not enough arguments for the format string." +msgstr "" + diff --git a/plugins/Format/plugin.py b/plugins/Format/plugin.py index 83c19115d..5e3e4611a 100644 --- a/plugins/Format/plugin.py +++ b/plugins/Format/plugin.py @@ -34,8 +34,11 @@ import supybot.utils as utils from supybot.commands import * import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Format') class Format(callbacks.Plugin): + @internationalizeDocstring def bold(self, irc, msg, args, text): """ @@ -44,6 +47,7 @@ class Format(callbacks.Plugin): irc.reply(ircutils.bold(text)) bold = wrap(bold, ['text']) + @internationalizeDocstring def reverse(self, irc, msg, args, text): """ @@ -52,6 +56,7 @@ class Format(callbacks.Plugin): irc.reply(ircutils.reverse(text)) reverse = wrap(reverse, ['text']) + @internationalizeDocstring def underline(self, irc, msg, args, text): """ @@ -60,6 +65,7 @@ class Format(callbacks.Plugin): irc.reply(ircutils.underline(text)) underline = wrap(underline, ['text']) + @internationalizeDocstring def color(self, irc, msg, args, fg, bg, text): """ [] @@ -69,6 +75,7 @@ class Format(callbacks.Plugin): irc.reply(ircutils.mircColor(text, fg=fg, bg=bg)) color = wrap(color, ['color', optional('color'), 'text']) + @internationalizeDocstring def join(self, irc, msg, args, sep): """ [ ...] @@ -77,6 +84,7 @@ class Format(callbacks.Plugin): irc.reply(sep.join(args)) join = wrap(join, ['anything'], allowExtra=True) + @internationalizeDocstring def translate(self, irc, msg, args, bad, good, text): """ @@ -85,11 +93,12 @@ class Format(callbacks.Plugin): length. """ if len(bad) != len(good): - irc.error(' must be the same length as ' - '.', Raise=True) + irc.error(_(' must be the same length as ' + '.'), Raise=True) irc.reply(text.translate(string.maketrans(bad, good))) translate = wrap(translate, ['something', 'something', 'text']) + @internationalizeDocstring def upper(self, irc, msg, args, text): """ @@ -98,6 +107,7 @@ class Format(callbacks.Plugin): irc.reply(text.upper()) upper = wrap(upper, ['text']) + @internationalizeDocstring def lower(self, irc, msg, args, text): """ @@ -106,6 +116,7 @@ class Format(callbacks.Plugin): irc.reply(text.lower()) lower = wrap(lower, ['text']) + @internationalizeDocstring def capitalize(self, irc, msg, args, text): """ @@ -114,6 +125,7 @@ class Format(callbacks.Plugin): irc.reply(text.capitalize()) capitalize = wrap(capitalize, ['text']) + @internationalizeDocstring def title(self, irc, msg, args, text): """ @@ -122,6 +134,7 @@ class Format(callbacks.Plugin): irc.reply(text.title()) title = wrap(title, ['text']) + @internationalizeDocstring def repr(self, irc, msg, args, text): """ @@ -130,6 +143,7 @@ class Format(callbacks.Plugin): irc.reply(utils.str.dqrepr(text)) repr = wrap(repr, ['text']) + @internationalizeDocstring def concat(self, irc, msg, args, first, second): """ @@ -140,6 +154,7 @@ class Format(callbacks.Plugin): irc.reply(first+second) concat = wrap(concat, ['something', 'text']) + @internationalizeDocstring def cut(self, irc, msg, args, size, text): """ @@ -150,6 +165,7 @@ class Format(callbacks.Plugin): irc.reply(text[:size]) cut = wrap(cut, ['int', 'text']) + @internationalizeDocstring def field(self, irc, msg, args, index, text): """ @@ -162,6 +178,7 @@ class Format(callbacks.Plugin): irc.errorInvalid('field') field = wrap(field, ['index', 'text']) + @internationalizeDocstring def format(self, irc, msg, args): """ [ ...] @@ -177,7 +194,8 @@ class Format(callbacks.Plugin): irc.reply(s) except TypeError, e: self.log.debug(utils.exnToString(e)) - irc.error('Not enough arguments for the format string.',Raise=True) + irc.error(_('Not enough arguments for the format string.'), + Raise=True) Class = Format diff --git a/plugins/Games/config.py b/plugins/Games/config.py index f5ec6bf7a..024d989d7 100644 --- a/plugins/Games/config.py +++ b/plugins/Games/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Games') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Games/locale/fr.po b/plugins/Games/locale/fr.po new file mode 100644 index 000000000..bdeabee12 --- /dev/null +++ b/plugins/Games/locale/fr.po @@ -0,0 +1,140 @@ +# French translations for PACKAGE package +# Traductions françaises du paquet PACKAGE. +# Copyright (C) 2010 ORGANIZATION +# ProgVal , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 13:16+CEST\n" +"PO-Revision-Date: 2010-12-23 19:55+0100\n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: plugin.py:46 +msgid "" +"takes no arguments\n" +"\n" +" Flips a coin and returns the result.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Lance une pièce et retourne le résultat." + +#: plugin.py:51 +msgid "heads" +msgstr "face" + +#: plugin.py:53 +msgid "tails" +msgstr "pile" + +#: plugin.py:58 +msgid "" +"d\n" +"\n" +" Rolls a die with number of sides times.\n" +" For example, 2d6 will roll 2 six-sided dice; 10d10 will roll 10\n" +" ten-sided dice.\n" +" " +msgstr "" +"d\n" +"\n" +"Fait un certain nombre de d'un dé d'un certain nombre de . Par exemple, 2d6 lancera deux dés à six faces, et 10d10 dix dés à dix faces." + +#: plugin.py:66 +msgid "You can't roll more than 1000 dice." +msgstr "Vous ne pouvez lancer plus de 1000 dés." + +#: plugin.py:68 +msgid "Dice can't have more than 100 sides." +msgstr "Vous ne pouvez pas avoir plus de 100 faces." + +#: plugin.py:70 +msgid "Dice can't have fewer than 3 sides." +msgstr "Vous ne pouvez pas avoir moins de trois faces." + +#: plugin.py:78 +msgid "Dice must be of the form d" +msgstr "Les dés doivent être de la forme d" + +#: plugin.py:82 +msgid "It is possible.|Yes!|Of course.|Naturally.|Obviously.|It shall be.|The outlook is good.|It is so.|One would be wise to think so.|The answer is certainly yes." +msgstr "C'est possible.|Oui !|Bien sûr.|Naturellement.|Évidemment.|Ce doit être ça.|Ce n'est pas impossible.|C'est le cas.|C'est ce que l'on peut penser.|La réponse est certainement oui." + +#: plugin.py:86 +msgid "In your dreams.|I doubt it very much.|No chance.|The outlook is poor.|Unlikely.|About as likely as pigs flying.|You're kidding, right?|NO!|NO.|No.|The answer is a resounding no." +msgstr "Dans tes rêves.|J'en doute.|Impossible.|Ça m'étonnerait|Improbable.|Quand les poules auront des dents|La semaine des quatre jeudis.|Tu rigoles ?|NON !|NON.|Non.|La réponse semble être non." + +#: plugin.py:90 +msgid "Maybe...|No clue.|_I_ don't know.|The outlook is hazy, please ask again later.|What are you asking me for?|Come again?|You know the answer better than I.|The answer is def-- oooh! shiny thing!" +msgstr "Peut-être...|Aucune idée|*Je* ne sais pas|Je n'en sais rien, veuillez réessayer.|Qu'est-ce que vous me demander ?|Revenez plus tard.|Vous connaissez la réponse mieux que moi.|La réponse est... oooh ! un truc qui brille !" + +#: plugin.py:107 +msgid "" +"[]\n" +"\n" +" Ask a question and the answer shall be provided.\n" +" " +msgstr "" +"[]\n" +"\n" +"Posez une question, et la réponse devrait vous être donnée." + +#: plugin.py:121 +msgid "" +"[spin]\n" +"\n" +" Fires the revolver. If the bullet was in the chamber, you're dead.\n" +" Tell me to spin the chambers and I will.\n" +" " +msgstr "" +"[spin]\n" +"\n" +"Tire avec le revolver. Si la balle était dans la chambre, vous être mort. Dites-moi de recharger les chambres (en indiquant 'spin') et je le ferais." + +#: plugin.py:128 +msgid "*SPIN* Are you feeling lucky?" +msgstr "*FAIT TOURNER LE BARILLET* Prêt à mettre votre chance à l'épreuve ?" + +#: plugin.py:137 +msgid "*BANG* Hey, who put a blank in here?!" +msgstr "*BANG* Eh, qui a fait un trou ici ?" + +#: plugin.py:139 +msgid "reloads and spins the chambers." +msgstr "recharge et fait tourner les chambres" + +#: plugin.py:141 +msgid "*click*" +msgstr "*clic*" + +#: plugin.py:148 +msgid "" +"[]\n" +"\n" +" Returns the number of consecutive lines you've sent in \n" +" without being interrupted by someone else (i.e. how long your current\n" +" 'monologue' is). is only necessary if the message isn't sent\n" +" in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne le nombre de lignes consécutives que vous avez écrites sur le sans être interrompu par qui que ce soit. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:167 +msgid "Your current monologue is at least %n long." +msgstr "Votre monologue actuel est au moins long de %n." + +#: plugin.py:168 +msgid "line" +msgstr "ligne" + diff --git a/plugins/Games/messages.pot b/plugins/Games/messages.pot new file mode 100644 index 000000000..98aa2cc61 --- /dev/null +++ b/plugins/Games/messages.pot @@ -0,0 +1,128 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 13:16+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:46 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Flips a coin and returns the result.\n" +" " +msgstr "" + +#: plugin.py:51 +msgid "heads" +msgstr "" + +#: plugin.py:53 +msgid "tails" +msgstr "" + +#: plugin.py:58 +#, docstring +msgid "" +"d\n" +"\n" +" Rolls a die with number of sides times.\n" +" For example, 2d6 will roll 2 six-sided dice; 10d10 will roll 10\n" +" ten-sided dice.\n" +" " +msgstr "" + +#: plugin.py:66 +msgid "You can't roll more than 1000 dice." +msgstr "" + +#: plugin.py:68 +msgid "Dice can't have more than 100 sides." +msgstr "" + +#: plugin.py:70 +msgid "Dice can't have fewer than 3 sides." +msgstr "" + +#: plugin.py:78 +msgid "Dice must be of the form d" +msgstr "" + +#: plugin.py:82 +msgid "It is possible.|Yes!|Of course.|Naturally.|Obviously.|It shall be.|The outlook is good.|It is so.|One would be wise to think so.|The answer is certainly yes." +msgstr "" + +#: plugin.py:86 +msgid "In your dreams.|I doubt it very much.|No chance.|The outlook is poor.|Unlikely.|About as likely as pigs flying.|You're kidding, right?|NO!|NO.|No.|The answer is a resounding no." +msgstr "" + +#: plugin.py:90 +msgid "Maybe...|No clue.|_I_ don't know.|The outlook is hazy, please ask again later.|What are you asking me for?|Come again?|You know the answer better than I.|The answer is def-- oooh! shiny thing!" +msgstr "" + +#: plugin.py:107 +#, docstring +msgid "" +"[]\n" +"\n" +" Ask a question and the answer shall be provided.\n" +" " +msgstr "" + +#: plugin.py:121 +#, docstring +msgid "" +"[spin]\n" +"\n" +" Fires the revolver. If the bullet was in the chamber, you're dead.\n" +" Tell me to spin the chambers and I will.\n" +" " +msgstr "" + +#: plugin.py:128 +msgid "*SPIN* Are you feeling lucky?" +msgstr "" + +#: plugin.py:137 +msgid "*BANG* Hey, who put a blank in here?!" +msgstr "" + +#: plugin.py:139 +msgid "reloads and spins the chambers." +msgstr "" + +#: plugin.py:141 +msgid "*click*" +msgstr "" + +#: plugin.py:148 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the number of consecutive lines you've sent in \n" +" without being interrupted by someone else (i.e. how long your current\n" +" 'monologue' is). is only necessary if the message isn't sent\n" +" in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:167 +msgid "Your current monologue is at least %n long." +msgstr "" + +#: plugin.py:168 +msgid "line" +msgstr "" + diff --git a/plugins/Games/plugin.py b/plugins/Games/plugin.py index 203bb9fd5..931c79d2d 100644 --- a/plugins/Games/plugin.py +++ b/plugins/Games/plugin.py @@ -36,20 +36,24 @@ from supybot.commands import * import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Games') class Games(callbacks.Plugin): + @internationalizeDocstring def coin(self, irc, msg, args): """takes no arguments Flips a coin and returns the result. """ if random.randrange(0, 2): - irc.reply('heads') + irc.reply(_('heads')) else: - irc.reply('tails') + irc.reply(_('tails')) coin = wrap(coin) + @internationalizeDocstring def dice(self, irc, msg, args, m): """d @@ -59,11 +63,11 @@ class Games(callbacks.Plugin): """ (dice, sides) = utils.iter.imap(int, m.groups()) if dice > 1000: - irc.error('You can\'t roll more than 1000 dice.') + irc.error(_('You can\'t roll more than 1000 dice.')) elif sides > 100: - irc.error('Dice can\'t have more than 100 sides.') + irc.error(_('Dice can\'t have more than 100 sides.')) elif sides < 3: - irc.error('Dice can\'t have fewer than 3 sides.') + irc.error(_('Dice can\'t have fewer than 3 sides.')) else: L = [0] * dice for i in xrange(dice): @@ -71,36 +75,34 @@ class Games(callbacks.Plugin): irc.reply(format('%L', [str(x) for x in L])) _dicere = re.compile(r'^(\d+)d(\d+)$') dice = wrap(dice, [('matches', _dicere, - 'Dice must be of the form d')]) + _('Dice must be of the form d'))]) # The list of words and algorithm are pulled straight the mozbot # MagicEightBall.bm module: http://tinyurl.com/7ytg7 - _responses = {'positive': ['It is possible.', 'Yes!', 'Of course.', - 'Naturally.', 'Obviously.', 'It shall be.', - 'The outlook is good.', 'It is so.', - 'One would be wise to think so.', - 'The answer is certainly yes.'], - 'negative': ['In your dreams.', 'I doubt it very much.', - 'No chance.', 'The outlook is poor.', - 'Unlikely.', 'About as likely as pigs flying.', - 'You\'re kidding, right?', 'NO!', 'NO.', 'No.', - 'The answer is a resounding no.', ], - 'unknown' : ['Maybe...', 'No clue.', '_I_ don\'t know.', - 'The outlook is hazy, please ask again later.', - 'What are you asking me for?', 'Come again?', - 'You know the answer better than I.', - 'The answer is def-- oooh! shiny thing!'], - } + _positive = _('It is possible.|Yes!|Of course.|Naturally.|Obviously.|' + 'It shall be.|The outlook is good.|It is so.|' + 'One would be wise to think so.|' + 'The answer is certainly yes.') + _negative = _('In your dreams.|I doubt it very much.|No chance.|' + 'The outlook is poor.|Unlikely.|' + 'About as likely as pigs flying.|You\'re kidding, right?|' + 'NO!|NO.|No.|The answer is a resounding no.') + _unknown = _('Maybe...|No clue.|_I_ don\'t know.|' + 'The outlook is hazy, please ask again later.|' + 'What are you asking me for?|Come again?|' + 'You know the answer better than I.|' + 'The answer is def-- oooh! shiny thing!') def _checkTheBall(self, questionLength): if questionLength % 3 == 0: - category = 'positive' + catalog = self._positive elif questionLength % 3 == 1: - category = 'negative' + catalog = self._negative else: - category = 'unknown' - return utils.iter.choice(self._responses[category]) + catalog = self._unknown + return utils.iter.choice(catalog.split('|')) + @internationalizeDocstring def eightball(self, irc, msg, args, text): """[] @@ -114,6 +116,7 @@ class Games(callbacks.Plugin): _rouletteChamber = random.randrange(0, 6) _rouletteBullet = random.randrange(0, 6) + @internationalizeDocstring def roulette(self, irc, msg, args, spin): """[spin] @@ -122,7 +125,7 @@ class Games(callbacks.Plugin): """ if spin: self._rouletteBullet = random.randrange(0, 6) - irc.reply('*SPIN* Are you feeling lucky?', prefixNick=False) + irc.reply(_('*SPIN* Are you feeling lucky?'), prefixNick=False) return channel = msg.args[0] if self._rouletteChamber == self._rouletteBullet: @@ -131,15 +134,16 @@ class Games(callbacks.Plugin): if irc.nick in irc.state.channels[channel].ops: irc.queueMsg(ircmsgs.kick(channel, msg.nick, 'BANG!')) else: - irc.reply('*BANG* Hey, who put a blank in here?!', + irc.reply(_('*BANG* Hey, who put a blank in here?!'), prefixNick=False) - irc.reply('reloads and spins the chambers.', action=True) + irc.reply(_('reloads and spins the chambers.'), action=True) else: - irc.reply('*click*') + irc.reply(_('*click*')) self._rouletteChamber += 1 self._rouletteChamber %= 6 roulette = wrap(roulette, ['public', additional(('literal', 'spin'))]) + @internationalizeDocstring def monologue(self, irc, msg, args, channel): """[] @@ -160,8 +164,8 @@ class Games(callbacks.Plugin): i += 1 else: break - irc.reply(format('Your current monologue is at least %n long.', - (i, 'line'))) + irc.reply(format(_('Your current monologue is at least %n long.'), + (i, _('line')))) monologue = wrap(monologue, ['channel']) Class = Games diff --git a/plugins/Google/config.py b/plugins/Google/config.py index a309911ab..cd1771a6d 100644 --- a/plugins/Google/config.py +++ b/plugins/Google/config.py @@ -30,15 +30,17 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Google') def configure(advanced): from supybot.questions import output, yn conf.registerPlugin('Google', True) - output("""The Google plugin has the functionality to watch for URLs + output(_("""The Google plugin has the functionality to watch for URLs that match a specific pattern. (We call this a snarfer) When supybot sees such a URL, it will parse the web page - for information and reply with the results.""") - if yn('Do you want the Google search snarfer enabled by default?'): + for information and reply with the results.""")) + if yn(_('Do you want the Google search snarfer enabled by default?')): conf.supybot.plugins.Google.searchSnarfer.setValue(True) class Language(registry.OnlySomeStrings): @@ -94,29 +96,29 @@ class SafeSearch(registry.OnlySomeStrings): Google = conf.registerPlugin('Google') conf.registerGlobalValue(Google, 'referer', - registry.String('', """Determines the URL that will be sent to Google for + registry.String('', _("""Determines the URL that will be sent to Google for the Referer field of the search requests. If this value is empty, a Referer will be generated in the following format: - http://$server/$botName""")) + http://$server/$botName"""))) conf.registerChannelValue(Google, 'searchSnarfer', - registry.Boolean(False, """Determines whether the search snarfer is + registry.Boolean(False, _("""Determines whether the search snarfer is enabled. If so, messages (even unaddressed ones) beginning with the word 'google' will result in the first URL Google returns being sent to the - channel.""")) + channel."""))) conf.registerChannelValue(Google, 'colorfulFilter', - registry.Boolean(False, """Determines whether the word 'google' in the - bot's output will be made colorful (like Google's logo).""")) + registry.Boolean(False, _("""Determines whether the word 'google' in the + bot's output will be made colorful (like Google's logo)."""))) conf.registerChannelValue(Google, 'bold', - registry.Boolean(True, """Determines whether results are bolded.""")) + registry.Boolean(True, _("""Determines whether results are bolded."""))) conf.registerChannelValue(Google, 'maximumResults', - NumSearchResults(8, """Determines the maximum number of results returned - from the google command.""")) + NumSearchResults(8, _("""Determines the maximum number of results returned + from the google command."""))) conf.registerChannelValue(Google, 'defaultLanguage', - Language('lang_en', """Determines what default language is used in - searches. If left empty, no specific language will be requested.""")) + Language('lang_'+ _('en'), _("""Determines what default language is used in + searches. If left empty, no specific language will be requested."""))) conf.registerChannelValue(Google, 'searchFilter', - SafeSearch('moderate', """Determines what level of search filtering to use + SafeSearch('moderate', _("""Determines what level of search filtering to use by default. 'active' - most filtering, 'moderate' - default filtering, - 'off' - no filtering""")) + 'off' - no filtering"""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Google/locale/fr.po b/plugins/Google/locale/fr.po new file mode 100644 index 000000000..c5c57b5a4 --- /dev/null +++ b/plugins/Google/locale/fr.po @@ -0,0 +1,225 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 14:50+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:39 +msgid "" +"The Google plugin has the functionality to watch for URLs\n" +" that match a specific pattern. (We call this a snarfer)\n" +" When supybot sees such a URL, it will parse the web page\n" +" for information and reply with the results." +msgstr "Le plugin Google sert à lire des URLs qui correspondent à un masque spécifique (nous appelons ça un 'snarfer'). Lorsque Supybot voit une telle URL, il parse la page web pour trouver des informations et répond avec les résultats." + +#: config.py:43 +msgid "Do you want the Google search snarfer enabled by default?" +msgstr "Voulez-vous activer le snarfer de recherche Google par défaut ?" + +#: config.py:88 +msgid "Value must be 1 <= n <= 8" +msgstr "La valeur doit être comprise entre 1 et 8 (inclus)" + +#: config.py:99 +msgid "" +"Determines the URL that will be sent to Google for\n" +" the Referer field of the search requests. If this value is empty, a\n" +" Referer will be generated in the following format:\n" +" http://$server/$botName" +msgstr "Détermine l'URL qui sera envoyée à Google comme Referer pour les recerches. Si la valeur est vide, un Refere sera automatiquement généré dans le format : http://$server/$botNamr" + +#: config.py:104 +msgid "" +"Determines whether the search snarfer is\n" +" enabled. If so, messages (even unaddressed ones) beginning with the word\n" +" 'google' will result in the first URL Google returns being sent to the\n" +" channel." +msgstr "Détermine si le snarger de recherche est activé. Si c'est le cas, les messages (même non adressés) commençant par 'google' seront répondus par la première URL que Google donne pour cette recherche." + +#: config.py:109 +msgid "" +"Determines whether the word 'google' in the\n" +" bot's output will be made colorful (like Google's logo)." +msgstr "Détermine si le mot 'google' dans la sortie du bot sera coloré (comme le logo de Google)" + +#: config.py:112 +msgid "Determines whether results are bolded." +msgstr "Détermine si les résultats sont mis en gras." + +#: config.py:114 +msgid "" +"Determines the maximum number of results returned\n" +" from the google command." +msgstr "Détermine le nombre maximum de résultats retournés par la commande google." + +#: config.py:117 +msgid "" +"Determines what default language is used in\n" +" searches. If left empty, no specific language will be requested." +msgstr "Détermine quand langue par défaut est utilisée dans les recherches. Si laissé vide, aucune langue spécifique ne sera demandée." + +#: config.py:117 +msgid "en" +msgstr "fr" + +#: config.py:120 +msgid "" +"Determines what level of search filtering to use\n" +" by default. 'active' - most filtering, 'moderate' - default filtering,\n" +" 'off' - no filtering" +msgstr "Détermine le niveau de filtrage à utiliser par défaut. 'active' filtre tout, 'moderate' est le filtre par défaut, et 'off' désactive le filtrage." + +#: plugin.py:101 +msgid "" +"Perform a search using Google's AJAX API.\n" +" search(\"search phrase\", options={})\n" +"\n" +" Valid options are:\n" +" smallsearch - True/False (Default: False)\n" +" filter - {active,moderate,off} (Default: \"moderate\")\n" +" language - Restrict search to documents in the given language\n" +" (Default: \"lang_en\")\n" +" " +msgstr "" +"Perform a search using Google's AJAX API.\n" +" search(\"search phrase\", options={})\n" +"\n" +" Valid options are:\n" +" smallsearch - True/False (Default: False)\n" +" filter - {active,moderate,off} (Default: \"moderate\")\n" +" language - Restrict search to documents in the given language\n" +" (Default: \"lang_en\")\n" +" " + +#: plugin.py:141 +#: plugin.py:192 +msgid "We broke The Google!" +msgstr "Google est toukassay !" + +#: plugin.py:161 +msgid "No matches found." +msgstr "Aucune correspondance." + +#: plugin.py:167 +msgid "" +"\n" +"\n" +" Does a google search, but only returns the first result.\n" +" " +msgstr "" +"\n" +"\n" +"Effectue une recherche google, mais ne retourne que le premier résultat." + +#: plugin.py:176 +msgid "Google found nothing." +msgstr "Google n'a rien trouvé." + +#: plugin.py:181 +msgid "" +" [--{filter,language} ]\n" +"\n" +" Searches google.com for the given string. As many results as can fit\n" +" are included. --language accepts a language abbreviation; --filter\n" +" accepts a filtering level ('active', 'moderate', 'off').\n" +" " +msgstr "" +" [--filtre ] [--language ]\n" +"\n" +"Rercherche la chaîne donnée sur Google. Autant de résultats que possible sont donnés. --language accepte une abbréviation de langue ; --filter accepte un niveau de filtrage ('active', 'moderate', 'off')." + +#: plugin.py:204 +msgid "" +"\n" +"\n" +" Returns a link to the cached version of if it is available.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne un lien vers la version en cache de l', si elle est disponible." + +#: plugin.py:215 +msgid "Google seems to have no cache for that site." +msgstr "Google semble ne pas avoir de cache pour ce site." + +#: plugin.py:220 +msgid "" +" [ ...]\n" +"\n" +" Returns the results of each search, in order, from greatest number\n" +" of results to least.\n" +" " +msgstr "" +" [ ...]\n" +"\n" +"Retourne les résultats de chaque recherche, dans l'ordre, par ordre croissant du nombre de résultats." + +#: plugin.py:244 +msgid "" +" [to] \n" +"\n" +" Returns translated from into .\n" +" Beware that translating to or from languages that use multi-byte\n" +" characters may result in some very odd results.\n" +" " +msgstr "" +" [to] \n" +"\n" + +#: plugin.py:263 +msgid "from language" +msgstr "de la langue" + +#: plugin.py:264 +#: plugin.py:273 +msgid "Valid languages are: %L" +msgstr "Les langues valides sont : %L" + +#: plugin.py:272 +msgid "to language" +msgstr "vers la langue" + +#: plugin.py:289 +msgid "^google\\s+(.*)$" +msgstr "^google\\s+(.*)$" + +#: plugin.py:311 +msgid "" +"\n" +"\n" +" Uses Google's calculator to calculate the value of .\n" +" " +msgstr "" +"\n" +"\n" +"Utilise la calculatrice Google pour calculer la valeur de l'." + +#: plugin.py:325 +msgid "Google's calculator didn't come up with anything." +msgstr "La calculatrice Google ne donne aucun résultat." + +#: plugin.py:331 +msgid "" +"\n" +"\n" +" Looks up on Google.\n" +" " +msgstr "" +"\n" +"\n" +"Recherche le sur Google." + +#: plugin.py:345 +msgid "Google's phonebook didn't come up with anything." +msgstr "L'annuaire téléphonique de Google ne donne aucun résultat." + diff --git a/plugins/Google/messages.pot b/plugins/Google/messages.pot new file mode 100644 index 000000000..9493dd858 --- /dev/null +++ b/plugins/Google/messages.pot @@ -0,0 +1,206 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 14:50+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:39 +msgid "" +"The Google plugin has the functionality to watch for URLs\n" +" that match a specific pattern. (We call this a snarfer)\n" +" When supybot sees such a URL, it will parse the web page\n" +" for information and reply with the results." +msgstr "" + +#: config.py:43 +msgid "Do you want the Google search snarfer enabled by default?" +msgstr "" + +#: config.py:88 +#, docstring +msgid "Value must be 1 <= n <= 8" +msgstr "" + +#: config.py:99 +msgid "" +"Determines the URL that will be sent to Google for\n" +" the Referer field of the search requests. If this value is empty, a\n" +" Referer will be generated in the following format:\n" +" http://$server/$botName" +msgstr "" + +#: config.py:104 +msgid "" +"Determines whether the search snarfer is\n" +" enabled. If so, messages (even unaddressed ones) beginning with the word\n" +" 'google' will result in the first URL Google returns being sent to the\n" +" channel." +msgstr "" + +#: config.py:109 +msgid "" +"Determines whether the word 'google' in the\n" +" bot's output will be made colorful (like Google's logo)." +msgstr "" + +#: config.py:112 +msgid "Determines whether results are bolded." +msgstr "" + +#: config.py:114 +msgid "" +"Determines the maximum number of results returned\n" +" from the google command." +msgstr "" + +#: config.py:117 +msgid "" +"Determines what default language is used in\n" +" searches. If left empty, no specific language will be requested." +msgstr "" + +#: config.py:117 +msgid "en" +msgstr "" + +#: config.py:120 +msgid "" +"Determines what level of search filtering to use\n" +" by default. 'active' - most filtering, 'moderate' - default filtering,\n" +" 'off' - no filtering" +msgstr "" + +#: plugin.py:101 +#, docstring +msgid "" +"Perform a search using Google's AJAX API.\n" +" search(\"search phrase\", options={})\n" +"\n" +" Valid options are:\n" +" smallsearch - True/False (Default: False)\n" +" filter - {active,moderate,off} (Default: \"moderate\")\n" +" language - Restrict search to documents in the given language\n" +" (Default: \"lang_en\")\n" +" " +msgstr "" + +#: plugin.py:141 plugin.py:192 +msgid "We broke The Google!" +msgstr "" + +#: plugin.py:161 +msgid "No matches found." +msgstr "" + +#: plugin.py:167 +#, docstring +msgid "" +"\n" +"\n" +" Does a google search, but only returns the first result.\n" +" " +msgstr "" + +#: plugin.py:176 +msgid "Google found nothing." +msgstr "" + +#: plugin.py:181 +#, docstring +msgid "" +" [--{filter,language} ]\n" +"\n" +" Searches google.com for the given string. As many results as can fit\n" +" are included. --language accepts a language abbreviation; --filter\n" +" accepts a filtering level ('active', 'moderate', 'off').\n" +" " +msgstr "" + +#: plugin.py:204 +#, docstring +msgid "" +"\n" +"\n" +" Returns a link to the cached version of if it is available.\n" +" " +msgstr "" + +#: plugin.py:215 +msgid "Google seems to have no cache for that site." +msgstr "" + +#: plugin.py:220 +#, docstring +msgid "" +" [ ...]\n" +"\n" +" Returns the results of each search, in order, from greatest number\n" +" of results to least.\n" +" " +msgstr "" + +#: plugin.py:244 +#, docstring +msgid "" +" [to] \n" +"\n" +" Returns translated from into .\n" +" Beware that translating to or from languages that use multi-byte\n" +" characters may result in some very odd results.\n" +" " +msgstr "" + +#: plugin.py:263 +msgid "from language" +msgstr "" + +#: plugin.py:264 plugin.py:273 +msgid "Valid languages are: %L" +msgstr "" + +#: plugin.py:272 +msgid "to language" +msgstr "" + +#: plugin.py:289 +#, docstring +msgid "^google\\s+(.*)$" +msgstr "" + +#: plugin.py:311 +#, docstring +msgid "" +"\n" +"\n" +" Uses Google's calculator to calculate the value of .\n" +" " +msgstr "" + +#: plugin.py:325 +msgid "Google's calculator didn't come up with anything." +msgstr "" + +#: plugin.py:331 +#, docstring +msgid "" +"\n" +"\n" +" Looks up on Google.\n" +" " +msgstr "" + +#: plugin.py:345 +msgid "Google's phonebook didn't come up with anything." +msgstr "" + diff --git a/plugins/Google/plugin.py b/plugins/Google/plugin.py index 2adef8ef3..a0d94d062 100644 --- a/plugins/Google/plugin.py +++ b/plugins/Google/plugin.py @@ -41,6 +41,8 @@ from supybot.commands import * import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Google') simplejson = None @@ -94,6 +96,7 @@ class Google(callbacks.PluginRegexp): return msg _gsearchUrl = 'http://ajax.googleapis.com/ajax/services/search/web' + @internationalizeDocstring def search(self, query, channel, options={}): """Perform a search using Google's AJAX API. search("search phrase", options={}) @@ -135,7 +138,7 @@ class Google(callbacks.PluginRegexp): json = simplejson.load(fd) fd.close() if json['responseStatus'] != 200: - raise callbacks.Error, 'We broke The Google!' + raise callbacks.Error, _('We broke The Google!') return json def formatData(self, data, bold=True, max=0): @@ -155,10 +158,11 @@ class Google(callbacks.PluginRegexp): else: results.append(url) if not results: - return format('No matches found.') + return format(_('No matches found.')) else: return format('; '.join(results)) + @internationalizeDocstring def lucky(self, irc, msg, args, text): """ @@ -169,9 +173,10 @@ class Google(callbacks.PluginRegexp): url = data['responseData']['results'][0]['unescapedUrl'] irc.reply(url.encode('utf-8')) else: - irc.reply('Google found nothing.') + irc.reply(_('Google found nothing.')) lucky = wrap(lucky, ['text']) + @internationalizeDocstring def google(self, irc, msg, args, optlist, text): """ [--{filter,language} ] @@ -184,7 +189,7 @@ class Google(callbacks.PluginRegexp): irc.errorInvalid('language') data = self.search(text, msg.args[0], dict(optlist)) if data['responseStatus'] != 200: - irc.reply('We broke The Google!') + irc.reply(_('We broke The Google!')) return bold = self.registryValue('bold', msg.args[0]) max = self.registryValue('maximumResults', msg.args[0]) @@ -194,6 +199,7 @@ class Google(callbacks.PluginRegexp): 'filter':''}), 'text']) + @internationalizeDocstring def cache(self, irc, msg, args, url): """ @@ -206,9 +212,10 @@ class Google(callbacks.PluginRegexp): url = m['cacheUrl'].encode('utf-8') irc.reply(url) return - irc.error('Google seems to have no cache for that site.') + irc.error(_('Google seems to have no cache for that site.')) cache = wrap(cache, ['url']) + @internationalizeDocstring def fight(self, irc, msg, args): """ [ ...] @@ -232,6 +239,7 @@ class Google(callbacks.PluginRegexp): irc.reply(s) _gtranslateUrl='http://ajax.googleapis.com/ajax/services/language/translate' + @internationalizeDocstring def translate(self, irc, msg, args, fromLang, toLang, text): """ [to] @@ -252,8 +260,8 @@ class Google(callbacks.PluginRegexp): fromLang = lang.transLangs[fromLang.capitalize()] elif lang.normalize('lang_'+fromLang)[5:] \ not in lang.transLangs.values(): - irc.errorInvalid('from language', fromLang, - format('Valid languages are: %L', + irc.errorInvalid(_('from language'), fromLang, + format(_('Valid languages are: %L'), lang.transLangs.keys())) else: fromLang = lang.normalize('lang_'+fromLang)[5:] @@ -261,8 +269,8 @@ class Google(callbacks.PluginRegexp): toLang = lang.transLangs[toLang.capitalize()] elif lang.normalize('lang_'+toLang)[5:] \ not in lang.transLangs.values(): - irc.errorInvalid('to language', toLang, - format('Valid languages are: %L', + irc.errorInvalid(_('to language'), toLang, + format(_('Valid languages are: %L'), lang.transLangs.keys())) else: toLang = lang.normalize('lang_'+toLang)[5:] @@ -298,6 +306,7 @@ class Google(callbacks.PluginRegexp): _calcSupRe = re.compile(r'(.*?)', re.I) _calcFontRe = re.compile(r'(.*?)') _calcTimesRe = re.compile(r'&(?:times|#215);') + @internationalizeDocstring def calc(self, irc, msg, args, expr): """ @@ -313,10 +322,11 @@ class Google(callbacks.PluginRegexp): s = self._calcTimesRe.sub(r'*', s) irc.reply(s) else: - irc.reply('Google\'s calculator didn\'t come up with anything.') + irc.reply(_('Google\'s calculator didn\'t come up with anything.')) calc = wrap(calc, ['text']) _phoneRe = re.compile(r'Phonebook.*?(.*?) @@ -332,7 +342,7 @@ class Google(callbacks.PluginRegexp): s = utils.web.htmlToText(s) irc.reply(s) else: - irc.reply('Google\'s phonebook didn\'t come up with anything.') + irc.reply(_('Google\'s phonebook didn\'t come up with anything.')) phonebook = wrap(phonebook, ['text']) diff --git a/plugins/Herald/config.py b/plugins/Herald/config.py index 1f96464f8..801865ea6 100644 --- a/plugins/Herald/config.py +++ b/plugins/Herald/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Herald') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -41,31 +43,31 @@ def configure(advanced): Herald = conf.registerPlugin('Herald') conf.registerChannelValue(Herald, 'heralding', - registry.Boolean(True, """Determines whether messages will be sent to the + registry.Boolean(True, _("""Determines whether messages will be sent to the channel when a recognized user joins; basically enables or disables the - plugin.""")) + plugin."""))) conf.registerGlobalValue(Herald, 'requireCapability', - registry.String('', """Determines what capability (if any) is required to - add/change/remove the herald of another user.""")) + registry.String('', _("""Determines what capability (if any) is required to + add/change/remove the herald of another user."""))) conf.registerChannelValue(Herald, 'throttle', - registry.PositiveInteger(600, """Determines the minimum number of seconds - between heralds.""")) + registry.PositiveInteger(600, _("""Determines the minimum number of seconds + between heralds."""))) conf.registerChannelValue(Herald.throttle, 'afterPart', - registry.NonNegativeInteger(0, """Determines the minimum number of seconds + registry.NonNegativeInteger(0, _("""Determines the minimum number of seconds after parting that the bot will not herald the person when he or she - rejoins.""")) + rejoins."""))) conf.registerChannelValue(Herald.throttle, 'afterSplit', - registry.NonNegativeInteger(60, """Determines the minimum number of seconds - after a netsplit that the bot will not herald the users that split.""")) + registry.NonNegativeInteger(60, _("""Determines the minimum number of seconds + after a netsplit that the bot will not herald the users that split."""))) conf.registerChannelValue(Herald, 'default', - registry.String('', """Sets the default herald to use. If a user has a + registry.String('', _("""Sets the default herald to use. If a user has a personal herald specified, that will be used instead. If set to the empty - string, the default herald will be disabled.""")) + string, the default herald will be disabled."""))) conf.registerChannelValue(Herald.default, 'notice', - registry.Boolean(True, """Determines whether the default herald will be - sent as a NOTICE instead of a PRIVMSG.""")) + registry.Boolean(True, _("""Determines whether the default herald will be + sent as a NOTICE instead of a PRIVMSG."""))) conf.registerChannelValue(Herald.default, 'public', - registry.Boolean(False, """Determines whether the default herald will be - sent publicly.""")) + registry.Boolean(False, _("""Determines whether the default herald will be + sent publicly."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Herald/locale/fr.po b/plugins/Herald/locale/fr.po new file mode 100644 index 000000000..830c2c3f4 --- /dev/null +++ b/plugins/Herald/locale/fr.po @@ -0,0 +1,148 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 15:21+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:46 +msgid "" +"Determines whether messages will be sent to the\n" +" channel when a recognized user joins; basically enables or disables the\n" +" plugin." +msgstr "Détermine si les messages seront envoyés sur le canal lorsqu'un utilisateur reconnu arrive ; active ou désactive basiquement le plugin." + +#: config.py:50 +msgid "" +"Determines what capability (if any) is required to\n" +" add/change/remove the herald of another user." +msgstr "Détermine quelle permission (s'il en est une) est requise pour ajouter/changer/supprimer le message d'annonce d'un autre utilisateur." + +#: config.py:53 +msgid "" +"Determines the minimum number of seconds\n" +" between heralds." +msgstr "Détermine le nombre minimum de secondes entre deux annonces." + +#: config.py:56 +msgid "" +"Determines the minimum number of seconds\n" +" after parting that the bot will not herald the person when he or she\n" +" rejoins." +msgstr "Détermine le nombre minimum de secondes après qu'un utilisateur soit parti pour que le bot puisse l'annoncer à nouveau quand il revient." + +#: config.py:60 +msgid "" +"Determines the minimum number of seconds\n" +" after a netsplit that the bot will not herald the users that split." +msgstr "Détermine le nombre minimum de secondes après un netsplit durant lequel le bot n'annoncera pas les utilisateurs qui ont splitté." + +#: config.py:63 +msgid "" +"Sets the default herald to use. If a user has a\n" +" personal herald specified, that will be used instead. If set to the empty\n" +" string, the default herald will be disabled." +msgstr "Définit le message d'annonce par défaut à utiliser. Si un utilisateur a un message d'annonce personnel spécifié, il peut être utilisé à la place. Si définit à une chaîne vide, le message d'annonce sera désactivé." + +#: config.py:67 +msgid "" +"Determines whether the default herald will be\n" +" sent as a NOTICE instead of a PRIVMSG." +msgstr "Détermine si le message d'annonce sera envoyé en NOTICE plutôt qu'en PRIVMSG." + +#: config.py:70 +msgid "" +"Determines whether the default herald will be\n" +" sent publicly." +msgstr "Détermine si le message d'annonce sera envoyé publiquement." + +#: plugin.py:143 +msgid "" +"[] [--remove|]\n" +"\n" +" If is given, sets the default herald to . A of \"\"\n" +" will remove the default herald. If is not given, returns the\n" +" current default herald. is only necessary if the message\n" +" isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [--remove|]\n" +"\n" +"Si le est donné, définit le message d'annonce par défaut pour être le . Un de la forme \"\" supprimera le message d'annonce par défaut. Si le n'est pas donné, retourne le message d'annonce par défaut actuel. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:162 +msgid "I do not have a default herald set for %s." +msgstr "Je n'ai pas de message d'annonce par défaut pour %s." + +#: plugin.py:170 +msgid "" +"[] []\n" +"\n" +" Returns the current herald message for (or the user\n" +" is currently identified or recognized as). If \n" +" is not given, defaults to the user giving the command. \n" +" is only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] ]\n" +"\n" +"Retourne le message d'annonce courant pour l' (ou l'utilisateur désigné par le ). Si l' n'est pas donné, cela vaut par défaut l'utilisateur donnant la commande. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:181 +msgid "I have no herald for %s." +msgstr "Je n'ai pas de message d'annonce pour %s." + +#: plugin.py:201 +msgid "" +"[] \n" +"\n" +" Sets the herald message for (or the user is\n" +" currently identified or recognized as) to . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Définit le d'annonce de l' (ou la personne désignée par ). n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:214 +msgid "" +"[] []\n" +"\n" +" Removes the herald message set for , or the user\n" +" is currently identified or recognized as. If \n" +" is not given, defaults to the user giving the command.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Supprime le message d'annonce de l' (ou de l'utilisateur désigné par le ). n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:227 +msgid "I have no herald for that user." +msgstr "Je n'ai pas de message d'annonce pour cet utilisateur." + +#: plugin.py:232 +msgid "" +"[] [] \n" +"\n" +" Changes the herald message for , or the user is\n" +" currently identified or recognized as, according to . If\n" +" is not given, defaults to the calling user. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [] []\n" +"\n" +"Change le message d'annonce de l' (ou de l'utilisateur désigné par le ), en fonction de l'. Si l' n'est pas donné, cea correspond par défaut de l'utilisateur appelant la commande. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + diff --git a/plugins/Herald/messages.pot b/plugins/Herald/messages.pot new file mode 100644 index 000000000..61aec5e7d --- /dev/null +++ b/plugins/Herald/messages.pot @@ -0,0 +1,140 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 15:21+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "" +"Determines whether messages will be sent to the\n" +" channel when a recognized user joins; basically enables or disables the\n" +" plugin." +msgstr "" + +#: config.py:50 +msgid "" +"Determines what capability (if any) is required to\n" +" add/change/remove the herald of another user." +msgstr "" + +#: config.py:53 +msgid "" +"Determines the minimum number of seconds\n" +" between heralds." +msgstr "" + +#: config.py:56 +msgid "" +"Determines the minimum number of seconds\n" +" after parting that the bot will not herald the person when he or she\n" +" rejoins." +msgstr "" + +#: config.py:60 +msgid "" +"Determines the minimum number of seconds\n" +" after a netsplit that the bot will not herald the users that split." +msgstr "" + +#: config.py:63 +msgid "" +"Sets the default herald to use. If a user has a\n" +" personal herald specified, that will be used instead. If set to the empty\n" +" string, the default herald will be disabled." +msgstr "" + +#: config.py:67 +msgid "" +"Determines whether the default herald will be\n" +" sent as a NOTICE instead of a PRIVMSG." +msgstr "" + +#: config.py:70 +msgid "" +"Determines whether the default herald will be\n" +" sent publicly." +msgstr "" + +#: plugin.py:143 +#, docstring +msgid "" +"[] [--remove|]\n" +"\n" +" If is given, sets the default herald to . A of \"\"\n" +" will remove the default herald. If is not given, returns the\n" +" current default herald. is only necessary if the message\n" +" isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:162 +msgid "I do not have a default herald set for %s." +msgstr "" + +#: plugin.py:170 +#, docstring +msgid "" +"[] []\n" +"\n" +" Returns the current herald message for (or the user\n" +" is currently identified or recognized as). If \n" +" is not given, defaults to the user giving the command. \n" +" is only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:181 +msgid "I have no herald for %s." +msgstr "" + +#: plugin.py:201 +#, docstring +msgid "" +"[] \n" +"\n" +" Sets the herald message for (or the user is\n" +" currently identified or recognized as) to . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:214 +#, docstring +msgid "" +"[] []\n" +"\n" +" Removes the herald message set for , or the user\n" +" is currently identified or recognized as. If \n" +" is not given, defaults to the user giving the command.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:227 +msgid "I have no herald for that user." +msgstr "" + +#: plugin.py:232 +#, docstring +msgid "" +"[] [] \n" +"\n" +" Changes the herald message for , or the user is\n" +" currently identified or recognized as, according to . If\n" +" is not given, defaults to the calling user. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + diff --git a/plugins/Herald/plugin.py b/plugins/Herald/plugin.py index 5069c51e3..833208ae8 100644 --- a/plugins/Herald/plugin.py +++ b/plugins/Herald/plugin.py @@ -40,6 +40,8 @@ import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks from supybot.utils.structures import TimeoutQueue +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Herald') filename = conf.supybot.directories.data.dirize('Herald.db') @@ -136,6 +138,7 @@ class Herald(callbacks.Plugin): raise KeyError return id + @internationalizeDocstring def default(self, irc, msg, args, channel, optlist, text): """[] [--remove|] @@ -156,12 +159,13 @@ class Herald(callbacks.Plugin): irc.replySuccess() else: resp = self.registryValue('default', channel) or \ - 'I do not have a default herald set for %s.' % channel + _('I do not have a default herald set for %s.') % channel irc.reply(resp) default = wrap(default, ['channel', getopts({'remove': ''}), additional('text')]) + @internationalizeDocstring def get(self, irc, msg, args, channel, user): """[] [] @@ -174,7 +178,7 @@ class Herald(callbacks.Plugin): herald = self.db[channel, user.id] irc.reply(herald) except KeyError: - irc.error('I have no herald for %s.' % user.name) + irc.error(_('I have no herald for %s.') % user.name) get = wrap(get, ['channel', first('otherUser', 'user')]) def _preCheck(self, irc, msg, user): @@ -192,6 +196,7 @@ class Herald(callbacks.Plugin): # I chose not to make optional in this command because # if it's not a valid username (e.g., if the user tyops and misspells a # username), it may be nice not to clobber the user's herald. + @internationalizeDocstring def add(self, irc, msg, args, channel, user, herald): """[] @@ -204,6 +209,7 @@ class Herald(callbacks.Plugin): irc.replySuccess() add = wrap(add, ['channel', 'otherUser', 'text']) + @internationalizeDocstring def remove(self, irc, msg, args, channel, user): """[] [] @@ -218,9 +224,10 @@ class Herald(callbacks.Plugin): del self.db[channel, user.id] irc.replySuccess() except KeyError: - irc.error('I have no herald for that user.') + irc.error(_('I have no herald for that user.')) remove = wrap(remove, ['channel', first('otherUser', 'user')]) + @internationalizeDocstring def change(self, irc, msg, args, channel, user, changer): """[] [] diff --git a/plugins/Internet/config.py b/plugins/Internet/config.py index 118f805a2..cf7ff92c6 100644 --- a/plugins/Internet/config.py +++ b/plugins/Internet/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Internet') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,7 +44,7 @@ def configure(advanced): Internet = conf.registerPlugin('Internet') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Internet, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Internet/locale/fr.po b/plugins/Internet/locale/fr.po new file mode 100644 index 000000000..fc22ff9da --- /dev/null +++ b/plugins/Internet/locale/fr.po @@ -0,0 +1,90 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 15:20+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:43 +msgid "Add the help for \"@help Internet\" here." +msgstr "" + +#: plugin.py:47 +msgid "" +"\n" +"\n" +" Returns the ip of or the reverse DNS hostname of .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne l'ip de l', ou le reverse DNS de l'" + +#: plugin.py:54 +#: plugin.py:61 +#: plugin.py:65 +msgid "Host not found." +msgstr "Hôte non trouvé." + +#: plugin.py:77 +msgid "" +"\n" +"\n" +" Returns WHOIS information on the registration of .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne les informations du WHOIS sur le ." + +#: plugin.py:83 +msgid "domain" +msgstr "domaine" + +#: plugin.py:112 +msgid "updated %s" +msgstr "mis à jour le %s" + +#: plugin.py:115 +msgid "registered %s" +msgstr "enregistré le %s" + +#: plugin.py:118 +msgid "expires %s" +msgstr "expire le %s" + +#: plugin.py:138 +msgid " " +msgstr " " + +#: plugin.py:140 +msgid " " +msgstr " " + +#: plugin.py:145 +msgid "%s%s is %L." +msgstr "%s%s est %L" + +#: plugin.py:148 +msgid "I couldn't find such a domain." +msgstr "Je ne peux trouver ce domaine." + +#: plugin.py:153 +msgid "" +"\n" +"\n" +" Returns the hexadecimal IP for that IP.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne l'IP hexadécimale pour cette IP." + diff --git a/plugins/Internet/messages.pot b/plugins/Internet/messages.pot new file mode 100644 index 000000000..5f6f82699 --- /dev/null +++ b/plugins/Internet/messages.pot @@ -0,0 +1,85 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 15:20+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:43 +#, docstring +msgid "Add the help for \"@help Internet\" here." +msgstr "" + +#: plugin.py:47 +#, docstring +msgid "" +"\n" +"\n" +" Returns the ip of or the reverse DNS hostname of .\n" +" " +msgstr "" + +#: plugin.py:54 plugin.py:61 plugin.py:65 +msgid "Host not found." +msgstr "" + +#: plugin.py:77 +#, docstring +msgid "" +"\n" +"\n" +" Returns WHOIS information on the registration of .\n" +" " +msgstr "" + +#: plugin.py:83 +msgid "domain" +msgstr "" + +#: plugin.py:112 +msgid "updated %s" +msgstr "" + +#: plugin.py:115 +msgid "registered %s" +msgstr "" + +#: plugin.py:118 +msgid "expires %s" +msgstr "" + +#: plugin.py:138 +msgid " " +msgstr "" + +#: plugin.py:140 +msgid " " +msgstr "" + +#: plugin.py:145 +msgid "%s%s is %L." +msgstr "" + +#: plugin.py:148 +msgid "I couldn't find such a domain." +msgstr "" + +#: plugin.py:153 +#, docstring +msgid "" +"\n" +"\n" +" Returns the hexadecimal IP for that IP.\n" +" " +msgstr "" + diff --git a/plugins/Internet/plugin.py b/plugins/Internet/plugin.py index 490c9165c..53ca3d056 100644 --- a/plugins/Internet/plugin.py +++ b/plugins/Internet/plugin.py @@ -35,11 +35,13 @@ import supybot.utils as utils from supybot.commands import * from supybot.utils.iter import any import supybot.callbacks as callbacks - +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Internet') class Internet(callbacks.Plugin): """Add the help for "@help Internet" here.""" threaded = True + @internationalizeDocstring def dns(self, irc, msg, args, host): """ @@ -48,18 +50,18 @@ class Internet(callbacks.Plugin): if utils.net.isIP(host): hostname = socket.getfqdn(host) if hostname == host: - irc.reply('Host not found.') + irc.reply(_('Host not found.')) else: irc.reply(hostname) else: try: ip = socket.gethostbyname(host) if ip == '64.94.110.11': # Verisign sucks! - irc.reply('Host not found.') + irc.reply(_('Host not found.')) else: irc.reply(ip) except socket.error: - irc.reply('Host not found.') + irc.reply(_('Host not found.')) dns = wrap(dns, ['something']) _domain = ['Domain Name', 'Server Name', 'domain'] @@ -69,6 +71,7 @@ class Internet(callbacks.Plugin): _created = ['Created On', 'Domain Registration Date', 'Creation Date'] _expires = ['Expiration Date', 'Domain Expiration Date'] _status = ['Status', 'Domain Status', 'status'] + @internationalizeDocstring def whois(self, irc, msg, args, domain): """ @@ -76,7 +79,7 @@ class Internet(callbacks.Plugin): """ usertld = domain.split('.')[-1] if '.' not in domain: - irc.errorInvalid('domain') + irc.errorInvalid(_('domain')) return try: t = telnetlib.Telnet('%s.whois-servers.net' % usertld, 43) @@ -105,13 +108,13 @@ class Internet(callbacks.Plugin): registrar = ':'.join(line.split(':')[1:]).strip() elif not updated and any(line.startswith, self._updated): s = ':'.join(line.split(':')[1:]).strip() - updated = 'updated %s' % s + updated = _('updated %s') % s elif not created and any(line.startswith, self._created): s = ':'.join(line.split(':')[1:]).strip() - created = 'registered %s' % s + created = _('registered %s') % s elif not expires and any(line.startswith, self._expires): s = ':'.join(line.split(':')[1:]).strip() - expires = 'expires %s' % s + expires = _('expires %s') % s elif not status and any(line.startswith, self._status): status = ':'.join(line.split(':')[1:]).strip().lower() if not status: @@ -131,19 +134,20 @@ class Internet(callbacks.Plugin): if not line: continue if line.startswith('Email'): - url = ' ' % line.split('@')[-1] + url = _(' ') % line.split('@')[-1] elif line.startswith('Registrar Organization:'): - url = ' ' % line.split(':')[1].strip() + url = _(' ') % line.split(':')[1].strip() elif line == 'Not a valid ID pattern': url = '' if server and status: info = filter(None, [status, created, updated, expires]) - s = format('%s%s is %L.', server, url, info) + s = format(_('%s%s is %L.'), server, url, info) irc.reply(s) else: - irc.error('I couldn\'t find such a domain.') + irc.error(_('I couldn\'t find such a domain.')) whois = wrap(whois, ['lowered']) + @internationalizeDocstring def hexip(self, irc, msg, args, ip): """ @@ -156,7 +160,7 @@ class Internet(callbacks.Plugin): ret += '%02x' % i irc.reply(ret.upper()) hexip = wrap(hexip, ['ip']) - +Internet = internationalizeDocstring(Internet) Class = Internet diff --git a/plugins/Karma/config.py b/plugins/Karma/config.py index f2ae97196..b43dd011c 100644 --- a/plugins/Karma/config.py +++ b/plugins/Karma/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Karma') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -41,22 +43,22 @@ def configure(advanced): conf.registerPlugin('Karma') conf.registerChannelValue(conf.supybot.plugins.Karma, 'simpleOutput', - registry.Boolean(False, """Determines whether the bot will output shorter - versions of the karma output when requesting a single thing's karma.""")) + registry.Boolean(False, _("""Determines whether the bot will output shorter + versions of the karma output when requesting a single thing's karma."""))) conf.registerChannelValue(conf.supybot.plugins.Karma, 'response', - registry.Boolean(False, """Determines whether the bot will reply with a - success message when something's karma is increased or decreased.""")) + registry.Boolean(False, _("""Determines whether the bot will reply with a + success message when something's karma is increased or decreased."""))) conf.registerChannelValue(conf.supybot.plugins.Karma, 'rankingDisplay', - registry.Integer(3, """Determines how many highest/lowest karma things are - shown when karma is called with no arguments.""")) + registry.Integer(3, _("""Determines how many highest/lowest karma things + are shown when karma is called with no arguments."""))) conf.registerChannelValue(conf.supybot.plugins.Karma, 'mostDisplay', - registry.Integer(25, """Determines how many karma things are shown when - the most command is called.'""")) + registry.Integer(25, _("""Determines how many karma things are shown when + the most command is called.'"""))) conf.registerChannelValue(conf.supybot.plugins.Karma, 'allowSelfRating', - registry.Boolean(False, """Determines whether users can adjust the karma - of their nick.""")) + registry.Boolean(False, _("""Determines whether users can adjust the karma + of their nick."""))) conf.registerChannelValue(conf.supybot.plugins.Karma, 'allowUnaddressedKarma', - registry.Boolean(False, """Determines whether the bot will - increase/decrease karma without being addressed.""")) + registry.Boolean(False, _("""Determines whether the bot will + increase/decrease karma without being addressed."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Karma/locale/fr.po b/plugins/Karma/locale/fr.po new file mode 100644 index 000000000..6daa8c964 --- /dev/null +++ b/plugins/Karma/locale/fr.po @@ -0,0 +1,152 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-28 15:19+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:46 +msgid "" +"Determines whether the bot will output shorter\n" +" versions of the karma output when requesting a single thing's karma." +msgstr "Détermine si le bot donnera comme sortie une version plus courte du karma lorsqu'on lui demandera un seul karma." + +#: config.py:49 +msgid "" +"Determines whether the bot will reply with a\n" +" success message when something's karma is increased or decreased." +msgstr "Détermine si le bot répondra avec un message de succès si un karma est augmenté ou diminué." + +#: config.py:52 +msgid "" +"Determines how many highest/lowest karma things\n" +" are shown when karma is called with no arguments." +msgstr "Détermine combien de plus haut/bas karmas sont affichés lorsque karma est appelé sans argument." + +#: config.py:55 +msgid "" +"Determines how many karma things are shown when\n" +" the most command is called.'" +msgstr "Détermine combien de karmas sont affichés lorsque la commande most est appelée." + +#: config.py:58 +msgid "" +"Determines whether users can adjust the karma\n" +" of their nick." +msgstr "Détermine si les utilisateurs peuvent ajuster le karma de leur nick." + +#: config.py:61 +msgid "" +"Determines whether the bot will\n" +" increase/decrease karma without being addressed." +msgstr "Détermine si le bot augmentera/diminuera le karma sans que l'on s'adresse à lui." + +#: plugin.py:243 +#: plugin.py:251 +msgid "You're not allowed to adjust your own karma." +msgstr "Vous n'êtes pas autorisé à modifier votre propre karma." + +#: plugin.py:280 +msgid "" +"[] [ ...]\n" +"\n" +" Returns the karma of . If is not given, returns the top\n" +" N karmas, where N is determined by the config variable\n" +" supybot.plugins.Karma.rankingDisplay. If one is given, returns\n" +" the details of its karma; if more than one is given, returns\n" +" the total karma of each of the the things. is only necessary\n" +" if the message isn't sent on the channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Retourne le karma de l'. Si l' n'est pas donné, retourne les trois premiers et derniers karmas. Si une est donnée, retourne les détails de son karma ; si plus d'une est donnée, retourne le karma total de chacune de ces choses. Le n'est nécessaire que si la commande n'est pas envoyée sur le canal lui-même." + +#: plugin.py:293 +msgid "%s has neutral karma." +msgstr "%s a un karma neutre." + +#: plugin.py:300 +msgid "Karma for %q has been increased %n and decreased %n for a total karma of %s." +msgstr "Le karma de %q a été augmenté %n fois et diminué %n fois, pour un karma total de %s." + +#: plugin.py:302 +#: plugin.py:303 +msgid "time" +msgstr "" + +#: plugin.py:316 +msgid "I didn't know the karma for any of those things." +msgstr "Je ne connais le karma d'aucune de ces choses." + +#: plugin.py:326 +#: plugin.py:355 +msgid "I have no karma for this channel." +msgstr "Je n'ai pas de karma pour ce canal." + +#: plugin.py:331 +msgid " You (%s) are ranked %i out of %i." +msgstr " Vous (%s) êtes #%i sur %i" + +#: plugin.py:335 +msgid "Highest karma: %L. Lowest karma: %L.%s" +msgstr "Plus haut karma : %L. Plus bas karma : %L.%s" + +#: plugin.py:343 +msgid "" +"[] {increased,decreased,active}\n" +"\n" +" Returns the most increased, the most decreased, or the most active\n" +" (the sum of increased and decreased) karma things. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] {increased,decreased,active}\n" +"\n" +"Retourne le plus augmenté (increased), le plus descendu (decreased), ou le plus actif (la somme des montées et descentes) des karmas. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:361 +msgid "" +"[] \n" +"\n" +" Resets the karma of to 0.\n" +" " +msgstr "" +"[] \n" +"\n" +"Redéfinit le karma de à 0." + +#: plugin.py:371 +msgid "" +"[] \n" +"\n" +" Dumps the Karma database for to in the bot's\n" +" data directory. is only necessary if the message isn't sent\n" +" in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Exporte la base de données des Karma du dans le dans le répertoire de données du bot. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:383 +msgid "" +"[] \n" +"\n" +" Loads the Karma database for from in the bot's\n" +" data directory. is only necessary if the message isn't sent\n" +" in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Charge la base de données des Karma du du dans le répertoire de données du bot. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + diff --git a/plugins/Karma/messages.pot b/plugins/Karma/messages.pot new file mode 100644 index 000000000..265354adb --- /dev/null +++ b/plugins/Karma/messages.pot @@ -0,0 +1,141 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-28 15:19+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "" +"Determines whether the bot will output shorter\n" +" versions of the karma output when requesting a single thing's karma." +msgstr "" + +#: config.py:49 +msgid "" +"Determines whether the bot will reply with a\n" +" success message when something's karma is increased or decreased." +msgstr "" + +#: config.py:52 +msgid "" +"Determines how many highest/lowest karma things\n" +" are shown when karma is called with no arguments." +msgstr "" + +#: config.py:55 +msgid "" +"Determines how many karma things are shown when\n" +" the most command is called.'" +msgstr "" + +#: config.py:58 +msgid "" +"Determines whether users can adjust the karma\n" +" of their nick." +msgstr "" + +#: config.py:61 +msgid "" +"Determines whether the bot will\n" +" increase/decrease karma without being addressed." +msgstr "" + +#: plugin.py:243 plugin.py:251 +msgid "You're not allowed to adjust your own karma." +msgstr "" + +#: plugin.py:280 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" Returns the karma of . If is not given, returns the top\n" +" N karmas, where N is determined by the config variable\n" +" supybot.plugins.Karma.rankingDisplay. If one is given, returns\n" +" the details of its karma; if more than one is given, returns\n" +" the total karma of each of the the things. is only necessary\n" +" if the message isn't sent on the channel itself.\n" +" " +msgstr "" + +#: plugin.py:293 +msgid "%s has neutral karma." +msgstr "" + +#: plugin.py:300 +msgid "Karma for %q has been increased %n and decreased %n for a total karma of %s." +msgstr "" + +#: plugin.py:302 plugin.py:303 +msgid "time" +msgstr "" + +#: plugin.py:316 +msgid "I didn't know the karma for any of those things." +msgstr "" + +#: plugin.py:326 plugin.py:355 +msgid "I have no karma for this channel." +msgstr "" + +#: plugin.py:331 +msgid " You (%s) are ranked %i out of %i." +msgstr "" + +#: plugin.py:335 +msgid "Highest karma: %L. Lowest karma: %L.%s" +msgstr "" + +#: plugin.py:343 +#, docstring +msgid "" +"[] {increased,decreased,active}\n" +"\n" +" Returns the most increased, the most decreased, or the most active\n" +" (the sum of increased and decreased) karma things. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:361 +#, docstring +msgid "" +"[] \n" +"\n" +" Resets the karma of to 0.\n" +" " +msgstr "" + +#: plugin.py:371 +#, docstring +msgid "" +"[] \n" +"\n" +" Dumps the Karma database for to in the bot's\n" +" data directory. is only necessary if the message isn't sent\n" +" in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:383 +#, docstring +msgid "" +"[] \n" +"\n" +" Loads the Karma database for from in the bot's\n" +" data directory. is only necessary if the message isn't sent\n" +" in the channel itself.\n" +" " +msgstr "" + diff --git a/plugins/Karma/plugin.py b/plugins/Karma/plugin.py index 02570b5af..606ea57c5 100644 --- a/plugins/Karma/plugin.py +++ b/plugins/Karma/plugin.py @@ -38,6 +38,8 @@ import supybot.plugins as plugins import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Karma') class SqliteKarmaDB(object): def __init__(self, filename): @@ -238,7 +240,7 @@ class Karma(callbacks.Plugin): thing = thing[:-2] if ircutils.strEqual(thing, irc.msg.nick) and \ not self.registryValue('allowSelfRating', channel): - irc.error('You\'re not allowed to adjust your own karma.') + irc.error(_('You\'re not allowed to adjust your own karma.')) elif thing: self.db.increment(channel, self._normalizeThing(thing)) self._respond(irc, channel) @@ -246,7 +248,7 @@ class Karma(callbacks.Plugin): thing = thing[:-2] if ircutils.strEqual(thing, irc.msg.nick) and \ not self.registryValue('allowSelfRating', channel): - irc.error('You\'re not allowed to adjust your own karma.') + irc.error(_('You\'re not allowed to adjust your own karma.')) elif thing: self.db.decrement(channel, self._normalizeThing(thing)) self._respond(irc, channel) @@ -273,6 +275,7 @@ class Karma(callbacks.Plugin): if thing[-2:] in ('++', '--'): self._doKarma(irc, channel, thing) + @internationalizeDocstring def karma(self, irc, msg, args, channel, things): """[] [ ...] @@ -287,16 +290,17 @@ class Karma(callbacks.Plugin): name = things[0] t = self.db.get(channel, name) if t is None: - irc.reply(format('%s has neutral karma.', name)) + irc.reply(format(_('%s has neutral karma.'), name)) else: (added, subtracted) = t total = added - subtracted if self.registryValue('simpleOutput', channel): s = format('%s: %i', name, total) else: - s = format('Karma for %q has been increased %n and ' - 'decreased %n for a total karma of %s.', - name, (added, 'time'), (subtracted, 'time'), + s = format(_('Karma for %q has been increased %n and ' + 'decreased %n for a total karma of %s.'), + name, (added, _('time')), + (subtracted, _('time')), total) irc.reply(s) elif len(things) > 1: @@ -309,7 +313,8 @@ class Karma(callbacks.Plugin): s += neutral irc.reply(s + '.') else: - irc.reply('I didn\'t know the karma for any of those things.') + irc.reply(_('I didn\'t know the karma for any of those ' + 'things.')) else: # No name was given. Return the top/bottom N karmas. limit = self.registryValue('rankingDisplay', channel) top = self.db.top(channel, limit) @@ -318,21 +323,22 @@ class Karma(callbacks.Plugin): lowest = [format('%q (%s)', s, t) for (s, t) in self.db.bottom(channel, limit)] if not (highest and lowest): - irc.error('I have no karma for this channel.') + irc.error(_('I have no karma for this channel.')) return rank = self.db.rank(channel, msg.nick) if rank is not None: total = self.db.size(channel) - rankS = format(' You (%s) are ranked %i out of %i.', + rankS = format(_(' You (%s) are ranked %i out of %i.'), msg.nick, rank, total) else: rankS = '' - s = format('Highest karma: %L. Lowest karma: %L.%s', + s = format(_('Highest karma: %L. Lowest karma: %L.%s'), highest, lowest, rankS) irc.reply(s) karma = wrap(karma, ['channel', any('something')]) _mostAbbrev = utils.abbrev(['increased', 'decreased', 'active']) + @internationalizeDocstring def most(self, irc, msg, args, channel, kind): """[] {increased,decreased,active} @@ -346,10 +352,11 @@ class Karma(callbacks.Plugin): L = [format('%q: %i', name, i) for (name, i) in L] irc.reply(format('%L', L)) else: - irc.error('I have no karma for this channel.') + irc.error(_('I have no karma for this channel.')) most = wrap(most, ['channel', ('literal', ['increased', 'decreased', 'active'])]) + @internationalizeDocstring def clear(self, irc, msg, args, channel, name): """[] @@ -359,6 +366,7 @@ class Karma(callbacks.Plugin): irc.replySuccess() clear = wrap(clear, [('checkChannelCapability', 'op'), 'text']) + @internationalizeDocstring def dump(self, irc, msg, args, channel, filename): """[] @@ -370,6 +378,7 @@ class Karma(callbacks.Plugin): irc.replySuccess() dump = wrap(dump, [('checkCapability', 'owner'), 'channeldb', 'filename']) + @internationalizeDocstring def load(self, irc, msg, args, channel, filename): """[] diff --git a/plugins/Lart/config.py b/plugins/Lart/config.py index f3c83e7a7..3ad4aab1f 100644 --- a/plugins/Lart/config.py +++ b/plugins/Lart/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Lart') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,10 +44,10 @@ def configure(advanced): Lart = conf.registerPlugin('Lart') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Lart, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) conf.registerChannelValue(Lart, 'showIds', - registry.Boolean(False, """Determines whether the bot will show the ids of - a lart when the lart is given.""")) + registry.Boolean(False, _("""Determines whether the bot will show the ids + of a lart when the lart is given."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Lart/locale/fr.po b/plugins/Lart/locale/fr.po new file mode 100644 index 000000000..68f09fad6 --- /dev/null +++ b/plugins/Lart/locale/fr.po @@ -0,0 +1,54 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 15:21+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:49 +msgid "" +"Determines whether the bot will show the ids\n" +" of a lart when the lart is given." +msgstr "Détermine si le bot affichera les idées d'un lart lorsqu'il est donné." + +#: plugin.py:48 +msgid "Larts must contain $who." +msgstr "Les larts doivent contenir $who." + +#: plugin.py:52 +msgid "" +"[] [] [for ]\n" +"\n" +" Uses the Luser Attitude Readjustment Tool on (for ,\n" +" if given). If is given, uses that specific lart. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [] [ [for ]\n" +"\n" +"Utilise le Luser Attitude Readjustment Tool sur (pour la , si elle est donnée). Si l' est donné, utilise un LART spécifique. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:66 +msgid "There is no lart with id #%i." +msgstr "Il n'y a pas de lart d'id #%i." + +#: plugin.py:71 +msgid "There are no larts in my database for %s." +msgstr "Il n'y a pas de lart dans ma base de données pour %s." + +#: plugin.py:77 +msgid "trying to dis me" +msgstr "essaye de me manquer de respect" + +#: plugin.py:85 +msgid " for " +msgstr " pour " + diff --git a/plugins/Lart/messages.pot b/plugins/Lart/messages.pot new file mode 100644 index 000000000..a290a2605 --- /dev/null +++ b/plugins/Lart/messages.pot @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 15:21+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:49 +msgid "" +"Determines whether the bot will show the ids\n" +" of a lart when the lart is given." +msgstr "" + +#: plugin.py:48 +msgid "Larts must contain $who." +msgstr "" + +#: plugin.py:52 +#, docstring +msgid "" +"[] [] [for ]\n" +"\n" +" Uses the Luser Attitude Readjustment Tool on (for ,\n" +" if given). If is given, uses that specific lart. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:66 +msgid "There is no lart with id #%i." +msgstr "" + +#: plugin.py:71 +msgid "There are no larts in my database for %s." +msgstr "" + +#: plugin.py:77 +msgid "trying to dis me" +msgstr "" + +#: plugin.py:85 +msgid " for " +msgstr "" + diff --git a/plugins/Lart/plugin.py b/plugins/Lart/plugin.py index 1d1c5c6a6..aed197614 100644 --- a/plugins/Lart/plugin.py +++ b/plugins/Lart/plugin.py @@ -32,6 +32,8 @@ import re from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Lart') class Lart(plugins.ChannelIdDatabasePlugin): _meRe = re.compile(r'\bme\b', re.I) @@ -43,8 +45,9 @@ class Lart(plugins.ChannelIdDatabasePlugin): def addValidator(self, irc, text): if '$who' not in text: - irc.error('Larts must contain $who.', Raise=True) + irc.error(_('Larts must contain $who.'), Raise=True) + @internationalizeDocstring def lart(self, irc, msg, args, channel, id, text): """[] [] [for ] @@ -60,18 +63,18 @@ class Lart(plugins.ChannelIdDatabasePlugin): try: lart = self.db.get(channel, id) except KeyError: - irc.error(format('There is no lart with id #%i.', id)) + irc.error(format(_('There is no lart with id #%i.'), id)) return else: lart = self.db.random(channel) if not lart: - irc.error(format('There are no larts in my database ' - 'for %s.', channel)) + irc.error(format(_('There are no larts in my database ' + 'for %s.'), channel)) return text = lart.text if ircutils.strEqual(target, irc.nick): target = msg.nick - reason = self._replaceFirstPerson('trying to dis me', irc.nick) + reason = self._replaceFirstPerson(_('trying to dis me'), irc.nick) else: target = self._replaceFirstPerson(target, msg.nick) reason = self._replaceFirstPerson(reason, msg.nick) @@ -79,7 +82,7 @@ class Lart(plugins.ChannelIdDatabasePlugin): target = target.rstrip('.') text = text.replace('$who', target) if reason: - text += ' for ' + reason + text += _(' for ') + reason if self.registryValue('showIds', channel): text += format(' (#%i)', lart.id) irc.reply(text, action=True) diff --git a/plugins/Later/config.py b/plugins/Later/config.py index 97ddde7ca..fd1e96a92 100644 --- a/plugins/Later/config.py +++ b/plugins/Later/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Later') def configure(advanced): # This will be called by setup.py to configure this module. Advanced is @@ -40,10 +42,11 @@ def configure(advanced): Later = conf.registerPlugin('Later') conf.registerGlobalValue(Later, 'maximum', - registry.NonNegativeInteger(0, """Determines the maximum number of messages - to be queued for a user. If this value is 0, there is no maximum.""")) + registry.NonNegativeInteger(0, _("""Determines the maximum number of + messages to be queued for a user. If this value is 0, there is no maximum. + """))) conf.registerGlobalValue(Later, 'private', - registry.Boolean(True, """Determines whether users will be notified in the - first place in which they're seen, or in private.""")) + registry.Boolean(True, _("""Determines whether users will be notified in + the first place in which they're seen, or in private."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Later/locale/fr.po b/plugins/Later/locale/fr.po new file mode 100644 index 000000000..b03053f05 --- /dev/null +++ b/plugins/Later/locale/fr.po @@ -0,0 +1,108 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-28 16:15+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:45 +msgid "" +"Determines the maximum number of\n" +" messages to be queued for a user. If this value is 0, there is no maximum.\n" +" " +msgstr "Détermine le nombre maximum de messages en attente d'un utilisateur. Si la valeur est 0, il n'y a pas de maximum" + +#: config.py:49 +msgid "" +"Determines whether users will be notified in\n" +" the first place in which they're seen, or in private." +msgstr "Détermine si les utilisateurs seront notifiés au premier endroit où ils sont vus, ou en privé." + +#: plugin.py:46 +msgid "" +"Used to do things later; currently, it only allows the sending of\n" +" nick-based notes. Do note (haha!) that these notes are *not* private\n" +" and don't even pretend to be; if you want such features, consider using the\n" +" Note plugin." +msgstr "Utilisé pour faire des choses plus tard ; actuellement, il n'autorise que les notes basées sur des nicks. Notez (haha !) que ces notes ne sont *pas* privées, et qu'elle ne sont pas conçues pour l'être ; si vous voulez une telle fonctionnalité, utilisez le plugin Note." + +#: plugin.py:84 +msgid "%s ago" +msgstr "il y a %s" + +#: plugin.py:86 +msgid "just now" +msgstr "à l'instant" + +#: plugin.py:107 +msgid "" +" \n" +"\n" +" Tells the next time is in seen. can\n" +" contain wildcard characters, and the first matching nick will be\n" +" given the note.\n" +" " +msgstr "" +" \n" +"\n" +"Dit le à la prochaine fois qu'il est vu. peut contenir des jokers, et le premier nick correspondant recevra la note." + +#: plugin.py:114 +msgid "I can't send notes to myself." +msgstr "Je ne peux m'envoyer de notes à moi-même." + +#: plugin.py:120 +msgid "That person's message queue is already full." +msgstr "La file d'attente des messages de cette personne est déjà pleine." + +#: plugin.py:125 +msgid "" +"[]\n" +"\n" +" If is given, replies with what notes are waiting on ,\n" +" otherwise, replies with the nicks that have notes waiting for them.\n" +" " +msgstr "" +"[]\n" +"\n" +"Si le est donné, répond avec les notes en attente pour ; sinon, répond avec les nicks ayant des notes en attente." + +#: plugin.py:136 +msgid "I have no notes for that nick." +msgstr "Je n'ai pas de note pour ce nick." + +#: plugin.py:141 +msgid "I currently have notes waiting for %L." +msgstr "J'ai actuellement des notes en attente pour %L." + +#: plugin.py:144 +msgid "I have no notes waiting to be delivered." +msgstr "Je n'ai pas de note à délivrer." + +#: plugin.py:149 +msgid "" +"\n" +"\n" +" Removes the notes waiting on .\n" +" " +msgstr "" +"\n" +"\n" +"Supprime les notes en attente pour ." + +#: plugin.py:158 +msgid "There were no notes for %r" +msgstr "Il n'y a pas de note pour %r" + +#: plugin.py:182 +msgid "Sent %s: <%s> %s" +msgstr "Envoyé le %s : <%s> %s" + diff --git a/plugins/Later/messages.pot b/plugins/Later/messages.pot new file mode 100644 index 000000000..1e4023bc7 --- /dev/null +++ b/plugins/Later/messages.pot @@ -0,0 +1,105 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-28 16:15+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:45 +msgid "" +"Determines the maximum number of\n" +" messages to be queued for a user. If this value is 0, there is no maximum.\n" +" " +msgstr "" + +#: config.py:49 +msgid "" +"Determines whether users will be notified in\n" +" the first place in which they're seen, or in private." +msgstr "" + +#: plugin.py:46 +#, docstring +msgid "" +"Used to do things later; currently, it only allows the sending of\n" +" nick-based notes. Do note (haha!) that these notes are *not* private\n" +" and don't even pretend to be; if you want such features, consider using the\n" +" Note plugin." +msgstr "" + +#: plugin.py:84 +msgid "%s ago" +msgstr "" + +#: plugin.py:86 +msgid "just now" +msgstr "" + +#: plugin.py:107 +#, docstring +msgid "" +" \n" +"\n" +" Tells the next time is in seen. can\n" +" contain wildcard characters, and the first matching nick will be\n" +" given the note.\n" +" " +msgstr "" + +#: plugin.py:114 +msgid "I can't send notes to myself." +msgstr "" + +#: plugin.py:120 +msgid "That person's message queue is already full." +msgstr "" + +#: plugin.py:125 +#, docstring +msgid "" +"[]\n" +"\n" +" If is given, replies with what notes are waiting on ,\n" +" otherwise, replies with the nicks that have notes waiting for them.\n" +" " +msgstr "" + +#: plugin.py:136 +msgid "I have no notes for that nick." +msgstr "" + +#: plugin.py:141 +msgid "I currently have notes waiting for %L." +msgstr "" + +#: plugin.py:144 +msgid "I have no notes waiting to be delivered." +msgstr "" + +#: plugin.py:149 +#, docstring +msgid "" +"\n" +"\n" +" Removes the notes waiting on .\n" +" " +msgstr "" + +#: plugin.py:158 +msgid "There were no notes for %r" +msgstr "" + +#: plugin.py:182 +msgid "Sent %s: <%s> %s" +msgstr "" + diff --git a/plugins/Later/plugin.py b/plugins/Later/plugin.py index 3babf6365..b382559af 100644 --- a/plugins/Later/plugin.py +++ b/plugins/Later/plugin.py @@ -38,6 +38,8 @@ from supybot.commands import * import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Later') class Later(callbacks.Plugin): @@ -79,9 +81,9 @@ class Later(callbacks.Plugin): #format = conf.supybot.reply.format.time() diff = time.time() - when try: - return utils.timeElapsed(diff, seconds=False) + ' ago' + return _('%s ago') % utils.timeElapsed(diff, seconds=False) except ValueError: - return 'just now' + return _('just now') def _addNote(self, nick, whence, text, at=None, maximum=None): if at is None: @@ -100,6 +102,7 @@ class Later(callbacks.Plugin): self.wildcards.append(nick) self._flushNotes() + @internationalizeDocstring def tell(self, irc, msg, args, nick, text): """ @@ -108,15 +111,16 @@ class Later(callbacks.Plugin): given the note. """ if ircutils.strEqual(nick, irc.nick): - irc.error('I can\'t send notes to myself.') + irc.error(_('I can\'t send notes to myself.')) return try: self._addNote(nick, msg.nick, text) irc.replySuccess() except ValueError: - irc.error('That person\'s message queue is already full.') + irc.error(_('That person\'s message queue is already full.')) tell = wrap(tell, ['something', 'text']) + @internationalizeDocstring def notes(self, irc, msg, args, nick): """[] @@ -129,17 +133,18 @@ class Later(callbacks.Plugin): for (when, whence, note) in self._notes[nick]] irc.reply(format('%L', notes)) else: - irc.error('I have no notes for that nick.') + irc.error(_('I have no notes for that nick.')) else: nicks = self._notes.keys() if nicks: utils.sortBy(ircutils.toLower, nicks) - irc.reply(format('I currently have notes waiting for %L.', + irc.reply(format(_('I currently have notes waiting for %L.'), nicks)) else: - irc.error('I have no notes waiting to be delivered.') + irc.error(_('I have no notes waiting to be delivered.')) notes = wrap(notes, [additional('something')]) + @internationalizeDocstring def remove(self, irc, msg, args, nick): """ @@ -150,7 +155,7 @@ class Later(callbacks.Plugin): self._flushNotes() irc.replySuccess() except KeyError: - irc.error('There were no notes for %r' % nick) + irc.error(_('There were no notes for %r') % nick) remove = wrap(remove, [('checkCapability', 'admin'), 'something']) def doPrivmsg(self, irc, msg): @@ -174,8 +179,8 @@ class Later(callbacks.Plugin): self._flushNotes() def _formatNote(self, when, whence, note): - return 'Sent %s: <%s> %s' % (self._timestamp(when), whence, note) - + return _('Sent %s: <%s> %s') % (self._timestamp(when), whence, note) +Later = internationalizeDocstring(Later) Class = Later diff --git a/plugins/Limiter/config.py b/plugins/Limiter/config.py index a28f8a5b4..64905d240 100644 --- a/plugins/Limiter/config.py +++ b/plugins/Limiter/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Limiter') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -41,17 +43,17 @@ def configure(advanced): Limiter = conf.registerPlugin('Limiter') conf.registerChannelValue(Limiter, 'enable', - registry.Boolean(False, """Determines whether the bot will maintain the + registry.Boolean(False, _("""Determines whether the bot will maintain the channel limit to be slightly above the current number of people in the - channel, in order to make clone/drone attacks harder.""")) + channel, in order to make clone/drone attacks harder."""))) conf.registerChannelValue(Limiter, 'minimumExcess', - registry.PositiveInteger(5, """Determines the minimum number of free + registry.PositiveInteger(5, _("""Determines the minimum number of free spots that will be saved when limits are being enforced. This should - always be smaller than supybot.plugins.Limiter.limit.maximumExcess.""")) + always be smaller than supybot.plugins.Limiter.limit.maximumExcess."""))) conf.registerChannelValue(Limiter, 'maximumExcess', - registry.PositiveInteger(10, """Determines the maximum number of free spots + registry.PositiveInteger(10, _("""Determines the maximum number of free spots that will be saved when limits are being enforced. This should always be - larger than supybot.plugins.Limiter.limit.minimumExcess.""")) + larger than supybot.plugins.Limiter.limit.minimumExcess."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Limiter/locale/fr.po b/plugins/Limiter/locale/fr.po new file mode 100644 index 000000000..317f2c157 --- /dev/null +++ b/plugins/Limiter/locale/fr.po @@ -0,0 +1,47 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 15:35+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:46 +msgid "" +"Determines whether the bot will maintain the\n" +" channel limit to be slightly above the current number of people in the\n" +" channel, in order to make clone/drone attacks harder." +msgstr "Détermine si le bot maintiendra la limite de canal pour être juste au-dessus du nombre actuel de personnes, pour rendre les attaques de clones plus difficiles" + +#: config.py:50 +msgid "" +"Determines the minimum number of free\n" +" spots that will be saved when limits are being enforced. This should\n" +" always be smaller than supybot.plugins.Limiter.limit.maximumExcess." +msgstr "Détermine le nombre minimum de 'places' libres à avoir, c'est à dire que la limite sera changées lorsque ce nombre sera atteint. Ce doit toujours être plus petit que supybot.plugins.Limiter.limit.maximumExcess." + +#: config.py:54 +msgid "" +"Determines the maximum number of free spots\n" +" that will be saved when limits are being enforced. This should always be\n" +" larger than supybot.plugins.Limiter.limit.minimumExcess." +msgstr "Détermine le nombre maximum de 'places' libre, c'est à dire le nombre de place qu'il y aura juste après chaque changement de limite. Ce doit toujours être plus grand que supybot.plugins.Limiter.limit.minimumExcess." + +#: plugin.py:40 +msgid "" +"In order to use this plugin, its config values need to be properly\n" +" setup. supybot.plugins.Limiter.enable needs to be set to True and\n" +" supybot.plugins.Limiter.{maximumExcess,minimumExcess} should be set to\n" +" values appropriate to your channel (if the defaults aren't satisfactory.\n" +" Once these are set, and someone enters/leaves the channel, Supybot will\n" +" start setting the proper +l modes.\n" +" " +msgstr "Pour utiliser ce plugin, ses variables de configuration doivent être configurées proprement. supybot.plugins.Limiter.enable doit être défini à True, et supybot.plugins.Limiter.{maximumExcess,minimumExcess} doivent être définis à la valeur appropriée piur votre canal (si les valeurs par défaut ne satisfont pas). Une fois qu'elles sont définies, et que quelqu'un entrera/partira du canal, Supybot commencera à définir les modes +l." + diff --git a/plugins/Limiter/messages.pot b/plugins/Limiter/messages.pot new file mode 100644 index 000000000..4ec916ea3 --- /dev/null +++ b/plugins/Limiter/messages.pot @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 15:35+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "" +"Determines whether the bot will maintain the\n" +" channel limit to be slightly above the current number of people in the\n" +" channel, in order to make clone/drone attacks harder." +msgstr "" + +#: config.py:50 +msgid "" +"Determines the minimum number of free\n" +" spots that will be saved when limits are being enforced. This should\n" +" always be smaller than supybot.plugins.Limiter.limit.maximumExcess." +msgstr "" + +#: config.py:54 +msgid "" +"Determines the maximum number of free spots\n" +" that will be saved when limits are being enforced. This should always be\n" +" larger than supybot.plugins.Limiter.limit.minimumExcess." +msgstr "" + +#: plugin.py:40 +#, docstring +msgid "" +"In order to use this plugin, its config values need to be properly\n" +" setup. supybot.plugins.Limiter.enable needs to be set to True and\n" +" supybot.plugins.Limiter.{maximumExcess,minimumExcess} should be set to\n" +" values appropriate to your channel (if the defaults aren't satisfactory.\n" +" Once these are set, and someone enters/leaves the channel, Supybot will\n" +" start setting the proper +l modes.\n" +" " +msgstr "" + diff --git a/plugins/Limiter/plugin.py b/plugins/Limiter/plugin.py index c3e02cc11..22a31df0a 100644 --- a/plugins/Limiter/plugin.py +++ b/plugins/Limiter/plugin.py @@ -32,7 +32,8 @@ from supybot.commands import * import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks - +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Limiter') class Limiter(callbacks.Plugin): """In order to use this plugin, its config values need to be properly @@ -68,7 +69,7 @@ class Limiter(callbacks.Plugin): def doQuit(self, irc, msg): for channel in irc.state.channels: self._enforceLimit(irc, channel) - +Limiter = internationalizeDocstring(Limiter) Class = Limiter diff --git a/plugins/Math/config.py b/plugins/Math/config.py index 73e68ffeb..db6474c78 100644 --- a/plugins/Math/config.py +++ b/plugins/Math/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Math') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,7 +44,7 @@ def configure(advanced): Math = conf.registerPlugin('Math') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Math, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Math/locale/fr.po b/plugins/Math/locale/fr.po new file mode 100644 index 000000000..b1ccc0315 --- /dev/null +++ b/plugins/Math/locale/fr.po @@ -0,0 +1,142 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 15:35+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:52 +msgid "" +" [] \n" +"\n" +" Converts from base to base .\n" +" If is left out, it converts to decimal.\n" +" " +msgstr "" +" [] \n" +"\n" +"Converti le nombre d'une base à l'autre. La seconde base est la décimale par défaut." + +#: plugin.py:63 +msgid "Invalid for base %s: %s" +msgstr "Nombre invalide pour la base %s : %s" + +#: plugin.py:69 +msgid "Convert a decimal number to another base; returns a string." +msgstr "Converti un nombre décimal dans une autre base, retourne une chaîne." + +#: plugin.py:90 +msgid "" +"Convert a number from any base, 2 through 36, to any other\n" +" base, 2 through 36. Returns a string." +msgstr "Convertir un nombre de n'import quelle base, de 2 à 36, à n'importe quelle base, de 2 à 36." + +#: plugin.py:157 +msgid "" +"\n" +"\n" +" Returns the value of the evaluated . The syntax is\n" +" Python syntax; the type of arithmetic is floating point. Floating\n" +" point arithmetic is used in order to prevent a user from being able to\n" +" crash to the bot with something like '10**10**10**10'. One consequence\n" +" is that large values such as '10**24' might not be exact.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne la valeur de l' évaluée. La syntaxe est celle de Python ; le calcul est à virgule flottante. Les calculs à virgule flottante sont utilisés pour enmpêcher l'utilisateur de faire crasher le bot avec quelque chose du genre '10**10**10**10'. L'une des conséquences est que les grandes valeurs commandes '10**24' peuvent ne pas être exactes." + +#: plugin.py:166 +#: plugin.py:220 +msgid "There's really no reason why you should have underscores or brackets in your mathematical expression. Please remove them." +msgstr "Il n'y a aucune réelle raison que vous mettiez des underscores ou des crochets dans vos expressions mathématiques. Merci de les retirer." + +#: plugin.py:172 +#: plugin.py:228 +msgid "You can't use lambda in this command." +msgstr "Vous ne pouvez utiliser lambda dans cette commande." + +#: plugin.py:202 +#: plugin.py:236 +msgid "The answer exceeded %s or so." +msgstr "La réponse dépacer %s." + +#: plugin.py:204 +#: plugin.py:238 +msgid "Something in there wasn't a valid number." +msgstr "Quelque chose là-dedans n'est pas un nombre valide" + +#: plugin.py:206 +#: plugin.py:240 +msgid "%s is not a defined function." +msgstr "%s n'est pas une fonction définie" + +#: plugin.py:213 +msgid "" +"\n" +"\n" +" This is the same as the calc command except that it allows integer\n" +" math, and can thus cause the bot to suck up CPU. Hence it requires\n" +" the 'trusted' capability to use.\n" +" " +msgstr "" +"\n" +"\n" +"Cette commande est la même que la commande 'calc', excepté qu'elle utilise des mathématiques entières, ce qui peut causer une surconsommation de CPU de la part du bot. C'est pourquoi elle requiert la capacité 'trusted'." + +#: plugin.py:250 +msgid "" +"\n" +"\n" +" Returns the value of an RPN expression.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne la valeur de l'expression mathématique NPI." + +#: plugin.py:275 +msgid "Not enough arguments for %s" +msgstr "Pas assez d'arguments pour %s." + +#: plugin.py:288 +msgid "%q is not a defined function." +msgstr "%q n'est pas une fonction définie." + +#: plugin.py:295 +msgid "Stack: [%s]" +msgstr "Pile : [%s]" + +#: plugin.py:299 +msgid "" +"[] to \n" +"\n" +" Converts from to . If number isn't given, it\n" +" defaults to 1. For unit information, see 'units' command.\n" +" " +msgstr "" +"[] to \n" +"\n" +"Convertit de l' à l'. Si le nombre n'est pas donné, il vaut 1 par défaut. Pour plus d'informations sur les unités, utilisez la commande 'units'." + +#: plugin.py:314 +msgid "" +" []\n" +"\n" +" With no arguments, returns a list of measurement types, which can be\n" +" passed as arguments. When called with a type as an argument, returns\n" +" the units of that type.\n" +" " +msgstr "" +"[]\n" +"\n" +"Sans argument, retourne la liste des types de mesures, qui peuvent être passés en argument. Lors de l'appel avec un argument, retourne les unités de chaque type." + diff --git a/plugins/Math/messages.pot b/plugins/Math/messages.pot new file mode 100644 index 000000000..9f2932cc0 --- /dev/null +++ b/plugins/Math/messages.pot @@ -0,0 +1,129 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 15:35+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:52 +#, docstring +msgid "" +" [] \n" +"\n" +" Converts from base to base .\n" +" If is left out, it converts to decimal.\n" +" " +msgstr "" + +#: plugin.py:63 +msgid "Invalid for base %s: %s" +msgstr "" + +#: plugin.py:69 +#, docstring +msgid "Convert a decimal number to another base; returns a string." +msgstr "" + +#: plugin.py:90 +#, docstring +msgid "" +"Convert a number from any base, 2 through 36, to any other\n" +" base, 2 through 36. Returns a string." +msgstr "" + +#: plugin.py:157 +#, docstring +msgid "" +"\n" +"\n" +" Returns the value of the evaluated . The syntax is\n" +" Python syntax; the type of arithmetic is floating point. Floating\n" +" point arithmetic is used in order to prevent a user from being able to\n" +" crash to the bot with something like '10**10**10**10'. One consequence\n" +" is that large values such as '10**24' might not be exact.\n" +" " +msgstr "" + +#: plugin.py:166 plugin.py:220 +msgid "There's really no reason why you should have underscores or brackets in your mathematical expression. Please remove them." +msgstr "" + +#: plugin.py:172 plugin.py:228 +msgid "You can't use lambda in this command." +msgstr "" + +#: plugin.py:202 plugin.py:236 +msgid "The answer exceeded %s or so." +msgstr "" + +#: plugin.py:204 plugin.py:238 +msgid "Something in there wasn't a valid number." +msgstr "" + +#: plugin.py:206 plugin.py:240 +msgid "%s is not a defined function." +msgstr "" + +#: plugin.py:213 +#, docstring +msgid "" +"\n" +"\n" +" This is the same as the calc command except that it allows integer\n" +" math, and can thus cause the bot to suck up CPU. Hence it requires\n" +" the 'trusted' capability to use.\n" +" " +msgstr "" + +#: plugin.py:250 +#, docstring +msgid "" +"\n" +"\n" +" Returns the value of an RPN expression.\n" +" " +msgstr "" + +#: plugin.py:275 +msgid "Not enough arguments for %s" +msgstr "" + +#: plugin.py:288 +msgid "%q is not a defined function." +msgstr "" + +#: plugin.py:295 +msgid "Stack: [%s]" +msgstr "" + +#: plugin.py:299 +#, docstring +msgid "" +"[] to \n" +"\n" +" Converts from to . If number isn't given, it\n" +" defaults to 1. For unit information, see 'units' command.\n" +" " +msgstr "" + +#: plugin.py:314 +#, docstring +msgid "" +" []\n" +"\n" +" With no arguments, returns a list of measurement types, which can be\n" +" passed as arguments. When called with a type as an argument, returns\n" +" the units of that type.\n" +" " +msgstr "" + diff --git a/plugins/Math/plugin.py b/plugins/Math/plugin.py index d3bb5aeb0..683b9c709 100644 --- a/plugins/Math/plugin.py +++ b/plugins/Math/plugin.py @@ -39,12 +39,15 @@ import string import supybot.utils as utils from supybot.commands import * import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Math') convertcore = utils.python.universalImport('local.convertcore') baseArg = ('int', 'base', lambda i: i <= 36) class Math(callbacks.Plugin): + @internationalizeDocstring def base(self, irc, msg, args, frm, to, number): """ [] @@ -57,7 +60,7 @@ class Math(callbacks.Plugin): try: irc.reply(self._convertBaseToBase(number, to, frm)) except ValueError: - irc.error('Invalid for base %s: %s' % (frm, number)) + irc.error(_('Invalid for base %s: %s') % (frm, number)) base = wrap(base, [('int', 'base', lambda i: 2 <= i <= 36), optional(('int', 'base', lambda i: 2 <= i <= 36), 10), additional('something')]) @@ -149,6 +152,7 @@ class Math(callbacks.Plugin): # Then we delete all square brackets, underscores, and whitespace, so no # one can do list comprehensions or call __...__ functions. ### + @internationalizeDocstring def calc(self, irc, msg, args, text): """ @@ -159,13 +163,13 @@ class Math(callbacks.Plugin): is that large values such as '10**24' might not be exact. """ if text != text.translate(utils.str.chars, '_[]'): - irc.error('There\'s really no reason why you should have ' + irc.error(_('There\'s really no reason why you should have ' 'underscores or brackets in your mathematical ' - 'expression. Please remove them.') + 'expression. Please remove them.')) return #text = text.translate(utils.str.chars, '_[] \t') if 'lambda' in text: - irc.error('You can\'t use lambda in this command.') + irc.error(_('You can\'t use lambda in this command.')) return text = text.lower() def handleMatch(m): @@ -195,15 +199,16 @@ class Math(callbacks.Plugin): irc.reply(self._complexToString(x)) except OverflowError: maxFloat = math.ldexp(0.9999999999999999, 1024) - irc.error('The answer exceeded %s or so.' % maxFloat) + irc.error(_('The answer exceeded %s or so.') % maxFloat) except TypeError: - irc.error('Something in there wasn\'t a valid number.') + irc.error(_('Something in there wasn\'t a valid number.')) except NameError, e: - irc.error('%s is not a defined function.' % str(e).split()[1]) + irc.error(_('%s is not a defined function.') % str(e).split()[1]) except Exception, e: irc.error(str(e)) calc = wrap(calc, ['text']) + @internationalizeDocstring def icalc(self, irc, msg, args, text): """ @@ -212,15 +217,15 @@ class Math(callbacks.Plugin): the 'trusted' capability to use. """ if text != text.translate(utils.str.chars, '_[]'): - irc.error('There\'s really no reason why you should have ' + irc.error(_('There\'s really no reason why you should have ' 'underscores or brackets in your mathematical ' - 'expression. Please remove them.') + 'expression. Please remove them.')) return # This removes spaces, too, but we'll leave the removal of _[] for # safety's sake. text = text.translate(utils.str.chars, '_[] \t') if 'lambda' in text: - irc.error('You can\'t use lambda in this command.') + irc.error(_('You can\'t use lambda in this command.')) return text = text.replace('lambda', '') try: @@ -228,11 +233,11 @@ class Math(callbacks.Plugin): irc.reply(str(eval(text, self._mathEnv, self._mathEnv))) except OverflowError: maxFloat = math.ldexp(0.9999999999999999, 1024) - irc.error('The answer exceeded %s or so.' % maxFloat) + irc.error(_('The answer exceeded %s or so.') % maxFloat) except TypeError: - irc.error('Something in there wasn\'t a valid number.') + irc.error(_('Something in there wasn\'t a valid number.')) except NameError, e: - irc.error('%s is not a defined function.' % str(e).split()[1]) + irc.error(_('%s is not a defined function.') % str(e).split()[1]) except Exception, e: irc.error(utils.exnToString(e)) icalc = wrap(icalc, [('checkCapability', 'trusted'), 'text']) @@ -267,7 +272,7 @@ class Math(callbacks.Plugin): except TypeError: pass if not called: - irc.error('Not enough arguments for %s' % arg) + irc.error(_('Not enough arguments for %s') % arg) return else: stack.append(f) @@ -280,14 +285,16 @@ class Math(callbacks.Plugin): try: stack.append(eval(s, self._mathEnv, self._mathEnv)) except SyntaxError: - irc.error(format('%q is not a defined function.', arg)) + irc.error(format(_('%q is not a defined function.'), + arg)) return if len(stack) == 1: irc.reply(str(self._complexToString(complex(stack[0])))) else: s = ', '.join(map(self._complexToString, map(complex, stack))) - irc.reply('Stack: [%s]' % s) + irc.reply(_('Stack: [%s]') % s) + @internationalizeDocstring def convert(self, irc, msg, args, number, unit1, unit2): """[] to @@ -302,6 +309,7 @@ class Math(callbacks.Plugin): irc.error(str(ude)) convert = wrap(convert, [optional('float', 1.0),'something','to','text']) + @internationalizeDocstring def units(self, irc, msg, args, type): """ [] diff --git a/plugins/Misc/config.py b/plugins/Misc/config.py index 57c4dada5..f1c4dc19e 100644 --- a/plugins/Misc/config.py +++ b/plugins/Misc/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Misc') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -40,24 +42,24 @@ def configure(advanced): Misc = conf.registerPlugin('Misc') conf.registerGlobalValue(Misc, 'listPrivatePlugins', - registry.Boolean(True, """Determines whether the bot will list private + registry.Boolean(True, _("""Determines whether the bot will list private plugins with the list command if given the --private switch. If this is disabled, non-owner users should be unable to see what private plugins - are loaded.""")) + are loaded."""))) conf.registerGlobalValue(Misc, 'timestampFormat', - registry.String('[%H:%M:%S]', """Determines the format string for + registry.String('[%H:%M:%S]', _("""Determines the format string for timestamps in the Misc.last command. Refer to the Python documentation for the time module to see what formats are accepted. If you set this - variable to the empty string, the timestamp will not be shown.""")) + variable to the empty string, the timestamp will not be shown."""))) conf.registerGroup(Misc, 'last') conf.registerGroup(Misc.last, 'nested') conf.registerChannelValue(Misc.last.nested, - 'includeTimestamp', registry.Boolean(False, """Determines whether or not + 'includeTimestamp', registry.Boolean(False, _("""Determines whether or not the timestamp will be included in the output of last when it is part of a - nested command""")) + nested command"""))) conf.registerChannelValue(Misc.last.nested, - 'includeNick', registry.Boolean(False, """Determines whether or not the + 'includeNick', registry.Boolean(False, _("""Determines whether or not the nick will be included in the output of last when it is part of a nested - command""")) + command"""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Misc/locale/fr.po b/plugins/Misc/locale/fr.po new file mode 100644 index 000000000..521275059 --- /dev/null +++ b/plugins/Misc/locale/fr.po @@ -0,0 +1,246 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 15:35+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:45 +msgid "" +"Determines whether the bot will list private\n" +" plugins with the list command if given the --private switch. If this is\n" +" disabled, non-owner users should be unable to see what private plugins\n" +" are loaded." +msgstr "Détermine si le bot listera les plugins privés dans la commande 'list', si l'option --private est donné. Si cette variable est désactivée, les utilisateurs non-owner ne pourront pas voir quels plugins privés sont chargés." + +#: config.py:50 +msgid "" +"Determines the format string for\n" +" timestamps in the Misc.last command. Refer to the Python documentation\n" +" for the time module to see what formats are accepted. If you set this\n" +" variable to the empty string, the timestamp will not be shown." +msgstr "Détermine la chaîne de formattage pour les timestamps de la commande Misc.last. Référez-vous à la documentation de Python sur le module 'time' pour voir quels formats sont acceptés. Si vous définissez cette variable pour être une chaîne vide, le timestamp ne sera pas affiché." + +#: config.py:57 +msgid "" +"Determines whether or not\n" +" the timestamp will be included in the output of last when it is part of a\n" +" nested command" +msgstr "Détermine si le timestamp sera inclu dans la sortie de 'last' lorsqu'il est dans une commande imbriquée." + +#: config.py:61 +msgid "" +"Determines whether or not the\n" +" nick will be included in the output of last when it is part of a nested\n" +" command" +msgstr "Détermine si le nick est inclu dans la sortie de 'last' lorsqu'il est dans une commande imbriquée." + +#: plugin.py:81 +msgid "You've given me %s invalid commands within the last minute; I'm now ignoring you for %s." +msgstr "Vous m'avez donné %s commandes invalides dans la dernière minute, je vous ignore maitenant pendant %s." + +#: plugin.py:93 +msgid "The %q plugin is loaded, but there is no command named %q in it. Try \"list %s\" to see the commands in the %q plugin." +msgstr "Le plugin %q est chargé, mais il n'a pas de commande appelée %q. Essayez \"list %s\" pour voir les commandes dans le plugin %q." + +#: plugin.py:119 +msgid "" +"[--private] []\n" +"\n" +" Lists the commands available in the given plugin. If no plugin is\n" +" given, lists the public plugins available. If --private is given,\n" +" lists the private plugins.\n" +" " +msgstr "" +"[--private] []\n" +"\n" +"Liste les commandes disponibles dans le plugin donné. Si aucun plugin n'est donné, liste les plugins publics. Si --private est donné, il liste les plugins privés." + +#: plugin.py:144 +msgid "There are no private plugins." +msgstr "Il n'y a pas de plugin privé." + +#: plugin.py:146 +msgid "There are no public plugins." +msgstr "Il n'y a pas de plugin privé." + +#: plugin.py:153 +msgid "That plugin exists, but has no commands. This probably means that it has some configuration variables that can be changed in order to modify its behavior. Try \"config list supybot.plugins.%s\" to see what configuration variables it has." +msgstr "Ce plugin existe, mais n'a pas de commande. Cela signifie probablement qu'il a des variables de configuration qui peuvent être changés pour modifier son comportement. Essayez \"config list supybot.plugins.%s\" pour voir quelles variables de configuration il a." + +#: plugin.py:164 +msgid "" +"\n" +"\n" +" Searches for in the commands currently offered by the bot,\n" +" returning a list of the commands containing that string.\n" +" " +msgstr "" +"\n" +"\n" +"Recherche la dans les commandes actuellement fournies par le bot et retourne une list des commandes contenant cette chaîne." + +#: plugin.py:183 +msgid "No appropriate commands were found." +msgstr "Aucune commande appropriée n'a été trouvée." + +#: plugin.py:188 +msgid "" +"[] []\n" +"\n" +" This command gives a useful description of what does.\n" +" is only necessary if the command is in more than one plugin.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Cette commande donne une description utilie de ce que fait la . n'est nécessaire que si la commande est présente dans plus d'un plugin." + +#: plugin.py:198 +msgid "That command exists in the %L plugins. Please specify exactly which plugin command you want help with." +msgstr "Cette commande existe dans les plugins %L. Veuillez spécifier dans quel plugin se trouve la commande pour laquelle vous cherchez de l'aide." + +#: plugin.py:205 +msgid "There is no command %q." +msgstr "Il n'y a pas de commande %q." + +#: plugin.py:211 +msgid "" +"takes no arguments\n" +"\n" +" Returns the version of the current bot.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne la version actuelle du bot" + +#: plugin.py:217 +msgid "The newest version available online is %s." +msgstr "La dernière version disponible en ligne est %s." + +#: plugin.py:221 +msgid "I couldn't fetch the newest version from the Supybot website." +msgstr "Je ne peux récupérer la dernière version sur le site de Supybot." + +#: plugin.py:223 +msgid "The current (running) version of this Supybot is %s. %s" +msgstr "La version de ce Supybot est %s. %s" + +#: plugin.py:230 +msgid "" +"takes no arguments\n" +"\n" +" Returns a URL saying where to get Supybot.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne une URL disant où trouver Supybot." + +#: plugin.py:234 +msgid "My source is at http://supybot.com/" +msgstr "Ma source est disponible sur http://supybot.com/" + +#: plugin.py:239 +msgid "" +"[]\n" +"\n" +" If the last command was truncated due to IRC message length\n" +" limitations, returns the next chunk of the result of the last command.\n" +" If is given, it takes the continuation of the last command from\n" +" instead of the person sending this message.\n" +" " +msgstr "" +"[]\n" +"\n" +"Si la dernière commande était tronquée par les limitations de taille des messages sur IRC, retourne le morceau suivant résultant de la dernière commande. Si le est donné, continue la dernière commande du plutôt que de la personne envoyant ce message." + +#: plugin.py:253 +msgid "%s has no public mores." +msgstr "%s n'a pas de 'more' public." + +#: plugin.py:256 +msgid "Sorry, I can't find any mores for %s" +msgstr "Désolé, je ne peux trouver de 'more' pour %s" + +#: plugin.py:265 +msgid "You haven't asked me a command; perhaps you want to see someone else's more. To do so, call this command with that person's nick." +msgstr "Vous ne m'avez donné aucune commande. Peut-être que vous voulez voir celle de quelqu'un d'autre. Pour cela, appelez cette commande en ajoutant le nick de cette personne." + +#: plugin.py:269 +msgid "That's all, there is no more." +msgstr "C'est tout, il n'y a plus de 'more'" + +#: plugin.py:279 +msgid "" +"[--{from,in,on,with,without,regexp} ] [--nolimit]\n" +"\n" +" Returns the last message matching the given criteria. --from requires\n" +" a nick from whom the message came; --in requires a channel the message\n" +" was sent to; --on requires a network the message was sent on; --with\n" +" requires some string that had to be in the message; --regexp requires\n" +" a regular expression the message must match; --nolimit returns all\n" +" the messages that can be found. By default, the channel this command is\n" +" given in is searched.\n" +" " +msgstr "" +"[--{from,in,on,with,without,regexp} ] [--nolimit]\n" +"\n" +"Retourne le dernier message correspondant aux critères donnés. --from requiert le nick de la personne qui a envoyé le message ; --in requiert le canal sur lequel a été envoyé le message ; --with requiert une chaîne qui doit être dans le message --regexp requiert une expression régulière à laquelle le message doit correspondre ; --nolimit retourne tous les messages qui peuvent être trouvés. Par défaut, recherche dans les logs du canal sur lequel est envoyée cette commande." + +#: plugin.py:373 +msgid "I couldn't find a message matching that criteria in my history of %s messages." +msgstr "Je ne peux trovuer de message correspondant à ce critère dans mon historique de %s messages." + +#: plugin.py:388 +msgid "" +" \n" +"\n" +" Tells the whatever is. Use nested commands to your\n" +" benefit here.\n" +" " +msgstr "" +" \n" +"\n" +"Dit le au . Utile si vous utilisez des commandes imbriquées." + +#: plugin.py:396 +msgid "Dude, just give the command. No need for the tell." +msgstr "Mec, contentes-toi de me donner la commande. Pas besoin d'utiliser 'tell'." + +#: plugin.py:401 +msgid "You just told me, why should I tell myself?" +msgstr "Vous venez de me le dire, pourquoi devrais-je me le dire moi-même ?" + +#: plugin.py:406 +msgid "I haven't seen %s, I'll let you do the telling." +msgstr "Je n'ai pas vu %s, je vous laisse lui dire." + +#: plugin.py:411 +msgid "%s wants me to tell you: %s" +msgstr "%s veut que je vous dise : %s" + +#: plugin.py:417 +msgid "" +"takes no arguments\n" +"\n" +" Checks to see if the bot is alive.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Vérifie si le bot est encore en vie." + +#: plugin.py:421 +msgid "pong" +msgstr "pong" + diff --git a/plugins/Misc/messages.pot b/plugins/Misc/messages.pot new file mode 100644 index 000000000..59d3b15a6 --- /dev/null +++ b/plugins/Misc/messages.pot @@ -0,0 +1,230 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 15:35+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:45 +msgid "" +"Determines whether the bot will list private\n" +" plugins with the list command if given the --private switch. If this is\n" +" disabled, non-owner users should be unable to see what private plugins\n" +" are loaded." +msgstr "" + +#: config.py:50 +msgid "" +"Determines the format string for\n" +" timestamps in the Misc.last command. Refer to the Python documentation\n" +" for the time module to see what formats are accepted. If you set this\n" +" variable to the empty string, the timestamp will not be shown." +msgstr "" + +#: config.py:57 +msgid "" +"Determines whether or not\n" +" the timestamp will be included in the output of last when it is part of a\n" +" nested command" +msgstr "" + +#: config.py:61 +msgid "" +"Determines whether or not the\n" +" nick will be included in the output of last when it is part of a nested\n" +" command" +msgstr "" + +#: plugin.py:81 +msgid "You've given me %s invalid commands within the last minute; I'm now ignoring you for %s." +msgstr "" + +#: plugin.py:93 +msgid "The %q plugin is loaded, but there is no command named %q in it. Try \"list %s\" to see the commands in the %q plugin." +msgstr "" + +#: plugin.py:119 +#, docstring +msgid "" +"[--private] []\n" +"\n" +" Lists the commands available in the given plugin. If no plugin is\n" +" given, lists the public plugins available. If --private is given,\n" +" lists the private plugins.\n" +" " +msgstr "" + +#: plugin.py:144 +msgid "There are no private plugins." +msgstr "" + +#: plugin.py:146 +msgid "There are no public plugins." +msgstr "" + +#: plugin.py:153 +msgid "That plugin exists, but has no commands. This probably means that it has some configuration variables that can be changed in order to modify its behavior. Try \"config list supybot.plugins.%s\" to see what configuration variables it has." +msgstr "" + +#: plugin.py:164 +#, docstring +msgid "" +"\n" +"\n" +" Searches for in the commands currently offered by the bot,\n" +" returning a list of the commands containing that string.\n" +" " +msgstr "" + +#: plugin.py:183 +msgid "No appropriate commands were found." +msgstr "" + +#: plugin.py:188 +#, docstring +msgid "" +"[] []\n" +"\n" +" This command gives a useful description of what does.\n" +" is only necessary if the command is in more than one plugin.\n" +" " +msgstr "" + +#: plugin.py:198 +msgid "That command exists in the %L plugins. Please specify exactly which plugin command you want help with." +msgstr "" + +#: plugin.py:205 +msgid "There is no command %q." +msgstr "" + +#: plugin.py:211 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the version of the current bot.\n" +" " +msgstr "" + +#: plugin.py:217 +msgid "The newest version available online is %s." +msgstr "" + +#: plugin.py:221 +msgid "I couldn't fetch the newest version from the Supybot website." +msgstr "" + +#: plugin.py:223 +msgid "The current (running) version of this Supybot is %s. %s" +msgstr "" + +#: plugin.py:230 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns a URL saying where to get Supybot.\n" +" " +msgstr "" + +#: plugin.py:234 +msgid "My source is at http://supybot.com/" +msgstr "" + +#: plugin.py:239 +#, docstring +msgid "" +"[]\n" +"\n" +" If the last command was truncated due to IRC message length\n" +" limitations, returns the next chunk of the result of the last command.\n" +" If is given, it takes the continuation of the last command from\n" +" instead of the person sending this message.\n" +" " +msgstr "" + +#: plugin.py:253 +msgid "%s has no public mores." +msgstr "" + +#: plugin.py:256 +msgid "Sorry, I can't find any mores for %s" +msgstr "" + +#: plugin.py:265 +msgid "You haven't asked me a command; perhaps you want to see someone else's more. To do so, call this command with that person's nick." +msgstr "" + +#: plugin.py:269 +msgid "That's all, there is no more." +msgstr "" + +#: plugin.py:279 +#, docstring +msgid "" +"[--{from,in,on,with,without,regexp} ] [--nolimit]\n" +"\n" +" Returns the last message matching the given criteria. --from requires\n" +" a nick from whom the message came; --in requires a channel the message\n" +" was sent to; --on requires a network the message was sent on; --with\n" +" requires some string that had to be in the message; --regexp requires\n" +" a regular expression the message must match; --nolimit returns all\n" +" the messages that can be found. By default, the channel this command is\n" +" given in is searched.\n" +" " +msgstr "" + +#: plugin.py:373 +msgid "I couldn't find a message matching that criteria in my history of %s messages." +msgstr "" + +#: plugin.py:388 +#, docstring +msgid "" +" \n" +"\n" +" Tells the whatever is. Use nested commands to your\n" +" benefit here.\n" +" " +msgstr "" + +#: plugin.py:396 +msgid "Dude, just give the command. No need for the tell." +msgstr "" + +#: plugin.py:401 +msgid "You just told me, why should I tell myself?" +msgstr "" + +#: plugin.py:406 +msgid "I haven't seen %s, I'll let you do the telling." +msgstr "" + +#: plugin.py:411 +msgid "%s wants me to tell you: %s" +msgstr "" + +#: plugin.py:417 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Checks to see if the bot is alive.\n" +" " +msgstr "" + +#: plugin.py:421 +msgid "pong" +msgstr "" + diff --git a/plugins/Misc/plugin.py b/plugins/Misc/plugin.py index a1412f32e..4f9510148 100644 --- a/plugins/Misc/plugin.py +++ b/plugins/Misc/plugin.py @@ -42,8 +42,9 @@ import supybot.irclib as irclib import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks - from supybot.utils.iter import ifilter +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Misc') class Misc(callbacks.Plugin): def __init__(self, irc): @@ -76,8 +77,8 @@ class Misc(callbacks.Plugin): 'permanently.') ircdb.ignores.add(banmask, time.time() + punishment) if conf.supybot.abuse.flood.command.invalid.notify(): - irc.reply('You\'ve given me %s invalid commands within the last ' - 'minute; I\'m now ignoring you for %s.' % + irc.reply(_('You\'ve given me %s invalid commands within the last ' + 'minute; I\'m now ignoring you for %s.') % (maximum, utils.timeElapsed(punishment, seconds=False))) return @@ -88,10 +89,10 @@ class Misc(callbacks.Plugin): cb = irc.getCallback(tokens[0]) if cb: plugin = cb.name() - irc.error(format('The %q plugin is loaded, but there is ' + irc.error(format(_('The %q plugin is loaded, but there is ' 'no command named %q in it. Try "list ' '%s" to see the commands in the %q ' - 'plugin.', plugin, tokens[1], + 'plugin.'), plugin, tokens[1], plugin, plugin)) else: irc.errorInvalid('command', tokens[0], repr=False) @@ -112,6 +113,7 @@ class Misc(callbacks.Plugin): else: pass # Let's just do nothing, I can't think of better. + @internationalizeDocstring def list(self, irc, msg, args, optlist, cb): """[--private] [] @@ -138,24 +140,25 @@ class Misc(callbacks.Plugin): irc.reply(format('%L', names)) else: if private: - irc.reply('There are no private plugins.') + irc.reply(_('There are no private plugins.')) else: - irc.reply('There are no public plugins.') + irc.reply(_('There are no public plugins.')) else: commands = cb.listCommands() if commands: commands.sort() irc.reply(format('%L', commands)) else: - irc.reply(format('That plugin exists, but has no commands. ' + irc.reply(format(_('That plugin exists, but has no commands. ' 'This probably means that it has some ' 'configuration variables that can be ' 'changed in order to modify its behavior. ' 'Try "config list supybot.plugins.%s" to see ' - 'what configuration variables it has.', + 'what configuration variables it has.'), cb.name())) list = wrap(list, [getopts({'private':''}), additional('plugin')]) + @internationalizeDocstring def apropos(self, irc, msg, args, s): """ @@ -176,9 +179,10 @@ class Misc(callbacks.Plugin): L.sort() irc.reply(format('%L', L)) else: - irc.reply('No appropriate commands were found.') + irc.reply(_('No appropriate commands were found.')) apropos = wrap(apropos, ['lowered']) + @internationalizeDocstring def help(self, irc, msg, args, command): """[] [] @@ -190,17 +194,18 @@ class Misc(callbacks.Plugin): if maxL == command: if len(cbs) > 1: names = sorted([cb.name() for cb in cbs]) - irc.error(format('That command exists in the %L plugins. ' + irc.error(format(_('That command exists in the %L plugins. ' 'Please specify exactly which plugin command ' - 'you want help with.', names)) + 'you want help with.'), names)) else: assert cbs, 'Odd, maxL == command, but no cbs.' - irc.reply(cbs[0].getCommandHelp(command, False)) + irc.reply(_.__call__(cbs[0].getCommandHelp(command, False))) else: - irc.error(format('There is no command %q.', + irc.error(format(_('There is no command %q.'), callbacks.formatCommand(command))) help = wrap(help, [many('something')]) + @internationalizeDocstring def version(self, irc, msg, args): """takes no arguments @@ -208,24 +213,27 @@ class Misc(callbacks.Plugin): """ try: newest = utils.web.getUrl('http://supybot.sf.net/version.txt') - newest ='The newest version available online is %s.'%newest.strip() + newest = _('The newest version available online is %s.') % \ + newest.strip() except utils.web.Error, e: self.log.info('Couldn\'t get website version: %s', e) - newest = 'I couldn\'t fetch the newest version ' \ - 'from the Supybot website.' - s = 'The current (running) version of this Supybot is %s. %s' % \ + newest = _('I couldn\'t fetch the newest version ' + 'from the Supybot website.') + s = _('The current (running) version of this Supybot is %s. %s') % \ (conf.version, newest) irc.reply(s) version = wrap(thread(version)) + @internationalizeDocstring def source(self, irc, msg, args): """takes no arguments Returns a URL saying where to get Supybot. """ - irc.reply('My source is at http://supybot.com/') + irc.reply(_('My source is at http://supybot.com/')) source = wrap(source) + @internationalizeDocstring def more(self, irc, msg, args, nick): """[] @@ -241,23 +249,27 @@ class Misc(callbacks.Plugin): if not private: irc._mores[userHostmask] = L[:] else: - irc.error('%s has no public mores.' % nick) + irc.error(_('%s has no public mores.') % nick) return except KeyError: - irc.error('Sorry, I can\'t find any mores for %s' % nick) + irc.error(_('Sorry, I can\'t find any mores for %s') % nick) return try: L = irc._mores[userHostmask] chunk = L.pop() if L: - chunk += format(' \x02(%n)\x0F', (len(L), 'more', 'message')) + if len(L) < 2: + more = _('more message') + else: + more = _('more messages') + chunk += format(' \x02(%s)\x0F', more) irc.reply(chunk, True) except KeyError: - irc.error('You haven\'t asked me a command; perhaps you want ' + irc.error(_('You haven\'t asked me a command; perhaps you want ' 'to see someone else\'s more. To do so, call this ' - 'command with that person\'s nick.') + 'command with that person\'s nick.')) except IndexError: - irc.error('That\'s all, there is no more.') + irc.error(_('That\'s all, there is no more.')) more = wrap(more, [additional('seenNick')]) def _validLastMsg(self, msg): @@ -265,6 +277,7 @@ class Misc(callbacks.Plugin): msg.command == 'PRIVMSG' and \ ircutils.isChannel(msg.args[0]) + @internationalizeDocstring def last(self, irc, msg, args, optlist): """[--{from,in,on,with,without,regexp} ] [--nolimit] @@ -360,8 +373,8 @@ class Misc(callbacks.Plugin): showNick=showNick)) return if not resp: - irc.error('I couldn\'t find a message matching that criteria in ' - 'my history of %s messages.' % len(irc.state.history)) + irc.error(_('I couldn\'t find a message matching that criteria in ' + 'my history of %s messages.') % len(irc.state.history)) else: irc.reply(format('%L', resp)) last = wrap(last, [getopts({'nolimit': '', @@ -373,6 +386,7 @@ class Misc(callbacks.Plugin): 'regexp': 'regexpMatcher',})]) + @internationalizeDocstring def tell(self, irc, msg, args, target, text): """ @@ -382,30 +396,32 @@ class Misc(callbacks.Plugin): if target.lower() == 'me': target = msg.nick if ircutils.isChannel(target): - irc.error('Dude, just give the command. No need for the tell.') + irc.error(_('Dude, just give the command. No need for the tell.')) return if not ircutils.isNick(target): irc.errorInvalid('nick', target) if ircutils.nickEqual(target, irc.nick): - irc.error('You just told me, why should I tell myself?',Raise=True) + irc.error(_('You just told me, why should I tell myself?'), + Raise=True) if target not in irc.state.nicksToHostmasks and \ not ircdb.checkCapability(msg.prefix, 'owner'): # We'll let owners do this. - s = 'I haven\'t seen %s, I\'ll let you do the telling.' % target + s = _('I haven\'t seen %s, I\'ll let you do the telling.') % target irc.error(s, Raise=True) if irc.action: irc.action = False text = '* %s %s' % (irc.nick, text) - s = '%s wants me to tell you: %s' % (msg.nick, text) + s = _('%s wants me to tell you: %s') % (msg.nick, text) irc.reply(s, to=target, private=True) tell = wrap(tell, ['something', 'text']) + @internationalizeDocstring def ping(self, irc, msg, args): """takes no arguments Checks to see if the bot is alive. """ - irc.reply('pong', prefixNick=False) + irc.reply(_('pong'), prefixNick=False) Class = Misc diff --git a/plugins/MoobotFactoids/config.py b/plugins/MoobotFactoids/config.py index 0595421b3..07f55889c 100644 --- a/plugins/MoobotFactoids/config.py +++ b/plugins/MoobotFactoids/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('MoobotFactoids') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -41,12 +43,12 @@ def configure(advanced): MoobotFactoids = conf.registerPlugin('MoobotFactoids') conf.registerChannelValue(MoobotFactoids, - 'showFactoidIfOnlyOneMatch', registry.Boolean(True, """Determines whether + 'showFactoidIfOnlyOneMatch', registry.Boolean(True, _("""Determines whether or not the factoid value will be shown when a listkeys search returns only - one factoid key.""")) + one factoid key."""))) conf.registerChannelValue(MoobotFactoids, - 'mostCount', registry.Integer(10, """Determines how many items are shown - when the 'most' command is called.""")) + 'mostCount', registry.Integer(10, _("""Determines how many items are shown + when the 'most' command is called."""))) # vim:set shiftwidth=4 softtabstop=8 expandtab textwidth=78 diff --git a/plugins/MoobotFactoids/locale/fr.po b/plugins/MoobotFactoids/locale/fr.po new file mode 100644 index 000000000..e7f88ee7b --- /dev/null +++ b/plugins/MoobotFactoids/locale/fr.po @@ -0,0 +1,296 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-29 12:02+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:46 +msgid "" +"Determines whether\n" +" or not the factoid value will be shown when a listkeys search returns only\n" +" one factoid key." +msgstr "Détermine si la valeur de la factoid sera affichée lorsqu'une recherche de clef ne retournera qu'une seule clef." + +#: config.py:50 +msgid "" +"Determines how many items are shown\n" +" when the 'most' command is called." +msgstr "Détermine combien d'éléments sont affichés lorsque la commande 'most' est appelée." + +#: plugin.py:292 +msgid "" +"Add the help for \"@help MoobotFactoids\" here (assuming you don't implement a MoobotFactoids\n" +" command). This should describe *how* to use this plugin." +msgstr "" + +#: plugin.py:349 +msgid "%s is %s" +msgstr "%s est %s" + +#: plugin.py:368 +msgid "Factoid %q is locked." +msgstr "La factoid %q est verrouillée" + +#: plugin.py:375 +msgid "Factoid %q not found." +msgstr "Factoid %q non trouvée." + +#: plugin.py:385 +msgid "Missing an 'is' or '_is_'." +msgstr "Il manque un 'is' ou un '_is_'" + +#: plugin.py:401 +msgid "Factoid %q already exists." +msgstr "La factoid %q existe déjà." + +#: plugin.py:435 +msgid "%s, or %s" +msgstr "%s, ou %s" + +#: plugin.py:456 +msgid "" +"[] \n" +"\n" +" Returns the literal factoid for the given factoid key. No parsing of\n" +" the factoid value is done as it is with normal retrieval. \n" +" is only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne la factoid littérale pour la clef donnée. Aucun parsage n'est effecté sur la valeur de la factoid. n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:469 +msgid "" +"[] \n" +"\n" +" Returns the various bits of info on the factoid for the given key.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne différentes informations sur la factoid ayant la clef donnée. n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:480 +#: plugin.py:520 +msgid "No such factoid: %q" +msgstr "Cette factoid n'existe pas : %q" + +#: plugin.py:489 +msgid "Created by %s on %s." +msgstr "Créé par %s le %s" + +#: plugin.py:495 +msgid " Last modified by %s on %s." +msgstr "Dernière modification par %s le %s" + +#: plugin.py:503 +msgid " Last requested by %s on %s, requested %n." +msgstr "Dernière requete par %s le %s ; a demandé %n." + +#: plugin.py:510 +msgid " Locked by %s on %s." +msgstr "Verrouillé par %s le %s" + +#: plugin.py:525 +msgid "Factoid %q is already locked." +msgstr "La factoid %q est déjà bloquée." + +#: plugin.py:528 +msgid "Factoid %q is not locked." +msgstr "La factoid %q n'est pas bloquée." + +#: plugin.py:538 +msgid "Cannot %s someone else's factoid unless you are an admin." +msgstr "Impossible de %s la factoid de quelqu'un d'autre à moins d'être un admin." + +#: plugin.py:550 +msgid "" +"[] \n" +"\n" +" Locks the factoid with the given factoid key. Requires that the user\n" +" be registered and have created the factoid originally. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Verrouille la factoid ayant la clef donnée. Requiert que l'utilisateur soit enregistré et ait créé la factoid. n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:561 +msgid "" +"[] \n" +"\n" +" Unlocks the factoid with the given factoid key. Requires that the\n" +" user be registered and have locked the factoid. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Verrouille la factoid ayant la clef donnée. Requiert que l'utilisateur soit enregistré et ait verrouillé la factoid. n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:572 +msgid "" +"[] {popular|authored|recent}\n" +"\n" +" Lists the most {popular|authored|recent} factoids. \"popular\" lists the\n" +" most frequently requested factoids. \"authored\" lists the author with\n" +" the most factoids. \"recent\" lists the most recently created factoids.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] {popular|authored|recent}\n" +"\n" +"Liste les factoids selon un classement. \"popular\" correspond aux plus affichées ; \"authored\" liste les auteurs qui envoient le plus de factoids \"recent\" liste les factoids les plus récentes. n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:594 +msgid "author" +msgstr "auteur" + +#: plugin.py:596 +msgid "authors" +msgstr "auteurs" + +#: plugin.py:597 +msgid "Most prolific %s: %L" +msgstr "%s ayant posté le plus de factoids : %L" + +#: plugin.py:599 +#: plugin.py:611 +msgid "There are no factoids in my database." +msgstr "Il n'y a pas de factoid dans ma base de données." + +#: plugin.py:606 +msgid "latest factoid" +msgstr "dernière factoid" + +#: plugin.py:608 +msgid "latest factoids" +msgstr "dernières factoids" + +#: plugin.py:609 +msgid "%s: %L" +msgstr "%s : %L" + +#: plugin.py:618 +msgid "requested factoid" +msgstr "factoid la plus demandée" + +#: plugin.py:620 +msgid "requested factoids" +msgstr "factoids les plus demandées" + +#: plugin.py:621 +msgid "Top %s: %L" +msgstr "%s : %L" + +#: plugin.py:623 +msgid "No factoids have been requested from my database." +msgstr "Aucune factoid n'a été demandée dans ma base de données." + +#: plugin.py:627 +msgid "" +"[] \n" +"\n" +" Lists the keys of the factoids with the given author. Note that if an\n" +" author has an integer name, you'll have to use that author's id to use\n" +" this function (so don't use integer usernames!). is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Liste les clefs de l'auteur donné. Notez que si l'auteur a un nom qui est un nombre entier, vous devrez donner l'ID de l'auteur pour utiliser cette fonction (donc, n'utilisez pas de nombres entiers comme noms d'utilisateur !) n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:640 +msgid "No factoids by %q found." +msgstr "Aucune factoid par %q ne peut être trouvée." + +#: plugin.py:643 +msgid "Author search for %q (%i found): %L" +msgstr "Recherche d'auteur pour %q (%i trouvé(s)) : %L" + +#: plugin.py:650 +msgid "" +"[] \n" +"\n" +" Lists the keys of the factoids whose key contains the provided text.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Liste les clefs des factoids dont la clef contient le texte fourni. n'est nécessaire que si la commande n'est pas envoyée sur le canal lui-même." + +#: plugin.py:658 +msgid "No keys matching %q found." +msgstr "Aucune factoid correspondant à %q trouvée." + +#: plugin.py:665 +msgid "Key search for %q (%i found): %L" +msgstr "Recherche de clef pour %q (%i trouvée(s)) : %L" + +#: plugin.py:672 +msgid "" +"[] \n" +"\n" +" Lists the keys of the factoids whose value contains the provided text.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Liste les clefs dont la valeur contient le texte recherché. n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:680 +msgid "No values matching %q found." +msgstr "Aucune valeur correspondant à %q trouvée." + +#: plugin.py:683 +msgid "Value search for %q (%i found): %L" +msgstr "Recherche de valeurs pour %q (%i trouvée(s)) : %L" + +#: plugin.py:690 +msgid "" +"[] \n" +"\n" +" Deletes the factoid with the given key. is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Supprime la factoid avec la clef donnée. n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:703 +msgid "" +"[]\n" +"\n" +" Displays a random factoid (along with its key) from the database.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Affiche une factoid aléatoire (avec sa clef) de la base de données. n'est nécesaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:711 +msgid "No factoids in the database." +msgstr "Aucune factoid dans la base de données." + diff --git a/plugins/MoobotFactoids/messages.pot b/plugins/MoobotFactoids/messages.pot new file mode 100644 index 000000000..ce53fb9a3 --- /dev/null +++ b/plugins/MoobotFactoids/messages.pot @@ -0,0 +1,277 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-29 12:02+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "" +"Determines whether\n" +" or not the factoid value will be shown when a listkeys search returns only\n" +" one factoid key." +msgstr "" + +#: config.py:50 +msgid "" +"Determines how many items are shown\n" +" when the 'most' command is called." +msgstr "" + +#: plugin.py:292 +#, docstring +msgid "" +"Add the help for \"@help MoobotFactoids\" here (assuming you don't implement a MoobotFactoids\n" +" command). This should describe *how* to use this plugin." +msgstr "" + +#: plugin.py:349 +msgid "%s is %s" +msgstr "" + +#: plugin.py:368 +msgid "Factoid %q is locked." +msgstr "" + +#: plugin.py:375 +msgid "Factoid %q not found." +msgstr "" + +#: plugin.py:385 +msgid "Missing an 'is' or '_is_'." +msgstr "" + +#: plugin.py:401 +msgid "Factoid %q already exists." +msgstr "" + +#: plugin.py:435 +msgid "%s, or %s" +msgstr "" + +#: plugin.py:456 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns the literal factoid for the given factoid key. No parsing of\n" +" the factoid value is done as it is with normal retrieval. \n" +" is only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:469 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns the various bits of info on the factoid for the given key.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:480 plugin.py:520 +msgid "No such factoid: %q" +msgstr "" + +#: plugin.py:489 +msgid "Created by %s on %s." +msgstr "" + +#: plugin.py:495 +msgid " Last modified by %s on %s." +msgstr "" + +#: plugin.py:503 +msgid " Last requested by %s on %s, requested %n." +msgstr "" + +#: plugin.py:510 +msgid " Locked by %s on %s." +msgstr "" + +#: plugin.py:525 +msgid "Factoid %q is already locked." +msgstr "" + +#: plugin.py:528 +msgid "Factoid %q is not locked." +msgstr "" + +#: plugin.py:538 +msgid "Cannot %s someone else's factoid unless you are an admin." +msgstr "" + +#: plugin.py:550 +#, docstring +msgid "" +"[] \n" +"\n" +" Locks the factoid with the given factoid key. Requires that the user\n" +" be registered and have created the factoid originally. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:561 +#, docstring +msgid "" +"[] \n" +"\n" +" Unlocks the factoid with the given factoid key. Requires that the\n" +" user be registered and have locked the factoid. is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:572 +#, docstring +msgid "" +"[] {popular|authored|recent}\n" +"\n" +" Lists the most {popular|authored|recent} factoids. \"popular\" lists the\n" +" most frequently requested factoids. \"authored\" lists the author with\n" +" the most factoids. \"recent\" lists the most recently created factoids.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:594 +msgid "author" +msgstr "" + +#: plugin.py:596 +msgid "authors" +msgstr "" + +#: plugin.py:597 +msgid "Most prolific %s: %L" +msgstr "" + +#: plugin.py:599 plugin.py:611 +msgid "There are no factoids in my database." +msgstr "" + +#: plugin.py:606 +msgid "latest factoid" +msgstr "" + +#: plugin.py:608 +msgid "latest factoids" +msgstr "" + +#: plugin.py:609 +msgid "%s: %L" +msgstr "" + +#: plugin.py:618 +msgid "requested factoid" +msgstr "" + +#: plugin.py:620 +msgid "requested factoids" +msgstr "" + +#: plugin.py:621 +msgid "Top %s: %L" +msgstr "" + +#: plugin.py:623 +msgid "No factoids have been requested from my database." +msgstr "" + +#: plugin.py:627 +#, docstring +msgid "" +"[] \n" +"\n" +" Lists the keys of the factoids with the given author. Note that if an\n" +" author has an integer name, you'll have to use that author's id to use\n" +" this function (so don't use integer usernames!). is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:640 +msgid "No factoids by %q found." +msgstr "" + +#: plugin.py:643 +msgid "Author search for %q (%i found): %L" +msgstr "" + +#: plugin.py:650 +#, docstring +msgid "" +"[] \n" +"\n" +" Lists the keys of the factoids whose key contains the provided text.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:658 +msgid "No keys matching %q found." +msgstr "" + +#: plugin.py:665 +msgid "Key search for %q (%i found): %L" +msgstr "" + +#: plugin.py:672 +#, docstring +msgid "" +"[] \n" +"\n" +" Lists the keys of the factoids whose value contains the provided text.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:680 +msgid "No values matching %q found." +msgstr "" + +#: plugin.py:683 +msgid "Value search for %q (%i found): %L" +msgstr "" + +#: plugin.py:690 +#, docstring +msgid "" +"[] \n" +"\n" +" Deletes the factoid with the given key. is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:703 +#, docstring +msgid "" +"[]\n" +"\n" +" Displays a random factoid (along with its key) from the database.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:711 +msgid "No factoids in the database." +msgstr "" + diff --git a/plugins/MoobotFactoids/plugin.py b/plugins/MoobotFactoids/plugin.py index c0818bc77..6576dadbd 100644 --- a/plugins/MoobotFactoids/plugin.py +++ b/plugins/MoobotFactoids/plugin.py @@ -41,6 +41,8 @@ from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('MoobotFactoids') allchars = string.maketrans('', '') class OptionList(object): @@ -344,7 +346,8 @@ class MoobotFactoids(callbacks.Plugin): elif type == 'reply': irc.reply(text, prefixNick=False) elif type == 'define': - irc.reply(format('%s is %s', key, text), prefixNick=False) + irc.reply(format(_('%s is %s'), key, text), + prefixNick=False) else: assert False, 'Spurious type from _parseFactoid' else: @@ -362,14 +365,14 @@ class MoobotFactoids(callbacks.Plugin): def _checkNotLocked(self, irc, channel, key): if self.db.locked(channel, key): - irc.error(format('Factoid %q is locked.', key), Raise=True) + irc.error(format(_('Factoid %q is locked.'), key), Raise=True) def _getFactoid(self, irc, channel, key): fact = self.db.getFactoid(channel, key) if fact is not None: return fact else: - irc.error(format('Factoid %q not found.', key), Raise=True) + irc.error(format(_('Factoid %q not found.'), key), Raise=True) def _getKeyAndFactoid(self, tokens): if '_is_' in tokens: @@ -379,7 +382,7 @@ class MoobotFactoids(callbacks.Plugin): else: self.log.debug('Invalid tokens for {add,replace}Factoid: %s.', tokens) - s = 'Missing an \'is\' or \'_is_\'.' + s = _('Missing an \'is\' or \'_is_\'.') raise ValueError, s (key, newfact) = map(' '.join, utils.iter.split(p, tokens, maxsplit=1)) key = self._sanitizeKey(key) @@ -395,7 +398,7 @@ class MoobotFactoids(callbacks.Plugin): irc.error(str(e), Raise=True) # Check and make sure it's not in the DB already if self.db.getFactoid(channel, key): - irc.error(format('Factoid %q already exists.', key), Raise=True) + irc.error(format(_('Factoid %q already exists.'), key), Raise=True) self.db.addFactoid(channel, key, fact, id) irc.replySuccess() @@ -429,7 +432,7 @@ class MoobotFactoids(callbacks.Plugin): self._checkNotLocked(irc, channel, key) # It's fair game if we get to here fact = fact[0] - new_fact = format('%s, or %s', fact, new_text) + new_fact = format(_('%s, or %s'), fact, new_text) self.db.updateFactoid(channel, key, new_fact, id) irc.replySuccess() @@ -448,6 +451,7 @@ class MoobotFactoids(callbacks.Plugin): self.db.addFactoid(channel, key, fact, id) irc.replySuccess() + @internationalizeDocstring def literal(self, irc, msg, args, channel, key): """[] @@ -460,6 +464,7 @@ class MoobotFactoids(callbacks.Plugin): irc.reply(fact) literal = wrap(literal, ['channeldb', 'text']) + @internationalizeDocstring def factinfo(self, irc, msg, args, channel, key): """[] @@ -472,7 +477,7 @@ class MoobotFactoids(callbacks.Plugin): # Next, get all the info and build the response piece by piece info = self.db.getFactinfo(channel, key) if not info: - irc.error(format('No such factoid: %q', key)) + irc.error(format(_('No such factoid: %q'), key)) return (created_by, created_at, modified_by, modified_at, last_requested_by, last_requested_at, requested_count, locked_by, locked_at) = info @@ -481,27 +486,28 @@ class MoobotFactoids(callbacks.Plugin): created_by = plugins.getUserName(created_by) created_at = time.strftime(conf.supybot.reply.format.time(), time.localtime(int(created_at))) - s += format('Created by %s on %s.', created_by, created_at) + s += format(_('Created by %s on %s.'), created_by, created_at) # Next, modification info, if any. if modified_by is not None: modified_by = plugins.getUserName(modified_by) modified_at = time.strftime(conf.supybot.reply.format.time(), time.localtime(int(modified_at))) - s += format(' Last modified by %s on %s.',modified_by, modified_at) + s += format(_(' Last modified by %s on %s.'), modified_by, + modified_at) # Next, last requested info, if any if last_requested_by is not None: last_by = last_requested_by # not an int user id last_at = time.strftime(conf.supybot.reply.format.time(), time.localtime(int(last_requested_at))) req_count = requested_count - s += format(' Last requested by %s on %s, requested %n.', + s += format(_(' Last requested by %s on %s, requested %n.'), last_by, last_at, (requested_count, 'time')) # Last, locked info if locked_at is not None: lock_at = time.strftime(conf.supybot.reply.format.time(), time.localtime(int(locked_at))) lock_by = plugins.getUserName(locked_by) - s += format(' Locked by %s on %s.', lock_by, lock_at) + s += format(_(' Locked by %s on %s.'), lock_by, lock_at) irc.reply(s) factinfo = wrap(factinfo, ['channeldb', 'text']) @@ -511,15 +517,15 @@ class MoobotFactoids(callbacks.Plugin): id = user.id info = self.db.getFactinfo(channel, key) if not info: - irc.error(format('No such factoid: %q', key)) + irc.error(format(_('No such factoid: %q'), key)) return (created_by, _, _, _, _, _, _, locked_by, _) = info # Don't perform redundant operations if locking and locked_by is not None: - irc.error(format('Factoid %q is already locked.', key)) + irc.error(format(_('Factoid %q is already locked.'), key)) return if not locking and locked_by is None: - irc.error(format('Factoid %q is not locked.', key)) + irc.error(format(_('Factoid %q is not locked.'), key)) return # Can only lock/unlock own factoids unless you're an admin #self.log.debug('admin?: %s', ircdb.checkCapability(id, 'admin')) @@ -529,8 +535,8 @@ class MoobotFactoids(callbacks.Plugin): s = 'lock' else: s = 'unlock' - irc.error(format('Cannot %s someone else\'s factoid unless you ' - 'are an admin.', s)) + irc.error(format(_('Cannot %s someone else\'s factoid unless you ' + 'are an admin.'), s)) return # Okay, we're done, ready to lock/unlock if locking: @@ -539,6 +545,7 @@ class MoobotFactoids(callbacks.Plugin): self.db.unlock(channel, key) irc.replySuccess() + @internationalizeDocstring def lock(self, irc, msg, args, channel, user, key): """[] @@ -549,6 +556,7 @@ class MoobotFactoids(callbacks.Plugin): self._lock(irc, msg, channel, user, key, True) lock = wrap(lock, ['channeldb', 'user', 'text']) + @internationalizeDocstring def unlock(self, irc, msg, args, channel, user, key): """[] @@ -559,6 +567,7 @@ class MoobotFactoids(callbacks.Plugin): self._lock(irc, msg, channel, user, key, False) unlock = wrap(unlock, ['channeldb', 'user', 'text']) + @internationalizeDocstring def most(self, irc, msg, args, channel, method): """[] {popular|authored|recent} @@ -582,30 +591,38 @@ class MoobotFactoids(callbacks.Plugin): L = ['%s (%s)' % (plugins.getUserName(t[0]), int(t[1])) for t in results] if L: - author = 'author' + author = _('author') if len(L) != 1: - author = 'authors' - irc.reply(format('Most prolific %s: %L', author, L)) + author = _('authors') + irc.reply(format(_('Most prolific %s: %L'), author, L)) else: - irc.error('There are no factoids in my database.') + irc.error(_('There are no factoids in my database.')) def _mostRecent(self, irc, channel, limit): results = self.db.mostRecent(channel, limit) L = [format('%q', t[0]) for t in results] if L: - irc.reply(format('%n: %L', (len(L), 'latest', 'factoid'), L)) + if len(L) < 2: + latest = _('latest factoid') + else: + latest = _('latest factoids') + irc.reply(format(_('%s: %L'), latest, L)) else: - irc.error('There are no factoids in my database.') + irc.error(_('There are no factoids in my database.')) def _mostPopular(self, irc, channel, limit): results = self.db.mostPopular(channel, limit) L = [format('%q (%s)', t[0], t[1]) for t in results] if L: - irc.reply( - format('Top %n: %L', (len(L), 'requested', 'factoid'), L)) + if len(L) < 2: + requested = _('requested factoid') + else: + requested = _('requested factoids') + irc.reply(format(_('Top %s: %L'), requested, L)) else: - irc.error('No factoids have been requested from my database.') + irc.error(_('No factoids have been requested from my database.')) + @internationalizeDocstring def listauth(self, irc, msg, args, channel, author): """[] @@ -620,14 +637,15 @@ class MoobotFactoids(callbacks.Plugin): irc.errorNoUser(name=author, Raise=True) results = self.db.getKeysByAuthor(channel, id) if not results: - irc.reply(format('No factoids by %q found.', author)) + irc.reply(format(_('No factoids by %q found.'), author)) return keys = [format('%q', t[0]) for t in results] - s = format('Author search for %q (%i found): %L', + s = format(_('Author search for %q (%i found): %L'), author, len(keys), keys) irc.reply(s) listauth = wrap(listauth, ['channeldb', 'something']) + @internationalizeDocstring def listkeys(self, irc, msg, args, channel, search): """[] @@ -637,18 +655,19 @@ class MoobotFactoids(callbacks.Plugin): """ results = self.db.getKeysByGlob(channel, search) if not results: - irc.reply(format('No keys matching %q found.', search)) + irc.reply(format(_('No keys matching %q found.'), search)) elif len(results) == 1 and \ self.registryValue('showFactoidIfOnlyOneMatch', channel): key = results[0][0] self.invalidCommand(irc, msg, [key]) else: keys = [format('%q', tup[0]) for tup in results] - s = format('Key search for %q (%i found): %L', + s = format(_('Key search for %q (%i found): %L'), search, len(keys), keys) irc.reply(s) listkeys = wrap(listkeys, ['channeldb', 'text']) + @internationalizeDocstring def listvalues(self, irc, msg, args, channel, search): """[] @@ -658,14 +677,15 @@ class MoobotFactoids(callbacks.Plugin): """ results = self.db.getKeysByValueGlob(channel, search) if not results: - irc.reply(format('No values matching %q found.', search)) + irc.reply(format(_('No values matching %q found.'), search)) return keys = [format('%q', tup[0]) for tup in results] - s = format('Value search for %q (%i found): %L', + s = format(_('Value search for %q (%i found): %L'), search, len(keys), keys) irc.reply(s) listvalues = wrap(listvalues, ['channeldb', 'text']) + @internationalizeDocstring def remove(self, irc, msg, args, channel, _, key): """[] @@ -678,6 +698,7 @@ class MoobotFactoids(callbacks.Plugin): irc.replySuccess() remove = wrap(remove, ['channeldb', 'user', 'text']) + @internationalizeDocstring def random(self, irc, msg, args, channel): """[] @@ -687,12 +708,12 @@ class MoobotFactoids(callbacks.Plugin): """ results = self.db.randomFactoid(channel) if not results: - irc.error('No factoids in the database.') + irc.error(_('No factoids in the database.')) return (fact, key) = results irc.reply(format('Random factoid: %q is %q', key, fact)) random = wrap(random, ['channeldb']) - +MoobotFactoids = internationalizeDocstring(MoobotFactoids) Class = MoobotFactoids diff --git a/plugins/Network/config.py b/plugins/Network/config.py index f50ddc473..c1cf102ef 100644 --- a/plugins/Network/config.py +++ b/plugins/Network/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Network') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Network/locale/fr.po b/plugins/Network/locale/fr.po new file mode 100644 index 000000000..586ca448d --- /dev/null +++ b/plugins/Network/locale/fr.po @@ -0,0 +1,186 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-16 12:52+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:57 +msgid "" +"[--ssl] [] []\n" +"\n" +" Connects to another network (which will be represented by the name\n" +" provided in ) at . If port is not provided, it\n" +" defaults to 6667, the default port for IRC. If password is\n" +" provided, it will be sent to the server in a PASS command. If --ssl is\n" +" provided, an SSL connection will be attempted.\n" +" " +msgstr "" +"[--ssl] [] []\n" +"\n" +"Se connecter à un autre réseau (représenté par le ) au . Si le port n'est pas fourni, il s'agit du 6667, celui par défaut pour IRC. Si le est fourni, l'envoie au serveur par la commande PASS. Si --ssl est fourni, une connexion SSL sera requise." + +#: plugin.py:67 +msgid "I'm already connected to %s." +msgstr "Je suis déjà connecté à %s." + +#: plugin.py:87 +msgid "A server must be provided if the network is not already registered." +msgstr "Un serveur doit être fourni si le réseau n'est pas déjà enregistré." + +#: plugin.py:95 +msgid "Connection to %s initiated." +msgstr "Connexion à %s initialisée." + +#: plugin.py:102 +msgid "" +"[] []\n" +"\n" +" Disconnects from the network represented by the network .\n" +" If is given, quits the network with the given quit\n" +" message. is only necessary if the network is different\n" +" from the network the command is sent on.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Se déconnecte du . Si le est fourni, quitte le réseau avec ce message. Le n'est nécessaire que s'il ne s'agit pas du réseau sur lequel la commande est envoyée." + +#: plugin.py:114 +msgid "Disconnection to %s initiated." +msgstr "Déconnexion à %s initialisée." + +#: plugin.py:120 +msgid "" +"[] []\n" +"\n" +" Disconnects and then reconnects to . If no network is given,\n" +" disconnects and then reconnects to the network the command was given\n" +" on. If no quit message is given, uses the configured one\n" +" (supybot.plugins.Owner.quitMsg) or the nick of the person giving the\n" +" command.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Se déconnecte du et s'y reconnecte. Si le est fourni, quitte le réseau avec ce message. Le n'est nécessaire que s'il ne s'agit pas du réseau sur lequel la commande est envoyée." + +#: plugin.py:137 +msgid "" +" [ ...]\n" +"\n" +" Gives the bot (with its associated s) on .\n" +" " +msgstr "" +" [ ...]\n" +"\n" +"Envoie la au bot (avec les arguments) sur le ." + +#: plugin.py:210 +msgid "is an op on %L" +msgstr "est op sur %L" + +#: plugin.py:212 +msgid "is a halfop on %L" +msgstr "est halfop sur %L" + +#: plugin.py:214 +msgid "is voiced on %L" +msgstr "est voicé sur %L" + +#: plugin.py:217 +msgid "is also on %L" +msgstr "est aussi sur %L" + +#: plugin.py:219 +msgid "is on %L" +msgstr "est sur %L" + +#: plugin.py:221 +msgid "isn't on any non-secret channels" +msgstr "n'est sur aucun canal non secret" + +#: plugin.py:228 +#: plugin.py:229 +#: plugin.py:233 +msgid "" +msgstr "" + +#: plugin.py:240 +msgid " identified" +msgstr " identifié" + +#: plugin.py:245 +msgid "%s (%s) has been%s on server %s since %s (idle for %s) and %s.%s" +msgstr "%s (%s) a été%s sur le serveur %s depuis %s (idle depuis %s) et %s.%s" + +#: plugin.py:258 +msgid "There is no %s on %s." +msgstr "Il n'y a pas de %s sur %s." + +#: plugin.py:264 +msgid "" +"[] \n" +"\n" +" Returns the WHOIS response gives for . is\n" +" only necessary if the network is different than the network the command\n" +" is sent on.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne les réponses WHOIS du pour le . Le n'est nécessaire que s'il ne s'agit pas du réseau sur lequel la commande est envoyée." + +#: plugin.py:280 +msgid "" +"takes no arguments\n" +"\n" +" Returns the networks to which the bot is currently connected.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +" \n" +"Retourne la liste des réseaux auxquels le bot est actuellement connecté." + +#: plugin.py:293 +msgid "%.2f seconds." +msgstr "%.2f secondes" + +#: plugin.py:297 +msgid "" +"[]\n" +"\n" +" Returns the current latency to . is only necessary\n" +" if the message isn't sent on the network to which this command is to\n" +" apply.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne la latence actuelle du . Le n'est nécessaire que s'il ne s'agit pas du réseau sur lequel la commande est envoyée." + +#: plugin.py:303 +msgid "Latency check (from %s)." +msgstr "Vérification de lance (de %s)." + +#: plugin.py:311 +msgid "" +"[]\n" +"\n" +" Returns the current network driver for . is only\n" +" necessary if the message isn't sent on the network to which this\n" +" command is to apply.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne le 'driver' actuel pour le . Le n'est nécessaire que s'il ne s'agit pas du réseau sur lequel la commande est envoyée." + diff --git a/plugins/Network/messages.pot b/plugins/Network/messages.pot new file mode 100644 index 000000000..e368ae1f0 --- /dev/null +++ b/plugins/Network/messages.pot @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-16 12:52+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:57 +#, docstring +msgid "" +"[--ssl] [] []\n" +"\n" +" Connects to another network (which will be represented by the name\n" +" provided in ) at . If port is not provided, it\n" +" defaults to 6667, the default port for IRC. If password is\n" +" provided, it will be sent to the server in a PASS command. If --ssl is\n" +" provided, an SSL connection will be attempted.\n" +" " +msgstr "" + +#: plugin.py:67 +msgid "I'm already connected to %s." +msgstr "" + +#: plugin.py:87 +msgid "A server must be provided if the network is not already registered." +msgstr "" + +#: plugin.py:95 +msgid "Connection to %s initiated." +msgstr "" + +#: plugin.py:102 +#, docstring +msgid "" +"[] []\n" +"\n" +" Disconnects from the network represented by the network .\n" +" If is given, quits the network with the given quit\n" +" message. is only necessary if the network is different\n" +" from the network the command is sent on.\n" +" " +msgstr "" + +#: plugin.py:114 +msgid "Disconnection to %s initiated." +msgstr "" + +#: plugin.py:120 +#, docstring +msgid "" +"[] []\n" +"\n" +" Disconnects and then reconnects to . If no network is given,\n" +" disconnects and then reconnects to the network the command was given\n" +" on. If no quit message is given, uses the configured one\n" +" (supybot.plugins.Owner.quitMsg) or the nick of the person giving the\n" +" command.\n" +" " +msgstr "" + +#: plugin.py:137 +#, docstring +msgid "" +" [ ...]\n" +"\n" +" Gives the bot (with its associated s) on .\n" +" " +msgstr "" + +#: plugin.py:210 +msgid "is an op on %L" +msgstr "" + +#: plugin.py:212 +msgid "is a halfop on %L" +msgstr "" + +#: plugin.py:214 +msgid "is voiced on %L" +msgstr "" + +#: plugin.py:217 +msgid "is also on %L" +msgstr "" + +#: plugin.py:219 +msgid "is on %L" +msgstr "" + +#: plugin.py:221 +msgid "isn't on any non-secret channels" +msgstr "" + +#: plugin.py:228 plugin.py:229 plugin.py:233 +msgid "" +msgstr "" + +#: plugin.py:240 +msgid " identified" +msgstr "" + +#: plugin.py:245 +msgid "%s (%s) has been%s on server %s since %s (idle for %s) and %s.%s" +msgstr "" + +#: plugin.py:258 +msgid "There is no %s on %s." +msgstr "" + +#: plugin.py:264 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns the WHOIS response gives for . is\n" +" only necessary if the network is different than the network the command\n" +" is sent on.\n" +" " +msgstr "" + +#: plugin.py:280 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the networks to which the bot is currently connected.\n" +" " +msgstr "" + +#: plugin.py:293 +msgid "%.2f seconds." +msgstr "" + +#: plugin.py:297 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the current latency to . is only necessary\n" +" if the message isn't sent on the network to which this command is to\n" +" apply.\n" +" " +msgstr "" + +#: plugin.py:303 +msgid "Latency check (from %s)." +msgstr "" + +#: plugin.py:311 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the current network driver for . is only\n" +" necessary if the message isn't sent on the network to which this\n" +" command is to apply.\n" +" " +msgstr "" + diff --git a/plugins/Network/plugin.py b/plugins/Network/plugin.py index 2eb405f01..41bf0c646 100644 --- a/plugins/Network/plugin.py +++ b/plugins/Network/plugin.py @@ -38,6 +38,8 @@ import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.registry as registry import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Network') class Network(callbacks.Plugin): _whois = {} @@ -50,6 +52,7 @@ class Network(callbacks.Plugin): raise callbacks.Error, \ 'I\'m not currently connected to %s.' % network + @internationalizeDocstring def connect(self, irc, msg, args, opts, network, server, password): """[--ssl] [] [] @@ -61,7 +64,7 @@ class Network(callbacks.Plugin): """ try: otherIrc = self._getIrc(network) - irc.error('I\'m already connected to %s.' % network) + irc.error(_('I\'m already connected to %s.') % network) return # We've gotta return here. This is ugly code, but I'm not # quite sure what to do about it. except callbacks.Error: @@ -81,19 +84,20 @@ class Network(callbacks.Plugin): try: serverPort = conf.supybot.networks.get(network).servers()[0] except (registry.NonExistentRegistryEntry, IndexError): - irc.error('A server must be provided if the network is not ' - 'already registered.') + irc.error(_('A server must be provided if the network is not ' + 'already registered.')) return Owner = irc.getCallback('Owner') newIrc = Owner._connect(network, serverPort=serverPort, password=password, ssl=ssl) conf.supybot.networks().add(network) assert newIrc.callbacks is irc.callbacks, 'callbacks list is different' - irc.replySuccess('Connection to %s initiated.' % network) + irc.replySuccess(_('Connection to %s initiated.') % network) connect = wrap(connect, ['owner', getopts({'ssl': ''}), 'something', additional('something'), additional('something', '')]) + @internationalizeDocstring def disconnect(self, irc, msg, args, otherIrc, quitMsg): """[] [] @@ -107,10 +111,11 @@ class Network(callbacks.Plugin): otherIrc.die() conf.supybot.networks().discard(otherIrc.network) if otherIrc != irc: - irc.replySuccess('Disconnection to %s initiated.' % + irc.replySuccess(_('Disconnection to %s initiated.') % otherIrc.network) disconnect = wrap(disconnect, ['owner', 'networkIrc', additional('text')]) + @internationalizeDocstring def reconnect(self, irc, msg, args, otherIrc, quitMsg): """[] [] @@ -127,6 +132,7 @@ class Network(callbacks.Plugin): irc.replySuccess() reconnect = wrap(reconnect, ['owner', 'networkIrc', additional('text')]) + @internationalizeDocstring def command(self, irc, msg, args, otherIrc, commandAndArgs): """ [ ...] @@ -201,43 +207,43 @@ class Network(callbacks.Plugin): voices.append(channel[1:]) L = [] if ops: - L.append(format('is an op on %L', ops)) + L.append(format(_('is an op on %L'), ops)) if halfops: - L.append(format('is a halfop on %L', halfops)) + L.append(format(_('is a halfop on %L'), halfops)) if voices: - L.append(format('is voiced on %L', voices)) + L.append(format(_('is voiced on %L'), voices)) if normal: if L: - L.append(format('is also on %L', normal)) + L.append(format(_('is also on %L'), normal)) else: - L.append(format('is on %L', normal)) + L.append(format(_('is on %L'), normal)) else: - L = ['isn\'t on any non-secret channels'] + L = [_('isn\'t on any non-secret channels')] channels = format('%L', L) if '317' in d: idle = utils.timeElapsed(d['317'].args[2]) signon = time.strftime(conf.supybot.reply.format.time(), time.localtime(float(d['317'].args[3]))) else: - idle = '' - signon = '' + idle = _('') + signon = _('') if '312' in d: server = d['312'].args[2] else: - server = '' + server = _('') if '301' in d: away = ' %s is away: %s.' % (nick, d['301'].args[2]) else: away = '' if '320' in d: if d['320'].args[2]: - identify = ' identified' + identify = _(' identified') else: identify = '' else: identify = '' - s = '%s (%s) has been%s on server %s since %s (idle for %s) and ' \ - '%s.%s' % (user, hostmask, identify, server, signon, idle, + s = _('%s (%s) has been%s on server %s since %s (idle for %s) and ' + '%s.%s') % (user, hostmask, identify, server, signon, idle, channels, away) replyIrc.reply(s) del self._whois[(irc, loweredNick)] @@ -249,10 +255,11 @@ class Network(callbacks.Plugin): return (replyIrc, replyMsg, d) = self._whois[(irc, loweredNick)] del self._whois[(irc, loweredNick)] - s = 'There is no %s on %s.' % (nick, irc.network) + s = _('There is no %s on %s.') % (nick, irc.network) replyIrc.reply(s) do401 = do402 + @internationalizeDocstring def whois(self, irc, msg, args, otherIrc, nick): """[] @@ -268,6 +275,7 @@ class Network(callbacks.Plugin): self._whois[(otherIrc, nick)] = (irc, msg, {}) whois = wrap(whois, ['networkIrc', 'nick']) + @internationalizeDocstring def networks(self, irc, msg, args): """takes no arguments @@ -282,8 +290,9 @@ class Network(callbacks.Plugin): now = time.time() if irc in self._latency: (replyIrc, when) = self._latency.pop(irc) - replyIrc.reply('%.2f seconds.' % (now-when)) + replyIrc.reply(_('%.2f seconds.') % (now-when)) + @internationalizeDocstring def latency(self, irc, msg, args, otherIrc): """[] @@ -291,11 +300,13 @@ class Network(callbacks.Plugin): if the message isn't sent on the network to which this command is to apply. """ - otherIrc.queueMsg(ircmsgs.ping('Latency check (from %s).' % msg.nick)) + otherIrc.queueMsg(ircmsgs.ping(_('Latency check (from %s).') % + msg.nick)) self._latency[otherIrc] = (irc, time.time()) irc.noReply() latency = wrap(latency, ['networkIrc']) + @internationalizeDocstring def driver(self, irc, msg, args, otherIrc): """[] diff --git a/plugins/News/config.py b/plugins/News/config.py index 4ba1a6c46..2a2e0e8f4 100644 --- a/plugins/News/config.py +++ b/plugins/News/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('News') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,7 +44,7 @@ def configure(advanced): News = conf.registerPlugin('News') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(News, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/News/locale/fr.po b/plugins/News/locale/fr.po new file mode 100644 index 000000000..eaa196c33 --- /dev/null +++ b/plugins/News/locale/fr.po @@ -0,0 +1,117 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 16:53+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:57 +msgid "%s (Subject: %q, added by %s on %s)" +msgstr "%s (Sujet : %q, ajouté par %s le %s)" + +#: plugin.py:61 +msgid "%s (Subject: %q, added by %s on %s, expires at %s)" +msgstr "%s (Sujet : %q, ajouté par %s le %s, expire à %s)" + +#: plugin.py:120 +msgid "" +"[] : \n" +"\n" +" Adds a given news item of to a channel with the given .\n" +" If isn't 0, that news item will expire seconds from\n" +" now. is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" +"[] : \n" +"\n" +"Ajoute la news donnée, contenant le à un , avec le donné. Si l' n'est pas 0, la news expirera dans le nombre donné de secondes. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:132 +msgid "(News item #%i added)" +msgstr "(News #%i ajoutée)" + +#: plugin.py:137 +msgid "" +"[] []\n" +"\n" +" Display the news items for in the format of '(#id) subject'.\n" +" If is given, retrieve only that news item; otherwise retrieve all\n" +" news items. is only necessary if the message isn't sent in\n" +" the channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Affiche une news sur le dans le format'(#id) sujet'. Si l' est donné, ne récupère que la news correspondante ; sinon, récupère toutes les news. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:148 +msgid "News for %s: %s" +msgstr "News pour %s : %s" + +#: plugin.py:151 +msgid "No news for %s." +msgstr "Pas de news pour %s." + +#: plugin.py:157 +#: plugin.py:171 +#: plugin.py:187 +#: plugin.py:203 +msgid "news item id" +msgstr "id de news" + +#: plugin.py:162 +msgid "" +"[] \n" +"\n" +" Removes the news item with from . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne la news avec l' du . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:176 +msgid "" +"[] \n" +"\n" +" Changes the news item with from according to the\n" +" regular expression . should be of the form\n" +" s/text/replacement/flags. is only necessary if the message\n" +" isn't sent on the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Change la news ayant cet sur le , en accord avec l'expression régulière . La doit être de la forme s/text/replacement/flags. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:192 +msgid "" +"[] []\n" +"\n" +" Returns the old news item for with . If no number is\n" +" given, returns all the old news items in reverse order. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Retourne l'ancienne news du avec l'. Si aucun nombre n'est donné, retourne toutes les anciennes news, dans l'ordre inverse. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:208 +msgid "Old news for %s: %s" +msgstr "Anciennes news pour %s : %s" + +#: plugin.py:211 +msgid "No old news for %s." +msgstr "Pas d'ancienne news pour %s." + diff --git a/plugins/News/messages.pot b/plugins/News/messages.pot new file mode 100644 index 000000000..9a77314ef --- /dev/null +++ b/plugins/News/messages.pot @@ -0,0 +1,106 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 16:53+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:57 +msgid "%s (Subject: %q, added by %s on %s)" +msgstr "" + +#: plugin.py:61 +msgid "%s (Subject: %q, added by %s on %s, expires at %s)" +msgstr "" + +#: plugin.py:120 +#, docstring +msgid "" +"[] : \n" +"\n" +" Adds a given news item of to a channel with the given .\n" +" If isn't 0, that news item will expire seconds from\n" +" now. is only necessary if the message isn't sent in the\n" +" channel itself.\n" +" " +msgstr "" + +#: plugin.py:132 +msgid "(News item #%i added)" +msgstr "" + +#: plugin.py:137 +#, docstring +msgid "" +"[] []\n" +"\n" +" Display the news items for in the format of '(#id) subject'.\n" +" If is given, retrieve only that news item; otherwise retrieve all\n" +" news items. is only necessary if the message isn't sent in\n" +" the channel itself.\n" +" " +msgstr "" + +#: plugin.py:148 +msgid "News for %s: %s" +msgstr "" + +#: plugin.py:151 +msgid "No news for %s." +msgstr "" + +#: plugin.py:157 plugin.py:171 plugin.py:187 plugin.py:203 +msgid "news item id" +msgstr "" + +#: plugin.py:162 +#, docstring +msgid "" +"[] \n" +"\n" +" Removes the news item with from . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:176 +#, docstring +msgid "" +"[] \n" +"\n" +" Changes the news item with from according to the\n" +" regular expression . should be of the form\n" +" s/text/replacement/flags. is only necessary if the message\n" +" isn't sent on the channel itself.\n" +" " +msgstr "" + +#: plugin.py:192 +#, docstring +msgid "" +"[] []\n" +"\n" +" Returns the old news item for with . If no number is\n" +" given, returns all the old news items in reverse order. is\n" +" only necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:208 +msgid "Old news for %s: %s" +msgstr "" + +#: plugin.py:211 +msgid "No old news for %s." +msgstr "" + diff --git a/plugins/News/plugin.py b/plugins/News/plugin.py index 554ddd825..5a9d5d95d 100644 --- a/plugins/News/plugin.py +++ b/plugins/News/plugin.py @@ -36,6 +36,8 @@ from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('News') class DbiNewsDB(plugins.DbiChannelDB): @@ -52,12 +54,12 @@ class DbiNewsDB(plugins.DbiChannelDB): def __str__(self): user = plugins.getUserName(self.by) if self.expires == 0: - s = format('%s (Subject: %q, added by %s on %s)', + s = format(_('%s (Subject: %q, added by %s on %s)'), self.text, self.subject, self.by, utils.str.timestamp(self.at)) else: - s = format('%s (Subject: %q, added by %s on %s, ' - 'expires at %s)', + s = format(_('%s (Subject: %q, added by %s on %s, ' + 'expires at %s)'), self.text, self.subject, user, utils.str.timestamp(self.at), utils.str.timestamp(self.expires)) @@ -113,6 +115,7 @@ class News(callbacks.Plugin): self.__parent.die() self.db.close() + @internationalizeDocstring def add(self, irc, msg, args, channel, user, at, expires, news): """[] : @@ -126,9 +129,10 @@ class News(callbacks.Plugin): except ValueError: raise callbacks.ArgumentError id = self.db.add(channel, subject, text, at, expires, user.id) - irc.replySuccess(format('(News item #%i added)', id)) + irc.replySuccess(format(_('(News item #%i added)'), id)) add = wrap(add, ['channeldb', 'user', 'now', 'expiry', 'text']) + @internationalizeDocstring def news(self, irc, msg, args, channel, id): """[] [] @@ -141,18 +145,19 @@ class News(callbacks.Plugin): try: records = self.db.get(channel) items = [format('(#%i) %s', R.id, R.subject) for R in records] - s = format('News for %s: %s', channel, '; '.join(items)) + s = format(_('News for %s: %s'), channel, '; '.join(items)) irc.reply(s) except dbi.NoRecordError: - irc.reply(format('No news for %s.', channel)) + irc.reply(format(_('No news for %s.'), channel)) else: try: record = self.db.get(channel, id) irc.reply(str(record)) except dbi.NoRecordError, id: - irc.errorInvalid('news item id', id) + irc.errorInvalid(_('news item id'), id) news = wrap(news, ['channeldb', additional('positiveInt')]) + @internationalizeDocstring def remove(self, irc, msg, args, channel, id): """[] @@ -163,9 +168,10 @@ class News(callbacks.Plugin): self.db.remove(channel, id) irc.replySuccess() except dbi.NoRecordError: - irc.errorInvalid('news item id', id) + irc.errorInvalid(_('news item id'), id) remove = wrap(remove, ['channeldb', 'positiveInt']) + @internationalizeDocstring def change(self, irc, msg, args, channel, id, replacer): """[] @@ -178,9 +184,10 @@ class News(callbacks.Plugin): self.db.change(channel, id, replacer) irc.replySuccess() except dbi.NoRecordError: - irc.errorInvalid('news item id', id) + irc.errorInvalid(_('news item id'), id) change = wrap(change, ['channeldb', 'positiveInt', 'regexpReplacer']) + @internationalizeDocstring def old(self, irc, msg, args, channel, id): """[] [] @@ -193,15 +200,15 @@ class News(callbacks.Plugin): record = self.db.getOld(channel, id) irc.reply(str(record)) except dbi.NoRecordError, id: - irc.errorInvalid('news item id', id) + irc.errorInvalid(_('news item id'), id) else: try: records = self.db.getOld(channel) items = [format('(#%i) %s', R.id, R.subject) for R in records] - s = format('Old news for %s: %s', channel, '; '.join(items)) + s = format(_('Old news for %s: %s'), channel, '; '.join(items)) irc.reply(s) except dbi.NoRecordError: - irc.reply(format('No old news for %s.', channel)) + irc.reply(format(_('No old news for %s.'), channel)) old = wrap(old, ['channeldb', additional('positiveInt')]) diff --git a/plugins/NickCapture/config.py b/plugins/NickCapture/config.py index bad856b12..a333679a3 100644 --- a/plugins/NickCapture/config.py +++ b/plugins/NickCapture/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('NickCapture') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,11 +44,11 @@ def configure(advanced): NickCapture = conf.registerPlugin('NickCapture') conf.registerPlugin('NickCapture') conf.registerGlobalValue(NickCapture, 'ison', - registry.Boolean(True, """Determines whether the bot will check - occasionally if its preferred nick is in use via the ISON command.""")) + registry.Boolean(True, _("""Determines whether the bot will check + occasionally if its preferred nick is in use via the ISON command."""))) conf.registerGlobalValue(NickCapture.ison, 'period', - registry.PositiveInteger(600, """Determines how often (in seconds) the bot - will check whether its nick ISON.""")) + registry.PositiveInteger(600, _("""Determines how often (in seconds) the bot + will check whether its nick ISON."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/NickCapture/locale/fr.po b/plugins/NickCapture/locale/fr.po new file mode 100644 index 000000000..6d32b4312 --- /dev/null +++ b/plugins/NickCapture/locale/fr.po @@ -0,0 +1,38 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 16:58+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:47 +msgid "" +"Determines whether the bot will check\n" +" occasionally if its preferred nick is in use via the ISON command." +msgstr "Détermine si le bot vérifiera occasionnellement si son nick préféré est en cours d'utilisation grâce à la commande ISON." + +#: config.py:50 +msgid "" +"Determines how often (in seconds) the bot\n" +" will check whether its nick ISON." +msgstr "Détermine tous les combien de temps (en secondes) le bot vérifiera son nick via ISON" + +#: plugin.py:41 +msgid "" +"This module constantly tries to take whatever nick is configured as\n" +" supybot.nick. Just make sure that's set appropriately, and thus plugin\n" +" will do the rest." +msgstr "Ce module essaye constament de récupérer le nick configuré dans supybot.nick. Assurez-vous de le configurer correctement, et ce plugin fera le reste." + +#: plugin.py:90 +msgid "This is returned by the ISON command." +msgstr "Ceci est retourné par la commande ISON." + diff --git a/plugins/NickCapture/messages.pot b/plugins/NickCapture/messages.pot new file mode 100644 index 000000000..46813d8b7 --- /dev/null +++ b/plugins/NickCapture/messages.pot @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 16:58+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:47 +msgid "" +"Determines whether the bot will check\n" +" occasionally if its preferred nick is in use via the ISON command." +msgstr "" + +#: config.py:50 +msgid "" +"Determines how often (in seconds) the bot\n" +" will check whether its nick ISON." +msgstr "" + +#: plugin.py:41 +#, docstring +msgid "" +"This module constantly tries to take whatever nick is configured as\n" +" supybot.nick. Just make sure that's set appropriately, and thus plugin\n" +" will do the rest." +msgstr "" + +#: plugin.py:90 +#, docstring +msgid "This is returned by the ISON command." +msgstr "" + diff --git a/plugins/NickCapture/plugin.py b/plugins/NickCapture/plugin.py index e81ad5718..8728c8296 100644 --- a/plugins/NickCapture/plugin.py +++ b/plugins/NickCapture/plugin.py @@ -33,6 +33,8 @@ import supybot.conf as conf import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('NickCapture') class NickCapture(callbacks.Plugin): """This module constantly tries to take whatever nick is configured as @@ -89,7 +91,7 @@ class NickCapture(callbacks.Plugin): nick = self._getNick() if nick: self._sendNick(irc, nick) - +NickCapture = internationalizeDocstring(NickCapture) Class = NickCapture diff --git a/plugins/Nickometer/config.py b/plugins/Nickometer/config.py index 27cc2568f..c8945d41f 100644 --- a/plugins/Nickometer/config.py +++ b/plugins/Nickometer/config.py @@ -30,6 +30,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Nickometer') def configure(advanced): # This will be called by setup.py to configure this module. Advanced is @@ -42,7 +44,7 @@ def configure(advanced): Nickometer = conf.registerPlugin('Nickometer') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Nickometer, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Nickometer/locale/fr.po b/plugins/Nickometer/locale/fr.po new file mode 100644 index 000000000..adba1f196 --- /dev/null +++ b/plugins/Nickometer/locale/fr.po @@ -0,0 +1,31 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 18:28+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:84 +msgid "" +"[]\n" +"\n" +" Tells you how lame said nick is. If is not given, uses the\n" +" nick of the person giving the command.\n" +" " +msgstr "" +"[]\n" +"\n" +"Mesure la décrédibilité du nick. Si le nick n'est pas donné, utilise le nick de la personne donnant la commande." + +#: plugin.py:226 +msgid "The \"lame nick-o-meter\" reading for \"%s\" is %s%%." +msgstr "Le \"décrédibilit-o-mètre\" pour \"%s\" donne %s%%." + diff --git a/plugins/Nickometer/messages.pot b/plugins/Nickometer/messages.pot new file mode 100644 index 000000000..fd8dfe20c --- /dev/null +++ b/plugins/Nickometer/messages.pot @@ -0,0 +1,31 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 18:28+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:84 +#, docstring +msgid "" +"[]\n" +"\n" +" Tells you how lame said nick is. If is not given, uses the\n" +" nick of the person giving the command.\n" +" " +msgstr "" + +#: plugin.py:226 +msgid "The \"lame nick-o-meter\" reading for \"%s\" is %s%%." +msgstr "" + diff --git a/plugins/Nickometer/plugin.py b/plugins/Nickometer/plugin.py index ec24737ff..b5bac6d2c 100644 --- a/plugins/Nickometer/plugin.py +++ b/plugins/Nickometer/plugin.py @@ -53,6 +53,8 @@ import string import supybot.callbacks as callbacks from supybot.commands import wrap, additional +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Nickometer') def slowExponent(x): return 1.3 * x * (1 - math.atan(x / 6.0) * 2 / math.pi) @@ -77,6 +79,7 @@ class Nickometer(callbacks.Plugin): self.log.debug('%s lameness points awarded: %s', damage, reason) return damage + @internationalizeDocstring def nickometer(self, irc, msg, args, nick): """[] @@ -220,7 +223,7 @@ class Nickometer(callbacks.Plugin): # if it's above 99.9%, show as many digits as is interesting score_string=re.sub('(99\\.9*\\d|\\.\\d).*','\\1',`percentage`) - irc.reply('The "lame nick-o-meter" reading for "%s" is %s%%.' % + irc.reply(_('The "lame nick-o-meter" reading for "%s" is %s%%.') % (originalNick, score_string)) self.log.debug('Calculated lameness score for %s as %s ' diff --git a/plugins/Note/config.py b/plugins/Note/config.py index 7603eb7e9..b3be8b120 100644 --- a/plugins/Note/config.py +++ b/plugins/Note/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Note') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Note/locale/fr.po b/plugins/Note/locale/fr.po new file mode 100644 index 000000000..e70fffa69 --- /dev/null +++ b/plugins/Note/locale/fr.po @@ -0,0 +1,100 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-29 13:54+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:179 +msgid "" +",[,[...]] \n" +"\n" +" Sends a new note to the user specified. Multiple recipients may be\n" +" specified by separating their names by commas.\n" +" " +msgstr "" +",[,...] \n" +"\n" +"Envoie la nouvelle note aux utilisateurs spécifiés. De multiples destainaires peuvent être spécifiés en séparant leur noms par des virgules." + +#: plugin.py:195 +msgid "" +" \n" +"\n" +" Sends a note in reply to .\n" +" " +msgstr "" +" \n" +"\n" +"envoie une note en réponse à celle ." + +#: plugin.py:219 +msgid "" +"\n" +"\n" +" Unsends the note with the id given. You must be the\n" +" author of the note, and it must be unread.\n" +" " +msgstr "" +"\n" +"\n" +"Désenvoie la note d' donné. Vous devez être l'auteur de la note, et elle ne doit pas être lue." + +#: plugin.py:251 +msgid "" +"\n" +"\n" +" Retrieves a single note by its unique note id. Use the 'note list'\n" +" command to see what unread notes you have.\n" +" " +msgstr "" +"\n" +"\n" +"Récupère une seule note par son unique. Utilisez la commande 'note list' pour voir combien de notes non lues vous avez." + +#: plugin.py:281 +msgid "" +"[--{regexp} ] [--sent] []\n" +"\n" +" Searches your received notes for ones matching . If --regexp is\n" +" given, its associated value is taken as a regexp and matched against\n" +" the notes. If --sent is specified, only search sent notes.\n" +" " +msgstr "" +"[--{regexp} ] [--sent] []\n" +"\n" +"Recherche les notes correspondant au dans vos notes reçues. Si --regexp est donné, sa valeur associée est utilisé comme expression régulière et est à nouveau recherchée dans les notes. Si --sent est donné, ne recherche que dans les notes envoyées." + +#: plugin.py:320 +msgid "" +"[--{old,sent}] [--{from,to} ]\n" +"\n" +" Retrieves the ids of all your unread notes. If --old is given, list\n" +" read notes. If --sent is given, list notes that you have sent. If\n" +" --from is specified, only lists notes sent to you from . If\n" +" --to is specified, only lists notes sent by you to .\n" +" " +msgstr "" +"[--{old,sent}] [--{from,to} ]\n" +"\n" +"Récupère les id de toutes vos news non lues. Si --old est donné, liste les news lues. Si --sent est donné, liste les news que vous avez envoyées. Si --from est spécifié, liste seulement les news envoyées par l'. Si --to est spécifié, liste seulement les news envoyées par l'." + +#: plugin.py:361 +msgid "" +"takes no arguments\n" +"\n" +" Retrieves your next unread note, if any.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Récupère votre note non lue suivant, s'il y en a une." + diff --git a/plugins/Note/messages.pot b/plugins/Note/messages.pot new file mode 100644 index 000000000..51be4c044 --- /dev/null +++ b/plugins/Note/messages.pot @@ -0,0 +1,88 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-29 13:54+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:179 +#, docstring +msgid "" +",[,[...]] \n" +"\n" +" Sends a new note to the user specified. Multiple recipients may be\n" +" specified by separating their names by commas.\n" +" " +msgstr "" + +#: plugin.py:195 +#, docstring +msgid "" +" \n" +"\n" +" Sends a note in reply to .\n" +" " +msgstr "" + +#: plugin.py:219 +#, docstring +msgid "" +"\n" +"\n" +" Unsends the note with the id given. You must be the\n" +" author of the note, and it must be unread.\n" +" " +msgstr "" + +#: plugin.py:251 +#, docstring +msgid "" +"\n" +"\n" +" Retrieves a single note by its unique note id. Use the 'note list'\n" +" command to see what unread notes you have.\n" +" " +msgstr "" + +#: plugin.py:281 +#, docstring +msgid "" +"[--{regexp} ] [--sent] []\n" +"\n" +" Searches your received notes for ones matching . If --regexp is\n" +" given, its associated value is taken as a regexp and matched against\n" +" the notes. If --sent is specified, only search sent notes.\n" +" " +msgstr "" + +#: plugin.py:320 +#, docstring +msgid "" +"[--{old,sent}] [--{from,to} ]\n" +"\n" +" Retrieves the ids of all your unread notes. If --old is given, list\n" +" read notes. If --sent is given, list notes that you have sent. If\n" +" --from is specified, only lists notes sent to you from . If\n" +" --to is specified, only lists notes sent by you to .\n" +" " +msgstr "" + +#: plugin.py:361 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Retrieves your next unread note, if any.\n" +" " +msgstr "" + diff --git a/plugins/Note/plugin.py b/plugins/Note/plugin.py index 3fd3cb326..b89de964d 100644 --- a/plugins/Note/plugin.py +++ b/plugins/Note/plugin.py @@ -42,6 +42,8 @@ import supybot.ircmsgs as ircmsgs import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Note') class NoteRecord(dbi.Record): __fields__ = [ diff --git a/plugins/Owner/config.py b/plugins/Owner/config.py index c171db000..cd0fe0f94 100644 --- a/plugins/Owner/config.py +++ b/plugins/Owner/config.py @@ -30,6 +30,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Owner') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Owner/locale/fr.po b/plugins/Owner/locale/fr.po new file mode 100644 index 000000000..c20805298 --- /dev/null +++ b/plugins/Owner/locale/fr.po @@ -0,0 +1,206 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-29 14:47+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:270 +msgid "" +"\n" +"\n" +" Logs to the global Supybot log at critical priority. Useful for\n" +" marking logfiles for later searching.\n" +" " +msgstr "" +"\n" +"\n" +"Log le aux logs globaux de Supybot avec une priorité critique. Utile pour marquer les fichiers de logs pour des recherches ultérieures." + +#: plugin.py:280 +msgid "" +"\n" +"\n" +" Sends to all channels the bot is currently on and not\n" +" lobotomized in.\n" +" " +msgstr "" +"\n" +"\n" +"Envoie le à tous les canaux sur lesquels le bot est sans être lobotomisé." + +#: plugin.py:295 +msgid "" +"[--remove] []\n" +"\n" +" Sets the default plugin for to . If --remove is\n" +" given, removes the current default plugin for . If no plugin\n" +" is given, returns the current default plugin set for . See\n" +" also, supybot.commands.defaultPlugins.importantPlugins.\n" +" " +msgstr "" +"[--remove] []\n" +"\n" +"Défini le par défaut de la . Si --remove est donné, le commande par défaut actuelle est supprimée. Si aucun plugin n'est donné, retourne le plugin par défaut actuel. Voyez supybot.commands.defaultPlugins.importantPlugins pour plus d'informations." + +#: plugin.py:333 +msgid "" +"\n" +"\n" +" Sends the raw string given to the server.\n" +" " +msgstr "" +"\n" +"\n" +"Envoie la chaîne directement au serveur." + +#: plugin.py:347 +msgid "" +"[]\n" +"\n" +" Exits the bot with the QUIT message . If is not given,\n" +" the default quit message (supybot.plugins.Owner.quitMsg) will be used.\n" +" If there is no default quitMsg set, your nick will be used.\n" +" " +msgstr "" +"[]\n" +"\n" +"Fait quitter le bot avec le message de quit . Si le n'est pas donné, le message de quit par défaut (supybot.plugins.Owner.quitMsg) est utilisé. Si quitMsg est vide, votre nick sera utilisé." + +#: plugin.py:363 +msgid "" +"takes no arguments\n" +"\n" +" Runs all the periodic flushers in world.flushers. This includes\n" +" flushing all logs and all configuration changes to disk.\n" +" " +msgstr "" +"ne prend pas d'argument.\n" +"\n" +"Lance tous les 'flushers' périodiques dans world.flushers. Ceci inclue l'écriture des logs et de la configuration sur le disque." + +#: plugin.py:373 +msgid "" +"[]\n" +"\n" +" Runs the standard upkeep stuff (flushes and gc.collects()). If given\n" +" a level, runs that level of upkeep (currently, the only supported\n" +" level is \"high\", which causes the bot to flush a lot of caches as well\n" +" as do normal upkeep stuff.\n" +" " +msgstr "" +"[]\n" +"\n" +"Renvoie le 'upkeep' standard (flushes et gc.collect()). Si un niveau est donné, lance le niveau d'upkeep (actuellement, le seul niveau supporté est \"high\", ce qui fait que le bot vide beaucoup plus de cache que ce qu'il fait normalement)." + +#: plugin.py:412 +msgid "" +"[--deprecated] \n" +"\n" +" Loads the plugin from any of the directories in\n" +" conf.supybot.directories.plugins; usually this includes the main\n" +" installed directory and 'plugins' in the current directory.\n" +" --deprecated is necessary if you wish to load deprecated plugins.\n" +" " +msgstr "" +"[--deprecated] \n" +"\n" +"Charge le de n'importe lequel des répertoires dans conf.supybot.directories.plugins, ce qui inclue généralement le répertoire principal de l'installation, et 'plugins' dans le répertoire courrant. Utilisez --deprected si nécessaire pour charger des plugins dépréciés." + +#: plugin.py:447 +msgid "" +"\n" +"\n" +" Unloads and subsequently reloads the plugin by name; use the 'list'\n" +" command to see a list of the currently loaded plugins.\n" +" " +msgstr "" +"\n" +"\n" +"Décharger et recharge immédiatement le ; utilisez la commande 'list' pour lister les plugins actuellement chargés." + +#: plugin.py:476 +msgid "" +"\n" +"\n" +" Unloads the callback by name; use the 'list' command to see a list\n" +" of the currently loaded callbacks. Obviously, the Owner plugin can't\n" +" be unloaded.\n" +" " +msgstr "" +"\n" +"\n" +"Décharger le ; utilisez la commande 'list' pour lister les plugins actuellement chargés. Évidemment, le plugin Owner ne peut être déchargé." + +#: plugin.py:500 +msgid "" +"{add|remove} \n" +"\n" +" Adds or removes (according to the first argument) from the\n" +" default capabilities given to users (the configuration variable\n" +" supybot.capabilities stores these).\n" +" " +msgstr "" +"{add|remove} \n" +"\n" +"Ajoute ou supprime (en fonction du premier argument) la à la liste des permissions par défaut données aux utilisateurs (stockée dans la variable de configuration supybot.capabilities)." + +#: plugin.py:525 +msgid "" +"[] \n" +"\n" +" Disables the command for all users (including the owners).\n" +" If is given, only disables the from . If\n" +" you want to disable a command for most users but not for yourself, set\n" +" a default capability of -plugin.command or -command (if you want to\n" +" disable the command in all plugins).\n" +" " +msgstr "" +"[] \n" +"\n" +"Désactive la pour tous les utilisateurs (y compris le propriétaire. Si le est donné, ne désactive la que pour le . Si vous voulez désactiver la commande pour tous les utilisateurs sauf vous-même, définissez la permission par défaut -plugin.command ou -command." + +#: plugin.py:552 +msgid "" +"[] \n" +"\n" +" Enables the command for all users. If \n" +" if given, only enables the from . This command is\n" +" the inverse of disable.\n" +" " +msgstr "" +"[] \n" +"\n" +"Active la pour tous les utilisateurs. Si le est donné, ne réactive la que pour le . Cette commande est l'inverse de disable." + +#: plugin.py:571 +msgid "" +" \n" +"\n" +" Renames in to the .\n" +" " +msgstr "" +" \n" +"\n" +"Renomme la du par un ." + +#: plugin.py:588 +msgid "" +"\n" +"\n" +" Removes all renames in . The plugin will be reloaded after\n" +" this command is run.\n" +" " +msgstr "" +"\n" +"\n" +"Supprime tous les renommages du . Ce plugin sera rechargé après que cette commande ait été lancée." + diff --git a/plugins/Owner/messages.pot b/plugins/Owner/messages.pot new file mode 100644 index 000000000..537cb4a05 --- /dev/null +++ b/plugins/Owner/messages.pot @@ -0,0 +1,178 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-29 14:47+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:270 +#, docstring +msgid "" +"\n" +"\n" +" Logs to the global Supybot log at critical priority. Useful for\n" +" marking logfiles for later searching.\n" +" " +msgstr "" + +#: plugin.py:280 +#, docstring +msgid "" +"\n" +"\n" +" Sends to all channels the bot is currently on and not\n" +" lobotomized in.\n" +" " +msgstr "" + +#: plugin.py:295 +#, docstring +msgid "" +"[--remove] []\n" +"\n" +" Sets the default plugin for to . If --remove is\n" +" given, removes the current default plugin for . If no plugin\n" +" is given, returns the current default plugin set for . See\n" +" also, supybot.commands.defaultPlugins.importantPlugins.\n" +" " +msgstr "" + +#: plugin.py:333 +#, docstring +msgid "" +"\n" +"\n" +" Sends the raw string given to the server.\n" +" " +msgstr "" + +#: plugin.py:347 +#, docstring +msgid "" +"[]\n" +"\n" +" Exits the bot with the QUIT message . If is not given,\n" +" the default quit message (supybot.plugins.Owner.quitMsg) will be used.\n" +" If there is no default quitMsg set, your nick will be used.\n" +" " +msgstr "" + +#: plugin.py:363 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Runs all the periodic flushers in world.flushers. This includes\n" +" flushing all logs and all configuration changes to disk.\n" +" " +msgstr "" + +#: plugin.py:373 +#, docstring +msgid "" +"[]\n" +"\n" +" Runs the standard upkeep stuff (flushes and gc.collects()). If given\n" +" a level, runs that level of upkeep (currently, the only supported\n" +" level is \"high\", which causes the bot to flush a lot of caches as well\n" +" as do normal upkeep stuff.\n" +" " +msgstr "" + +#: plugin.py:412 +#, docstring +msgid "" +"[--deprecated] \n" +"\n" +" Loads the plugin from any of the directories in\n" +" conf.supybot.directories.plugins; usually this includes the main\n" +" installed directory and 'plugins' in the current directory.\n" +" --deprecated is necessary if you wish to load deprecated plugins.\n" +" " +msgstr "" + +#: plugin.py:447 +#, docstring +msgid "" +"\n" +"\n" +" Unloads and subsequently reloads the plugin by name; use the 'list'\n" +" command to see a list of the currently loaded plugins.\n" +" " +msgstr "" + +#: plugin.py:476 +#, docstring +msgid "" +"\n" +"\n" +" Unloads the callback by name; use the 'list' command to see a list\n" +" of the currently loaded callbacks. Obviously, the Owner plugin can't\n" +" be unloaded.\n" +" " +msgstr "" + +#: plugin.py:500 +#, docstring +msgid "" +"{add|remove} \n" +"\n" +" Adds or removes (according to the first argument) from the\n" +" default capabilities given to users (the configuration variable\n" +" supybot.capabilities stores these).\n" +" " +msgstr "" + +#: plugin.py:525 +#, docstring +msgid "" +"[] \n" +"\n" +" Disables the command for all users (including the owners).\n" +" If is given, only disables the from . If\n" +" you want to disable a command for most users but not for yourself, set\n" +" a default capability of -plugin.command or -command (if you want to\n" +" disable the command in all plugins).\n" +" " +msgstr "" + +#: plugin.py:552 +#, docstring +msgid "" +"[] \n" +"\n" +" Enables the command for all users. If \n" +" if given, only enables the from . This command is\n" +" the inverse of disable.\n" +" " +msgstr "" + +#: plugin.py:571 +#, docstring +msgid "" +" \n" +"\n" +" Renames in to the .\n" +" " +msgstr "" + +#: plugin.py:588 +#, docstring +msgid "" +"\n" +"\n" +" Removes all renames in . The plugin will be reloaded after\n" +" this command is run.\n" +" " +msgstr "" + diff --git a/plugins/Owner/plugin.py b/plugins/Owner/plugin.py index c025529db..e825de208 100644 --- a/plugins/Owner/plugin.py +++ b/plugins/Owner/plugin.py @@ -42,6 +42,7 @@ else: import supybot.log as log import supybot.conf as conf +import supybot.i18n as i18n import supybot.utils as utils import supybot.world as world import supybot.ircdb as ircdb @@ -54,6 +55,8 @@ import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.registry as registry import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Owner') ### # supybot.commands. @@ -597,6 +600,12 @@ class Owner(callbacks.Plugin): self.reload(irc, msg, [plugin.name()]) # This makes the replySuccess. unrename = wrap(unrename, ['plugin']) + def reloadlocale(self, irc, msg, args): + """takes no argument + + Reloads the locale of the bot.""" + i18n.reloadLocales() + irc.replySuccess() Class = Owner diff --git a/plugins/Plugin/config.py b/plugins/Plugin/config.py index 3a0891ace..f9d0cd673 100644 --- a/plugins/Plugin/config.py +++ b/plugins/Plugin/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Plugin') def configure(advanced): # This will be called by supybot to configure this module. advanced is diff --git a/plugins/Plugin/locale/fr.po b/plugins/Plugin/locale/fr.po new file mode 100644 index 000000000..d62ab426e --- /dev/null +++ b/plugins/Plugin/locale/fr.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-16 13:50+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:43 +msgid "" +"This plugin exists to help users manage their plugins. Use 'plugin\n" +" list' to list the loaded plugins; use 'plugin help' to get the description\n" +" of a plugin; use the 'plugin' command itself to determine what plugin a\n" +" command exists in." +msgstr "Ce plugin existe pour aider les utilisateurs à gérer leurs plugins. Utilisez 'list' pour liser les plugins chargés ; utilisez 'help' pour avoir de l'aide quant à d'autres plugins ; utilisez la commande 'plugin' elle-même pour déterminer dans quel plugin une commande existe." + +#: plugin.py:49 +msgid "" +"\n" +"\n" +" Returns a useful description of how to use , if the plugin has\n" +" one.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne une description utile de comment utiliser le , si le plugin en a une." + +#: plugin.py:58 +msgid "That plugin is loaded, but has no plugin help." +msgstr "Ce plugin est chargé mais n'a pas d'aide." + +#: plugin.py:63 +msgid "" +"takes no arguments\n" +"\n" +" Returns a list of the currently loaded plugins.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne une liste des plugins actuellement chargés." + +#: plugin.py:74 +msgid "" +"\n" +"\n" +" Returns the plugin(s) that is in.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le(s) plugin(s) ayant la ." + +#: plugin.py:89 +msgid "plugins" +msgstr "plugins" + +#: plugin.py:91 +msgid "plugin" +msgstr "plugin" + +#: plugin.py:92 +msgid "The %q command is available in the %L %s." +msgstr "La commande %q est disponibles dans le(s) plugin(s) %L%v." + +#: plugin.py:95 +msgid "There is no command %q." +msgstr "Il n'y a pas de commande %q." + +#: plugin.py:100 +msgid "" +"\n" +"\n" +" Returns the author of . This is the person you should talk to\n" +" if you have ideas, suggestions, or other comments about a given plugin.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne l'auteur du . C'est la personne à qui vous devriez parler si vous avez des idées, suggestions, ou d'autres commentaires à propos d'un plugin donné." + +#: plugin.py:106 +msgid "That plugin does not seem to be loaded." +msgstr "Ce plugin ne semble pas être chargé." + +#: plugin.py:112 +msgid "That plugin doesn't have an author that claims it." +msgstr "Ce plugin n'a pas d'auteur." + +#: plugin.py:117 +msgid "" +" []\n" +"\n" +" Replies with a list of people who made contributions to a given plugin.\n" +" If is specified, that person's specific contributions will\n" +" be listed. Note: The is the part inside of the parentheses\n" +" in the people listing.\n" +" " +msgstr "" +" []\n" +"\n" +"Renvoie une liste des personnes ayant contribué à un plugin donné. Si le est spécifié, les contributions de cette personne seront lisées. Note : est la partie entre parenthèses lors du listing des personnes." + +#: plugin.py:125 +msgid "" +"\n" +" Take an Authors object, and return only the name and nick values\n" +" in the format 'First Last (nick)'.\n" +" " +msgstr "" + +#: plugin.py:131 +msgid "" +"\n" +" Take a list of long names and turn it into :\n" +" shortname[, shortname and shortname].\n" +" " +msgstr "" + +#: plugin.py:138 +msgid "" +"\n" +" Sort the list of 'long names' based on the number of contributions\n" +" associated with each.\n" +" " +msgstr "" + +#: plugin.py:148 +msgid "" +"\n" +" Build the list of author + contributors (if any) for the requested\n" +" plugin.\n" +" " +msgstr "" + +#: plugin.py:152 +msgid "The %s plugin" +msgstr "Le plugin s" + +#: plugin.py:153 +msgid "has not been claimed by an author" +msgstr "n'a aucun auteur" + +#: plugin.py:154 +msgid "and" +msgstr "et" + +#: plugin.py:155 +msgid "has no contributors listed." +msgstr "n'a pas de contributeur listé." + +#: plugin.py:160 +msgid "was written by %s" +msgstr "a été écrit par %s" + +#: plugin.py:171 +msgid "%s %h contributed to it." +msgstr "%s y %h contribué." + +#: plugin.py:176 +msgid "has no additional contributors listed." +msgstr "n'a pas d'autre contributeur listé." + +#: plugin.py:178 +msgid "but" +msgstr "mais" + +#: plugin.py:181 +msgid "" +"\n" +" Build the list of contributions (if any) for the requested person\n" +" for the requested plugin\n" +" " +msgstr "" + +#: plugin.py:195 +msgid "The nick specified (%s) is not a registered contributor." +msgstr "Le nick spécifié(%s) n'est pas un contributeur enregistré." + +#: plugin.py:201 +msgid "The %s plugin does not have '%s' listed as a contributor." +msgstr "Le plugin %s n'a pas '%s' listé comme contributeur." + +#: plugin.py:209 +msgid "command" +msgstr "commande" + +#: plugin.py:212 +msgid "the %L %s" +msgstr "La/les commande(s) %L%v" + +#: plugin.py:214 +msgid "the %L" +msgstr "La/les %L" + +#: plugin.py:217 +msgid "%s wrote the %s plugin and also contributed %L." +msgstr "%s a écrit le plugin %s et a aussi contribué à %L" + +#: plugin.py:220 +msgid "%s contributed %L to the %s plugin." +msgstr "%s a contribué à %L et au plugin %s" + +#: plugin.py:223 +msgid "%s wrote the %s plugin" +msgstr "%s a écrit le plugin %s" + +#: plugin.py:226 +msgid "%s has no listed contributions for the %s plugin." +msgstr "%s n'a pas de contribution listée pour le plugin %s." + diff --git a/plugins/Plugin/messages.pot b/plugins/Plugin/messages.pot new file mode 100644 index 000000000..3e978d574 --- /dev/null +++ b/plugins/Plugin/messages.pot @@ -0,0 +1,217 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-16 13:50+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:43 +#, docstring +msgid "" +"This plugin exists to help users manage their plugins. Use 'plugin\n" +" list' to list the loaded plugins; use 'plugin help' to get the description\n" +" of a plugin; use the 'plugin' command itself to determine what plugin a\n" +" command exists in." +msgstr "" + +#: plugin.py:49 +#, docstring +msgid "" +"\n" +"\n" +" Returns a useful description of how to use , if the plugin has\n" +" one.\n" +" " +msgstr "" + +#: plugin.py:58 +msgid "That plugin is loaded, but has no plugin help." +msgstr "" + +#: plugin.py:63 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns a list of the currently loaded plugins.\n" +" " +msgstr "" + +#: plugin.py:74 +#, docstring +msgid "" +"\n" +"\n" +" Returns the plugin(s) that is in.\n" +" " +msgstr "" + +#: plugin.py:89 +msgid "plugins" +msgstr "" + +#: plugin.py:91 +msgid "plugin" +msgstr "" + +#: plugin.py:92 +msgid "The %q command is available in the %L %s." +msgstr "" + +#: plugin.py:95 +msgid "There is no command %q." +msgstr "" + +#: plugin.py:100 +#, docstring +msgid "" +"\n" +"\n" +" Returns the author of . This is the person you should talk to\n" +" if you have ideas, suggestions, or other comments about a given plugin.\n" +" " +msgstr "" + +#: plugin.py:106 +msgid "That plugin does not seem to be loaded." +msgstr "" + +#: plugin.py:112 +msgid "That plugin doesn't have an author that claims it." +msgstr "" + +#: plugin.py:117 +#, docstring +msgid "" +" []\n" +"\n" +" Replies with a list of people who made contributions to a given plugin.\n" +" If is specified, that person's specific contributions will\n" +" be listed. Note: The is the part inside of the parentheses\n" +" in the people listing.\n" +" " +msgstr "" + +#: plugin.py:125 +#, docstring +msgid "" +"\n" +" Take an Authors object, and return only the name and nick values\n" +" in the format 'First Last (nick)'.\n" +" " +msgstr "" + +#: plugin.py:131 +#, docstring +msgid "" +"\n" +" Take a list of long names and turn it into :\n" +" shortname[, shortname and shortname].\n" +" " +msgstr "" + +#: plugin.py:138 +#, docstring +msgid "" +"\n" +" Sort the list of 'long names' based on the number of contributions\n" +" associated with each.\n" +" " +msgstr "" + +#: plugin.py:148 +#, docstring +msgid "" +"\n" +" Build the list of author + contributors (if any) for the requested\n" +" plugin.\n" +" " +msgstr "" + +#: plugin.py:152 +msgid "The %s plugin" +msgstr "" + +#: plugin.py:153 +msgid "has not been claimed by an author" +msgstr "" + +#: plugin.py:154 +msgid "and" +msgstr "" + +#: plugin.py:155 +msgid "has no contributors listed." +msgstr "" + +#: plugin.py:160 +msgid "was written by %s" +msgstr "" + +#: plugin.py:171 +msgid "%s %h contributed to it." +msgstr "" + +#: plugin.py:176 +msgid "has no additional contributors listed." +msgstr "" + +#: plugin.py:178 +msgid "but" +msgstr "" + +#: plugin.py:181 +#, docstring +msgid "" +"\n" +" Build the list of contributions (if any) for the requested person\n" +" for the requested plugin\n" +" " +msgstr "" + +#: plugin.py:195 +msgid "The nick specified (%s) is not a registered contributor." +msgstr "" + +#: plugin.py:201 +msgid "The %s plugin does not have '%s' listed as a contributor." +msgstr "" + +#: plugin.py:209 +msgid "command" +msgstr "" + +#: plugin.py:212 +msgid "the %L %s" +msgstr "" + +#: plugin.py:214 +msgid "the %L" +msgstr "" + +#: plugin.py:217 +msgid "%s wrote the %s plugin and also contributed %L." +msgstr "" + +#: plugin.py:220 +msgid "%s contributed %L to the %s plugin." +msgstr "" + +#: plugin.py:223 +msgid "%s wrote the %s plugin" +msgstr "" + +#: plugin.py:226 +msgid "%s has no listed contributions for the %s plugin." +msgstr "" + diff --git a/plugins/Plugin/plugin.py b/plugins/Plugin/plugin.py index 6753125ce..a6f6e5f1a 100644 --- a/plugins/Plugin/plugin.py +++ b/plugins/Plugin/plugin.py @@ -34,6 +34,8 @@ from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Plugin') class Plugin(callbacks.Plugin): @@ -41,6 +43,7 @@ class Plugin(callbacks.Plugin): list' to list the loaded plugins; use 'plugin help' to get the description of a plugin; use the 'plugin' command itself to determine what plugin a command exists in.""" + @internationalizeDocstring def help(self, irc, msg, args, cb): """ @@ -51,9 +54,10 @@ class Plugin(callbacks.Plugin): if doc: irc.reply(utils.str.normalizeWhitespace(doc)) else: - irc.reply('That plugin is loaded, but has no plugin help.') + irc.reply(_('That plugin is loaded, but has no plugin help.')) help = wrap(help, ['plugin']) + @internationalizeDocstring def list(self, irc, msg, args): """takes no arguments @@ -64,6 +68,7 @@ class Plugin(callbacks.Plugin): irc.reply(format('%L', L)) list = wrap(list) + @internationalizeDocstring def plugin(self, irc, msg, args, command): """ @@ -80,15 +85,16 @@ class Plugin(callbacks.Plugin): irc.reply(format('%L', L)) else: if len(L) > 1: - plugin = 'plugins' + plugin = _('plugins') else: - plugin = 'plugin' - irc.reply(format('The %q command is available in the %L %s.', - command, L, plugin)) + plugin = _('plugin') + irc.reply(format(_('The %q command is available in the %L ' + '%s.'), command, L, plugin)) else: - irc.error(format('There is no command %q.', command)) + irc.error(format(_('There is no command %q.'), command)) plugin = wrap(plugin, [many('something')]) + @internationalizeDocstring def author(self, irc, msg, args, cb): """ @@ -96,15 +102,16 @@ class Plugin(callbacks.Plugin): if you have ideas, suggestions, or other comments about a given plugin. """ if cb is None: - irc.error('That plugin does not seem to be loaded.') + irc.error(_('That plugin does not seem to be loaded.')) return module = cb.classModule if hasattr(module, '__author__') and module.__author__: irc.reply(str(module.__author__)) else: - irc.reply('That plugin doesn\'t have an author that claims it.') + irc.reply(_('That plugin doesn\'t have an author that claims it.')) author = wrap(author, [('plugin')]) + @internationalizeDocstring def contributors(self, irc, msg, args, cb, nick): """ [] @@ -141,15 +148,15 @@ class Plugin(callbacks.Plugin): Build the list of author + contributors (if any) for the requested plugin. """ - head = 'The %s plugin' % cb.name() - author = 'has not been claimed by an author' - conjunction = 'and' - contrib = 'has no contributors listed.' + head = _('The %s plugin') % cb.name() + author = _('has not been claimed by an author') + conjunction = _('and') + contrib = _('has no contributors listed.') hasAuthor = False hasContribs = False if hasattr(module, '__author__'): if module.__author__ != supybot.authors.unknown: - author = 'was written by %s' % \ + author = _('was written by %s') % \ utils.web.mungeEmail(str(module.__author__)) hasAuthor = True if hasattr(module, '__contributors__'): @@ -160,14 +167,14 @@ class Plugin(callbacks.Plugin): except ValueError: pass if contribs: - contrib = format('%s %h contributed to it.', + contrib = format(_('%s %h contributed to it.'), buildContributorsString(contribs), len(contribs)) hasContribs = True elif hasAuthor: - contrib = 'has no additional contributors listed.' + contrib = _('has no additional contributors listed.') if hasContribs and not hasAuthor: - conjunction = 'but' + conjunction = _('but') return ' '.join([head, author, conjunction, contrib]) def buildPersonString(module): """ @@ -184,39 +191,39 @@ class Plugin(callbacks.Plugin): break authorInfo = authorInfo or getattr(supybot.authors, nick, None) if not authorInfo: - return 'The nick specified (%s) is not a registered ' \ - 'contributor.' % nick + return _('The nick specified (%s) is not a registered ' + 'contributor.') % nick fullName = utils.web.mungeEmail(str(authorInfo)) contributions = [] if hasattr(module, '__contributors__'): if authorInfo not in module.__contributors__: - return 'The %s plugin does not have \'%s\' listed as a ' \ - 'contributor.' % (cb.name(), nick) + return _('The %s plugin does not have \'%s\' listed as a ' + 'contributor.') % (cb.name(), nick) contributions = module.__contributors__[authorInfo] isAuthor = getattr(module, '__author__', False) == authorInfo (nonCommands, commands) = utils.iter.partition(lambda s: ' ' in s, contributions) results = [] if commands: - s = 'command' + s = _('command') if len(commands) > 1: s = utils.str.pluralize(s) - results.append(format('the %L %s', commands, s)) + results.append(format(_('the %L %s'), commands, s)) if nonCommands: - results.append(format('the %L', nonCommands)) + results.append(format(_('the %L'), nonCommands)) if results and isAuthor: return format( - '%s wrote the %s plugin and also contributed %L.', + _('%s wrote the %s plugin and also contributed %L.'), (fullName, cb.name(), results)) elif results and not isAuthor: - return format('%s contributed %L to the %s plugin.', + return format(_('%s contributed %L to the %s plugin.'), fullName, results, cb.name()) elif isAuthor and not results: - return '%s wrote the %s plugin' % (fullName, cb.name()) + return _('%s wrote the %s plugin') % (fullName, cb.name()) # XXX Does this ever actually get reached? else: - return '%s has no listed contributions for the %s plugin.' % \ - (fullName, cb.name()) + return _('%s has no listed contributions for the %s ' + 'plugin.') % (fullName, cb.name()) # First we need to check and see if the requested plugin is loaded module = cb.classModule if not nick: @@ -225,6 +232,7 @@ class Plugin(callbacks.Plugin): nick = ircutils.toLower(nick) irc.reply(buildPersonString(module)) contributors = wrap(contributors, ['plugin', additional('nick')]) +Plugin = internationalizeDocstring(Plugin) Class = Plugin diff --git a/plugins/Praise/config.py b/plugins/Praise/config.py index b16b5d842..fc5aadd62 100644 --- a/plugins/Praise/config.py +++ b/plugins/Praise/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Praise') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,10 +44,10 @@ def configure(advanced): Praise = conf.registerPlugin('Praise') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Praise, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) conf.registerChannelValue(Praise, 'showIds', - registry.Boolean(False, """Determines whether the bot will show the ids of - a praise when the praise is given.""")) + registry.Boolean(False, _("""Determines whether the bot will show the ids of + a praise when the praise is given."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Praise/locale/fr.po b/plugins/Praise/locale/fr.po new file mode 100644 index 000000000..935fbef77 --- /dev/null +++ b/plugins/Praise/locale/fr.po @@ -0,0 +1,59 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 18:33+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:49 +msgid "" +"Determines whether the bot will show the ids of\n" +" a praise when the praise is given." +msgstr "Détermine si le bot affichera les ids des louanges lorsqu'une louange est donnée." + +#: plugin.py:40 +msgid "" +"Praise is a plugin for ... well, praising things. Feel free to add\n" +" your own flavor to it by customizing what praises it gives. Use \"praise\n" +" add \" to add new ones, making sure to include \"$who\" in where\n" +" you want to insert the thing being praised.\n" +" " +msgstr "Praise est un plugin pour... mmh... louer des gens et des choses. Sentez-vous libre de personnaliser à votre goût pourquoi vous louez ceci. Utilisez \"praise add\" pour ajouter les vôtres, et assurez-vous d'ajouter \"$who\" dans le là où vous voulez insérer le nom de la chose à louer." + +#: plugin.py:54 +msgid "Praises must contain $who." +msgstr "Les louanges doivent contenir $who" + +#: plugin.py:58 +msgid "" +"[] [] [for ]\n" +"\n" +" Praises (for , if given). If is given, uses\n" +" that specific praise. is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" +"[] [] [for ]\n" +"\n" +"Loue (pour la , si elle est donnée). Si l' est donné, utilise une louange spécifique. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:74 +msgid "There is no praise with id #%i." +msgstr "Il n'y a pas de louange d'id #%i" + +#: plugin.py:79 +msgid "There are no praises in my database for %s." +msgstr "Il n'y a pas de louange dans ma base de données pour %s." + +#: plugin.py:87 +msgid " for " +msgstr " pour " + diff --git a/plugins/Praise/messages.pot b/plugins/Praise/messages.pot new file mode 100644 index 000000000..81a2b8502 --- /dev/null +++ b/plugins/Praise/messages.pot @@ -0,0 +1,60 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 18:33+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:49 +msgid "" +"Determines whether the bot will show the ids of\n" +" a praise when the praise is given." +msgstr "" + +#: plugin.py:40 +#, docstring +msgid "" +"Praise is a plugin for ... well, praising things. Feel free to add\n" +" your own flavor to it by customizing what praises it gives. Use \"praise\n" +" add \" to add new ones, making sure to include \"$who\" in where\n" +" you want to insert the thing being praised.\n" +" " +msgstr "" + +#: plugin.py:54 +msgid "Praises must contain $who." +msgstr "" + +#: plugin.py:58 +#, docstring +msgid "" +"[] [] [for ]\n" +"\n" +" Praises (for , if given). If is given, uses\n" +" that specific praise. is only necessary if the message isn't\n" +" sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:74 +msgid "There is no praise with id #%i." +msgstr "" + +#: plugin.py:79 +msgid "There are no praises in my database for %s." +msgstr "" + +#: plugin.py:87 +msgid " for " +msgstr "" + diff --git a/plugins/Praise/plugin.py b/plugins/Praise/plugin.py index dd6ad4171..f34ac8993 100644 --- a/plugins/Praise/plugin.py +++ b/plugins/Praise/plugin.py @@ -32,6 +32,8 @@ import re from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Praise') class Praise(plugins.ChannelIdDatabasePlugin): """Praise is a plugin for ... well, praising things. Feel free to add @@ -48,8 +50,9 @@ class Praise(plugins.ChannelIdDatabasePlugin): def addValidator(self, irc, text): if '$who' not in text: - irc.error('Praises must contain $who.', Raise=True) + irc.error(_('Praises must contain $who.'), Raise=True) + @internationalizeDocstring def praise(self, irc, msg, args, channel, id, text): """[] [] [for ] @@ -67,24 +70,25 @@ class Praise(plugins.ChannelIdDatabasePlugin): try: praise = self.db.get(channel, id) except KeyError: - irc.error(format('There is no praise with id #%i.', id)) + irc.error(format(_('There is no praise with id #%i.'), id)) return else: praise = self.db.random(channel) if not praise: - irc.error(format('There are no praises in my database ' \ - 'for %s.', channel)) + irc.error(format(_('There are no praises in my database ' \ + 'for %s.'), channel)) return text = self._replaceFirstPerson(praise.text, msg.nick) reason = self._replaceFirstPerson(reason, msg.nick) target = self._replaceFirstPerson(target, msg.nick) text = text.replace('$who', target) if reason: - text += ' for ' + reason + text += _(' for ') + reason if self.registryValue('showIds', channel): text += format(' (#%i)', praise.id) irc.reply(text, action=True) praise = wrap(praise, ['channeldb', optional('id'), 'text']) +Praise = internationalizeDocstring(Praise) Class = Praise diff --git a/plugins/Protector/config.py b/plugins/Protector/config.py index 977bd0d7a..b4d10f417 100644 --- a/plugins/Protector/config.py +++ b/plugins/Protector/config.py @@ -30,6 +30,8 @@ import supybot.conf as conf import supybot.ircutils as ircutils import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Protector') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,17 +44,17 @@ def configure(advanced): Protector = conf.registerPlugin('Protector') conf.registerChannelValue(Protector, 'enable', - registry.Boolean(True, """Determines whether this plugin is enabled in a - given channel.""")) + registry.Boolean(True, _("""Determines whether this plugin is enabled in a + given channel."""))) class ImmuneNicks(conf.ValidNicks): List = ircutils.IrcSet conf.registerChannelValue(Protector, 'immune', - ImmuneNicks([], """Determines what nicks the bot will consider to + ImmuneNicks([], _("""Determines what nicks the bot will consider to be immune from enforcement. These nicks will not even have their actions watched by this plugin. In general, only the ChanServ for this network - will be in this list.""")) + will be in this list."""))) diff --git a/plugins/Protector/locale/fr.po b/plugins/Protector/locale/fr.po new file mode 100644 index 000000000..0b4058dac --- /dev/null +++ b/plugins/Protector/locale/fr.po @@ -0,0 +1,29 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 18:34+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:47 +msgid "" +"Determines whether this plugin is enabled in a\n" +" given channel." +msgstr "Détermine si le plugin est activé sur un canal donné." + +#: config.py:54 +msgid "" +"Determines what nicks the bot will consider to\n" +" be immune from enforcement. These nicks will not even have their actions\n" +" watched by this plugin. In general, only the ChanServ for this network\n" +" will be in this list." +msgstr "Détermine quels nicks le bot considérera comme imunisés. Les actions de ces nicks ne seront pas surveillés par ce plugin. En général, seul le ChanServ de ce réseau doit être dans cette liste." + diff --git a/plugins/Protector/messages.pot b/plugins/Protector/messages.pot new file mode 100644 index 000000000..0bb646f0a --- /dev/null +++ b/plugins/Protector/messages.pot @@ -0,0 +1,31 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 18:34+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:47 +msgid "" +"Determines whether this plugin is enabled in a\n" +" given channel." +msgstr "" + +#: config.py:54 +msgid "" +"Determines what nicks the bot will consider to\n" +" be immune from enforcement. These nicks will not even have their actions\n" +" watched by this plugin. In general, only the ChanServ for this network\n" +" will be in this list." +msgstr "" + diff --git a/plugins/Protector/plugin.py b/plugins/Protector/plugin.py index cae90feeb..b90e3c2de 100644 --- a/plugins/Protector/plugin.py +++ b/plugins/Protector/plugin.py @@ -32,6 +32,8 @@ import supybot.ircdb as ircdb import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Protector') class Protector(callbacks.Plugin): def isImmune(self, irc, msg): diff --git a/plugins/Quote/config.py b/plugins/Quote/config.py index 39813e5d6..1d1a2cfeb 100644 --- a/plugins/Quote/config.py +++ b/plugins/Quote/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Quote') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,7 +44,7 @@ def configure(advanced): Quote = conf.registerPlugin('Quote') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Quote, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Quote/locale/fr.po b/plugins/Quote/locale/fr.po new file mode 100644 index 000000000..81a453816 --- /dev/null +++ b/plugins/Quote/locale/fr.po @@ -0,0 +1,31 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 18:34+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:38 +msgid "" +"[]\n" +"\n" +" Returns a random quote from . is only necessary if\n" +" the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne une citation aléatoire du . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:47 +msgid "I have no quotes in my database for %s." +msgstr "Je n'ai pas de citation dans ma base de données pour %s." + diff --git a/plugins/Quote/messages.pot b/plugins/Quote/messages.pot new file mode 100644 index 000000000..7d85fdf6e --- /dev/null +++ b/plugins/Quote/messages.pot @@ -0,0 +1,31 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 18:34+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:38 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns a random quote from . is only necessary if\n" +" the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:47 +msgid "I have no quotes in my database for %s." +msgstr "" + diff --git a/plugins/Quote/plugin.py b/plugins/Quote/plugin.py index c1f0d938a..c18bc750d 100644 --- a/plugins/Quote/plugin.py +++ b/plugins/Quote/plugin.py @@ -29,8 +29,11 @@ from supybot.commands import * import supybot.plugins as plugins +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Quote') class Quote(plugins.ChannelIdDatabasePlugin): + @internationalizeDocstring def random(self, irc, msg, args, channel): """[] @@ -41,7 +44,7 @@ class Quote(plugins.ChannelIdDatabasePlugin): if quote: irc.reply(self.showRecord(quote)) else: - irc.error('I have no quotes in my database for %s.' % channel) + irc.error(_('I have no quotes in my database for %s.') % channel) random = wrap(random, ['channeldb']) Class = Quote diff --git a/plugins/QuoteGrabs/config.py b/plugins/QuoteGrabs/config.py index 27a8f7b0e..18219a8b3 100644 --- a/plugins/QuoteGrabs/config.py +++ b/plugins/QuoteGrabs/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('QuoteGrabs') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,24 +44,24 @@ def configure(advanced): QuoteGrabs = conf.registerPlugin('QuoteGrabs') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(QuoteGrabs, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs, 'randomGrabber', - registry.Boolean(False, """Determines whether the bot will randomly grab + registry.Boolean(False, _("""Determines whether the bot will randomly grab possibly-suitable quotes on occasion. The suitability of a given message - is determined by ...""")) + is determined by ..."""))) conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber, 'averageTimeBetweenGrabs', - registry.PositiveInteger(864000, """Determines about how many seconds, on + registry.PositiveInteger(864000, _("""Determines about how many seconds, on average, should elapse between random grabs. This is only an average value; grabs can happen from any time after half this time until never, - although that's unlikely to occur.""")) + although that's unlikely to occur."""))) conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber, - 'minimumWords', registry.PositiveInteger(3, """Determines the minimum + 'minimumWords', registry.PositiveInteger(3, _("""Determines the minimum number of words in a message for it to be considered for random - grabbing.""")) + grabbing."""))) conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber, - 'minimumCharacters', registry.PositiveInteger(8, """Determines the + 'minimumCharacters', registry.PositiveInteger(8, _("""Determines the minimum number of characters in a message for it to be considered for - random grabbing.""")) + random grabbing."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/QuoteGrabs/locale/fr.po b/plugins/QuoteGrabs/locale/fr.po new file mode 100644 index 000000000..40fe2091f --- /dev/null +++ b/plugins/QuoteGrabs/locale/fr.po @@ -0,0 +1,181 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-17 18:36+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:49 +msgid "" +"Determines whether the bot will randomly grab\n" +" possibly-suitable quotes on occasion. The suitability of a given message\n" +" is determined by ..." +msgstr "Détermine si le bot récupèrera automatiquement des quotes éligible à une quote. L'éligibilté est déterminée par..." + +#: config.py:54 +msgid "" +"Determines about how many seconds, on\n" +" average, should elapse between random grabs. This is only an average\n" +" value; grabs can happen from any time after half this time until never,\n" +" although that's unlikely to occur." +msgstr "Détermine le nombre de secondes, en moyenne, entre deux récupération de citations. Il s'agit seulement d'une moyenne, et les prises de citation peuvent être faites n'importe quand après la moitié de ce temps, voire jamais, même si c'est improbable." + +#: config.py:59 +msgid "" +"Determines the minimum\n" +" number of words in a message for it to be considered for random\n" +" grabbing." +msgstr "Détermine le nombre minimum de mots dans un message pour être éligible à la quotation aléatoire." + +#: config.py:63 +msgid "" +"Determines the\n" +" minimum number of characters in a message for it to be considered for\n" +" random grabbing." +msgstr "Détermine le nombre minimum de caractères dans un message pour être éligible à la quotation aléatoire." + +#: plugin.py:57 +msgid "%s (Said by: %s; grabbed by %s at %t)" +msgstr "%s (Dit par %s ; récupéré par %s à %t)" + +#: plugin.py:210 +msgid "Add the help for \"@help QuoteGrabs\" here." +msgstr "" + +#: plugin.py:249 +msgid "" +"[] \n" +"\n" +" Grabs a quote from by for the quotegrabs table.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Récupère une quote du par le dans la table des citations. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:262 +msgid "You can't quote grab yourself." +msgstr "Vous ne pouvez récupérer des citations de vous-même." + +#: plugin.py:269 +msgid "I couldn't find a proper message to grab." +msgstr "Je ne peux trouver de message à quoter." + +#: plugin.py:274 +msgid "" +"[] \n" +"\n" +" Removes the grab (the last by default) on .\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Supprime la quote désignée par le (la dernière par défaut) sur le . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:285 +msgid "Nothing to ungrab." +msgstr "Rien à dé-quoter" + +#: plugin.py:287 +msgid "Invalid grab number." +msgstr "Numéro de quote invalide." + +#: plugin.py:292 +msgid "" +"[] \n" +"\n" +" Returns 's latest quote grab in . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne le nick de la dernière personne citée sur le . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:300 +msgid "I couldn't find a matching quotegrab for %s." +msgstr "Je ne peux trouver de quote coresspondant à %s." + +#: plugin.py:306 +msgid "" +"[] \n" +"\n" +" Returns a list of shortened quotes that have been grabbed for \n" +" as well as the id of each quote. These ids can be used to get the\n" +" full quote. is only necessary if the message isn't sent in\n" +" the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne une liste de quotes raccourcies que ont été récupérées pour le , ainsi que l'id de chaque quote. Les ids peuvent être utilisés pour récupérer les quotes entières. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:323 +msgid "I couldn't find any quotegrabs for %s." +msgstr "Je ne peux trouver de citation pour %s" + +#: plugin.py:329 +msgid "" +"[] []\n" +"\n" +" Returns a randomly grabbed quote, optionally choosing only from those\n" +" quotes grabbed for . is only necessary if the message\n" +" isn't sent in the channel itself.\n" +" " +msgstr "" +"[] []\n" +"\n" +"Retourne une citation aléatoire, éventuellement parmis les citations récupérées de . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:339 +msgid "Couldn't get a random quote for that nick." +msgstr "Je ne peux récupérer une quote aléatoire pour ce nick." + +#: plugin.py:341 +msgid "Couldn't get a random quote. Are there any grabbed quotes in the database?" +msgstr "Je ne peux récupérer de quote aléatoire. Y a-t-il des quotes dans la base de données ?" + +#: plugin.py:347 +msgid "" +"[] \n" +"\n" +" Return the quotegrab with the given . is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne la quote d' donné. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:355 +msgid "No quotegrab for id %s" +msgstr "Pas de quote d'id %s" + +#: plugin.py:361 +msgid "" +"[] \n" +"\n" +" Searches for in a quote. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Recherche le dans les citations. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:376 +msgid "No quotegrabs matching %s" +msgstr "Aucune quote ne correspond à %s" + diff --git a/plugins/QuoteGrabs/messages.pot b/plugins/QuoteGrabs/messages.pot new file mode 100644 index 000000000..9b365e4ee --- /dev/null +++ b/plugins/QuoteGrabs/messages.pot @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-17 18:36+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:49 +msgid "" +"Determines whether the bot will randomly grab\n" +" possibly-suitable quotes on occasion. The suitability of a given message\n" +" is determined by ..." +msgstr "" + +#: config.py:54 +msgid "" +"Determines about how many seconds, on\n" +" average, should elapse between random grabs. This is only an average\n" +" value; grabs can happen from any time after half this time until never,\n" +" although that's unlikely to occur." +msgstr "" + +#: config.py:59 +msgid "" +"Determines the minimum\n" +" number of words in a message for it to be considered for random\n" +" grabbing." +msgstr "" + +#: config.py:63 +msgid "" +"Determines the\n" +" minimum number of characters in a message for it to be considered for\n" +" random grabbing." +msgstr "" + +#: plugin.py:57 +msgid "%s (Said by: %s; grabbed by %s at %t)" +msgstr "" + +#: plugin.py:210 +#, docstring +msgid "Add the help for \"@help QuoteGrabs\" here." +msgstr "" + +#: plugin.py:249 +#, docstring +msgid "" +"[] \n" +"\n" +" Grabs a quote from by for the quotegrabs table.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:262 +msgid "You can't quote grab yourself." +msgstr "" + +#: plugin.py:269 +msgid "I couldn't find a proper message to grab." +msgstr "" + +#: plugin.py:274 +#, docstring +msgid "" +"[] \n" +"\n" +" Removes the grab (the last by default) on .\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:285 +msgid "Nothing to ungrab." +msgstr "" + +#: plugin.py:287 +msgid "Invalid grab number." +msgstr "" + +#: plugin.py:292 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns 's latest quote grab in . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:300 +msgid "I couldn't find a matching quotegrab for %s." +msgstr "" + +#: plugin.py:306 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns a list of shortened quotes that have been grabbed for \n" +" as well as the id of each quote. These ids can be used to get the\n" +" full quote. is only necessary if the message isn't sent in\n" +" the channel itself.\n" +" " +msgstr "" + +#: plugin.py:323 +msgid "I couldn't find any quotegrabs for %s." +msgstr "" + +#: plugin.py:329 +#, docstring +msgid "" +"[] []\n" +"\n" +" Returns a randomly grabbed quote, optionally choosing only from those\n" +" quotes grabbed for . is only necessary if the message\n" +" isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:339 +msgid "Couldn't get a random quote for that nick." +msgstr "" + +#: plugin.py:341 +msgid "Couldn't get a random quote. Are there any grabbed quotes in the database?" +msgstr "" + +#: plugin.py:347 +#, docstring +msgid "" +"[] \n" +"\n" +" Return the quotegrab with the given . is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:355 +msgid "No quotegrab for id %s" +msgstr "" + +#: plugin.py:361 +#, docstring +msgid "" +"[] \n" +"\n" +" Searches for in a quote. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:376 +msgid "No quotegrabs matching %s" +msgstr "" + diff --git a/plugins/QuoteGrabs/plugin.py b/plugins/QuoteGrabs/plugin.py index 03d3a98d6..9e4f6f77f 100644 --- a/plugins/QuoteGrabs/plugin.py +++ b/plugins/QuoteGrabs/plugin.py @@ -40,6 +40,8 @@ import supybot.ircmsgs as ircmsgs import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('QuoteGrabs') class QuoteGrabsRecord(dbi.Record): __fields__ = [ @@ -52,7 +54,7 @@ class QuoteGrabsRecord(dbi.Record): def __str__(self): grabber = plugins.getUserName(self.grabber) - return format('%s (Said by: %s; grabbed by %s at %t)', + return format(_('%s (Said by: %s; grabbed by %s at %t)'), self.text, self.hostmask, grabber, self.at) class SqliteQuoteGrabsDB(object): @@ -242,6 +244,7 @@ class QuoteGrabs(callbacks.Plugin): s = 'jots down a new quote for %s' % msg.nick irc.reply(s, action=True, prefixNick=False) + @internationalizeDocstring def grab(self, irc, msg, args, channel, nick): """[] @@ -256,16 +259,17 @@ class QuoteGrabs(callbacks.Plugin): if chan is None: raise callbacks.ArgumentError if ircutils.nickEqual(nick, msg.nick): - irc.error('You can\'t quote grab yourself.', Raise=True) + irc.error(_('You can\'t quote grab yourself.'), Raise=True) for m in reversed(irc.state.history): if m.command == 'PRIVMSG' and ircutils.nickEqual(m.nick, nick) \ and ircutils.strEqual(m.args[0], chan): self._grab(channel, irc, m, msg.prefix) irc.replySuccess() return - irc.error('I couldn\'t find a proper message to grab.') + irc.error(_('I couldn\'t find a proper message to grab.')) grab = wrap(grab, ['channeldb', 'nick']) + @internationalizeDocstring def ungrab(self, irc, msg, args, channel, grab): """[] @@ -278,11 +282,12 @@ class QuoteGrabs(callbacks.Plugin): irc.replySuccess() except dbi.NoRecordError: if grab is None: - irc.error('Nothing to ungrab.') + irc.error(_('Nothing to ungrab.')) else: - irc.error('Invalid grab number.') + irc.error(_('Invalid grab number.')) ungrab = wrap(ungrab, ['channeldb', optional('id')]) + @internationalizeDocstring def quote(self, irc, msg, args, channel, nick): """[] @@ -292,10 +297,11 @@ class QuoteGrabs(callbacks.Plugin): try: irc.reply(self.db.getQuote(channel, nick)) except dbi.NoRecordError: - irc.error('I couldn\'t find a matching quotegrab for %s.' % nick, - Raise=True) + irc.error(_('I couldn\'t find a matching quotegrab for %s.') % + nick, Raise=True) quote = wrap(quote, ['channeldb', 'nick']) + @internationalizeDocstring def list(self, irc, msg, args, channel, nick): """[] @@ -314,10 +320,11 @@ class QuoteGrabs(callbacks.Plugin): L.append(item) irc.reply(utils.str.commaAndify(L)) except dbi.NoRecordError: - irc.error('I couldn\'t find any quotegrabs for %s.' % nick, + irc.error(_('I couldn\'t find any quotegrabs for %s.') % nick, Raise=True) list = wrap(list, ['channeldb', 'nick']) + @internationalizeDocstring def random(self, irc, msg, args, channel, nick): """[] [] @@ -329,12 +336,13 @@ class QuoteGrabs(callbacks.Plugin): irc.reply(self.db.random(channel, nick)) except dbi.NoRecordError: if nick: - irc.error('Couldn\'t get a random quote for that nick.') + irc.error(_('Couldn\'t get a random quote for that nick.')) else: - irc.error('Couldn\'t get a random quote. Are there any ' - 'grabbed quotes in the database?') + irc.error(_('Couldn\'t get a random quote. Are there any ' + 'grabbed quotes in the database?')) random = wrap(random, ['channeldb', additional('nick')]) + @internationalizeDocstring def get(self, irc, msg, args, channel, id): """[] @@ -344,10 +352,11 @@ class QuoteGrabs(callbacks.Plugin): try: irc.reply(self.db.get(channel, id)) except dbi.NoRecordError: - irc.error('No quotegrab for id %s' % utils.str.quoted(id), + irc.error(_('No quotegrab for id %s') % utils.str.quoted(id), Raise=True) get = wrap(get, ['channeldb', 'id']) + @internationalizeDocstring def search(self, irc, msg, args, channel, text): """[] @@ -364,7 +373,7 @@ class QuoteGrabs(callbacks.Plugin): L.append(item) irc.reply(utils.str.commaAndify(L)) except dbi.NoRecordError: - irc.error('No quotegrabs matching %s' % utils.str.quoted(text), + irc.error(_('No quotegrabs matching %s') % utils.str.quoted(text), Raise=True) search = wrap(search, ['channeldb', 'text']) diff --git a/plugins/RSS/config.py b/plugins/RSS/config.py index f36e9dc4b..e4754375b 100644 --- a/plugins/RSS/config.py +++ b/plugins/RSS/config.py @@ -30,6 +30,8 @@ import supybot.conf as conf import supybot.registry as registry import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('RSS') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -45,37 +47,37 @@ class FeedNames(registry.SpaceSeparatedListOfStrings): RSS = conf.registerPlugin('RSS') conf.registerChannelValue(RSS, 'bold', registry.Boolean( - True, """Determines whether the bot will bold the title of the feed when it - announces new news.""")) + True, _("""Determines whether the bot will bold the title of the feed when + it announces new news."""))) conf.registerChannelValue(RSS, 'headlineSeparator', - registry.StringSurroundedBySpaces(' || ', """Determines what string is used - to separate headlines in new feeds.""")) + registry.StringSurroundedBySpaces(' || ', _("""Determines what string is + used to separate headlines in new feeds."""))) conf.registerChannelValue(RSS, 'announcementPrefix', - registry.StringWithSpaceOnRight('New news from ', """Determines what prefix - is prepended (if any) to the new news item announcements made in the - channel.""")) + registry.StringWithSpaceOnRight('New news from ', _("""Determines what + prefix is prepended (if any) to the new news item announcements made in the + channel."""))) conf.registerChannelValue(RSS, 'announce', - registry.SpaceSeparatedSetOfStrings([], """Determines which RSS feeds + registry.SpaceSeparatedSetOfStrings([], _("""Determines which RSS feeds should be announced in the channel; valid input is a list of strings - (either registered RSS feeds or RSS feed URLs) separated by spaces.""")) + (either registered RSS feeds or RSS feed URLs) separated by spaces."""))) conf.registerGlobalValue(RSS, 'waitPeriod', - registry.PositiveInteger(1800, """Indicates how many seconds the bot will + registry.PositiveInteger(1800, _("""Indicates how many seconds the bot will wait between retrieving RSS feeds; requests made within this period will - return cached results.""")) + return cached results."""))) conf.registerGlobalValue(RSS, 'feeds', - FeedNames([], """Determines what feeds should be accessible as - commands.""")) + FeedNames([], _("""Determines what feeds should be accessible as + commands."""))) conf.registerChannelValue(RSS, 'showLinks', - registry.Boolean(False, """Determines whether the bot will list the link + registry.Boolean(False, _("""Determines whether the bot will list the link along with the title of the feed when the rss command is called. supybot.plugins.RSS.announce.showLinks affects whether links will be - listed when a feed is automatically announced.""")) + listed when a feed is automatically announced."""))) conf.registerGroup(RSS, 'announce') conf.registerChannelValue(RSS.announce, 'showLinks', - registry.Boolean(False, """Determines whether the bot will list the link + registry.Boolean(False, _("""Determines whether the bot will list the link along with the title of the feed when a feed is automatically - announced.""")) + announced."""))) diff --git a/plugins/RSS/locale/fr.po b/plugins/RSS/locale/fr.po new file mode 100644 index 000000000..8c8cbecd3 --- /dev/null +++ b/plugins/RSS/locale/fr.po @@ -0,0 +1,173 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-19 19:27+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:50 +msgid "" +"Determines whether the bot will bold the title of the feed when it\n" +" announces new news." +msgstr "Détermine si le bot mettera en gras le titre des flux lorsqu'il annoncera des news." + +#: config.py:53 +msgid "" +"Determines what string is used\n" +" to separate headlines in new feeds." +msgstr "Détermine quelle chaîne est utilisé pour séparer les titres dans les nouveaux flux." + +#: config.py:56 +msgid "" +"Determines what prefix\n" +" is prepended (if any) to the new news item announcements made in the\n" +" channel." +msgstr "Détermine quel préfixe (s'il y en a un) est utilisé pour annoncer les news sur le canal." + +#: config.py:60 +msgid "" +"Determines which RSS feeds\n" +" should be announced in the channel; valid input is a list of strings\n" +" (either registered RSS feeds or RSS feed URLs) separated by spaces." +msgstr "Détermine quels flux RSS seront annoncés sur le canal ; une entrée valide est une liste de chaînes (des flux enregistrés ou des URLs de flux RSS), séparées par des espaces." + +#: config.py:64 +msgid "" +"Indicates how many seconds the bot will\n" +" wait between retrieving RSS feeds; requests made within this period will\n" +" return cached results." +msgstr "Détermine le temps (en secondes) entre deux rafraichissement des flux RSS. Durant cette période, les flux seront mis en cache." + +#: config.py:68 +msgid "" +"Determines what feeds should be accessible as\n" +" commands." +msgstr "Détermine quels flux sont accessibles en tant que commande." + +#: config.py:71 +msgid "" +"Determines whether the bot will list the link\n" +" along with the title of the feed when the rss command is called.\n" +" supybot.plugins.RSS.announce.showLinks affects whether links will be\n" +" listed when a feed is automatically announced." +msgstr "Détermine si le bot listera le lien de chaque flus avec son titre, lorsque la commande rss est appelée. supybot.plugins.RSS.announce.showLinks affecte si les liens sont affichés lorsqu'un flux est annoncé automatiquement." + +#: config.py:78 +msgid "" +"Determines whether the bot will list the link\n" +" along with the title of the feed when a feed is automatically\n" +" announced." +msgstr "Détermine si le bot listera le lien de chaque flux avec le titre lorsqu'un flux est automatiquement annoncé." + +#: plugin.py:63 +msgid "" +"This plugin is useful both for announcing updates to RSS feeds in a\n" +" channel, and for retrieving the headlines of RSS feeds via command. Use\n" +" the \"add\" command to add feeds to this plugin, and use the \"announce\"\n" +" command to determine what feeds should be announced in a given channel." +msgstr "Ce plugin est utile pour annoncer des flux RSS sur un canal, et pour récupérer les en-tête des flux RSS via une commande. Utilisez la commande \"add\" pour ajouter des flux au plugin, et utilisez la commande \"annonce\" pour détermine quels flux pourront être annoncés sur un canal donné." + +#: plugin.py:311 +msgid "" +" \n" +"\n" +" Adds a command to this plugin that will look up the RSS feed at the\n" +" given URL.\n" +" " +msgstr "" +" \n" +"\n" +"Ajoute un commande à ce plugin qui permet de regarder le flux situé à l'." + +#: plugin.py:322 +msgid "" +"\n" +"\n" +" Removes the command for looking up RSS feeds at from\n" +" this plugin.\n" +" " +msgstr "" +"\n" +"\n" +"Supprime le flux des flux qui peuvent être lus grâce à une commande." + +#: plugin.py:328 +msgid "That's not a valid RSS feed command name." +msgstr "Ce n'est pas une commande de flux RSS valide" + +#: plugin.py:346 +msgid "I am currently not announcing any feeds." +msgstr "Je n'annonce actuellement aucun flux." + +#: plugin.py:351 +msgid "" +"[] [ ...]\n" +"\n" +" Adds the list of feeds to the current list of announced feeds in\n" +" . Valid feeds include the names of registered feeds as\n" +" well as URLs for RSS feeds. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Ajoute la liste de flux à la liste actuelle des flux annoncés sur le . Vous devez indiquer le du flux si il est déjà enregistré, ou l' dans le cas contraire. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:369 +msgid "" +"[] [ ...]\n" +"\n" +" Removes the list of feeds from the current list of announced feeds\n" +" in . Valid feeds include the names of registered feeds as\n" +" well as URLs for RSS feeds. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" +"[] [ ...]\n" +"\n" +"Supprime la liste de flux de la liste actuelle des flux annoncés sur le . Vous devez indiquer le du flux si il est déjà enregistré, ou l' dans le cas contraire. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:387 +msgid "" +" []\n" +"\n" +" Gets the title components of the given RSS feed.\n" +" If is given, return only that many headlines.\n" +" " +msgstr "" +" []\n" +"\n" +"Récupère le titre des éléments du flux RSS donné. si le est donné, ne retourne que ce nombre de lignes d'en-tête." + +#: plugin.py:400 +msgid "Couldn't get RSS feed." +msgstr "Ne peut récupérer le flux RSS." + +#: plugin.py:413 +msgid "" +"\n" +"\n" +" Returns information from the given RSS feed, namely the title,\n" +" URL, description, and last update date, if available.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne des informations sur le flux RSS donné : le titre, l'URL, la description, et la dernière mise à jour." + +#: plugin.py:426 +msgid "I couldn't retrieve that RSS feed." +msgstr "Je ne peux récupérer ce flux RSS." + +#: plugin.py:439 +msgid "Title: %s; URL: %u; Description: %s; Last updated: %s." +msgstr "Titre : %s , URL : %u ; description : %s ; dernière mise à jour : %s." + diff --git a/plugins/RSS/messages.pot b/plugins/RSS/messages.pot new file mode 100644 index 000000000..4a2b76686 --- /dev/null +++ b/plugins/RSS/messages.pot @@ -0,0 +1,164 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-19 19:27+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:50 +msgid "" +"Determines whether the bot will bold the title of the feed when it\n" +" announces new news." +msgstr "" + +#: config.py:53 +msgid "" +"Determines what string is used\n" +" to separate headlines in new feeds." +msgstr "" + +#: config.py:56 +msgid "" +"Determines what prefix\n" +" is prepended (if any) to the new news item announcements made in the\n" +" channel." +msgstr "" + +#: config.py:60 +msgid "" +"Determines which RSS feeds\n" +" should be announced in the channel; valid input is a list of strings\n" +" (either registered RSS feeds or RSS feed URLs) separated by spaces." +msgstr "" + +#: config.py:64 +msgid "" +"Indicates how many seconds the bot will\n" +" wait between retrieving RSS feeds; requests made within this period will\n" +" return cached results." +msgstr "" + +#: config.py:68 +msgid "" +"Determines what feeds should be accessible as\n" +" commands." +msgstr "" + +#: config.py:71 +msgid "" +"Determines whether the bot will list the link\n" +" along with the title of the feed when the rss command is called.\n" +" supybot.plugins.RSS.announce.showLinks affects whether links will be\n" +" listed when a feed is automatically announced." +msgstr "" + +#: config.py:78 +msgid "" +"Determines whether the bot will list the link\n" +" along with the title of the feed when a feed is automatically\n" +" announced." +msgstr "" + +#: plugin.py:63 +#, docstring +msgid "" +"This plugin is useful both for announcing updates to RSS feeds in a\n" +" channel, and for retrieving the headlines of RSS feeds via command. Use\n" +" the \"add\" command to add feeds to this plugin, and use the \"announce\"\n" +" command to determine what feeds should be announced in a given channel." +msgstr "" + +#: plugin.py:311 +#, docstring +msgid "" +" \n" +"\n" +" Adds a command to this plugin that will look up the RSS feed at the\n" +" given URL.\n" +" " +msgstr "" + +#: plugin.py:322 +#, docstring +msgid "" +"\n" +"\n" +" Removes the command for looking up RSS feeds at from\n" +" this plugin.\n" +" " +msgstr "" + +#: plugin.py:328 +msgid "That's not a valid RSS feed command name." +msgstr "" + +#: plugin.py:346 +msgid "I am currently not announcing any feeds." +msgstr "" + +#: plugin.py:351 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" Adds the list of feeds to the current list of announced feeds in\n" +" . Valid feeds include the names of registered feeds as\n" +" well as URLs for RSS feeds. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:369 +#, docstring +msgid "" +"[] [ ...]\n" +"\n" +" Removes the list of feeds from the current list of announced feeds\n" +" in . Valid feeds include the names of registered feeds as\n" +" well as URLs for RSS feeds. is only necessary if the\n" +" message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:387 +#, docstring +msgid "" +" []\n" +"\n" +" Gets the title components of the given RSS feed.\n" +" If is given, return only that many headlines.\n" +" " +msgstr "" + +#: plugin.py:400 +msgid "Couldn't get RSS feed." +msgstr "" + +#: plugin.py:413 +#, docstring +msgid "" +"\n" +"\n" +" Returns information from the given RSS feed, namely the title,\n" +" URL, description, and last update date, if available.\n" +" " +msgstr "" + +#: plugin.py:426 +msgid "I couldn't retrieve that RSS feed." +msgstr "" + +#: plugin.py:439 +msgid "Title: %s; URL: %u; Description: %s; Last updated: %s." +msgstr "" + diff --git a/plugins/RSS/plugin.py b/plugins/RSS/plugin.py index c5058d4ca..eb0c7af11 100644 --- a/plugins/RSS/plugin.py +++ b/plugins/RSS/plugin.py @@ -41,6 +41,8 @@ from supybot.commands import * import supybot.ircutils as ircutils import supybot.registry as registry import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('RSS') try: feedparser = utils.python.universalImport('feedparser', 'local.feedparser') @@ -262,8 +264,12 @@ class RSS(callbacks.Plugin): def _getConverter(self, feed): toText = utils.web.htmlToText if 'encoding' in feed: - return lambda s: toText(s).strip().encode(feed['encoding'], - 'replace') + def conv(s): + try: + return toText(s).strip().encode(feed['encoding'],'replace') + except UnicodeEncodeError: + return toText(s.encode('utf-8', 'ignore')).strip() + return conv else: return lambda s: toText(s).strip() @@ -280,6 +286,7 @@ class RSS(callbacks.Plugin): headlines.append((title, None)) return headlines + @internationalizeDocstring def makeFeedCommand(self, name, url): docstring = format("""[] @@ -302,6 +309,7 @@ class RSS(callbacks.Plugin): self.feedNames[name] = (url, f) self._registerFeed(name, url) + @internationalizeDocstring def add(self, irc, msg, args, name, url): """ @@ -312,6 +320,7 @@ class RSS(callbacks.Plugin): irc.replySuccess() add = wrap(add, ['feedName', 'url']) + @internationalizeDocstring def remove(self, irc, msg, args, name): """ @@ -319,7 +328,7 @@ class RSS(callbacks.Plugin): this plugin. """ if name not in self.feedNames: - irc.error('That\'s not a valid RSS feed command name.') + irc.error(_('That\'s not a valid RSS feed command name.')) return del self.feedNames[name] conf.supybot.plugins.RSS.feeds().remove(name) @@ -328,6 +337,7 @@ class RSS(callbacks.Plugin): remove = wrap(remove, ['feedName']) class announce(callbacks.Commands): + @internationalizeDocstring def list(self, irc, msg, args, channel): """[] @@ -336,9 +346,10 @@ class RSS(callbacks.Plugin): """ announce = conf.supybot.plugins.RSS.announce feeds = format('%L', list(announce.get(channel)())) - irc.reply(feeds or 'I am currently not announcing any feeds.') + irc.reply(feeds or _('I am currently not announcing any feeds.')) list = wrap(list, ['channel',]) + @internationalizeDocstring def add(self, irc, msg, args, channel, feeds): """[] [ ...] @@ -356,6 +367,7 @@ class RSS(callbacks.Plugin): add = wrap(add, [('checkChannelCapability', 'op'), many(first('url', 'feedName'))]) + @internationalizeDocstring def remove(self, irc, msg, args, channel, feeds): """[] [ ...] @@ -373,6 +385,7 @@ class RSS(callbacks.Plugin): remove = wrap(remove, [('checkChannelCapability', 'op'), many(first('url', 'feedName'))]) + @internationalizeDocstring def rss(self, irc, msg, args, url, n): """ [] @@ -387,7 +400,7 @@ class RSS(callbacks.Plugin): channel = None headlines = self.getHeadlines(feed) if not headlines: - irc.error('Couldn\'t get RSS feed.') + irc.error(_('Couldn\'t get RSS feed.')) return headlines = self.buildHeadlines(headlines, channel, 'showLinks') if n: @@ -398,6 +411,7 @@ class RSS(callbacks.Plugin): irc.replies(headlines, joiner=sep) rss = wrap(rss, ['url', additional('int')]) + @internationalizeDocstring def info(self, irc, msg, args, url): """ @@ -412,7 +426,7 @@ class RSS(callbacks.Plugin): conv = self._getConverter(feed) info = feed.get('feed') if not info: - irc.error('I couldn\'t retrieve that RSS feed.') + irc.error(_('I couldn\'t retrieve that RSS feed.')) return # check the 'modified_parsed' key, if it's there, convert it here first if 'modified' in info: @@ -425,12 +439,12 @@ class RSS(callbacks.Plugin): desc = conv(info.get('description', 'unavailable')) link = conv(info.get('link', 'unavailable')) # The rest of the entries are all available in the channel key - response = format('Title: %s; URL: %u; ' - 'Description: %s; Last updated: %s.', + response = format(_('Title: %s; URL: %u; ' + 'Description: %s; Last updated: %s.'), title, link, desc, when) irc.reply(utils.str.normalizeWhitespace(response)) info = wrap(info, [first('url', 'feedName')]) - +RSS = internationalizeDocstring(RSS) Class = RSS diff --git a/plugins/Relay/config.py b/plugins/Relay/config.py index 757e42a9e..2bcbef095 100644 --- a/plugins/Relay/config.py +++ b/plugins/Relay/config.py @@ -30,14 +30,16 @@ import supybot.conf as conf import supybot.ircutils as ircutils import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Relay') def configure(advanced): from supybot.questions import output, expect, anything, something, yn conf.registerPlugin('Relay', True) - if yn('Would you like to relay between any channels?'): - channels = anything('What channels? Separated them by spaces.') + if yn(_('Would you like to relay between any channels?')): + channels = anything(_('What channels? Separated them by spaces.')) conf.supybot.plugins.Relay.channels.set(channels) - if yn('Would you like to use color to distinguish between nicks?'): + if yn(_('Would you like to use color to distinguish between nicks?')): conf.supybot.plugins.Relay.color.setValue(True) output("""Right now there's no way to configure the actual connection to the server. What you'll need to do when the bot finishes starting up is @@ -54,36 +56,36 @@ class Networks(registry.SpaceSeparatedListOf): Relay = conf.registerPlugin('Relay') conf.registerChannelValue(Relay, 'color', - registry.Boolean(False, """Determines whether the bot will color relayed - PRIVMSGs so as to make the messages easier to read.""")) + registry.Boolean(False, _("""Determines whether the bot will color relayed + PRIVMSGs so as to make the messages easier to read."""))) conf.registerChannelValue(Relay, 'topicSync', - registry.Boolean(True, """Determines whether the bot will synchronize - topics between networks in the channels it relays.""")) + registry.Boolean(True, _("""Determines whether the bot will synchronize + topics between networks in the channels it relays."""))) conf.registerChannelValue(Relay, 'hostmasks', - registry.Boolean(False, """Determines whether the bot will relay the + registry.Boolean(False, _("""Determines whether the bot will relay the hostmask of the person joining or parting the channel when he or she joins - or parts.""")) + or parts."""))) conf.registerChannelValue(Relay, 'includeNetwork', - registry.Boolean(True, """Determines whether the bot will include the + registry.Boolean(True, _("""Determines whether the bot will include the network in relayed PRIVMSGs; if you're only relaying between two networks, - it's somewhat redundant, and you may wish to save the space.""")) + it's somewhat redundant, and you may wish to save the space."""))) conf.registerChannelValue(Relay, 'punishOtherRelayBots', - registry.Boolean(False, """Determines whether the bot will detect other - bots relaying and respond by kickbanning them.""")) + registry.Boolean(False, _("""Determines whether the bot will detect other + bots relaying and respond by kickbanning them."""))) conf.registerGlobalValue(Relay, 'channels', - conf.SpaceSeparatedSetOfChannels([], """Determines which channels the bot - will relay in.""")) + conf.SpaceSeparatedSetOfChannels([], _("""Determines which channels the bot + will relay in."""))) conf.registerChannelValue(Relay.channels, 'joinOnAllNetworks', - registry.Boolean(True, """Determines whether the bot + registry.Boolean(True, _("""Determines whether the bot will always join the channel(s) it relays for on all networks the bot is - connected to.""")) + connected to."""))) conf.registerChannelValue(Relay, 'ignores', - Ignores([], """Determines what hostmasks will not be relayed on a - channel.""")) + Ignores([], _("""Determines what hostmasks will not be relayed on a + channel."""))) conf.registerChannelValue(Relay, 'noticeNonPrivmsgs', - registry.Boolean(False, """Determines whether the bot will used NOTICEs + registry.Boolean(False, _("""Determines whether the bot will used NOTICEs rather than PRIVMSGs for non-PRIVMSG relay messages (i.e., joins, parts, - nicks, quits, modes, etc.)""")) + nicks, quits, modes, etc.)"""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Relay/locale/fr.po b/plugins/Relay/locale/fr.po new file mode 100644 index 000000000..227dc7079 --- /dev/null +++ b/plugins/Relay/locale/fr.po @@ -0,0 +1,221 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-19 19:27+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:39 +msgid "Would you like to relay between any channels?" +msgstr "Voulez-vous relayer entre des canaux ?" + +#: config.py:40 +msgid "What channels? Separated them by spaces." +msgstr "Quels canaux ? Séparez-les par des espaces." + +#: config.py:42 +msgid "Would you like to use color to distinguish between nicks?" +msgstr "Voulez-vous utiliser de la couleur pour distinguer les nicks ?" + +#: config.py:59 +msgid "" +"Determines whether the bot will color relayed\n" +" PRIVMSGs so as to make the messages easier to read." +msgstr "Détermine si le bot colorera les PRIVMSGs relayez, pour rendre les messages plus faciles à lire." + +#: config.py:62 +msgid "" +"Determines whether the bot will synchronize\n" +" topics between networks in the channels it relays." +msgstr "Détermine si le bot synchronisera les topics entre les réseaux sur les canaux qu'il relaye." + +#: config.py:65 +msgid "" +"Determines whether the bot will relay the\n" +" hostmask of the person joining or parting the channel when he or she joins\n" +" or parts." +msgstr "Détermine si le bot relayera le masque d'hôte d'une personne joignant ou partant d'un canal." + +#: config.py:69 +msgid "" +"Determines whether the bot will include the\n" +" network in relayed PRIVMSGs; if you're only relaying between two networks,\n" +" it's somewhat redundant, and you may wish to save the space." +msgstr "Détermine si le bot inclurera le réseau dans les PRIVMSG relayés ; si vous ne relayez qu'entre deux réseaux, ce sera quelque chose de redondant que vous pouvez supprimer pour gagner de la place." + +#: config.py:73 +msgid "" +"Determines whether the bot will detect other\n" +" bots relaying and respond by kickbanning them." +msgstr "Détermine si le bot détectera d'autres bots relayant et y répondra en les kickbannissant." + +#: config.py:76 +msgid "" +"Determines which channels the bot\n" +" will relay in." +msgstr "Détermine sur quels canaux le bot relayera." + +#: config.py:79 +msgid "" +"Determines whether the bot\n" +" will always join the channel(s) it relays for on all networks the bot is\n" +" connected to." +msgstr "Détermine si le bot rejoindra toujours le(s) canal(aux) qu'il relaye sur tous les réseaux auxquels il est connecté." + +#: config.py:83 +msgid "" +"Determines what hostmasks will not be relayed on a\n" +" channel." +msgstr "Détermine quels masques d'hôte ne seront pas relayés sur un canal." + +#: config.py:86 +msgid "" +"Determines whether the bot will used NOTICEs\n" +" rather than PRIVMSGs for non-PRIVMSG relay messages (i.e., joins, parts,\n" +" nicks, quits, modes, etc.)" +msgstr "Détermine si le bot utilisera des NOTICEs plutôt que des PRIVMSG pour les messages relayés qui ne concernent pas un PRIVMSG (arrivée, départ, changement de nick, quits, modes, etc.)" + +#: plugin.py:99 +msgid "" +"[]\n" +"\n" +" Starts relaying between the channel on all networks. If on a\n" +" network the bot isn't in , he'll join. This commands is\n" +" required even if the bot is in the channel on both networks; he won't\n" +" relay between those channels unless he's told to join both\n" +" channels. If is not given, starts relaying on the channel\n" +" the message was sent in.\n" +" " +msgstr "" +"[]\n" +"\n" +"Commence à relayer le canal sur tous les réseaux. Si il y a un réseau sur lequel le bot n'est pas sur , il y entrera. Cette commande est requise même si le bot est sur le canal sur tous les réseaux ; il ne relayera pas tant qu'on ne lui a pas dit de rejoindre les canaux sur tous les réseaux. Si n'est pas donné, il commencera à relayer sur le canal où a été envoyé le message." + +#: plugin.py:118 +msgid "" +"\n" +"\n" +" Ceases relaying between the channel on all networks. The bot\n" +" will part from the channel on all networks in which it is on the\n" +" channel.\n" +" " +msgstr "" +"\n" +"\n" +"Cesse de relayer entre les canaux sur tous les réseaux. Le bot partira de ces canaux sur tous les réseaux si il y est." + +#: plugin.py:133 +msgid "" +"[]\n" +"\n" +" Returns the nicks of the people in the channel on the various networks\n" +" the bot is connected to. is only necessary if the message\n" +" isn't sent on the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne les nicks des personnes sur le canal sur les différents réseaux sur lesquels est connecté le bot. n'est nécessaire que si l'on n'est pas sur le canal lui-même." + +#: plugin.py:223 +msgid "is an op on %L" +msgstr "est op sur %L" + +#: plugin.py:225 +msgid "is a halfop on %L" +msgstr "est halfop sur %L" + +#: plugin.py:227 +msgid "is voiced on %L" +msgstr "est voice sur %L" + +#: plugin.py:230 +msgid "is also on %L" +msgstr "est aussi sur %L" + +#: plugin.py:232 +msgid "is on %L" +msgstr "est sur %L" + +#: plugin.py:234 +msgid "isn't on any non-secret channels" +msgstr "n'est sur aucun canal non-secret" + +#: plugin.py:241 +#: plugin.py:242 +#: plugin.py:246 +msgid "" +msgstr "" + +#: plugin.py:248 +msgid " %s is away: %s." +msgstr "%s est away : %s" + +#: plugin.py:253 +msgid " identified" +msgstr "identifié" + +#: plugin.py:258 +msgid "%s (%s) has been%s on server %s since %s (idle for %s) and %s.%s" +msgstr "%s (%s) a été vu%s sur le serveur %s depuis %s (idle depuis %s) et %s.%s" + +#: plugin.py:273 +msgid "There is no %s on %s." +msgstr "Il n'y a pas de %s sur %s." + +#: plugin.py:342 +msgid "You seem to be relaying, punk." +msgstr "Tu sembles relayer, enfoiré" + +#: plugin.py:395 +msgid "%s%s has joined on %s" +msgstr "%s%s est arrivé sur %s" + +#: plugin.py:410 +msgid "%s%s has left on %s (%s)" +msgstr "%s%s est parti de %s (%s)" + +#: plugin.py:413 +msgid "%s%s has left on %s" +msgstr "%s%s est parti de %s" + +#: plugin.py:423 +msgid "mode change by %s on %s: %s" +msgstr "changement de mode par %s sur %s : %s" + +#: plugin.py:435 +msgid "%s was kicked by %s on %s (%s)" +msgstr "%s a été kické par %s sur %s (%s)" + +#: plugin.py:438 +msgid "%s was kicked by %s on %s" +msgstr "%s a été kické par %s sur %s" + +#: plugin.py:447 +msgid "nick change by %s to %s on %s" +msgstr "changement de nick : %s -> %s sur %s" + +#: plugin.py:477 +msgid "topic change by %s on %s: %s" +msgstr "changement de topic par %s sur %s : %s" + +#: plugin.py:486 +msgid "%s has quit %s (%s)" +msgstr "%s a quitté %s (%s)" + +#: plugin.py:488 +msgid "%s has quit %s." +msgstr "%s a quitté %s." + +#: plugin.py:498 +msgid "disconnected from %s: %s" +msgstr "déconnecté de %s : %s" + diff --git a/plugins/Relay/messages.pot b/plugins/Relay/messages.pot new file mode 100644 index 000000000..5757bcdc1 --- /dev/null +++ b/plugins/Relay/messages.pot @@ -0,0 +1,215 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-19 19:27+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:39 +msgid "Would you like to relay between any channels?" +msgstr "" + +#: config.py:40 +msgid "What channels? Separated them by spaces." +msgstr "" + +#: config.py:42 +msgid "Would you like to use color to distinguish between nicks?" +msgstr "" + +#: config.py:59 +msgid "" +"Determines whether the bot will color relayed\n" +" PRIVMSGs so as to make the messages easier to read." +msgstr "" + +#: config.py:62 +msgid "" +"Determines whether the bot will synchronize\n" +" topics between networks in the channels it relays." +msgstr "" + +#: config.py:65 +msgid "" +"Determines whether the bot will relay the\n" +" hostmask of the person joining or parting the channel when he or she joins\n" +" or parts." +msgstr "" + +#: config.py:69 +msgid "" +"Determines whether the bot will include the\n" +" network in relayed PRIVMSGs; if you're only relaying between two networks,\n" +" it's somewhat redundant, and you may wish to save the space." +msgstr "" + +#: config.py:73 +msgid "" +"Determines whether the bot will detect other\n" +" bots relaying and respond by kickbanning them." +msgstr "" + +#: config.py:76 +msgid "" +"Determines which channels the bot\n" +" will relay in." +msgstr "" + +#: config.py:79 +msgid "" +"Determines whether the bot\n" +" will always join the channel(s) it relays for on all networks the bot is\n" +" connected to." +msgstr "" + +#: config.py:83 +msgid "" +"Determines what hostmasks will not be relayed on a\n" +" channel." +msgstr "" + +#: config.py:86 +msgid "" +"Determines whether the bot will used NOTICEs\n" +" rather than PRIVMSGs for non-PRIVMSG relay messages (i.e., joins, parts,\n" +" nicks, quits, modes, etc.)" +msgstr "" + +#: plugin.py:99 +#, docstring +msgid "" +"[]\n" +"\n" +" Starts relaying between the channel on all networks. If on a\n" +" network the bot isn't in , he'll join. This commands is\n" +" required even if the bot is in the channel on both networks; he won't\n" +" relay between those channels unless he's told to join both\n" +" channels. If is not given, starts relaying on the channel\n" +" the message was sent in.\n" +" " +msgstr "" + +#: plugin.py:118 +#, docstring +msgid "" +"\n" +"\n" +" Ceases relaying between the channel on all networks. The bot\n" +" will part from the channel on all networks in which it is on the\n" +" channel.\n" +" " +msgstr "" + +#: plugin.py:133 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the nicks of the people in the channel on the various networks\n" +" the bot is connected to. is only necessary if the message\n" +" isn't sent on the channel itself.\n" +" " +msgstr "" + +#: plugin.py:223 +msgid "is an op on %L" +msgstr "" + +#: plugin.py:225 +msgid "is a halfop on %L" +msgstr "" + +#: plugin.py:227 +msgid "is voiced on %L" +msgstr "" + +#: plugin.py:230 +msgid "is also on %L" +msgstr "" + +#: plugin.py:232 +msgid "is on %L" +msgstr "" + +#: plugin.py:234 +msgid "isn't on any non-secret channels" +msgstr "" + +#: plugin.py:241 plugin.py:242 plugin.py:246 +msgid "" +msgstr "" + +#: plugin.py:248 +msgid " %s is away: %s." +msgstr "" + +#: plugin.py:253 +msgid " identified" +msgstr "" + +#: plugin.py:258 +msgid "%s (%s) has been%s on server %s since %s (idle for %s) and %s.%s" +msgstr "" + +#: plugin.py:273 +msgid "There is no %s on %s." +msgstr "" + +#: plugin.py:342 +msgid "You seem to be relaying, punk." +msgstr "" + +#: plugin.py:395 +msgid "%s%s has joined on %s" +msgstr "" + +#: plugin.py:410 +msgid "%s%s has left on %s (%s)" +msgstr "" + +#: plugin.py:413 +msgid "%s%s has left on %s" +msgstr "" + +#: plugin.py:423 +msgid "mode change by %s on %s: %s" +msgstr "" + +#: plugin.py:435 +msgid "%s was kicked by %s on %s (%s)" +msgstr "" + +#: plugin.py:438 +msgid "%s was kicked by %s on %s" +msgstr "" + +#: plugin.py:447 +msgid "nick change by %s to %s on %s" +msgstr "" + +#: plugin.py:477 +msgid "topic change by %s on %s: %s" +msgstr "" + +#: plugin.py:486 +msgid "%s has quit %s (%s)" +msgstr "" + +#: plugin.py:488 +msgid "%s has quit %s." +msgstr "" + +#: plugin.py:498 +msgid "disconnected from %s: %s" +msgstr "" + diff --git a/plugins/Relay/plugin.py b/plugins/Relay/plugin.py index ffd31f80f..6fe419589 100644 --- a/plugins/Relay/plugin.py +++ b/plugins/Relay/plugin.py @@ -39,6 +39,8 @@ import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks from supybot.utils.structures import MultiSet, TimeoutQueue +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Relay') class Relay(callbacks.Plugin): noIgnore = True @@ -92,6 +94,7 @@ class Relay(callbacks.Plugin): irc.queueMsg(ircmsgs.who(channel)) irc.queueMsg(ircmsgs.names(channel)) + @internationalizeDocstring def join(self, irc, msg, args, channel): """[] @@ -110,6 +113,7 @@ class Relay(callbacks.Plugin): irc.replySuccess() join = wrap(join, ['channel', 'admin']) + @internationalizeDocstring def part(self, irc, msg, args, channel): """ @@ -124,6 +128,7 @@ class Relay(callbacks.Plugin): irc.replySuccess() part = wrap(part, ['channel', 'admin']) + @internationalizeDocstring def nicks(self, irc, msg, args, channel): """[] @@ -215,43 +220,43 @@ class Relay(callbacks.Plugin): normal.append(channel) L = [] if ops: - L.append(format('is an op on %L', ops)) + L.append(format(_('is an op on %L'), ops)) if halfops: - L.append(format('is a halfop on %L', halfups)) + L.append(format(_('is a halfop on %L'), halfups)) if voices: - L.append(format('is voiced on %L', voices)) + L.append(format(_('is voiced on %L'), voices)) if normal: if L: - L.append(format('is also on %L', normal)) + L.append(format(_('is also on %L'), normal)) else: - L.append(format('is on %L', normal)) + L.append(format(_('is on %L'), normal)) else: - L = ['isn\'t on any non-secret channels'] + L = [_('isn\'t on any non-secret channels')] channels = format('%L', L) if '317' in d: idle = utils.timeElapsed(d['317'].args[2]) signon = time.strftime(conf.supybot.reply.format.time(), time.localtime(float(d['317'].args[3]))) else: - idle = '' - signon = '' + idle = _('') + signon = _('') if '312' in d: server = d['312'].args[2] else: - server = '' + server = _('') if '301' in d: - away = format(' %s is away: %s.', nick, d['301'].args[2]) + away = format(_(' %s is away: %s.'), nick, d['301'].args[2]) else: away = '' if '320' in d: if d['320'].args[2]: - identify = ' identified' + identify = _(' identified') else: identify = '' else: identify = '' - s = format('%s (%s) has been%s on server %s since %s (idle for %s) ' - 'and %s.%s', + s = format(_('%s (%s) has been%s on server %s since %s (idle for %s) ' + 'and %s.%s'), user, hostmask, identify, server, signon, idle, channels, away) replyIrc.reply(s) @@ -265,7 +270,7 @@ class Relay(callbacks.Plugin): return (replyIrc, replyMsg, d) = self._whois[(irc, loweredNick)] del self._whois[(irc, loweredNick)] - s = format('There is no %s on %s.', nick, self._getIrcName(irc)) + s = format(_('There is no %s on %s.'), nick, self._getIrcName(irc)) replyIrc.reply(s) do401 = do402 @@ -334,7 +339,7 @@ class Relay(callbacks.Plugin): self.log.info('Punishing %s in %s on %s for relaying.', who, channel, irc.network) irc.sendMsg(ircmsgs.ban(channel, who)) - kmsg = 'You seem to be relaying, punk.' + kmsg = _('You seem to be relaying, punk.') irc.sendMsg(ircmsgs.kick(channel, msg.nick, kmsg)) else: notPunishing(irc, 'not opped') @@ -387,7 +392,7 @@ class Relay(callbacks.Plugin): hostmask = format(' (%s)', msg.prefix) else: hostmask = '' - s = format('%s%s has joined on %s', msg.nick, hostmask, network) + s = format(_('%s%s has joined on %s'), msg.nick, hostmask, network) m = self._msgmaker(channel, s) self._sendToOthers(irc, m) @@ -402,10 +407,10 @@ class Relay(callbacks.Plugin): else: hostmask = '' if len(msg.args) > 1: - s = format('%s%s has left on %s (%s)', + s = format(_('%s%s has left on %s (%s)'), msg.nick, hostmask, network, msg.args[1]) else: - s = format('%s%s has left on %s', msg.nick, hostmask, network) + s = format(_('%s%s has left on %s'), msg.nick, hostmask, network) m = self._msgmaker(channel, s) self._sendToOthers(irc, m) @@ -415,7 +420,7 @@ class Relay(callbacks.Plugin): if channel not in self.registryValue('channels'): return network = self._getIrcName(irc) - s = format('mode change by %s on %s: %s', + s = format(_('mode change by %s on %s: %s'), msg.nick, network, ' '.join(msg.args[1:])) m = self._msgmaker(channel, s) self._sendToOthers(irc, m) @@ -427,10 +432,10 @@ class Relay(callbacks.Plugin): return network = self._getIrcName(irc) if len(msg.args) == 3: - s = format('%s was kicked by %s on %s (%s)', + s = format(_('%s was kicked by %s on %s (%s)'), msg.args[1], msg.nick, network, msg.args[2]) else: - s = format('%s was kicked by %s on %s', + s = format(_('%s was kicked by %s on %s'), msg.args[1], msg.nick, network) m = self._msgmaker(channel, s) self._sendToOthers(irc, m) @@ -439,7 +444,7 @@ class Relay(callbacks.Plugin): irc = self._getRealIrc(irc) newNick = msg.args[0] network = self._getIrcName(irc) - s = format('nick change by %s to %s on %s', msg.nick,newNick,network) + s = format(_('nick change by %s to %s on %s'), msg.nick,newNick,network) for channel in self.registryValue('channels'): if channel in irc.state.channels: if newNick in irc.state.channels[channel].users: @@ -469,7 +474,7 @@ class Relay(callbacks.Plugin): 'can\'t sync topics.', channel, otherIrc.network) else: - s = format('topic change by %s on %s: %s', + s = format(_('topic change by %s on %s: %s'), msg.nick, network, newTopic) m = self._msgmaker(channel, s) self._sendToOthers(irc, m) @@ -478,9 +483,9 @@ class Relay(callbacks.Plugin): irc = self._getRealIrc(irc) network = self._getIrcName(irc) if msg.args: - s = format('%s has quit %s (%s)', msg.nick, network, msg.args[0]) + s = format(_('%s has quit %s (%s)'), msg.nick, network, msg.args[0]) else: - s = format('%s has quit %s.', msg.nick, network) + s = format(_('%s has quit %s.'), msg.nick, network) for channel in self.registryValue('channels'): if channel in self.ircstates[irc].channels: if msg.nick in self.ircstates[irc].channels[channel].users: @@ -490,7 +495,7 @@ class Relay(callbacks.Plugin): def doError(self, irc, msg): irc = self._getRealIrc(irc) network = self._getIrcName(irc) - s = format('disconnected from %s: %s', network, msg.args[0]) + s = format(_('disconnected from %s: %s'), network, msg.args[0]) for channel in self.registryValue('channels'): m = self._msgmaker(channel, s) self._sendToOthers(irc, m) diff --git a/plugins/Reply/config.py b/plugins/Reply/config.py index 7d861c528..f094cb36f 100644 --- a/plugins/Reply/config.py +++ b/plugins/Reply/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Reply') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,7 +44,7 @@ def configure(advanced): Reply = conf.registerPlugin('Reply') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Reply, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Reply/locale/fr.po b/plugins/Reply/locale/fr.po new file mode 100644 index 000000000..8acefbde3 --- /dev/null +++ b/plugins/Reply/locale/fr.po @@ -0,0 +1,70 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-19 19:27+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:38 +msgid "" +"This plugins contains a few commands that construct various types of\n" +" replies. Some bot owners would be wise to not load this plugin because it\n" +" can be easily abused.\n" +" " +msgstr "Ce plugin contient quelques commandes pour construire différents types de réponses. Certains propriétaires de bots pourraient ne pas vouloir le charger, car on peut facilement en abuser." + +#: plugin.py:44 +msgid "" +"\n" +"\n" +" Replies with in private. Use nested commands to your benefit\n" +" here.\n" +" " +msgstr "" +"\n" +"\n" +"Répond avec le en privé. Utile pour les commandes imbriquées." + +#: plugin.py:54 +msgid "" +"\n" +"\n" +" Replies with as an action. use nested commands to your benefit\n" +" here.\n" +" " +msgstr "" +"\n" +"\n" +"Répond avec le comme une action. Utile pour les commandes imbriquées." + +#: plugin.py:67 +msgid "" +"\n" +"\n" +" Replies with in a notice. Use nested commands to your benefit\n" +" here. If you want a private notice, nest the private command.\n" +" " +msgstr "" +"\n" +"\n" +"Répond avec le en notice. Utile pour les commandes imbriquées." + +#: plugin.py:77 +msgid "" +"\n" +"\n" +" Replies with . Equivalent to the alias, 'echo $nick: $1'.\n" +" " +msgstr "" +"\n" +"\n" +"Répond avec le . Équivalent à l'alias 'echo $nick: $i'." + diff --git a/plugins/Reply/messages.pot b/plugins/Reply/messages.pot new file mode 100644 index 000000000..fac59c514 --- /dev/null +++ b/plugins/Reply/messages.pot @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-19 19:27+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:38 +#, docstring +msgid "" +"This plugins contains a few commands that construct various types of\n" +" replies. Some bot owners would be wise to not load this plugin because it\n" +" can be easily abused.\n" +" " +msgstr "" + +#: plugin.py:44 +#, docstring +msgid "" +"\n" +"\n" +" Replies with in private. Use nested commands to your benefit\n" +" here.\n" +" " +msgstr "" + +#: plugin.py:54 +#, docstring +msgid "" +"\n" +"\n" +" Replies with as an action. use nested commands to your benefit\n" +" here.\n" +" " +msgstr "" + +#: plugin.py:67 +#, docstring +msgid "" +"\n" +"\n" +" Replies with in a notice. Use nested commands to your benefit\n" +" here. If you want a private notice, nest the private command.\n" +" " +msgstr "" + +#: plugin.py:77 +#, docstring +msgid "" +"\n" +"\n" +" Replies with . Equivalent to the alias, 'echo $nick: $1'.\n" +" " +msgstr "" + diff --git a/plugins/Reply/plugin.py b/plugins/Reply/plugin.py index 9b0a6db4a..d12b08cd7 100644 --- a/plugins/Reply/plugin.py +++ b/plugins/Reply/plugin.py @@ -29,6 +29,8 @@ from supybot.commands import * import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Reply') class Reply(callbacks.Plugin): @@ -36,6 +38,7 @@ class Reply(callbacks.Plugin): replies. Some bot owners would be wise to not load this plugin because it can be easily abused. """ + @internationalizeDocstring def private(self, irc, msg, args, text): """ @@ -45,6 +48,7 @@ class Reply(callbacks.Plugin): irc.reply(text, private=True) private = wrap(private, ['text']) + @internationalizeDocstring def action(self, irc, msg, args, text): """ @@ -57,6 +61,7 @@ class Reply(callbacks.Plugin): raise callbacks.ArgumentError action = wrap(action, ['text']) + @internationalizeDocstring def notice(self, irc, msg, args, text): """ @@ -66,6 +71,7 @@ class Reply(callbacks.Plugin): irc.reply(text, notice=True) notice = wrap(notice, ['text']) + @internationalizeDocstring def reply(self, irc, msg, args, text): """ @@ -73,6 +79,7 @@ class Reply(callbacks.Plugin): """ irc.reply(text, prefixNick=True) reply = wrap(reply, ['text']) +Reply = internationalizeDocstring(Reply) Class = Reply diff --git a/plugins/Scheduler/config.py b/plugins/Scheduler/config.py index bd901402b..9943c4557 100644 --- a/plugins/Scheduler/config.py +++ b/plugins/Scheduler/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Scheduler') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,7 +44,7 @@ def configure(advanced): Scheduler = conf.registerPlugin('Scheduler') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Scheduler, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Scheduler/locale/fr.po b/plugins/Scheduler/locale/fr.po new file mode 100644 index 000000000..07914c6d9 --- /dev/null +++ b/plugins/Scheduler/locale/fr.po @@ -0,0 +1,87 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-19 19:28+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:47 +msgid "Makes a function suitable for scheduling from command." +msgstr "Crée une fonction utilisable pour la programmation à partir d'une commande." + +#: plugin.py:57 +msgid "" +" \n" +"\n" +" Schedules the command string to run seconds in the\n" +" future. For example, 'scheduler add [seconds 30m] \"echo [cpu]\"' will\n" +" schedule the command \"cpu\" to be sent to the channel the schedule add\n" +" command was given in (with no prefixed nick, a consequence of using\n" +" echo). Do pay attention to the quotes in that example.\n" +" " +msgstr "" +" \n" +"\n" +"Exécute la dans un certain nombre de . Par exemple, 'scheduler add [seconds 30m] \"echo [cpu]\"' programmera la commande 'cpu' pour être envoyée sur le canal. Faites attention à l'utilisateur des guillemets dans cet exemple." + +#: plugin.py:69 +msgid "Event #%i added." +msgstr "Évènement #%i ajotué." + +#: plugin.py:74 +msgid "" +"\n" +"\n" +" Removes the event scheduled with id from the schedule.\n" +" " +msgstr "" +"\n" +"\n" +"Déprogramme l'évènement programmé d' donné." + +#: plugin.py:88 +#: plugin.py:90 +msgid "Invalid event id." +msgstr "Id d'évènement invalide." + +#: plugin.py:95 +msgid "" +" \n" +"\n" +" Schedules the command to run every seconds,\n" +" starting now (i.e., the command runs now, and every seconds\n" +" thereafter). is a name by which the command can be\n" +" unscheduled.\n" +" " +msgstr "" +" \n" +"\n" +"Programme la pour être lancée toutes les , à partir de maintenant (c'est à dire que la commande est lancée maintenant, dans un certain nombres de , puis dans deux fois ce temps, etc). Le est utilisé pour déprogrammer la commande." + +#: plugin.py:104 +msgid "There is already an event with that name, please choose another name." +msgstr "Il y a déjà un évènement avec ce nom, veuillez en choisir un autre." + +#: plugin.py:117 +msgid "" +"takes no arguments\n" +"\n" +" Lists the currently scheduled events.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Liste tous les évènement actuellement programmés" + +#: plugin.py:128 +msgid "There are currently no scheduled commands." +msgstr "Il n'y a actuellement aucune commande programmée." + diff --git a/plugins/Scheduler/messages.pot b/plugins/Scheduler/messages.pot new file mode 100644 index 000000000..226ac4fe6 --- /dev/null +++ b/plugins/Scheduler/messages.pot @@ -0,0 +1,81 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-19 19:28+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:47 +#, docstring +msgid "Makes a function suitable for scheduling from command." +msgstr "" + +#: plugin.py:57 +#, docstring +msgid "" +" \n" +"\n" +" Schedules the command string to run seconds in the\n" +" future. For example, 'scheduler add [seconds 30m] \"echo [cpu]\"' will\n" +" schedule the command \"cpu\" to be sent to the channel the schedule add\n" +" command was given in (with no prefixed nick, a consequence of using\n" +" echo). Do pay attention to the quotes in that example.\n" +" " +msgstr "" + +#: plugin.py:69 +msgid "Event #%i added." +msgstr "" + +#: plugin.py:74 +#, docstring +msgid "" +"\n" +"\n" +" Removes the event scheduled with id from the schedule.\n" +" " +msgstr "" + +#: plugin.py:88 plugin.py:90 +msgid "Invalid event id." +msgstr "" + +#: plugin.py:95 +#, docstring +msgid "" +" \n" +"\n" +" Schedules the command to run every seconds,\n" +" starting now (i.e., the command runs now, and every seconds\n" +" thereafter). is a name by which the command can be\n" +" unscheduled.\n" +" " +msgstr "" + +#: plugin.py:104 +msgid "There is already an event with that name, please choose another name." +msgstr "" + +#: plugin.py:117 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Lists the currently scheduled events.\n" +" " +msgstr "" + +#: plugin.py:128 +msgid "There are currently no scheduled commands." +msgstr "" + diff --git a/plugins/Scheduler/plugin.py b/plugins/Scheduler/plugin.py index 5ad55dc7b..ec1dd77af 100644 --- a/plugins/Scheduler/plugin.py +++ b/plugins/Scheduler/plugin.py @@ -34,6 +34,8 @@ import supybot.utils as utils from supybot.commands import * import supybot.schedule as schedule import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Scheduler') class Scheduler(callbacks.Plugin): def __init__(self, irc): @@ -50,6 +52,7 @@ class Scheduler(callbacks.Plugin): self.Proxy(irc.irc, msg, tokens) return f + @internationalizeDocstring def add(self, irc, msg, args, seconds, command): """ @@ -63,9 +66,10 @@ class Scheduler(callbacks.Plugin): id = schedule.addEvent(f, time.time() + seconds) f.eventId = id self.events[str(id)] = command - irc.replySuccess(format('Event #%i added.', id)) + irc.replySuccess(format(_('Event #%i added.'), id)) add = wrap(add, ['positiveInt', 'text']) + @internationalizeDocstring def remove(self, irc, msg, args, id): """ @@ -81,11 +85,12 @@ class Scheduler(callbacks.Plugin): schedule.removeEvent(id) irc.replySuccess() except KeyError: - irc.error('Invalid event id.') + irc.error(_('Invalid event id.')) else: - irc.error('Invalid event id.') + irc.error(_('Invalid event id.')) remove = wrap(remove, ['lowered']) + @internationalizeDocstring def repeat(self, irc, msg, args, name, seconds, command): """ @@ -96,8 +101,8 @@ class Scheduler(callbacks.Plugin): """ name = name.lower() if name in self.events: - irc.error('There is already an event with that name, please ' - 'choose another name.', Raise=True) + irc.error(_('There is already an event with that name, please ' + 'choose another name.'), Raise=True) self.events[name] = command f = self._makeCommandFunction(irc, msg, command, remove=False) id = schedule.addPeriodicEvent(f, seconds, name) @@ -107,6 +112,7 @@ class Scheduler(callbacks.Plugin): # irc.replySuccess() repeat = wrap(repeat, ['nonInt', 'positiveInt', 'text']) + @internationalizeDocstring def list(self, irc, msg, args): """takes no arguments @@ -119,7 +125,7 @@ class Scheduler(callbacks.Plugin): L[i] = format('%s: %q', name, command) irc.reply(format('%L', L)) else: - irc.reply('There are currently no scheduled commands.') + irc.reply(_('There are currently no scheduled commands.')) list = wrap(list) diff --git a/plugins/Seen/config.py b/plugins/Seen/config.py index fa24b305d..d7111bf93 100644 --- a/plugins/Seen/config.py +++ b/plugins/Seen/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Seen') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,7 +44,7 @@ def configure(advanced): Seen = conf.registerPlugin('Seen') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Seen, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Seen/locale/fr.po b/plugins/Seen/locale/fr.po new file mode 100644 index 000000000..a675a3251 --- /dev/null +++ b/plugins/Seen/locale/fr.po @@ -0,0 +1,128 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-20 08:52+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: plugin.py:203 +#: plugin.py:284 +msgid "%s was last seen in %s %s ago: %s" +msgstr "%s a été vu pour la dernière fois sur %i il y a %s : %s" + +#: plugin.py:210 +msgid "%s (%s ago)" +msgstr "%s (il y a %s)" + +#: plugin.py:212 +msgid "%s could be %L" +msgstr "%s doit être %L" + +#: plugin.py:212 +msgid "or" +msgstr "ou" + +#: plugin.py:214 +msgid "I haven't seen anyone matching %s." +msgstr "Je n'ai vu personne correspondant à %s." + +#: plugin.py:216 +#: plugin.py:288 +msgid "I have not seen %s." +msgstr "Je n'ai pas vu %s." + +#: plugin.py:220 +msgid "" +"[] \n" +"\n" +" Returns the last time was seen and what was last seen\n" +" saying. is only necessary if the message isn't sent on the\n" +" channel itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne la dernière fois que le a été vu et la dernière fois que a parlé. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:231 +msgid "" +"[] [--user ] []\n" +"\n" +" Returns the last time was seen and what was last seen\n" +" doing. This includes any form of activity, instead of just PRIVMSGs.\n" +" If isn't specified, returns the last activity seen in\n" +" . If --user is specified, looks up name in the user database\n" +" and returns the last time user was active in . is\n" +" only necessary if the message isn't sent on the channel itself.\n" +" " +msgstr "" +"[] [--user ] []\n" +"\n" +"Retourne la dernière fois que le a été vu et ce quand il a fait quelque chose pour la première fois. Cela inclue toute forme d'activité, et pas uniquement envoyer des messages. Si le n'est pas donné, retourne la dernière activité vue sur le . Si --user est spécifié, recherche le nom dans la base de données des utilisateurs la dernière fois que celui en question a été vu actif sur le n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:261 +msgid "Someone was last seen in %s %s ago: %s" +msgstr "Quelqu'un a été vu pour la dernière fois sur %s il y a %s : %s" + +#: plugin.py:265 +msgid "I have never seen anyone." +msgstr "Je n'ai jamais vu personne." + +#: plugin.py:269 +msgid "" +"[]\n" +"\n" +" Returns the last thing said in . is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Retourne la dernière chose dite sur le . n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:292 +msgid "" +"[] \n" +"\n" +" Returns the last time was seen and what was last seen\n" +" saying. This looks up in the user seen database, which means\n" +" that it could be any nick recognized as user that was seen.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne la dernière fois que a été vu et la dernière fois que a été vu parler. Cela recherche dans la base de données des utilisateurs vus, ce qui signifie que si le nick n'était pas reconnu comme l'utilisateur , il n'est pas considéré comme vu. n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même." + +#: plugin.py:305 +msgid "" +"[] \n" +"\n" +" Returns the messages since last left the channel.\n" +" " +msgstr "" +"[] \n" +"\n" +"Retourne les messages depuis que est parti du canal." + +#: plugin.py:312 +msgid "You must be in %s to use this command." +msgstr "Vous devez être sur %s pour utiliser cette commande." + +#: plugin.py:333 +msgid "I couldn't find in my history of %s messages where %r last left the %s" +msgstr "Je ne peux pas trouver dans mon historique de %s messages, où %r a quitté il y a %s" + +#: plugin.py:342 +msgid "Either %s didn't leave, or no messages were sent while %s was gone." +msgstr "Soit %s n'est jamais parti, soit aucun message n'a été envoyé depuis qu'il est parti." + diff --git a/plugins/Seen/messages.pot b/plugins/Seen/messages.pot new file mode 100644 index 000000000..e1186b0f1 --- /dev/null +++ b/plugins/Seen/messages.pot @@ -0,0 +1,118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-20 08:52+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: plugin.py:203 plugin.py:284 +msgid "%s was last seen in %s %s ago: %s" +msgstr "" + +#: plugin.py:210 +msgid "%s (%s ago)" +msgstr "" + +#: plugin.py:212 +msgid "%s could be %L" +msgstr "" + +#: plugin.py:212 +msgid "or" +msgstr "" + +#: plugin.py:214 +msgid "I haven't seen anyone matching %s." +msgstr "" + +#: plugin.py:216 plugin.py:288 +msgid "I have not seen %s." +msgstr "" + +#: plugin.py:220 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns the last time was seen and what was last seen\n" +" saying. is only necessary if the message isn't sent on the\n" +" channel itself.\n" +" " +msgstr "" + +#: plugin.py:231 +#, docstring +msgid "" +"[] [--user ] []\n" +"\n" +" Returns the last time was seen and what was last seen\n" +" doing. This includes any form of activity, instead of just PRIVMSGs.\n" +" If isn't specified, returns the last activity seen in\n" +" . If --user is specified, looks up name in the user database\n" +" and returns the last time user was active in . is\n" +" only necessary if the message isn't sent on the channel itself.\n" +" " +msgstr "" + +#: plugin.py:261 +msgid "Someone was last seen in %s %s ago: %s" +msgstr "" + +#: plugin.py:265 +msgid "I have never seen anyone." +msgstr "" + +#: plugin.py:269 +#, docstring +msgid "" +"[]\n" +"\n" +" Returns the last thing said in . is only necessary\n" +" if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:292 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns the last time was seen and what was last seen\n" +" saying. This looks up in the user seen database, which means\n" +" that it could be any nick recognized as user that was seen.\n" +" is only necessary if the message isn't sent in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:305 +#, docstring +msgid "" +"[] \n" +"\n" +" Returns the messages since last left the channel.\n" +" " +msgstr "" + +#: plugin.py:312 +msgid "You must be in %s to use this command." +msgstr "" + +#: plugin.py:333 +msgid "I couldn't find in my history of %s messages where %r last left the %s" +msgstr "" + +#: plugin.py:342 +msgid "Either %s didn't leave, or no messages were sent while %s was gone." +msgstr "" + diff --git a/plugins/Seen/plugin.py b/plugins/Seen/plugin.py index 4051e0994..7d2fee947 100644 --- a/plugins/Seen/plugin.py +++ b/plugins/Seen/plugin.py @@ -42,6 +42,8 @@ import supybot.ircmsgs as ircmsgs import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Seen') class IrcStringAndIntDict(utils.InsensitivePreservingDict): def key(self, x): @@ -198,21 +200,22 @@ class Seen(callbacks.Plugin): if len(results) == 1: (nick, info) = results[0] (when, said) = info - irc.reply(format('%s was last seen in %s %s ago: %s', + irc.reply(format(_('%s was last seen in %s %s ago: %s'), nick, channel, utils.timeElapsed(time.time()-when), said)) elif len(results) > 1: L = [] for (nick, info) in results: (when, said) = info - L.append(format('%s (%s ago)', nick, + L.append(format(_('%s (%s ago)'), nick, utils.timeElapsed(time.time()-when))) - irc.reply(format('%s could be %L', name, (L, 'or'))) + irc.reply(format(_('%s could be %L'), name, (L, _('or')))) else: - irc.reply(format('I haven\'t seen anyone matching %s.', name)) + irc.reply(format(_('I haven\'t seen anyone matching %s.'), name)) except KeyError: - irc.reply(format('I have not seen %s.', name)) + irc.reply(format(_('I have not seen %s.'), name)) + @internationalizeDocstring def seen(self, irc, msg, args, channel, name): """[] @@ -223,6 +226,7 @@ class Seen(callbacks.Plugin): self._seen(irc, channel, name) seen = wrap(seen, ['channel', 'nick']) + @internationalizeDocstring def any(self, irc, msg, args, channel, optlist, name): """[] [--user ] [] @@ -254,12 +258,13 @@ class Seen(callbacks.Plugin): db = self.db try: (when, said) = db.seen(channel, '') - irc.reply(format('Someone was last seen in %s %s ago: %s', + irc.reply(format(_('Someone was last seen in %s %s ago: %s'), channel, utils.timeElapsed(time.time()-when), said)) except KeyError: - irc.reply('I have never seen anyone.') + irc.reply(_('I have never seen anyone.')) + @internationalizeDocstring def last(self, irc, msg, args, channel): """[] @@ -276,12 +281,13 @@ class Seen(callbacks.Plugin): db = self.db try: (when, said) = db.seen(channel, user.id) - irc.reply(format('%s was last seen in %s %s ago: %s', + irc.reply(format(_('%s was last seen in %s %s ago: %s'), user.name, channel, utils.timeElapsed(time.time()-when), said)) except KeyError: - irc.reply(format('I have not seen %s.', user.name)) + irc.reply(format(_('I have not seen %s.'), user.name)) + @internationalizeDocstring def user(self, irc, msg, args, channel, user): """[] @@ -294,6 +300,7 @@ class Seen(callbacks.Plugin): self._user(irc, channel, user) user = wrap(user, ['channel', 'otherUser']) + @internationalizeDocstring def since(self, irc, msg, args, channel, nick): """[] @@ -302,7 +309,8 @@ class Seen(callbacks.Plugin): if nick is None: nick = msg.nick if nick not in irc.state.channels[channel].users: - irc.error(format('You must be in %s to use this command.', channel)) + irc.error(format(_('You must be in %s to use this command.'), + channel)) return end = None # By default, up until the most recent message. for (i, m) in utils.seq.renumerate(irc.state.history): @@ -322,8 +330,8 @@ class Seen(callbacks.Plugin): ircutils.strEqual(m.args[0], channel): break else: # I never use this; it only kicks in when the for loop exited normally. - irc.error(format('I couldn\'t find in my history of %s messages ' - 'where %r last left the %s', + irc.error(format(_('I couldn\'t find in my history of %s messages ' + 'where %r last left the %s'), len(irc.state.history), nick, channel)) return msgs = [m for m in irc.state.history[i:end] @@ -331,8 +339,8 @@ class Seen(callbacks.Plugin): if msgs: irc.reply(format('%L', map(ircmsgs.prettyPrint, msgs))) else: - irc.reply(format('Either %s didn\'t leave, ' - 'or no messages were sent while %s was gone.', nick, nick)) + irc.reply(format(_('Either %s didn\'t leave, ' + 'or no messages were sent while %s was gone.'), nick, nick)) since = wrap(since, ['channel', additional('nick')]) Class = Seen diff --git a/plugins/Services/config.py b/plugins/Services/config.py index aa09131ea..ffb2db783 100644 --- a/plugins/Services/config.py +++ b/plugins/Services/config.py @@ -31,11 +31,13 @@ import supybot.conf as conf import supybot.ircutils as ircutils import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Services') def registerNick(nick, password=''): p = conf.supybot.plugins.Services.Nickserv.get('password') - h = 'Determines what password the bot will use with NickServ when ' \ - 'identifying as %s.' % nick + h = _('Determines what password the bot will use with NickServ when ' \ + 'identifying as %s.') % nick v = conf.registerGlobalValue(p, nick, registry.String(password, h, private=True)) if password: @@ -44,10 +46,10 @@ def registerNick(nick, password=''): def configure(advanced): from supybot.questions import expect, anything, something, yn, getpass conf.registerPlugin('Services', True) - nick = something('What is your registered nick?') - password = something('What is your password for that nick?') - chanserv = something('What is your ChanServ named?', default='ChanServ') - nickserv = something('What is your NickServ named?', default='NickServ') + nick = something(_('What is your registered nick?')) + password = something(_('What is your password for that nick?')) + chanserv = something(_('What is your ChanServ named?'), default='ChanServ') + nickserv = something(_('What is your NickServ named?'), default='NickServ') conf.supybot.plugins.Services.nicks.setValue([nick]) conf.supybot.plugins.Services.NickServ.setValue(nickserv) registerNick(nick, password) @@ -65,42 +67,42 @@ class ValidNickSet(conf.ValidNicks): Services = conf.registerPlugin('Services') conf.registerGlobalValue(Services, 'nicks', - ValidNickSet([], """Determines what nicks the bot will use with - services.""")) + ValidNickSet([], _("""Determines what nicks the bot will use with + services."""))) class Networks(registry.SpaceSeparatedSetOfStrings): List = ircutils.IrcSet conf.registerGlobalValue(Services, 'disabledNetworks', - Networks(['QuakeNet'], """Determines what networks this plugin will be - disabled on.""")) + Networks(_('QuakeNet').split(), _("""Determines what networks this plugin + will be disabled on."""))) conf.registerGlobalValue(Services, 'noJoinsUntilIdentified', - registry.Boolean(False, """Determines whether the bot will not join any + registry.Boolean(False, _("""Determines whether the bot will not join any channels until it is identified. This may be useful, for instances, if you have a vhost that isn't set until you're identified, or if you're - joining +r channels that won't allow you to join unless you identify.""")) + joining +r channels that won't allow you to join unless you identify."""))) conf.registerGlobalValue(Services, 'ghostDelay', - registry.PositiveInteger(60, """Determines how many seconds the bot will - wait between successive GHOST attempts.""")) + registry.PositiveInteger(60, _("""Determines how many seconds the bot will + wait between successive GHOST attempts."""))) conf.registerGlobalValue(Services, 'NickServ', - ValidNickOrEmptyString('', """Determines what nick the 'NickServ' service - has.""")) + ValidNickOrEmptyString('', _("""Determines what nick the 'NickServ' service + has."""))) conf.registerGroup(Services.NickServ, 'password') conf.registerGlobalValue(Services, 'ChanServ', - ValidNickOrEmptyString('', """Determines what nick the 'ChanServ' service - has.""")) + ValidNickOrEmptyString('', _("""Determines what nick the 'ChanServ' service + has."""))) conf.registerChannelValue(Services.ChanServ, 'password', - registry.String('', """Determines what password the bot will use with - ChanServ.""", private=True)) + registry.String('', _("""Determines what password the bot will use with + ChanServ."""), private=True)) conf.registerChannelValue(Services.ChanServ, 'op', - registry.Boolean(False, """Determines whether the bot will request to get - opped by the ChanServ when it joins the channel.""")) + registry.Boolean(False, _("""Determines whether the bot will request to get + opped by the ChanServ when it joins the channel."""))) conf.registerChannelValue(Services.ChanServ, 'halfop', - registry.Boolean(False, """Determines whether the bot will request to get - half-opped by the ChanServ when it joins the channel.""")) + registry.Boolean(False, _("""Determines whether the bot will request to get + half-opped by the ChanServ when it joins the channel."""))) conf.registerChannelValue(Services.ChanServ, 'voice', - registry.Boolean(False, """Determines whether the bot will request to get - voiced by the ChanServ when it joins the channel.""")) + registry.Boolean(False, _("""Determines whether the bot will request to get + voiced by the ChanServ when it joins the channel."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Services/locale/fr.po b/plugins/Services/locale/fr.po new file mode 100644 index 000000000..148fa38f7 --- /dev/null +++ b/plugins/Services/locale/fr.po @@ -0,0 +1,248 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-20 08:55+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:39 +msgid "Determines what password the bot will use with NickServ when identifying as %s." +msgstr "Détermine quel mot de passe le bot utilisera pour s'identifier à NickServ lors de l'identification à %s." + +#: config.py:49 +msgid "What is your registered nick?" +msgstr "Quel est votre nick enregistré ?" + +#: config.py:50 +msgid "What is your password for that nick?" +msgstr "Quel est votre mot de passe pour ce nick ?" + +#: config.py:51 +msgid "What is your ChanServ named?" +msgstr "Comment est nommé ChanServ ?" + +#: config.py:52 +msgid "What is your NickServ named?" +msgstr "Comment est nommé NickServ ?" + +#: config.py:70 +msgid "" +"Determines what nicks the bot will use with\n" +" services." +msgstr "Détermine quels nicks le bot utilisera avec les services." + +#: config.py:77 +msgid "" +"Determines what networks this plugin\n" +" will be disabled on." +msgstr "Détermine sur quels réseaux ce plugin sera désactivé." + +#: config.py:77 +msgid "QuakeNet" +msgstr "QuakeNet" + +#: config.py:81 +msgid "" +"Determines whether the bot will not join any\n" +" channels until it is identified. This may be useful, for instances, if\n" +" you have a vhost that isn't set until you're identified, or if you're\n" +" joining +r channels that won't allow you to join unless you identify." +msgstr "Détermine si le bot peut rejoindre un ou des canal(aux) avant d'être identifié. Ce peut être utilise, par exemple si vous utilisez une vhost qui n'est activée qu'une fois que vous êtes identifié, ou encore si vous devez rejoindre des canaux en +r (=des canaux que l'on ne peut joindre sans être identifié)" + +#: config.py:86 +msgid "" +"Determines how many seconds the bot will\n" +" wait between successive GHOST attempts." +msgstr "Détermine le nombre de secondes entre deux tentatives successives de GHOST." + +#: config.py:89 +msgid "" +"Determines what nick the 'NickServ' service\n" +" has." +msgstr "Détermine quel nick NickServ a." + +#: config.py:93 +msgid "" +"Determines what nick the 'ChanServ' service\n" +" has." +msgstr "Détermine quel nick ChanServ a." + +#: config.py:96 +msgid "" +"Determines what password the bot will use with\n" +" ChanServ." +msgstr "Détermine quel mot de passe le bot utilisera avec ChanServ." + +#: config.py:99 +msgid "" +"Determines whether the bot will request to get\n" +" opped by the ChanServ when it joins the channel." +msgstr "Détermine si le bot demandera à être oppé par ChanServ lorsqu'il rejoint le canal." + +#: config.py:102 +msgid "" +"Determines whether the bot will request to get\n" +" half-opped by the ChanServ when it joins the channel." +msgstr "Détermine si le bot demandera à être oppé par NickServ lorsqu'il rejoint le canal." + +#: config.py:105 +msgid "" +"Determines whether the bot will request to get\n" +" voiced by the ChanServ when it joins the channel." +msgstr "Détermine si le bot demandera à être voicé par ChanServ lorsqu'il rejoint le canal." + +#: plugin.py:48 +msgid "" +"This plugin handles dealing with Services on networks that provide them.\n" +" Basically, you should use the \"password\" command to tell the bot a nick to\n" +" identify with and what password to use to identify with that nick. You can\n" +" use the password command multiple times if your bot has multiple nicks\n" +" registered. Also, be sure to configure the NickServ and ChanServ\n" +" configuration variables to match the NickServ and ChanServ nicks on your\n" +" network. Other commands such as identify, op, etc. should not be\n" +" necessary if the bot is properly configured." +msgstr "Ce plugin gère les services sur les réseaux qui en fournissent. En général, vous pouvez utiliser la commande 'password' pour dire au bot de prendre un nick et de s'identifier avec le mot de passe. Vous pouvez utiliser la commande 'password' autant de fois que le bot a de nicks enregistrés. Aussi, assurez-vous de configurer les variables NickServ et ChanServ pour correspondre à leurs nicks respectifs sur le réseau en question. D'autres commandes, comme 'identify', 'op', ... ne sont pas nécessaires quand le bot est configuré correctement." + +#: plugin.py:396 +msgid "You must set supybot.plugins.Services.ChanServ before I'm able to send the %s command." +msgstr "vous devez définir supybot.plugins.Services.ChanServ avant que je ne puisse envoyer la commande %s" + +#: plugin.py:402 +msgid "" +"[]\n" +"\n" +" Attempts to get opped by ChanServ in . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Demande à être opé par ChanServ sur le . n'est nécessaire que si la commande n'est pas envoyée sur le canal lui-même." + +#: plugin.py:408 +msgid "I'm already opped in %s." +msgstr "Je suis déjà opé sur %s." + +#: plugin.py:415 +msgid "" +"[]\n" +"\n" +" Attempts to get voiced by ChanServ in . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" +"[]\n" +"\n" +" Demande à être voicé par ChanServ sur le . n'est nécessaire que si la commande n'est pas envoyée sur le canal lui-même." + +#: plugin.py:421 +msgid "I'm already voiced in %s." +msgstr "Je suis déjà voicé sur %s." + +#: plugin.py:438 +msgid "" +"[]\n" +"\n" +" Attempts to get unbanned by ChanServ in . is only\n" +" necessary if the message isn't sent in the channel itself, but chances\n" +" are, if you need this command, you're not sending it in the channel\n" +" itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Cherche à être débanni par ChanServ sur le . n'est nécessaire que si la commande n'est pas envoyée sur le canal lui-même, mais, vous n'avez probablement pas besoin d'utiliser cette commande sur le canal en question." + +#: plugin.py:459 +msgid "" +"[]\n" +"\n" +" Attempts to get invited by ChanServ to . is only\n" +" necessary if the message isn't sent in the channel itself, but chances\n" +" are, if you need this command, you're not sending it in the channel\n" +" itself.\n" +" " +msgstr "" +"[]\n" +"\n" +"Cherche à être invité par ChanServ sur le . n'est nécessaire que si la commande n'est pas envoyée sur le canal lui-même, mais, vous n'avez probablement pas besoin d'utiliser cette commande sur le canal en question." + +#: plugin.py:480 +msgid "" +"takes no arguments\n" +"\n" +" Identifies with NickServ using the current nick.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"S'identifie auprès de NickServ, en utilisant le nick actuel." + +#: plugin.py:489 +msgid "I don't have a configured password for my current nick." +msgstr "Je n'ai pas de mot de passe configuré pour mon nick actuel." + +#: plugin.py:492 +msgid "You must set supybot.plugins.Services.NickServ before I'm able to do identify." +msgstr "Vous devez définir supybot.plugins.Services.NickServ avant que je ne puisse m'identifier" + +#: plugin.py:498 +msgid "" +"[]\n" +"\n" +" Ghosts the bot's given nick and takes it. If no nick is given,\n" +" ghosts the bot's configured nick and takes it.\n" +" " +msgstr "" +"[]\n" +"\n" +"Ghost le nick donné du bot et le prend. Si aucun nick n'est donné, utilise celui configuré." + +#: plugin.py:507 +msgid "I cowardly refuse to ghost myself." +msgstr "Je suis trop couard pour me ghoster moi-même." + +#: plugin.py:512 +msgid "You must set supybot.plugins.Services.NickServ before I'm able to ghost a nick." +msgstr "Vous devez définir supybot.plugins.Services.NickServ avant que je ne puisse ghoster un nick." + +#: plugin.py:518 +msgid "" +" []\n" +"\n" +" Sets the NickServ password for to . If is\n" +" not given, removes from the configured nicks.\n" +" " +msgstr "" +" []\n" +"\n" +"Défini le NickServ pour le . Si le n'est pas donné, supprime de la liste des nis, configurés." + +#: plugin.py:528 +msgid "That nick was not configured with a password." +msgstr "Ce nick n'est pas configuré avec un mot de passe." + +#: plugin.py:539 +msgid "" +"takes no arguments\n" +"\n" +" Returns the nicks that this plugin is configured to identify and ghost\n" +" with.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne les nicks pour lesquels ce plugin est configuré pour s'identifier et ghoster." + +#: plugin.py:549 +msgid "I'm not currently configured for any nicks." +msgstr "Je ne suis actuellement configuré pour aucun nick." + diff --git a/plugins/Services/messages.pot b/plugins/Services/messages.pot new file mode 100644 index 000000000..05b81d37a --- /dev/null +++ b/plugins/Services/messages.pot @@ -0,0 +1,235 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-20 08:55+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:39 +msgid "Determines what password the bot will use with NickServ when identifying as %s." +msgstr "" + +#: config.py:49 +msgid "What is your registered nick?" +msgstr "" + +#: config.py:50 +msgid "What is your password for that nick?" +msgstr "" + +#: config.py:51 +msgid "What is your ChanServ named?" +msgstr "" + +#: config.py:52 +msgid "What is your NickServ named?" +msgstr "" + +#: config.py:70 +msgid "" +"Determines what nicks the bot will use with\n" +" services." +msgstr "" + +#: config.py:77 +msgid "" +"Determines what networks this plugin\n" +" will be disabled on." +msgstr "" + +#: config.py:77 +msgid "QuakeNet" +msgstr "" + +#: config.py:81 +msgid "" +"Determines whether the bot will not join any\n" +" channels until it is identified. This may be useful, for instances, if\n" +" you have a vhost that isn't set until you're identified, or if you're\n" +" joining +r channels that won't allow you to join unless you identify." +msgstr "" + +#: config.py:86 +msgid "" +"Determines how many seconds the bot will\n" +" wait between successive GHOST attempts." +msgstr "" + +#: config.py:89 +msgid "" +"Determines what nick the 'NickServ' service\n" +" has." +msgstr "" + +#: config.py:93 +msgid "" +"Determines what nick the 'ChanServ' service\n" +" has." +msgstr "" + +#: config.py:96 +msgid "" +"Determines what password the bot will use with\n" +" ChanServ." +msgstr "" + +#: config.py:99 +msgid "" +"Determines whether the bot will request to get\n" +" opped by the ChanServ when it joins the channel." +msgstr "" + +#: config.py:102 +msgid "" +"Determines whether the bot will request to get\n" +" half-opped by the ChanServ when it joins the channel." +msgstr "" + +#: config.py:105 +msgid "" +"Determines whether the bot will request to get\n" +" voiced by the ChanServ when it joins the channel." +msgstr "" + +#: plugin.py:48 +#, docstring +msgid "" +"This plugin handles dealing with Services on networks that provide them.\n" +" Basically, you should use the \"password\" command to tell the bot a nick to\n" +" identify with and what password to use to identify with that nick. You can\n" +" use the password command multiple times if your bot has multiple nicks\n" +" registered. Also, be sure to configure the NickServ and ChanServ\n" +" configuration variables to match the NickServ and ChanServ nicks on your\n" +" network. Other commands such as identify, op, etc. should not be\n" +" necessary if the bot is properly configured." +msgstr "" + +#: plugin.py:396 +msgid "You must set supybot.plugins.Services.ChanServ before I'm able to send the %s command." +msgstr "" + +#: plugin.py:402 +#, docstring +msgid "" +"[]\n" +"\n" +" Attempts to get opped by ChanServ in . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:408 +msgid "I'm already opped in %s." +msgstr "" + +#: plugin.py:415 +#, docstring +msgid "" +"[]\n" +"\n" +" Attempts to get voiced by ChanServ in . is only\n" +" necessary if the message isn't sent in the channel itself.\n" +" " +msgstr "" + +#: plugin.py:421 +msgid "I'm already voiced in %s." +msgstr "" + +#: plugin.py:438 +#, docstring +msgid "" +"[]\n" +"\n" +" Attempts to get unbanned by ChanServ in . is only\n" +" necessary if the message isn't sent in the channel itself, but chances\n" +" are, if you need this command, you're not sending it in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:459 +#, docstring +msgid "" +"[]\n" +"\n" +" Attempts to get invited by ChanServ to . is only\n" +" necessary if the message isn't sent in the channel itself, but chances\n" +" are, if you need this command, you're not sending it in the channel\n" +" itself.\n" +" " +msgstr "" + +#: plugin.py:480 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Identifies with NickServ using the current nick.\n" +" " +msgstr "" + +#: plugin.py:489 +msgid "I don't have a configured password for my current nick." +msgstr "" + +#: plugin.py:492 +msgid "You must set supybot.plugins.Services.NickServ before I'm able to do identify." +msgstr "" + +#: plugin.py:498 +#, docstring +msgid "" +"[]\n" +"\n" +" Ghosts the bot's given nick and takes it. If no nick is given,\n" +" ghosts the bot's configured nick and takes it.\n" +" " +msgstr "" + +#: plugin.py:507 +msgid "I cowardly refuse to ghost myself." +msgstr "" + +#: plugin.py:512 +msgid "You must set supybot.plugins.Services.NickServ before I'm able to ghost a nick." +msgstr "" + +#: plugin.py:518 +#, docstring +msgid "" +" []\n" +"\n" +" Sets the NickServ password for to . If is\n" +" not given, removes from the configured nicks.\n" +" " +msgstr "" + +#: plugin.py:528 +msgid "That nick was not configured with a password." +msgstr "" + +#: plugin.py:539 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the nicks that this plugin is configured to identify and ghost\n" +" with.\n" +" " +msgstr "" + +#: plugin.py:549 +msgid "I'm not currently configured for any nicks." +msgstr "" + diff --git a/plugins/Services/plugin.py b/plugins/Services/plugin.py index e5882573b..e372c2048 100644 --- a/plugins/Services/plugin.py +++ b/plugins/Services/plugin.py @@ -40,6 +40,8 @@ import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.schedule as schedule import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Services') class Services(callbacks.Plugin): """This plugin handles dealing with Services on networks that provide them. @@ -390,10 +392,11 @@ class Services(callbacks.Plugin): 'supybot.plugins.Services.ChanServ before ' 'I can send commands to ChanServ.', command) else: - irc.error('You must set supybot.plugins.Services.ChanServ ' - 'before I\'m able to send the %s command.' % command, + irc.error(_('You must set supybot.plugins.Services.ChanServ ' + 'before I\'m able to send the %s command.') % command, Raise=True) + @internationalizeDocstring def op(self, irc, msg, args, channel): """[] @@ -401,11 +404,12 @@ class Services(callbacks.Plugin): necessary if the message isn't sent in the channel itself. """ if irc.nick in irc.state.channels[channel].ops: - irc.error(format('I\'m already opped in %s.', channel)) + irc.error(format(_('I\'m already opped in %s.'), channel)) else: self._chanservCommand(irc, channel, 'op') op = wrap(op, [('checkChannelCapability', 'op'), 'inChannel']) + @internationalizeDocstring def voice(self, irc, msg, args, channel): """[] @@ -413,7 +417,7 @@ class Services(callbacks.Plugin): necessary if the message isn't sent in the channel itself. """ if irc.nick in irc.state.channels[channel].voices: - irc.error(format('I\'m already voiced in %s.', channel)) + irc.error(format(_('I\'m already voiced in %s.'), channel)) else: self._chanservCommand(irc, channel, 'voice') voice = wrap(voice, [('checkChannelCapability', 'op'), 'inChannel']) @@ -428,6 +432,7 @@ class Services(callbacks.Plugin): self._chanservCommand(irc, channel, 'unban', log=True) # Success log in doChanservNotice. + @internationalizeDocstring def unban(self, irc, msg, args, channel): """[] @@ -448,6 +453,7 @@ class Services(callbacks.Plugin): self.log.info('%s is +i, attempting ChanServ invite %s.', channel, on) self._chanservCommand(irc, channel, 'invite', log=True) + @internationalizeDocstring def invite(self, irc, msg, args, channel): """[] @@ -468,6 +474,7 @@ class Services(callbacks.Plugin): self.log.info('Joining %s, invited by ChanServ %s.', channel, on) irc.queueMsg(networkGroup.channels.join(channel)) + @internationalizeDocstring def identify(self, irc, msg, args): """takes no arguments @@ -478,13 +485,14 @@ class Services(callbacks.Plugin): self._doIdentify(irc, irc.nick) irc.replySuccess() else: - irc.error('I don\'t have a configured password for ' - 'my current nick.') + irc.error(_('I don\'t have a configured password for ' + 'my current nick.')) else: - irc.error('You must set supybot.plugins.Services.NickServ before ' - 'I\'m able to do identify.') + irc.error(_('You must set supybot.plugins.Services.NickServ before ' + 'I\'m able to do identify.')) identify = wrap(identify, [('checkCapability', 'admin')]) + @internationalizeDocstring def ghost(self, irc, msg, args, nick): """[] @@ -495,15 +503,16 @@ class Services(callbacks.Plugin): if not nick: nick = self._getNick() if ircutils.strEqual(nick, irc.nick): - irc.error('I cowardly refuse to ghost myself.') + irc.error(_('I cowardly refuse to ghost myself.')) else: self._doGhost(irc, nick=nick) irc.replySuccess() else: - irc.error('You must set supybot.plugins.Services.NickServ before ' - 'I\'m able to ghost a nick.') + irc.error(_('You must set supybot.plugins.Services.NickServ before ' + 'I\'m able to ghost a nick.')) ghost = wrap(ghost, [('checkCapability', 'admin'), additional('nick')]) + @internationalizeDocstring def password(self, irc, msg, args, nick, password): """ [] @@ -515,7 +524,7 @@ class Services(callbacks.Plugin): self.registryValue('nicks').remove(nick) irc.replySuccess() except KeyError: - irc.error('That nick was not configured with a password.') + irc.error(_('That nick was not configured with a password.')) return else: self.registryValue('nicks').add(nick) @@ -524,6 +533,7 @@ class Services(callbacks.Plugin): password = wrap(password, [('checkCapability', 'admin'), 'private', 'nick', 'text']) + @internationalizeDocstring def nicks(self, irc, msg, args): """takes no arguments @@ -535,9 +545,9 @@ class Services(callbacks.Plugin): utils.sortBy(ircutils.toLower, L) irc.reply(format('%L', L)) else: - irc.reply('I\'m not currently configured for any nicks.') + irc.reply(_('I\'m not currently configured for any nicks.')) nicks = wrap(nicks, [('checkCapability', 'admin')]) - +Services = internationalizeDocstring(Services) Class = Services diff --git a/plugins/ShrinkUrl/config.py b/plugins/ShrinkUrl/config.py index fa5429510..5a2b6355e 100644 --- a/plugins/ShrinkUrl/config.py +++ b/plugins/ShrinkUrl/config.py @@ -30,13 +30,15 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('ShrinkUrl') def configure(advanced): from supybot.questions import output, expect, anything, something, yn conf.registerPlugin('ShrinkUrl', True) - if yn("""This plugin offers a snarfer that will go retrieve a shorter + if yn(_("""This plugin offers a snarfer that will go retrieve a shorter version of long URLs that are sent to the channel. Would you - like this snarfer to be enabled?""", default=False): + like this snarfer to be enabled?"""), default=False): conf.supybot.plugins.ShrinkUrl.shrinkSnarfer.setValue(True) class ShrinkService(registry.OnlySomeStrings): @@ -66,34 +68,34 @@ class ShrinkCycle(registry.SpaceSeparatedListOfStrings): ShrinkUrl = conf.registerPlugin('ShrinkUrl') conf.registerChannelValue(ShrinkUrl, 'shrinkSnarfer', - registry.Boolean(False, """Determines whether the + registry.Boolean(False, _("""Determines whether the shrink snarfer is enabled. This snarfer will watch for URLs in the channel, and if they're sufficiently long (as determined by supybot.plugins.ShrinkUrl.minimumLength) it will post a smaller URL from either ln-s.net or tinyurl.com, as denoted in - supybot.plugins.ShrinkUrl.default.""")) + supybot.plugins.ShrinkUrl.default."""))) conf.registerChannelValue(ShrinkUrl.shrinkSnarfer, 'showDomain', - registry.Boolean(True, """Determines whether the snarfer will show the - domain of the URL being snarfed along with the shrunken URL.""")) + registry.Boolean(True, _("""Determines whether the snarfer will show the + domain of the URL being snarfed along with the shrunken URL."""))) conf.registerChannelValue(ShrinkUrl, 'minimumLength', - registry.PositiveInteger(48, """The minimum length a URL must be before - the bot will shrink it.""")) + registry.PositiveInteger(48, _("""The minimum length a URL must be before + the bot will shrink it."""))) conf.registerChannelValue(ShrinkUrl, 'nonSnarfingRegexp', - registry.Regexp(None, """Determines what URLs are to be snarfed; URLs + registry.Regexp(None, _("""Determines what URLs are to be snarfed; URLs matching the regexp given will not be snarfed. Give the empty string if - you have no URLs that you'd like to exclude from being snarfed.""")) + you have no URLs that you'd like to exclude from being snarfed."""))) conf.registerChannelValue(ShrinkUrl, 'outFilter', - registry.Boolean(False, """Determines whether the bot will shrink the URLs - of outgoing messages if those URLs are longer than - supybot.plugins.ShrinkUrl.minimumLength.""")) + registry.Boolean(False, _("""Determines whether the bot will shrink the + URLs of outgoing messages if those URLs are longer than + supybot.plugins.ShrinkUrl.minimumLength."""))) conf.registerChannelValue(ShrinkUrl, 'default', - ShrinkService('ln', """Determines what website the bot will use when - shrinking a URL.""")) + ShrinkService('ln', _("""Determines what website the bot will use when + shrinking a URL."""))) conf.registerGlobalValue(ShrinkUrl, 'bold', - registry.Boolean(True, """Determines whether this plugin will bold certain - portions of its replies.""")) + registry.Boolean(True, _("""Determines whether this plugin will bold + certain portions of its replies."""))) conf.registerChannelValue(ShrinkUrl, 'serviceRotation', - ShrinkCycle([], """If set to a non-empty value, specifies the list of - services to rotate through for the shrinkSnarfer and outFilter.""")) + ShrinkCycle([], _("""If set to a non-empty value, specifies the list of + services to rotate through for the shrinkSnarfer and outFilter."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/ShrinkUrl/locale/fr.po b/plugins/ShrinkUrl/locale/fr.po new file mode 100644 index 000000000..0a276eb7f --- /dev/null +++ b/plugins/ShrinkUrl/locale/fr.po @@ -0,0 +1,125 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-20 08:55+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:39 +msgid "" +"This plugin offers a snarfer that will go retrieve a shorter\n" +" version of long URLs that are sent to the channel. Would you\n" +" like this snarfer to be enabled?" +msgstr "Ce plugin offre un snarfer qui récupère de longues URLs envoyées sur un canal pour en envoyer une version plus courte. Voulez-vous activer ce snarfer ?" + +#: config.py:45 +#: config.py:49 +msgid "Valid values include 'ln', 'tiny', 'xrl', and 'x0'." +msgstr "Les valeurs valides incluent 'ln', 'tiny', 'xrl', et 'x0'." + +#: config.py:71 +msgid "" +"Determines whether the\n" +" shrink snarfer is enabled. This snarfer will watch for URLs in the\n" +" channel, and if they're sufficiently long (as determined by\n" +" supybot.plugins.ShrinkUrl.minimumLength) it will post a\n" +" smaller URL from either ln-s.net or tinyurl.com, as denoted in\n" +" supybot.plugins.ShrinkUrl.default." +msgstr "Détermine si le snarfer d'URL est activé. Ce remplaceur sera à l'écoute de toutes les URLs sur lle canal, et, si elle sont suffisamment longues (déterminé par supybot.plugins.ShrinkUrl.minimumLength) le bot postera une URL raccourcie avec ln-s.net ou tinyurl.com, comme défini par supybot.plugins.ShrinkUrl.default." + +#: config.py:78 +msgid "" +"Determines whether the snarfer will show the\n" +" domain of the URL being snarfed along with the shrunken URL." +msgstr "Détermine si le snarfer affichera le domaine de l'URL snarfée avec l'URL raccourcie." + +#: config.py:81 +msgid "" +"The minimum length a URL must be before\n" +" the bot will shrink it." +msgstr "La taille minimum d'une URL pour que le bot la raccourcice." + +#: config.py:84 +msgid "" +"Determines what URLs are to be snarfed; URLs\n" +" matching the regexp given will not be snarfed. Give the empty string if\n" +" you have no URLs that you'd like to exclude from being snarfed." +msgstr "Détermine quelles URLs seront snarfées ; les URLs correspondant à l'expression régulière ne seront par snarfées. Donnez une chaîne vide si il n'y a pas d'URL que vous voulez exclure." + +#: config.py:88 +msgid "" +"Determines whether the bot will shrink the\n" +" URLs of outgoing messages if those URLs are longer than\n" +" supybot.plugins.ShrinkUrl.minimumLength." +msgstr "Détermine si le bot raccourcira les URLs des messages sortant si ces URLs sont plus longues que supybot.plugins.ShrinkUrl.minimumLength." + +#: config.py:92 +msgid "" +"Determines what website the bot will use when\n" +" shrinking a URL." +msgstr "Détermine quel site web le bot utilisera pour raccourcir une URL" + +#: config.py:95 +msgid "" +"Determines whether this plugin will bold\n" +" certain portions of its replies." +msgstr "Détermine si ce plugin mettra en gras certaines portions de ses réponses." + +#: config.py:98 +msgid "" +"If set to a non-empty value, specifies the list of\n" +" services to rotate through for the shrinkSnarfer and outFilter." +msgstr "Si définit à une valeur non vide, définit la liste des services à faire tourner pour shrinkSnarfer et outFilter." + +#: plugin.py:169 +msgid "" +"\n" +"\n" +" Returns an ln-s.net version of .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne une version de ln-s.net de l'." + +#: plugin.py:194 +msgid "" +"\n" +"\n" +" Returns a TinyURL.com version of \n" +" " +msgstr "" +"\n" +"\n" +"Retourne une version de TinyURL.com de l'." + +#: plugin.py:222 +msgid "" +"\n" +"\n" +" Returns an xrl.us version of .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne une version de xrl.us de l'." + +#: plugin.py:248 +msgid "" +"\n" +"\n" +" Returns an x0.no version of .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne une version de x0.no de l'." + diff --git a/plugins/ShrinkUrl/messages.pot b/plugins/ShrinkUrl/messages.pot new file mode 100644 index 000000000..433b2cd45 --- /dev/null +++ b/plugins/ShrinkUrl/messages.pot @@ -0,0 +1,119 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-20 08:55+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:39 +msgid "" +"This plugin offers a snarfer that will go retrieve a shorter\n" +" version of long URLs that are sent to the channel. Would you\n" +" like this snarfer to be enabled?" +msgstr "" + +#: config.py:45 config.py:49 +#, docstring +msgid "Valid values include 'ln', 'tiny', 'xrl', and 'x0'." +msgstr "" + +#: config.py:71 +msgid "" +"Determines whether the\n" +" shrink snarfer is enabled. This snarfer will watch for URLs in the\n" +" channel, and if they're sufficiently long (as determined by\n" +" supybot.plugins.ShrinkUrl.minimumLength) it will post a\n" +" smaller URL from either ln-s.net or tinyurl.com, as denoted in\n" +" supybot.plugins.ShrinkUrl.default." +msgstr "" + +#: config.py:78 +msgid "" +"Determines whether the snarfer will show the\n" +" domain of the URL being snarfed along with the shrunken URL." +msgstr "" + +#: config.py:81 +msgid "" +"The minimum length a URL must be before\n" +" the bot will shrink it." +msgstr "" + +#: config.py:84 +msgid "" +"Determines what URLs are to be snarfed; URLs\n" +" matching the regexp given will not be snarfed. Give the empty string if\n" +" you have no URLs that you'd like to exclude from being snarfed." +msgstr "" + +#: config.py:88 +msgid "" +"Determines whether the bot will shrink the\n" +" URLs of outgoing messages if those URLs are longer than\n" +" supybot.plugins.ShrinkUrl.minimumLength." +msgstr "" + +#: config.py:92 +msgid "" +"Determines what website the bot will use when\n" +" shrinking a URL." +msgstr "" + +#: config.py:95 +msgid "" +"Determines whether this plugin will bold\n" +" certain portions of its replies." +msgstr "" + +#: config.py:98 +msgid "" +"If set to a non-empty value, specifies the list of\n" +" services to rotate through for the shrinkSnarfer and outFilter." +msgstr "" + +#: plugin.py:169 +#, docstring +msgid "" +"\n" +"\n" +" Returns an ln-s.net version of .\n" +" " +msgstr "" + +#: plugin.py:194 +#, docstring +msgid "" +"\n" +"\n" +" Returns a TinyURL.com version of \n" +" " +msgstr "" + +#: plugin.py:222 +#, docstring +msgid "" +"\n" +"\n" +" Returns an xrl.us version of .\n" +" " +msgstr "" + +#: plugin.py:248 +#, docstring +msgid "" +"\n" +"\n" +" Returns an x0.no version of .\n" +" " +msgstr "" + diff --git a/plugins/ShrinkUrl/plugin.py b/plugins/ShrinkUrl/plugin.py index d162c27dc..471400186 100644 --- a/plugins/ShrinkUrl/plugin.py +++ b/plugins/ShrinkUrl/plugin.py @@ -37,6 +37,8 @@ import supybot.ircmsgs as ircmsgs import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('ShrinkUrl') class CdbShrunkenUrlDB(object): def __init__(self, filename): @@ -162,6 +164,7 @@ class ShrinkUrl(callbacks.PluginRegexp): else: raise ShrinkError, text + @internationalizeDocstring def ln(self, irc, msg, args, url): """ @@ -186,6 +189,7 @@ class ShrinkUrl(callbacks.PluginRegexp): self.db.set('tiny', url, text) return text + @internationalizeDocstring def tiny(self, irc, msg, args, url): """ @@ -213,6 +217,7 @@ class ShrinkUrl(callbacks.PluginRegexp): self.db.set('xrl', quotedurl, text) return text + @internationalizeDocstring def xrl(self, irc, msg, args, url): """ @@ -238,6 +243,7 @@ class ShrinkUrl(callbacks.PluginRegexp): self.db.set('x0', url, text) return text + @internationalizeDocstring def x0(self, irc, msg, args, url): """ diff --git a/plugins/Status/config.py b/plugins/Status/config.py index 74d059b45..56cda1717 100644 --- a/plugins/Status/config.py +++ b/plugins/Status/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Status') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -41,13 +43,13 @@ def configure(advanced): Status = conf.registerPlugin('Status') conf.registerGroup(Status, 'cpu') conf.registerChannelValue(Status.cpu, 'children', - registry.Boolean(True, """Determines whether the cpu command will list the - time taken by children as well as the bot's process.""")) + registry.Boolean(True, _("""Determines whether the cpu command will list + the time taken by children as well as the bot's process."""))) conf.registerChannelValue(Status.cpu, 'threads', - registry.Boolean(False, """Determines whether the cpu command will provide - the number of threads spawned and active.""")) + registry.Boolean(False, _("""Determines whether the cpu command will + provide the number of threads spawned and active."""))) conf.registerChannelValue(Status.cpu, 'memory', - registry.Boolean(True, """Determines whether the cpu command will report - the amount of memory being used by the bot.""")) + registry.Boolean(True, _("""Determines whether the cpu command will report + the amount of memory being used by the bot."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Status/locale/fr.po b/plugins/Status/locale/fr.po new file mode 100644 index 000000000..6d79d98b0 --- /dev/null +++ b/plugins/Status/locale/fr.po @@ -0,0 +1,169 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-20 09:05+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:46 +msgid "" +"Determines whether the cpu command will list\n" +" the time taken by children as well as the bot's process." +msgstr "Détermine si la commande cpu listera le temps pris par les enfants aussi bien que celui du processus du bot." + +#: config.py:49 +msgid "" +"Determines whether the cpu command will\n" +" provide the number of threads spawned and active." +msgstr "Détermine si la commande cpu donnera le nombre de threads lancés et actifs." + +#: config.py:52 +msgid "" +"Determines whether the cpu command will report\n" +" the amount of memory being used by the bot." +msgstr "Détermine si la commande cpu donnera la quantité de mémoire utilisée par le bot." + +#: plugin.py:71 +msgid "" +"takes no arguments\n" +"\n" +" Returns the status of the bot.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne le status du bot." + +#: plugin.py:80 +msgid "%s as %L" +msgstr "%s en tant que %L" + +#: plugin.py:81 +msgid "I am connected to %L." +msgstr "Je suis connecté à %L" + +#: plugin.py:83 +msgid "I am currently in code profiling mode." +msgstr "Je suis actuellement en mode de profiling du code." + +#: plugin.py:89 +msgid "" +"takes no arguments\n" +"\n" +" Returns the current threads that are active.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne les threads actifs." + +#: plugin.py:95 +msgid "I have spawned %n; %n %b still currently active: %L." +msgstr "J'ai lancé %n ; %n %b encore actuellement en vie : %L." + +#: plugin.py:103 +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting network-related statistics.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne quelques statistiques intéressantes liées au réseau." + +#: plugin.py:111 +msgid "an indeterminate amount of time" +msgstr "une durée indéterminée" + +#: plugin.py:112 +msgid "I have received %s messages for a total of %s bytes. I have sent %s messages for a total of %s bytes. I have been connected to %s for %s." +msgstr "J'ai reçu %s message pour un total de %s octets. J'ai envoyé %s messages pour un total de %s octets. J'ai été connecté à %s pendant %s." + +#: plugin.py:121 +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting CPU-related statistics on the bot.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne quelques statistiques intéressantes reliées au CPU." + +#: plugin.py:131 +msgid "My children have taken %.2f seconds of user time and %.2f seconds of system time for a total of %.2f seconds of CPU time. " +msgstr "Mes enfants ont pris %.2f secondes du temps utilisateur et %.2f secondes du temps système, pour un total de %.2f secondes de temps CPU." + +#: plugin.py:138 +msgid "I have taken %.2f seconds of user time and %.2f seconds of system time, for a total of %.2f seconds of CPU time. %s" +msgstr "J'ai pris %.2f secondes du temps utilisateur et %.2f secondes du temps système, pour un total de %.2f secondes de temps CPU. %s" + +#: plugin.py:160 +msgid "Unable to run ps command." +msgstr "Impossible de lancer la commande ps." + +#: plugin.py:166 +msgid " I'm taking up %s kB of memory." +msgstr " Je prend plus de %s kO de mémoire." + +#: plugin.py:174 +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting command-related statistics.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne quelques statistiques intéressantes liées aux commandes." + +#: plugin.py:184 +msgid "I offer a total of %n in %n. I have processed %n." +msgstr "J'offre un total de %n dans %n plugins. J'ai géré %n." + +#: plugin.py:193 +msgid "" +"takes no arguments\n" +"\n" +" Returns a list of the commands offered by the bot.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne une liste des commandes offertes par le bot." + +#: plugin.py:207 +msgid "" +"takes no arguments\n" +"\n" +" Returns the amount of time the bot has been running.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne la durée durant laquelle le bot est lancée." + +#: plugin.py:211 +msgid "I have been running for %s." +msgstr "Je suis lancé depuis %s." + +#: plugin.py:218 +msgid "" +"takes no arguments\n" +"\n" +" Returns the server the bot is on.\n" +" " +msgstr "" +"ne prend pas d'argument\n" +"\n" +"Retourne le(s) serveur(s) sur le(s)quel(s) le bot est." + diff --git a/plugins/Status/messages.pot b/plugins/Status/messages.pot new file mode 100644 index 000000000..c186802a1 --- /dev/null +++ b/plugins/Status/messages.pot @@ -0,0 +1,155 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-20 09:05+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:46 +msgid "" +"Determines whether the cpu command will list\n" +" the time taken by children as well as the bot's process." +msgstr "" + +#: config.py:49 +msgid "" +"Determines whether the cpu command will\n" +" provide the number of threads spawned and active." +msgstr "" + +#: config.py:52 +msgid "" +"Determines whether the cpu command will report\n" +" the amount of memory being used by the bot." +msgstr "" + +#: plugin.py:71 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the status of the bot.\n" +" " +msgstr "" + +#: plugin.py:80 +msgid "%s as %L" +msgstr "" + +#: plugin.py:81 +msgid "I am connected to %L." +msgstr "" + +#: plugin.py:83 +msgid "I am currently in code profiling mode." +msgstr "" + +#: plugin.py:89 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the current threads that are active.\n" +" " +msgstr "" + +#: plugin.py:95 +msgid "I have spawned %n; %n %b still currently active: %L." +msgstr "" + +#: plugin.py:103 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting network-related statistics.\n" +" " +msgstr "" + +#: plugin.py:111 +msgid "an indeterminate amount of time" +msgstr "" + +#: plugin.py:112 +msgid "I have received %s messages for a total of %s bytes. I have sent %s messages for a total of %s bytes. I have been connected to %s for %s." +msgstr "" + +#: plugin.py:121 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting CPU-related statistics on the bot.\n" +" " +msgstr "" + +#: plugin.py:131 +msgid "My children have taken %.2f seconds of user time and %.2f seconds of system time for a total of %.2f seconds of CPU time. " +msgstr "" + +#: plugin.py:138 +msgid "I have taken %.2f seconds of user time and %.2f seconds of system time, for a total of %.2f seconds of CPU time. %s" +msgstr "" + +#: plugin.py:160 +msgid "Unable to run ps command." +msgstr "" + +#: plugin.py:166 +msgid " I'm taking up %s kB of memory." +msgstr "" + +#: plugin.py:174 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns some interesting command-related statistics.\n" +" " +msgstr "" + +#: plugin.py:184 +msgid "I offer a total of %n in %n. I have processed %n." +msgstr "" + +#: plugin.py:193 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns a list of the commands offered by the bot.\n" +" " +msgstr "" + +#: plugin.py:207 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the amount of time the bot has been running.\n" +" " +msgstr "" + +#: plugin.py:211 +msgid "I have been running for %s." +msgstr "" + +#: plugin.py:218 +#, docstring +msgid "" +"takes no arguments\n" +"\n" +" Returns the server the bot is on.\n" +" " +msgstr "" + diff --git a/plugins/Status/plugin.py b/plugins/Status/plugin.py index fccd58336..b7e814b58 100644 --- a/plugins/Status/plugin.py +++ b/plugins/Status/plugin.py @@ -39,6 +39,8 @@ import supybot.utils as utils import supybot.world as world from supybot.commands import * import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Status') class Status(callbacks.Plugin): def __init__(self, irc): @@ -64,6 +66,7 @@ class Status(callbacks.Plugin): def do001(self, irc, msg): self.connected[irc] = time.time() + @internationalizeDocstring def status(self, irc, msg, args): """takes no arguments @@ -74,13 +77,14 @@ class Status(callbacks.Plugin): networks.setdefault(Irc.network, []).append(Irc.nick) networks = networks.items() networks.sort() - networks = [format('%s as %L', net, nicks) for (net,nicks) in networks] - L = [format('I am connected to %L.', networks)] + networks = [format(_('%s as %L'), net, nicks) for (net,nicks) in networks] + L = [format(_('I am connected to %L.'), networks)] if world.profiling: - L.append('I am currently in code profiling mode.') + L.append(_('I am currently in code profiling mode.')) irc.reply(' '.join(L)) status = wrap(status) + @internationalizeDocstring def threads(self, irc, msg, args): """takes no arguments @@ -88,12 +92,13 @@ class Status(callbacks.Plugin): """ threads = [t.getName() for t in threading.enumerate()] threads.sort() - s = format('I have spawned %n; %n %b still currently active: %L.', + s = format(_('I have spawned %n; %n %b still currently active: %L.'), (world.threadsSpawned, 'thread'), (len(threads), 'thread'), len(threads), threads) irc.reply(s) threads = wrap(threads) + @internationalizeDocstring def net(self, irc, msg, args): """takes no arguments @@ -103,14 +108,15 @@ class Status(callbacks.Plugin): elapsed = time.time() - self.connected[irc.getRealIrc()] timeElapsed = utils.timeElapsed(elapsed) except KeyError: - timeElapsed = 'an indeterminate amount of time' - irc.reply('I have received %s messages for a total of %s bytes. ' - 'I have sent %s messages for a total of %s bytes. ' - 'I have been connected to %s for %s.' % - (self.recvdMsgs, self.recvdBytes, - self.sentMsgs, self.sentBytes, irc.server, timeElapsed)) + timeElapsed = _('an indeterminate amount of time') + irc.reply(format(_('I have received %s messages for a total of %S. ' + 'I have sent %s messages for a total of %S. ' + 'I have been connected to %s for %s.'), + self.recvdMsgs, self.recvdBytes, + self.sentMsgs, self.sentBytes, irc.server, timeElapsed)) net = wrap(net) + @internationalizeDocstring def cpu(self, irc, msg, args): """takes no arguments @@ -122,16 +128,16 @@ class Status(callbacks.Plugin): timeRunning = now - world.startedAt if self.registryValue('cpu.children', target) and \ user+system < timeRunning+1: # Fudge for FPU inaccuracies. - children = 'My children have taken %.2f seconds of user time ' \ - 'and %.2f seconds of system time ' \ - 'for a total of %.2f seconds of CPU time. ' % \ + children = _('My children have taken %.2f seconds of user time ' + 'and %.2f seconds of system time ' + 'for a total of %.2f seconds of CPU time. ') % \ (childUser, childSystem, childUser+childSystem) else: children = '' activeThreads = threading.activeCount() - response = 'I have taken %.2f seconds of user time and %.2f seconds ' \ - 'of system time, for a total of %.2f seconds of CPU ' \ - 'time. %s' % (user, system, user + system, children) + response = _('I have taken %.2f seconds of user time and %.2f seconds ' + 'of system time, for a total of %.2f seconds of CPU ' + 'time. %s') % (user, system, user + system, children) if self.registryValue('cpu.threads', target): response += format('I have spawned %n; I currently have %i still ' 'running.', @@ -151,18 +157,19 @@ class Status(callbacks.Plugin): stdout=subprocess.PIPE, stderr=subprocess.PIPE) except OSError: - irc.error('Unable to run ps command.', Raise=True) - (out, _) = inst.communicate() + irc.error(_('Unable to run ps command.'), Raise=True) + (out, foo) = inst.communicate() inst.wait() - mem = out.splitlines()[1] + mem = int(out.splitlines()[1]) elif sys.platform.startswith('netbsd'): - mem = '%s kB' % os.stat('/proc/%s/mem' % pid)[7] - response += ' I\'m taking up %s kB of memory.' % mem + mem = int(os.stat('/proc/%s/mem' % pid)[7]) + response += format(_(' I\'m taking up %S of memory.'), mem) except Exception: self.log.exception('Uncaught exception in cpu.memory:') irc.reply(utils.str.normalizeWhitespace(response)) cpu = wrap(cpu) + @internationalizeDocstring def cmd(self, irc, msg, args): """takes no arguments @@ -174,13 +181,14 @@ class Status(callbacks.Plugin): if isinstance(cb, callbacks.Plugin): callbacksPlugin += 1 commands += len(cb.listCommands()) - s = format('I offer a total of %n in %n. I have processed %n.', + s = format(_('I offer a total of %n in %n. I have processed %n.'), (commands, 'command'), (callbacksPlugin, 'command-based', 'plugin'), (world.commandsProcessed, 'command')) irc.reply(s) cmd = wrap(cmd) + @internationalizeDocstring def commands(self, irc, msg, args): """takes no arguments @@ -194,16 +202,18 @@ class Status(callbacks.Plugin): irc.reply(format('%L', sorted(commands))) commands = wrap(commands) + @internationalizeDocstring def uptime(self, irc, msg, args): """takes no arguments Returns the amount of time the bot has been running. """ - response = 'I have been running for %s.' % \ + response = _('I have been running for %s.') % \ utils.timeElapsed(time.time() - world.startedAt) irc.reply(response) uptime = wrap(uptime) + @internationalizeDocstring def server(self, irc, msg, args): """takes no arguments diff --git a/plugins/Status/test.py b/plugins/Status/test.py index 4843c4145..d6781dfab 100644 --- a/plugins/Status/test.py +++ b/plugins/Status/test.py @@ -44,7 +44,8 @@ class StatusTestCase(PluginTestCase): self.failIf('None' in m.args[1], 'None in cpu output: %r.' % m) for s in ['linux', 'freebsd', 'openbsd', 'netbsd', 'darwin']: if sys.platform.startswith(s): - self.failUnless('kB' in m.args[1], + self.failUnless('B' in m.args[1] or 'KB' in m.args[1] or + 'MB' in m.args[1], 'No memory string on supported platform.') try: original = conf.supybot.plugins.Status.cpu.get('children')() diff --git a/plugins/String/config.py b/plugins/String/config.py index e4f1840ad..d451b6a9e 100644 --- a/plugins/String/config.py +++ b/plugins/String/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('String') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,13 +44,13 @@ def configure(advanced): String = conf.registerPlugin('String') conf.registerGroup(String, 'levenshtein') conf.registerGlobalValue(String.levenshtein, 'max', - registry.PositiveInteger(256, """Determines the maximum size of a string + registry.PositiveInteger(256, _("""Determines the maximum size of a string given to the levenshtein command. The levenshtein command uses an O(m*n) algorithm, which means that with strings of length 256, it can take 1.5 seconds to finish; with strings of length 384, though, it can take 4 seconds to finish, and with strings of much larger lengths, it takes more and more time. Using nested commands, strings can get quite large, hence this variable, to limit the size of arguments passed to the levenshtein - command.""")) + command."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/String/locale/fr.po b/plugins/String/locale/fr.po new file mode 100644 index 000000000..6e57e5625 --- /dev/null +++ b/plugins/String/locale/fr.po @@ -0,0 +1,189 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-20 09:08+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:47 +msgid "" +"Determines the maximum size of a string\n" +" given to the levenshtein command. The levenshtein command uses an O(m*n)\n" +" algorithm, which means that with strings of length 256, it can take 1.5\n" +" seconds to finish; with strings of length 384, though, it can take 4\n" +" seconds to finish, and with strings of much larger lengths, it takes more\n" +" and more time. Using nested commands, strings can get quite large, hence\n" +" this variable, to limit the size of arguments passed to the levenshtein\n" +" command." +msgstr "Détermine la taille maximum d'une chaîne donnée à la commande 'levenshtein'. Cette commande utiliser un algorithme O(m*n), ce qui signifie que pour une chaîne de taille 256, il peut prendre 1,5 seconde à se finir ; pour les chaînes de taille 384, il peut en prendre 4, et ainsi de suite. En utilisant des commandes inmbriquées, les chaînes peuvent devenir très grandes, donc, utilisez cette variable pour limiter la taille des arguments passés à la commande 'levenshtein'." + +#: plugin.py:46 +msgid "" +"\n" +"\n" +" Returns the 8-bit value of .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne la valeur 8 bits de la ." + +#: plugin.py:55 +msgid "" +"\n" +"\n" +" Returns the character associated with the 8-bit value \n" +" " +msgstr "" +"\n" +"\n" +"Retourne le caractère associé à la valeur 8-bits du " + +#: plugin.py:62 +msgid "That number doesn't map to an 8-bit character." +msgstr "Ce nombre ne correspond pas à un caractère 8 bits." + +#: plugin.py:67 +msgid "" +" \n" +"\n" +" Returns an encoded form of the given text; the valid encodings are\n" +" available in the documentation of the Python codecs module:\n" +" .\n" +" " +msgstr "" +" \n" +"\n" +"Retourne la forme encodée du texte donnée ; les encodages valides sont disponibles dans la documentation du module codec de Python : http://docs.python.org/library/codecs.html#standard-encodings" + +#: plugin.py:76 +#: plugin.py:90 +msgid "encoding" +msgstr "encodage" + +#: plugin.py:81 +msgid "" +" \n" +"\n" +" Returns an un-encoded form of the given text; the valid encodings are\n" +" available in the documentation of the Python codecs module:\n" +" .\n" +" " +msgstr "" +" \n" +"\n" +"Retourne la forme désencodée du texte donnée ; les encodages valides sont disponibles dans la documentation du module codec de Python : http://docs.python.org/library/codecs.html#standard-encodings" + +#: plugin.py:92 +msgid "base64 string" +msgstr "chaîne base64" + +#: plugin.py:93 +msgid "Base64 strings must be a multiple of 4 in length, padded with '=' if necessary." +msgstr "Les chaînes base64 doivent avoir une longueur multiple de 4, entourées de '=' si nécessaire." + +#: plugin.py:99 +msgid "" +" \n" +"\n" +" Returns the levenshtein distance (also known as the \"edit distance\"\n" +" between and )\n" +" " +msgstr "" +" \n" +"\n" +"Retourne la distance leveshtein (aussi connue sous le nom de \"distance d'édition) entre les deux chaînes." + +#: plugin.py:106 +msgid "Levenshtein distance is a complicated algorithm, try it with some smaller inputs." +msgstr "La distance levenshtein est un algorithme compliqué ; essayez avec des données plus petites." + +#: plugin.py:114 +msgid "" +" []\n" +"\n" +" Returns the Soundex hash to a given length. The length defaults to\n" +" 4, since that's the standard length for a soundex hash. For unlimited\n" +" length, use 0.\n" +" " +msgstr "" +" []\n" +"\n" +"Retourne un hash Soundex de la longueur donnée. La longueur par défaut est de 4, c'est le standard pour un hash soundex. Pour une longueur illimitée, utilisez 0." + +#: plugin.py:125 +msgid "" +"\n" +"\n" +" Returns the length of .\n" +" " +msgstr "" +"\n" +"\n" +"Retourne la longueur du \n" + +#: plugin.py:134 +msgid "" +" \n" +"\n" +" If is of the form m/regexp/flags, returns the portion of\n" +" that matches the regexp. If is of the form\n" +" s/regexp/replacement/flags, returns the result of applying such a\n" +" regexp to .\n" +" " +msgstr "" +" \n" +"\n" +"Si l' est de la forme de m/regexp/flags, retourne la portion du correspondant à l'expression régulière. Si l' est de la forme de s/regexp/remplacement/flags, retourne le résultat de l'application de l'expression régulière sur le ." + +#: plugin.py:146 +msgid "You probably don't want to match the empty string." +msgstr "Vous ne voulez probablement appliquer une expression régulière sur une chaîne vide." + +#: plugin.py:156 +msgid "" +" \n" +"\n" +" Returns XOR-encrypted with . See\n" +" http://www.yoe.org/developer/xor.html for information about XOR\n" +" encryption.\n" +" " +msgstr "" +" \n" +"\n" +"Retourne le , encrypté par la méthode XOR avec le . Lisez http://www.yoe.org/developer/xor.html pour plus d'informations sur le cryptage XOR." + +#: plugin.py:169 +msgid "" +"\n" +"\n" +" Returns the md5 hash of a given string. Read\n" +" http://www.rsasecurity.com/rsalabs/faq/3-6-6.html for more information\n" +" about md5.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le hash md5 de la chaîne donnée. Lisez http://www.rsasecurity.com/rsalabs/faq/3-6-6.html pour plus d'informations à propos de md5." + +#: plugin.py:180 +msgid "" +"\n" +"\n" +" Returns the SHA hash of a given string. Read\n" +" http://www.secure-hash-algorithm-md5-sha-1.co.uk/ for more information\n" +" about SHA.\n" +" " +msgstr "" +"\n" +"\n" +"Retourne le hash SDA de la chaîne donnée. Lisez http://www.secure-hash-algorithm-md5-sha-1.co.uk/ pour plus d'informations à propos de SHA." + diff --git a/plugins/String/messages.pot b/plugins/String/messages.pot new file mode 100644 index 000000000..1d593ab4b --- /dev/null +++ b/plugins/String/messages.pot @@ -0,0 +1,168 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-20 09:08+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:47 +msgid "" +"Determines the maximum size of a string\n" +" given to the levenshtein command. The levenshtein command uses an O(m*n)\n" +" algorithm, which means that with strings of length 256, it can take 1.5\n" +" seconds to finish; with strings of length 384, though, it can take 4\n" +" seconds to finish, and with strings of much larger lengths, it takes more\n" +" and more time. Using nested commands, strings can get quite large, hence\n" +" this variable, to limit the size of arguments passed to the levenshtein\n" +" command." +msgstr "" + +#: plugin.py:46 +#, docstring +msgid "" +"\n" +"\n" +" Returns the 8-bit value of .\n" +" " +msgstr "" + +#: plugin.py:55 +#, docstring +msgid "" +"\n" +"\n" +" Returns the character associated with the 8-bit value \n" +" " +msgstr "" + +#: plugin.py:62 +msgid "That number doesn't map to an 8-bit character." +msgstr "" + +#: plugin.py:67 +#, docstring +msgid "" +" \n" +"\n" +" Returns an encoded form of the given text; the valid encodings are\n" +" available in the documentation of the Python codecs module:\n" +" .\n" +" " +msgstr "" + +#: plugin.py:76 plugin.py:90 +msgid "encoding" +msgstr "" + +#: plugin.py:81 +#, docstring +msgid "" +" \n" +"\n" +" Returns an un-encoded form of the given text; the valid encodings are\n" +" available in the documentation of the Python codecs module:\n" +" .\n" +" " +msgstr "" + +#: plugin.py:92 +msgid "base64 string" +msgstr "" + +#: plugin.py:93 +msgid "Base64 strings must be a multiple of 4 in length, padded with '=' if necessary." +msgstr "" + +#: plugin.py:99 +#, docstring +msgid "" +" \n" +"\n" +" Returns the levenshtein distance (also known as the \"edit distance\"\n" +" between and )\n" +" " +msgstr "" + +#: plugin.py:106 +msgid "Levenshtein distance is a complicated algorithm, try it with some smaller inputs." +msgstr "" + +#: plugin.py:114 +#, docstring +msgid "" +" []\n" +"\n" +" Returns the Soundex hash to a given length. The length defaults to\n" +" 4, since that's the standard length for a soundex hash. For unlimited\n" +" length, use 0.\n" +" " +msgstr "" + +#: plugin.py:125 +#, docstring +msgid "" +"\n" +"\n" +" Returns the length of .\n" +" " +msgstr "" + +#: plugin.py:134 +#, docstring +msgid "" +" \n" +"\n" +" If is of the form m/regexp/flags, returns the portion of\n" +" that matches the regexp. If is of the form\n" +" s/regexp/replacement/flags, returns the result of applying such a\n" +" regexp to .\n" +" " +msgstr "" + +#: plugin.py:146 +msgid "You probably don't want to match the empty string." +msgstr "" + +#: plugin.py:156 +#, docstring +msgid "" +" \n" +"\n" +" Returns XOR-encrypted with . See\n" +" http://www.yoe.org/developer/xor.html for information about XOR\n" +" encryption.\n" +" " +msgstr "" + +#: plugin.py:169 +#, docstring +msgid "" +"\n" +"\n" +" Returns the md5 hash of a given string. Read\n" +" http://www.rsasecurity.com/rsalabs/faq/3-6-6.html for more information\n" +" about md5.\n" +" " +msgstr "" + +#: plugin.py:180 +#, docstring +msgid "" +"\n" +"\n" +" Returns the SHA hash of a given string. Read\n" +" http://www.secure-hash-algorithm-md5-sha-1.co.uk/ for more information\n" +" about SHA.\n" +" " +msgstr "" + diff --git a/plugins/String/plugin.py b/plugins/String/plugin.py index d6b4c0dbe..6d0073529 100644 --- a/plugins/String/plugin.py +++ b/plugins/String/plugin.py @@ -36,9 +36,12 @@ from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('String') class String(callbacks.Plugin): + @internationalizeDocstring def ord(self, irc, msg, args, letter): """ @@ -47,6 +50,7 @@ class String(callbacks.Plugin): irc.reply(str(ord(letter))) ord = wrap(ord, ['letter']) + @internationalizeDocstring def chr(self, irc, msg, args, i): """ @@ -55,9 +59,10 @@ class String(callbacks.Plugin): try: irc.reply(chr(i)) except ValueError: - irc.error('That number doesn\'t map to an 8-bit character.') + irc.error(_('That number doesn\'t map to an 8-bit character.')) chr = wrap(chr, ['int']) + @internationalizeDocstring def encode(self, irc, msg, args, encoding, text): """ @@ -68,9 +73,10 @@ class String(callbacks.Plugin): try: irc.reply(text.encode(encoding).rstrip('\n')) except LookupError: - irc.errorInvalid('encoding', encoding) + irc.errorInvalid(_('encoding'), encoding) encode = wrap(encode, ['something', 'text']) + @internationalizeDocstring def decode(self, irc, msg, args, encoding, text): """ @@ -81,13 +87,14 @@ class String(callbacks.Plugin): try: irc.reply(text.decode(encoding).encode('utf-8')) except LookupError: - irc.errorInvalid('encoding', encoding) + irc.errorInvalid(_('encoding'), encoding) except binascii.Error: - irc.errorInvalid('base64 string', - s='Base64 strings must be a multiple of 4 in ' - 'length, padded with \'=\' if necessary.') + irc.errorInvalid(_('base64 string'), + s=_('Base64 strings must be a multiple of 4 in ' + 'length, padded with \'=\' if necessary.')) decode = wrap(decode, ['something', 'text']) + @internationalizeDocstring def levenshtein(self, irc, msg, args, s1, s2): """ @@ -96,12 +103,13 @@ class String(callbacks.Plugin): """ max = self.registryValue('levenshtein.max') if len(s1) > max or len(s2) > max: - irc.error('Levenshtein distance is a complicated algorithm, try ' - 'it with some smaller inputs.') + irc.error(_('Levenshtein distance is a complicated algorithm, try ' + 'it with some smaller inputs.')) else: irc.reply(str(utils.str.distance(s1, s2))) levenshtein = wrap(levenshtein, ['something', 'text']) + @internationalizeDocstring def soundex(self, irc, msg, args, text, length): """ [] @@ -112,6 +120,7 @@ class String(callbacks.Plugin): irc.reply(utils.str.soundex(text, length)) soundex = wrap(soundex, ['somethingWithoutSpaces', additional('int', 4)]) + @internationalizeDocstring def len(self, irc, msg, args, text): """ @@ -120,6 +129,7 @@ class String(callbacks.Plugin): irc.reply(str(len(text))) len = wrap(len, ['text']) + @internationalizeDocstring def re(self, irc, msg, args, ff, text): """ @@ -133,7 +143,7 @@ class String(callbacks.Plugin): else: f = lambda s: ff.search(s) and ff.search(s).group(0) or '' if f('') and len(f(' ')) > len(f(''))+1: # Matches the empty string. - s = 'You probably don\'t want to match the empty string.' + s = _('You probably don\'t want to match the empty string.') irc.error(s) else: irc.reply(f(text)) @@ -141,6 +151,7 @@ class String(callbacks.Plugin): first('regexpMatcher', 'regexpReplacer'), 'text']) + @internationalizeDocstring def xor(self, irc, msg, args, password, text): """ @@ -153,6 +164,7 @@ class String(callbacks.Plugin): irc.reply(''.join(ret)) xor = wrap(xor, ['something', 'text']) + @internationalizeDocstring def md5(self, irc, msg, args, text): """ @@ -163,6 +175,7 @@ class String(callbacks.Plugin): irc.reply(utils.crypt.md5(text).hexdigest()) md5 = wrap(md5, ['text']) + @internationalizeDocstring def sha(self, irc, msg, args, text): """ diff --git a/plugins/Success/config.py b/plugins/Success/config.py index 8a0cabb4f..72ddf49e3 100644 --- a/plugins/Success/config.py +++ b/plugins/Success/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Success') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -42,10 +44,10 @@ def configure(advanced): Success = conf.registerPlugin('Success') # This is where your configuration variables (if any) should go. For example: # conf.registerGlobalValue(Success, 'someConfigVariableName', -# registry.Boolean(False, """Help for someConfigVariableName.""")) +# registry.Boolean(False, _("""Help for someConfigVariableName."""))) conf.registerChannelValue(conf.supybot.plugins.Success, 'prefixNick', - registry.Boolean(True, """Determines whether the bot will prefix the nick - of the user giving an invalid command to the success response.""")) + registry.Boolean(True, _("""Determines whether the bot will prefix the nick + of the user giving an invalid command to the success response."""))) # vim:set shiftwidth=4 softtabstop=8 expandtab textwidth=78 diff --git a/plugins/Success/locale/fr.po b/plugins/Success/locale/fr.po new file mode 100644 index 000000000..94218851c --- /dev/null +++ b/plugins/Success/locale/fr.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-10-20 09:09+CEST\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:49 +msgid "" +"Determines whether the bot will prefix the nick\n" +" of the user giving an invalid command to the success response." +msgstr "Détermine si le bot utilisera le nick de l'utilisateur donnant une commande invalide comme préfixe pour la réponse de Success." + +#: plugin.py:39 +msgid "" +"This plugin was written initially to work with MoobotFactoids, the two\n" +" of them to provide a similar-to-moobot-and-blootbot interface for factoids.\n" +" Basically, it replaces the standard 'The operation succeeded.' messages\n" +" with messages kept in a database, able to give more personable\n" +" responses." +msgstr "Ce plugin était à l'origine écrit pour fonctionner avec MoobotFactoids, qui fournit une interface similaire à celle de moobot et blootbot pour les factoids. Il remplacement le message 'the operation succeeded.' par un message stoché dans la base de données, ce qui vous permet d'en avoir un plus personnalisable." + diff --git a/plugins/Success/messages.pot b/plugins/Success/messages.pot new file mode 100644 index 000000000..361535e0e --- /dev/null +++ b/plugins/Success/messages.pot @@ -0,0 +1,33 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2010-10-20 09:09+CEST\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: config.py:49 +msgid "" +"Determines whether the bot will prefix the nick\n" +" of the user giving an invalid command to the success response." +msgstr "" + +#: plugin.py:39 +#, docstring +msgid "" +"This plugin was written initially to work with MoobotFactoids, the two\n" +" of them to provide a similar-to-moobot-and-blootbot interface for factoids.\n" +" Basically, it replaces the standard 'The operation succeeded.' messages\n" +" with messages kept in a database, able to give more personable\n" +" responses." +msgstr "" + diff --git a/plugins/Success/plugin.py b/plugins/Success/plugin.py index ec6adbcf0..2067434bb 100644 --- a/plugins/Success/plugin.py +++ b/plugins/Success/plugin.py @@ -31,6 +31,8 @@ import supybot.conf as conf from supybot.commands import * import supybot.plugins as plugins import supybot.ircutils as ircutils +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Success') class Success(plugins.ChannelIdDatabasePlugin): """This plugin was written initially to work with MoobotFactoids, the two @@ -73,7 +75,7 @@ class Success(plugins.ChannelIdDatabasePlugin): # so this seems like the only way to do it. self.target = msg.args[0] return msg - +Success = internationalizeDocstring(Success) Class = Success diff --git a/plugins/Time/__init__.py b/plugins/Time/__init__.py index f74a9b4a2..6cf97ccd7 100644 --- a/plugins/Time/__init__.py +++ b/plugins/Time/__init__.py @@ -42,7 +42,9 @@ __author__ = supybot.authors.jemfinch # This is a dictionary mapping supybot.Author instances to lists of # contributions. -__contributors__ = {} +__contributors__ = {'tztime': supybot.Author('Valentin Lorentz', 'ProgVal', + 'progval@gmail.com')} + import config import plugin diff --git a/plugins/Time/config.py b/plugins/Time/config.py index 6317c41cc..cb56cf3b5 100644 --- a/plugins/Time/config.py +++ b/plugins/Time/config.py @@ -29,6 +29,8 @@ import supybot.conf as conf import supybot.registry as registry +from supybot.i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization('Time') def configure(advanced): # This will be called by supybot to configure this module. advanced is @@ -40,10 +42,10 @@ def configure(advanced): Time = conf.registerPlugin('Time') conf.registerChannelValue(Time, 'format', - registry.String(str(conf.supybot.reply.format.time()), """Determines the + registry.String(str(conf.supybot.reply.format.time()), _("""Determines the format string for timestamps. Refer to the Python documentation for the time module to see what formats are accepted. If you set this variable to - the empty string, the timestamp will not be shown.""")) + the empty string, the timestamp will not be shown."""))) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/plugins/Time/locale/fr.po b/plugins/Time/locale/fr.po new file mode 100644 index 000000000..e2c10e807 --- /dev/null +++ b/plugins/Time/locale/fr.po @@ -0,0 +1,130 @@ +msgid "" +msgstr "" +"Project-Id-Version: Supybot-fr\n" +"POT-Creation-Date: 2010-11-17 09:46+CET\n" +"PO-Revision-Date: \n" +"Last-Translator: Valentin Lorentz \n" +"Language-Team: Supybot-fr \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Français\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: ASCII\n" + +#: config.py:45 +msgid "" +"Determines the\n" +" format string for timestamps. Refer to the Python documentation for the\n" +" time module to see what formats are accepted. If you set this variable to\n" +" the empty string, the timestamp will not be shown." +msgstr "Détermine la chaîne de format pour les timestamps. Référez-vous à la documentation du module Python time pour voir quels formats sont acceptés. Si vous définissez cette variable à une chaîne vide, le timestamp ne sera pas affiché." + +#: plugin.py:61 +msgid "" +"[y] [w] [d] [h] [m] [s]\n" +"\n" +" Returns the number of seconds in the number of , ,\n" +" , , , and given. An example usage is\n" +" \"seconds 2h 30m\", which would return 9000, which is '3600*2 + 30*60'.\n" +" Useful for scheduling events at a given number of seconds in the\n" +" future.\n" +" " +msgstr "" +"[y] [w] [d] [h] [m] [s]\n" +"\n" +"Retourne le nombre de secondes de la date donnée. Un exemple d'utilisation est \"seconds 2h 30m\", ce qui retournera 9000. Utile pour planifier des évènement à un certain nombre de secondes dans le futur." + +#: plugin.py:96 +msgid "" +"