Merge branch 'testing' into unit-tests

Conflicts:
	src/utils/str.py
This commit is contained in:
Valentin Lorentz 2011-01-22 10:29:22 +01:00
commit 17248b5d2c
246 changed files with 21282 additions and 1338 deletions

3
.gitignore vendored
View File

@ -6,3 +6,6 @@ test-logs
*.pyc *.pyc
docs/_build docs/_build
docs/plugins docs/plugins
*.swp
*.swo
*~

0
locale/__init__.py Normal file
View File

1043
locale/fr.po Normal file

File diff suppressed because it is too large Load Diff

100
locale/fr.py Normal file
View File

@ -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'

1042
locale/messages.pot Normal file

File diff suppressed because it is too large Load Diff

View File

@ -30,6 +30,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Admin')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is

202
plugins/Admin/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: ProgVal <progval@gmail.com>\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 ""
"<channel> [<key>]\n"
"\n"
" Tell the bot to join the given channel. If <key> is given, it is used\n"
" when attempting to join the channel.\n"
" "
msgstr ""
"<canal> [<clef>]\n"
"\n"
"Dit au bot de rejoindre le canal donné. Si la <clef> 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 ""
"[<nick>]\n"
"\n"
" Changes the bot's nick to <nick>. If no nick is given, returns the\n"
" bot's current nick.\n"
" "
msgstr ""
"[<nick>]\n"
"\n"
"Change le nick du bot à <nick>. Si aucun nick n'est donné, retourne le nick actuel du bot."
#: plugin.py:222
msgid ""
"[<channel>] [<reason>]\n"
"\n"
" Tells the bot to part the list of channels you give it. <channel> is\n"
" only necessary if you want the bot to part a channel other than the\n"
" current channel. If <reason> is specified, use it as the part\n"
" message.\n"
" "
msgstr ""
"[<canal>] [<raison>]\n"
"\n"
"Dit au bot de partir de la liste de canaux que vous avez donnée. <canal> n'est nécessaire que si vous voulez que le bot parte d'un autre canal que l'actuel. Si la <raison> 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 ""
"<name|hostmask> <capability>\n"
"\n"
" Gives the user specified by <name> (or the user to whom <hostmask>\n"
" currently maps) the specified capability <capability>\n"
" "
msgstr ""
"<nom|masque d'hôte> <capacité>\n"
"\n"
"Donne la <capacité> à l'utilisateur spécifié par <nom> (ou l'utilisateur à qui correspond <masque d'hôte>)."
#: 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 ""
"<name|hostmask> <capability>\n"
"\n"
" Takes from the user specified by <name> (or the user to whom\n"
" <hostmask> currently maps) the specified capability <capability>\n"
" "
msgstr ""
"<nom|masque d'hôte> <capacité>\n"
"\n"
"Retire la <capacité> à l'utilisateur spécifié par le <nom> (ou celui à qui correspond le <masque d'hôte>)."
#: 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 ""
"<hostmask|nick> [<expires>]\n"
"\n"
" This will set a persistent ignore on <hostmask> or the hostmask\n"
" currently associated with <nick>. <expires> 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 ""
"<masque d'hôte|nick> [<expiration>]\n"
"\n"
"Ajoute un masque d'ignorance persistant sur le <masque d'hôte>, ou sur le masque d'hôte de <nick>. <expiration> 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 ""
"<hostmask|nick>\n"
"\n"
" This will remove the persistent ignore on <hostmask> or the\n"
" hostmask currently associated with <nick>.\n"
" "
msgstr ""
"<masque d'hôte|nick>\n"
"\n"
"Ceci retirera le masque d'ignorance persistant sur le <masque d'hôte>, ou sur le masque d'hôte associé au <nick>."
#: 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."

187
plugins/Admin/messages.pot Normal file
View File

@ -0,0 +1,187 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<channel> [<key>]\n"
"\n"
" Tell the bot to join the given channel. If <key> 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 ""
"[<nick>]\n"
"\n"
" Changes the bot's nick to <nick>. If no nick is given, returns the\n"
" bot's current nick.\n"
" "
msgstr ""
#: plugin.py:222
#, docstring
msgid ""
"[<channel>] [<reason>]\n"
"\n"
" Tells the bot to part the list of channels you give it. <channel> is\n"
" only necessary if you want the bot to part a channel other than the\n"
" current channel. If <reason> 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 ""
"<name|hostmask> <capability>\n"
"\n"
" Gives the user specified by <name> (or the user to whom <hostmask>\n"
" currently maps) the specified capability <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 ""
"<name|hostmask> <capability>\n"
"\n"
" Takes from the user specified by <name> (or the user to whom\n"
" <hostmask> currently maps) the specified capability <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 ""
"<hostmask|nick> [<expires>]\n"
"\n"
" This will set a persistent ignore on <hostmask> or the hostmask\n"
" currently associated with <nick>. <expires> 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 ""
"<hostmask|nick>\n"
"\n"
" This will remove the persistent ignore on <hostmask> or the\n"
" hostmask currently associated with <nick>.\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 ""

View File

