Internationalize Seen, Services, ShrinkUrl, Status, String, and Success

This commit is contained in:
Valentin Lorentz 2010-10-20 09:10:03 +02:00
parent aaa0c480af
commit 371a40e004
18 changed files with 1002 additions and 111 deletions

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('Seen')
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):
Seen = conf.registerPlugin('Seen') Seen = conf.registerPlugin('Seen')
# 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(Seen, 'someConfigVariableName', # conf.registerGlobalValue(Seen, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName.""")) # registry.Boolean(False, _("""Help for someConfigVariableName.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

118
plugins/Seen/messages.pot Normal file
View File

@ -0,0 +1,118 @@
# 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-20 08:52+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:203 plugin.py:284
msgid "%s was last seen in %s %s ago: %s"
msgstr ""
#: plugin.py:210
msgid "%s (%s ago)"
msgstr ""
#: plugin.py:212
msgid "%s could be %L"
msgstr ""
#: plugin.py:212
msgid "or"
msgstr ""
#: plugin.py:214
msgid "I haven't seen anyone matching %s."
msgstr ""
#: plugin.py:216 plugin.py:288
msgid "I have not seen %s."
msgstr ""
#: plugin.py:220
#, docstring
msgid ""
"[<channel>] <nick>\n"
"\n"
" Returns the last time <nick> was seen and what <nick> was last seen\n"
" saying. <channel> is only necessary if the message isn't sent on the\n"
" channel itself.\n"
" "
msgstr ""
#: plugin.py:231
#, docstring
msgid ""
"[<channel>] [--user <name>] [<nick>]\n"
"\n"
" Returns the last time <nick> was seen and what <nick> was last seen\n"
" doing. This includes any form of activity, instead of just PRIVMSGs.\n"
" If <nick> isn't specified, returns the last activity seen in\n"
" <channel>. If --user is specified, looks up name in the user database\n"
" and returns the last time user was active in <channel>. <channel> is\n"
" only necessary if the message isn't sent on the channel itself.\n"
" "
msgstr ""
#: plugin.py:261
msgid "Someone was last seen in %s %s ago: %s"
msgstr ""
#: plugin.py:265
msgid "I have never seen anyone."
msgstr ""
#: plugin.py:269
#, docstring
msgid ""
"[<channel>]\n"
"\n"
" Returns the last thing said in <channel>. <channel> is only necessary\n"
" if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:292
#, docstring
msgid ""
"[<channel>] <name>\n"
"\n"
" Returns the last time <name> was seen and what <name> was last seen\n"
" saying. This looks up <name> in the user seen database, which means\n"
" that it could be any nick recognized as user <name> that was seen.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:305
#, docstring
msgid ""
"[<channel>] <nick>\n"
"\n"
" Returns the messages since <nick> last left the channel.\n"
" "
msgstr ""
#: plugin.py:312
msgid "You must be in %s to use this command."
msgstr ""
#: plugin.py:333
msgid "I couldn't find in my history of %s messages where %r last left the %s"
msgstr ""
#: plugin.py:342
msgid "Either %s didn't leave, or no messages were sent while %s was gone."
msgstr ""

View File