@ -1,5 +1,6 @@
### ###
# Copyright (c) 2002-2005, Jeremiah Fincher # Copyright (c) 2002-2005, Jeremiah Fincher
# Copyright (c) 2010, Valentin Lorentz
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # 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.ircutils as ircutils
import supybot.schedule as schedule import supybot.schedule as schedule
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Admin')
class Admin(callbacks.Plugin): class Admin(callbacks.Plugin):
def __init__(self, irc): def __init__(self, irc):
@ -46,6 +49,7 @@ class Admin(callbacks.Plugin):
self.joins = {} self.joins = {}
self.pendingNickChanges = {} self.pendingNickChanges = {}
@internationalizeDocstring
def do437(self, irc, msg): def do437(self, irc, msg):
"""Nick/channel temporarily unavailable.""" """Nick/channel temporarily unavailable."""
target = msg.args[0] target = msg.args[0]
@ -65,7 +69,7 @@ class Admin(callbacks.Plugin):
try: try:
channel = msg.args[1] channel = msg.args[1]
(irc, msg) = self.joins.pop(channel) (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: except KeyError:
self.log.debug('Got 471 without Admin.join being called.') self.log.debug('Got 471 without Admin.join being called.')
@ -73,7 +77,7 @@ class Admin(callbacks.Plugin):
try: try:
channel = msg.args[1] channel = msg.args[1]
(irc, msg) = self.joins.pop(channel) (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: except KeyError:
self.log.debug('Got 473 without Admin.join being called.') self.log.debug('Got 473 without Admin.join being called.')
@ -81,7 +85,7 @@ class Admin(callbacks.Plugin):
try: try:
channel = msg.args[1] channel = msg.args[1]
(irc, msg) = self.joins.pop(channel) (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: except KeyError:
self.log.debug('Got 474 without Admin.join being called.') self.log.debug('Got 474 without Admin.join being called.')
@ -89,7 +93,7 @@ class Admin(callbacks.Plugin):
try: try:
channel = msg.args[1] channel = msg.args[1]
(irc, msg) = self.joins.pop(channel) (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: except KeyError:
self.log.debug('Got 475 without Admin.join being called.') self.log.debug('Got 475 without Admin.join being called.')
@ -97,8 +101,8 @@ class Admin(callbacks.Plugin):
try: try:
channel = msg.args[1] channel = msg.args[1]
(irc, msg) = self.joins.pop(channel) (irc, msg) = self.joins.pop(channel)
irc.error('Cannot join %s, I\'m not identified with the NickServ.' irc.error(_('Cannot join %s, I\'m not identified with the '
% channel) 'NickServ.') % channel)
except KeyError: except KeyError:
self.log.debug('Got 515 without Admin.join being called.') self.log.debug('Got 515 without Admin.join being called.')
@ -125,6 +129,7 @@ class Admin(callbacks.Plugin):
'the user lacked the "admin" capability.', 'the user lacked the "admin" capability.',
channel, msg.prefix) channel, msg.prefix)
@internationalizeDocstring
def join(self, irc, msg, args, channel, key): def join(self, irc, msg, args, channel, key):
"""<channel> [<key>] """<channel> [<key>]
@ -139,13 +144,14 @@ class Admin(callbacks.Plugin):
networkGroup.channels.key.get(channel).setValue(key) networkGroup.channels.key.get(channel).setValue(key)
maxchannels = irc.state.supported.get('maxchannels', sys.maxint) maxchannels = irc.state.supported.get('maxchannels', sys.maxint)
if len(irc.state.channels) + 1 > maxchannels: if len(irc.state.channels) + 1 > maxchannels:
irc.error('I\'m already too close to maximum number of ' irc.error(_('I\'m already too close to maximum number of '
'channels for this network.', Raise=True) 'channels for this network.'), Raise=True)
irc.queueMsg(networkGroup.channels.join(channel)) irc.queueMsg(networkGroup.channels.join(channel))
irc.noReply() irc.noReply()
self.joins[channel] = (irc, msg) self.joins[channel] = (irc, msg)
join = wrap(join, ['validChannel', additional('something')]) join = wrap(join, ['validChannel', additional('something')])
@internationalizeDocstring
def channels(self, irc, msg, args): def channels(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -157,34 +163,34 @@ class Admin(callbacks.Plugin):
utils.sortBy(ircutils.toLower, L) utils.sortBy(ircutils.toLower, L)
irc.reply(format('%L', L)) irc.reply(format('%L', L))
else: else:
irc.reply('I\'m not currently in any channels.') irc.reply(_('I\'m not currently in any channels.'))
channels = wrap(channels, ['private']) channels = wrap(channels, ['private'])
def do484(self, irc, msg): def do484(self, irc, msg):
irc = self.pendingNickChanges.get(irc, None) irc = self.pendingNickChanges.get(irc, None)
if irc is not 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: else:
self.log.debug('Got 484 without Admin.nick being called.') self.log.debug('Got 484 without Admin.nick being called.')
def do433(self, irc, msg): def do433(self, irc, msg):
irc = self.pendingNickChanges.get(irc, None) irc = self.pendingNickChanges.get(irc, None)
if irc is not 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: else:
self.log.debug('Got 433 without Admin.nick being called.') self.log.debug('Got 433 without Admin.nick being called.')
def do435(self, irc, msg): def do435(self, irc, msg):
irc = self.pendingNickChanges.get(irc, None) irc = self.pendingNickChanges.get(irc, None)
if irc is not None: if irc is not None:
irc.error('That nick is currently banned.') irc.error(_('That nick is currently banned.'))
else: else:
self.log.debug('Got 435 without Admin.nick being called.') self.log.debug('Got 435 without Admin.nick being called.')
def do438(self, irc, msg): def do438(self, irc, msg):
irc = self.pendingNickChanges.get(irc, None) irc = self.pendingNickChanges.get(irc, None)
if irc is not 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) msg.args[2]), private=True)
else: else:
self.log.debug('Got 438 without Admin.nick being called.') self.log.debug('Got 438 without Admin.nick being called.')
@ -196,6 +202,7 @@ class Admin(callbacks.Plugin):
except KeyError: except KeyError:
self.log.debug('Got NICK without Admin.nick being called.') self.log.debug('Got NICK without Admin.nick being called.')
@internationalizeDocstring
def nick(self, irc, msg, args, nick): def nick(self, irc, msg, args, nick):
"""[<nick>] """[<nick>]
@ -210,6 +217,7 @@ class Admin(callbacks.Plugin):
irc.reply(irc.nick) irc.reply(irc.nick)
nick = wrap(nick, [additional('nick')]) nick = wrap(nick, [additional('nick')])
@internationalizeDocstring
def part(self, irc, msg, args, channel, reason): def part(self, irc, msg, args, channel, reason):
"""[<channel>] [<reason>] """[<channel>] [<reason>]
@ -229,7 +237,7 @@ class Admin(callbacks.Plugin):
except KeyError: except KeyError:
pass pass
if channel not in irc.state.channels: 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)) irc.queueMsg(ircmsgs.part(channel, reason or msg.nick))
if msg.nick in irc.state.channels[channel].users: if msg.nick in irc.state.channels[channel].users:
irc.noReply() irc.noReply()
@ -239,6 +247,7 @@ class Admin(callbacks.Plugin):
class capability(callbacks.Commands): class capability(callbacks.Commands):
@internationalizeDocstring
def add(self, irc, msg, args, user, capability): def add(self, irc, msg, args, user, capability):
"""<name|hostmask> <capability> """<name|hostmask> <capability>
@ -260,10 +269,10 @@ class Admin(callbacks.Plugin):
# will depend on supybot.capabilities and its child default) but # will depend on supybot.capabilities and its child default) but
# generally means they can't mess with channel capabilities. # generally means they can't mess with channel capabilities.
if ircutils.strEqual(capability, 'owner'): if ircutils.strEqual(capability, 'owner'):
irc.error('The "owner" capability can\'t be added in the bot.' irc.error(_('The "owner" capability can\'t be added in the '
' Use the supybot-adduser program (or edit the ' 'bot. Use the supybot-adduser program (or edit the '
'users.conf file yourself) to add an owner ' 'users.conf file yourself) to add an owner '
'capability.') 'capability.'))
return return
if ircdb.isAntiCapability(capability) or \ if ircdb.isAntiCapability(capability) or \
ircdb.checkCapability(msg.prefix, capability): ircdb.checkCapability(msg.prefix, capability):
@ -271,9 +280,10 @@ class Admin(callbacks.Plugin):
ircdb.users.setUser(user) ircdb.users.setUser(user)
irc.replySuccess() irc.replySuccess()
else: 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']) add = wrap(add, ['otherUser', 'lowered'])
@internationalizeDocstring
def remove(self, irc, msg, args, user, capability): def remove(self, irc, msg, args, user, capability):
"""<name|hostmask> <capability> """<name|hostmask> <capability>
@ -287,14 +297,15 @@ class Admin(callbacks.Plugin):
ircdb.users.setUser(user) ircdb.users.setUser(user)
irc.replySuccess() irc.replySuccess()
except KeyError: except KeyError:
irc.error('That user doesn\'t have that capability.') irc.error(_('That user doesn\'t have that capability.'))
else: else:
s = 'You can\'t remove capabilities you don\'t have.' s = _('You can\'t remove capabilities you don\'t have.')
irc.error(s) irc.error(s)
remove = wrap(remove, ['otherUser','lowered']) remove = wrap(remove, ['otherUser','lowered'])
class ignore(callbacks.Commands): class ignore(callbacks.Commands):
@internationalizeDocstring
def add(self, irc, msg, args, hostmask, expires): def add(self, irc, msg, args, hostmask, expires):
"""<hostmask|nick> [<expires>] """<hostmask|nick> [<expires>]
@ -307,6 +318,7 @@ class Admin(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
add = wrap(add, ['hostmask', additional('expiry', 0)]) add = wrap(add, ['hostmask', additional('expiry', 0)])
@internationalizeDocstring
def remove(self, irc, msg, args, hostmask): def remove(self, irc, msg, args, hostmask):
"""<hostmask|nick> """<hostmask|nick>
@ -317,9 +329,10 @@ class Admin(callbacks.Plugin):
ircdb.ignores.remove(hostmask) ircdb.ignores.remove(hostmask)
irc.replySuccess() irc.replySuccess()
except KeyError: 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']) remove = wrap(remove, ['hostmask'])
@internationalizeDocstring
def list(self, irc, msg, args): def list(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -329,7 +342,7 @@ class Admin(callbacks.Plugin):
if ircdb.ignores.hostmasks: if ircdb.ignores.hostmasks:
irc.reply(format('%L', (map(repr,ircdb.ignores.hostmasks)))) irc.reply(format('%L', (map(repr,ircdb.ignores.hostmasks))))
else: else:
irc.reply('I\'m not currently globally ignoring anyone.') irc.reply(_('I\'m not currently globally ignoring anyone.'))
list = wrap(list) list = wrap(list)

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Alias')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<an alias,%s %n>\n"
"\n"
"Alias for %q."
msgstr ""
"<un alias,%s %n>\n"
"\n"
"Alias pour %q."
#: plugin.py:220
msgid ""
"<alias>\n"
"\n"
" Locks an alias so that no one else can change it.\n"
" "
msgstr ""
"<alias>\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 ""
"<alias>\n"
"\n"
" Unlocks an alias so that people can define new aliases over it.\n"
" "
msgstr ""
"<alias>\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 ""
"<name> <alias>\n"
"\n"
" Defines an alias <name> that executes <alias>. The <alias>\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 ""
"<nom> <alias>\n"
"\n"
"Défini un alias <nom> qui exécute <alias>. L'<alias> 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 ""
"<name>\n"
"\n"
" Removes the given alias, if unlocked.\n"
" "
msgstr ""
"<nom>\n"
"\n"
"Supprime l'alias donné, si il n'est pas vérouillé."

View File

@ -0,0 +1,87 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<an alias,%s %n>\n"
"\n"
"Alias for %q."
msgstr ""
#: plugin.py:220
#, docstring
msgid ""
"<alias>\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 ""
"<alias>\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 ""
"<name> <alias>\n"
"\n"
" Defines an alias <name> that executes <alias>. The <alias>\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 ""
"<name>\n"
"\n"
" Removes the given alias, if unlocked.\n"
" "
msgstr ""

View File

@ -37,6 +37,8 @@ from supybot.commands import *
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.registry as registry import supybot.registry as registry
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Alias')
# Copied from the old privmsgs.py. # Copied from the old privmsgs.py.
def getChannel(msg, args=()): def getChannel(msg, args=()):
@ -159,9 +161,9 @@ def makeNewAlias(name, alias):
self.Proxy(irc, msg, tokens) self.Proxy(irc, msg, tokens)
flexargs = '' flexargs = ''
if biggestDollar and (wildcard or biggestAt): if biggestDollar and (wildcard or biggestAt):
flexargs = ' at least' flexargs = _(' at least')
doc =format('<an alias,%s %n>\n\nAlias for %q.', doc =format(_('<an alias,%s %n>\n\nAlias for %q.'),
flexargs, (biggestDollar, 'argument'), alias) flexargs, (biggestDollar, _('argument')), alias)
f = utils.python.changeFunctionName(f, name, doc) f = utils.python.changeFunctionName(f, name, doc)
return f return f
@ -213,6 +215,7 @@ class Alias(callbacks.Plugin):
except AttributeError: except AttributeError:
return self.aliases[command[0]][2] return self.aliases[command[0]][2]
@internationalizeDocstring
def lock(self, irc, msg, args, name): def lock(self, irc, msg, args, name):
"""<alias> """<alias>
@ -223,9 +226,10 @@ class Alias(callbacks.Plugin):
conf.supybot.plugins.Alias.aliases.get(name).locked.setValue(True) conf.supybot.plugins.Alias.aliases.get(name).locked.setValue(True)
irc.replySuccess() irc.replySuccess()
else: else:
irc.error('There is no such alias.') irc.error(_('There is no such alias.'))
lock = wrap(lock, [('checkCapability', 'admin'), 'commandName']) lock = wrap(lock, [('checkCapability', 'admin'), 'commandName'])
@internationalizeDocstring
def unlock(self, irc, msg, args, name): def unlock(self, irc, msg, args, name):
"""<alias> """<alias>
@ -236,7 +240,7 @@ class Alias(callbacks.Plugin):
conf.supybot.plugins.Alias.aliases.get(name).locked.setValue(False) conf.supybot.plugins.Alias.aliases.get(name).locked.setValue(False)
irc.replySuccess() irc.replySuccess()
else: else:
irc.error('There is no such alias.') irc.error(_('There is no such alias.'))
unlock = wrap(unlock, [('checkCapability', 'admin'), 'commandName']) unlock = wrap(unlock, [('checkCapability', 'admin'), 'commandName'])
_invalidCharsRe = re.compile(r'[\[\]\s]') _invalidCharsRe = re.compile(r'[\[\]\s]')
@ -247,7 +251,7 @@ class Alias(callbacks.Plugin):
raise AliasError, 'Names cannot contain pipes.' raise AliasError, 'Names cannot contain pipes.'
realName = callbacks.canonicalName(name) realName = callbacks.canonicalName(name)
if name != realName: 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 raise AliasError, s
name = realName name = realName
if self.isCommandMethod(name): if self.isCommandMethod(name):
@ -283,6 +287,7 @@ class Alias(callbacks.Plugin):
else: else:
raise AliasError, 'There is no such alias.' raise AliasError, 'There is no such alias.'
@internationalizeDocstring
def add(self, irc, msg, args, name, alias): def add(self, irc, msg, args, name, alias):
"""<name> <alias> """<name> <alias>
@ -305,6 +310,7 @@ class Alias(callbacks.Plugin):
irc.error(str(e)) irc.error(str(e))
add = wrap(add, ['commandName', 'text']) add = wrap(add, ['commandName', 'text'])
@internationalizeDocstring
def remove(self, irc, msg, args, name): def remove(self, irc, msg, args, name):
"""<name> """<name>

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Anonymous')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -44,20 +46,20 @@ Anonymous = conf.registerPlugin('Anonymous')
# conf.registerGlobalValue(Anonymous, 'someConfigVariableName', # conf.registerGlobalValue(Anonymous, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName.""")) # registry.Boolean(False, """Help for someConfigVariableName."""))
conf.registerChannelValue(conf.supybot.plugins.Anonymous, 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 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', conf.registerGlobalValue(conf.supybot.plugins.Anonymous, 'requireRegistration',
registry.Boolean(True, """Determines whether the bot should require people registry.Boolean(True, _("""Determines whether the bot should require
trying to use this plugin to be registered.""")) people trying to use this plugin to be registered.""")))
conf.registerGlobalValue(conf.supybot.plugins.Anonymous, 'requireCapability', conf.registerGlobalValue(conf.supybot.plugins.Anonymous, 'requireCapability',
registry.String('', """Determines what capability (if any) the bot should registry.String('', _("""Determines what capability (if any) the bot should
require people trying to use this plugin to have.""")) require people trying to use this plugin to have.""")))
conf.registerGlobalValue(conf.supybot.plugins.Anonymous, 'allowPrivateTarget', conf.registerGlobalValue(conf.supybot.plugins.Anonymous, 'allowPrivateTarget',
registry.Boolean(False, """Determines whether the bot will require targets registry.Boolean(False, _("""Determines whether the bot will require
of the "say" command to be public (i.e., channels). If this is True, the targets of the "say" command to be public (i.e., channels). If this is
bot will allow people to use the "say" command to send private messages to True, the bot will allow people to use the "say" command to send private
other users.""")) messages to other users.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<channel|nick> <text>\n"
"\n"
" Sends <text> to <channel|nick>. Can only send to <nick> if\n"
" supybot.plugins.Anonymous.allowPrivateTarget is True.\n"
" "
msgstr ""
"<canal|nick> <text>\n"
"\n"
"Envoie le <texte> au <canal|nick>. Vous ne pouvez envoyer à <nick> que si /cs register ##fschfsch supybot.plugins.Anonymous.allowPrivateTarget vaut True."
#: plugin.py:95
msgid ""
"<channel> <action>\n"
"\n"
" Performs <action> in <channel>.\n"
" "
msgstr ""
"<canal> <action>\n"
"\n"
"Effectue l'<action> sur le <canal>."

View File

@ -0,0 +1,79 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<channel|nick> <text>\n"
"\n"
" Sends <text> to <channel|nick>. Can only send to <nick> if\n"
" supybot.plugins.Anonymous.allowPrivateTarget is True.\n"
" "
msgstr ""
#: plugin.py:95
#, docstring
msgid ""
"<channel> <action>\n"
"\n"
" Performs <action> in <channel>.\n"
" "
msgstr ""

View File

@ -33,6 +33,8 @@ import supybot.utils as utils
from supybot.commands import * from supybot.commands import *
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Anonymous')
class Anonymous(callbacks.Plugin): class Anonymous(callbacks.Plugin):
"""This plugin allows users to act through the bot anonymously. The 'do' """This plugin allows users to act through the bot anonymously. The 'do'
@ -73,6 +75,7 @@ class Anonymous(callbacks.Plugin):
action), action),
Raise=True) Raise=True)
@internationalizeDocstring
def say(self, irc, msg, args, target, text): def say(self, irc, msg, args, target, text):
"""<channel|nick> <text> """<channel|nick> <text>
@ -86,6 +89,7 @@ class Anonymous(callbacks.Plugin):
irc.noReply() irc.noReply()
say = wrap(say, [first('nick', 'inChannel'), 'text']) say = wrap(say, [first('nick', 'inChannel'), 'text'])
@internationalizeDocstring
def do(self, irc, msg, args, channel, text): def do(self, irc, msg, args, channel, text):
"""<channel> <action> """<channel> <action>
@ -97,6 +101,7 @@ class Anonymous(callbacks.Plugin):
irc.queueMsg(ircmsgs.action(channel, text)) irc.queueMsg(ircmsgs.action(channel, text))
irc.noReply() irc.noReply()
do = wrap(do, ['inChannel', 'text']) do = wrap(do, ['inChannel', 'text'])
Anonymous = internationalizeDocstring(Anonymous)
Class = Anonymous Class = Anonymous

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('AutoMode')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -41,30 +43,33 @@ def configure(advanced):
AutoMode = conf.registerPlugin('AutoMode') AutoMode = conf.registerPlugin('AutoMode')
conf.registerChannelValue(AutoMode, 'enable', 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', 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', conf.registerChannelValue(AutoMode, 'fallthrough',
registry.Boolean(False, """Determines whether the bot will "fall through" to registry.Boolean(False, _("""Determines whether the bot will "fall through
halfop/voicing when auto-opping is turned off but auto-halfopping/voicing to halfop/voicing when auto-opping is turned off but
are turned on.""")) auto-halfopping/voicing are turned on.""")))
conf.registerChannelValue(AutoMode, 'op', conf.registerChannelValue(AutoMode, 'op',
registry.Boolean(True, """Determines whether the bot will automatically op registry.Boolean(True, _("""Determines whether the bot will automatically
people with the <channel>,op capability when they join the channel.""")) op people with the <channel>,op capability when they join the channel.
""")))
conf.registerChannelValue(AutoMode, 'halfop', 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 <channel>,halfop capability when they join the halfop people with the <channel>,halfop capability when they join the
channel.""")) channel.""")))
conf.registerChannelValue(AutoMode, 'voice', 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 <channel>,voice capability when they join the voice people with the <channel>,voice capability when they join the
channel.""")) channel.""")))
conf.registerChannelValue(AutoMode, 'ban', conf.registerChannelValue(AutoMode, 'ban',
registry.Boolean(True, """Determines whether the bot will automatically ban registry.Boolean(True, _("""Determines whether the bot will automatically
people who join the channel and are on the banlist.""")) ban people who join the channel and are on the banlist.""")))
conf.registerChannelValue(AutoMode.ban, 'period', conf.registerChannelValue(AutoMode.ban, 'period',
registry.PositiveInteger(86400, """Determines how many seconds the bot will registry.PositiveInteger(86400, _("""Determines how many seconds the bot
automatically ban a person when banning.""")) will automatically ban a person when banning.""")))

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 <channel>,op capability when they join the channel.\n"
" "
msgstr "Détermine si le bot opera automatiquement les gens qui ont la capacité <canal>,op lorsqu'ils rejoignent le canal."
#: config.py:60
msgid ""
"Determines whether the bot will automatically\n"
" halfop people with the <channel>,halfop capability when they join the\n"
" channel."
msgstr "Détermine si le bot halfopera les gens qui ont la capacité <canal>,halfop lorsqu'ils rejoignent le canal."
#: config.py:64
msgid ""
"Determines whether the bot will automatically\n"
" voice people with the <channel>,voice capability when they join the\n"
" channel."
msgstr "Détermine si le bot voicera automatiquement les gens avec la capacité <canal>,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."

View File

@ -0,0 +1,69 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 <channel>,op capability when they join the channel.\n"
" "
msgstr ""
#: config.py:60
msgid ""
"Determines whether the bot will automatically\n"
" halfop people with the <channel>,halfop capability when they join the\n"
" channel."
msgstr ""
#: config.py:64
msgid ""
"Determines whether the bot will automatically\n"
" voice people with the <channel>,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 ""

View File

@ -35,6 +35,8 @@ import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.schedule as schedule import supybot.schedule as schedule
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('AutoMode')
class Continue(Exception): class Continue(Exception):
pass # Used below, look in the "do" function nested in doJoin. pass # Used below, look in the "do" function nested in doJoin.

View File

@ -31,12 +31,15 @@ import time
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('BadWords')
def configure(advanced): def configure(advanced):
from supybot.questions import output, expect, anything, something, yn from supybot.questions import output, expect, anything, something, yn
conf.registerPlugin('BadWords', True) conf.registerPlugin('BadWords', True)
if yn('Would you like to add some bad words?'): if yn(_('Would you like to add some bad words?')):
words = anything('What words? (separate individual words by spaces)') words = anything(_('What words? (separate individual words by '
'spaces)'))
conf.supybot.plugins.BadWords.words.set(words) conf.supybot.plugins.BadWords.words.set(words)
class LastModifiedSetOfStrings(registry.SpaceSeparatedSetOfStrings): class LastModifiedSetOfStrings(registry.SpaceSeparatedSetOfStrings):
@ -47,14 +50,14 @@ class LastModifiedSetOfStrings(registry.SpaceSeparatedSetOfStrings):
BadWords = conf.registerPlugin('BadWords') BadWords = conf.registerPlugin('BadWords')
conf.registerGlobalValue(BadWords, 'words', conf.registerGlobalValue(BadWords, 'words',
LastModifiedSetOfStrings([], """Determines what words are LastModifiedSetOfStrings([], _("""Determines what words are
considered to be 'bad' so the bot won't say them.""")) considered to be 'bad' so the bot won't say them.""")))
conf.registerGlobalValue(BadWords,'requireWordBoundaries', 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 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' 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 will be censored, but 'darnit' will not. You probably want this to be
false.""")) false.""")))
class String256(registry.String): class String256(registry.String):
def __call__(self): def __call__(self):
@ -65,39 +68,39 @@ class String256(registry.String):
return self.value return self.value
conf.registerGlobalValue(BadWords, 'nastyChars', 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 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): class ReplacementMethods(registry.OnlySomeStrings):
validStrings = ('simple', 'nastyCharacters') validStrings = ('simple', 'nastyCharacters')
conf.registerGlobalValue(BadWords, 'replaceMethod', 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 words will be replaced. 'nastyCharacters' (the default) will replace a
bad word with the same number of 'nasty characters' (like those used in bad word with the same number of 'nasty characters' (like those used in
comic books; configurable by supybot.plugins.BadWords.nastyChars). comic books; configurable by supybot.plugins.BadWords.nastyChars).
'simple' will replace a bad word with a simple strings (regardless of the 'simple' will replace a bad word with a simple strings (regardless of the
length of the bad word); this string is configurable via length of the bad word); this string is configurable via
supybot.plugins.BadWords.simpleReplacement.""")) supybot.plugins.BadWords.simpleReplacement.""")))
conf.registerGlobalValue(BadWords,'simpleReplacement', conf.registerGlobalValue(BadWords,'simpleReplacement',
registry.String('[CENSORED]', """Determines what word will replace bad registry.String('[CENSORED]', _("""Determines what word will replace bad
words if the replacement method is 'simple'.""")) words if the replacement method is 'simple'.""")))
conf.registerGlobalValue(BadWords, 'stripFormatting', 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. 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 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 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', conf.registerChannelValue(BadWords, 'kick',
registry.Boolean(False, """Determines whether the bot will kick people with registry.Boolean(False, _("""Determines whether the bot will kick people with
a warning when they use bad words.""")) a warning when they use bad words.""")))
conf.registerChannelValue(BadWords.kick, 'message', 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 prohibited in the presence of this bot. Please use more appropriate
language in the future.""", """Determines the kick message used by the bot language in the future."""), _("""Determines the kick message used by the
when kicking users for saying bad words.""")) bot when kicking users for saying bad words.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<word> [<word> ...]\n"
"\n"
" Adds all <word>s to the list of words the bot isn't to say.\n"
" "
msgstr ""
"<mot> [<mot> ...]\n"
"\n"
"Ajoute tous les mots à la liste des mots que le bot ne doit pas dire."
#: plugin.py:137
msgid ""
"<word> [<word> ...]\n"
"\n"
" Removes a <word>s from the list of words the bot isn't to say.\n"
" "
msgstr ""
"<mot> [<mot> ...]\n"
"\n"
"Retire les <mot>s de la liste des mots que le bot ne doit pas dire."

View File

@ -0,0 +1,110 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<word> [<word> ...]\n"
"\n"
" Adds all <word>s to the list of words the bot isn't to say.\n"
" "
msgstr ""
#: plugin.py:137
#, docstring
msgid ""
"<word> [<word> ...]\n"
"\n"
" Removes a <word>s from the list of words the bot isn't to say.\n"
" "
msgstr ""

View File

@ -39,6 +39,8 @@ import supybot.ircmsgs as ircmsgs
from supybot.commands import * from supybot.commands import *
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('BadWords')
class BadWords(callbacks.Privmsg): class BadWords(callbacks.Privmsg):
def __init__(self, irc): def __init__(self, irc):
@ -103,6 +105,7 @@ class BadWords(callbacks.Privmsg):
s = r'\b%s\b' % s s = r'\b%s\b' % s
self.regexp = re.compile(s, re.I) self.regexp = re.compile(s, re.I)
@internationalizeDocstring
def list(self, irc, msg, args): def list(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -114,9 +117,10 @@ class BadWords(callbacks.Privmsg):
utils.sortBy(str.lower, L) utils.sortBy(str.lower, L)
irc.reply(format('%L', L)) irc.reply(format('%L', L))
else: 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']) list = wrap(list, ['admin'])
@internationalizeDocstring
def add(self, irc, msg, args, words): def add(self, irc, msg, args, words):
"""<word> [<word> ...] """<word> [<word> ...]
@ -128,6 +132,7 @@ class BadWords(callbacks.Privmsg):
irc.replySuccess() irc.replySuccess()
add = wrap(add, ['admin', many('something')]) add = wrap(add, ['admin', many('something')])
@internationalizeDocstring
def remove(self, irc, msg, args, words): def remove(self, irc, msg, args, words):
"""<word> [<word> ...] """<word> [<word> ...]

View File

@ -32,6 +32,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.utils as utils import supybot.utils as utils
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Channel')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -43,8 +45,8 @@ def configure(advanced):
Channel = conf.registerPlugin('Channel') Channel = conf.registerPlugin('Channel')
conf.registerChannelValue(Channel, 'alwaysRejoin', conf.registerChannelValue(Channel, 'alwaysRejoin',
registry.Boolean(True, """Determines whether the bot will always try to registry.Boolean(True, _("""Determines whether the bot will always try to
rejoin a channel whenever it's kicked from the channel.""")) rejoin a channel whenever it's kicked from the channel.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"[<channel>] <mode> [<arg> ...]\n"
"\n"
" Sets the mode in <channel> to <mode>, sending the arguments given.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
"[<canal>] <mode> [<arg> ...]\n"
"\n"
"Définit le <mode> sur le canal, en envoyant les arguments donnés. <canal> 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 ""
"[<channel>] [<limit>]\n"
"\n"
" Sets the channel limit to <limit>. If <limit> is 0, or isn't given,\n"
" removes the channel limit. <channel> is only necessary if the message\n"
" isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<limite>]\n"
"\n"
"Définit la <limite> du canal. Si <limite> est 0, ou n'est pas donné, supprime la limite du canal. <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 ""
"[<channel>]\n"
"\n"
" Sets +m on <channel>, making it so only ops and voiced users can\n"
" send messages to the channel. <channel> is only necessary if the\n"
" message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>]\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. <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 ""
"[<channel>]\n"
"\n"
" Sets -m on <channel>, making it so everyone can\n"
" send messages to the channel. <channel> is only necessary if the\n"
" message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>]\n"
"\n"
"Définit le -m sur le <canal>, ce qui fait que tout le monde peut à nouveau envoyer des messages au canal. <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 ""
"[<channel>] [<key>]\n"
"\n"
" Sets the keyword in <channel> to <key>. If <key> is not given, removes\n"
" the keyword requirement to join <channel>. <channel> is only necessary\n"
" if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<clef>]\n"
"\n"
"Définit la <clef> du <canal>. Si la <clef> n'est pas donnée, retire la clef du <canal>. <canal> 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 ""
"[<channel>] [<nick> ...]\n"
"\n"
" If you have the #channel,op capability, this will give all the <nick>s\n"
" you provide ops. If you don't provide any <nick>s, this will op you.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
"[<canal>] [<nick> ...]\n"
"\n"
"Si vous avez la permission #canal,op, ceci vous permet de oper tous les <nick>s. Si vous ne fournissez aucun <nick>, ceci vous opera. <canal> 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 ""
"[<channel>] [<nick> ...]\n"
"\n"
" If you have the #channel,halfop capability, this will give all the\n"
" <nick>s you provide halfops. If you don't provide any <nick>s, this\n"
" will give you halfops. <channel> is only necessary if the message isn't\n"
" sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<nick> ...]\n"
"\n"
"Si vous avez la permission #canal,halfop, ceci vous permet de halfoper tous les <nick>s. Si vous ne fournissez aucun <nick>, ceci vous halfopera. <canal> 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 ""
"[<channel>] [<nick> ...]\n"
"\n"
" If you have the #channel,voice capability, this will voice all the\n"
" <nick>s you provide. If you don't provide any <nick>s, this will\n"
" voice you. <channel> is only necessary if the message isn't sent in the\n"
" channel itself.\n"
" "
msgstr ""
"[<canal>] [<nick> ...]\n"
"\n"
"Si vous avez la permission #canal,voice, ceci vous permet de voicer tous les <nick>s. Si vous ne fournissez aucun <nick>, ceci vous voicera. <canal> 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 ""
"[<channel>] [<nick> ...]\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 ""
"[<canal>] [<nick> ...]\n"
"\n"
"Si vous avez la permission #canal,op, ceci vous permet de déoper tous les <nick>s. Si vous ne fournissez aucun <nick>, ceci vous déopera. <canal> 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 ""
"[<channel>] [<nick> ...]\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 ""
"[<canal>] [<nick> ...]\n"
"\n"
"Si vous avez la permission #canal,op, ceci vous permet de déhalfoper tous les <nick>s. Si vous ne fournissez aucun <nick>, ceci vous déhalfopera. <canal> 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 ""
"[<channel>] [<nick> ...]\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 ""
"[<canal>] [<nick> ...]\n"
"\n"
"Si vous avez la permission #canal,op, ceci vous permet de dévoicer tous les <nick>s. Si vous ne fournissez aucun <nick>, ceci vous dévoicera. <canal> 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 ""
"[<channel>]\n"
"\n"
" If you have the #channel,op capability, this will cause the bot to\n"
" \"cycle\", or PART and then JOIN the channel. <channel> is only necessary\n"
" if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>]\n"
"\n"
"Si vous avez la capacité #canal,op,, ceci fera \"cycler\" le bot, ou un PART et un JOIN. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:268
msgid ""
"[<channel>] <nick>[, <nick>, ...] [<reason>]\n"
"\n"
" Kicks <nick>(s) from <channel> for <reason>. If <reason> isn't given,\n"
" uses the nick of the person making the command as the reason.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
"[<canal>] <nick>[, <nick>, ...] [<raison>]\n"
"\n"
"Kicke le(s) <nick>(s) du <canal> pour la <raison>. Si la raison n'est pas donnée, le nick de la personne envoyant la commande est utilisé. <canal> 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 ""
"[<channel>] [--{exact,nick,user,host}] <nick> [<seconds>] [<reason>]\n"
"\n"
" If you have the #channel,op capability, this will kickban <nick> 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. <reason> is a reason to give for\n"
" the kick.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
"[<canal>] [--{exact,nick,user,host}] [<secondes>] [<raison>]\n"
"\n"
"Si vous avez la capacité #canal,op, ceci kickbannira <nick> pendant le nombre de <secondes> 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é.<raison> est une raison que vous donnez pour le kick. <canal> 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 ""
"[<channel>] [<hostmask>]\n"
"\n"
" Unbans <hostmask> on <channel>. If <hostmask> is not given, unbans\n"
" any hostmask currently banned on <channel> that matches your current\n"
" hostmask. Especially useful for unbanning yourself when you get\n"
" unexpectedly (or accidentally) banned from the channel. <channel> is\n"
" only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<masque d'hôte>]\n"
"\n"
"Débannit le <masque d'hôte> du <canal>. Si le <masque d'hôte> 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. <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 ""
"[<channel>] <nick>\n"
"\n"
" If you have the #channel,op capability, this will invite <nick>\n"
" to join <channel>. <channel> is only necessary if the message isn't\n"
" sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <nick>\n"
"\n"
"Si vous avez la capacité #canal,op, ceci invitera <nick> à rejoindre le <canal>. <canal> 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 ""
"[<channel>]\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. <channel> is only necessary if the message isn't sent in\n"
" the channel itself.\n"
" "
msgstr ""
"[<canal>]\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. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:462
msgid ""
"[<channel>]\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"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
"[<canal>]\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. <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 ""
"[<channel>] <nick|hostmask> [<expires>]\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"
" <hostmask> (or the current hostmask associated with <nick>. Other\n"
" plugins may enforce this ban by actually banning users with\n"
" matching hostmasks when they join. <expires> 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"
" <channel> is only necessary if the message isn't sent in the\n"
" channel itself.\n"
" "
msgstr ""
"[<canal>] <nick|masque d'hôte> [<expiration>]\n"
"\n"
"Si vous avez la capacité #canal,op, ceci affectera un bannisement persistant au <nick|masque d'hôte> spécifié. D'autres plugins pourraient renforcer ce bannissement en bannissant vraiment les utilisateurs correspondant à ce masque d'hôte lorsqu'ils entrent. <expiration> est un argument option, correspondant à la durée, en secondes, que doit avoir le bannissement."
#: plugin.py:522
msgid ""
"[<channel>] <hostmask>\n"
"\n"
" If you have the #channel,op capability, this will remove the\n"
" persistent ban on <hostmask>. <channel> is only necessary if the\n"
" message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <masque d'hôte>\n"
"\n"
"Si vous avez la capacité #canal,op, ceci supprimera le bannissement persistant sur le <masque d'hôte>. <canal> 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 ""
"[<channel>]\n"
"\n"
" If you have the #channel,op capability, this will show you the\n"
" current persistent bans on #channel.\n"
" "
msgstr ""
"[<canal>]\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 ""
"[<channel>] <nick|hostmask> [<expires>]\n"
"\n"
" If you have the #channel,op capability, this will set a persistent\n"
" ignore on <hostmask> or the hostmask currently\n"
" associated with <nick>. <expires> 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"
" <channel> is only necessary if the message isn't sent in the\n"
" channel itself.\n"
" "
msgstr ""
"[<canal>] <nick|masque d'hôte> [<expiration>]\n"
"\n"
"Vous permet d'ajouter un ignore persistant sur le <masque d'hôte>, ou le masque associé au <nick>, à condition d'avoir la capacité #canal,op. <secondes> 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. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:581
msgid ""
"[<channel>] <hostmask>\n"
"\n"
" If you have the #channel,op capability, this will remove the\n"
" persistent ignore on <hostmask> in the channel. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <masque d'hôte>\n"
"\n"
"Si vous avez la capacité #canal,op, ceci supprimera le masque d'ignorance persistant du <masque d'hôte> sur le canal. <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 ""
"[<channel>]\n"
"\n"
" Lists the hostmasks that the bot is ignoring on the given channel.\n"
" <channel> is only necessary if the message isn't sent in the\n"
" channel itself.\n"
" "
msgstr ""
"[<canal>]\n"
"\n"
"Liste les masques d'hôte que le bot ignore sur le canal donné. <canal> 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 ""
"[<channel>] <nick|username> <capability> [<capability> ...]\n"
"\n"
" If you have the #channel,op capability, this will give the user\n"
" <name> (or the user to whom <nick> maps)\n"
" the capability <capability> in the channel. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <nick|nom> <capacité> [<capacité> ...]\n"
"\n"
"Vous permet de donner à l'utilisateur <nom> (ou celui ayant actuellement le <nick>) la <capacité> sur le canal. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:634
msgid ""
"[<channel>] <name|hostmask> <capability> [<capability> ...]\n"
"\n"
" If you have the #channel,op capability, this will take from the\n"
" user currently identified as <name> (or the user to whom <hostmask>\n"
" maps) the capability <capability> in the channel. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <nom|masque d'hôte> <capacité> [<capacité> ...]\n"
"\n"
" Vous permet de prendre la <capacité> de l'utilisateur <nom> (ou celui à qui appartient le <masque d'hôte>, à condition que vous ayez la permission #canal,op. <canal> 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 ""
"[<channel>] {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. <channel> is only necessary\n"
" if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] {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). <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:680
msgid ""
"[<channel>] <capability> [<capability> ...]\n"
"\n"
" If you have the #channel,op capability, this will add the channel\n"
" capability <capability> for all users in the channel. <channel> is\n"
" only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <capacité> [<capacité> ...]\n"
"\n"
"Si vous avez la capacité #canal,op ceci ajoutera la <capacité> de canal à tous les utilisateurs du canal. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:695
msgid ""
"[<channel>] <capability> [<capability> ...]\n"
"\n"
" If you have the #channel,op capability, this will unset the channel\n"
" capability <capability> so each user's specific capability or the\n"
" channel default capability will take precedence. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <capacité> [<capacité> ...]\n"
"\n"
"Si vous avez la capacité #canal,op ceci désactivera le fait que tous les utilisateurs du canal aient la <capacité> de canal. <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 ""
"[<channel>]\n"
"\n"
" Returns the capabilities present on the <channel>. <channel> is\n"
" only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>]\n"
"\n"
"Retourne les capacité présentes sur le <canal>. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:733
msgid ""
"[<channel>] [<plugin>] [<command>]\n"
"\n"
" If you have the #channel,op capability, this will disable the <command>\n"
" in <channel>. If <plugin> is provided, <command> will be disabled only\n"
" for that plugin. If only <plugin> is provided, all commands in the\n"
" given plugin will be disabled. <channel> is only necessary if the\n"
" message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<plugin>] [<commande>]\n"
"\n"
" Si vous avez la permission #canal,op, ceci désactive la <commande> sur le <canal>. Si le <plugin> est fourni, toutes les commandes de ce plugin seront désactivées. <canal> 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 ""
"[<channel>] [<plugin>] [<command>]\n"
"\n"
" If you have the #channel,op capability, this will enable the <command>\n"
" in <channel> if it has been disabled. If <plugin> is provided,\n"
" <command> will be enabled only for that plugin. If only <plugin> is\n"
" provided, all commands in the given plugin will be enabled. <channel>\n"
" is only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<plugin>] [<commande>]\n"
"\n"
"Si vous avez la permission #canal,op, ceci activera la <commande> sur le <canal>, si elle a auparavant été désactivée. Si le <plugin> seule la commande de ce plugin sera activée. <canal> 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 ""
"[<channel>]\n"
"\n"
" Returns the nicks in <channel>. <channel> is only necessary if the\n"
" message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>]\n"
"\n"
"Retourne les nick sur le <canal>. <canal> 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 ""
"[<channel>] <text>\n"
"\n"
" Sends <text> to all the users in <channel> who have the <channel>,op\n"
" capability.\n"
" "
msgstr ""
"[<canal>] <texte>\n"
"\n"
"Envoie le <texte> à tous les utilisateurs sur <canal> qui ont la capacité #canal,op."

View File

@ -0,0 +1,617 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"[<channel>] <mode> [<arg> ...]\n"
"\n"
" Sets the mode in <channel> to <mode>, sending the arguments given.\n"
" <channel> 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 ""
"[<channel>] [<limit>]\n"
"\n"
" Sets the channel limit to <limit>. If <limit> is 0, or isn't given,\n"
" removes the channel limit. <channel> 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 ""
"[<channel>]\n"
"\n"
" Sets +m on <channel>, making it so only ops and voiced users can\n"
" send messages to the channel. <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 ""
"[<channel>]\n"
"\n"
" Sets -m on <channel>, making it so everyone can\n"
" send messages to the channel. <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 ""
"[<channel>] [<key>]\n"
"\n"
" Sets the keyword in <channel> to <key>. If <key> is not given, removes\n"
" the keyword requirement to join <channel>. <channel> 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 ""
"[<channel>] [<nick> ...]\n"
"\n"
" If you have the #channel,op capability, this will give all the <nick>s\n"
" you provide ops. If you don't provide any <nick>s, this will op you.\n"
" <channel> 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 ""
"[<channel>] [<nick> ...]\n"
"\n"
" If you have the #channel,halfop capability, this will give all the\n"
" <nick>s you provide halfops. If you don't provide any <nick>s, this\n"
" will give you halfops. <channel> 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 ""
"[<channel>] [<nick> ...]\n"
"\n"
" If you have the #channel,voice capability, this will voice all the\n"
" <nick>s you provide. If you don't provide any <nick>s, this will\n"
" voice you. <channel> 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 ""
"[<channel>] [<nick> ...]\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 ""
"[<channel>] [<nick> ...]\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 ""
"[<channel>] [<nick> ...]\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 ""
"[<channel>]\n"
"\n"
" If you have the #channel,op capability, this will cause the bot to\n"
" \"cycle\", or PART and then JOIN the channel. <channel> is only necessary\n"
" if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:268
#, docstring
msgid ""
"[<channel>] <nick>[, <nick>, ...] [<reason>]\n"
"\n"
" Kicks <nick>(s) from <channel> for <reason>. If <reason> isn't given,\n"
" uses the nick of the person making the command as the reason.\n"
" <channel> 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 ""
"[<channel>] [--{exact,nick,user,host}] <nick> [<seconds>] [<reason>]\n"
"\n"
" If you have the #channel,op capability, this will kickban <nick> 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. <reason> is a reason to give for\n"
" the kick.\n"
" <channel> 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 ""
"[<channel>] [<hostmask>]\n"
"\n"
" Unbans <hostmask> on <channel>. If <hostmask> is not given, unbans\n"
" any hostmask currently banned on <channel> that matches your current\n"
" hostmask. Especially useful for unbanning yourself when you get\n"
" unexpectedly (or accidentally) banned from the channel. <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 ""
"[<channel>] <nick>\n"
"\n"
" If you have the #channel,op capability, this will invite <nick>\n"
" to join <channel>. <channel> 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 ""
"[<channel>]\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. <channel> is only necessary if the message isn't sent in\n"
" the channel itself.\n"
" "
msgstr ""
#: plugin.py:462
#, docstring
msgid ""
"[<channel>]\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"
" <channel> 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 ""
"[<channel>] <nick|hostmask> [<expires>]\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"
" <hostmask> (or the current hostmask associated with <nick>. Other\n"
" plugins may enforce this ban by actually banning users with\n"
" matching hostmasks when they join. <expires> 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"
" <channel> is only necessary if the message isn't sent in the\n"
" channel itself.\n"
" "
msgstr ""
#: plugin.py:522
#, docstring
msgid ""
"[<channel>] <hostmask>\n"
"\n"
" If you have the #channel,op capability, this will remove the\n"
" persistent ban on <hostmask>. <channel> 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 ""
"[<channel>]\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 ""
"[<channel>] <nick|hostmask> [<expires>]\n"
"\n"
" If you have the #channel,op capability, this will set a persistent\n"
" ignore on <hostmask> or the hostmask currently\n"
" associated with <nick>. <expires> 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"
" <channel> is only necessary if the message isn't sent in the\n"
" channel itself.\n"
" "
msgstr ""
#: plugin.py:581
#, docstring
msgid ""
"[<channel>] <hostmask>\n"
"\n"
" If you have the #channel,op capability, this will remove the\n"
" persistent ignore on <hostmask> in the channel. <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 ""
"[<channel>]\n"
"\n"
" Lists the hostmasks that the bot is ignoring on the given channel.\n"
" <channel> 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 ""
"[<channel>] <nick|username> <capability> [<capability> ...]\n"
"\n"
" If you have the #channel,op capability, this will give the user\n"
" <name> (or the user to whom <nick> maps)\n"
" the capability <capability> in the channel. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:634
#, docstring
msgid ""
"[<channel>] <name|hostmask> <capability> [<capability> ...]\n"
"\n"
" If you have the #channel,op capability, this will take from the\n"
" user currently identified as <name> (or the user to whom <hostmask>\n"
" maps) the capability <capability> in the channel. <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 ""
"[<channel>] {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. <channel> is only necessary\n"
" if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:680
#, docstring
msgid ""
"[<channel>] <capability> [<capability> ...]\n"
"\n"
" If you have the #channel,op capability, this will add the channel\n"
" capability <capability> for all users in the channel. <channel> is\n"
" only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:695
#, docstring
msgid ""
"[<channel>] <capability> [<capability> ...]\n"
"\n"
" If you have the #channel,op capability, this will unset the channel\n"
" capability <capability> so each user's specific capability or the\n"
" channel default capability will take precedence. <channel> 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 ""
"[<channel>]\n"
"\n"
" Returns the capabilities present on the <channel>. <channel> is\n"
" only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:733
#, docstring
msgid ""
"[<channel>] [<plugin>] [<command>]\n"
"\n"
" If you have the #channel,op capability, this will disable the <command>\n"
" in <channel>. If <plugin> is provided, <command> will be disabled only\n"
" for that plugin. If only <plugin> is provided, all commands in the\n"
" given plugin will be disabled. <channel> 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 ""
"[<channel>] [<plugin>] [<command>]\n"
"\n"
" If you have the #channel,op capability, this will enable the <command>\n"
" in <channel> if it has been disabled. If <plugin> is provided,\n"
" <command> will be enabled only for that plugin. If only <plugin> is\n"
" provided, all commands in the given plugin will be enabled. <channel>\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 ""
"[<channel>]\n"
"\n"
" Returns the nicks in <channel>. <channel> 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 ""
"[<channel>] <text>\n"
"\n"
" Sends <text> to all the users in <channel> who have the <channel>,op\n"
" capability.\n"
" "
msgstr ""

View File

@ -38,6 +38,8 @@ import supybot.ircmsgs as ircmsgs
import supybot.schedule as schedule import supybot.schedule as schedule
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Channel')
class Channel(callbacks.Plugin): class Channel(callbacks.Plugin):
def __init__(self, irc): def __init__(self, irc):
@ -62,6 +64,7 @@ class Channel(callbacks.Plugin):
irc.queueMsg(f(nicks[i:i + numModes])) irc.queueMsg(f(nicks[i:i + numModes]))
irc.noReply() irc.noReply()
@internationalizeDocstring
def mode(self, irc, msg, args, channel, modes): def mode(self, irc, msg, args, channel, modes):
"""[<channel>] <mode> [<arg> ...] """[<channel>] <mode> [<arg> ...]
@ -70,8 +73,9 @@ class Channel(callbacks.Plugin):
itself. itself.
""" """
self._sendMsg(irc, ircmsgs.mode(channel, modes)) 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): def limit(self, irc, msg, args, channel, limit):
"""[<channel>] [<limit>] """[<channel>] [<limit>]
@ -83,9 +87,10 @@ class Channel(callbacks.Plugin):
self._sendMsg(irc, ircmsgs.mode(channel, ['+l', limit])) self._sendMsg(irc, ircmsgs.mode(channel, ['+l', limit]))
else: else:
self._sendMsg(irc, ircmsgs.mode(channel, ['-l'])) 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)]) additional('nonNegativeInt', 0)])
@internationalizeDocstring
def moderate(self, irc, msg, args, channel): def moderate(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -94,8 +99,9 @@ class Channel(callbacks.Plugin):
message isn't sent in the channel itself. message isn't sent in the channel itself.
""" """
self._sendMsg(irc, ircmsgs.mode(channel, ['+m'])) 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): def unmoderate(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -104,8 +110,10 @@ class Channel(callbacks.Plugin):
message isn't sent in the channel itself. message isn't sent in the channel itself.
""" """
self._sendMsg(irc, ircmsgs.mode(channel, ['-m'])) 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): def key(self, irc, msg, args, channel, key):
"""[<channel>] [<key>] """[<channel>] [<key>]
@ -119,9 +127,10 @@ class Channel(callbacks.Plugin):
self._sendMsg(irc, ircmsgs.mode(channel, ['+k', key])) self._sendMsg(irc, ircmsgs.mode(channel, ['+k', key]))
else: else:
self._sendMsg(irc, ircmsgs.mode(channel, ['-k'])) 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', '')]) additional('somethingWithoutSpaces', '')])
@internationalizeDocstring
def op(self, irc, msg, args, channel, nicks): def op(self, irc, msg, args, channel, nicks):
"""[<channel>] [<nick> ...] """[<channel>] [<nick> ...]
@ -135,8 +144,9 @@ class Channel(callbacks.Plugin):
def f(L): def f(L):
return ircmsgs.ops(channel, L) return ircmsgs.ops(channel, L)
self._sendMsgs(irc, nicks, f) 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): def halfop(self, irc, msg, args, channel, nicks):
"""[<channel>] [<nick> ...] """[<channel>] [<nick> ...]
@ -150,9 +160,10 @@ class Channel(callbacks.Plugin):
def f(L): def f(L):
return ircmsgs.halfops(channel, L) return ircmsgs.halfops(channel, L)
self._sendMsgs(irc, nicks, f) self._sendMsgs(irc, nicks, f)
halfop = wrap(halfop, ['halfop', ('haveOp', 'halfop someone'), halfop = wrap(halfop, ['halfop', ('haveOp', _('halfop someone')),
any('nickInChannel')]) any('nickInChannel')])
@internationalizeDocstring
def voice(self, irc, msg, args, channel, nicks): def voice(self, irc, msg, args, channel, nicks):
"""[<channel>] [<nick> ...] """[<channel>] [<nick> ...]
@ -176,9 +187,10 @@ class Channel(callbacks.Plugin):
self._sendMsgs(irc, nicks, f) self._sendMsgs(irc, nicks, f)
else: else:
irc.errorNoCapability(capability) irc.errorNoCapability(capability)
voice = wrap(voice, ['channel', ('haveOp', 'voice someone'), voice = wrap(voice, ['channel', ('haveOp', _('voice someone')),
any('nickInChannel')]) any('nickInChannel')])
@internationalizeDocstring
def deop(self, irc, msg, args, channel, nicks): def deop(self, irc, msg, args, channel, nicks):
"""[<channel>] [<nick> ...] """[<channel>] [<nick> ...]
@ -187,17 +199,18 @@ class Channel(callbacks.Plugin):
operator privileges from the person sending the message. operator privileges from the person sending the message.
""" """
if irc.nick in nicks: if irc.nick in nicks:
irc.error('I cowardly refuse to deop myself. If you really want ' irc.error(_('I cowardly refuse to deop myself. If you really '
'me deopped, tell me to op you and then deop me ' 'want me deopped, tell me to op you and then deop me '
'yourself.', Raise=True) 'yourself.'), Raise=True)
if not nicks: if not nicks:
nicks = [msg.nick] nicks = [msg.nick]
def f(L): def f(L):
return ircmsgs.deops(channel, L) return ircmsgs.deops(channel, L)
self._sendMsgs(irc, nicks, f) self._sendMsgs(irc, nicks, f)
deop = wrap(deop, ['op', ('haveOp', 'deop someone'), deop = wrap(deop, ['op', ('haveOp', _('deop someone')),
any('nickInChannel')]) any('nickInChannel')])
@internationalizeDocstring
def dehalfop(self, irc, msg, args, channel, nicks): def dehalfop(self, irc, msg, args, channel, nicks):
"""[<channel>] [<nick> ...] """[<channel>] [<nick> ...]
@ -206,17 +219,18 @@ class Channel(callbacks.Plugin):
half-operator privileges from the person sending the message. half-operator privileges from the person sending the message.
""" """
if irc.nick in nicks: 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 ' 'want me dehalfopped, tell me to op you and then '
'dehalfop me yourself.', Raise=True) 'dehalfop me yourself.'), Raise=True)
if not nicks: if not nicks:
nicks = [msg.nick] nicks = [msg.nick]
def f(L): def f(L):
return ircmsgs.dehalfops(channel, L) return ircmsgs.dehalfops(channel, L)
self._sendMsgs(irc, nicks, f) self._sendMsgs(irc, nicks, f)
dehalfop = wrap(dehalfop, ['halfop', ('haveOp', 'dehalfop someone'), dehalfop = wrap(dehalfop, ['halfop', ('haveOp', _('dehalfop someone')),
any('nickInChannel')]) any('nickInChannel')])
@internationalizeDocstring
def devoice(self, irc, msg, args, channel, nicks): def devoice(self, irc, msg, args, channel, nicks):
"""[<channel>] [<nick> ...] """[<channel>] [<nick> ...]
@ -225,9 +239,9 @@ class Channel(callbacks.Plugin):
sending the message. sending the message.
""" """
if irc.nick in nicks: 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 ' 'want me devoiced, tell me to op you and then devoice '
'me yourself.', Raise=True) 'me yourself.'), Raise=True)
if not nicks: if not nicks:
nicks = [msg.nick] nicks = [msg.nick]
def f(L): def f(L):
@ -236,6 +250,7 @@ class Channel(callbacks.Plugin):
devoice = wrap(devoice, ['voice', ('haveOp', 'devoice someone'), devoice = wrap(devoice, ['voice', ('haveOp', 'devoice someone'),
any('nickInChannel')]) any('nickInChannel')])
@internationalizeDocstring
def cycle(self, irc, msg, args, channel): def cycle(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -248,6 +263,7 @@ class Channel(callbacks.Plugin):
self._sendMsg(irc, networkGroup.channels.join(channel)) self._sendMsg(irc, networkGroup.channels.join(channel))
cycle = wrap(cycle, ['op']) cycle = wrap(cycle, ['op'])
@internationalizeDocstring
def kick(self, irc, msg, args, channel, nicks, reason): def kick(self, irc, msg, args, channel, nicks, reason):
"""[<channel>] <nick>[, <nick>, ...] [<reason>] """[<channel>] <nick>[, <nick>, ...] [<reason>]
@ -257,19 +273,20 @@ class Channel(callbacks.Plugin):
itself. itself.
""" """
if utils.iter.any(lambda n: ircutils.strEqual(n, irc.nick), nicks): 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: if not reason:
reason = msg.nick reason = msg.nick
kicklen = irc.state.supported.get('kicklen', sys.maxint) kicklen = irc.state.supported.get('kicklen', sys.maxint)
if len(reason) > kicklen: if len(reason) > kicklen:
irc.error('The reason you gave is longer than the allowed ' irc.error(_('The reason you gave is longer than the allowed '
'length for a KICK reason on this server.', 'length for a KICK reason on this server.'),
Raise=True) Raise=True)
for nick in nicks: for nick in nicks:
self._sendMsg(irc, ircmsgs.kick(channel, nick, reason)) 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')]) commalist('nickInChannel'), additional('text')])
@internationalizeDocstring
def kban(self, irc, msg, args, def kban(self, irc, msg, args,
channel, optlist, bannedNick, expiry, reason): channel, optlist, bannedNick, expiry, reason):
"""[<channel>] [--{exact,nick,user,host}] <nick> [<seconds>] [<reason>] """[<channel>] [--{exact,nick,user,host}] <nick> [<seconds>] [<reason>]
@ -291,14 +308,14 @@ class Channel(callbacks.Plugin):
raise callbacks.ArgumentError raise callbacks.ArgumentError
elif bannedNick == irc.nick: elif bannedNick == irc.nick:
self.log.warning('%q tried to make me kban myself.', msg.prefix) 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 return
if not reason: if not reason:
reason = msg.nick reason = msg.nick
try: try:
bannedHostmask = irc.state.nickToHostmask(bannedNick) bannedHostmask = irc.state.nickToHostmask(bannedNick)
except KeyError: 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') capability = ircdb.makeChannelCapability(channel, 'op')
banmaskstyle = conf.supybot.protocols.irc.banmask banmaskstyle = conf.supybot.protocols.irc.banmask
banmask = banmaskstyle.makeBanmask(bannedHostmask, [o[0] for o in optlist]) 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(banmask, irc.prefix):
if ircutils.hostmaskPatternEqual(bannedHostmask, irc.prefix): if ircutils.hostmaskPatternEqual(bannedHostmask, irc.prefix):
self.log.warning('%q tried to make me kban myself.',msg.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 return
else: else:
self.log.warning('Using exact hostmask since banmask would ' self.log.warning('Using exact hostmask since banmask would '
@ -332,8 +349,8 @@ class Channel(callbacks.Plugin):
if ircdb.checkCapability(bannedHostmask, capability): if ircdb.checkCapability(bannedHostmask, capability):
self.log.warning('%s tried to ban %q, but both have %s', self.log.warning('%s tried to ban %q, but both have %s',
msg.prefix, bannedHostmask, capability) msg.prefix, bannedHostmask, capability)
irc.error(format('%s has %s too, you can\'t ban him/her/it.', irc.error(format(_('%s has %s too, you can\'t ban '
bannedNick, capability)) 'him/her/it.'), bannedNick, capability))
else: else:
doBan() doBan()
else: else:
@ -344,11 +361,12 @@ class Channel(callbacks.Plugin):
kban = wrap(kban, kban = wrap(kban,
['op', ['op',
getopts({'exact':'', 'nick':'', 'user':'', 'host':''}), getopts({'exact':'', 'nick':'', 'user':'', 'host':''}),
('haveOp', 'kick or ban someone'), ('haveOp', _('kick or ban someone')),
'nickInChannel', 'nickInChannel',
optional('expiry', 0), optional('expiry', 0),
additional('text')]) additional('text')])
@internationalizeDocstring
def unban(self, irc, msg, args, channel, hostmask): def unban(self, irc, msg, args, channel, hostmask):
"""[<channel>] [<hostmask>] """[<channel>] [<hostmask>]
@ -367,16 +385,17 @@ class Channel(callbacks.Plugin):
bans.append(banmask) bans.append(banmask)
if bans: if bans:
irc.queueMsg(ircmsgs.unbans(channel, bans)) irc.queueMsg(ircmsgs.unbans(channel, bans))
irc.replySuccess(format('All bans on %s matching %s ' irc.replySuccess(format(_('All bans on %s matching %s '
'have been removed.', 'have been removed.'),
channel, msg.prefix)) channel, msg.prefix))
else: else:
irc.error('No bans matching %s were found on %s.' % irc.error(_('No bans matching %s were found on %s.') %
(msg.prefix, channel)) (msg.prefix, channel))
unban = wrap(unban, ['op', unban = wrap(unban, ['op',
('haveOp', 'unban someone'), ('haveOp', _('unban someone')),
additional('hostmask')]) additional('hostmask')])
@internationalizeDocstring
def invite(self, irc, msg, args, channel, nick): def invite(self, irc, msg, args, channel, nick):
"""[<channel>] <nick> """[<channel>] <nick>
@ -387,7 +406,7 @@ class Channel(callbacks.Plugin):
nick = nick or msg.nick nick = nick or msg.nick
self._sendMsg(irc, ircmsgs.invite(nick, channel)) self._sendMsg(irc, ircmsgs.invite(nick, channel))
self.invites[(irc.getRealIrc(), ircutils.toLower(nick))] = irc self.invites[(irc.getRealIrc(), ircutils.toLower(nick))] = irc
invite = wrap(invite, ['op', ('haveOp', 'invite someone'), invite = wrap(invite, ['op', ('haveOp', _('invite someone')),
additional('nick')]) additional('nick')])
def do341(self, irc, msg): def do341(self, irc, msg):
@ -406,14 +425,14 @@ class Channel(callbacks.Plugin):
nick = ircutils.toLower(nick) nick = ircutils.toLower(nick)
replyIrc = self.invites.pop((irc, nick), None) replyIrc = self.invites.pop((irc, nick), None)
if replyIrc is not 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): def do401(self, irc, msg):
nick = msg.args[1] nick = msg.args[1]
nick = ircutils.toLower(nick) nick = ircutils.toLower(nick)
replyIrc = self.invites.pop((irc, nick), None) replyIrc = self.invites.pop((irc, nick), None)
if replyIrc is not 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): def do504(self, irc, msg):
nick = msg.args[1] nick = msg.args[1]
@ -423,6 +442,7 @@ class Channel(callbacks.Plugin):
replyIrc.error(format('There is no %s on this server.', nick)) replyIrc.error(format('There is no %s on this server.', nick))
class lobotomy(callbacks.Commands): class lobotomy(callbacks.Commands):
@internationalizeDocstring
def add(self, irc, msg, args, channel): def add(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -437,6 +457,7 @@ class Channel(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
add = wrap(add, ['op']) add = wrap(add, ['op'])
@internationalizeDocstring
def remove(self, irc, msg, args, channel): def remove(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -451,6 +472,7 @@ class Channel(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
remove = wrap(remove, ['op']) remove = wrap(remove, ['op'])
@internationalizeDocstring
def list(self, irc, msg, args): def list(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -467,14 +489,15 @@ class Channel(callbacks.Plugin):
L.append(channel) L.append(channel)
if L: if L:
L.sort() L.sort()
s = format('I\'m currently lobotomized in %L.', L) s = format(_('I\'m currently lobotomized in %L.'), L)
irc.reply(s) irc.reply(s)
else: else:
irc.reply('I\'m not currently lobotomized in any channels ' irc.reply(_('I\'m not currently lobotomized in any channels '
'that you\'re in.') 'that you\'re in.'))
list = wrap(list) list = wrap(list)
class ban(callbacks.Commands): class ban(callbacks.Commands):
@internationalizeDocstring
def add(self, irc, msg, args, channel, banmask, expires): def add(self, irc, msg, args, channel, banmask, expires):
"""[<channel>] <nick|hostmask> [<expires>] """[<channel>] <nick|hostmask> [<expires>]
@ -494,6 +517,7 @@ class Channel(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
add = wrap(add, ['op', 'banmask', additional('expiry', 0)]) add = wrap(add, ['op', 'banmask', additional('expiry', 0)])
@internationalizeDocstring
def remove(self, irc, msg, args, channel, banmask): def remove(self, irc, msg, args, channel, banmask):
"""[<channel>] <hostmask> """[<channel>] <hostmask>
@ -507,9 +531,10 @@ class Channel(callbacks.Plugin):
ircdb.channels.setChannel(channel, c) ircdb.channels.setChannel(channel, c)
irc.replySuccess() irc.replySuccess()
except KeyError: 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']) remove = wrap(remove, ['op', 'hostmask'])
@internationalizeDocstring
def list(self, irc, msg, args, channel): def list(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -521,18 +546,19 @@ class Channel(callbacks.Plugin):
bans = [] bans = []
for ban in c.bans: for ban in c.bans:
if c.bans[ban]: if c.bans[ban]:
bans.append(format('%q (expires %t)', bans.append(format(_('%q (expires %t)'),
ban, c.bans[ban])) ban, c.bans[ban]))
else: else:
bans.append(format('%q (never expires)', bans.append(format(_('%q (never expires)'),
ban, c.bans[ban])) ban, c.bans[ban]))
irc.reply(format('%L', bans)) irc.reply(format('%L', bans))
else: else:
irc.reply(format('There are no persistent bans on %s.', irc.reply(format(_('There are no persistent bans on %s.'),
channel)) channel))
list = wrap(list, ['op']) list = wrap(list, ['op'])
class ignore(callbacks.Commands): class ignore(callbacks.Commands):
@internationalizeDocstring
def add(self, irc, msg, args, channel, banmask, expires): def add(self, irc, msg, args, channel, banmask, expires):
"""[<channel>] <nick|hostmask> [<expires>] """[<channel>] <nick|hostmask> [<expires>]
@ -550,6 +576,7 @@ class Channel(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
add = wrap(add, ['op', 'banmask', additional('expiry', 0)]) add = wrap(add, ['op', 'banmask', additional('expiry', 0)])
@internationalizeDocstring
def remove(self, irc, msg, args, channel, banmask): def remove(self, irc, msg, args, channel, banmask):
"""[<channel>] <hostmask> """[<channel>] <hostmask>
@ -563,9 +590,10 @@ class Channel(callbacks.Plugin):
ircdb.channels.setChannel(channel, c) ircdb.channels.setChannel(channel, c)
irc.replySuccess() irc.replySuccess()
except KeyError: 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']) remove = wrap(remove, ['op', 'hostmask'])
@internationalizeDocstring
def list(self, irc, msg, args, channel): def list(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -576,8 +604,8 @@ class Channel(callbacks.Plugin):
# XXX Add the expirations. # XXX Add the expirations.
c = ircdb.channels.getChannel(channel) c = ircdb.channels.getChannel(channel)
if len(c.ignores) == 0: if len(c.ignores) == 0:
s = format('I\'m not currently ignoring any hostmasks in %q', s = format(_('I\'m not currently ignoring any hostmasks in '
channel) '%q'), channel)
irc.reply(s) irc.reply(s)
else: else:
L = sorted(c.ignores) L = sorted(c.ignores)
@ -585,6 +613,7 @@ class Channel(callbacks.Plugin):
list = wrap(list, ['op']) list = wrap(list, ['op'])
class capability(callbacks.Commands): class capability(callbacks.Commands):
@internationalizeDocstring
def add(self, irc, msg, args, channel, user, capabilities): def add(self, irc, msg, args, channel, user, capabilities):
"""[<channel>] <nick|username> <capability> [<capability> ...] """[<channel>] <nick|username> <capability> [<capability> ...]
@ -600,6 +629,7 @@ class Channel(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
add = wrap(add, ['op', 'otherUser', 'capability']) add = wrap(add, ['op', 'otherUser', 'capability'])
@internationalizeDocstring
def remove(self, irc, msg, args, channel, user, capabilities): def remove(self, irc, msg, args, channel, user, capabilities):
"""[<channel>] <name|hostmask> <capability> [<capability> ...] """[<channel>] <name|hostmask> <capability> [<capability> ...]
@ -620,13 +650,14 @@ class Channel(callbacks.Plugin):
s = 'capability' s = 'capability'
if len(fail) > 1: if len(fail) > 1:
s = utils.str.pluralize(s) s = utils.str.pluralize(s)
irc.error(format('That user didn\'t have the %L %s.', fail, s), irc.error(format(_('That user didn\'t have the %L %s.'), fail,
Raise=True) s), Raise=True)
irc.replySuccess() irc.replySuccess()
remove = wrap(remove, ['op', 'otherUser', 'capability']) remove = wrap(remove, ['op', 'otherUser', 'capability'])
# XXX This needs to be fix0red to be like Owner.defaultcapability. Or # XXX This needs to be fix0red to be like Owner.defaultcapability. Or
# something else. This is a horrible interface. # something else. This is a horrible interface.
@internationalizeDocstring
def setdefault(self, irc, msg, args, channel, v): def setdefault(self, irc, msg, args, channel, v):
"""[<channel>] {True|False} """[<channel>] {True|False}
@ -644,6 +675,7 @@ class Channel(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
setdefault = wrap(setdefault, ['op', 'boolean']) setdefault = wrap(setdefault, ['op', 'boolean'])
@internationalizeDocstring
def set(self, irc, msg, args, channel, capabilities): def set(self, irc, msg, args, channel, capabilities):
"""[<channel>] <capability> [<capability> ...] """[<channel>] <capability> [<capability> ...]
@ -658,6 +690,7 @@ class Channel(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
set = wrap(set, ['op', many('capability')]) set = wrap(set, ['op', many('capability')])
@internationalizeDocstring
def unset(self, irc, msg, args, channel, capabilities): def unset(self, irc, msg, args, channel, capabilities):
"""[<channel>] <capability> [<capability> ...] """[<channel>] <capability> [<capability> ...]
@ -675,14 +708,15 @@ class Channel(callbacks.Plugin):
fail.append(c) fail.append(c)
ircdb.channels.setChannel(channel, chan) ircdb.channels.setChannel(channel, chan)
if fail: if fail:
s = 'capability' s = _('capability')
if len(fail) > 1: if len(fail) > 1:
s = utils.str.pluralize(s) 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) Raise=True)
irc.replySuccess() irc.replySuccess()
unset = wrap(unset, ['op', many('capability')]) unset = wrap(unset, ['op', many('capability')])
@internationalizeDocstring
def list(self, irc, msg, args, channel): def list(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -694,6 +728,7 @@ class Channel(callbacks.Plugin):
irc.reply(' '.join(L)) irc.reply(' '.join(L))
list = wrap(list, ['channel']) list = wrap(list, ['channel'])
@internationalizeDocstring
def disable(self, irc, msg, args, channel, plugin, command): def disable(self, irc, msg, args, channel, plugin, command):
"""[<channel>] [<plugin>] [<command>] """[<channel>] [<plugin>] [<command>]
@ -711,15 +746,15 @@ class Channel(callbacks.Plugin):
if plugin.isCommand(command): if plugin.isCommand(command):
s = '-%s.%s' % (plugin.name(), command) s = '-%s.%s' % (plugin.name(), command)
else: else:
failMsg = format('The %s plugin does not have a command ' failMsg = format(_('The %s plugin does not have a command '
'called %s.', plugin.name(), command) 'called %s.'), plugin.name(), command)
elif command: elif command:
# findCallbackForCommand # findCallbackForCommand
if filter(None, irc.findCallbacksForArgs([command])): if filter(None, irc.findCallbacksForArgs([command])):
s = '-%s' % command s = '-%s' % command
else: else:
failMsg = format('No plugin or command named %s could be ' failMsg = format(_('No plugin or command named %s could be '
'found.', command) 'found.'), command)
else: else:
raise callbacks.ArgumentError raise callbacks.ArgumentError
if failMsg: if failMsg:
@ -732,6 +767,7 @@ class Channel(callbacks.Plugin):
optional(('plugin', False)), optional(('plugin', False)),
additional('commandName')]) additional('commandName')])
@internationalizeDocstring
def enable(self, irc, msg, args, channel, plugin, command): def enable(self, irc, msg, args, channel, plugin, command):
"""[<channel>] [<plugin>] [<command>] """[<channel>] [<plugin>] [<command>]
@ -749,15 +785,15 @@ class Channel(callbacks.Plugin):
if plugin.isCommand(command): if plugin.isCommand(command):
s = '-%s.%s' % (plugin.name(), command) s = '-%s.%s' % (plugin.name(), command)
else: else:
failMsg = format('The %s plugin does not have a command ' failMsg = format(_('The %s plugin does not have a command '
'called %s.', plugin.name(), command) 'called %s.'), plugin.name(), command)
elif command: elif command:
# findCallbackForCommand # findCallbackForCommand
if filter(None, irc.findCallbacksForArgs([command])): if filter(None, irc.findCallbacksForArgs([command])):
s = '-%s' % command s = '-%s' % command
else: else:
failMsg = format('No plugin or command named %s could be ' failMsg = format(_('No plugin or command named %s could be '
'found.', command) 'found.'), command)
else: else:
raise callbacks.ArgumentError raise callbacks.ArgumentError
if failMsg: if failMsg:
@ -770,13 +806,14 @@ class Channel(callbacks.Plugin):
fail.append(s) fail.append(s)
ircdb.channels.setChannel(channel, chan) ircdb.channels.setChannel(channel, chan)
if fail: if fail:
irc.error(format('%s was not disabled.', s[1:])) irc.error(format(_('%s was not disabled.'), s[1:]))
else: else:
irc.replySuccess() irc.replySuccess()
enable = wrap(enable, ['op', enable = wrap(enable, ['op',
optional(('plugin', False)), optional(('plugin', False)),
additional('commandName')]) additional('commandName')])
@internationalizeDocstring
def nicks(self, irc, msg, args, channel): def nicks(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -789,24 +826,26 @@ class Channel(callbacks.Plugin):
msg.args[0] != channel and \ msg.args[0] != channel and \
(ircutils.isChannel(msg.args[0]) or \ (ircutils.isChannel(msg.args[0]) or \
msg.nick not in irc.state.channels[channel].users): 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) L = list(irc.state.channels[channel].users)
utils.sortBy(str.lower, L) utils.sortBy(str.lower, L)
irc.reply(utils.str.commaAndify(L)) irc.reply(utils.str.commaAndify(L))
nicks = wrap(nicks, ['inChannel']) nicks = wrap(nicks, ['inChannel'])
@internationalizeDocstring
def alertOps(self, irc, channel, s, frm=None): def alertOps(self, irc, channel, s, frm=None):
"""Internal message for notifying all the #channel,ops in a channel of """Internal message for notifying all the #channel,ops in a channel of
a given situation.""" a given situation."""
capability = ircdb.makeChannelCapability(channel, 'op') 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: if frm is not None:
s += format(' (from %s)', frm) s += format(_(' (from %s)'), frm)
for nick in irc.state.channels[channel].users: for nick in irc.state.channels[channel].users:
hostmask = irc.state.nickToHostmask(nick) hostmask = irc.state.nickToHostmask(nick)
if ircdb.checkCapability(hostmask, capability): if ircdb.checkCapability(hostmask, capability):
irc.reply(s, to=nick, private=True) irc.reply(s, to=nick, private=True)
@internationalizeDocstring
def alert(self, irc, msg, args, channel, text): def alert(self, irc, msg, args, channel, text):
"""[<channel>] <text> """[<channel>] <text>

View File

@ -30,6 +30,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('ChannelLogger')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -41,50 +43,50 @@ def configure(advanced):
ChannelLogger = conf.registerPlugin('ChannelLogger') ChannelLogger = conf.registerPlugin('ChannelLogger')
conf.registerChannelValue(ChannelLogger, 'enable', conf.registerChannelValue(ChannelLogger, 'enable',
registry.Boolean(True, """Determines whether logging is enabled.""")) registry.Boolean(True, _("""Determines whether logging is enabled.""")))
conf.registerGlobalValue(ChannelLogger, 'flushImmediately', 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 flushed anytime they're written to, rather than being buffered by the
operating system.""")) operating system.""")))
conf.registerChannelValue(ChannelLogger, 'stripFormatting', conf.registerChannelValue(ChannelLogger, 'stripFormatting',
registry.Boolean(True, """Determines whether formatting characters (such registry.Boolean(True, _("""Determines whether formatting characters (such
as bolding, color, etc.) are removed when writing the logs to disk.""")) as bolding, color, etc.) are removed when writing the logs to disk.""")))
conf.registerChannelValue(ChannelLogger, 'timestamp', conf.registerChannelValue(ChannelLogger, 'timestamp',
registry.Boolean(True, """Determines whether the logs for this channel are registry.Boolean(True, _("""Determines whether the logs for this channel are
timestamped with the timestamp in supybot.log.timestampFormat.""")) timestamped with the timestamp in supybot.log.timestampFormat.""")))
conf.registerChannelValue(ChannelLogger, 'noLogPrefix', 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 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', 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 rotate the logs for this channel. The bot will rotate logs when the
timestamp for the log changes. The timestamp is set according to timestamp for the log changes. The timestamp is set according to
the 'filenameTimestamp' configuration variable.""")) the 'filenameTimestamp' configuration variable.""")))
conf.registerChannelValue(ChannelLogger, 'filenameTimestamp', 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 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 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 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 for your logs to be rotated, you'll also have to enable
supybot.plugins.ChannelLogger.rotateLogs.""")) supybot.plugins.ChannelLogger.rotateLogs.""")))
conf.registerGlobalValue(ChannelLogger, 'directories', conf.registerGlobalValue(ChannelLogger, 'directories',
registry.Boolean(True, """Determines whether the bot will partition its registry.Boolean(True, _("""Determines whether the bot will partition its
channel logs into separate directories based on different criteria.""")) channel logs into separate directories based on different criteria.""")))
conf.registerGlobalValue(ChannelLogger.directories, 'network', conf.registerGlobalValue(ChannelLogger.directories, 'network',
registry.Boolean(True, """Determines whether the bot will use a network registry.Boolean(True, _("""Determines whether the bot will use a network
directory if using directories.""")) directory if using directories.""")))
conf.registerGlobalValue(ChannelLogger.directories, 'channel', conf.registerGlobalValue(ChannelLogger.directories, 'channel',
registry.Boolean(True, """Determines whether the bot will use a channel registry.Boolean(True, _("""Determines whether the bot will use a channel
directory if using directories.""")) directory if using directories.""")))
conf.registerGlobalValue(ChannelLogger.directories, 'timestamp', 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) (determined by supybot.plugins.ChannelLogger.directories.timestamp.format)
if using directories.""")) if using directories.""")))
conf.registerGlobalValue(ChannelLogger.directories.timestamp, 'format', 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 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: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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."

View File

@ -0,0 +1,97 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -39,6 +39,8 @@ import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.registry as registry import supybot.registry as registry
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('ChannelLogger')
class FakeLog(object): class FakeLog(object):
def flush(self): def flush(self):

View File

@ -31,6 +31,9 @@ import re
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('ChannelStats')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -54,16 +57,16 @@ class Smileys(registry.Value):
ChannelStats = conf.registerPlugin('ChannelStats') ChannelStats = conf.registerPlugin('ChannelStats')
conf.registerChannelValue(ChannelStats, 'selfStats', 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 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', 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 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', 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 (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: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>, 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 <progval@gmail.com>\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 "<empty>"
#: 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 ""
#~ "[<channel>] [<name>]\n"
#~ "\n"
#~ " Returns the statistics for <name> on <channel>. <channel> is "
#~ "only\n"
#~ " necessary if the message isn't sent on the channel itself. If "
#~ "<name>\n"
#~ " isn't given, it defaults to the user sending the command.\n"
#~ " "
#~ msgstr ""
#~ "[<canal>] [nom]\n"
#~ "\n"
#~ " Retourne les statistiques pour <nom> sur le <canal>. <canal> n'est "
#~ "nécessaire que si le message n'est pas envoyé sur le canal lui-même. Si "
#~ "<nom> n'est pas donné, il correspond par défaut à l'utilisateur envoyant "
#~ "la commande"
#~ msgid ""
#~ "[<channel>] <stat expression>\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 ""
#~ "[<canal>] <expression de statistiques>\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 ""
#~ "[<channel>]\n"
#~ "\n"
#~ " Returns the statistics for <channel>. <channel> is only "
#~ "necessary if\n"
#~ " the message isn't sent on the channel itself.\n"
#~ " "
#~ msgstr ""
#~ "[canal]\n"
#~ "\n"
#~ "Retourne les statistiques pour le <canal>. <canal> n'est nécessaire que "
#~ "si le message n'est pas envoyé sur le canal lui-même."

View File

@ -0,0 +1,165 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"[<channel>] [<name>]\n"
"\n"
" Returns the statistics for <name> on <channel>. <channel> is only\n"
" necessary if the message isn't sent on the channel itself. If <name>\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 ""
"[<channel>] <stat expression>\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 ""
"[<channel>]\n"
"\n"
" Returns the statistics for <channel>. <channel> 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 ""

View File

@ -34,6 +34,7 @@ import types
import supybot.log as log import supybot.log as log
import supybot.conf as conf import supybot.conf as conf
from supybot.i18n import PluginInternationalization, internationalizeDocstring
import supybot.utils as utils import supybot.utils as utils
import supybot.world as world import supybot.world as world
import supybot.ircdb as ircdb import supybot.ircdb as ircdb
@ -44,6 +45,8 @@ import supybot.plugins as plugins
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
_ = PluginInternationalization('ChannelStats')
class ChannelStat(irclib.IrcCommandDispatcher): class ChannelStat(irclib.IrcCommandDispatcher):
_values = ['actions', 'chars', 'frowns', 'joins', 'kicks','modes', _values = ['actions', 'chars', 'frowns', 'joins', 'kicks','modes',
'msgs', 'parts', 'quits', 'smileys', 'topics', 'words', 'users'] 'msgs', 'parts', 'quits', 'smileys', 'topics', 'words', 'users']
@ -238,6 +241,7 @@ class ChannelStats(callbacks.Plugin):
self.db[channel, id] = UserStat() self.db[channel, id] = UserStat()
self.db.channels[channel][id].kicked += 1 self.db.channels[channel][id].kicked += 1
@internationalizeDocstring
def stats(self, irc, msg, args, channel, name): def stats(self, irc, msg, args, channel, name):
"""[<channel>] [<name>] """[<channel>] [<name>]
@ -252,7 +256,7 @@ class ChannelStats(callbacks.Plugin):
id = ircdb.users.getUserId(msg.prefix) id = ircdb.users.getUserId(msg.prefix)
name = ircdb.users.getUser(id).name name = ircdb.users.getUser(id).name
except KeyError: 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 return
elif not ircdb.users.hasUser(name): elif not ircdb.users.hasUser(name):
try: try:
@ -265,36 +269,37 @@ class ChannelStats(callbacks.Plugin):
id = ircdb.users.getUserId(name) id = ircdb.users.getUserId(name)
try: try:
stats = self.db.getUserStats(channel, id) stats = self.db.getUserStats(channel, id)
s = format('%s has sent %n; a total of %n, %n, ' s = format(_('%s has sent %n; a total of %n, %n, '
'%n, and %n; %s of those messages %s' '%n, and %n; %s of those messages %s. '
'%s has joined %n, parted %n, quit %n, ' '%s has joined %n, parted %n, quit %n, '
'kicked someone %n, been kicked %n, ' 'kicked someone %n, been kicked %n, '
'changed the topic %n, and changed the ' 'changed the topic %n, and changed the '
'mode %n.', 'mode %n.'),
name, (stats.msgs, 'message'), name, (stats.msgs, 'message'),
(stats.chars, 'character'), (stats.chars, _('character')),
(stats.words, 'word'), (stats.words, _('word')),
(stats.smileys, 'smiley'), (stats.smileys, _('smiley')),
(stats.frowns, 'frown'), (stats.frowns, _('frown')),
stats.actions, stats.actions,
stats.actions == 1 and 'was an ACTION. ' stats.actions == 1 and _('was an ACTION')
or 'were ACTIONs. ', or _('were ACTIONs'),
name, name,
(stats.joins, 'time'), (stats.joins, _('time')),
(stats.parts, 'time'), (stats.parts, _('time')),
(stats.quits, 'time'), (stats.quits, _('time')),
(stats.kicks, 'time'), (stats.kicks, _('time')),
(stats.kicked, 'time'), (stats.kicked, _('time')),
(stats.topics, 'time'), (stats.topics, _('time')),
(stats.modes, 'time')) (stats.modes, _('time')))
irc.reply(s) irc.reply(s)
except KeyError: 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)) name, channel))
stats = wrap(stats, ['channeldb', additional('something')]) stats = wrap(stats, ['channeldb', additional('something')])
_env = {'__builtins__': types.ModuleType('__builtins__')} _env = {'__builtins__': types.ModuleType('__builtins__')}
_env.update(math.__dict__) _env.update(math.__dict__)
@internationalizeDocstring
def rank(self, irc, msg, args, channel, expr): def rank(self, irc, msg, args, channel, expr):
"""[<channel>] <stat expression> """[<channel>] <stat expression>
@ -307,11 +312,11 @@ class ChannelStats(callbacks.Plugin):
# XXX I could do this the right way, and abstract out a safe eval, # XXX I could do this the right way, and abstract out a safe eval,
# or I could just copy/paste from the Math plugin. # or I could just copy/paste from the Math plugin.
if expr != expr.translate(utils.str.chars, '_[]'): 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 ' 'underscores or brackets in your mathematical '
'expression. Please remove them.', Raise=True) 'expression. Please remove them.'), Raise=True)
if 'lambda' in expr: 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() expr = expr.lower()
users = [] users = []
for ((c, id), stats) in self.db.items(): for ((c, id), stats) in self.db.items():
@ -325,7 +330,7 @@ class ChannelStats(callbacks.Plugin):
except ZeroDivisionError: except ZeroDivisionError:
v = float('inf') v = float('inf')
except NameError, e: except NameError, e:
irc.errorInvalid('stat variable', str(e).split()[1]) irc.errorInvalid(_('stat variable'), str(e).split()[1])
except Exception, e: except Exception, e:
irc.error(utils.exnToString(e), Raise=True) irc.error(utils.exnToString(e), Raise=True)
if id == 0: if id == 0:
@ -339,6 +344,7 @@ class ChannelStats(callbacks.Plugin):
irc.reply(s) irc.reply(s)
rank = wrap(rank, ['channeldb', 'text']) rank = wrap(rank, ['channeldb', 'text'])
@internationalizeDocstring
def channelstats(self, irc, msg, args, channel): def channelstats(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -348,29 +354,29 @@ class ChannelStats(callbacks.Plugin):
try: try:
stats = self.db.getChannelStats(channel) stats = self.db.getChannelStats(channel)
curUsers = len(irc.state.channels[channel].users) 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; ' 'characters, %n, %n, and %n; '
'%i of those messages %s. There have been ' '%i of those messages %s. There have been '
'%n, %n, %n, %n, %n, and %n. There %b currently %n ' '%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, channel, stats.msgs, stats.msgs, stats.chars,
(stats.words, 'word'), (stats.words, _('word')),
(stats.smileys, 'smiley'), (stats.smileys, _('smiley')),
(stats.frowns, 'frown'), (stats.frowns, _('frown')),
stats.actions, stats.actions == 1 and 'was an ACTION' stats.actions, stats.actions == 1 and _('was an ACTION')
or 'were ACTIONs', or _('were ACTIONs'),
(stats.joins, 'join'), (stats.joins, _('join')),
(stats.parts, 'part'), (stats.parts, _('part')),
(stats.quits, 'quit'), (stats.quits, _('quit')),
(stats.kicks, 'kick'), (stats.kicks, _('kick')),
(stats.modes, 'mode', 'change'), (stats.modes, _('mode'), _('change')),
(stats.topics, 'topic', 'change'), (stats.topics, _('topic'), _('change')),
curUsers, curUsers,
(curUsers, 'user'), (curUsers, _('user')),
(stats.users, 'user')) (stats.users, _('user')))
irc.reply(s) irc.reply(s)
except KeyError: 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']) channelstats = wrap(channelstats, ['channeldb'])

View File

@ -30,6 +30,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Config')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is

156
plugins/Config/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<group>\n"
"\n"
" Returns the configuration variables available under the given\n"
" configuration <group>. 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 ""
"<groupe>\n"
"\n"
"Retourne les variables de configuration qui sont dans le <groupe> 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 ""
"<word>\n"
"\n"
" Searches for <word> in the current configuration variables.\n"
" "
msgstr ""
"<mot>\n"
"\n"
"Recherche le <mot> 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 ""
"[<channel>] <name> [<value>]\n"
"\n"
" If <value> is given, sets the channel configuration variable for <name>\n"
" to <value> for <channel>. Otherwise, returns the current channel\n"
" configuration value of <name>. <channel> is only necessary if the\n"
" message isn't sent in the channel itself."
msgstr ""
"[<canal>] <nom> [<valeur>]\n"
"\n"
"Si la <valeur> est donnée, défini la variable de configuration <nom> à <valeur> sur le <canal>. Sinon, retourne la configuration actuelle du <canal> pour <nom>. <canal> 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 ""
"<name> [<value>]\n"
"\n"
" If <value> is given, sets the value of <name> to <value>. Otherwise,\n"
" returns the current value of <name>. You may omit the leading\n"
" \"supybot.\" in the name if you so choose.\n"
" "
msgstr ""
"<nom> [<valeur>]\n"
"\n"
"Si la <valeur> est donnée, défini la variable de configuration <nom> à <valeur>. Sinon, retourne la configuration actuelle de <nom>. Vous pouvez omettre le 'supybot.' au début du <nom>."
#: plugin.py:234
msgid ""
"<name>\n"
"\n"
" Returns the description of the configuration variable <name>.\n"
" "
msgstr ""
"<nom>\n"
"\n"
"Retourne la description de la variable de configuration <nom>."
#: 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 ""
"<name>\n"
"\n"
" Returns the default value of the configuration variable <name>.\n"
" "
msgstr ""
"<nom>\n"
"\n"
"Retourne la valeur par défaut de la variable de configuration <nom>."
#: 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 ""
"<filename>\n"
"\n"
" Exports the public variables of your configuration to <filename>.\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 ""
"<nom de fichier>\n"
"\n"
"Exporte les variables de configuration publiques dans le fichier<nom de fichier. Si vous voulez donner à quelqu'un votre fichierde configuration, mais que vous ne voulez pas que cette personnepuisse voir des choses comme les mot de passe, ... cette commandedébarrasse le fichier de configuration exporté des données qui nedoivent pas être publiques."