@ -42,6 +42,8 @@ import supybot.ircmsgs as ircmsgs
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('Seen')
class IrcStringAndIntDict(utils.InsensitivePreservingDict): class IrcStringAndIntDict(utils.InsensitivePreservingDict):
def key(self, x): def key(self, x):
@ -198,21 +200,22 @@ class Seen(callbacks.Plugin):
if len(results) == 1: if len(results) == 1:
(nick, info) = results[0] (nick, info) = results[0]
(when, said) = info (when, said) = info
irc.reply(format('%s was last seen in %s %s ago: %s', irc.reply(format(_('%s was last seen in %s %s ago: %s'),
nick, channel, nick, channel,
utils.timeElapsed(time.time()-when), said)) utils.timeElapsed(time.time()-when), said))
elif len(results) > 1: elif len(results) > 1:
L = [] L = []
for (nick, info) in results: for (nick, info) in results:
(when, said) = info (when, said) = info
L.append(format('%s (%s ago)', nick, L.append(format(_('%s (%s ago)'), nick,
utils.timeElapsed(time.time()-when))) utils.timeElapsed(time.time()-when)))
irc.reply(format('%s could be %L', name, (L, 'or'))) irc.reply(format(_('%s could be %L'), name, (L, _('or'))))
else: else:
irc.reply(format('I haven\'t seen anyone matching %s.', name)) irc.reply(format(_('I haven\'t seen anyone matching %s.'), name))
except KeyError: except KeyError:
irc.reply(format('I have not seen %s.', name)) irc.reply(format(_('I have not seen %s.'), name))
@internationalizeDocstring
def seen(self, irc, msg, args, channel, name): def seen(self, irc, msg, args, channel, name):
"""[<channel>] <nick> """[<channel>] <nick>
@ -223,6 +226,7 @@ class Seen(callbacks.Plugin):
self._seen(irc, channel, name) self._seen(irc, channel, name)
seen = wrap(seen, ['channel', 'nick']) seen = wrap(seen, ['channel', 'nick'])
@internationalizeDocstring
def any(self, irc, msg, args, channel, optlist, name): def any(self, irc, msg, args, channel, optlist, name):
"""[<channel>] [--user <name>] [<nick>] """[<channel>] [--user <name>] [<nick>]
@ -254,12 +258,13 @@ class Seen(callbacks.Plugin):
db = self.db db = self.db
try: try:
(when, said) = db.seen(channel, '<last>') (when, said) = db.seen(channel, '<last>')
irc.reply(format('Someone was last seen in %s %s ago: %s', irc.reply(format(_('Someone was last seen in %s %s ago: %s'),
channel, utils.timeElapsed(time.time()-when), channel, utils.timeElapsed(time.time()-when),
said)) said))
except KeyError: except KeyError:
irc.reply('I have never seen anyone.') irc.reply(_('I have never seen anyone.'))
@internationalizeDocstring
def last(self, irc, msg, args, channel): def last(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -276,12 +281,13 @@ class Seen(callbacks.Plugin):
db = self.db db = self.db
try: try:
(when, said) = db.seen(channel, user.id) (when, said) = db.seen(channel, user.id)
irc.reply(format('%s was last seen in %s %s ago: %s', irc.reply(format(_('%s was last seen in %s %s ago: %s'),
user.name, channel, user.name, channel,
utils.timeElapsed(time.time()-when), said)) utils.timeElapsed(time.time()-when), said))
except KeyError: except KeyError:
irc.reply(format('I have not seen %s.', user.name)) irc.reply(format(_('I have not seen %s.'), user.name))
@internationalizeDocstring
def user(self, irc, msg, args, channel, user): def user(self, irc, msg, args, channel, user):
"""[<channel>] <name> """[<channel>] <name>
@ -294,6 +300,7 @@ class Seen(callbacks.Plugin):
self._user(irc, channel, user) self._user(irc, channel, user)
user = wrap(user, ['channel', 'otherUser']) user = wrap(user, ['channel', 'otherUser'])
@internationalizeDocstring
def since(self, irc, msg, args, channel, nick): def since(self, irc, msg, args, channel, nick):
"""[<channel>] <nick> """[<channel>] <nick>
@ -302,7 +309,8 @@ class Seen(callbacks.Plugin):
if nick is None: if nick is None:
nick = msg.nick nick = msg.nick
if nick not in irc.state.channels[channel].users: if nick not in irc.state.channels[channel].users:
irc.error(format('You must be in %s to use this command.', channel)) irc.error(format(_('You must be in %s to use this command.'),
channel))
return return
end = None # By default, up until the most recent message. end = None # By default, up until the most recent message.
for (i, m) in utils.seq.renumerate(irc.state.history): for (i, m) in utils.seq.renumerate(irc.state.history):
@ -322,8 +330,8 @@ class Seen(callbacks.Plugin):
ircutils.strEqual(m.args[0], channel): ircutils.strEqual(m.args[0], channel):
break break
else: # I never use this; it only kicks in when the for loop exited normally. else: # I never use this; it only kicks in when the for loop exited normally.
irc.error(format('I couldn\'t find in my history of %s messages ' irc.error(format(_('I couldn\'t find in my history of %s messages '
'where %r last left the %s', 'where %r last left the %s'),
len(irc.state.history), nick, channel)) len(irc.state.history), nick, channel))
return return
msgs = [m for m in irc.state.history[i:end] msgs = [m for m in irc.state.history[i:end]
@ -331,8 +339,8 @@ class Seen(callbacks.Plugin):
if msgs: if msgs:
irc.reply(format('%L', map(ircmsgs.prettyPrint, msgs))) irc.reply(format('%L', map(ircmsgs.prettyPrint, msgs)))
else: else:
irc.reply(format('Either %s didn\'t leave, ' irc.reply(format(_('Either %s didn\'t leave, '
'or no messages were sent while %s was gone.', nick, nick)) 'or no messages were sent while %s was gone.'), nick, nick))
since = wrap(since, ['channel', additional('nick')]) since = wrap(since, ['channel', additional('nick')])
Class = Seen Class = Seen

View File

@ -31,11 +31,13 @@
import supybot.conf as conf import supybot.conf as conf
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.registry as registry import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Services')
def registerNick(nick, password=''): def registerNick(nick, password=''):
p = conf.supybot.plugins.Services.Nickserv.get('password') p = conf.supybot.plugins.Services.Nickserv.get('password')
h = 'Determines what password the bot will use with NickServ when ' \ h = _('Determines what password the bot will use with NickServ when ' \
'identifying as %s.' % nick 'identifying as %s.') % nick
v = conf.registerGlobalValue(p, nick, v = conf.registerGlobalValue(p, nick,
registry.String(password, h, private=True)) registry.String(password, h, private=True))
if password: if password:
@ -44,10 +46,10 @@ def registerNick(nick, password=''):
def configure(advanced): def configure(advanced):
from supybot.questions import expect, anything, something, yn, getpass from supybot.questions import expect, anything, something, yn, getpass
conf.registerPlugin('Services', True) conf.registerPlugin('Services', True)
nick = something('What is your registered nick?') nick = something(_('What is your registered nick?'))
password = something('What is your password for that nick?') password = something(_('What is your password for that nick?'))
chanserv = something('What is your ChanServ named?', default='ChanServ') chanserv = something(_('What is your ChanServ named?'), default='ChanServ')
nickserv = something('What is your NickServ named?', default='NickServ') nickserv = something(_('What is your NickServ named?'), default='NickServ')
conf.supybot.plugins.Services.nicks.setValue([nick]) conf.supybot.plugins.Services.nicks.setValue([nick])
conf.supybot.plugins.Services.NickServ.setValue(nickserv) conf.supybot.plugins.Services.NickServ.setValue(nickserv)
registerNick(nick, password) registerNick(nick, password)
@ -65,42 +67,42 @@ class ValidNickSet(conf.ValidNicks):
Services = conf.registerPlugin('Services') Services = conf.registerPlugin('Services')
conf.registerGlobalValue(Services, 'nicks', conf.registerGlobalValue(Services, 'nicks',
ValidNickSet([], """Determines what nicks the bot will use with ValidNickSet([], _("""Determines what nicks the bot will use with
services.""")) services.""")))
class Networks(registry.SpaceSeparatedSetOfStrings): class Networks(registry.SpaceSeparatedSetOfStrings):
List = ircutils.IrcSet List = ircutils.IrcSet
conf.registerGlobalValue(Services, 'disabledNetworks', conf.registerGlobalValue(Services, 'disabledNetworks',
Networks(['QuakeNet'], """Determines what networks this plugin will be Networks(_('QuakeNet').split(), _("""Determines what networks this plugin
disabled on.""")) will be disabled on.""")))
conf.registerGlobalValue(Services, 'noJoinsUntilIdentified', conf.registerGlobalValue(Services, 'noJoinsUntilIdentified',
registry.Boolean(False, """Determines whether the bot will not join any registry.Boolean(False, _("""Determines whether the bot will not join any
channels until it is identified. This may be useful, for instances, if channels until it is identified. This may be useful, for instances, if
you have a vhost that isn't set until you're identified, or if you're you have a vhost that isn't set until you're identified, or if you're
joining +r channels that won't allow you to join unless you identify.""")) joining +r channels that won't allow you to join unless you identify.""")))
conf.registerGlobalValue(Services, 'ghostDelay', conf.registerGlobalValue(Services, 'ghostDelay',
registry.PositiveInteger(60, """Determines how many seconds the bot will registry.PositiveInteger(60, _("""Determines how many seconds the bot will
wait between successive GHOST attempts.""")) wait between successive GHOST attempts.""")))
conf.registerGlobalValue(Services, 'NickServ', conf.registerGlobalValue(Services, 'NickServ',
ValidNickOrEmptyString('', """Determines what nick the 'NickServ' service ValidNickOrEmptyString('', _("""Determines what nick the 'NickServ' service
has.""")) has.""")))
conf.registerGroup(Services.NickServ, 'password') conf.registerGroup(Services.NickServ, 'password')
conf.registerGlobalValue(Services, 'ChanServ', conf.registerGlobalValue(Services, 'ChanServ',
ValidNickOrEmptyString('', """Determines what nick the 'ChanServ' service ValidNickOrEmptyString('', _("""Determines what nick the 'ChanServ' service
has.""")) has.""")))
conf.registerChannelValue(Services.ChanServ, 'password', conf.registerChannelValue(Services.ChanServ, 'password',
registry.String('', """Determines what password the bot will use with registry.String('', _("""Determines what password the bot will use with
ChanServ.""", private=True)) ChanServ."""), private=True))
conf.registerChannelValue(Services.ChanServ, 'op', conf.registerChannelValue(Services.ChanServ, 'op',
registry.Boolean(False, """Determines whether the bot will request to get registry.Boolean(False, _("""Determines whether the bot will request to get
opped by the ChanServ when it joins the channel.""")) opped by the ChanServ when it joins the channel.""")))
conf.registerChannelValue(Services.ChanServ, 'halfop', conf.registerChannelValue(Services.ChanServ, 'halfop',
registry.Boolean(False, """Determines whether the bot will request to get registry.Boolean(False, _("""Determines whether the bot will request to get
half-opped by the ChanServ when it joins the channel.""")) half-opped by the ChanServ when it joins the channel.""")))
conf.registerChannelValue(Services.ChanServ, 'voice', conf.registerChannelValue(Services.ChanServ, 'voice',
registry.Boolean(False, """Determines whether the bot will request to get registry.Boolean(False, _("""Determines whether the bot will request to get
voiced by the ChanServ when it joins the channel.""")) voiced by the ChanServ when it joins 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,235 @@
# 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-20 08:55+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 "Determines what password the bot will use with NickServ when identifying as %s."
msgstr ""
#: config.py:49
msgid "What is your registered nick?"
msgstr ""
#: config.py:50
msgid "What is your password for that nick?"
msgstr ""
#: config.py:51
msgid "What is your ChanServ named?"
msgstr ""
#: config.py:52
msgid "What is your NickServ named?"
msgstr ""
#: config.py:70
msgid ""
"Determines what nicks the bot will use with\n"
" services."
msgstr ""
#: config.py:77
msgid ""
"Determines what networks this plugin\n"
" will be disabled on."
msgstr ""
#: config.py:77
msgid "QuakeNet"
msgstr ""
#: config.py:81
msgid ""
"Determines whether the bot will not join any\n"
" channels until it is identified. This may be useful, for instances, if\n"
" you have a vhost that isn't set until you're identified, or if you're\n"
" joining +r channels that won't allow you to join unless you identify."
msgstr ""
#: config.py:86
msgid ""
"Determines how many seconds the bot will\n"
" wait between successive GHOST attempts."
msgstr ""
#: config.py:89
msgid ""
"Determines what nick the 'NickServ' service\n"
" has."
msgstr ""
#: config.py:93
msgid ""
"Determines what nick the 'ChanServ' service\n"
" has."
msgstr ""
#: config.py:96
msgid ""
"Determines what password the bot will use with\n"
" ChanServ."
msgstr ""
#: config.py:99
msgid ""
"Determines whether the bot will request to get\n"
" opped by the ChanServ when it joins the channel."
msgstr ""
#: config.py:102
msgid ""
"Determines whether the bot will request to get\n"
" half-opped by the ChanServ when it joins the channel."
msgstr ""
#: config.py:105
msgid ""
"Determines whether the bot will request to get\n"
" voiced by the ChanServ when it joins the channel."
msgstr ""
#: plugin.py:48
#, docstring
msgid ""
"This plugin handles dealing with Services on networks that provide them.\n"
" Basically, you should use the \"password\" command to tell the bot a nick to\n"
" identify with and what password to use to identify with that nick. You can\n"
" use the password command multiple times if your bot has multiple nicks\n"
" registered. Also, be sure to configure the NickServ and ChanServ\n"
" configuration variables to match the NickServ and ChanServ nicks on your\n"
" network. Other commands such as identify, op, etc. should not be\n"
" necessary if the bot is properly configured."
msgstr ""
#: plugin.py:396
msgid "You must set supybot.plugins.Services.ChanServ before I'm able to send the %s command."
msgstr ""
#: plugin.py:402
#, docstring
msgid ""
"[<channel>]\n"
"\n"
" Attempts to get opped by ChanServ in <channel>. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:408
msgid "I'm already opped in %s."
msgstr ""
#: plugin.py:415
#, docstring
msgid ""
"[<channel>]\n"
"\n"
" Attempts to get voiced by ChanServ in <channel>. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:421
msgid "I'm already voiced in %s."
msgstr ""
#: plugin.py:438
#, docstring
msgid ""
"[<channel>]\n"
"\n"
" Attempts to get unbanned by ChanServ in <channel>. <channel> is only\n"
" necessary if the message isn't sent in the channel itself, but chances\n"
" are, if you need this command, you're not sending it in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:459
#, docstring
msgid ""
"[<channel>]\n"
"\n"
" Attempts to get invited by ChanServ to <channel>. <channel> is only\n"
" necessary if the message isn't sent in the channel itself, but chances\n"
" are, if you need this command, you're not sending it in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:480
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Identifies with NickServ using the current nick.\n"
" "
msgstr ""
#: plugin.py:489
msgid "I don't have a configured password for my current nick."
msgstr ""
#: plugin.py:492
msgid "You must set supybot.plugins.Services.NickServ before I'm able to do identify."
msgstr ""
#: plugin.py:498
#, docstring
msgid ""
"[<nick>]\n"
"\n"
" Ghosts the bot's given nick and takes it. If no nick is given,\n"
" ghosts the bot's configured nick and takes it.\n"
" "
msgstr ""
#: plugin.py:507
msgid "I cowardly refuse to ghost myself."
msgstr ""
#: plugin.py:512
msgid "You must set supybot.plugins.Services.NickServ before I'm able to ghost a nick."
msgstr ""
#: plugin.py:518
#, docstring
msgid ""
"<nick> [<password>]\n"
"\n"
" Sets the NickServ password for <nick> to <password>. If <password> is\n"
" not given, removes <nick> from the configured nicks.\n"
" "
msgstr ""
#: plugin.py:528
msgid "That nick was not configured with a password."
msgstr ""
#: plugin.py:539
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns the nicks that this plugin is configured to identify and ghost\n"
" with.\n"
" "
msgstr ""
#: plugin.py:549
msgid "I'm not currently configured for any nicks."
msgstr ""

View File

@ -40,7 +40,10 @@ 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('Services')
@internationalizeDocstring
class Services(callbacks.Plugin): class Services(callbacks.Plugin):
"""This plugin handles dealing with Services on networks that provide them. """This plugin handles dealing with Services on networks that provide them.
Basically, you should use the "password" command to tell the bot a nick to Basically, you should use the "password" command to tell the bot a nick to
@ -390,10 +393,11 @@ class Services(callbacks.Plugin):
'supybot.plugins.Services.ChanServ before ' 'supybot.plugins.Services.ChanServ before '
'I can send commands to ChanServ.', command) 'I can send commands to ChanServ.', command)
else: else:
irc.error('You must set supybot.plugins.Services.ChanServ ' irc.error(_('You must set supybot.plugins.Services.ChanServ '
'before I\'m able to send the %s command.' % command, 'before I\'m able to send the %s command.') % command,
Raise=True) Raise=True)
@internationalizeDocstring
def op(self, irc, msg, args, channel): def op(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -401,11 +405,12 @@ class Services(callbacks.Plugin):
necessary if the message isn't sent in the channel itself. necessary if the message isn't sent in the channel itself.
""" """
if irc.nick in irc.state.channels[channel].ops: if irc.nick in irc.state.channels[channel].ops:
irc.error(format('I\'m already opped in %s.', channel)) irc.error(format(_('I\'m already opped in %s.'), channel))
else: else:
self._chanservCommand(irc, channel, 'op') self._chanservCommand(irc, channel, 'op')
op = wrap(op, [('checkChannelCapability', 'op'), 'inChannel']) op = wrap(op, [('checkChannelCapability', 'op'), 'inChannel'])
@internationalizeDocstring
def voice(self, irc, msg, args, channel): def voice(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -413,7 +418,7 @@ class Services(callbacks.Plugin):
necessary if the message isn't sent in the channel itself. necessary if the message isn't sent in the channel itself.
""" """
if irc.nick in irc.state.channels[channel].voices: if irc.nick in irc.state.channels[channel].voices:
irc.error(format('I\'m already voiced in %s.', channel)) irc.error(format(_('I\'m already voiced in %s.'), channel))
else: else:
self._chanservCommand(irc, channel, 'voice') self._chanservCommand(irc, channel, 'voice')
voice = wrap(voice, [('checkChannelCapability', 'op'), 'inChannel']) voice = wrap(voice, [('checkChannelCapability', 'op'), 'inChannel'])
@ -428,6 +433,7 @@ class Services(callbacks.Plugin):
self._chanservCommand(irc, channel, 'unban', log=True) self._chanservCommand(irc, channel, 'unban', log=True)
# Success log in doChanservNotice. # Success log in doChanservNotice.
@internationalizeDocstring
def unban(self, irc, msg, args, channel): def unban(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -448,6 +454,7 @@ class Services(callbacks.Plugin):
self.log.info('%s is +i, attempting ChanServ invite %s.', channel, on) self.log.info('%s is +i, attempting ChanServ invite %s.', channel, on)
self._chanservCommand(irc, channel, 'invite', log=True) self._chanservCommand(irc, channel, 'invite', log=True)
@internationalizeDocstring
def invite(self, irc, msg, args, channel): def invite(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -468,6 +475,7 @@ class Services(callbacks.Plugin):
self.log.info('Joining %s, invited by ChanServ %s.', channel, on) self.log.info('Joining %s, invited by ChanServ %s.', channel, on)
irc.queueMsg(networkGroup.channels.join(channel)) irc.queueMsg(networkGroup.channels.join(channel))
@internationalizeDocstring
def identify(self, irc, msg, args): def identify(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -478,13 +486,14 @@ class Services(callbacks.Plugin):
self._doIdentify(irc, irc.nick) self._doIdentify(irc, irc.nick)
irc.replySuccess() irc.replySuccess()
else: else:
irc.error('I don\'t have a configured password for ' irc.error(_('I don\'t have a configured password for '
'my current nick.') 'my current nick.'))
else: else:
irc.error('You must set supybot.plugins.Services.NickServ before ' irc.error(_('You must set supybot.plugins.Services.NickServ before '
'I\'m able to do identify.') 'I\'m able to do identify.'))
identify = wrap(identify, [('checkCapability', 'admin')]) identify = wrap(identify, [('checkCapability', 'admin')])
@internationalizeDocstring
def ghost(self, irc, msg, args, nick): def ghost(self, irc, msg, args, nick):
"""[<nick>] """[<nick>]
@ -495,15 +504,16 @@ class Services(callbacks.Plugin):
if not nick: if not nick:
nick = self._getNick() nick = self._getNick()
if ircutils.strEqual(nick, irc.nick): if ircutils.strEqual(nick, irc.nick):
irc.error('I cowardly refuse to ghost myself.') irc.error(_('I cowardly refuse to ghost myself.'))
else: else:
self._doGhost(irc, nick=nick) self._doGhost(irc, nick=nick)
irc.replySuccess() irc.replySuccess()
else: else:
irc.error('You must set supybot.plugins.Services.NickServ before ' irc.error(_('You must set supybot.plugins.Services.NickServ before '
'I\'m able to ghost a nick.') 'I\'m able to ghost a nick.'))
ghost = wrap(ghost, [('checkCapability', 'admin'), additional('nick')]) ghost = wrap(ghost, [('checkCapability', 'admin'), additional('nick')])
@internationalizeDocstring
def password(self, irc, msg, args, nick, password): def password(self, irc, msg, args, nick, password):
"""<nick> [<password>] """<nick> [<password>]
@ -515,7 +525,7 @@ class Services(callbacks.Plugin):
self.registryValue('nicks').remove(nick) self.registryValue('nicks').remove(nick)
irc.replySuccess() irc.replySuccess()
except KeyError: except KeyError:
irc.error('That nick was not configured with a password.') irc.error(_('That nick was not configured with a password.'))
return return
else: else:
self.registryValue('nicks').add(nick) self.registryValue('nicks').add(nick)
@ -524,6 +534,7 @@ class Services(callbacks.Plugin):
password = wrap(password, [('checkCapability', 'admin'), password = wrap(password, [('checkCapability', 'admin'),
'private', 'nick', 'text']) 'private', 'nick', 'text'])
@internationalizeDocstring
def nicks(self, irc, msg, args): def nicks(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -535,7 +546,7 @@ class Services(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 configured for any nicks.') irc.reply(_('I\'m not currently configured for any nicks.'))
nicks = wrap(nicks, [('checkCapability', 'admin')]) nicks = wrap(nicks, [('checkCapability', 'admin')])

View File

@ -30,13 +30,15 @@
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('ShrinkUrl')
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('ShrinkUrl', True) conf.registerPlugin('ShrinkUrl', True)
if yn("""This plugin offers a snarfer that will go retrieve a shorter if yn(_("""This plugin offers a snarfer that will go retrieve a shorter
version of long URLs that are sent to the channel. Would you version of long URLs that are sent to the channel. Would you
like this snarfer to be enabled?""", default=False): like this snarfer to be enabled?"""), default=False):
conf.supybot.plugins.ShrinkUrl.shrinkSnarfer.setValue(True) conf.supybot.plugins.ShrinkUrl.shrinkSnarfer.setValue(True)
class ShrinkService(registry.OnlySomeStrings): class ShrinkService(registry.OnlySomeStrings):
@ -66,34 +68,34 @@ class ShrinkCycle(registry.SpaceSeparatedListOfStrings):
ShrinkUrl = conf.registerPlugin('ShrinkUrl') ShrinkUrl = conf.registerPlugin('ShrinkUrl')
conf.registerChannelValue(ShrinkUrl, 'shrinkSnarfer', conf.registerChannelValue(ShrinkUrl, 'shrinkSnarfer',
registry.Boolean(False, """Determines whether the registry.Boolean(False, _("""Determines whether the
shrink snarfer is enabled. This snarfer will watch for URLs in the shrink snarfer is enabled. This snarfer will watch for URLs in the
channel, and if they're sufficiently long (as determined by channel, and if they're sufficiently long (as determined by
supybot.plugins.ShrinkUrl.minimumLength) it will post a supybot.plugins.ShrinkUrl.minimumLength) it will post a
smaller URL from either ln-s.net or tinyurl.com, as denoted in smaller URL from either ln-s.net or tinyurl.com, as denoted in
supybot.plugins.ShrinkUrl.default.""")) supybot.plugins.ShrinkUrl.default.""")))
conf.registerChannelValue(ShrinkUrl.shrinkSnarfer, 'showDomain', conf.registerChannelValue(ShrinkUrl.shrinkSnarfer, 'showDomain',
registry.Boolean(True, """Determines whether the snarfer will show the registry.Boolean(True, _("""Determines whether the snarfer will show the
domain of the URL being snarfed along with the shrunken URL.""")) domain of the URL being snarfed along with the shrunken URL.""")))
conf.registerChannelValue(ShrinkUrl, 'minimumLength', conf.registerChannelValue(ShrinkUrl, 'minimumLength',
registry.PositiveInteger(48, """The minimum length a URL must be before registry.PositiveInteger(48, _("""The minimum length a URL must be before
the bot will shrink it.""")) the bot will shrink it.""")))
conf.registerChannelValue(ShrinkUrl, 'nonSnarfingRegexp', conf.registerChannelValue(ShrinkUrl, 'nonSnarfingRegexp',
registry.Regexp(None, """Determines what URLs are to be snarfed; URLs registry.Regexp(None, _("""Determines what URLs are to be snarfed; URLs
matching the regexp given will not be snarfed. Give the empty string if matching the regexp given will not be snarfed. Give the empty string if
you have no URLs that you'd like to exclude from being snarfed.""")) you have no URLs that you'd like to exclude from being snarfed.""")))
conf.registerChannelValue(ShrinkUrl, 'outFilter', conf.registerChannelValue(ShrinkUrl, 'outFilter',
registry.Boolean(False, """Determines whether the bot will shrink the URLs registry.Boolean(False, _("""Determines whether the bot will shrink the
of outgoing messages if those URLs are longer than URLs of outgoing messages if those URLs are longer than
supybot.plugins.ShrinkUrl.minimumLength.""")) supybot.plugins.ShrinkUrl.minimumLength.""")))
conf.registerChannelValue(ShrinkUrl, 'default', conf.registerChannelValue(ShrinkUrl, 'default',
ShrinkService('ln', """Determines what website the bot will use when ShrinkService('ln', _("""Determines what website the bot will use when
shrinking a URL.""")) shrinking a URL.""")))
conf.registerGlobalValue(ShrinkUrl, 'bold', conf.registerGlobalValue(ShrinkUrl, 'bold',
registry.Boolean(True, """Determines whether this plugin will bold certain registry.Boolean(True, _("""Determines whether this plugin will bold
portions of its replies.""")) certain portions of its replies.""")))
conf.registerChannelValue(ShrinkUrl, 'serviceRotation', conf.registerChannelValue(ShrinkUrl, 'serviceRotation',
ShrinkCycle([], """If set to a non-empty value, specifies the list of ShrinkCycle([], _("""If set to a non-empty value, specifies the list of
services to rotate through for the shrinkSnarfer and outFilter.""")) services to rotate through for the shrinkSnarfer and outFilter.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -0,0 +1,119 @@
# 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-20 08:55+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 ""
"This plugin offers a snarfer that will go retrieve a shorter\n"
" version of long URLs that are sent to the channel. Would you\n"
" like this snarfer to be enabled?"
msgstr ""
#: config.py:45 config.py:49
#, docstring
msgid "Valid values include 'ln', 'tiny', 'xrl', and 'x0'."
msgstr ""
#: config.py:71
msgid ""
"Determines whether the\n"
" shrink snarfer is enabled. This snarfer will watch for URLs in the\n"
" channel, and if they're sufficiently long (as determined by\n"
" supybot.plugins.ShrinkUrl.minimumLength) it will post a\n"
" smaller URL from either ln-s.net or tinyurl.com, as denoted in\n"
" supybot.plugins.ShrinkUrl.default."
msgstr ""
#: config.py:78
msgid ""
"Determines whether the snarfer will show the\n"
" domain of the URL being snarfed along with the shrunken URL."
msgstr ""
#: config.py:81
msgid ""
"The minimum length a URL must be before\n"
" the bot will shrink it."
msgstr ""
#: config.py:84
msgid ""
"Determines what URLs are to be snarfed; URLs\n"
" matching the regexp given will not be snarfed. Give the empty string if\n"
" you have no URLs that you'd like to exclude from being snarfed."
msgstr ""
#: config.py:88
msgid ""
"Determines whether the bot will shrink the\n"
" URLs of outgoing messages if those URLs are longer than\n"
" supybot.plugins.ShrinkUrl.minimumLength."
msgstr ""
#: config.py:92
msgid ""
"Determines what website the bot will use when\n"
" shrinking a URL."
msgstr ""
#: config.py:95
msgid ""
"Determines whether this plugin will bold\n"
" certain portions of its replies."
msgstr ""
#: config.py:98
msgid ""
"If set to a non-empty value, specifies the list of\n"
" services to rotate through for the shrinkSnarfer and outFilter."
msgstr ""
#: plugin.py:169
#, docstring
msgid ""
"<url>\n"
"\n"
" Returns an ln-s.net version of <url>.\n"
" "
msgstr ""
#: plugin.py:194
#, docstring
msgid ""
"<url>\n"
"\n"
" Returns a TinyURL.com version of <url>\n"
" "
msgstr ""
#: plugin.py:222
#, docstring
msgid ""
"<url>\n"
"\n"
" Returns an xrl.us version of <url>.\n"
" "
msgstr ""
#: plugin.py:248
#, docstring
msgid ""
"<url>\n"
"\n"
" Returns an x0.no version of <url>.\n"
" "
msgstr ""

View File

@ -37,6 +37,8 @@ import supybot.ircmsgs as ircmsgs
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('ShrinkUrl')
class CdbShrunkenUrlDB(object): class CdbShrunkenUrlDB(object):
def __init__(self, filename): def __init__(self, filename):
@ -162,6 +164,7 @@ class ShrinkUrl(callbacks.PluginRegexp):
else: else:
raise ShrinkError, text raise ShrinkError, text
@internationalizeDocstring
def ln(self, irc, msg, args, url): def ln(self, irc, msg, args, url):
"""<url> """<url>
@ -186,6 +189,7 @@ class ShrinkUrl(callbacks.PluginRegexp):
self.db.set('tiny', url, text) self.db.set('tiny', url, text)
return text return text
@internationalizeDocstring
def tiny(self, irc, msg, args, url): def tiny(self, irc, msg, args, url):
"""<url> """<url>
@ -213,6 +217,7 @@ class ShrinkUrl(callbacks.PluginRegexp):
self.db.set('xrl', quotedurl, text) self.db.set('xrl', quotedurl, text)
return text return text
@internationalizeDocstring
def xrl(self, irc, msg, args, url): def xrl(self, irc, msg, args, url):
"""<url> """<url>
@ -238,6 +243,7 @@ class ShrinkUrl(callbacks.PluginRegexp):
self.db.set('x0', url, text) self.db.set('x0', url, text)
return text return text
@internationalizeDocstring
def x0(self, irc, msg, args, url): def x0(self, irc, msg, args, url):
"""<url> """<url>

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('Status')
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,13 +43,13 @@ def configure(advanced):
Status = conf.registerPlugin('Status') Status = conf.registerPlugin('Status')
conf.registerGroup(Status, 'cpu') conf.registerGroup(Status, 'cpu')
conf.registerChannelValue(Status.cpu, 'children', conf.registerChannelValue(Status.cpu, 'children',
registry.Boolean(True, """Determines whether the cpu command will list the registry.Boolean(True, _("""Determines whether the cpu command will list
time taken by children as well as the bot's process.""")) the time taken by children as well as the bot's process.""")))
conf.registerChannelValue(Status.cpu, 'threads', conf.registerChannelValue(Status.cpu, 'threads',
registry.Boolean(False, """Determines whether the cpu command will provide registry.Boolean(False, _("""Determines whether the cpu command will
the number of threads spawned and active.""")) provide the number of threads spawned and active.""")))
conf.registerChannelValue(Status.cpu, 'memory', conf.registerChannelValue(Status.cpu, 'memory',
registry.Boolean(True, """Determines whether the cpu command will report registry.Boolean(True, _("""Determines whether the cpu command will report
the amount of memory being used by the bot.""")) the amount of memory being used by the bot.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

155
plugins/Status/messages.pot Normal file
View File

@ -0,0 +1,155 @@
# 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-20 09:05+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 cpu command will list\n"
" the time taken by children as well as the bot's process."
msgstr ""
#: config.py:49
msgid ""
"Determines whether the cpu command will\n"
" provide the number of threads spawned and active."
msgstr ""
#: config.py:52
msgid ""
"Determines whether the cpu command will report\n"
" the amount of memory being used by the bot."
msgstr ""
#: plugin.py:71
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns the status of the bot.\n"
" "
msgstr ""
#: plugin.py:80
msgid "%s as %L"
msgstr ""
#: plugin.py:81
msgid "I am connected to %L."
msgstr ""
#: plugin.py:83
msgid "I am currently in code profiling mode."
msgstr ""
#: plugin.py:89
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns the current threads that are active.\n"
" "
msgstr ""
#: plugin.py:95
msgid "I have spawned %n; %n %b still currently active: %L."
msgstr ""
#: plugin.py:103
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns some interesting network-related statistics.\n"
" "
msgstr ""
#: plugin.py:111
msgid "an indeterminate amount of time"
msgstr ""
#: plugin.py:112
msgid "I have received %s messages for a total of %s bytes. I have sent %s messages for a total of %s bytes. I have been connected to %s for %s."
msgstr ""
#: plugin.py:121
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns some interesting CPU-related statistics on the bot.\n"
" "
msgstr ""
#: plugin.py:131
msgid "My children have taken %.2f seconds of user time and %.2f seconds of system time for a total of %.2f seconds of CPU time. "
msgstr ""
#: plugin.py:138
msgid "I have taken %.2f seconds of user time and %.2f seconds of system time, for a total of %.2f seconds of CPU time. %s"
msgstr ""
#: plugin.py:160
msgid "Unable to run ps command."
msgstr ""
#: plugin.py:166
msgid " I'm taking up %s kB of memory."
msgstr ""
#: plugin.py:174
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns some interesting command-related statistics.\n"
" "
msgstr ""
#: plugin.py:184
msgid "I offer a total of %n in %n. I have processed %n."
msgstr ""
#: plugin.py:193
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns a list of the commands offered by the bot.\n"
" "
msgstr ""
#: plugin.py:207
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns the amount of time the bot has been running.\n"
" "
msgstr ""
#: plugin.py:211
msgid "I have been running for %s."
msgstr ""
#: plugin.py:218
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns the server the bot is on.\n"
" "
msgstr ""

View File

@ -39,6 +39,8 @@ import supybot.utils as utils
import supybot.world as world import supybot.world as world
from supybot.commands import * from supybot.commands import *
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Status')
class Status(callbacks.Plugin): class Status(callbacks.Plugin):
def __init__(self, irc): def __init__(self, irc):
@ -64,6 +66,7 @@ class Status(callbacks.Plugin):
def do001(self, irc, msg): def do001(self, irc, msg):
self.connected[irc] = time.time() self.connected[irc] = time.time()
@internationalizeDocstring
def status(self, irc, msg, args): def status(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -74,13 +77,14 @@ class Status(callbacks.Plugin):
networks.setdefault(Irc.network, []).append(Irc.nick) networks.setdefault(Irc.network, []).append(Irc.nick)
networks = networks.items() networks = networks.items()
networks.sort() networks.sort()
networks = [format('%s as %L', net, nicks) for (net,nicks) in networks] networks = [format(_('%s as %L'), net, nicks) for (net,nicks) in networks]
L = [format('I am connected to %L.', networks)] L = [format(_('I am connected to %L.'), networks)]
if world.profiling: if world.profiling:
L.append('I am currently in code profiling mode.') L.append(_('I am currently in code profiling mode.'))
irc.reply(' '.join(L)) irc.reply(' '.join(L))
status = wrap(status) status = wrap(status)
@internationalizeDocstring
def threads(self, irc, msg, args): def threads(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -88,12 +92,13 @@ class Status(callbacks.Plugin):
""" """
threads = [t.getName() for t in threading.enumerate()] threads = [t.getName() for t in threading.enumerate()]
threads.sort() threads.sort()
s = format('I have spawned %n; %n %b still currently active: %L.', s = format(_('I have spawned %n; %n %b still currently active: %L.'),
(world.threadsSpawned, 'thread'), (world.threadsSpawned, 'thread'),
(len(threads), 'thread'), len(threads), threads) (len(threads), 'thread'), len(threads), threads)
irc.reply(s) irc.reply(s)
threads = wrap(threads) threads = wrap(threads)
@internationalizeDocstring
def net(self, irc, msg, args): def net(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -103,14 +108,15 @@ class Status(callbacks.Plugin):
elapsed = time.time() - self.connected[irc.getRealIrc()] elapsed = time.time() - self.connected[irc.getRealIrc()]
timeElapsed = utils.timeElapsed(elapsed) timeElapsed = utils.timeElapsed(elapsed)
except KeyError: except KeyError:
timeElapsed = 'an indeterminate amount of time' timeElapsed = _('an indeterminate amount of time')
irc.reply('I have received %s messages for a total of %s bytes. ' irc.reply(_('I have received %s messages for a total of %s bytes. '
'I have sent %s messages for a total of %s bytes. ' 'I have sent %s messages for a total of %s bytes. '
'I have been connected to %s for %s.' % 'I have been connected to %s for %s.') %
(self.recvdMsgs, self.recvdBytes, (self.recvdMsgs, self.recvdBytes,
self.sentMsgs, self.sentBytes, irc.server, timeElapsed)) self.sentMsgs, self.sentBytes, irc.server, timeElapsed))
net = wrap(net) net = wrap(net)
@internationalizeDocstring
def cpu(self, irc, msg, args): def cpu(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -122,16 +128,16 @@ class Status(callbacks.Plugin):
timeRunning = now - world.startedAt timeRunning = now - world.startedAt
if self.registryValue('cpu.children', target) and \ if self.registryValue('cpu.children', target) and \
user+system < timeRunning+1: # Fudge for FPU inaccuracies. user+system < timeRunning+1: # Fudge for FPU inaccuracies.
children = 'My children have taken %.2f seconds of user time ' \ children = _('My children have taken %.2f seconds of user time '
'and %.2f seconds of system time ' \ 'and %.2f seconds of system time '
'for a total of %.2f seconds of CPU time. ' % \ 'for a total of %.2f seconds of CPU time. ') % \
(childUser, childSystem, childUser+childSystem) (childUser, childSystem, childUser+childSystem)
else: else:
children = '' children = ''
activeThreads = threading.activeCount() activeThreads = threading.activeCount()
response = 'I have taken %.2f seconds of user time and %.2f seconds ' \ response = _('I have taken %.2f seconds of user time and %.2f seconds '
'of system time, for a total of %.2f seconds of CPU ' \ 'of system time, for a total of %.2f seconds of CPU '
'time. %s' % (user, system, user + system, children) 'time. %s') % (user, system, user + system, children)
if self.registryValue('cpu.threads', target): if self.registryValue('cpu.threads', target):
response += format('I have spawned %n; I currently have %i still ' response += format('I have spawned %n; I currently have %i still '
'running.', 'running.',
@ -151,18 +157,19 @@ class Status(callbacks.Plugin):
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE) stderr=subprocess.PIPE)
except OSError: except OSError:
irc.error('Unable to run ps command.', Raise=True) irc.error(_('Unable to run ps command.'), Raise=True)
(out, _) = inst.communicate() (out, foo) = inst.communicate()
inst.wait() inst.wait()
mem = out.splitlines()[1] mem = out.splitlines()[1]
elif sys.platform.startswith('netbsd'): elif sys.platform.startswith('netbsd'):
mem = '%s kB' % os.stat('/proc/%s/mem' % pid)[7] mem = '%s kB' % os.stat('/proc/%s/mem' % pid)[7]
response += ' I\'m taking up %s kB of memory.' % mem response += _(' I\'m taking up %s kB of memory.') % mem
except Exception: except Exception:
self.log.exception('Uncaught exception in cpu.memory:') self.log.exception('Uncaught exception in cpu.memory:')
irc.reply(utils.str.normalizeWhitespace(response)) irc.reply(utils.str.normalizeWhitespace(response))
cpu = wrap(cpu) cpu = wrap(cpu)
@internationalizeDocstring
def cmd(self, irc, msg, args): def cmd(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -174,13 +181,14 @@ class Status(callbacks.Plugin):
if isinstance(cb, callbacks.Plugin): if isinstance(cb, callbacks.Plugin):
callbacksPlugin += 1 callbacksPlugin += 1
commands += len(cb.listCommands()) commands += len(cb.listCommands())
s = format('I offer a total of %n in %n. I have processed %n.', s = format(_('I offer a total of %n in %n. I have processed %n.'),
(commands, 'command'), (commands, 'command'),
(callbacksPlugin, 'command-based', 'plugin'), (callbacksPlugin, 'command-based', 'plugin'),
(world.commandsProcessed, 'command')) (world.commandsProcessed, 'command'))
irc.reply(s) irc.reply(s)
cmd = wrap(cmd) cmd = wrap(cmd)
@internationalizeDocstring
def commands(self, irc, msg, args): def commands(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -194,16 +202,18 @@ class Status(callbacks.Plugin):
irc.reply(format('%L', sorted(commands))) irc.reply(format('%L', sorted(commands)))
commands = wrap(commands) commands = wrap(commands)
@internationalizeDocstring
def uptime(self, irc, msg, args): def uptime(self, irc, msg, args):
"""takes no arguments """takes no arguments
Returns the amount of time the bot has been running. Returns the amount of time the bot has been running.
""" """
response = 'I have been running for %s.' % \ response = _('I have been running for %s.') % \
utils.timeElapsed(time.time() - world.startedAt) utils.timeElapsed(time.time() - world.startedAt)
irc.reply(response) irc.reply(response)
uptime = wrap(uptime) uptime = wrap(uptime)
@internationalizeDocstring
def server(self, irc, msg, args): def server(self, irc, msg, args):
"""takes no arguments """takes no arguments

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('String')
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,13 +44,13 @@ def configure(advanced):
String = conf.registerPlugin('String') String = conf.registerPlugin('String')
conf.registerGroup(String, 'levenshtein') conf.registerGroup(String, 'levenshtein')
conf.registerGlobalValue(String.levenshtein, 'max', conf.registerGlobalValue(String.levenshtein, 'max',
registry.PositiveInteger(256, """Determines the maximum size of a string registry.PositiveInteger(256, _("""Determines the maximum size of a string
given to the levenshtein command. The levenshtein command uses an O(m*n) given to the levenshtein command. The levenshtein command uses an O(m*n)
algorithm, which means that with strings of length 256, it can take 1.5 algorithm, which means that with strings of length 256, it can take 1.5
seconds to finish; with strings of length 384, though, it can take 4 seconds to finish; with strings of length 384, though, it can take 4
seconds to finish, and with strings of much larger lengths, it takes more seconds to finish, and with strings of much larger lengths, it takes more
and more time. Using nested commands, strings can get quite large, hence and more time. Using nested commands, strings can get quite large, hence
this variable, to limit the size of arguments passed to the levenshtein this variable, to limit the size of arguments passed to the levenshtein
command.""")) command.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

168
plugins/String/messages.pot Normal file
View File

@ -0,0 +1,168 @@
# 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-20 09:08+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:47
msgid ""
"Determines the maximum size of a string\n"
" given to the levenshtein command. The levenshtein command uses an O(m*n)\n"
" algorithm, which means that with strings of length 256, it can take 1.5\n"
" seconds to finish; with strings of length 384, though, it can take 4\n"
" seconds to finish, and with strings of much larger lengths, it takes more\n"
" and more time. Using nested commands, strings can get quite large, hence\n"
" this variable, to limit the size of arguments passed to the levenshtein\n"
" command."
msgstr ""
#: plugin.py:46
#, docstring
msgid ""
"<letter>\n"
"\n"
" Returns the 8-bit value of <letter>.\n"
" "
msgstr ""
#: plugin.py:55
#, docstring
msgid ""
"<number>\n"
"\n"
" Returns the character associated with the 8-bit value <number>\n"
" "
msgstr ""
#: plugin.py:62
msgid "That number doesn't map to an 8-bit character."
msgstr ""
#: plugin.py:67
#, docstring
msgid ""
"<encoding> <text>\n"
"\n"
" Returns an encoded form of the given text; the valid encodings are\n"
" available in the documentation of the Python codecs module:\n"
" <http://docs.python.org/library/codecs.html#standard-encodings>.\n"
" "
msgstr ""
#: plugin.py:76 plugin.py:90
msgid "encoding"
msgstr ""
#: plugin.py:81
#, docstring
msgid ""
"<encoding> <text>\n"
"\n"
" Returns an un-encoded form of the given text; the valid encodings are\n"
" available in the documentation of the Python codecs module:\n"
" <http://docs.python.org/library/codecs.html#standard-encodings>.\n"
" "
msgstr ""
#: plugin.py:92
msgid "base64 string"
msgstr ""
#: plugin.py:93
msgid "Base64 strings must be a multiple of 4 in length, padded with '=' if necessary."
msgstr ""
#: plugin.py:99
#, docstring
msgid ""
"<string1> <string2>\n"
"\n"
" Returns the levenshtein distance (also known as the \"edit distance\"\n"
" between <string1> and <string2>)\n"
" "
msgstr ""
#: plugin.py:106
msgid "Levenshtein distance is a complicated algorithm, try it with some smaller inputs."
msgstr ""
#: plugin.py:114
#, docstring
msgid ""
"<string> [<length>]\n"
"\n"
" Returns the Soundex hash to a given length. The length defaults to\n"
" 4, since that's the standard length for a soundex hash. For unlimited\n"
" length, use 0.\n"
" "
msgstr ""
#: plugin.py:125
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns the length of <text>.\n"
" "
msgstr ""
#: plugin.py:134
#, docstring
msgid ""
"<regexp> <text>\n"
"\n"
" If <regexp> is of the form m/regexp/flags, returns the portion of\n"
" <text> that matches the regexp. If <regexp> is of the form\n"
" s/regexp/replacement/flags, returns the result of applying such a\n"
" regexp to <text>.\n"
" "
msgstr ""
#: plugin.py:146
msgid "You probably don't want to match the empty string."
msgstr ""
#: plugin.py:156
#, docstring
msgid ""
"<password> <text>\n"
"\n"
" Returns <text> XOR-encrypted with <password>. See\n"
" http://www.yoe.org/developer/xor.html for information about XOR\n"
" encryption.\n"
" "
msgstr ""
#: plugin.py:169
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns the md5 hash of a given string. Read\n"
" http://www.rsasecurity.com/rsalabs/faq/3-6-6.html for more information\n"
" about md5.\n"
" "
msgstr ""
#: plugin.py:180
#, docstring
msgid ""
"<text>\n"
"\n"
" Returns the SHA hash of a given string. Read\n"
" http://www.secure-hash-algorithm-md5-sha-1.co.uk/ for more information\n"
" about SHA.\n"
" "
msgstr ""

View File

@ -36,9 +36,12 @@ 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('String')
class String(callbacks.Plugin): class String(callbacks.Plugin):
@internationalizeDocstring
def ord(self, irc, msg, args, letter): def ord(self, irc, msg, args, letter):
"""<letter> """<letter>
@ -47,6 +50,7 @@ class String(callbacks.Plugin):
irc.reply(str(ord(letter))) irc.reply(str(ord(letter)))
ord = wrap(ord, ['letter']) ord = wrap(ord, ['letter'])
@internationalizeDocstring
def chr(self, irc, msg, args, i): def chr(self, irc, msg, args, i):
"""<number> """<number>
@ -55,9 +59,10 @@ class String(callbacks.Plugin):
try: try:
irc.reply(chr(i)) irc.reply(chr(i))
except ValueError: except ValueError:
irc.error('That number doesn\'t map to an 8-bit character.') irc.error(_('That number doesn\'t map to an 8-bit character.'))
chr = wrap(chr, ['int']) chr = wrap(chr, ['int'])
@internationalizeDocstring
def encode(self, irc, msg, args, encoding, text): def encode(self, irc, msg, args, encoding, text):
"""<encoding> <text> """<encoding> <text>
@ -68,9 +73,10 @@ class String(callbacks.Plugin):
try: try:
irc.reply(text.encode(encoding).rstrip('\n')) irc.reply(text.encode(encoding).rstrip('\n'))
except LookupError: except LookupError:
irc.errorInvalid('encoding', encoding) irc.errorInvalid(_('encoding'), encoding)
encode = wrap(encode, ['something', 'text']) encode = wrap(encode, ['something', 'text'])
@internationalizeDocstring
def decode(self, irc, msg, args, encoding, text): def decode(self, irc, msg, args, encoding, text):
"""<encoding> <text> """<encoding> <text>
@ -81,13 +87,14 @@ class String(callbacks.Plugin):
try: try:
irc.reply(text.decode(encoding).encode('utf-8')) irc.reply(text.decode(encoding).encode('utf-8'))
except LookupError: except LookupError:
irc.errorInvalid('encoding', encoding) irc.errorInvalid(_('encoding'), encoding)
except binascii.Error: except binascii.Error:
irc.errorInvalid('base64 string', irc.errorInvalid(_('base64 string'),
s='Base64 strings must be a multiple of 4 in ' s=_('Base64 strings must be a multiple of 4 in '
'length, padded with \'=\' if necessary.') 'length, padded with \'=\' if necessary.'))
decode = wrap(decode, ['something', 'text']) decode = wrap(decode, ['something', 'text'])
@internationalizeDocstring
def levenshtein(self, irc, msg, args, s1, s2): def levenshtein(self, irc, msg, args, s1, s2):
"""<string1> <string2> """<string1> <string2>
@ -96,12 +103,13 @@ class String(callbacks.Plugin):
""" """
max = self.registryValue('levenshtein.max') max = self.registryValue('levenshtein.max')
if len(s1) > max or len(s2) > max: if len(s1) > max or len(s2) > max:
irc.error('Levenshtein distance is a complicated algorithm, try ' irc.error(_('Levenshtein distance is a complicated algorithm, try '
'it with some smaller inputs.') 'it with some smaller inputs.'))
else: else:
irc.reply(str(utils.str.distance(s1, s2))) irc.reply(str(utils.str.distance(s1, s2)))
levenshtein = wrap(levenshtein, ['something', 'text']) levenshtein = wrap(levenshtein, ['something', 'text'])
@internationalizeDocstring
def soundex(self, irc, msg, args, text, length): def soundex(self, irc, msg, args, text, length):
"""<string> [<length>] """<string> [<length>]
@ -112,6 +120,7 @@ class String(callbacks.Plugin):
irc.reply(utils.str.soundex(text, length)) irc.reply(utils.str.soundex(text, length))
soundex = wrap(soundex, ['somethingWithoutSpaces', additional('int', 4)]) soundex = wrap(soundex, ['somethingWithoutSpaces', additional('int', 4)])
@internationalizeDocstring
def len(self, irc, msg, args, text): def len(self, irc, msg, args, text):
"""<text> """<text>
@ -120,6 +129,7 @@ class String(callbacks.Plugin):
irc.reply(str(len(text))) irc.reply(str(len(text)))
len = wrap(len, ['text']) len = wrap(len, ['text'])
@internationalizeDocstring
def re(self, irc, msg, args, ff, text): def re(self, irc, msg, args, ff, text):
"""<regexp> <text> """<regexp> <text>
@ -133,7 +143,7 @@ class String(callbacks.Plugin):
else: else:
f = lambda s: ff.search(s) and ff.search(s).group(0) or '' f = lambda s: ff.search(s) and ff.search(s).group(0) or ''
if f('') and len(f(' ')) > len(f(''))+1: # Matches the empty string. if f('') and len(f(' ')) > len(f(''))+1: # Matches the empty string.
s = 'You probably don\'t want to match the empty string.' s = _('You probably don\'t want to match the empty string.')
irc.error(s) irc.error(s)
else: else:
irc.reply(f(text)) irc.reply(f(text))
@ -141,6 +151,7 @@ class String(callbacks.Plugin):
first('regexpMatcher', 'regexpReplacer'), first('regexpMatcher', 'regexpReplacer'),
'text']) 'text'])
@internationalizeDocstring
def xor(self, irc, msg, args, password, text): def xor(self, irc, msg, args, password, text):
"""<password> <text> """<password> <text>
@ -153,6 +164,7 @@ class String(callbacks.Plugin):
irc.reply(''.join(ret)) irc.reply(''.join(ret))
xor = wrap(xor, ['something', 'text']) xor = wrap(xor, ['something', 'text'])
@internationalizeDocstring
def md5(self, irc, msg, args, text): def md5(self, irc, msg, args, text):
"""<text> """<text>
@ -163,6 +175,7 @@ class String(callbacks.Plugin):
irc.reply(utils.crypt.md5(text).hexdigest()) irc.reply(utils.crypt.md5(text).hexdigest())
md5 = wrap(md5, ['text']) md5 = wrap(md5, ['text'])
@internationalizeDocstring
def sha(self, irc, msg, args, text): def sha(self, irc, msg, args, text):
"""<text> """<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('Success')
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):
Success = conf.registerPlugin('Success') Success = conf.registerPlugin('Success')
# 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(Success, 'someConfigVariableName', # conf.registerGlobalValue(Success, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName.""")) # registry.Boolean(False, _("""Help for someConfigVariableName.""")))
conf.registerChannelValue(conf.supybot.plugins.Success, 'prefixNick', conf.registerChannelValue(conf.supybot.plugins.Success, '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 success response.""")) of the user giving an invalid command to the success response.""")))
# vim:set shiftwidth=4 softtabstop=8 expandtab textwidth=78 # vim:set shiftwidth=4 softtabstop=8 expandtab textwidth=78

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-20 09:09+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 prefix the nick\n"
" of the user giving an invalid command to the success response."
msgstr ""
#: plugin.py:39
#, docstring
msgid ""
"This plugin was written initially to work with MoobotFactoids, the two\n"
" of them to provide a similar-to-moobot-and-blootbot interface for factoids.\n"
" Basically, it replaces the standard 'The operation succeeded.' messages\n"
" with messages kept in a database, able to give more personable\n"
" responses."
msgstr ""

View File

@ -31,7 +31,10 @@ import supybot.conf as conf
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('Success')
@internationalizeDocstring
class Success(plugins.ChannelIdDatabasePlugin): class Success(plugins.ChannelIdDatabasePlugin):
"""This plugin was written initially to work with MoobotFactoids, the two """This plugin was written initially to work with MoobotFactoids, the two
of them to provide a similar-to-moobot-and-blootbot interface for factoids. of them to provide a similar-to-moobot-and-blootbot interface for factoids.