142
plugins/Config/messages.pot Normal file
View File

@ -0,0 +1,142 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<group>\n"
"\n"
" Returns the configuration variables available under the given\n"
" configuration <group>. 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 ""
"<word>\n"
"\n"
" Searches for <word> 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 ""
"[<channel>] <name> [<value>]\n"
"\n"
" If <value> is given, sets the channel configuration variable for <name>\n"
" to <value> for <channel>. Otherwise, returns the current channel\n"
" configuration value of <name>. <channel> 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 ""
"<name> [<value>]\n"
"\n"
" If <value> is given, sets the value of <name> to <value>. Otherwise,\n"
" returns the current value of <name>. You may omit the leading\n"
" \"supybot.\" in the name if you so choose.\n"
" "
msgstr ""
#: plugin.py:234
#, docstring
msgid ""
"<name>\n"
"\n"
" Returns the description of the configuration variable <name>.\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 ""
"<name>\n"
"\n"
" Returns the default value of the configuration variable <name>.\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 ""
"<filename>\n"
"\n"
" Exports the public variables of your configuration to <filename>.\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 ""

View File

@ -41,6 +41,8 @@ from supybot.utils.iter import all
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.registry as registry import supybot.registry as registry
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Config')
### ###
# Now, to setup the registry. # Now, to setup the registry.
@ -98,13 +100,13 @@ def getConfigVar(irc, msg, args, state):
state.args.append(group) state.args.append(group)
del args[0] del args[0]
except registry.InvalidRegistryName, e: except registry.InvalidRegistryName, e:
state.errorInvalid('configuration variable', str(e)) state.errorInvalid(_('configuration variable'), str(e))
addConverter('configVar', getConfigVar) addConverter('configVar', getConfigVar)
def getSettableConfigVar(irc, msg, args, state): def getSettableConfigVar(irc, msg, args, state):
getConfigVar(irc, msg, args, state) getConfigVar(irc, msg, args, state)
if not hasattr(state.args[-1], 'set'): if not hasattr(state.args[-1], 'set'):
state.errorInvalid('settable configuration variable', state.errorInvalid(_('settable configuration variable'),
state.args[-1]._name) state.args[-1]._name)
addConverter('settableConfigVar', getSettableConfigVar) addConverter('settableConfigVar', getSettableConfigVar)
@ -129,6 +131,7 @@ class Config(callbacks.Plugin):
utils.sortBy(str.lower, L) utils.sortBy(str.lower, L)
return L return L
@internationalizeDocstring
def list(self, irc, msg, args, group): def list(self, irc, msg, args, group):
"""<group> """<group>
@ -142,16 +145,18 @@ class Config(callbacks.Plugin):
if L: if L:
irc.reply(format('%L', L)) irc.reply(format('%L', L))
else: 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']) list = wrap(list, ['configVar'])
@internationalizeDocstring
def search(self, irc, msg, args, word): def search(self, irc, msg, args, word):
"""<word> """<word>
Searches for <word> in the current configuration variables. Searches for <word> in the current configuration variables.
""" """
L = [] L = []
for (name, _) in conf.supybot.getValues(getChildren=True): for (name, x) in conf.supybot.getValues(getChildren=True):
if word in name.lower(): if word in name.lower():
possibleChannel = registry.split(name)[-1] possibleChannel = registry.split(name)[-1]
if not ircutils.isChannel(possibleChannel): if not ircutils.isChannel(possibleChannel):
@ -159,14 +164,14 @@ class Config(callbacks.Plugin):
if L: if L:
irc.reply(format('%L', L)) irc.reply(format('%L', L))
else: 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? search = wrap(search, ['lowered']) # XXX compose with withoutSpaces?
def _getValue(self, irc, msg, group, addChannel=False): def _getValue(self, irc, msg, group, addChannel=False):
value = str(group) or ' ' value = str(group) or ' '
if addChannel and irc.isChannel(msg.args[0]) and not irc.nested: if addChannel and irc.isChannel(msg.args[0]) and not irc.nested:
s = str(group.get(msg.args[0])) 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 hasattr(group, 'value'):
if not group._private: if not group._private:
irc.reply(value) irc.reply(value)
@ -177,9 +182,9 @@ class Config(callbacks.Plugin):
else: else:
irc.errorNoCapability(capability) irc.errorNoCapability(capability)
else: 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 ' 'command in this plugin to see what variables are '
'available in this group.') 'available in this group.'))
def _setValue(self, irc, msg, group, value): def _setValue(self, irc, msg, group, value):
capability = getCapability(group._name) capability = getCapability(group._name)
@ -190,6 +195,7 @@ class Config(callbacks.Plugin):
else: else:
irc.errorNoCapability(capability) irc.errorNoCapability(capability)
@internationalizeDocstring
def channel(self, irc, msg, args, channel, group, value): def channel(self, irc, msg, args, channel, group, value):
"""[<channel>] <name> [<value>] """[<channel>] <name> [<value>]
@ -198,8 +204,8 @@ class Config(callbacks.Plugin):
configuration value of <name>. <channel> is only necessary if the configuration value of <name>. <channel> is only necessary if the
message isn't sent in the channel itself.""" message isn't sent in the channel itself."""
if not group.channelValue: if not group.channelValue:
irc.error('That configuration variable is not a channel-specific ' irc.error(_('That configuration variable is not a channel-specific '
'configuration variable.') 'configuration variable.'))
return return
group = group.get(channel) group = group.get(channel)
if value is not None: if value is not None:
@ -209,6 +215,7 @@ class Config(callbacks.Plugin):
channel = wrap(channel, ['channel', 'settableConfigVar', channel = wrap(channel, ['channel', 'settableConfigVar',
additional('text')]) additional('text')])
@internationalizeDocstring
def config(self, irc, msg, args, group, value): def config(self, irc, msg, args, group, value):
"""<name> [<value>] """<name> [<value>]
@ -222,6 +229,7 @@ class Config(callbacks.Plugin):
self._getValue(irc, msg, group, addChannel=group.channelValue) self._getValue(irc, msg, group, addChannel=group.channelValue)
config = wrap(config, ['settableConfigVar', additional('text')]) config = wrap(config, ['settableConfigVar', additional('text')])
@internationalizeDocstring
def help(self, irc, msg, args, group): def help(self, irc, msg, args, group):
"""<name> """<name>
@ -231,16 +239,17 @@ class Config(callbacks.Plugin):
s = group.help() s = group.help()
if s: if s:
if hasattr(group, 'value') and not group._private: if hasattr(group, 'value') and not group._private:
s += ' (Current value: %s)' % group s += _(' (Current value: %s)') % group
irc.reply(s) irc.reply(s)
else: else:
irc.reply('That configuration group exists, but seems to have ' irc.reply(_('That configuration group exists, but seems to '
'no help. Try "config list %s" to see if it has ' 'have no help. Try "config list %s" to see if it '
'any children values.' % group._name) 'has any children values.') % group._name)
else: else:
irc.error('%s has no help.' % group._name) irc.error(_('%s has no help.') % group._name)
help = wrap(help, ['configVar']) help = wrap(help, ['configVar'])
@internationalizeDocstring
def default(self, irc, msg, args, group): def default(self, irc, msg, args, group):
"""<name> """<name>
@ -250,6 +259,7 @@ class Config(callbacks.Plugin):
irc.reply(str(v)) irc.reply(str(v))
default = wrap(default, ['settableConfigVar']) default = wrap(default, ['settableConfigVar'])
@internationalizeDocstring
def reload(self, irc, msg, args): def reload(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -260,6 +270,7 @@ class Config(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
reload = wrap(reload, [('checkCapability', 'owner')]) reload = wrap(reload, [('checkCapability', 'owner')])
@internationalizeDocstring
def export(self, irc, msg, args, filename): def export(self, irc, msg, args, filename):
"""<filename> """<filename>

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Ctcp')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is

19
plugins/Ctcp/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 !"

21
plugins/Ctcp/messages.pot Normal file
View File

@ -0,0 +1,21 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -36,6 +36,8 @@ import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.schedule as schedule import supybot.schedule as schedule
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Ctcp')
class Ctcp(callbacks.PluginRegexp): class Ctcp(callbacks.PluginRegexp):
public = False public = False
@ -98,8 +100,8 @@ class Ctcp(callbacks.PluginRegexp):
def ctcpFinger(self, irc, msg, match): def ctcpFinger(self, irc, msg, match):
"\x01FINGER\x01" "\x01FINGER\x01"
self.log.info('Received CTCP FINGER from %s', msg.prefix) self.log.info('Received CTCP FINGER from %s', msg.prefix)
self._reply(irc, msg, self._reply(irc, msg, 'FINGER ' +
'FINGER Supybot, the best Python IRC bot in existence!') _('Supybot, the best Python IRC bot in existence!'))
def ctcpSource(self, irc, msg, match): def ctcpSource(self, irc, msg, match):
"\x01SOURCE\x01" "\x01SOURCE\x01"
@ -116,6 +118,7 @@ class Ctcp(callbacks.PluginRegexp):
if version == 'VERSION': if version == 'VERSION':
self.versions.setdefault(payload, []).append(msg.nick) self.versions.setdefault(payload, []).append(msg.nick)
@internationalizeDocstring
def version(self, irc, msg, args, channel, optlist): def version(self, irc, msg, args, channel, optlist):
"""[<channel>] [--nicks] """[<channel>] [--nicks]

View File

@ -29,22 +29,24 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Dict')
def configure(advanced): def configure(advanced):
from supybot.questions import output, expect, anything, something, yn from supybot.questions import output, expect, anything, something, yn
conf.registerPlugin('Dict', True) conf.registerPlugin('Dict', True)
output('The default dictd server is dict.org.') output(_('The default dictd server is dict.org.'))
if yn('Would you like to specify a different dictd server?'): if yn(_('Would you like to specify a different dictd server?')):
server = something('What server?') server = something('What server?')
conf.supybot.plugins.Dict.server.set(server) conf.supybot.plugins.Dict.server.set(server)
Dict = conf.registerPlugin('Dict') Dict = conf.registerPlugin('Dict')
conf.registerGlobalValue(Dict, 'server', conf.registerGlobalValue(Dict, 'server',
registry.String('dict.org', """Determines what server the bot will registry.String('dict.org', _("""Determines what server the bot will
retrieve definitions from.""")) retrieve definitions from.""")))
conf.registerChannelValue(Dict, 'default', 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 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: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

86
plugins/Dict/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"[<dictionary>] <word>\n"
"\n"
" Looks up the definition of <word> on the dictd server specified by\n"
" the supybot.plugins.Dict.server config variable.\n"
" "
msgstr ""
"[<dictionnaire>] <mot>\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"

82
plugins/Dict/messages.pot Normal file
View File

@ -0,0 +1,82 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"[<dictionary>] <word>\n"
"\n"
" Looks up the definition of <word> 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 ""

View File

@ -35,6 +35,8 @@ import supybot.utils as utils
from supybot.commands import * from supybot.commands import *
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Dict')
try: try:
dictclient = utils.python.universalImport('dictclient', 'local.dictclient') dictclient = utils.python.universalImport('dictclient', 'local.dictclient')
@ -45,6 +47,7 @@ except ImportError:
class Dict(callbacks.Plugin): class Dict(callbacks.Plugin):
threaded = True threaded = True
@internationalizeDocstring
def dictionaries(self, irc, msg, args): def dictionaries(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -60,6 +63,7 @@ class Dict(callbacks.Plugin):
irc.error(utils.web.strError(e)) irc.error(utils.web.strError(e))
dictionaries = wrap(dictionaries) dictionaries = wrap(dictionaries)
@internationalizeDocstring
def random(self, irc, msg, args): def random(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -74,6 +78,7 @@ class Dict(callbacks.Plugin):
irc.error(utils.web.strError(e)) irc.error(utils.web.strError(e))
random = wrap(random) random = wrap(random)
@internationalizeDocstring
def dict(self, irc, msg, args, words): def dict(self, irc, msg, args, words):
"""[<dictionary>] <word> """[<dictionary>] <word>
@ -98,16 +103,17 @@ class Dict(callbacks.Plugin):
'dictionary: %s.', msg.args[0], default) 'dictionary: %s.', msg.args[0], default)
dictionary = '*' dictionary = '*'
if not words: 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) word = ' '.join(words)
definitions = conn.define(dictionary, word) definitions = conn.define(dictionary, word)
dbs = set() dbs = set()
if not definitions: if not definitions:
if dictionary == '*': 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: else:
irc.reply(format('No definition for %q could be found in %s', irc.reply(format(_('No definition for %q could be found in '
word, ircutils.bold(dictionary))) '%s'), word, ircutils.bold(dictionary)))
return return
L = [] L = []
for d in definitions: for d in definitions:
@ -118,7 +124,7 @@ class Dict(callbacks.Plugin):
L.append('%s: %s' % (db, s)) L.append('%s: %s' % (db, s))
utils.sortBy(len, L) utils.sortBy(len, L)
if dictionary == '*' and len(dbs) > 1: 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: else:
s = '; '.join(L) s = '; '.join(L)
irc.reply(s) irc.reply(s)

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Dunno')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -41,8 +43,8 @@ def configure(advanced):
Dunno = conf.registerPlugin('Dunno') Dunno = conf.registerPlugin('Dunno')
conf.registerChannelValue(Dunno, 'prefixNick', conf.registerChannelValue(Dunno, 'prefixNick',
registry.Boolean(True, """Determines whether the bot will prefix the nick registry.Boolean(True, _("""Determines whether the bot will prefix the nick
of the user giving an invalid command to the "dunno" response.""")) of the user giving an invalid command to the "dunno" response.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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: <x> 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: <x> 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."

View File

@ -0,0 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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: <x> is not a valid command.'\n"
" messages with messages kept in a database, able to give more personable\n"
" responses."
msgstr ""

View File

@ -30,6 +30,8 @@
from supybot.commands import * from supybot.commands import *
import supybot.plugins as plugins import supybot.plugins as plugins
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Dunno')
class Dunno(plugins.ChannelIdDatabasePlugin): class Dunno(plugins.ChannelIdDatabasePlugin):
"""This plugin was written initially to work with MoobotFactoids, the two """This plugin was written initially to work with MoobotFactoids, the two
@ -49,7 +51,7 @@ class Dunno(plugins.ChannelIdDatabasePlugin):
env = {'command': tokens[0]} env = {'command': tokens[0]}
dunno = ircutils.standardSubstitute(irc, msg, dunno, env=env) dunno = ircutils.standardSubstitute(irc, msg, dunno, env=env)
irc.reply(dunno, prefixNick=prefixNick) irc.reply(dunno, prefixNick=prefixNick)
Dunno = internationalizeDocstring(Dunno)
Class = Dunno Class = Dunno

View File

@ -30,6 +30,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Factoids')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -46,22 +48,22 @@ class FactoidFormat(registry.TemplatedString):
Factoids = conf.registerPlugin('Factoids') Factoids = conf.registerPlugin('Factoids')
conf.registerChannelValue(Factoids, 'learnSeparator', 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 <key> as <value>. Users might learn command. Defaults to 'as' -- learn <key> as <value>. Users might
feel more comfortable with 'is' or something else, so it's feel more comfortable with 'is' or something else, so it's
configurable.""")) configurable.""")))
conf.registerChannelValue(Factoids, 'showFactoidIfOnlyOneMatch', 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 single matching factoid if only one factoid matches when using the search
command.""")) command.""")))
conf.registerChannelValue(Factoids, 'replyWhenInvalidCommand', 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 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', 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 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" 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: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 <key> as <value>. 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 <clef> as <valeur>. 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 ""
"[<channel>] <key> %s <value>\n"
"\n"
" Associates <key> with <value>. <channel> 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 ""
"[<canal>] <clef> %s <valeur>\n"
"\n"
"Associer la <clef> avec la <valeur>. <canal> 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 ""
"[<channel>] <key> [<number>]\n"
"\n"
" Looks up the value of <key> in the factoid database. If given a\n"
" number, will return only that exact factoid. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <clef> [<nombre>]\n"
"\n"
"Regarde la valeur de la <clef> dans la base de données de factoids. Si un <nombre> est donné, retourne la factoid exacte. <canal> 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 ""
"[<channel>] <key>\n"
"\n"
" Locks the factoid(s) associated with <key> so that they cannot be\n"
" removed or added to. <channel> is only necessary if the message isn't\n"
" sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <clef>\n"
"\n"
"Verrouille la/les factoid(s) associé(e) à la <clef>, pour qu'elles ne puissent plus être supprimées ou modifiées. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:245
msgid ""
"[<channel>] <key>\n"
"\n"
" Unlocks the factoid(s) associated with <key> so that they can be\n"
" removed or added to. <channel> is only necessary if the message isn't\n"
" sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <clef>\n"
"\n"
"Verrouille la/les factoid(s) associé(e) à la <clef>, pour qu'elles puissent être supprimées ou modifiées. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:260
msgid ""
"[<channel>] <key> [<number>|*]\n"
"\n"
" Removes the factoid <key> 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. <channel> is only necessary if\n"
" the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <clef> [<nombre>|*]\n"
"\n"
"Enlève la factoid <clef> de la base de données. Si il y a plus d'une factoid avec cette clef, un <nombre> est requis pour déterminer laquelle sera supprimée. Un joker * peut être utilisé pour enlever toutes les factoids avec cette clef. <canal> 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 ""
"[<channel>]\n"
"\n"
" Returns a random factoid from the database for <channel>. <channel>\n"
" is only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>]\n"
"\n"
"Retourne une factoid aléatoire de la base de données pour le canal. <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 ""
"[<channel>] <key>\n"
"\n"
" Gives information about the factoid(s) associated with <key>.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
"[<canal>] <clef>\n"
"\n"
"Donne des informations sur la/les factoid(s) associée(s) à la <clef>. <canal> 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 ""
"[<channel>] <key> <number> <regexp>\n"
"\n"
" Changes the factoid #<number> associated with <key> according to\n"
" <regexp>.\n"
" "
msgstr ""
"[<canal>] <clef> <nombre> <expression régulière>\n"
"\n"
"Change la factoid <nombre> associée à la <clef>, en accord avec l'<expression régulière>. <canal> 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 ""
"[<channel>] [--values] [--{regexp} <value>] [<glob> ...]\n"
"\n"
" Searches the keyspace for keys matching <glob>. 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 ""
"[<canal>] [--values] [--{regexp} <expression régulière>] [<glob>...]\n"
"\n"
"Recherche les clefs correspondant au <glob>. Si --regexp est donné, recherche les clefs correspondantes à l'<expression régulière>. Si --values est donné, recherche parmi les valeurs, plutôt que parmi les clefs. <canal> 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."

View File

@ -0,0 +1,202 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 <key> as <value>. 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 ""
"[<channel>] <key> %s <value>\n"
"\n"
" Associates <key> with <value>. <channel> 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 ""
"[<channel>] <key> [<number>]\n"
"\n"
" Looks up the value of <key> in the factoid database. If given a\n"
" number, will return only that exact factoid. <channel> 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 ""
"[<channel>] <key>\n"
"\n"
" Locks the factoid(s) associated with <key> so that they cannot be\n"
" removed or added to. <channel> is only necessary if the message isn't\n"
" sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:245
#, docstring
msgid ""
"[<channel>] <key>\n"
"\n"
" Unlocks the factoid(s) associated with <key> so that they can be\n"
" removed or added to. <channel> is only necessary if the message isn't\n"
" sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:260
#, docstring
msgid ""
"[<channel>] <key> [<number>|*]\n"
"\n"
" Removes the factoid <key> 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. <channel> 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 ""
"[<channel>]\n"
"\n"
" Returns a random factoid from the database for <channel>. <channel>\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 ""
"[<channel>] <key>\n"
"\n"
" Gives information about the factoid(s) associated with <key>.\n"
" <channel> 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 ""
"[<channel>] <key> <number> <regexp>\n"
"\n"
" Changes the factoid #<number> associated with <key> according to\n"
" <regexp>.\n"
" "
msgstr ""
#: plugin.py:381
msgid "I couldn't find any key %q"
msgstr ""
#: plugin.py:396
#, docstring
msgid ""
"[<channel>] [--values] [--{regexp} <value>] [<glob> ...]\n"
"\n"
" Searches the keyspace for keys matching <glob>. 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 ""

View File

@ -39,6 +39,8 @@ from supybot.commands import *
import supybot.plugins as plugins import supybot.plugins as plugins
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Factoids')
try: try:
import sqlite import sqlite
@ -148,14 +150,14 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
else: else:
irc.error('That factoid is locked.') irc.error('That factoid is locked.')
learn = wrap(learn, ['factoid']) learn = wrap(learn, ['factoid'])
learn._fake__doc__ = """[<channel>] <key> %s <value> learn._fake__doc__ = _("""[<channel>] <key> %s <value>
Associates <key> with <value>. <channel> is only Associates <key> with <value>. <channel> is only
necessary if the message isn't sent on the channel necessary if the message isn't sent on the channel
itself. The word '%s' is necessary to separate the itself. The word '%s' is necessary to separate the
key from the value. It can be changed to another word key from the value. It can be changed to another word
via the learnSeparator registry value. via the learnSeparator registry value.
""" """)
def _lookupFactoid(self, channel, key): def _lookupFactoid(self, channel, key):
@ -174,7 +176,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
try: try:
irc.reply(factoids[number-1]) irc.reply(factoids[number-1])
except IndexError: 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 return
else: else:
env = {'key': key} env = {'key': key}
@ -194,7 +196,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
irc.replies(factoidsS, prefixer=prefixer, irc.replies(factoidsS, prefixer=prefixer,
joiner=', or ', onlyPrefixFirst=True) joiner=', or ', onlyPrefixFirst=True)
elif error: elif error:
irc.error('No factoid matches that key.') irc.error(_('No factoid matches that key.'))
def invalidCommand(self, irc, msg, tokens): def invalidCommand(self, irc, msg, tokens):
if irc.isChannel(msg.args[0]): if irc.isChannel(msg.args[0]):
@ -204,6 +206,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
factoids = self._lookupFactoid(channel, key) factoids = self._lookupFactoid(channel, key)
self._replyFactoids(irc, msg, key, factoids, error=False) self._replyFactoids(irc, msg, key, factoids, error=False)
@internationalizeDocstring
def whatis(self, irc, msg, args, channel, words): def whatis(self, irc, msg, args, channel, words):
"""[<channel>] <key> [<number>] """[<channel>] <key> [<number>]
@ -216,12 +219,13 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
if words[-1].isdigit(): if words[-1].isdigit():
number = int(words.pop()) number = int(words.pop())
if number <= 0: if number <= 0:
irc.errorInvalid('key id') irc.errorInvalid(_('key id'))
key = ' '.join(words) key = ' '.join(words)
factoids = self._lookupFactoid(channel, key) factoids = self._lookupFactoid(channel, key)
self._replyFactoids(irc, msg, key, factoids, number) self._replyFactoids(irc, msg, key, factoids, number)
whatis = wrap(whatis, ['channel', many('something')]) whatis = wrap(whatis, ['channel', many('something')])
@internationalizeDocstring
def lock(self, irc, msg, args, channel, key): def lock(self, irc, msg, args, channel, key):
"""[<channel>] <key> """[<channel>] <key>
@ -236,6 +240,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
irc.replySuccess() irc.replySuccess()
lock = wrap(lock, ['channel', 'text']) lock = wrap(lock, ['channel', 'text'])
@internationalizeDocstring
def unlock(self, irc, msg, args, channel, key): def unlock(self, irc, msg, args, channel, key):
"""[<channel>] <key> """[<channel>] <key>
@ -250,6 +255,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
irc.replySuccess() irc.replySuccess()
unlock = wrap(unlock, ['channel', 'text']) unlock = wrap(unlock, ['channel', 'text'])
@internationalizeDocstring
def forget(self, irc, msg, args, channel, words): def forget(self, irc, msg, args, channel, words):
"""[<channel>] <key> [<number>|*] """[<channel>] <key> [<number>|*]
@ -264,7 +270,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
if words[-1].isdigit(): if words[-1].isdigit():
number = int(words.pop()) number = int(words.pop())
if number <= 0: if number <= 0:
irc.errorInvalid('key id') irc.errorInvalid(_('key id'))
elif words[-1] == '*': elif words[-1] == '*':
words.pop() words.pop()
number = True number = True
@ -276,9 +282,9 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
WHERE key LIKE %s AND WHERE key LIKE %s AND
factoids.key_id=keys.id""", key) factoids.key_id=keys.id""", key)
if cursor.rowcount == 0: 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: 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 factoids WHERE key_id=%s""", id)
cursor.execute("""DELETE FROM keys WHERE key LIKE %s""", key) cursor.execute("""DELETE FROM keys WHERE key LIKE %s""", key)
db.commit() db.commit()
@ -287,20 +293,21 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
if number is not None: if number is not None:
results = cursor.fetchall() results = cursor.fetchall()
try: try:
(_, id) = results[number-1] (foo, id) = results[number-1]
except IndexError: except IndexError:
irc.error('Invalid factoid number.') irc.error(_('Invalid factoid number.'))
return return
cursor.execute("DELETE FROM factoids WHERE id=%s", id) cursor.execute("DELETE FROM factoids WHERE id=%s", id)
db.commit() db.commit()
irc.replySuccess() irc.replySuccess()
else: else:
irc.error('%s factoids have that key. ' irc.error(_('%s factoids have that key. '
'Please specify which one to remove, ' 'Please specify which one to remove, '
'or use * to designate all of them.' % 'or use * to designate all of them.') %
cursor.rowcount) cursor.rowcount)
forget = wrap(forget, ['channel', many('something')]) forget = wrap(forget, ['channel', many('something')])
@internationalizeDocstring
def random(self, irc, msg, args, channel): def random(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -320,9 +327,10 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
L.append('"%s": %s' % (ircutils.bold(key), factoid)) L.append('"%s": %s' % (ircutils.bold(key), factoid))
irc.reply('; '.join(L)) irc.reply('; '.join(L))
else: else:
irc.error('I couldn\'t find a factoid.') irc.error(_('I couldn\'t find a factoid.'))
random = wrap(random, ['channel']) random = wrap(random, ['channel'])
@internationalizeDocstring
def info(self, irc, msg, args, channel, key): def info(self, irc, msg, args, channel, key):
"""[<channel>] <key> """[<channel>] <key>
@ -334,7 +342,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
cursor = db.cursor() cursor = db.cursor()
cursor.execute("SELECT id, locked FROM keys WHERE key LIKE %s", key) cursor.execute("SELECT id, locked FROM keys WHERE key LIKE %s", key)
if cursor.rowcount == 0: if cursor.rowcount == 0:
irc.error('No factoid matches that key.') irc.error(_('No factoid matches that key.'))
return return
(id, locked) = map(int, cursor.fetchone()) (id, locked) = map(int, cursor.fetchone())
cursor.execute("""SELECT added_by, added_at FROM factoids cursor.execute("""SELECT added_by, added_at FROM factoids
@ -347,7 +355,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
counter += 1 counter += 1
added_at = time.strftime(conf.supybot.reply.format.time(), added_at = time.strftime(conf.supybot.reply.format.time(),
time.localtime(int(added_at))) 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)) counter, added_by, added_at))
factoids = '; '.join(L) factoids = '; '.join(L)
s = format('Key %q is %s and has %n associated with it: %s', 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) irc.reply(s)
info = wrap(info, ['channel', 'text']) info = wrap(info, ['channel', 'text'])
@internationalizeDocstring
def change(self, irc, msg, args, channel, key, number, replacer): def change(self, irc, msg, args, channel, key, number, replacer):
"""[<channel>] <key> <number> <regexp> """[<channel>] <key> <number> <regexp>
@ -369,10 +378,10 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
WHERE keys.key LIKE %s AND WHERE keys.key LIKE %s AND
keys.id=factoids.key_id""", key) keys.id=factoids.key_id""", key)
if cursor.rowcount == 0: 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 return
elif cursor.rowcount < number: elif cursor.rowcount < number:
irc.errorInvalid('key id') irc.errorInvalid(_('key id'))
(id, fact) = cursor.fetchall()[number-1] (id, fact) = cursor.fetchall()[number-1]
newfact = replacer(fact) newfact = replacer(fact)
cursor.execute("UPDATE factoids SET fact=%s WHERE id=%s", newfact, id) cursor.execute("UPDATE factoids SET fact=%s WHERE id=%s", newfact, id)
@ -382,6 +391,7 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
'factoidId', 'regexpReplacer']) 'factoidId', 'regexpReplacer'])
_sqlTrans = string.maketrans('*?', '%_') _sqlTrans = string.maketrans('*?', '%_')
@internationalizeDocstring
def search(self, irc, msg, args, channel, optlist, globs): def search(self, irc, msg, args, channel, optlist, globs):
"""[<channel>] [--values] [--{regexp} <value>] [<glob> ...] """[<channel>] [--values] [--{regexp} <value>] [<glob> ...]
@ -418,13 +428,13 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
sql = sql.replace('TARGET', target) sql = sql.replace('TARGET', target)
cursor.execute(sql, formats) cursor.execute(sql, formats)
if cursor.rowcount == 0: if cursor.rowcount == 0:
irc.reply('No keys matched that query.') irc.reply(_('No keys matched that query.'))
elif cursor.rowcount == 1 and \ elif cursor.rowcount == 1 and \
self.registryValue('showFactoidIfOnlyOneMatch', channel): self.registryValue('showFactoidIfOnlyOneMatch', channel):
self.whatis(irc, msg, [channel, cursor.fetchone()[0]]) self.whatis(irc, msg, [channel, cursor.fetchone()[0]])
elif cursor.rowcount > 100: elif cursor.rowcount > 100:
irc.reply('More than 100 keys matched that query; ' irc.reply(_('More than 100 keys matched that query; '
'please narrow your query.') 'please narrow your query.'))
else: else:
keys = [repr(t[0]) for t in cursor.fetchall()] keys = [repr(t[0]) for t in cursor.fetchall()]
s = format('%L', keys) s = format('%L', keys)

View File

@ -29,22 +29,24 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Filter')
Filter = conf.registerPlugin('Filter') Filter = conf.registerPlugin('Filter')
conf.registerGroup(Filter, 'spellit') conf.registerGroup(Filter, 'spellit')
conf.registerGlobalValue(Filter.spellit, conf.registerGlobalValue(Filter.spellit,
'replaceLetters', registry.Boolean(True, """Determines whether or not to 'replaceLetters', registry.Boolean(True, _("""Determines whether or not to
replace letters in the output of spellit.""")) replace letters in the output of spellit.""")))
conf.registerGlobalValue(Filter.spellit, conf.registerGlobalValue(Filter.spellit,
'replacePunctuation', registry.Boolean(True, """Determines whether or not 'replacePunctuation', registry.Boolean(True, _("""Determines whether or not
to replace punctuation in the output of spellit.""")) to replace punctuation in the output of spellit.""")))
conf.registerGlobalValue(Filter.spellit, conf.registerGlobalValue(Filter.spellit,
'replaceNumbers', registry.Boolean(True, """Determines whether or not to 'replaceNumbers', registry.Boolean(True, _("""Determines whether or not to
replace numbers in the output of spellit.""")) replace numbers in the output of spellit.""")))
conf.registerGroup(Filter, 'shrink') conf.registerGroup(Filter, 'shrink')
conf.registerChannelValue(Filter.shrink, 'minimum', conf.registerChannelValue(Filter.shrink, 'minimum',
registry.PositiveInteger(4, """Determines the minimum number of a letters registry.PositiveInteger(4, _("""Determines the minimum number of a letters
in a word before it will be shrunken by the shrink command/filter.""")) in a word before it will be shrunken by the shrink command/filter.""")))
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is

615
plugins/Filter/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"[<channel>] [<command>]\n"
"\n"
" Sets the outFilter of this plugin to be <command>. If no command is\n"
" given, unsets the outFilter. <channel> is only necessary if the\n"
" message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<commande>]\n"
"\n"
"Définit le filtre de sortie de ce plugin pour être <commande>. Si aucune commande n'est définie, supprime le filtre de sortie. <canal> 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 ""
"<text>\n"
"\n"
" Removes all the vowels from <text>. (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 ""
"<texte>\n"
"\n"
"Retire toutes les voyelles du <texte> (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 ""
"<text>\n"
"\n"
" Removes all the spaces from <text>.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Supprime tous les espaces du <texte>."
#: plugin.py:130
msgid ""
"<text>\n"
"\n"
" Returns <text>, with all consecutive duplicated letters removed.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Renvoie le texte, avec toutes les lettres consécutives dupliquées supprimées."
#: plugin.py:143
msgid ""
"<text>\n"
"\n"
" Returns the binary representation of <text>.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne la représentation binaire du <texte>."
#: plugin.py:169
msgid ""
"<text>\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 ""
"<texte>\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 ""
"<hexstring>\n"
"\n"
" Returns the string corresponding to <hexstring>. Obviously,\n"
" <hexstring> must be a string of hexadecimal digits.\n"
" "
msgstr ""
"<chaîne hexadécimale>\n"
"\n"
"Retourne la chaîne correspondant à la <chaîne hexadécimale>. Bien sûr, <chaîne hexadécimale> ne doit contenir que des caractères hexadécimaux."
#: plugin.py:187
msgid "Invalid input."
msgstr "Entrée invalide."
#: plugin.py:192
msgid ""
"<text>\n"
"\n"
" Rotates <text> 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 ""
"<texte>\n"
"\n"
"Déplace chaque caractère du <texte> 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 ""
"<text>\n"
"\n"
" Returns the lisping version of <text>\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne la version zézéyée du texte."
#: plugin.py:234
msgid ""
"<text>\n"
"\n"
" Returns the l33tspeak version of <text>\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne la version l33t du <texte>."
#: plugin.py:254
msgid ""
"<text>\n"
"\n"
" Replies with an especially k-rad translation of <text>.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Répond avec une traduction k-rad du <texte>."
#: plugin.py:270
msgid ""
"<text>\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 ""
"<texte>\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 ""
"<Morse code text>\n"
"\n"
" Does the reverse of the morse command.\n"
" "
msgstr ""
"<texte en Morse>\n"
"\n"
"Fait l'inverse de la commande morse."
#: plugin.py:352
msgid ""
"<text>\n"
"\n"
" Gives the Morse code equivalent of a given string.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Donne le code Morse équivalent à la chaîne donnée."
#: plugin.py:364
msgid ""
"<text>\n"
"\n"
" Reverses <text>.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Inverse le <texte>."
#: plugin.py:381
msgid ""
"<text>\n"
"\n"
" Returns <text> with each character randomly colorized.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le <texte> avec chaque caractère coloré de façon aléatoire."
#: plugin.py:391
msgid ""
"<text>\n"
"\n"
" Returns <text> colorized like a rainbow.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte colorisé comme un arc-en-ciel."
#: plugin.py:402
msgid ""
"<text>\n"
"\n"
" Returns <text> stripped of all color codes.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte en retirant tous les codes de couleur"
#: plugin.py:411
msgid ""
"<text>\n"
"\n"
" Returns <text> as if an AOLuser had said it.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le <texte> comme si un AOLuser l'avait dit."
#: plugin.py:438
msgid ""
"<text>\n"
"\n"
" Returns <text> as if JeffK had said it himself.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le <texte> 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 ""
"<text>\n"
"\n"
" Returns <text>, phonetically spelled out.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le <texte>, épellé phonétiquement"
#: plugin.py:615
msgid ""
"<text>\n"
"\n"
" Returns <text> as GNU/RMS would say it.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le <texte> comme si GNU/RMS l'avait dite."
#: plugin.py:624
msgid ""
"<text>\n"
"\n"
" Returns <text> with each word longer than\n"
" supybot.plugins.Filter.shrink.minimum being shrunken (i.e., like\n"
" \"internationalization\" becomes \"i18n\").\n"
" "
msgstr ""
"<texte>\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 ""
"<text>\n"
"\n"
" Returns <text> with the l's made into r's and r's made into l's.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le <texte> avec les I transormés en r et les r transformés en I."
#: plugin.py:692
msgid ""
"<text>\n"
"\n"
" Returns <text> rotated 180 degrees. Only really works for ASCII\n"
" printable characters.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le <texte> tourné à 180 degrés. Ne marche pour de bon qu'avec des caractères ASCII imprimables"

568
plugins/Filter/messages.pot Normal file
View File

@ -0,0 +1,568 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"[<channel>] [<command>]\n"
"\n"
" Sets the outFilter of this plugin to be <command>. If no command is\n"
" given, unsets the outFilter. <channel> 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 ""
"<text>\n"
"\n"
" Removes all the vowels from <text>. (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 ""
"<text>\n"
"\n"
" Removes all the spaces from <text>.\n"
" "
msgstr ""
#: plugin.py:130
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text>, with all consecutive duplicated letters removed.\n"
" "
msgstr ""
#: plugin.py:143
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns the binary representation of <text>.\n"
" "
msgstr ""
#: plugin.py:169
#, docstring
msgid ""
"<text>\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 ""
"<hexstring>\n"
"\n"
" Returns the string corresponding to <hexstring>. Obviously,\n"
" <hexstring> must be a string of hexadecimal digits.\n"
" "
msgstr ""
#: plugin.py:187
msgid "Invalid input."
msgstr ""
#: plugin.py:192
#, docstring
msgid ""
"<text>\n"
"\n"
" Rotates <text> 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 ""
"<text>\n"
"\n"
" Returns the lisping version of <text>\n"
" "
msgstr ""
#: plugin.py:234
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns the l33tspeak version of <text>\n"
" "
msgstr ""
#: plugin.py:254
#, docstring
msgid ""
"<text>\n"
"\n"
" Replies with an especially k-rad translation of <text>.\n"
" "
msgstr ""
#: plugin.py:270
#, docstring
msgid ""
"<text>\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 ""
"<Morse code text>\n"
"\n"
" Does the reverse of the morse command.\n"
" "
msgstr ""
#: plugin.py:352
#, docstring
msgid ""
"<text>\n"
"\n"
" Gives the Morse code equivalent of a given string.\n"
" "
msgstr ""
#: plugin.py:364
#, docstring
msgid ""
"<text>\n"
"\n"
" Reverses <text>.\n"
" "
msgstr ""
#: plugin.py:381
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> with each character randomly colorized.\n"
" "
msgstr ""
#: plugin.py:391
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> colorized like a rainbow.\n"
" "
msgstr ""
#: plugin.py:402
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> stripped of all color codes.\n"
" "
msgstr ""
#: plugin.py:411
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> as if an AOLuser had said it.\n"
" "
msgstr ""
#: plugin.py:438
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> 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 ""
"<text>\n"
"\n"
" Returns <text>, phonetically spelled out.\n"
" "
msgstr ""
#: plugin.py:615
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> as GNU/RMS would say it.\n"
" "
msgstr ""
#: plugin.py:624
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> 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 ""
"<text>\n"
"\n"
" Returns <text> with the l's made into r's and r's made into l's.\n"
" "
msgstr ""
#: plugin.py:692
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> rotated 180 degrees. Only really works for ASCII\n"
" printable characters.\n"
" "
msgstr ""

View File

@ -39,6 +39,8 @@ from supybot.commands import *
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Filter')
class MyFilterProxy(object): class MyFilterProxy(object):
def reply(self, s): def reply(self, s):
@ -77,6 +79,7 @@ class Filter(callbacks.Plugin):
'scramble', 'morse', 'reverse', 'colorize', 'squish', 'scramble', 'morse', 'reverse', 'colorize', 'squish',
'supa1337', 'colorstrip', 'aol', 'rainbow', 'spellit', 'supa1337', 'colorstrip', 'aol', 'rainbow', 'spellit',
'hebrew', 'undup', 'gnu', 'shrink', 'azn', 'uniud'] 'hebrew', 'undup', 'gnu', 'shrink', 'azn', 'uniud']
@internationalizeDocstring
def outfilter(self, irc, msg, args, channel, command): def outfilter(self, irc, msg, args, channel, command):
"""[<channel>] [<command>] """[<channel>] [<command>]
@ -91,7 +94,7 @@ class Filter(callbacks.Plugin):
self.outFilters.setdefault(channel, []).append(method) self.outFilters.setdefault(channel, []).append(method)
irc.replySuccess() irc.replySuccess()
else: else:
irc.error('That\'s not a valid filter command.') irc.error(_('That\'s not a valid filter command.'))
else: else:
self.outFilters[channel] = [] self.outFilters[channel] = []
irc.replySuccess() irc.replySuccess()
@ -99,6 +102,7 @@ class Filter(callbacks.Plugin):
[('checkChannelCapability', 'op'), [('checkChannelCapability', 'op'),
additional('commandName')]) additional('commandName')])
@internationalizeDocstring
def hebrew(self, irc, msg, args, text): def hebrew(self, irc, msg, args, text):
"""<text> """<text>
@ -110,6 +114,7 @@ class Filter(callbacks.Plugin):
irc.reply(text) irc.reply(text)
hebrew = wrap(hebrew, ['text']) hebrew = wrap(hebrew, ['text'])
@internationalizeDocstring
def squish(self, irc, msg, args, text): def squish(self, irc, msg, args, text):
"""<text> """<text>
@ -119,6 +124,7 @@ class Filter(callbacks.Plugin):
irc.reply(text) irc.reply(text)
squish = wrap(squish, ['text']) squish = wrap(squish, ['text'])
@internationalizeDocstring
def undup(self, irc, msg, args, text): def undup(self, irc, msg, args, text):
"""<text> """<text>
@ -131,6 +137,7 @@ class Filter(callbacks.Plugin):
irc.reply(''.join(L)) irc.reply(''.join(L))
undup = wrap(undup, ['text']) undup = wrap(undup, ['text'])
@internationalizeDocstring
def binary(self, irc, msg, args, text): def binary(self, irc, msg, args, text):
"""<text> """<text>
@ -156,6 +163,7 @@ class Filter(callbacks.Plugin):
irc.reply(''.join(L)) irc.reply(''.join(L))
binary = wrap(binary, ['text']) binary = wrap(binary, ['text'])
@internationalizeDocstring
def hexlify(self, irc, msg, args, text): def hexlify(self, irc, msg, args, text):
"""<text> """<text>
@ -165,6 +173,7 @@ class Filter(callbacks.Plugin):
irc.reply(text.encode('hex_codec')) irc.reply(text.encode('hex_codec'))
hexlify = wrap(hexlify, ['text']) hexlify = wrap(hexlify, ['text'])
@internationalizeDocstring
def unhexlify(self, irc, msg, args, text): def unhexlify(self, irc, msg, args, text):
"""<hexstring> """<hexstring>
@ -174,9 +183,10 @@ class Filter(callbacks.Plugin):
try: try:
irc.reply(text.decode('hex_codec')) irc.reply(text.decode('hex_codec'))
except TypeError: except TypeError:
irc.error('Invalid input.') irc.error(_('Invalid input.'))
unhexlify = wrap(unhexlify, ['text']) unhexlify = wrap(unhexlify, ['text'])
@internationalizeDocstring
def rot13(self, irc, msg, args, text): def rot13(self, irc, msg, args, text):
"""<text> """<text>
@ -187,6 +197,7 @@ class Filter(callbacks.Plugin):
irc.reply(text.encode('rot13')) irc.reply(text.encode('rot13'))
rot13 = wrap(rot13, ['text']) rot13 = wrap(rot13, ['text'])
@internationalizeDocstring
def lithp(self, irc, msg, args, text): def lithp(self, irc, msg, args, text):
"""<text> """<text>
@ -217,6 +228,7 @@ class Filter(callbacks.Plugin):
(re.compile(r'[aA][tT]'), '@'), (re.compile(r'[aA][tT]'), '@'),
(re.compile(r'[sS]\b'), 'z'), (re.compile(r'[sS]\b'), 'z'),
(re.compile(r'x'), '><'),] (re.compile(r'x'), '><'),]
@internationalizeDocstring
def leet(self, irc, msg, args, text): def leet(self, irc, msg, args, text):
"""<text> """<text>
@ -236,6 +248,7 @@ class Filter(callbacks.Plugin):
('D', '|)'), ('B', '|3'), ('I', ']['), ('Vv', '\\/'), ('D', '|)'), ('B', '|3'), ('I', ']['), ('Vv', '\\/'),
('wW', '\\/\\/'), ('d', 'c|'), ('b', '|>'), ('wW', '\\/\\/'), ('d', 'c|'), ('b', '|>'),
('c', '<'), ('h', '|n'),] ('c', '<'), ('h', '|n'),]
@internationalizeDocstring
def supa1337(self, irc, msg, args, text): def supa1337(self, irc, msg, args, text):
"""<text> """<text>
@ -251,6 +264,7 @@ class Filter(callbacks.Plugin):
_scrambleRe = re.compile(r'(?:\b|(?![a-zA-Z]))([a-zA-Z])([a-zA-Z]*)' _scrambleRe = re.compile(r'(?:\b|(?![a-zA-Z]))([a-zA-Z])([a-zA-Z]*)'
r'([a-zA-Z])(?:\b|(?![a-zA-Z]))') r'([a-zA-Z])(?:\b|(?![a-zA-Z]))')
@internationalizeDocstring
def scramble(self, irc, msg, args, text): def scramble(self, irc, msg, args, text):
"""<text> """<text>
@ -315,6 +329,7 @@ class Filter(callbacks.Plugin):
} }
_revMorseCode = dict([(y, x) for (x, y) in _morseCode.items()]) _revMorseCode = dict([(y, x) for (x, y) in _morseCode.items()])
_unmorsere = re.compile('([.-]+)') _unmorsere = re.compile('([.-]+)')
@internationalizeDocstring
def unmorse(self, irc, msg, args, text): def unmorse(self, irc, msg, args, text):
"""<Morse code text> """<Morse code text>
@ -331,6 +346,7 @@ class Filter(callbacks.Plugin):
irc.reply(text) irc.reply(text)
unmorse = wrap(unmorse, ['text']) unmorse = wrap(unmorse, ['text'])
@internationalizeDocstring
def morse(self, irc, msg, args, text): def morse(self, irc, msg, args, text):
"""<text> """<text>
@ -342,6 +358,7 @@ class Filter(callbacks.Plugin):
irc.reply(' '.join(L)) irc.reply(' '.join(L))
morse = wrap(morse, ['text']) morse = wrap(morse, ['text'])
@internationalizeDocstring
def reverse(self, irc, msg, args, text): def reverse(self, irc, msg, args, text):
"""<text> """<text>
@ -350,6 +367,7 @@ class Filter(callbacks.Plugin):
irc.reply(text[::-1]) irc.reply(text[::-1])
reverse = wrap(reverse, ['text']) reverse = wrap(reverse, ['text'])
@internationalizeDocstring
def _color(self, c, fg=None): def _color(self, c, fg=None):
if c == ' ': if c == ' ':
return c return c
@ -357,6 +375,7 @@ class Filter(callbacks.Plugin):
fg = str(random.randint(2, 15)).zfill(2) fg = str(random.randint(2, 15)).zfill(2)
return '\x03%s%s' % (fg, c) return '\x03%s%s' % (fg, c)
@internationalizeDocstring
def colorize(self, irc, msg, args, text): def colorize(self, irc, msg, args, text):
"""<text> """<text>
@ -366,16 +385,18 @@ class Filter(callbacks.Plugin):
irc.reply('%s%s' % (''.join(L), '\x03')) irc.reply('%s%s' % (''.join(L), '\x03'))
colorize = wrap(colorize, ['text']) colorize = wrap(colorize, ['text'])
@internationalizeDocstring
def rainbow(self, irc, msg, args, text): def rainbow(self, irc, msg, args, text):
"""<text> """<text>
Returns <text> colorized like a rainbow. Returns <text> 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] L = [self._color(c, fg=colors.next()) for c in text]
irc.reply(''.join(L) + '\x03') irc.reply(''.join(L) + '\x03')
rainbow = wrap(rainbow, ['text']) rainbow = wrap(rainbow, ['text'])
@internationalizeDocstring
def stripcolor(self, irc, msg, args, text): def stripcolor(self, irc, msg, args, text):
"""<text> """<text>
@ -384,6 +405,7 @@ class Filter(callbacks.Plugin):
irc.reply(ircutils.stripColor(text)) irc.reply(ircutils.stripColor(text))
stripcolor = wrap(stripcolor, ['text']) stripcolor = wrap(stripcolor, ['text'])
@internationalizeDocstring
def aol(self, irc, msg, args, text): def aol(self, irc, msg, args, text):
"""<text> """<text>
@ -410,6 +432,7 @@ class Filter(callbacks.Plugin):
irc.reply(text) irc.reply(text)
aol = wrap(aol, ['text']) aol = wrap(aol, ['text'])
@internationalizeDocstring
def jeffk(self, irc, msg, args, text): def jeffk(self, irc, msg, args, text):
"""<text> """<text>
@ -507,52 +530,56 @@ class Filter(callbacks.Plugin):
# Keeping these separate so people can just replace the alphabets for # Keeping these separate so people can just replace the alphabets for
# whatever their language of choice # whatever their language of choice
_spellLetters = { _spellLetters = {
'a': 'ay', 'b': 'bee', 'c': 'see', 'd': 'dee', 'e': 'ee', 'f': 'eff', 'a': _('ay'), 'b': _('bee'), 'c': _('see'), 'd': _('dee'),
'g': 'gee', 'h': 'aych', 'i': 'eye', 'j': 'jay', 'k': 'kay', 'l': 'e': _('ee'), 'f': _('eff'), 'g': _('gee'), 'h': _('aych'),
'ell', 'm': 'em', 'n': 'en', 'o': 'oh', 'p': 'pee', 'q': 'cue', 'r': 'i': _('eye'), 'j': _('jay'), 'k': _('kay'), 'l': _('ell'),
'arr', 's': 'ess', 't': 'tee', 'u': 'you', 'v': 'vee', 'w': 'm': _('em'), 'n': _('en'), 'o': _('oh'), 'p': _('pee'), 'q': _('cue'),
'double-you', 'x': 'ecks', 'y': 'why', 'z': 'zee' '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(): for (k, v) in _spellLetters.items():
_spellLetters[k.upper()] = v _spellLetters[k.upper()] = v
_spellPunctuation = { _spellPunctuation = {
'!': 'exclamation point', '!': _('exclamation point'),
'"': 'quote', '"': _('quote'),
'#': 'pound', '#': _('pound'),
'$': 'dollar sign', '$': _('dollar sign'),
'%': 'percent', '%': _('percent'),
'&': 'ampersand', '&': _('ampersand'),
'\'': 'single quote', '\'': _('single quote'),
'(': 'left paren', '(': _('left paren'),
')': 'right paren', ')': _('right paren'),
'*': 'asterisk', '*': _('asterisk'),
'+': 'plus', '+': _('plus'),
',': 'comma', ',': _('comma'),
'-': 'minus', '-': _('minus'),
'.': 'period', '.': _('period'),
'/': 'slash', '/': _('slash'),
':': 'colon', ':': _('colon'),
';': 'semicolon', ';': _('semicolon'),
'<': 'less than', '<': _('less than'),
'=': 'equals', '=': _('equals'),
'>': 'greater than', '>': _('greater than'),
'?': 'question mark', '?': _('question mark'),
'@': 'at', '@': _('at'),
'[': 'left bracket', '[': _('left bracket'),
'\\': 'backslash', '\\': _('backslash'),
']': 'right bracket', ']': _('right bracket'),
'^': 'caret', '^': _('caret'),
'_': 'underscore', '_': _('underscore'),
'`': 'backtick', '`': _('backtick'),
'{': 'left brace', '{': _('left brace'),
'|': 'pipe', '|': _('pipe'),
'}': 'right brace', '}': _('right brace'),
'~': 'tilde' '~': _('tilde')
} }
_spellNumbers = { _spellNumbers = {
'0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', '0': _('zero'), '1': _('one'), '2': _('two'), '3': _('three'),
'5': 'five', '6': 'six', '7': 'seven', '8': 'eight', '9': 'nine' '4': _('four'), '5': _('five'), '6': _('six'), '7': _('seven'),
'8': _('eight'), '9': _('nine')
} }
@internationalizeDocstring
def spellit(self, irc, msg, args, text): def spellit(self, irc, msg, args, text):
"""<text> """<text>
@ -582,6 +609,7 @@ class Filter(callbacks.Plugin):
irc.reply(out.getvalue()) irc.reply(out.getvalue())
spellit = wrap(spellit, ['text']) spellit = wrap(spellit, ['text'])
@internationalizeDocstring
def gnu(self, irc, msg, args, text): def gnu(self, irc, msg, args, text):
"""<text> """<text>
@ -590,6 +618,7 @@ class Filter(callbacks.Plugin):
irc.reply(' '.join(['GNU/' + s for s in text.split()])) irc.reply(' '.join(['GNU/' + s for s in text.split()]))
gnu = wrap(gnu, ['text']) gnu = wrap(gnu, ['text'])
@internationalizeDocstring
def shrink(self, irc, msg, args, text): def shrink(self, irc, msg, args, text):
"""<text> """<text>
@ -608,6 +637,7 @@ class Filter(callbacks.Plugin):
shrink = wrap(shrink, ['text']) shrink = wrap(shrink, ['text'])
_azn_trans = string.maketrans('rlRL', 'lrLR') _azn_trans = string.maketrans('rlRL', 'lrLR')
@internationalizeDocstring
def azn(self, irc, msg, args, text): def azn(self, irc, msg, args, text):
"""<text> """<text>
@ -656,6 +686,7 @@ class Filter(callbacks.Plugin):
'_': u'\u203e', 'o': u'o', '_': u'\u203e', 'o': u'o',
} }
@internationalizeDocstring
def uniud(self, irc, msg, args, text): def uniud(self, irc, msg, args, text):
"""<text> """<text>
@ -681,6 +712,7 @@ class Filter(callbacks.Plugin):
s = '%s \x02 \x02' % ''.join(map(lambda x: x.encode('utf-8'), turned)) s = '%s \x02 \x02' % ''.join(map(lambda x: x.encode('utf-8'), turned))
irc.reply(s) irc.reply(s)
uniud = wrap(uniud, ['text']) uniud = wrap(uniud, ['text'])
Filter = internationalizeDocstring(Filter)
Class = Filter Class = Filter

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Format')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is

197
plugins/Format/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<text>\n"
"\n"
" Returns <text> bolded.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte, en gras"
#: plugin.py:52
msgid ""
"<text>\n"
"\n"
" Returns <text> in reverse-video.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte, inversé"
#: plugin.py:61
msgid ""
"<text>\n"
"\n"
" Returns <text> underlined.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte, souligné"
#: plugin.py:70
msgid ""
"<foreground> [<background>] <text>\n"
"\n"
" Returns <text> with foreground color <foreground> and background color\n"
" <background> (if given)\n"
" "
msgstr ""
"<premier plan> [<arrière plan>] <texte>\n"
"\n"
"Retourne le <texte> avec les couleurs de <premier plan> et de l'<arrière plan> (si donné)."
#: plugin.py:80
msgid ""
"<separator> <string 1> [<string> ...]\n"
"\n"
" Joins all the arguments together with <separator>.\n"
" "
msgstr ""
"<séparateur> <chaîne 1> [<chaîne 2> ...]\n"
"\n"
"Joint tous les arguments en utilisant le <séparateur>."
#: plugin.py:89
msgid ""
"<chars to translate> <chars to replace those with> <text>\n"
"\n"
" Replaces <chars to translate> with <chars to replace those with> in\n"
" <text>. The first and second arguments must necessarily be the same\n"
" length.\n"
" "
msgstr ""
"<caractères à remplacer> <caractères de remplacement> <texte>\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 "<chars to translate> must be the same length as <chars to replace those with>."
msgstr "<caractères à remplacer> doit être de la même taille que <caractères de remplacement>"
#: plugin.py:103
msgid ""
"<text>\n"
"\n"
" Returns <text> uppercased.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte, en majuscules"
#: plugin.py:112
msgid ""
"<text>\n"
"\n"
" Returns <text> lowercased.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte, en minuscules"
#: plugin.py:121
msgid ""
"<text>\n"
"\n"
" Returns <text> capitalized.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte, capitalisé"
#: plugin.py:130
msgid ""
"<text>\n"
"\n"
" Returns <text> titlecased.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte, mis en majuscules de titre."
#: plugin.py:139
msgid ""
"<text>\n"
"\n"
" Returns the text surrounded by double quotes.\n"
" "
msgstr ""
"<texte>\n"
"\n"
"Retourne le texte, entouré de doubles guillemets."
#: plugin.py:148
msgid ""
"<string 1> <string 2>\n"
"\n"
" Concatenates two strings. Do keep in mind that this is *not* the same\n"
" thing as join \"\", since if <string 2> contains spaces, they won't be\n"
" removed by concat.\n"
" "
msgstr ""
"<chaîne 1> <chaîne 2>\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 <chaîne 2> contient des espaces, ils ne seront pas supprimés par la concaténation."
#: plugin.py:159
msgid ""
"<size> <text>\n"
"\n"
" Cuts <text> down to <size> by chopping off the rightmost characters in\n"
" excess of <size>. If <size> is a negative number, it chops that many\n"
" characters off the end of <text>.\n"
" "
msgstr ""
"<taille> <texte>\n"
"\n"
"Coup le <texte> en morceaux de <taille>, en découpant les caractères dépassant la <taille>. Si la <taille> est un nombre négatif, il coupe en comptant à partir de la fin du texte."
#: plugin.py:170
msgid ""
"<number> <text>\n"
"\n"
" Returns the <number>th space-separated field of <text>. I.e., if text\n"
" is \"foo bar baz\" and <number> is 2, \"bar\" is returned.\n"
" "
msgstr ""
"<nombre> <texte>\n"
"\n"
"Retourne le <nombre>-ième élément (séparé par des espaces) du <texte>. C'est à dire que si le texte est \"foo bar baz\" et que <nombre> est 2, \"bar\" sera retourné."
#: plugin.py:183
msgid ""
"<format string> [<arg> ...]\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 ""
"<chaîne de formattage> [<arg> ...]\n"
"\n"
#: plugin.py:197
msgid "Not enough arguments for the format string."
msgstr "Pas assez d'arguments pour formatter la chaîne."

170
plugins/Format/messages.pot Normal file
View File

@ -0,0 +1,170 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<text>\n"
"\n"
" Returns <text> bolded.\n"
" "
msgstr ""
#: plugin.py:52
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> in reverse-video.\n"
" "
msgstr ""
#: plugin.py:61
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> underlined.\n"
" "
msgstr ""
#: plugin.py:70
#, docstring
msgid ""
"<foreground> [<background>] <text>\n"
"\n"
" Returns <text> with foreground color <foreground> and background color\n"
" <background> (if given)\n"
" "
msgstr ""
#: plugin.py:80
#, docstring
msgid ""
"<separator> <string 1> [<string> ...]\n"
"\n"
" Joins all the arguments together with <separator>.\n"
" "
msgstr ""
#: plugin.py:89
#, docstring
msgid ""
"<chars to translate> <chars to replace those with> <text>\n"
"\n"
" Replaces <chars to translate> with <chars to replace those with> in\n"
" <text>. The first and second arguments must necessarily be the same\n"
" length.\n"
" "
msgstr ""
#: plugin.py:96
msgid "<chars to translate> must be the same length as <chars to replace those with>."
msgstr ""
#: plugin.py:103
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> uppercased.\n"
" "
msgstr ""
#: plugin.py:112
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> lowercased.\n"
" "
msgstr ""
#: plugin.py:121
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> capitalized.\n"
" "
msgstr ""
#: plugin.py:130
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns <text> titlecased.\n"
" "
msgstr ""
#: plugin.py:139
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns the text surrounded by double quotes.\n"
" "
msgstr ""
#: plugin.py:148
#, docstring
msgid ""
"<string 1> <string 2>\n"
"\n"
" Concatenates two strings. Do keep in mind that this is *not* the same\n"
" thing as join \"\", since if <string 2> contains spaces, they won't be\n"
" removed by concat.\n"
" "
msgstr ""
#: plugin.py:159
#, docstring
msgid ""
"<size> <text>\n"
"\n"
" Cuts <text> down to <size> by chopping off the rightmost characters in\n"
" excess of <size>. If <size> is a negative number, it chops that many\n"
" characters off the end of <text>.\n"
" "
msgstr ""
#: plugin.py:170
#, docstring
msgid ""
"<number> <text>\n"
"\n"
" Returns the <number>th space-separated field of <text>. I.e., if text\n"
" is \"foo bar baz\" and <number> is 2, \"bar\" is returned.\n"
" "
msgstr ""
#: plugin.py:183
#, docstring
msgid ""
"<format string> [<arg> ...]\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 ""

View File

@ -34,8 +34,11 @@ import supybot.utils as utils
from supybot.commands import * from supybot.commands import *
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Format')
class Format(callbacks.Plugin): class Format(callbacks.Plugin):
@internationalizeDocstring
def bold(self, irc, msg, args, text): def bold(self, irc, msg, args, text):
"""<text> """<text>
@ -44,6 +47,7 @@ class Format(callbacks.Plugin):
irc.reply(ircutils.bold(text)) irc.reply(ircutils.bold(text))
bold = wrap(bold, ['text']) bold = wrap(bold, ['text'])
@internationalizeDocstring
def reverse(self, irc, msg, args, text): def reverse(self, irc, msg, args, text):
"""<text> """<text>
@ -52,6 +56,7 @@ class Format(callbacks.Plugin):
irc.reply(ircutils.reverse(text)) irc.reply(ircutils.reverse(text))
reverse = wrap(reverse, ['text']) reverse = wrap(reverse, ['text'])
@internationalizeDocstring
def underline(self, irc, msg, args, text): def underline(self, irc, msg, args, text):
"""<text> """<text>
@ -60,6 +65,7 @@ class Format(callbacks.Plugin):
irc.reply(ircutils.underline(text)) irc.reply(ircutils.underline(text))
underline = wrap(underline, ['text']) underline = wrap(underline, ['text'])
@internationalizeDocstring
def color(self, irc, msg, args, fg, bg, text): def color(self, irc, msg, args, fg, bg, text):
"""<foreground> [<background>] <text> """<foreground> [<background>] <text>
@ -69,6 +75,7 @@ class Format(callbacks.Plugin):
irc.reply(ircutils.mircColor(text, fg=fg, bg=bg)) irc.reply(ircutils.mircColor(text, fg=fg, bg=bg))
color = wrap(color, ['color', optional('color'), 'text']) color = wrap(color, ['color', optional('color'), 'text'])
@internationalizeDocstring
def join(self, irc, msg, args, sep): def join(self, irc, msg, args, sep):
"""<separator> <string 1> [<string> ...] """<separator> <string 1> [<string> ...]
@ -77,6 +84,7 @@ class Format(callbacks.Plugin):
irc.reply(sep.join(args)) irc.reply(sep.join(args))
join = wrap(join, ['anything'], allowExtra=True) join = wrap(join, ['anything'], allowExtra=True)
@internationalizeDocstring
def translate(self, irc, msg, args, bad, good, text): def translate(self, irc, msg, args, bad, good, text):
"""<chars to translate> <chars to replace those with> <text> """<chars to translate> <chars to replace those with> <text>
@ -85,11 +93,12 @@ class Format(callbacks.Plugin):
length. length.
""" """
if len(bad) != len(good): if len(bad) != len(good):
irc.error('<chars to translate> must be the same length as ' irc.error(_('<chars to translate> must be the same length as '
'<chars to replace those with>.', Raise=True) '<chars to replace those with>.'), Raise=True)
irc.reply(text.translate(string.maketrans(bad, good))) irc.reply(text.translate(string.maketrans(bad, good)))
translate = wrap(translate, ['something', 'something', 'text']) translate = wrap(translate, ['something', 'something', 'text'])
@internationalizeDocstring
def upper(self, irc, msg, args, text): def upper(self, irc, msg, args, text):
"""<text> """<text>
@ -98,6 +107,7 @@ class Format(callbacks.Plugin):
irc.reply(text.upper()) irc.reply(text.upper())
upper = wrap(upper, ['text']) upper = wrap(upper, ['text'])
@internationalizeDocstring
def lower(self, irc, msg, args, text): def lower(self, irc, msg, args, text):
"""<text> """<text>
@ -106,6 +116,7 @@ class Format(callbacks.Plugin):
irc.reply(text.lower()) irc.reply(text.lower())
lower = wrap(lower, ['text']) lower = wrap(lower, ['text'])
@internationalizeDocstring
def capitalize(self, irc, msg, args, text): def capitalize(self, irc, msg, args, text):
"""<text> """<text>
@ -114,6 +125,7 @@ class Format(callbacks.Plugin):
irc.reply(text.capitalize()) irc.reply(text.capitalize())
capitalize = wrap(capitalize, ['text']) capitalize = wrap(capitalize, ['text'])
@internationalizeDocstring
def title(self, irc, msg, args, text): def title(self, irc, msg, args, text):
"""<text> """<text>
@ -122,6 +134,7 @@ class Format(callbacks.Plugin):
irc.reply(text.title()) irc.reply(text.title())
title = wrap(title, ['text']) title = wrap(title, ['text'])
@internationalizeDocstring
def repr(self, irc, msg, args, text): def repr(self, irc, msg, args, text):
"""<text> """<text>
@ -130,6 +143,7 @@ class Format(callbacks.Plugin):
irc.reply(utils.str.dqrepr(text)) irc.reply(utils.str.dqrepr(text))
repr = wrap(repr, ['text']) repr = wrap(repr, ['text'])
@internationalizeDocstring
def concat(self, irc, msg, args, first, second): def concat(self, irc, msg, args, first, second):
"""<string 1> <string 2> """<string 1> <string 2>
@ -140,6 +154,7 @@ class Format(callbacks.Plugin):
irc.reply(first+second) irc.reply(first+second)
concat = wrap(concat, ['something', 'text']) concat = wrap(concat, ['something', 'text'])
@internationalizeDocstring
def cut(self, irc, msg, args, size, text): def cut(self, irc, msg, args, size, text):
"""<size> <text> """<size> <text>
@ -150,6 +165,7 @@ class Format(callbacks.Plugin):
irc.reply(text[:size]) irc.reply(text[:size])
cut = wrap(cut, ['int', 'text']) cut = wrap(cut, ['int', 'text'])
@internationalizeDocstring
def field(self, irc, msg, args, index, text): def field(self, irc, msg, args, index, text):
"""<number> <text> """<number> <text>
@ -162,6 +178,7 @@ class Format(callbacks.Plugin):
irc.errorInvalid('field') irc.errorInvalid('field')
field = wrap(field, ['index', 'text']) field = wrap(field, ['index', 'text'])
@internationalizeDocstring
def format(self, irc, msg, args): def format(self, irc, msg, args):
"""<format string> [<arg> ...] """<format string> [<arg> ...]
@ -177,7 +194,8 @@ class Format(callbacks.Plugin):
irc.reply(s) irc.reply(s)
except TypeError, e: except TypeError, e:
self.log.debug(utils.exnToString(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 Class = Format

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Games')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is

140
plugins/Games/locale/fr.po Normal file
View File

@ -0,0 +1,140 @@
# French translations for PACKAGE package
# Traductions françaises du paquet PACKAGE.
# Copyright (C) 2010 ORGANIZATION
# ProgVal <progval@gmail.com>, 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 <progval@gmail.com>\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 ""
"<dice>d<sides>\n"
"\n"
" Rolls a die with <sides> number of sides <dice> times.\n"
" For example, 2d6 will roll 2 six-sided dice; 10d10 will roll 10\n"
" ten-sided dice.\n"
" "
msgstr ""
"<lancers>d<faces>\n"
"\n"
"Fait un certain nombre de <lancers> d'un dé d'un certain nombre de <faces>. 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 <dice>d<sides>"
msgstr "Les dés doivent être de la forme <lancers>d<faces>"
#: 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 ""
"[<question>]\n"
"\n"
" Ask a question and the answer shall be provided.\n"
" "
msgstr ""
"[<question>]\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 ""
"[<channel>]\n"
"\n"
" Returns the number of consecutive lines you've sent in <channel>\n"
" without being interrupted by someone else (i.e. how long your current\n"
" 'monologue' is). <channel> is only necessary if the message isn't sent\n"
" in the channel itself.\n"
" "
msgstr ""
"[<canal>]\n"
"\n"
"Retourne le nombre de lignes consécutives que vous avez écrites sur le <canal> sans être interrompu par qui que ce soit. <canal> 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"

128
plugins/Games/messages.pot Normal file
View File

@ -0,0 +1,128 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<dice>d<sides>\n"
"\n"
" Rolls a die with <sides> number of sides <dice> 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 <dice>d<sides>"
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 ""
"[<question>]\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 ""
"[<channel>]\n"
"\n"
" Returns the number of consecutive lines you've sent in <channel>\n"
" without being interrupted by someone else (i.e. how long your current\n"
" 'monologue' is). <channel> 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 ""

View File

@ -36,20 +36,24 @@ from supybot.commands import *
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Games')
class Games(callbacks.Plugin): class Games(callbacks.Plugin):
@internationalizeDocstring
def coin(self, irc, msg, args): def coin(self, irc, msg, args):
"""takes no arguments """takes no arguments
Flips a coin and returns the result. Flips a coin and returns the result.
""" """
if random.randrange(0, 2): if random.randrange(0, 2):
irc.reply('heads') irc.reply(_('heads'))
else: else:
irc.reply('tails') irc.reply(_('tails'))
coin = wrap(coin) coin = wrap(coin)
@internationalizeDocstring
def dice(self, irc, msg, args, m): def dice(self, irc, msg, args, m):
"""<dice>d<sides> """<dice>d<sides>
@ -59,11 +63,11 @@ class Games(callbacks.Plugin):
""" """
(dice, sides) = utils.iter.imap(int, m.groups()) (dice, sides) = utils.iter.imap(int, m.groups())
if dice > 1000: 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: 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: elif sides < 3:
irc.error('Dice can\'t have fewer than 3 sides.') irc.error(_('Dice can\'t have fewer than 3 sides.'))
else: else:
L = [0] * dice L = [0] * dice
for i in xrange(dice): for i in xrange(dice):
@ -71,36 +75,34 @@ class Games(callbacks.Plugin):
irc.reply(format('%L', [str(x) for x in L])) irc.reply(format('%L', [str(x) for x in L]))
_dicere = re.compile(r'^(\d+)d(\d+)$') _dicere = re.compile(r'^(\d+)d(\d+)$')
dice = wrap(dice, [('matches', _dicere, dice = wrap(dice, [('matches', _dicere,
'Dice must be of the form <dice>d<sides>')]) _('Dice must be of the form <dice>d<sides>'))])
# The list of words and algorithm are pulled straight the mozbot # The list of words and algorithm are pulled straight the mozbot
# MagicEightBall.bm module: http://tinyurl.com/7ytg7 # MagicEightBall.bm module: http://tinyurl.com/7ytg7
_responses = {'positive': ['It is possible.', 'Yes!', 'Of course.', _positive = _('It is possible.|Yes!|Of course.|Naturally.|Obviously.|'
'Naturally.', 'Obviously.', 'It shall be.', 'It shall be.|The outlook is good.|It is so.|'
'The outlook is good.', 'It is so.', 'One would be wise to think so.|'
'One would be wise to think so.', 'The answer is certainly yes.')
'The answer is certainly yes.'], _negative = _('In your dreams.|I doubt it very much.|No chance.|'
'negative': ['In your dreams.', 'I doubt it very much.', 'The outlook is poor.|Unlikely.|'
'No chance.', 'The outlook is poor.', 'About as likely as pigs flying.|You\'re kidding, right?|'
'Unlikely.', 'About as likely as pigs flying.', 'NO!|NO.|No.|The answer is a resounding no.')
'You\'re kidding, right?', 'NO!', 'NO.', 'No.', _unknown = _('Maybe...|No clue.|_I_ don\'t know.|'
'The answer is a resounding no.', ], 'The outlook is hazy, please ask again later.|'
'unknown' : ['Maybe...', 'No clue.', '_I_ don\'t know.', 'What are you asking me for?|Come again?|'
'The outlook is hazy, please ask again later.', 'You know the answer better than I.|'
'What are you asking me for?', 'Come again?', 'The answer is def-- oooh! shiny thing!')
'You know the answer better than I.',
'The answer is def-- oooh! shiny thing!'],
}
def _checkTheBall(self, questionLength): def _checkTheBall(self, questionLength):
if questionLength % 3 == 0: if questionLength % 3 == 0:
category = 'positive' catalog = self._positive
elif questionLength % 3 == 1: elif questionLength % 3 == 1:
category = 'negative' catalog = self._negative
else: else:
category = 'unknown' catalog = self._unknown
return utils.iter.choice(self._responses[category]) return utils.iter.choice(catalog.split('|'))
@internationalizeDocstring
def eightball(self, irc, msg, args, text): def eightball(self, irc, msg, args, text):
"""[<question>] """[<question>]
@ -114,6 +116,7 @@ class Games(callbacks.Plugin):
_rouletteChamber = random.randrange(0, 6) _rouletteChamber = random.randrange(0, 6)
_rouletteBullet = random.randrange(0, 6) _rouletteBullet = random.randrange(0, 6)
@internationalizeDocstring
def roulette(self, irc, msg, args, spin): def roulette(self, irc, msg, args, spin):
"""[spin] """[spin]
@ -122,7 +125,7 @@ class Games(callbacks.Plugin):
""" """
if spin: if spin:
self._rouletteBullet = random.randrange(0, 6) 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 return
channel = msg.args[0] channel = msg.args[0]
if self._rouletteChamber == self._rouletteBullet: if self._rouletteChamber == self._rouletteBullet:
@ -131,15 +134,16 @@ class Games(callbacks.Plugin):
if irc.nick in irc.state.channels[channel].ops: if irc.nick in irc.state.channels[channel].ops:
irc.queueMsg(ircmsgs.kick(channel, msg.nick, 'BANG!')) irc.queueMsg(ircmsgs.kick(channel, msg.nick, 'BANG!'))
else: else:
irc.reply('*BANG* Hey, who put a blank in here?!', irc.reply(_('*BANG* Hey, who put a blank in here?!'),
prefixNick=False) prefixNick=False)
irc.reply('reloads and spins the chambers.', action=True) irc.reply(_('reloads and spins the chambers.'), action=True)
else: else:
irc.reply('*click*') irc.reply(_('*click*'))
self._rouletteChamber += 1 self._rouletteChamber += 1
self._rouletteChamber %= 6 self._rouletteChamber %= 6
roulette = wrap(roulette, ['public', additional(('literal', 'spin'))]) roulette = wrap(roulette, ['public', additional(('literal', 'spin'))])
@internationalizeDocstring
def monologue(self, irc, msg, args, channel): def monologue(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -160,8 +164,8 @@ class Games(callbacks.Plugin):
i += 1 i += 1
else: else:
break break
irc.reply(format('Your current monologue is at least %n long.', irc.reply(format(_('Your current monologue is at least %n long.'),
(i, 'line'))) (i, _('line'))))
monologue = wrap(monologue, ['channel']) monologue = wrap(monologue, ['channel'])
Class = Games Class = Games

View File

@ -30,15 +30,17 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Google')
def configure(advanced): def configure(advanced):
from supybot.questions import output, yn from supybot.questions import output, yn
conf.registerPlugin('Google', True) 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) that match a specific pattern. (We call this a snarfer)
When supybot sees such a URL, it will parse the web page When supybot sees such a URL, it will parse the web page
for information and reply with the results.""") for information and reply with the results."""))
if yn('Do you want the Google search snarfer enabled by default?'): if yn(_('Do you want the Google search snarfer enabled by default?')):
conf.supybot.plugins.Google.searchSnarfer.setValue(True) conf.supybot.plugins.Google.searchSnarfer.setValue(True)
class Language(registry.OnlySomeStrings): class Language(registry.OnlySomeStrings):
@ -94,29 +96,29 @@ class SafeSearch(registry.OnlySomeStrings):
Google = conf.registerPlugin('Google') Google = conf.registerPlugin('Google')
conf.registerGlobalValue(Google, 'referer', 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 the Referer field of the search requests. If this value is empty, a
Referer will be generated in the following format: Referer will be generated in the following format:
http://$server/$botName""")) http://$server/$botName""")))
conf.registerChannelValue(Google, 'searchSnarfer', 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 enabled. If so, messages (even unaddressed ones) beginning with the word
'google' will result in the first URL Google returns being sent to the 'google' will result in the first URL Google returns being sent to the
channel.""")) channel.""")))
conf.registerChannelValue(Google, 'colorfulFilter', conf.registerChannelValue(Google, 'colorfulFilter',
registry.Boolean(False, """Determines whether the word 'google' in the registry.Boolean(False, _("""Determines whether the word 'google' in the
bot's output will be made colorful (like Google's logo).""")) bot's output will be made colorful (like Google's logo).""")))
conf.registerChannelValue(Google, 'bold', conf.registerChannelValue(Google, 'bold',
registry.Boolean(True, """Determines whether results are bolded.""")) registry.Boolean(True, _("""Determines whether results are bolded.""")))
conf.registerChannelValue(Google, 'maximumResults', conf.registerChannelValue(Google, 'maximumResults',
NumSearchResults(8, """Determines the maximum number of results returned NumSearchResults(8, _("""Determines the maximum number of results returned
from the google command.""")) from the google command.""")))
conf.registerChannelValue(Google, 'defaultLanguage', conf.registerChannelValue(Google, 'defaultLanguage',
Language('lang_en', """Determines what default language is used in Language('lang_'+ _('en'), _("""Determines what default language is used in
searches. If left empty, no specific language will be requested.""")) searches. If left empty, no specific language will be requested.""")))
conf.registerChannelValue(Google, 'searchFilter', 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, by default. 'active' - most filtering, 'moderate' - default filtering,
'off' - no filtering""")) 'off' - no filtering""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

225
plugins/Google/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<search>\n"
"\n"
" Does a google search, but only returns the first result.\n"
" "
msgstr ""
"<recherche>\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 ""
"<search> [--{filter,language} <value>]\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 ""
"<recherche> [--filtre <valeur>] [--language <valeur>]\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 ""
"<url>\n"
"\n"
" Returns a link to the cached version of <url> if it is available.\n"
" "
msgstr ""
"<url>\n"
"\n"
"Retourne un lien vers la version en cache de l'<url>, 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 ""
"<search string> <search string> [<search string> ...]\n"
"\n"
" Returns the results of each search, in order, from greatest number\n"
" of results to least.\n"
" "
msgstr ""
"<chaîne 1> <chaîne 2> [<chaîne 3> ...]\n"
"\n"
"Retourne les résultats de chaque recherche, dans l'ordre, par ordre croissant du nombre de résultats."
#: plugin.py:244
msgid ""
"<from-language> [to] <to-language> <text>\n"
"\n"
" Returns <text> translated from <from-language> into <to-language>.\n"
" Beware that translating to or from languages that use multi-byte\n"
" characters may result in some very odd results.\n"
" "
msgstr ""
"<langue de départ> [to] <langue finale> <texte>\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 ""
"<expression>\n"
"\n"
" Uses Google's calculator to calculate the value of <expression>.\n"
" "
msgstr ""
"<expression>\n"
"\n"
"Utilise la calculatrice Google pour calculer la valeur de l'<expression>."
#: 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 ""
"<phone number>\n"
"\n"
" Looks <phone number> up on Google.\n"
" "
msgstr ""
"<numéro de téléphone>\n"
"\n"
"Recherche le <numéro de téléphone> 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."

206
plugins/Google/messages.pot Normal file
View File

@ -0,0 +1,206 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<search>\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 ""
"<search> [--{filter,language} <value>]\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 ""
"<url>\n"
"\n"
" Returns a link to the cached version of <url> 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 ""
"<search string> <search string> [<search string> ...]\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 ""
"<from-language> [to] <to-language> <text>\n"
"\n"
" Returns <text> translated from <from-language> into <to-language>.\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 ""
"<expression>\n"
"\n"
" Uses Google's calculator to calculate the value of <expression>.\n"
" "
msgstr ""
#: plugin.py:325
msgid "Google's calculator didn't come up with anything."
msgstr ""
#: plugin.py:331
#, docstring
msgid ""
"<phone number>\n"
"\n"
" Looks <phone number> up on Google.\n"
" "
msgstr ""
#: plugin.py:345
msgid "Google's phonebook didn't come up with anything."
msgstr ""

View File

@ -41,6 +41,8 @@ from supybot.commands import *
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Google')
simplejson = None simplejson = None
@ -94,6 +96,7 @@ class Google(callbacks.PluginRegexp):
return msg return msg
_gsearchUrl = 'http://ajax.googleapis.com/ajax/services/search/web' _gsearchUrl = 'http://ajax.googleapis.com/ajax/services/search/web'
@internationalizeDocstring
def search(self, query, channel, options={}): def search(self, query, channel, options={}):
"""Perform a search using Google's AJAX API. """Perform a search using Google's AJAX API.
search("search phrase", options={}) search("search phrase", options={})
@ -135,7 +138,7 @@ class Google(callbacks.PluginRegexp):
json = simplejson.load(fd) json = simplejson.load(fd)
fd.close() fd.close()
if json['responseStatus'] != 200: if json['responseStatus'] != 200:
raise callbacks.Error, 'We broke The Google!' raise callbacks.Error, _('We broke The Google!')
return json return json
def formatData(self, data, bold=True, max=0): def formatData(self, data, bold=True, max=0):
@ -155,10 +158,11 @@ class Google(callbacks.PluginRegexp):
else: else:
results.append(url) results.append(url)
if not results: if not results:
return format('No matches found.') return format(_('No matches found.'))
else: else:
return format('; '.join(results)) return format('; '.join(results))
@internationalizeDocstring
def lucky(self, irc, msg, args, text): def lucky(self, irc, msg, args, text):
"""<search> """<search>
@ -169,9 +173,10 @@ class Google(callbacks.PluginRegexp):
url = data['responseData']['results'][0]['unescapedUrl'] url = data['responseData']['results'][0]['unescapedUrl']
irc.reply(url.encode('utf-8')) irc.reply(url.encode('utf-8'))
else: else:
irc.reply('Google found nothing.') irc.reply(_('Google found nothing.'))
lucky = wrap(lucky, ['text']) lucky = wrap(lucky, ['text'])
@internationalizeDocstring
def google(self, irc, msg, args, optlist, text): def google(self, irc, msg, args, optlist, text):
"""<search> [--{filter,language} <value>] """<search> [--{filter,language} <value>]
@ -184,7 +189,7 @@ class Google(callbacks.PluginRegexp):
irc.errorInvalid('language') irc.errorInvalid('language')
data = self.search(text, msg.args[0], dict(optlist)) data = self.search(text, msg.args[0], dict(optlist))
if data['responseStatus'] != 200: if data['responseStatus'] != 200:
irc.reply('We broke The Google!') irc.reply(_('We broke The Google!'))
return return
bold = self.registryValue('bold', msg.args[0]) bold = self.registryValue('bold', msg.args[0])
max = self.registryValue('maximumResults', msg.args[0]) max = self.registryValue('maximumResults', msg.args[0])
@ -194,6 +199,7 @@ class Google(callbacks.PluginRegexp):
'filter':''}), 'filter':''}),
'text']) 'text'])
@internationalizeDocstring
def cache(self, irc, msg, args, url): def cache(self, irc, msg, args, url):
"""<url> """<url>
@ -206,9 +212,10 @@ class Google(callbacks.PluginRegexp):
url = m['cacheUrl'].encode('utf-8') url = m['cacheUrl'].encode('utf-8')
irc.reply(url) irc.reply(url)
return 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']) cache = wrap(cache, ['url'])
@internationalizeDocstring
def fight(self, irc, msg, args): def fight(self, irc, msg, args):
"""<search string> <search string> [<search string> ...] """<search string> <search string> [<search string> ...]
@ -232,6 +239,7 @@ class Google(callbacks.PluginRegexp):
irc.reply(s) irc.reply(s)
_gtranslateUrl='http://ajax.googleapis.com/ajax/services/language/translate' _gtranslateUrl='http://ajax.googleapis.com/ajax/services/language/translate'
@internationalizeDocstring
def translate(self, irc, msg, args, fromLang, toLang, text): def translate(self, irc, msg, args, fromLang, toLang, text):
"""<from-language> [to] <to-language> <text> """<from-language> [to] <to-language> <text>
@ -252,8 +260,8 @@ class Google(callbacks.PluginRegexp):
fromLang = lang.transLangs[fromLang.capitalize()] fromLang = lang.transLangs[fromLang.capitalize()]
elif lang.normalize('lang_'+fromLang)[5:] \ elif lang.normalize('lang_'+fromLang)[5:] \
not in lang.transLangs.values(): not in lang.transLangs.values():
irc.errorInvalid('from language', fromLang, irc.errorInvalid(_('from language'), fromLang,
format('Valid languages are: %L', format(_('Valid languages are: %L'),
lang.transLangs.keys())) lang.transLangs.keys()))
else: else:
fromLang = lang.normalize('lang_'+fromLang)[5:] fromLang = lang.normalize('lang_'+fromLang)[5:]
@ -261,8 +269,8 @@ class Google(callbacks.PluginRegexp):
toLang = lang.transLangs[toLang.capitalize()] toLang = lang.transLangs[toLang.capitalize()]
elif lang.normalize('lang_'+toLang)[5:] \ elif lang.normalize('lang_'+toLang)[5:] \
not in lang.transLangs.values(): not in lang.transLangs.values():
irc.errorInvalid('to language', toLang, irc.errorInvalid(_('to language'), toLang,
format('Valid languages are: %L', format(_('Valid languages are: %L'),
lang.transLangs.keys())) lang.transLangs.keys()))
else: else:
toLang = lang.normalize('lang_'+toLang)[5:] toLang = lang.normalize('lang_'+toLang)[5:]
@ -298,6 +306,7 @@ class Google(callbacks.PluginRegexp):
_calcSupRe = re.compile(r'<sup>(.*?)</sup>', re.I) _calcSupRe = re.compile(r'<sup>(.*?)</sup>', re.I)
_calcFontRe = re.compile(r'<font size=-2>(.*?)</font>') _calcFontRe = re.compile(r'<font size=-2>(.*?)</font>')
_calcTimesRe = re.compile(r'&(?:times|#215);') _calcTimesRe = re.compile(r'&(?:times|#215);')
@internationalizeDocstring
def calc(self, irc, msg, args, expr): def calc(self, irc, msg, args, expr):
"""<expression> """<expression>
@ -313,10 +322,11 @@ class Google(callbacks.PluginRegexp):
s = self._calcTimesRe.sub(r'*', s) s = self._calcTimesRe.sub(r'*', s)
irc.reply(s) irc.reply(s)
else: 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']) calc = wrap(calc, ['text'])
_phoneRe = re.compile(r'Phonebook.*?<font size=-1>(.*?)<a href') _phoneRe = re.compile(r'Phonebook.*?<font size=-1>(.*?)<a href')
@internationalizeDocstring
def phonebook(self, irc, msg, args, phonenumber): def phonebook(self, irc, msg, args, phonenumber):
"""<phone number> """<phone number>
@ -332,7 +342,7 @@ class Google(callbacks.PluginRegexp):
s = utils.web.htmlToText(s) s = utils.web.htmlToText(s)
irc.reply(s) irc.reply(s)
else: 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']) phonebook = wrap(phonebook, ['text'])

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Herald')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -41,31 +43,31 @@ def configure(advanced):
Herald = conf.registerPlugin('Herald') Herald = conf.registerPlugin('Herald')
conf.registerChannelValue(Herald, 'heralding', 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 channel when a recognized user joins; basically enables or disables the
plugin.""")) plugin.""")))
conf.registerGlobalValue(Herald, 'requireCapability', conf.registerGlobalValue(Herald, 'requireCapability',
registry.String('', """Determines what capability (if any) is required to registry.String('', _("""Determines what capability (if any) is required to
add/change/remove the herald of another user.""")) add/change/remove the herald of another user.""")))
conf.registerChannelValue(Herald, 'throttle', conf.registerChannelValue(Herald, 'throttle',
registry.PositiveInteger(600, """Determines the minimum number of seconds registry.PositiveInteger(600, _("""Determines the minimum number of seconds
between heralds.""")) between heralds.""")))
conf.registerChannelValue(Herald.throttle, 'afterPart', 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 after parting that the bot will not herald the person when he or she
rejoins.""")) rejoins.""")))
conf.registerChannelValue(Herald.throttle, 'afterSplit', conf.registerChannelValue(Herald.throttle, 'afterSplit',
registry.NonNegativeInteger(60, """Determines the minimum number of seconds registry.NonNegativeInteger(60, _("""Determines the minimum number of seconds
after a netsplit that the bot will not herald the users that split.""")) after a netsplit that the bot will not herald the users that split.""")))
conf.registerChannelValue(Herald, 'default', 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 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', conf.registerChannelValue(Herald.default, 'notice',
registry.Boolean(True, """Determines whether the default herald will be registry.Boolean(True, _("""Determines whether the default herald will be
sent as a NOTICE instead of a PRIVMSG.""")) sent as a NOTICE instead of a PRIVMSG.""")))
conf.registerChannelValue(Herald.default, 'public', conf.registerChannelValue(Herald.default, 'public',
registry.Boolean(False, """Determines whether the default herald will be registry.Boolean(False, _("""Determines whether the default herald will be
sent publicly.""")) sent publicly.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

148
plugins/Herald/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"[<channel>] [--remove|<msg>]\n"
"\n"
" If <msg> is given, sets the default herald to <msg>. A <msg> of \"\"\n"
" will remove the default herald. If <msg> is not given, returns the\n"
" current default herald. <channel> is only necessary if the message\n"
" isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [--remove|<message>]\n"
"\n"
"Si le <message> est donné, définit le message d'annonce par défaut pour être le <message>. Un <message> de la forme \"\" supprimera le message d'annonce par défaut. Si le <message> n'est pas donné, retourne le message d'annonce par défaut actuel. <canal> 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 ""
"[<channel>] [<user|nick>]\n"
"\n"
" Returns the current herald message for <user> (or the user\n"
" <nick|hostmask> is currently identified or recognized as). If <user>\n"
" is not given, defaults to the user giving the command. <channel>\n"
" is only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <utilisateur|nick>]\n"
"\n"
"Retourne le message d'annonce courant pour l'<utilisateur> (ou l'utilisateur désigné par le <nick>). Si l'<utilisateur> n'est pas donné, cela vaut par défaut l'utilisateur donnant la commande. <canal> 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 ""
"[<channel>] <user|nick> <msg>\n"
"\n"
" Sets the herald message for <user> (or the user <nick|hostmask> is\n"
" currently identified or recognized as) to <msg>. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] <utilisateur|nick> <message>\n"
"\n"
"Définit le <message> d'annonce de l'<utilisateur> (ou la personne désignée par <nick>). <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:214
msgid ""
"[<channel>] [<user|nick>]\n"
"\n"
" Removes the herald message set for <user>, or the user\n"
" <nick|hostmask> is currently identified or recognized as. If <user>\n"
" is not given, defaults to the user giving the command.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
"[<canal>] [<utilisateur|nick>]\n"
"\n"
"Supprime le message d'annonce de l'<utilisateur> (ou de l'utilisateur désigné par le <nick>). <canal> 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 ""
"[<channel>] [<user|nick>] <regexp>\n"
"\n"
" Changes the herald message for <user>, or the user <nick|hostmask> is\n"
" currently identified or recognized as, according to <regexp>. If\n"
" <user> is not given, defaults to the calling user. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<utilisateur|nick>] [<expression régulière>]\n"
"\n"
"Change le message d'annonce de l'<utilisateur> (ou de l'utilisateur désigné par le <nick>), en fonction de l'<expression régulière>. Si l'<utilisateur> n'est pas donné, cea correspond par défaut de l'utilisateur appelant la commande. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."

140
plugins/Herald/messages.pot Normal file
View File

@ -0,0 +1,140 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"[<channel>] [--remove|<msg>]\n"
"\n"
" If <msg> is given, sets the default herald to <msg>. A <msg> of \"\"\n"
" will remove the default herald. If <msg> is not given, returns the\n"
" current default herald. <channel> 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 ""
"[<channel>] [<user|nick>]\n"
"\n"
" Returns the current herald message for <user> (or the user\n"
" <nick|hostmask> is currently identified or recognized as). If <user>\n"
" is not given, defaults to the user giving the command. <channel>\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 ""
"[<channel>] <user|nick> <msg>\n"
"\n"
" Sets the herald message for <user> (or the user <nick|hostmask> is\n"
" currently identified or recognized as) to <msg>. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:214
#, docstring
msgid ""
"[<channel>] [<user|nick>]\n"
"\n"
" Removes the herald message set for <user>, or the user\n"
" <nick|hostmask> is currently identified or recognized as. If <user>\n"
" is not given, defaults to the user giving the command.\n"
" <channel> 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 ""
"[<channel>] [<user|nick>] <regexp>\n"
"\n"
" Changes the herald message for <user>, or the user <nick|hostmask> is\n"
" currently identified or recognized as, according to <regexp>. If\n"
" <user> is not given, defaults to the calling user. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""

View File

@ -40,6 +40,8 @@ import supybot.plugins as plugins
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.utils.structures import TimeoutQueue from supybot.utils.structures import TimeoutQueue
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Herald')
filename = conf.supybot.directories.data.dirize('Herald.db') filename = conf.supybot.directories.data.dirize('Herald.db')
@ -136,6 +138,7 @@ class Herald(callbacks.Plugin):
raise KeyError raise KeyError
return id return id
@internationalizeDocstring
def default(self, irc, msg, args, channel, optlist, text): def default(self, irc, msg, args, channel, optlist, text):
"""[<channel>] [--remove|<msg>] """[<channel>] [--remove|<msg>]
@ -156,12 +159,13 @@ class Herald(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
else: else:
resp = self.registryValue('default', channel) or \ 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) irc.reply(resp)
default = wrap(default, ['channel', default = wrap(default, ['channel',
getopts({'remove': ''}), getopts({'remove': ''}),
additional('text')]) additional('text')])
@internationalizeDocstring
def get(self, irc, msg, args, channel, user): def get(self, irc, msg, args, channel, user):
"""[<channel>] [<user|nick>] """[<channel>] [<user|nick>]
@ -174,7 +178,7 @@ class Herald(callbacks.Plugin):
herald = self.db[channel, user.id] herald = self.db[channel, user.id]
irc.reply(herald) irc.reply(herald)
except KeyError: 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')]) get = wrap(get, ['channel', first('otherUser', 'user')])
def _preCheck(self, irc, msg, user): def _preCheck(self, irc, msg, user):
@ -192,6 +196,7 @@ class Herald(callbacks.Plugin):
# I chose not to make <user|nick> optional in this command because # I chose not to make <user|nick> optional in this command because
# if it's not a valid username (e.g., if the user tyops and misspells a # 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. # username), it may be nice not to clobber the user's herald.
@internationalizeDocstring
def add(self, irc, msg, args, channel, user, herald): def add(self, irc, msg, args, channel, user, herald):
"""[<channel>] <user|nick> <msg> """[<channel>] <user|nick> <msg>
@ -204,6 +209,7 @@ class Herald(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
add = wrap(add, ['channel', 'otherUser', 'text']) add = wrap(add, ['channel', 'otherUser', 'text'])
@internationalizeDocstring
def remove(self, irc, msg, args, channel, user): def remove(self, irc, msg, args, channel, user):
"""[<channel>] [<user|nick>] """[<channel>] [<user|nick>]
@ -218,9 +224,10 @@ class Herald(callbacks.Plugin):
del self.db[channel, user.id] del self.db[channel, user.id]
irc.replySuccess() irc.replySuccess()
except KeyError: 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')]) remove = wrap(remove, ['channel', first('otherUser', 'user')])
@internationalizeDocstring
def change(self, irc, msg, args, channel, user, changer): def change(self, irc, msg, args, channel, user, changer):
"""[<channel>] [<user|nick>] <regexp> """[<channel>] [<user|nick>] <regexp>

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Internet')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -42,7 +44,7 @@ def configure(advanced):
Internet = conf.registerPlugin('Internet') Internet = conf.registerPlugin('Internet')
# This is where your configuration variables (if any) should go. For example: # This is where your configuration variables (if any) should go. For example:
# conf.registerGlobalValue(Internet, 'someConfigVariableName', # 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: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<host|ip>\n"
"\n"
" Returns the ip of <host> or the reverse DNS hostname of <ip>.\n"
" "
msgstr ""
"<hôte|ip>\n"
"\n"
"Retourne l'ip de l'<hôte>, ou le reverse DNS de l'<ip>"
#: plugin.py:54
#: plugin.py:61
#: plugin.py:65
msgid "Host not found."
msgstr "Hôte non trouvé."
#: plugin.py:77
msgid ""
"<domain>\n"
"\n"
" Returns WHOIS information on the registration of <domain>.\n"
" "
msgstr ""
"<domaine>\n"
"\n"
"Retourne les informations du WHOIS sur le <domaine>."
#: 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 " <registered at %s>"
msgstr " <enregistré le %s>"
#: plugin.py:140
msgid " <registered by %s>"
msgstr " <enregistré par %s>"
#: 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 ""
"<ip>\n"
"\n"
" Returns the hexadecimal IP for that IP.\n"
" "
msgstr ""
"<ip>\n"
"\n"
"Retourne l'IP hexadécimale pour cette IP."

View File

@ -0,0 +1,85 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<host|ip>\n"
"\n"
" Returns the ip of <host> or the reverse DNS hostname of <ip>.\n"
" "
msgstr ""
#: plugin.py:54 plugin.py:61 plugin.py:65
msgid "Host not found."
msgstr ""
#: plugin.py:77
#, docstring
msgid ""
"<domain>\n"
"\n"
" Returns WHOIS information on the registration of <domain>.\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 " <registered at %s>"
msgstr ""
#: plugin.py:140
msgid " <registered by %s>"
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 ""
"<ip>\n"
"\n"
" Returns the hexadecimal IP for that IP.\n"
" "
msgstr ""

View File

@ -35,11 +35,13 @@ import supybot.utils as utils
from supybot.commands import * from supybot.commands import *
from supybot.utils.iter import any from supybot.utils.iter import any
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Internet')
class Internet(callbacks.Plugin): class Internet(callbacks.Plugin):
"""Add the help for "@help Internet" here.""" """Add the help for "@help Internet" here."""
threaded = True threaded = True
@internationalizeDocstring
def dns(self, irc, msg, args, host): def dns(self, irc, msg, args, host):
"""<host|ip> """<host|ip>
@ -48,18 +50,18 @@ class Internet(callbacks.Plugin):
if utils.net.isIP(host): if utils.net.isIP(host):
hostname = socket.getfqdn(host) hostname = socket.getfqdn(host)
if hostname == host: if hostname == host:
irc.reply('Host not found.') irc.reply(_('Host not found.'))
else: else:
irc.reply(hostname) irc.reply(hostname)
else: else:
try: try:
ip = socket.gethostbyname(host) ip = socket.gethostbyname(host)
if ip == '64.94.110.11': # Verisign sucks! if ip == '64.94.110.11': # Verisign sucks!
irc.reply('Host not found.') irc.reply(_('Host not found.'))
else: else:
irc.reply(ip) irc.reply(ip)
except socket.error: except socket.error:
irc.reply('Host not found.') irc.reply(_('Host not found.'))
dns = wrap(dns, ['something']) dns = wrap(dns, ['something'])
_domain = ['Domain Name', 'Server Name', 'domain'] _domain = ['Domain Name', 'Server Name', 'domain']
@ -69,6 +71,7 @@ class Internet(callbacks.Plugin):
_created = ['Created On', 'Domain Registration Date', 'Creation Date'] _created = ['Created On', 'Domain Registration Date', 'Creation Date']
_expires = ['Expiration Date', 'Domain Expiration Date'] _expires = ['Expiration Date', 'Domain Expiration Date']
_status = ['Status', 'Domain Status', 'status'] _status = ['Status', 'Domain Status', 'status']
@internationalizeDocstring
def whois(self, irc, msg, args, domain): def whois(self, irc, msg, args, domain):
"""<domain> """<domain>
@ -76,7 +79,7 @@ class Internet(callbacks.Plugin):
""" """
usertld = domain.split('.')[-1] usertld = domain.split('.')[-1]
if '.' not in domain: if '.' not in domain:
irc.errorInvalid('domain') irc.errorInvalid(_('domain'))
return return
try: try:
t = telnetlib.Telnet('%s.whois-servers.net' % usertld, 43) t = telnetlib.Telnet('%s.whois-servers.net' % usertld, 43)
@ -105,13 +108,13 @@ class Internet(callbacks.Plugin):
registrar = ':'.join(line.split(':')[1:]).strip() registrar = ':'.join(line.split(':')[1:]).strip()
elif not updated and any(line.startswith, self._updated): elif not updated and any(line.startswith, self._updated):
s = ':'.join(line.split(':')[1:]).strip() s = ':'.join(line.split(':')[1:]).strip()
updated = 'updated %s' % s updated = _('updated %s') % s
elif not created and any(line.startswith, self._created): elif not created and any(line.startswith, self._created):
s = ':'.join(line.split(':')[1:]).strip() s = ':'.join(line.split(':')[1:]).strip()
created = 'registered %s' % s created = _('registered %s') % s
elif not expires and any(line.startswith, self._expires): elif not expires and any(line.startswith, self._expires):
s = ':'.join(line.split(':')[1:]).strip() s = ':'.join(line.split(':')[1:]).strip()
expires = 'expires %s' % s expires = _('expires %s') % s
elif not status and any(line.startswith, self._status): elif not status and any(line.startswith, self._status):
status = ':'.join(line.split(':')[1:]).strip().lower() status = ':'.join(line.split(':')[1:]).strip().lower()
if not status: if not status:
@ -131,19 +134,20 @@ class Internet(callbacks.Plugin):
if not line: if not line:
continue continue
if line.startswith('Email'): if line.startswith('Email'):
url = ' <registered at %s>' % line.split('@')[-1] url = _(' <registered at %s>') % line.split('@')[-1]
elif line.startswith('Registrar Organization:'): elif line.startswith('Registrar Organization:'):
url = ' <registered by %s>' % line.split(':')[1].strip() url = _(' <registered by %s>') % line.split(':')[1].strip()
elif line == 'Not a valid ID pattern': elif line == 'Not a valid ID pattern':
url = '' url = ''
if server and status: if server and status:
info = filter(None, [status, created, updated, expires]) 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) irc.reply(s)
else: else:
irc.error('I couldn\'t find such a domain.') irc.error(_('I couldn\'t find such a domain.'))
whois = wrap(whois, ['lowered']) whois = wrap(whois, ['lowered'])
@internationalizeDocstring
def hexip(self, irc, msg, args, ip): def hexip(self, irc, msg, args, ip):
"""<ip> """<ip>
@ -156,7 +160,7 @@ class Internet(callbacks.Plugin):
ret += '%02x' % i ret += '%02x' % i
irc.reply(ret.upper()) irc.reply(ret.upper())
hexip = wrap(hexip, ['ip']) hexip = wrap(hexip, ['ip'])
Internet = internationalizeDocstring(Internet)
Class = Internet Class = Internet

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Karma')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -41,22 +43,22 @@ def configure(advanced):
conf.registerPlugin('Karma') conf.registerPlugin('Karma')
conf.registerChannelValue(conf.supybot.plugins.Karma, 'simpleOutput', conf.registerChannelValue(conf.supybot.plugins.Karma, 'simpleOutput',
registry.Boolean(False, """Determines whether the bot will output shorter registry.Boolean(False, _("""Determines whether the bot will output shorter
versions of the karma output when requesting a single thing's karma.""")) versions of the karma output when requesting a single thing's karma.""")))
conf.registerChannelValue(conf.supybot.plugins.Karma, 'response', conf.registerChannelValue(conf.supybot.plugins.Karma, 'response',
registry.Boolean(False, """Determines whether the bot will reply with a registry.Boolean(False, _("""Determines whether the bot will reply with a
success message when something's karma is increased or decreased.""")) success message when something's karma is increased or decreased.""")))
conf.registerChannelValue(conf.supybot.plugins.Karma, 'rankingDisplay', conf.registerChannelValue(conf.supybot.plugins.Karma, 'rankingDisplay',
registry.Integer(3, """Determines how many highest/lowest karma things are registry.Integer(3, _("""Determines how many highest/lowest karma things
shown when karma is called with no arguments.""")) are shown when karma is called with no arguments.""")))
conf.registerChannelValue(conf.supybot.plugins.Karma, 'mostDisplay', conf.registerChannelValue(conf.supybot.plugins.Karma, 'mostDisplay',
registry.Integer(25, """Determines how many karma things are shown when registry.Integer(25, _("""Determines how many karma things are shown when
the most command is called.'""")) the most command is called.'""")))
conf.registerChannelValue(conf.supybot.plugins.Karma, 'allowSelfRating', conf.registerChannelValue(conf.supybot.plugins.Karma, 'allowSelfRating',
registry.Boolean(False, """Determines whether users can adjust the karma registry.Boolean(False, _("""Determines whether users can adjust the karma
of their nick.""")) of their nick.""")))
conf.registerChannelValue(conf.supybot.plugins.Karma, 'allowUnaddressedKarma', conf.registerChannelValue(conf.supybot.plugins.Karma, 'allowUnaddressedKarma',
registry.Boolean(False, """Determines whether the bot will registry.Boolean(False, _("""Determines whether the bot will
increase/decrease karma without being addressed.""")) increase/decrease karma without being addressed.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

152
plugins/Karma/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"[<channel>] [<thing> ...]\n"
"\n"
" Returns the karma of <thing>. If <thing> is not given, returns the top\n"
" N karmas, where N is determined by the config variable\n"
" supybot.plugins.Karma.rankingDisplay. If one <thing> is given, returns\n"
" the details of its karma; if more than one <thing> is given, returns\n"
" the total karma of each of the the things. <channel> is only necessary\n"
" if the message isn't sent on the channel itself.\n"
" "
msgstr ""
"[<canal>] [<objet> ...]\n"
"\n"
"Retourne le karma de l'<objet>. Si l'<objet> n'est pas donné, retourne les trois premiers et derniers karmas. Si une <chose> est donnée, retourne les détails de son karma ; si plus d'une <chose> est donnée, retourne le karma total de chacune de ces choses. Le <canal> 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 "<empty>"
#: 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 ""
"[<channel>] {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. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] {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. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:361
msgid ""
"[<channel>] <name>\n"
"\n"
" Resets the karma of <name> to 0.\n"
" "
msgstr ""
"[<canal>] <nom>\n"
"\n"
"Redéfinit le karma de <nom> à 0."
#: plugin.py:371
msgid ""
"[<channel>] <filename>\n"
"\n"
" Dumps the Karma database for <channel> to <filename> in the bot's\n"
" data directory. <channel> is only necessary if the message isn't sent\n"
" in the channel itself.\n"
" "
msgstr ""
"[<canal>] <nom de fichier>\n"
"\n"
"Exporte la base de données des Karma du <canal> dans le <nom de fichier> dans le répertoire de données du bot. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."
#: plugin.py:383
msgid ""
"[<channel>] <filename>\n"
"\n"
" Loads the Karma database for <channel> from <filename> in the bot's\n"
" data directory. <channel> is only necessary if the message isn't sent\n"
" in the channel itself.\n"
" "
msgstr ""
"[<canal>] <nom de fichier>\n"
"\n"
"Charge la base de données des Karma du <canal> du <nom de fichier> dans le répertoire de données du bot. <canal> n'est nécessaire que si le message n'est pas envoyé sur le canal lui-même."

141
plugins/Karma/messages.pot Normal file
View File

@ -0,0 +1,141 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"[<channel>] [<thing> ...]\n"
"\n"
" Returns the karma of <thing>. If <thing> is not given, returns the top\n"
" N karmas, where N is determined by the config variable\n"
" supybot.plugins.Karma.rankingDisplay. If one <thing> is given, returns\n"
" the details of its karma; if more than one <thing> is given, returns\n"
" the total karma of each of the the things. <channel> 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 ""
"[<channel>] {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. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:361
#, docstring
msgid ""
"[<channel>] <name>\n"
"\n"
" Resets the karma of <name> to 0.\n"
" "
msgstr ""
#: plugin.py:371
#, docstring
msgid ""
"[<channel>] <filename>\n"
"\n"
" Dumps the Karma database for <channel> to <filename> in the bot's\n"
" data directory. <channel> is only necessary if the message isn't sent\n"
" in the channel itself.\n"
" "
msgstr ""
#: plugin.py:383
#, docstring
msgid ""
"[<channel>] <filename>\n"
"\n"
" Loads the Karma database for <channel> from <filename> in the bot's\n"
" data directory. <channel> is only necessary if the message isn't sent\n"
" in the channel itself.\n"
" "
msgstr ""

View File

@ -38,6 +38,8 @@ import supybot.plugins as plugins
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Karma')
class SqliteKarmaDB(object): class SqliteKarmaDB(object):
def __init__(self, filename): def __init__(self, filename):
@ -238,7 +240,7 @@ class Karma(callbacks.Plugin):
thing = thing[:-2] thing = thing[:-2]
if ircutils.strEqual(thing, irc.msg.nick) and \ if ircutils.strEqual(thing, irc.msg.nick) and \
not self.registryValue('allowSelfRating', channel): 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: elif thing:
self.db.increment(channel, self._normalizeThing(thing)) self.db.increment(channel, self._normalizeThing(thing))
self._respond(irc, channel) self._respond(irc, channel)
@ -246,7 +248,7 @@ class Karma(callbacks.Plugin):
thing = thing[:-2] thing = thing[:-2]
if ircutils.strEqual(thing, irc.msg.nick) and \ if ircutils.strEqual(thing, irc.msg.nick) and \
not self.registryValue('allowSelfRating', channel): 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: elif thing:
self.db.decrement(channel, self._normalizeThing(thing)) self.db.decrement(channel, self._normalizeThing(thing))
self._respond(irc, channel) self._respond(irc, channel)
@ -273,6 +275,7 @@ class Karma(callbacks.Plugin):
if thing[-2:] in ('++', '--'): if thing[-2:] in ('++', '--'):
self._doKarma(irc, channel, thing) self._doKarma(irc, channel, thing)
@internationalizeDocstring
def karma(self, irc, msg, args, channel, things): def karma(self, irc, msg, args, channel, things):
"""[<channel>] [<thing> ...] """[<channel>] [<thing> ...]
@ -287,16 +290,17 @@ class Karma(callbacks.Plugin):
name = things[0] name = things[0]
t = self.db.get(channel, name) t = self.db.get(channel, name)
if t is None: if t is None:
irc.reply(format('%s has neutral karma.', name)) irc.reply(format(_('%s has neutral karma.'), name))
else: else:
(added, subtracted) = t (added, subtracted) = t
total = added - subtracted total = added - subtracted
if self.registryValue('simpleOutput', channel): if self.registryValue('simpleOutput', channel):
s = format('%s: %i', name, total) s = format('%s: %i', name, total)
else: else:
s = format('Karma for %q has been increased %n and ' s = format(_('Karma for %q has been increased %n and '
'decreased %n for a total karma of %s.', 'decreased %n for a total karma of %s.'),
name, (added, 'time'), (subtracted, 'time'), name, (added, _('time')),
(subtracted, _('time')),
total) total)
irc.reply(s) irc.reply(s)
elif len(things) > 1: elif len(things) > 1:
@ -309,7 +313,8 @@ class Karma(callbacks.Plugin):
s += neutral s += neutral
irc.reply(s + '.') irc.reply(s + '.')
else: 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. else: # No name was given. Return the top/bottom N karmas.
limit = self.registryValue('rankingDisplay', channel) limit = self.registryValue('rankingDisplay', channel)
top = self.db.top(channel, limit) top = self.db.top(channel, limit)
@ -318,21 +323,22 @@ class Karma(callbacks.Plugin):
lowest = [format('%q (%s)', s, t) lowest = [format('%q (%s)', s, t)
for (s, t) in self.db.bottom(channel, limit)] for (s, t) in self.db.bottom(channel, limit)]
if not (highest and lowest): if not (highest and lowest):
irc.error('I have no karma for this channel.') irc.error(_('I have no karma for this channel.'))
return return
rank = self.db.rank(channel, msg.nick) rank = self.db.rank(channel, msg.nick)
if rank is not None: if rank is not None:
total = self.db.size(channel) 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) msg.nick, rank, total)
else: else:
rankS = '' rankS = ''
s = format('Highest karma: %L. Lowest karma: %L.%s', s = format(_('Highest karma: %L. Lowest karma: %L.%s'),
highest, lowest, rankS) highest, lowest, rankS)
irc.reply(s) irc.reply(s)
karma = wrap(karma, ['channel', any('something')]) karma = wrap(karma, ['channel', any('something')])
_mostAbbrev = utils.abbrev(['increased', 'decreased', 'active']) _mostAbbrev = utils.abbrev(['increased', 'decreased', 'active'])
@internationalizeDocstring
def most(self, irc, msg, args, channel, kind): def most(self, irc, msg, args, channel, kind):
"""[<channel>] {increased,decreased,active} """[<channel>] {increased,decreased,active}
@ -346,10 +352,11 @@ class Karma(callbacks.Plugin):
L = [format('%q: %i', name, i) for (name, i) in L] L = [format('%q: %i', name, i) for (name, i) in L]
irc.reply(format('%L', L)) irc.reply(format('%L', L))
else: else:
irc.error('I have no karma for this channel.') irc.error(_('I have no karma for this channel.'))
most = wrap(most, ['channel', most = wrap(most, ['channel',
('literal', ['increased', 'decreased', 'active'])]) ('literal', ['increased', 'decreased', 'active'])])
@internationalizeDocstring
def clear(self, irc, msg, args, channel, name): def clear(self, irc, msg, args, channel, name):
"""[<channel>] <name> """[<channel>] <name>
@ -359,6 +366,7 @@ class Karma(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
clear = wrap(clear, [('checkChannelCapability', 'op'), 'text']) clear = wrap(clear, [('checkChannelCapability', 'op'), 'text'])
@internationalizeDocstring
def dump(self, irc, msg, args, channel, filename): def dump(self, irc, msg, args, channel, filename):
"""[<channel>] <filename> """[<channel>] <filename>
@ -370,6 +378,7 @@ class Karma(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
dump = wrap(dump, [('checkCapability', 'owner'), 'channeldb', 'filename']) dump = wrap(dump, [('checkCapability', 'owner'), 'channeldb', 'filename'])
@internationalizeDocstring
def load(self, irc, msg, args, channel, filename): def load(self, irc, msg, args, channel, filename):
"""[<channel>] <filename> """[<channel>] <filename>

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Lart')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -42,10 +44,10 @@ def configure(advanced):
Lart = conf.registerPlugin('Lart') Lart = conf.registerPlugin('Lart')
# This is where your configuration variables (if any) should go. For example: # This is where your configuration variables (if any) should go. For example:
# conf.registerGlobalValue(Lart, 'someConfigVariableName', # conf.registerGlobalValue(Lart, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName.""")) # registry.Boolean(False, _("""Help for someConfigVariableName.""")))
conf.registerChannelValue(Lart, 'showIds', conf.registerChannelValue(Lart, 'showIds',
registry.Boolean(False, """Determines whether the bot will show the ids of registry.Boolean(False, _("""Determines whether the bot will show the ids
a lart when the lart is given.""")) of a lart when the lart is given.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

54
plugins/Lart/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"[<channel>] [<id>] <who|what> [for <reason>]\n"
"\n"
" Uses the Luser Attitude Readjustment Tool on <who|what> (for <reason>,\n"
" if given). If <id> is given, uses that specific lart. <channel> is\n"
" only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
"[<canal>] [<id>] [<qui|quoi> [for <raison>]\n"
"\n"
"Utilise le Luser Attitude Readjustment Tool sur <qui|quoi> (pour la <raison>, si elle est donnée). Si l'<id> est donné, utilise un LART spécifique. <canal> 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 "

54
plugins/Lart/messages.pot Normal file
View File

@ -0,0 +1,54 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"[<channel>] [<id>] <who|what> [for <reason>]\n"
"\n"
" Uses the Luser Attitude Readjustment Tool on <who|what> (for <reason>,\n"
" if given). If <id> is given, uses that specific lart. <channel> 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 ""

View File

@ -32,6 +32,8 @@ import re
from supybot.commands import * from supybot.commands import *
import supybot.plugins as plugins import supybot.plugins as plugins
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Lart')
class Lart(plugins.ChannelIdDatabasePlugin): class Lart(plugins.ChannelIdDatabasePlugin):
_meRe = re.compile(r'\bme\b', re.I) _meRe = re.compile(r'\bme\b', re.I)
@ -43,8 +45,9 @@ class Lart(plugins.ChannelIdDatabasePlugin):
def addValidator(self, irc, text): def addValidator(self, irc, text):
if '$who' not in 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): def lart(self, irc, msg, args, channel, id, text):
"""[<channel>] [<id>] <who|what> [for <reason>] """[<channel>] [<id>] <who|what> [for <reason>]
@ -60,18 +63,18 @@ class Lart(plugins.ChannelIdDatabasePlugin):
try: try:
lart = self.db.get(channel, id) lart = self.db.get(channel, id)
except KeyError: 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 return
else: else:
lart = self.db.random(channel) lart = self.db.random(channel)
if not lart: if not lart:
irc.error(format('There are no larts in my database ' irc.error(format(_('There are no larts in my database '
'for %s.', channel)) 'for %s.'), channel))
return return
text = lart.text text = lart.text
if ircutils.strEqual(target, irc.nick): if ircutils.strEqual(target, irc.nick):
target = msg.nick target = msg.nick
reason = self._replaceFirstPerson('trying to dis me', irc.nick) reason = self._replaceFirstPerson(_('trying to dis me'), irc.nick)
else: else:
target = self._replaceFirstPerson(target, msg.nick) target = self._replaceFirstPerson(target, msg.nick)
reason = self._replaceFirstPerson(reason, msg.nick) reason = self._replaceFirstPerson(reason, msg.nick)
@ -79,7 +82,7 @@ class Lart(plugins.ChannelIdDatabasePlugin):
target = target.rstrip('.') target = target.rstrip('.')
text = text.replace('$who', target) text = text.replace('$who', target)
if reason: if reason:
text += ' for ' + reason text += _(' for ') + reason
if self.registryValue('showIds', channel): if self.registryValue('showIds', channel):
text += format(' (#%i)', lart.id) text += format(' (#%i)', lart.id)
irc.reply(text, action=True) irc.reply(text, action=True)

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Later')
def configure(advanced): def configure(advanced):
# This will be called by setup.py to configure this module. Advanced is # This will be called by setup.py to configure this module. Advanced is
@ -40,10 +42,11 @@ def configure(advanced):
Later = conf.registerPlugin('Later') Later = conf.registerPlugin('Later')
conf.registerGlobalValue(Later, 'maximum', conf.registerGlobalValue(Later, 'maximum',
registry.NonNegativeInteger(0, """Determines the maximum number of messages registry.NonNegativeInteger(0, _("""Determines the maximum number of
to be queued for a user. If this value is 0, there is no maximum.""")) messages to be queued for a user. If this value is 0, there is no maximum.
""")))
conf.registerGlobalValue(Later, 'private', conf.registerGlobalValue(Later, 'private',
registry.Boolean(True, """Determines whether users will be notified in the registry.Boolean(True, _("""Determines whether users will be notified in
first place in which they're seen, or in private.""")) the first place in which they're seen, or in private.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

108
plugins/Later/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<nick> <text>\n"
"\n"
" Tells <nick> <text> the next time <nick> is in seen. <nick> can\n"
" contain wildcard characters, and the first matching nick will be\n"
" given the note.\n"
" "
msgstr ""
"<nick> <texte>\n"
"\n"
"Dit le <texte> à <nick> la prochaine fois qu'il est vu. <nick> 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 ""
"[<nick>]\n"
"\n"
" If <nick> is given, replies with what notes are waiting on <nick>,\n"
" otherwise, replies with the nicks that have notes waiting for them.\n"
" "
msgstr ""
"[<nick>]\n"
"\n"
"Si le <nick> est donné, répond avec les notes en attente pour <nick> ; 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 ""
"<nick>\n"
"\n"
" Removes the notes waiting on <nick>.\n"
" "
msgstr ""
"<nick>\n"
"\n"
"Supprime les notes en attente pour <nick>."
#: 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"

105
plugins/Later/messages.pot Normal file
View File

@ -0,0 +1,105 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<nick> <text>\n"
"\n"
" Tells <nick> <text> the next time <nick> is in seen. <nick> 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 ""
"[<nick>]\n"
"\n"
" If <nick> is given, replies with what notes are waiting on <nick>,\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 ""
"<nick>\n"
"\n"
" Removes the notes waiting on <nick>.\n"
" "
msgstr ""
#: plugin.py:158
msgid "There were no notes for %r"
msgstr ""
#: plugin.py:182
msgid "Sent %s: <%s> %s"
msgstr ""

View File

@ -38,6 +38,8 @@ from supybot.commands import *
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Later')
class Later(callbacks.Plugin): class Later(callbacks.Plugin):
@ -79,9 +81,9 @@ class Later(callbacks.Plugin):
#format = conf.supybot.reply.format.time() #format = conf.supybot.reply.format.time()
diff = time.time() - when diff = time.time() - when
try: try:
return utils.timeElapsed(diff, seconds=False) + ' ago' return _('%s ago') % utils.timeElapsed(diff, seconds=False)
except ValueError: except ValueError:
return 'just now' return _('just now')
def _addNote(self, nick, whence, text, at=None, maximum=None): def _addNote(self, nick, whence, text, at=None, maximum=None):
if at is None: if at is None:
@ -100,6 +102,7 @@ class Later(callbacks.Plugin):
self.wildcards.append(nick) self.wildcards.append(nick)
self._flushNotes() self._flushNotes()
@internationalizeDocstring
def tell(self, irc, msg, args, nick, text): def tell(self, irc, msg, args, nick, text):
"""<nick> <text> """<nick> <text>
@ -108,15 +111,16 @@ class Later(callbacks.Plugin):
given the note. given the note.
""" """
if ircutils.strEqual(nick, irc.nick): 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 return
try: try:
self._addNote(nick, msg.nick, text) self._addNote(nick, msg.nick, text)
irc.replySuccess() irc.replySuccess()
except ValueError: 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']) tell = wrap(tell, ['something', 'text'])
@internationalizeDocstring
def notes(self, irc, msg, args, nick): def notes(self, irc, msg, args, nick):
"""[<nick>] """[<nick>]
@ -129,17 +133,18 @@ class Later(callbacks.Plugin):
for (when, whence, note) in self._notes[nick]] for (when, whence, note) in self._notes[nick]]
irc.reply(format('%L', notes)) irc.reply(format('%L', notes))
else: else:
irc.error('I have no notes for that nick.') irc.error(_('I have no notes for that nick.'))
else: else:
nicks = self._notes.keys() nicks = self._notes.keys()
if nicks: if nicks:
utils.sortBy(ircutils.toLower, 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)) nicks))
else: 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')]) notes = wrap(notes, [additional('something')])
@internationalizeDocstring
def remove(self, irc, msg, args, nick): def remove(self, irc, msg, args, nick):
"""<nick> """<nick>
@ -150,7 +155,7 @@ class Later(callbacks.Plugin):
self._flushNotes() self._flushNotes()
irc.replySuccess() irc.replySuccess()
except KeyError: 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']) remove = wrap(remove, [('checkCapability', 'admin'), 'something'])
def doPrivmsg(self, irc, msg): def doPrivmsg(self, irc, msg):
@ -174,8 +179,8 @@ class Later(callbacks.Plugin):
self._flushNotes() self._flushNotes()
def _formatNote(self, when, whence, note): 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 Class = Later

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Limiter')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -41,17 +43,17 @@ def configure(advanced):
Limiter = conf.registerPlugin('Limiter') Limiter = conf.registerPlugin('Limiter')
conf.registerChannelValue(Limiter, 'enable', 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 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', 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 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', 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 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: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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."

View File

@ -0,0 +1,50 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -32,7 +32,8 @@ from supybot.commands import *
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Limiter')
class Limiter(callbacks.Plugin): class Limiter(callbacks.Plugin):
"""In order to use this plugin, its config values need to be properly """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): def doQuit(self, irc, msg):
for channel in irc.state.channels: for channel in irc.state.channels:
self._enforceLimit(irc, channel) self._enforceLimit(irc, channel)
Limiter = internationalizeDocstring(Limiter)
Class = Limiter Class = Limiter

View File

@ -29,6 +29,8 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Math')
def configure(advanced): def configure(advanced):
# This will be called by supybot to configure this module. advanced is # This will be called by supybot to configure this module. advanced is
@ -42,7 +44,7 @@ def configure(advanced):
Math = conf.registerPlugin('Math') Math = conf.registerPlugin('Math')
# This is where your configuration variables (if any) should go. For example: # This is where your configuration variables (if any) should go. For example:
# conf.registerGlobalValue(Math, 'someConfigVariableName', # 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: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

142
plugins/Math/locale/fr.po Normal file
View File

@ -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 <progval@gmail.com>\n"
"Language-Team: Supybot-fr <progval@gmail.com>\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 ""
"<fromBase> [<toBase>] <number>\n"
"\n"
" Converts <number> from base <fromBase> to base <toBase>.\n"
" If <toBase> is left out, it converts to decimal.\n"
" "
msgstr ""
"<base 1> [<base 2>] <nombre>\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 <number> 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 ""
"<math expression>\n"
"\n"
" Returns the value of the evaluated <math expression>. 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 ""
"<expression mathématique>\n"
"\n"
"Retourne la valeur de l'<expression mathématique> é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 ""
"<math expression>\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 ""
"<expression mathématique>\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 ""
"<rpn math expression>\n"
"\n"
" Returns the value of an RPN expression.\n"
" "
msgstr ""
"<expression mathématique NPI>\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 ""
"[<number>] <unit> to <other unit>\n"
"\n"
" Converts from <unit> to <other unit>. If number isn't given, it\n"
" defaults to 1. For unit information, see 'units' command.\n"
" "
msgstr ""
"[<nombre>] <unité> to <autre unité>\n"
"\n"
"Convertit de l'<unité> à l'<autre unité>. 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 ""
" [<type>]\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 ""
"[<type>]\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."

129
plugins/Math/messages.pot Normal file
View File

@ -0,0 +1,129 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
"<fromBase> [<toBase>] <number>\n"
"\n"
" Converts <number> from base <fromBase> to base <toBase>.\n"
" If <toBase> is left out, it converts to decimal.\n"
" "
msgstr ""
#: plugin.py:63
msgid "Invalid <number> 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 ""
"<math expression>\n"
"\n"
" Returns the value of the evaluated <math expression>. 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 ""
"<math expression>\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 ""
"<rpn math expression>\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 ""
"[<number>] <unit> to <other unit>\n"
"\n"
" Converts from <unit> to <other unit>. If number isn't given, it\n"
" defaults to 1. For unit information, see 'units' command.\n"
" "
msgstr ""
#: plugin.py:314
#, docstring
msgid ""
" [<type>]\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 ""

Some files were not shown because too many files have changed in this diff Show More