Merge branch 'i18n' into l10n-fr

This commit is contained in:
Valentin Lorentz 2010-10-17 18:37:47 +02:00
commit 61780358ee
100 changed files with 5245 additions and 540 deletions

View File

@ -269,7 +269,7 @@ 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' irc.error(_('The "owner" capability can\'t be added in the '
'bot. 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.'))

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,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,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,7 +33,10 @@ 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')
@internationalizeDocstring
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'
command has the bot perform an anonymous action in a given channel, and command has the bot perform an anonymous action in a given channel, and
@ -73,6 +76,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 +90,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>

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,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,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

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

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

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

@ -0,0 +1,134 @@
# 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 12:34+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: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.
@ -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,9 +145,11 @@ 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>
@ -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

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

@ -0,0 +1,64 @@
# 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: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:77
#, docstring
msgid "\001PING ?(.*)\001"
msgstr ""
#: plugin.py:86
#, docstring
msgid "\001VERSION\001"
msgstr ""
#: plugin.py:91
#, docstring
msgid "\001USERINFO\001"
msgstr ""
#: plugin.py:96
#, docstring
msgid "\001TIME\001"
msgstr ""
#: plugin.py:101
#, docstring
msgid "\001FINGER\001"
msgstr ""
#: plugin.py:104
msgid "FINGER Supybot, the best Python IRC bot in existence!"
msgstr ""
#: plugin.py:107
#, docstring
msgid "\001SOURCE\001"
msgstr ""
#: plugin.py:123
#, docstring
msgid ""
"[<channel>] [--nicks]\n"
"\n"
" Sends a CTCP VERSION to <channel>, returning the various\n"
" version strings returned. It waits for 10 seconds before returning\n"
" the versions received at that point. If --nicks is given, nicks are\n"
" associated with the version strings; otherwise, only the version\n"
" strings are given.\n"
" "
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
@ -99,7 +101,7 @@ class Ctcp(callbacks.PluginRegexp):
"\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 Supybot, the best Python IRC bot in existence!') _('FINGER 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:

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,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,7 +30,10 @@
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')
@internationalizeDocstring
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
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.

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,198 @@
# 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:59+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
#, 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 ""
"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,7 +282,7 @@ 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, _) = cursor.fetchone()
cursor.execute("""DELETE FROM factoids WHERE key_id=%s""", id) cursor.execute("""DELETE FROM factoids WHERE key_id=%s""", id)
@ -289,18 +295,19 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler):
try: try:
(_, id) = results[number-1] (_, 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

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,11 +39,14 @@ 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):
self.s = s self.s = s
@internationalizeDocstring
class Filter(callbacks.Plugin): class Filter(callbacks.Plugin):
"""This plugin offers several commands which transform text in some way. """This plugin offers several commands which transform text in some way.
It also provides the capability of using such commands to 'filter' the It also provides the capability of using such commands to 'filter' the
@ -77,6 +80,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 +95,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 +103,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 +115,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 +125,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 +138,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 +164,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 +174,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 +184,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 +198,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 +229,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 +249,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 +265,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 +330,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 +347,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 +359,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 +368,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 +376,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,6 +386,7 @@ 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>
@ -376,6 +397,7 @@ class Filter(callbacks.Plugin):
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 +406,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 +433,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 +531,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 +610,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 +619,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 +638,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 +687,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>

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

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

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:

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('Heral')
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:

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('Heral')
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,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,14 @@ 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')
@internationalizeDocstring
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 +51,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 +72,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 +80,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 +109,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 +135,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>

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:

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

@ -0,0 +1,137 @@
# 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 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:315
msgid "I didn't know the karma for any of those things."
msgstr ""
#: plugin.py:325 plugin.py:354
msgid "I have no karma for this channel."
msgstr ""
#: plugin.py:330
msgid " You (%s) are ranked %i out of %i."
msgstr ""
#: plugin.py:334
msgid "Highest karma: %L. Lowest karma: %L.%s"
msgstr ""
#: plugin.py:342
#, 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:360
#, docstring
msgid ""
"[<channel>] <name>\n"
"\n"
" Resets the karma of <name> to 0.\n"
" "
msgstr ""
#: plugin.py:370
#, 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:382
#, 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,15 +290,15 @@ 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)
@ -309,7 +312,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 +322,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 +351,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 +365,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 +377,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/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:

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

@ -0,0 +1,101 @@
# 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: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:47
#, 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:87
msgid "just now"
msgstr ""
#: plugin.py:108
#, 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:115
msgid "I can't send notes to myself."
msgstr ""
#: plugin.py:121
msgid "That person's message queue is already full."
msgstr ""
#: plugin.py:126
#, 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:137
msgid "I have no notes for that nick."
msgstr ""
#: plugin.py:142
msgid "I currently have notes waiting for %L."
msgstr ""
#: plugin.py:145
msgid "I have no notes waiting to be delivered."
msgstr ""
#: plugin.py:150
#, docstring
msgid ""
"<nick>\n"
"\n"
" Removes the notes waiting on <nick>.\n"
" "
msgstr ""
#: plugin.py:159
msgid "There were no notes for %r"
msgstr ""
#: plugin.py:183
msgid "Sent %s: <%s> %s"
msgstr ""

View File

@ -38,8 +38,11 @@ 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')
@internationalizeDocstring
class Later(callbacks.Plugin): class Later(callbacks.Plugin):
"""Used to do things later; currently, it only allows the sending of """Used to do things later; currently, it only allows the sending of
nick-based notes. Do note (haha!) that these notes are *not* private nick-based notes. Do note (haha!) that these notes are *not* private
@ -81,7 +84,7 @@ class Later(callbacks.Plugin):
try: try:
return utils.timeElapsed(diff, seconds=False) + ' ago' return utils.timeElapsed(diff, seconds=False) + ' ago'
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 +103,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 +112,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 +134,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 +156,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,7 +180,7 @@ 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)

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,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,8 +32,10 @@ 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')
@internationalizeDocstring
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
setup. supybot.plugins.Limiter.enable needs to be set to True and setup. supybot.plugins.Limiter.enable needs to be set to True and

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:

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 ""

View File

@ -39,12 +39,15 @@ import string
import supybot.utils as utils import supybot.utils as utils
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('Math')
convertcore = utils.python.universalImport('local.convertcore') convertcore = utils.python.universalImport('local.convertcore')
baseArg = ('int', 'base', lambda i: i <= 36) baseArg = ('int', 'base', lambda i: i <= 36)
class Math(callbacks.Plugin): class Math(callbacks.Plugin):
@internationalizeDocstring
def base(self, irc, msg, args, frm, to, number): def base(self, irc, msg, args, frm, to, number):
"""<fromBase> [<toBase>] <number> """<fromBase> [<toBase>] <number>
@ -57,7 +60,7 @@ class Math(callbacks.Plugin):
try: try:
irc.reply(self._convertBaseToBase(number, to, frm)) irc.reply(self._convertBaseToBase(number, to, frm))
except ValueError: except ValueError:
irc.error('Invalid <number> for base %s: %s' % (frm, number)) irc.error(_('Invalid <number> for base %s: %s') % (frm, number))
base = wrap(base, [('int', 'base', lambda i: 2 <= i <= 36), base = wrap(base, [('int', 'base', lambda i: 2 <= i <= 36),
optional(('int', 'base', lambda i: 2 <= i <= 36), 10), optional(('int', 'base', lambda i: 2 <= i <= 36), 10),
additional('something')]) additional('something')])
@ -149,6 +152,7 @@ class Math(callbacks.Plugin):
# Then we delete all square brackets, underscores, and whitespace, so no # Then we delete all square brackets, underscores, and whitespace, so no
# one can do list comprehensions or call __...__ functions. # one can do list comprehensions or call __...__ functions.
### ###
@internationalizeDocstring
def calc(self, irc, msg, args, text): def calc(self, irc, msg, args, text):
"""<math expression> """<math expression>
@ -159,13 +163,13 @@ class Math(callbacks.Plugin):
is that large values such as '10**24' might not be exact. is that large values such as '10**24' might not be exact.
""" """
if text != text.translate(utils.str.chars, '_[]'): if text != text.translate(utils.str.chars, '_[]'):
irc.error('There\'s really no reason why you should have ' irc.error(_('There\'s really no reason why you should have '
'underscores or brackets in your mathematical ' 'underscores or brackets in your mathematical '
'expression. Please remove them.') 'expression. Please remove them.'))
return return
#text = text.translate(utils.str.chars, '_[] \t') #text = text.translate(utils.str.chars, '_[] \t')
if 'lambda' in text: if 'lambda' in text:
irc.error('You can\'t use lambda in this command.') irc.error(_('You can\'t use lambda in this command.'))
return return
text = text.lower() text = text.lower()
def handleMatch(m): def handleMatch(m):
@ -195,15 +199,16 @@ class Math(callbacks.Plugin):
irc.reply(self._complexToString(x)) irc.reply(self._complexToString(x))
except OverflowError: except OverflowError:
maxFloat = math.ldexp(0.9999999999999999, 1024) maxFloat = math.ldexp(0.9999999999999999, 1024)
irc.error('The answer exceeded %s or so.' % maxFloat) irc.error(_('The answer exceeded %s or so.') % maxFloat)
except TypeError: except TypeError:
irc.error('Something in there wasn\'t a valid number.') irc.error(_('Something in there wasn\'t a valid number.'))
except NameError, e: except NameError, e:
irc.error('%s is not a defined function.' % str(e).split()[1]) irc.error(_('%s is not a defined function.') % str(e).split()[1])
except Exception, e: except Exception, e:
irc.error(str(e)) irc.error(str(e))
calc = wrap(calc, ['text']) calc = wrap(calc, ['text'])
@internationalizeDocstring
def icalc(self, irc, msg, args, text): def icalc(self, irc, msg, args, text):
"""<math expression> """<math expression>
@ -212,15 +217,15 @@ class Math(callbacks.Plugin):
the 'trusted' capability to use. the 'trusted' capability to use.
""" """
if text != text.translate(utils.str.chars, '_[]'): if text != text.translate(utils.str.chars, '_[]'):
irc.error('There\'s really no reason why you should have ' irc.error(_('There\'s really no reason why you should have '
'underscores or brackets in your mathematical ' 'underscores or brackets in your mathematical '
'expression. Please remove them.') 'expression. Please remove them.'))
return return
# This removes spaces, too, but we'll leave the removal of _[] for # This removes spaces, too, but we'll leave the removal of _[] for
# safety's sake. # safety's sake.
text = text.translate(utils.str.chars, '_[] \t') text = text.translate(utils.str.chars, '_[] \t')
if 'lambda' in text: if 'lambda' in text:
irc.error('You can\'t use lambda in this command.') irc.error(_('You can\'t use lambda in this command.'))
return return
text = text.replace('lambda', '') text = text.replace('lambda', '')
try: try:
@ -228,11 +233,11 @@ class Math(callbacks.Plugin):
irc.reply(str(eval(text, self._mathEnv, self._mathEnv))) irc.reply(str(eval(text, self._mathEnv, self._mathEnv)))
except OverflowError: except OverflowError:
maxFloat = math.ldexp(0.9999999999999999, 1024) maxFloat = math.ldexp(0.9999999999999999, 1024)
irc.error('The answer exceeded %s or so.' % maxFloat) irc.error(_('The answer exceeded %s or so.') % maxFloat)
except TypeError: except TypeError:
irc.error('Something in there wasn\'t a valid number.') irc.error(_('Something in there wasn\'t a valid number.'))
except NameError, e: except NameError, e:
irc.error('%s is not a defined function.' % str(e).split()[1]) irc.error(_('%s is not a defined function.') % str(e).split()[1])
except Exception, e: except Exception, e:
irc.error(utils.exnToString(e)) irc.error(utils.exnToString(e))
icalc = wrap(icalc, [('checkCapability', 'trusted'), 'text']) icalc = wrap(icalc, [('checkCapability', 'trusted'), 'text'])
@ -267,7 +272,7 @@ class Math(callbacks.Plugin):
except TypeError: except TypeError:
pass pass
if not called: if not called:
irc.error('Not enough arguments for %s' % arg) irc.error(_('Not enough arguments for %s') % arg)
return return
else: else:
stack.append(f) stack.append(f)
@ -280,14 +285,16 @@ class Math(callbacks.Plugin):
try: try:
stack.append(eval(s, self._mathEnv, self._mathEnv)) stack.append(eval(s, self._mathEnv, self._mathEnv))
except SyntaxError: except SyntaxError:
irc.error(format('%q is not a defined function.', arg)) irc.error(format(_('%q is not a defined function.'),
arg))
return return
if len(stack) == 1: if len(stack) == 1:
irc.reply(str(self._complexToString(complex(stack[0])))) irc.reply(str(self._complexToString(complex(stack[0]))))
else: else:
s = ', '.join(map(self._complexToString, map(complex, stack))) s = ', '.join(map(self._complexToString, map(complex, stack)))
irc.reply('Stack: [%s]' % s) irc.reply(_('Stack: [%s]') % s)
@internationalizeDocstring
def convert(self, irc, msg, args, number, unit1, unit2): def convert(self, irc, msg, args, number, unit1, unit2):
"""[<number>] <unit> to <other unit> """[<number>] <unit> to <other unit>
@ -302,6 +309,7 @@ class Math(callbacks.Plugin):
irc.error(str(ude)) irc.error(str(ude))
convert = wrap(convert, [optional('float', 1.0),'something','to','text']) convert = wrap(convert, [optional('float', 1.0),'something','to','text'])
@internationalizeDocstring
def units(self, irc, msg, args, type): def units(self, irc, msg, args, type):
""" [<type>] """ [<type>]

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('Misc')
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
@ -40,24 +42,24 @@ def configure(advanced):
Misc = conf.registerPlugin('Misc') Misc = conf.registerPlugin('Misc')
conf.registerGlobalValue(Misc, 'listPrivatePlugins', conf.registerGlobalValue(Misc, 'listPrivatePlugins',
registry.Boolean(True, """Determines whether the bot will list private registry.Boolean(True, _("""Determines whether the bot will list private
plugins with the list command if given the --private switch. If this is plugins with the list command if given the --private switch. If this is
disabled, non-owner users should be unable to see what private plugins disabled, non-owner users should be unable to see what private plugins
are loaded.""")) are loaded.""")))
conf.registerGlobalValue(Misc, 'timestampFormat', conf.registerGlobalValue(Misc, 'timestampFormat',
registry.String('[%H:%M:%S]', """Determines the format string for registry.String('[%H:%M:%S]', _("""Determines the format string for
timestamps in the Misc.last command. Refer to the Python documentation timestamps in the Misc.last command. Refer to the Python documentation
for the time module to see what formats are accepted. If you set this for the time module to see what formats are accepted. If you set this
variable to the empty string, the timestamp will not be shown.""")) variable to the empty string, the timestamp will not be shown.""")))
conf.registerGroup(Misc, 'last') conf.registerGroup(Misc, 'last')
conf.registerGroup(Misc.last, 'nested') conf.registerGroup(Misc.last, 'nested')
conf.registerChannelValue(Misc.last.nested, conf.registerChannelValue(Misc.last.nested,
'includeTimestamp', registry.Boolean(False, """Determines whether or not 'includeTimestamp', registry.Boolean(False, _("""Determines whether or not
the timestamp will be included in the output of last when it is part of a the timestamp will be included in the output of last when it is part of a
nested command""")) nested command""")))
conf.registerChannelValue(Misc.last.nested, conf.registerChannelValue(Misc.last.nested,
'includeNick', registry.Boolean(False, """Determines whether or not the 'includeNick', registry.Boolean(False, _("""Determines whether or not the
nick will be included in the output of last when it is part of a nested nick will be included in the output of last when it is part of a nested
command""")) command""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

230
plugins/Misc/messages.pot Normal file
View File

@ -0,0 +1,230 @@
# 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:45
msgid ""
"Determines whether the bot will list private\n"
" plugins with the list command if given the --private switch. If this is\n"
" disabled, non-owner users should be unable to see what private plugins\n"
" are loaded."
msgstr ""
#: config.py:50
msgid ""
"Determines the format string for\n"
" timestamps in the Misc.last command. Refer to the Python documentation\n"
" for the time module to see what formats are accepted. If you set this\n"
" variable to the empty string, the timestamp will not be shown."
msgstr ""
#: config.py:57
msgid ""
"Determines whether or not\n"
" the timestamp will be included in the output of last when it is part of a\n"
" nested command"
msgstr ""
#: config.py:61
msgid ""
"Determines whether or not the\n"
" nick will be included in the output of last when it is part of a nested\n"
" command"
msgstr ""
#: plugin.py:81
msgid "You've given me %s invalid commands within the last minute; I'm now ignoring you for %s."
msgstr ""
#: plugin.py:93
msgid "The %q plugin is loaded, but there is no command named %q in it. Try \"list %s\" to see the commands in the %q plugin."
msgstr ""
#: plugin.py:119
#, docstring
msgid ""
"[--private] [<plugin>]\n"
"\n"
" Lists the commands available in the given plugin. If no plugin is\n"
" given, lists the public plugins available. If --private is given,\n"
" lists the private plugins.\n"
" "
msgstr ""
#: plugin.py:144
msgid "There are no private plugins."
msgstr ""
#: plugin.py:146
msgid "There are no public plugins."
msgstr ""
#: plugin.py:153
msgid "That plugin exists, but has no commands. This probably means that it has some configuration variables that can be changed in order to modify its behavior. Try \"config list supybot.plugins.%s\" to see what configuration variables it has."
msgstr ""
#: plugin.py:164
#, docstring
msgid ""
"<string>\n"
"\n"
" Searches for <string> in the commands currently offered by the bot,\n"
" returning a list of the commands containing that string.\n"
" "
msgstr ""
#: plugin.py:183
msgid "No appropriate commands were found."
msgstr ""
#: plugin.py:188
#, docstring
msgid ""
"[<plugin>] [<command>]\n"
"\n"
" This command gives a useful description of what <command> does.\n"
" <plugin> is only necessary if the command is in more than one plugin.\n"
" "
msgstr ""
#: plugin.py:198
msgid "That command exists in the %L plugins. Please specify exactly which plugin command you want help with."
msgstr ""
#: plugin.py:205
msgid "There is no command %q."
msgstr ""
#: plugin.py:211
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns the version of the current bot.\n"
" "
msgstr ""
#: plugin.py:217
msgid "The newest version available online is %s."
msgstr ""
#: plugin.py:221
msgid "I couldn't fetch the newest version from the Supybot website."
msgstr ""
#: plugin.py:223
msgid "The current (running) version of this Supybot is %s. %s"
msgstr ""
#: plugin.py:230
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns a URL saying where to get Supybot.\n"
" "
msgstr ""
#: plugin.py:234
msgid "My source is at http://supybot.com/"
msgstr ""
#: plugin.py:239
#, docstring
msgid ""
"[<nick>]\n"
"\n"
" If the last command was truncated due to IRC message length\n"
" limitations, returns the next chunk of the result of the last command.\n"
" If <nick> is given, it takes the continuation of the last command from\n"
" <nick> instead of the person sending this message.\n"
" "
msgstr ""
#: plugin.py:253
msgid "%s has no public mores."
msgstr ""
#: plugin.py:256
msgid "Sorry, I can't find any mores for %s"
msgstr ""
#: plugin.py:265
msgid "You haven't asked me a command; perhaps you want to see someone else's more. To do so, call this command with that person's nick."
msgstr ""
#: plugin.py:269
msgid "That's all, there is no more."
msgstr ""
#: plugin.py:279
#, docstring
msgid ""
"[--{from,in,on,with,without,regexp} <value>] [--nolimit]\n"
"\n"
" Returns the last message matching the given criteria. --from requires\n"
" a nick from whom the message came; --in requires a channel the message\n"
" was sent to; --on requires a network the message was sent on; --with\n"
" requires some string that had to be in the message; --regexp requires\n"
" a regular expression the message must match; --nolimit returns all\n"
" the messages that can be found. By default, the channel this command is\n"
" given in is searched.\n"
" "
msgstr ""
#: plugin.py:373
msgid "I couldn't find a message matching that criteria in my history of %s messages."
msgstr ""
#: plugin.py:388
#, docstring
msgid ""
"<nick> <text>\n"
"\n"
" Tells the <nick> whatever <text> is. Use nested commands to your\n"
" benefit here.\n"
" "
msgstr ""
#: plugin.py:396
msgid "Dude, just give the command. No need for the tell."
msgstr ""
#: plugin.py:401
msgid "You just told me, why should I tell myself?"
msgstr ""
#: plugin.py:406
msgid "I haven't seen %s, I'll let you do the telling."
msgstr ""
#: plugin.py:411
msgid "%s wants me to tell you: %s"
msgstr ""
#: plugin.py:417
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Checks to see if the bot is alive.\n"
" "
msgstr ""
#: plugin.py:421
msgid "pong"
msgstr ""

View File

@ -44,6 +44,8 @@ import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.utils.iter import ifilter from supybot.utils.iter import ifilter
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Misc')
class Misc(callbacks.Plugin): class Misc(callbacks.Plugin):
def __init__(self, irc): def __init__(self, irc):
@ -76,8 +78,8 @@ class Misc(callbacks.Plugin):
'permanently.') 'permanently.')
ircdb.ignores.add(banmask, time.time() + punishment) ircdb.ignores.add(banmask, time.time() + punishment)
if conf.supybot.abuse.flood.command.invalid.notify(): if conf.supybot.abuse.flood.command.invalid.notify():
irc.reply('You\'ve given me %s invalid commands within the last ' irc.reply(_('You\'ve given me %s invalid commands within the last '
'minute; I\'m now ignoring you for %s.' % 'minute; I\'m now ignoring you for %s.') %
(maximum, (maximum,
utils.timeElapsed(punishment, seconds=False))) utils.timeElapsed(punishment, seconds=False)))
return return
@ -88,10 +90,10 @@ class Misc(callbacks.Plugin):
cb = irc.getCallback(tokens[0]) cb = irc.getCallback(tokens[0])
if cb: if cb:
plugin = cb.name() plugin = cb.name()
irc.error(format('The %q plugin is loaded, but there is ' irc.error(format(_('The %q plugin is loaded, but there is '
'no command named %q in it. Try "list ' 'no command named %q in it. Try "list '
'%s" to see the commands in the %q ' '%s" to see the commands in the %q '
'plugin.', plugin, tokens[1], 'plugin.'), plugin, tokens[1],
plugin, plugin)) plugin, plugin))
else: else:
irc.errorInvalid('command', tokens[0], repr=False) irc.errorInvalid('command', tokens[0], repr=False)
@ -112,6 +114,7 @@ class Misc(callbacks.Plugin):
else: else:
pass # Let's just do nothing, I can't think of better. pass # Let's just do nothing, I can't think of better.
@internationalizeDocstring
def list(self, irc, msg, args, optlist, cb): def list(self, irc, msg, args, optlist, cb):
"""[--private] [<plugin>] """[--private] [<plugin>]
@ -138,24 +141,25 @@ class Misc(callbacks.Plugin):
irc.reply(format('%L', names)) irc.reply(format('%L', names))
else: else:
if private: if private:
irc.reply('There are no private plugins.') irc.reply(_('There are no private plugins.'))
else: else:
irc.reply('There are no public plugins.') irc.reply(_('There are no public plugins.'))
else: else:
commands = cb.listCommands() commands = cb.listCommands()
if commands: if commands:
commands.sort() commands.sort()
irc.reply(format('%L', commands)) irc.reply(format('%L', commands))
else: else:
irc.reply(format('That plugin exists, but has no commands. ' irc.reply(format(_('That plugin exists, but has no commands. '
'This probably means that it has some ' 'This probably means that it has some '
'configuration variables that can be ' 'configuration variables that can be '
'changed in order to modify its behavior. ' 'changed in order to modify its behavior. '
'Try "config list supybot.plugins.%s" to see ' 'Try "config list supybot.plugins.%s" to see '
'what configuration variables it has.', 'what configuration variables it has.'),
cb.name())) cb.name()))
list = wrap(list, [getopts({'private':''}), additional('plugin')]) list = wrap(list, [getopts({'private':''}), additional('plugin')])
@internationalizeDocstring
def apropos(self, irc, msg, args, s): def apropos(self, irc, msg, args, s):
"""<string> """<string>
@ -176,9 +180,10 @@ class Misc(callbacks.Plugin):
L.sort() L.sort()
irc.reply(format('%L', L)) irc.reply(format('%L', L))
else: else:
irc.reply('No appropriate commands were found.') irc.reply(_('No appropriate commands were found.'))
apropos = wrap(apropos, ['lowered']) apropos = wrap(apropos, ['lowered'])
@internationalizeDocstring
def help(self, irc, msg, args, command): def help(self, irc, msg, args, command):
"""[<plugin>] [<command>] """[<plugin>] [<command>]
@ -190,17 +195,18 @@ class Misc(callbacks.Plugin):
if maxL == command: if maxL == command:
if len(cbs) > 1: if len(cbs) > 1:
names = sorted([cb.name() for cb in cbs]) names = sorted([cb.name() for cb in cbs])
irc.error(format('That command exists in the %L plugins. ' irc.error(format(_('That command exists in the %L plugins. '
'Please specify exactly which plugin command ' 'Please specify exactly which plugin command '
'you want help with.', names)) 'you want help with.'), names))
else: else:
assert cbs, 'Odd, maxL == command, but no cbs.' assert cbs, 'Odd, maxL == command, but no cbs.'
irc.reply(cbs[0].getCommandHelp(command, False)) irc.reply(cbs[0].getCommandHelp(command, False))
else: else:
irc.error(format('There is no command %q.', irc.error(format(_('There is no command %q.'),
callbacks.formatCommand(command))) callbacks.formatCommand(command)))
help = wrap(help, [many('something')]) help = wrap(help, [many('something')])
@internationalizeDocstring
def version(self, irc, msg, args): def version(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -208,24 +214,27 @@ class Misc(callbacks.Plugin):
""" """
try: try:
newest = utils.web.getUrl('http://supybot.sf.net/version.txt') newest = utils.web.getUrl('http://supybot.sf.net/version.txt')
newest ='The newest version available online is %s.'%newest.strip() newest = _('The newest version available online is %s.') % \
newest.strip()
except utils.web.Error, e: except utils.web.Error, e:
self.log.info('Couldn\'t get website version: %s', e) self.log.info('Couldn\'t get website version: %s', e)
newest = 'I couldn\'t fetch the newest version ' \ newest = _('I couldn\'t fetch the newest version '
'from the Supybot website.' 'from the Supybot website.')
s = 'The current (running) version of this Supybot is %s. %s' % \ s = _('The current (running) version of this Supybot is %s. %s') % \
(conf.version, newest) (conf.version, newest)
irc.reply(s) irc.reply(s)
version = wrap(thread(version)) version = wrap(thread(version))
@internationalizeDocstring
def source(self, irc, msg, args): def source(self, irc, msg, args):
"""takes no arguments """takes no arguments
Returns a URL saying where to get Supybot. Returns a URL saying where to get Supybot.
""" """
irc.reply('My source is at http://supybot.com/') irc.reply(_('My source is at http://supybot.com/'))
source = wrap(source) source = wrap(source)
@internationalizeDocstring
def more(self, irc, msg, args, nick): def more(self, irc, msg, args, nick):
"""[<nick>] """[<nick>]
@ -241,23 +250,27 @@ class Misc(callbacks.Plugin):
if not private: if not private:
irc._mores[userHostmask] = L[:] irc._mores[userHostmask] = L[:]
else: else:
irc.error('%s has no public mores.' % nick) irc.error(_('%s has no public mores.') % nick)
return return
except KeyError: except KeyError:
irc.error('Sorry, I can\'t find any mores for %s' % nick) irc.error(_('Sorry, I can\'t find any mores for %s') % nick)
return return
try: try:
L = irc._mores[userHostmask] L = irc._mores[userHostmask]
chunk = L.pop() chunk = L.pop()
if L: if L:
chunk += format(' \x02(%n)\x0F', (len(L), 'more', 'message')) if len(L) < 2:
more = _('more message')
else:
more = _('more messages')
chunk += format(' \x02(%s)\x0F', more)
irc.reply(chunk, True) irc.reply(chunk, True)
except KeyError: except KeyError:
irc.error('You haven\'t asked me a command; perhaps you want ' irc.error(_('You haven\'t asked me a command; perhaps you want '
'to see someone else\'s more. To do so, call this ' 'to see someone else\'s more. To do so, call this '
'command with that person\'s nick.') 'command with that person\'s nick.'))
except IndexError: except IndexError:
irc.error('That\'s all, there is no more.') irc.error(_('That\'s all, there is no more.'))
more = wrap(more, [additional('seenNick')]) more = wrap(more, [additional('seenNick')])
def _validLastMsg(self, msg): def _validLastMsg(self, msg):
@ -265,6 +278,7 @@ class Misc(callbacks.Plugin):
msg.command == 'PRIVMSG' and \ msg.command == 'PRIVMSG' and \
ircutils.isChannel(msg.args[0]) ircutils.isChannel(msg.args[0])
@internationalizeDocstring
def last(self, irc, msg, args, optlist): def last(self, irc, msg, args, optlist):
"""[--{from,in,on,with,without,regexp} <value>] [--nolimit] """[--{from,in,on,with,without,regexp} <value>] [--nolimit]
@ -360,8 +374,8 @@ class Misc(callbacks.Plugin):
showNick=showNick)) showNick=showNick))
return return
if not resp: if not resp:
irc.error('I couldn\'t find a message matching that criteria in ' irc.error(_('I couldn\'t find a message matching that criteria in '
'my history of %s messages.' % len(irc.state.history)) 'my history of %s messages.') % len(irc.state.history))
else: else:
irc.reply(format('%L', resp)) irc.reply(format('%L', resp))
last = wrap(last, [getopts({'nolimit': '', last = wrap(last, [getopts({'nolimit': '',
@ -373,6 +387,7 @@ class Misc(callbacks.Plugin):
'regexp': 'regexpMatcher',})]) 'regexp': 'regexpMatcher',})])
@internationalizeDocstring
def tell(self, irc, msg, args, target, text): def tell(self, irc, msg, args, target, text):
"""<nick> <text> """<nick> <text>
@ -382,30 +397,32 @@ class Misc(callbacks.Plugin):
if target.lower() == 'me': if target.lower() == 'me':
target = msg.nick target = msg.nick
if ircutils.isChannel(target): if ircutils.isChannel(target):
irc.error('Dude, just give the command. No need for the tell.') irc.error(_('Dude, just give the command. No need for the tell.'))
return return
if not ircutils.isNick(target): if not ircutils.isNick(target):
irc.errorInvalid('nick', target) irc.errorInvalid('nick', target)
if ircutils.nickEqual(target, irc.nick): if ircutils.nickEqual(target, irc.nick):
irc.error('You just told me, why should I tell myself?',Raise=True) irc.error(_('You just told me, why should I tell myself?'),
Raise=True)
if target not in irc.state.nicksToHostmasks and \ if target not in irc.state.nicksToHostmasks and \
not ircdb.checkCapability(msg.prefix, 'owner'): not ircdb.checkCapability(msg.prefix, 'owner'):
# We'll let owners do this. # We'll let owners do this.
s = 'I haven\'t seen %s, I\'ll let you do the telling.' % target s = _('I haven\'t seen %s, I\'ll let you do the telling.') % target
irc.error(s, Raise=True) irc.error(s, Raise=True)
if irc.action: if irc.action:
irc.action = False irc.action = False
text = '* %s %s' % (irc.nick, text) text = '* %s %s' % (irc.nick, text)
s = '%s wants me to tell you: %s' % (msg.nick, text) s = _('%s wants me to tell you: %s') % (msg.nick, text)
irc.reply(s, to=target, private=True) irc.reply(s, to=target, private=True)
tell = wrap(tell, ['something', 'text']) tell = wrap(tell, ['something', 'text'])
@internationalizeDocstring
def ping(self, irc, msg, args): def ping(self, irc, msg, args):
"""takes no arguments """takes no arguments
Checks to see if the bot is alive. Checks to see if the bot is alive.
""" """
irc.reply('pong', prefixNick=False) irc.reply(_('pong'), prefixNick=False)
Class = Misc Class = Misc

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('MoobotFactoids')
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,12 +43,12 @@ def configure(advanced):
MoobotFactoids = conf.registerPlugin('MoobotFactoids') MoobotFactoids = conf.registerPlugin('MoobotFactoids')
conf.registerChannelValue(MoobotFactoids, conf.registerChannelValue(MoobotFactoids,
'showFactoidIfOnlyOneMatch', registry.Boolean(True, """Determines whether 'showFactoidIfOnlyOneMatch', registry.Boolean(True, _("""Determines whether
or not the factoid value will be shown when a listkeys search returns only or not the factoid value will be shown when a listkeys search returns only
one factoid key.""")) one factoid key.""")))
conf.registerChannelValue(MoobotFactoids, conf.registerChannelValue(MoobotFactoids,
'mostCount', registry.Integer(10, """Determines how many items are shown 'mostCount', registry.Integer(10, _("""Determines how many items are shown
when the 'most' command is called.""")) when the 'most' command is called.""")))
# vim:set shiftwidth=4 softtabstop=8 expandtab textwidth=78 # vim:set shiftwidth=4 softtabstop=8 expandtab textwidth=78

View File

@ -0,0 +1,269 @@
# 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 16:36+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\n"
" or not the factoid value will be shown when a listkeys search returns only\n"
" one factoid key."
msgstr ""
#: config.py:50
msgid ""
"Determines how many items are shown\n"
" when the 'most' command is called."
msgstr ""
#: plugin.py:293
#, docstring
msgid ""
"Add the help for \"@help MoobotFactoids\" here (assuming you don't implement a MoobotFactoids\n"
" command). This should describe *how* to use this plugin."
msgstr ""
#: plugin.py:350
msgid "%s is %s"
msgstr ""
#: plugin.py:369
msgid "Factoid %q is locked."
msgstr ""
#: plugin.py:376
msgid "Factoid %q not found."
msgstr ""
#: plugin.py:386
msgid "Missing an 'is' or '_is_'."
msgstr ""
#: plugin.py:402
msgid "Factoid %q already exists."
msgstr ""
#: plugin.py:436
msgid "%s, or %s"
msgstr ""
#: plugin.py:457
#, docstring
msgid ""
"[<channel>] <factoid key>\n"
"\n"
" Returns the literal factoid for the given factoid key. No parsing of\n"
" the factoid value is done as it is with normal retrieval. <channel>\n"
" is only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:470
#, docstring
msgid ""
"[<channel>] <factoid key>\n"
"\n"
" Returns the various bits of info on the factoid for the given key.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:481 plugin.py:521
msgid "No such factoid: %q"
msgstr ""
#: plugin.py:490
msgid "Created by %s on %s."
msgstr ""
#: plugin.py:496
msgid " Last modified by %s on %s."
msgstr ""
#: plugin.py:504
msgid " Last requested by %s on %s, requested %n."
msgstr ""
#: plugin.py:511
msgid " Locked by %s on %s."
msgstr ""
#: plugin.py:526
msgid "Factoid %q is already locked."
msgstr ""
#: plugin.py:529
msgid "Factoid %q is not locked."
msgstr ""
#: plugin.py:539
msgid "Cannot %s someone else's factoid unless you are an admin."
msgstr ""
#: plugin.py:551
#, docstring
msgid ""
"[<channel>] <factoid key>\n"
"\n"
" Locks the factoid with the given factoid key. Requires that the user\n"
" be registered and have created the factoid originally. <channel> is\n"
" only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:562
#, docstring
msgid ""
"[<channel>] <factoid key>\n"
"\n"
" Unlocks the factoid with the given factoid key. Requires that the\n"
" user be registered and have locked the factoid. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:573
#, docstring
msgid ""
"[<channel>] {popular|authored|recent}\n"
"\n"
" Lists the most {popular|authored|recent} factoids. \"popular\" lists the\n"
" most frequently requested factoids. \"authored\" lists the author with\n"
" the most factoids. \"recent\" lists the most recently created factoids.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:598
msgid "Most prolific %s: %L"
msgstr ""
#: plugin.py:600 plugin.py:612
msgid "There are no factoids in my database."
msgstr ""
#: plugin.py:607
msgid "latest factoid"
msgstr ""
#: plugin.py:609
msgid "latest factoids"
msgstr ""
#: plugin.py:610
msgid "%s: %L"
msgstr ""
#: plugin.py:619
msgid "requested factoid"
msgstr ""
#: plugin.py:621
msgid "requested factoids"
msgstr ""
#: plugin.py:622
msgid "Top %s: %L"
msgstr ""
#: plugin.py:624
msgid "No factoids have been requested from my database."
msgstr ""
#: plugin.py:628
#, docstring
msgid ""
"[<channel>] <author name>\n"
"\n"
" Lists the keys of the factoids with the given author. Note that if an\n"
" author has an integer name, you'll have to use that author's id to use\n"
" this function (so don't use integer usernames!). <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:641
msgid "No factoids by %q found."
msgstr ""
#: plugin.py:644
msgid "Author search for %q (%i found): %L"
msgstr ""
#: plugin.py:651
#, docstring
msgid ""
"[<channel>] <text>\n"
"\n"
" Lists the keys of the factoids whose key contains the provided text.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:659
msgid "No keys matching %q found."
msgstr ""
#: plugin.py:666
msgid "Key search for %q (%i found): %L"
msgstr ""
#: plugin.py:673
#, docstring
msgid ""
"[<channel>] <text>\n"
"\n"
" Lists the keys of the factoids whose value contains the provided text.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:681
msgid "No values matching %q found."
msgstr ""
#: plugin.py:684
msgid "Value search for %q (%i found): %L"
msgstr ""
#: plugin.py:691
#, docstring
msgid ""
"[<channel>] <factoid key>\n"
"\n"
" Deletes the factoid with the given key. <channel> is only necessary\n"
" if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:704
#, docstring
msgid ""
"[<channel>]\n"
"\n"
" Displays a random factoid (along with its key) from the database.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:712
msgid "No factoids in the database."
msgstr ""

View File

@ -41,6 +41,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('MoobotFactoids')
allchars = string.maketrans('', '') allchars = string.maketrans('', '')
class OptionList(object): class OptionList(object):
@ -286,6 +288,7 @@ class SqliteMoobotDB(object):
MoobotDB = plugins.DB('MoobotFactoids', {'sqlite': SqliteMoobotDB}) MoobotDB = plugins.DB('MoobotFactoids', {'sqlite': SqliteMoobotDB})
@internationalizeDocstring
class MoobotFactoids(callbacks.Plugin): class MoobotFactoids(callbacks.Plugin):
"""Add the help for "@help MoobotFactoids" here (assuming you don't implement a MoobotFactoids """Add the help for "@help MoobotFactoids" here (assuming you don't implement a MoobotFactoids
command). This should describe *how* to use this plugin.""" command). This should describe *how* to use this plugin."""
@ -344,7 +347,8 @@ class MoobotFactoids(callbacks.Plugin):
elif type == 'reply': elif type == 'reply':
irc.reply(text, prefixNick=False) irc.reply(text, prefixNick=False)
elif type == 'define': elif type == 'define':
irc.reply(format('%s is %s', key, text), prefixNick=False) irc.reply(format(_('%s is %s'), key, text),
prefixNick=False)
else: else:
assert False, 'Spurious type from _parseFactoid' assert False, 'Spurious type from _parseFactoid'
else: else:
@ -362,14 +366,14 @@ class MoobotFactoids(callbacks.Plugin):
def _checkNotLocked(self, irc, channel, key): def _checkNotLocked(self, irc, channel, key):
if self.db.locked(channel, key): if self.db.locked(channel, key):
irc.error(format('Factoid %q is locked.', key), Raise=True) irc.error(format(_('Factoid %q is locked.'), key), Raise=True)
def _getFactoid(self, irc, channel, key): def _getFactoid(self, irc, channel, key):
fact = self.db.getFactoid(channel, key) fact = self.db.getFactoid(channel, key)
if fact is not None: if fact is not None:
return fact return fact
else: else:
irc.error(format('Factoid %q not found.', key), Raise=True) irc.error(format(_('Factoid %q not found.'), key), Raise=True)
def _getKeyAndFactoid(self, tokens): def _getKeyAndFactoid(self, tokens):
if '_is_' in tokens: if '_is_' in tokens:
@ -379,7 +383,7 @@ class MoobotFactoids(callbacks.Plugin):
else: else:
self.log.debug('Invalid tokens for {add,replace}Factoid: %s.', self.log.debug('Invalid tokens for {add,replace}Factoid: %s.',
tokens) tokens)
s = 'Missing an \'is\' or \'_is_\'.' s = _('Missing an \'is\' or \'_is_\'.')
raise ValueError, s raise ValueError, s
(key, newfact) = map(' '.join, utils.iter.split(p, tokens, maxsplit=1)) (key, newfact) = map(' '.join, utils.iter.split(p, tokens, maxsplit=1))
key = self._sanitizeKey(key) key = self._sanitizeKey(key)
@ -395,7 +399,7 @@ class MoobotFactoids(callbacks.Plugin):
irc.error(str(e), Raise=True) irc.error(str(e), Raise=True)
# Check and make sure it's not in the DB already # Check and make sure it's not in the DB already
if self.db.getFactoid(channel, key): if self.db.getFactoid(channel, key):
irc.error(format('Factoid %q already exists.', key), Raise=True) irc.error(format(_('Factoid %q already exists.'), key), Raise=True)
self.db.addFactoid(channel, key, fact, id) self.db.addFactoid(channel, key, fact, id)
irc.replySuccess() irc.replySuccess()
@ -429,7 +433,7 @@ class MoobotFactoids(callbacks.Plugin):
self._checkNotLocked(irc, channel, key) self._checkNotLocked(irc, channel, key)
# It's fair game if we get to here # It's fair game if we get to here
fact = fact[0] fact = fact[0]
new_fact = format('%s, or %s', fact, new_text) new_fact = format(_('%s, or %s'), fact, new_text)
self.db.updateFactoid(channel, key, new_fact, id) self.db.updateFactoid(channel, key, new_fact, id)
irc.replySuccess() irc.replySuccess()
@ -448,6 +452,7 @@ class MoobotFactoids(callbacks.Plugin):
self.db.addFactoid(channel, key, fact, id) self.db.addFactoid(channel, key, fact, id)
irc.replySuccess() irc.replySuccess()
@internationalizeDocstring
def literal(self, irc, msg, args, channel, key): def literal(self, irc, msg, args, channel, key):
"""[<channel>] <factoid key> """[<channel>] <factoid key>
@ -460,6 +465,7 @@ class MoobotFactoids(callbacks.Plugin):
irc.reply(fact) irc.reply(fact)
literal = wrap(literal, ['channeldb', 'text']) literal = wrap(literal, ['channeldb', 'text'])
@internationalizeDocstring
def factinfo(self, irc, msg, args, channel, key): def factinfo(self, irc, msg, args, channel, key):
"""[<channel>] <factoid key> """[<channel>] <factoid key>
@ -472,7 +478,7 @@ class MoobotFactoids(callbacks.Plugin):
# Next, get all the info and build the response piece by piece # Next, get all the info and build the response piece by piece
info = self.db.getFactinfo(channel, key) info = self.db.getFactinfo(channel, key)
if not info: if not info:
irc.error(format('No such factoid: %q', key)) irc.error(format(_('No such factoid: %q'), key))
return return
(created_by, created_at, modified_by, modified_at, last_requested_by, (created_by, created_at, modified_by, modified_at, last_requested_by,
last_requested_at, requested_count, locked_by, locked_at) = info last_requested_at, requested_count, locked_by, locked_at) = info
@ -481,27 +487,28 @@ class MoobotFactoids(callbacks.Plugin):
created_by = plugins.getUserName(created_by) created_by = plugins.getUserName(created_by)
created_at = time.strftime(conf.supybot.reply.format.time(), created_at = time.strftime(conf.supybot.reply.format.time(),
time.localtime(int(created_at))) time.localtime(int(created_at)))
s += format('Created by %s on %s.', created_by, created_at) s += format(_('Created by %s on %s.'), created_by, created_at)
# Next, modification info, if any. # Next, modification info, if any.
if modified_by is not None: if modified_by is not None:
modified_by = plugins.getUserName(modified_by) modified_by = plugins.getUserName(modified_by)
modified_at = time.strftime(conf.supybot.reply.format.time(), modified_at = time.strftime(conf.supybot.reply.format.time(),
time.localtime(int(modified_at))) time.localtime(int(modified_at)))
s += format(' Last modified by %s on %s.',modified_by, modified_at) s += format(_(' Last modified by %s on %s.'), modified_by,
modified_at)
# Next, last requested info, if any # Next, last requested info, if any
if last_requested_by is not None: if last_requested_by is not None:
last_by = last_requested_by # not an int user id last_by = last_requested_by # not an int user id
last_at = time.strftime(conf.supybot.reply.format.time(), last_at = time.strftime(conf.supybot.reply.format.time(),
time.localtime(int(last_requested_at))) time.localtime(int(last_requested_at)))
req_count = requested_count req_count = requested_count
s += format(' Last requested by %s on %s, requested %n.', s += format(_(' Last requested by %s on %s, requested %n.'),
last_by, last_at, (requested_count, 'time')) last_by, last_at, (requested_count, 'time'))
# Last, locked info # Last, locked info
if locked_at is not None: if locked_at is not None:
lock_at = time.strftime(conf.supybot.reply.format.time(), lock_at = time.strftime(conf.supybot.reply.format.time(),
time.localtime(int(locked_at))) time.localtime(int(locked_at)))
lock_by = plugins.getUserName(locked_by) lock_by = plugins.getUserName(locked_by)
s += format(' Locked by %s on %s.', lock_by, lock_at) s += format(_(' Locked by %s on %s.'), lock_by, lock_at)
irc.reply(s) irc.reply(s)
factinfo = wrap(factinfo, ['channeldb', 'text']) factinfo = wrap(factinfo, ['channeldb', 'text'])
@ -511,15 +518,15 @@ class MoobotFactoids(callbacks.Plugin):
id = user.id id = user.id
info = self.db.getFactinfo(channel, key) info = self.db.getFactinfo(channel, key)
if not info: if not info:
irc.error(format('No such factoid: %q', key)) irc.error(format(_('No such factoid: %q'), key))
return return
(created_by, _, _, _, _, _, _, locked_by, _) = info (created_by, _, _, _, _, _, _, locked_by, _) = info
# Don't perform redundant operations # Don't perform redundant operations
if locking and locked_by is not None: if locking and locked_by is not None:
irc.error(format('Factoid %q is already locked.', key)) irc.error(format(_('Factoid %q is already locked.'), key))
return return
if not locking and locked_by is None: if not locking and locked_by is None:
irc.error(format('Factoid %q is not locked.', key)) irc.error(format(_('Factoid %q is not locked.'), key))
return return
# Can only lock/unlock own factoids unless you're an admin # Can only lock/unlock own factoids unless you're an admin
#self.log.debug('admin?: %s', ircdb.checkCapability(id, 'admin')) #self.log.debug('admin?: %s', ircdb.checkCapability(id, 'admin'))
@ -529,8 +536,8 @@ class MoobotFactoids(callbacks.Plugin):
s = 'lock' s = 'lock'
else: else:
s = 'unlock' s = 'unlock'
irc.error(format('Cannot %s someone else\'s factoid unless you ' irc.error(format(_('Cannot %s someone else\'s factoid unless you '
'are an admin.', s)) 'are an admin.'), s))
return return
# Okay, we're done, ready to lock/unlock # Okay, we're done, ready to lock/unlock
if locking: if locking:
@ -539,6 +546,7 @@ class MoobotFactoids(callbacks.Plugin):
self.db.unlock(channel, key) self.db.unlock(channel, key)
irc.replySuccess() irc.replySuccess()
@internationalizeDocstring
def lock(self, irc, msg, args, channel, user, key): def lock(self, irc, msg, args, channel, user, key):
"""[<channel>] <factoid key> """[<channel>] <factoid key>
@ -549,6 +557,7 @@ class MoobotFactoids(callbacks.Plugin):
self._lock(irc, msg, channel, user, key, True) self._lock(irc, msg, channel, user, key, True)
lock = wrap(lock, ['channeldb', 'user', 'text']) lock = wrap(lock, ['channeldb', 'user', 'text'])
@internationalizeDocstring
def unlock(self, irc, msg, args, channel, user, key): def unlock(self, irc, msg, args, channel, user, key):
"""[<channel>] <factoid key> """[<channel>] <factoid key>
@ -559,6 +568,7 @@ class MoobotFactoids(callbacks.Plugin):
self._lock(irc, msg, channel, user, key, False) self._lock(irc, msg, channel, user, key, False)
unlock = wrap(unlock, ['channeldb', 'user', 'text']) unlock = wrap(unlock, ['channeldb', 'user', 'text'])
@internationalizeDocstring
def most(self, irc, msg, args, channel, method): def most(self, irc, msg, args, channel, method):
"""[<channel>] {popular|authored|recent} """[<channel>] {popular|authored|recent}
@ -585,27 +595,35 @@ class MoobotFactoids(callbacks.Plugin):
author = 'author' author = 'author'
if len(L) != 1: if len(L) != 1:
author = 'authors' author = 'authors'
irc.reply(format('Most prolific %s: %L', author, L)) irc.reply(format(_('Most prolific %s: %L'), author, L))
else: else:
irc.error('There are no factoids in my database.') irc.error(_('There are no factoids in my database.'))
def _mostRecent(self, irc, channel, limit): def _mostRecent(self, irc, channel, limit):
results = self.db.mostRecent(channel, limit) results = self.db.mostRecent(channel, limit)
L = [format('%q', t[0]) for t in results] L = [format('%q', t[0]) for t in results]
if L: if L:
irc.reply(format('%n: %L', (len(L), 'latest', 'factoid'), L)) if len(L) < 2:
latest = _('latest factoid')
else:
latest = _('latest factoids')
irc.reply(format(_('%s: %L'), latest, L))
else: else:
irc.error('There are no factoids in my database.') irc.error(_('There are no factoids in my database.'))
def _mostPopular(self, irc, channel, limit): def _mostPopular(self, irc, channel, limit):
results = self.db.mostPopular(channel, limit) results = self.db.mostPopular(channel, limit)
L = [format('%q (%s)', t[0], t[1]) for t in results] L = [format('%q (%s)', t[0], t[1]) for t in results]
if L: if L:
irc.reply( if len(L) < 2:
format('Top %n: %L', (len(L), 'requested', 'factoid'), L)) requested = _('requested factoid')
else:
requested = _('requested factoids')
irc.reply(format(_('Top %s: %L'), requested, L))
else: else:
irc.error('No factoids have been requested from my database.') irc.error(_('No factoids have been requested from my database.'))
@internationalizeDocstring
def listauth(self, irc, msg, args, channel, author): def listauth(self, irc, msg, args, channel, author):
"""[<channel>] <author name> """[<channel>] <author name>
@ -620,14 +638,15 @@ class MoobotFactoids(callbacks.Plugin):
irc.errorNoUser(name=author, Raise=True) irc.errorNoUser(name=author, Raise=True)
results = self.db.getKeysByAuthor(channel, id) results = self.db.getKeysByAuthor(channel, id)
if not results: if not results:
irc.reply(format('No factoids by %q found.', author)) irc.reply(format(_('No factoids by %q found.'), author))
return return
keys = [format('%q', t[0]) for t in results] keys = [format('%q', t[0]) for t in results]
s = format('Author search for %q (%i found): %L', s = format(_('Author search for %q (%i found): %L'),
author, len(keys), keys) author, len(keys), keys)
irc.reply(s) irc.reply(s)
listauth = wrap(listauth, ['channeldb', 'something']) listauth = wrap(listauth, ['channeldb', 'something'])
@internationalizeDocstring
def listkeys(self, irc, msg, args, channel, search): def listkeys(self, irc, msg, args, channel, search):
"""[<channel>] <text> """[<channel>] <text>
@ -637,18 +656,19 @@ class MoobotFactoids(callbacks.Plugin):
""" """
results = self.db.getKeysByGlob(channel, search) results = self.db.getKeysByGlob(channel, search)
if not results: if not results:
irc.reply(format('No keys matching %q found.', search)) irc.reply(format(_('No keys matching %q found.'), search))
elif len(results) == 1 and \ elif len(results) == 1 and \
self.registryValue('showFactoidIfOnlyOneMatch', channel): self.registryValue('showFactoidIfOnlyOneMatch', channel):
key = results[0][0] key = results[0][0]
self.invalidCommand(irc, msg, [key]) self.invalidCommand(irc, msg, [key])
else: else:
keys = [format('%q', tup[0]) for tup in results] keys = [format('%q', tup[0]) for tup in results]
s = format('Key search for %q (%i found): %L', s = format(_('Key search for %q (%i found): %L'),
search, len(keys), keys) search, len(keys), keys)
irc.reply(s) irc.reply(s)
listkeys = wrap(listkeys, ['channeldb', 'text']) listkeys = wrap(listkeys, ['channeldb', 'text'])
@internationalizeDocstring
def listvalues(self, irc, msg, args, channel, search): def listvalues(self, irc, msg, args, channel, search):
"""[<channel>] <text> """[<channel>] <text>
@ -658,14 +678,15 @@ class MoobotFactoids(callbacks.Plugin):
""" """
results = self.db.getKeysByValueGlob(channel, search) results = self.db.getKeysByValueGlob(channel, search)
if not results: if not results:
irc.reply(format('No values matching %q found.', search)) irc.reply(format(_('No values matching %q found.'), search))
return return
keys = [format('%q', tup[0]) for tup in results] keys = [format('%q', tup[0]) for tup in results]
s = format('Value search for %q (%i found): %L', s = format(_('Value search for %q (%i found): %L'),
search, len(keys), keys) search, len(keys), keys)
irc.reply(s) irc.reply(s)
listvalues = wrap(listvalues, ['channeldb', 'text']) listvalues = wrap(listvalues, ['channeldb', 'text'])
@internationalizeDocstring
def remove(self, irc, msg, args, channel, _, key): def remove(self, irc, msg, args, channel, _, key):
"""[<channel>] <factoid key> """[<channel>] <factoid key>
@ -678,6 +699,7 @@ class MoobotFactoids(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
remove = wrap(remove, ['channeldb', 'user', 'text']) remove = wrap(remove, ['channeldb', 'user', 'text'])
@internationalizeDocstring
def random(self, irc, msg, args, channel): def random(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -687,7 +709,7 @@ class MoobotFactoids(callbacks.Plugin):
""" """
results = self.db.randomFactoid(channel) results = self.db.randomFactoid(channel)
if not results: if not results:
irc.error('No factoids in the database.') irc.error(_('No factoids in the database.'))
return return
(fact, key) = results (fact, key) = results
irc.reply(format('Random factoid: %q is %q', key, fact)) irc.reply(format('Random factoid: %q is %q', key, fact))

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('Network')
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,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-16 12: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:57
#, docstring
msgid ""
"[--ssl] <network> [<host[:port]>] [<password>]\n"
"\n"
" Connects to another network (which will be represented by the name\n"
" provided in <network>) at <host:port>. If port is not provided, it\n"
" defaults to 6667, the default port for IRC. If password is\n"
" provided, it will be sent to the server in a PASS command. If --ssl is\n"
" provided, an SSL connection will be attempted.\n"
" "
msgstr ""
#: plugin.py:67
msgid "I'm already connected to %s."
msgstr ""
#: plugin.py:87
msgid "A server must be provided if the network is not already registered."
msgstr ""
#: plugin.py:95
msgid "Connection to %s initiated."
msgstr ""
#: plugin.py:102
#, docstring
msgid ""
"[<network>] [<quit message>]\n"
"\n"
" Disconnects from the network represented by the network <network>.\n"
" If <quit message> is given, quits the network with the given quit\n"
" message. <network> is only necessary if the network is different\n"
" from the network the command is sent on.\n"
" "
msgstr ""
#: plugin.py:114
msgid "Disconnection to %s initiated."
msgstr ""
#: plugin.py:120
#, docstring
msgid ""
"[<network>] [<quit message>]\n"
"\n"
" Disconnects and then reconnects to <network>. If no network is given,\n"
" disconnects and then reconnects to the network the command was given\n"
" on. If no quit message is given, uses the configured one\n"
" (supybot.plugins.Owner.quitMsg) or the nick of the person giving the\n"
" command.\n"
" "
msgstr ""
#: plugin.py:137
#, docstring
msgid ""
"<network> <command> [<arg> ...]\n"
"\n"
" Gives the bot <command> (with its associated <arg>s) on <network>.\n"
" "
msgstr ""
#: plugin.py:210
msgid "is an op on %L"
msgstr ""
#: plugin.py:212
msgid "is a halfop on %L"
msgstr ""
#: plugin.py:214
msgid "is voiced on %L"
msgstr ""
#: plugin.py:217
msgid "is also on %L"
msgstr ""
#: plugin.py:219
msgid "is on %L"
msgstr ""
#: plugin.py:221
msgid "isn't on any non-secret channels"
msgstr ""
#: plugin.py:228 plugin.py:229 plugin.py:233
msgid "<unknown>"
msgstr ""
#: plugin.py:240
msgid " identified"
msgstr ""
#: plugin.py:245
msgid "%s (%s) has been%s on server %s since %s (idle for %s) and %s.%s"
msgstr ""
#: plugin.py:258
msgid "There is no %s on %s."
msgstr ""
#: plugin.py:264
#, docstring
msgid ""
"[<network>] <nick>\n"
"\n"
" Returns the WHOIS response <network> gives for <nick>. <network> is\n"
" only necessary if the network is different than the network the command\n"
" is sent on.\n"
" "
msgstr ""
#: plugin.py:280
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns the networks to which the bot is currently connected.\n"
" "
msgstr ""
#: plugin.py:293
msgid "%.2f seconds."
msgstr ""
#: plugin.py:297
#, docstring
msgid ""
"[<network>]\n"
"\n"
" Returns the current latency to <network>. <network> is only necessary\n"
" if the message isn't sent on the network to which this command is to\n"
" apply.\n"
" "
msgstr ""
#: plugin.py:303
msgid "Latency check (from %s)."
msgstr ""
#: plugin.py:311
#, docstring
msgid ""
"[<network>]\n"
"\n"
" Returns the current network driver for <network>. <network> is only\n"
" necessary if the message isn't sent on the network to which this\n"
" command is to apply.\n"
" "
msgstr ""

View File

@ -38,6 +38,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('Network')
class Network(callbacks.Plugin): class Network(callbacks.Plugin):
_whois = {} _whois = {}
@ -50,6 +52,7 @@ class Network(callbacks.Plugin):
raise callbacks.Error, \ raise callbacks.Error, \
'I\'m not currently connected to %s.' % network 'I\'m not currently connected to %s.' % network
@internationalizeDocstring
def connect(self, irc, msg, args, opts, network, server, password): def connect(self, irc, msg, args, opts, network, server, password):
"""[--ssl] <network> [<host[:port]>] [<password>] """[--ssl] <network> [<host[:port]>] [<password>]
@ -61,7 +64,7 @@ class Network(callbacks.Plugin):
""" """
try: try:
otherIrc = self._getIrc(network) otherIrc = self._getIrc(network)
irc.error('I\'m already connected to %s.' % network) irc.error(_('I\'m already connected to %s.') % network)
return # We've gotta return here. This is ugly code, but I'm not return # We've gotta return here. This is ugly code, but I'm not
# quite sure what to do about it. # quite sure what to do about it.
except callbacks.Error: except callbacks.Error:
@ -81,19 +84,20 @@ class Network(callbacks.Plugin):
try: try:
serverPort = conf.supybot.networks.get(network).servers()[0] serverPort = conf.supybot.networks.get(network).servers()[0]
except (registry.NonExistentRegistryEntry, IndexError): except (registry.NonExistentRegistryEntry, IndexError):
irc.error('A server must be provided if the network is not ' irc.error(_('A server must be provided if the network is not '
'already registered.') 'already registered.'))
return return
Owner = irc.getCallback('Owner') Owner = irc.getCallback('Owner')
newIrc = Owner._connect(network, serverPort=serverPort, newIrc = Owner._connect(network, serverPort=serverPort,
password=password, ssl=ssl) password=password, ssl=ssl)
conf.supybot.networks().add(network) conf.supybot.networks().add(network)
assert newIrc.callbacks is irc.callbacks, 'callbacks list is different' assert newIrc.callbacks is irc.callbacks, 'callbacks list is different'
irc.replySuccess('Connection to %s initiated.' % network) irc.replySuccess(_('Connection to %s initiated.') % network)
connect = wrap(connect, ['owner', getopts({'ssl': ''}), 'something', connect = wrap(connect, ['owner', getopts({'ssl': ''}), 'something',
additional('something'), additional('something'),
additional('something', '')]) additional('something', '')])
@internationalizeDocstring
def disconnect(self, irc, msg, args, otherIrc, quitMsg): def disconnect(self, irc, msg, args, otherIrc, quitMsg):
"""[<network>] [<quit message>] """[<network>] [<quit message>]
@ -107,10 +111,11 @@ class Network(callbacks.Plugin):
otherIrc.die() otherIrc.die()
conf.supybot.networks().discard(otherIrc.network) conf.supybot.networks().discard(otherIrc.network)
if otherIrc != irc: if otherIrc != irc:
irc.replySuccess('Disconnection to %s initiated.' % irc.replySuccess(_('Disconnection to %s initiated.') %
otherIrc.network) otherIrc.network)
disconnect = wrap(disconnect, ['owner', 'networkIrc', additional('text')]) disconnect = wrap(disconnect, ['owner', 'networkIrc', additional('text')])
@internationalizeDocstring
def reconnect(self, irc, msg, args, otherIrc, quitMsg): def reconnect(self, irc, msg, args, otherIrc, quitMsg):
"""[<network>] [<quit message>] """[<network>] [<quit message>]
@ -127,6 +132,7 @@ class Network(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
reconnect = wrap(reconnect, ['owner', 'networkIrc', additional('text')]) reconnect = wrap(reconnect, ['owner', 'networkIrc', additional('text')])
@internationalizeDocstring
def command(self, irc, msg, args, otherIrc, commandAndArgs): def command(self, irc, msg, args, otherIrc, commandAndArgs):
"""<network> <command> [<arg> ...] """<network> <command> [<arg> ...]
@ -201,43 +207,43 @@ class Network(callbacks.Plugin):
voices.append(channel[1:]) voices.append(channel[1:])
L = [] L = []
if ops: if ops:
L.append(format('is an op on %L', ops)) L.append(format(_('is an op on %L'), ops))
if halfops: if halfops:
L.append(format('is a halfop on %L', halfops)) L.append(format(_('is a halfop on %L'), halfops))
if voices: if voices:
L.append(format('is voiced on %L', voices)) L.append(format(_('is voiced on %L'), voices))
if normal: if normal:
if L: if L:
L.append(format('is also on %L', normal)) L.append(format(_('is also on %L'), normal))
else: else:
L.append(format('is on %L', normal)) L.append(format(_('is on %L'), normal))
else: else:
L = ['isn\'t on any non-secret channels'] L = [_('isn\'t on any non-secret channels')]
channels = format('%L', L) channels = format('%L', L)
if '317' in d: if '317' in d:
idle = utils.timeElapsed(d['317'].args[2]) idle = utils.timeElapsed(d['317'].args[2])
signon = time.strftime(conf.supybot.reply.format.time(), signon = time.strftime(conf.supybot.reply.format.time(),
time.localtime(float(d['317'].args[3]))) time.localtime(float(d['317'].args[3])))
else: else:
idle = '<unknown>' idle = _('<unknown>')
signon = '<unknown>' signon = _('<unknown>')
if '312' in d: if '312' in d:
server = d['312'].args[2] server = d['312'].args[2]
else: else:
server = '<unknown>' server = _('<unknown>')
if '301' in d: if '301' in d:
away = ' %s is away: %s.' % (nick, d['301'].args[2]) away = ' %s is away: %s.' % (nick, d['301'].args[2])
else: else:
away = '' away = ''
if '320' in d: if '320' in d:
if d['320'].args[2]: if d['320'].args[2]:
identify = ' identified' identify = _(' identified')
else: else:
identify = '' identify = ''
else: else:
identify = '' identify = ''
s = '%s (%s) has been%s on server %s since %s (idle for %s) and ' \ s = _('%s (%s) has been%s on server %s since %s (idle for %s) and '
'%s.%s' % (user, hostmask, identify, server, signon, idle, '%s.%s') % (user, hostmask, identify, server, signon, idle,
channels, away) channels, away)
replyIrc.reply(s) replyIrc.reply(s)
del self._whois[(irc, loweredNick)] del self._whois[(irc, loweredNick)]
@ -249,10 +255,11 @@ class Network(callbacks.Plugin):
return return
(replyIrc, replyMsg, d) = self._whois[(irc, loweredNick)] (replyIrc, replyMsg, d) = self._whois[(irc, loweredNick)]
del self._whois[(irc, loweredNick)] del self._whois[(irc, loweredNick)]
s = 'There is no %s on %s.' % (nick, irc.network) s = _('There is no %s on %s.') % (nick, irc.network)
replyIrc.reply(s) replyIrc.reply(s)
do401 = do402 do401 = do402
@internationalizeDocstring
def whois(self, irc, msg, args, otherIrc, nick): def whois(self, irc, msg, args, otherIrc, nick):
"""[<network>] <nick> """[<network>] <nick>
@ -268,6 +275,7 @@ class Network(callbacks.Plugin):
self._whois[(otherIrc, nick)] = (irc, msg, {}) self._whois[(otherIrc, nick)] = (irc, msg, {})
whois = wrap(whois, ['networkIrc', 'nick']) whois = wrap(whois, ['networkIrc', 'nick'])
@internationalizeDocstring
def networks(self, irc, msg, args): def networks(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -282,8 +290,9 @@ class Network(callbacks.Plugin):
now = time.time() now = time.time()
if irc in self._latency: if irc in self._latency:
(replyIrc, when) = self._latency.pop(irc) (replyIrc, when) = self._latency.pop(irc)
replyIrc.reply('%.2f seconds.' % (now-when)) replyIrc.reply(_('%.2f seconds.') % (now-when))
@internationalizeDocstring
def latency(self, irc, msg, args, otherIrc): def latency(self, irc, msg, args, otherIrc):
"""[<network>] """[<network>]
@ -291,11 +300,13 @@ class Network(callbacks.Plugin):
if the message isn't sent on the network to which this command is to if the message isn't sent on the network to which this command is to
apply. apply.
""" """
otherIrc.queueMsg(ircmsgs.ping('Latency check (from %s).' % msg.nick)) otherIrc.queueMsg(ircmsgs.ping(_('Latency check (from %s).') %
msg.nick))
self._latency[otherIrc] = (irc, time.time()) self._latency[otherIrc] = (irc, time.time())
irc.noReply() irc.noReply()
latency = wrap(latency, ['networkIrc']) latency = wrap(latency, ['networkIrc'])
@internationalizeDocstring
def driver(self, irc, msg, args, otherIrc): def driver(self, irc, msg, args, otherIrc):
"""[<network>] """[<network>]

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

106
plugins/News/messages.pot Normal file
View File

@ -0,0 +1,106 @@
# 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 16:53+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:57
msgid "%s (Subject: %q, added by %s on %s)"
msgstr ""
#: plugin.py:61
msgid "%s (Subject: %q, added by %s on %s, expires at %s)"
msgstr ""
#: plugin.py:120
#, docstring
msgid ""
"[<channel>] <expires> <subject>: <text>\n"
"\n"
" Adds a given news item of <text> to a channel with the given <subject>.\n"
" If <expires> isn't 0, that news item will expire <expires> seconds from\n"
" now. <channel> is only necessary if the message isn't sent in the\n"
" channel itself.\n"
" "
msgstr ""
#: plugin.py:132
msgid "(News item #%i added)"
msgstr ""
#: plugin.py:137
#, docstring
msgid ""
"[<channel>] [<id>]\n"
"\n"
" Display the news items for <channel> in the format of '(#id) subject'.\n"
" If <id> is given, retrieve only that news item; otherwise retrieve all\n"
" news items. <channel> is only necessary if the message isn't sent in\n"
" the channel itself.\n"
" "
msgstr ""
#: plugin.py:148
msgid "News for %s: %s"
msgstr ""
#: plugin.py:151
msgid "No news for %s."
msgstr ""
#: plugin.py:157 plugin.py:171 plugin.py:187 plugin.py:203
msgid "news item id"
msgstr ""
#: plugin.py:162
#, docstring
msgid ""
"[<channel>] <id>\n"
"\n"
" Removes the news item with <id> from <channel>. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:176
#, docstring
msgid ""
"[<channel>] <id> <regexp>\n"
"\n"
" Changes the news item with <id> from <channel> according to the\n"
" regular expression <regexp>. <regexp> should be of the form\n"
" s/text/replacement/flags. <channel> is only necessary if the message\n"
" isn't sent on the channel itself.\n"
" "
msgstr ""
#: plugin.py:192
#, docstring
msgid ""
"[<channel>] [<id>]\n"
"\n"
" Returns the old news item for <channel> with <id>. If no number is\n"
" given, returns all the old news items in reverse order. <channel> is\n"
" only necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:208
msgid "Old news for %s: %s"
msgstr ""
#: plugin.py:211
msgid "No old news for %s."
msgstr ""

View File

@ -36,6 +36,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('News')
class DbiNewsDB(plugins.DbiChannelDB): class DbiNewsDB(plugins.DbiChannelDB):
@ -52,12 +54,12 @@ class DbiNewsDB(plugins.DbiChannelDB):
def __str__(self): def __str__(self):
user = plugins.getUserName(self.by) user = plugins.getUserName(self.by)
if self.expires == 0: if self.expires == 0:
s = format('%s (Subject: %q, added by %s on %s)', s = format(_('%s (Subject: %q, added by %s on %s)'),
self.text, self.subject, self.by, self.text, self.subject, self.by,
utils.str.timestamp(self.at)) utils.str.timestamp(self.at))
else: else:
s = format('%s (Subject: %q, added by %s on %s, ' s = format(_('%s (Subject: %q, added by %s on %s, '
'expires at %s)', 'expires at %s)'),
self.text, self.subject, user, self.text, self.subject, user,
utils.str.timestamp(self.at), utils.str.timestamp(self.at),
utils.str.timestamp(self.expires)) utils.str.timestamp(self.expires))
@ -113,6 +115,7 @@ class News(callbacks.Plugin):
self.__parent.die() self.__parent.die()
self.db.close() self.db.close()
@internationalizeDocstring
def add(self, irc, msg, args, channel, user, at, expires, news): def add(self, irc, msg, args, channel, user, at, expires, news):
"""[<channel>] <expires> <subject>: <text> """[<channel>] <expires> <subject>: <text>
@ -126,9 +129,10 @@ class News(callbacks.Plugin):
except ValueError: except ValueError:
raise callbacks.ArgumentError raise callbacks.ArgumentError
id = self.db.add(channel, subject, text, at, expires, user.id) id = self.db.add(channel, subject, text, at, expires, user.id)
irc.replySuccess(format('(News item #%i added)', id)) irc.replySuccess(format(_('(News item #%i added)'), id))
add = wrap(add, ['channeldb', 'user', 'now', 'expiry', 'text']) add = wrap(add, ['channeldb', 'user', 'now', 'expiry', 'text'])
@internationalizeDocstring
def news(self, irc, msg, args, channel, id): def news(self, irc, msg, args, channel, id):
"""[<channel>] [<id>] """[<channel>] [<id>]
@ -141,18 +145,19 @@ class News(callbacks.Plugin):
try: try:
records = self.db.get(channel) records = self.db.get(channel)
items = [format('(#%i) %s', R.id, R.subject) for R in records] items = [format('(#%i) %s', R.id, R.subject) for R in records]
s = format('News for %s: %s', channel, '; '.join(items)) s = format(_('News for %s: %s'), channel, '; '.join(items))
irc.reply(s) irc.reply(s)
except dbi.NoRecordError: except dbi.NoRecordError:
irc.reply(format('No news for %s.', channel)) irc.reply(format(_('No news for %s.'), channel))
else: else:
try: try:
record = self.db.get(channel, id) record = self.db.get(channel, id)
irc.reply(str(record)) irc.reply(str(record))
except dbi.NoRecordError, id: except dbi.NoRecordError, id:
irc.errorInvalid('news item id', id) irc.errorInvalid(_('news item id'), id)
news = wrap(news, ['channeldb', additional('positiveInt')]) news = wrap(news, ['channeldb', additional('positiveInt')])
@internationalizeDocstring
def remove(self, irc, msg, args, channel, id): def remove(self, irc, msg, args, channel, id):
"""[<channel>] <id> """[<channel>] <id>
@ -163,9 +168,10 @@ class News(callbacks.Plugin):
self.db.remove(channel, id) self.db.remove(channel, id)
irc.replySuccess() irc.replySuccess()
except dbi.NoRecordError: except dbi.NoRecordError:
irc.errorInvalid('news item id', id) irc.errorInvalid(_('news item id'), id)
remove = wrap(remove, ['channeldb', 'positiveInt']) remove = wrap(remove, ['channeldb', 'positiveInt'])
@internationalizeDocstring
def change(self, irc, msg, args, channel, id, replacer): def change(self, irc, msg, args, channel, id, replacer):
"""[<channel>] <id> <regexp> """[<channel>] <id> <regexp>
@ -178,9 +184,10 @@ class News(callbacks.Plugin):
self.db.change(channel, id, replacer) self.db.change(channel, id, replacer)
irc.replySuccess() irc.replySuccess()
except dbi.NoRecordError: except dbi.NoRecordError:
irc.errorInvalid('news item id', id) irc.errorInvalid(_('news item id'), id)
change = wrap(change, ['channeldb', 'positiveInt', 'regexpReplacer']) change = wrap(change, ['channeldb', 'positiveInt', 'regexpReplacer'])
@internationalizeDocstring
def old(self, irc, msg, args, channel, id): def old(self, irc, msg, args, channel, id):
"""[<channel>] [<id>] """[<channel>] [<id>]
@ -193,15 +200,15 @@ class News(callbacks.Plugin):
record = self.db.getOld(channel, id) record = self.db.getOld(channel, id)
irc.reply(str(record)) irc.reply(str(record))
except dbi.NoRecordError, id: except dbi.NoRecordError, id:
irc.errorInvalid('news item id', id) irc.errorInvalid(_('news item id'), id)
else: else:
try: try:
records = self.db.getOld(channel) records = self.db.getOld(channel)
items = [format('(#%i) %s', R.id, R.subject) for R in records] items = [format('(#%i) %s', R.id, R.subject) for R in records]
s = format('Old news for %s: %s', channel, '; '.join(items)) s = format(_('Old news for %s: %s'), channel, '; '.join(items))
irc.reply(s) irc.reply(s)
except dbi.NoRecordError: except dbi.NoRecordError:
irc.reply(format('No old news for %s.', channel)) irc.reply(format(_('No old news for %s.'), channel))
old = wrap(old, ['channeldb', additional('positiveInt')]) old = wrap(old, ['channeldb', additional('positiveInt')])

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('NickCapture')
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,11 +44,11 @@ def configure(advanced):
NickCapture = conf.registerPlugin('NickCapture') NickCapture = conf.registerPlugin('NickCapture')
conf.registerPlugin('NickCapture') conf.registerPlugin('NickCapture')
conf.registerGlobalValue(NickCapture, 'ison', conf.registerGlobalValue(NickCapture, 'ison',
registry.Boolean(True, """Determines whether the bot will check registry.Boolean(True, _("""Determines whether the bot will check
occasionally if its preferred nick is in use via the ISON command.""")) occasionally if its preferred nick is in use via the ISON command.""")))
conf.registerGlobalValue(NickCapture.ison, 'period', conf.registerGlobalValue(NickCapture.ison, 'period',
registry.PositiveInteger(600, """Determines how often (in seconds) the bot registry.PositiveInteger(600, _("""Determines how often (in seconds) the bot
will check whether its nick ISON.""")) will check whether its nick ISON.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -0,0 +1,42 @@
# 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 16:58+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 whether the bot will check\n"
" occasionally if its preferred nick is in use via the ISON command."
msgstr ""
#: config.py:50
msgid ""
"Determines how often (in seconds) the bot\n"
" will check whether its nick ISON."
msgstr ""
#: plugin.py:41
#, docstring
msgid ""
"This module constantly tries to take whatever nick is configured as\n"
" supybot.nick. Just make sure that's set appropriately, and thus plugin\n"
" will do the rest."
msgstr ""
#: plugin.py:90
#, docstring
msgid "This is returned by the ISON command."
msgstr ""

View File

@ -33,7 +33,10 @@ import supybot.conf as conf
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('NickCapture')
@internationalizeDocstring
class NickCapture(callbacks.Plugin): class NickCapture(callbacks.Plugin):
"""This module constantly tries to take whatever nick is configured as """This module constantly tries to take whatever nick is configured as
supybot.nick. Just make sure that's set appropriately, and thus plugin supybot.nick. Just make sure that's set appropriately, and thus plugin

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('Nickometer')
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
@ -42,7 +44,7 @@ def configure(advanced):
Nickometer = conf.registerPlugin('Nickometer') Nickometer = conf.registerPlugin('Nickometer')
# 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(Nickometer, 'someConfigVariableName', # conf.registerGlobalValue(Nickometer, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName.""")) # registry.Boolean(False, _("""Help for someConfigVariableName.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -0,0 +1,31 @@
# 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 18:28+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:84
#, docstring
msgid ""
"[<nick>]\n"
"\n"
" Tells you how lame said nick is. If <nick> is not given, uses the\n"
" nick of the person giving the command.\n"
" "
msgstr ""
#: plugin.py:226
msgid "The \"lame nick-o-meter\" reading for \"%s\" is %s%%."
msgstr ""

View File

@ -53,6 +53,8 @@ import string
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
from supybot.commands import wrap, additional from supybot.commands import wrap, additional
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Nickometer')
def slowExponent(x): def slowExponent(x):
return 1.3 * x * (1 - math.atan(x / 6.0) * 2 / math.pi) return 1.3 * x * (1 - math.atan(x / 6.0) * 2 / math.pi)
@ -77,6 +79,7 @@ class Nickometer(callbacks.Plugin):
self.log.debug('%s lameness points awarded: %s', damage, reason) self.log.debug('%s lameness points awarded: %s', damage, reason)
return damage return damage
@internationalizeDocstring
def nickometer(self, irc, msg, args, nick): def nickometer(self, irc, msg, args, nick):
"""[<nick>] """[<nick>]
@ -220,7 +223,7 @@ class Nickometer(callbacks.Plugin):
# if it's above 99.9%, show as many digits as is interesting # if it's above 99.9%, show as many digits as is interesting
score_string=re.sub('(99\\.9*\\d|\\.\\d).*','\\1',`percentage`) score_string=re.sub('(99\\.9*\\d|\\.\\d).*','\\1',`percentage`)
irc.reply('The "lame nick-o-meter" reading for "%s" is %s%%.' % irc.reply(_('The "lame nick-o-meter" reading for "%s" is %s%%.') %
(originalNick, score_string)) (originalNick, score_string))
self.log.debug('Calculated lameness score for %s as %s ' self.log.debug('Calculated lameness score for %s as %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('Plugin')
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

217
plugins/Plugin/messages.pot Normal file
View File

@ -0,0 +1,217 @@
# 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 13: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"
#: plugin.py:43
#, docstring
msgid ""
"This plugin exists to help users manage their plugins. Use 'plugin\n"
" list' to list the loaded plugins; use 'plugin help' to get the description\n"
" of a plugin; use the 'plugin' command itself to determine what plugin a\n"
" command exists in."
msgstr ""
#: plugin.py:49
#, docstring
msgid ""
"<plugin>\n"
"\n"
" Returns a useful description of how to use <plugin>, if the plugin has\n"
" one.\n"
" "
msgstr ""
#: plugin.py:58
msgid "That plugin is loaded, but has no plugin help."
msgstr ""
#: plugin.py:63
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns a list of the currently loaded plugins.\n"
" "
msgstr ""
#: plugin.py:74
#, docstring
msgid ""
"<command>\n"
"\n"
" Returns the plugin(s) that <command> is in.\n"
" "
msgstr ""
#: plugin.py:89
msgid "plugins"
msgstr ""
#: plugin.py:91
msgid "plugin"
msgstr ""
#: plugin.py:92
msgid "The %q command is available in the %L %s."
msgstr ""
#: plugin.py:95
msgid "There is no command %q."
msgstr ""
#: plugin.py:100
#, docstring
msgid ""
"<plugin>\n"
"\n"
" Returns the author of <plugin>. This is the person you should talk to\n"
" if you have ideas, suggestions, or other comments about a given plugin.\n"
" "
msgstr ""
#: plugin.py:106
msgid "That plugin does not seem to be loaded."
msgstr ""
#: plugin.py:112
msgid "That plugin doesn't have an author that claims it."
msgstr ""
#: plugin.py:117
#, docstring
msgid ""
"<plugin> [<nick>]\n"
"\n"
" Replies with a list of people who made contributions to a given plugin.\n"
" If <nick> is specified, that person's specific contributions will\n"
" be listed. Note: The <nick> is the part inside of the parentheses\n"
" in the people listing.\n"
" "
msgstr ""
#: plugin.py:125
#, docstring
msgid ""
"\n"
" Take an Authors object, and return only the name and nick values\n"
" in the format 'First Last (nick)'.\n"
" "
msgstr ""
#: plugin.py:131
#, docstring
msgid ""
"\n"
" Take a list of long names and turn it into :\n"
" shortname[, shortname and shortname].\n"
" "
msgstr ""
#: plugin.py:138
#, docstring
msgid ""
"\n"
" Sort the list of 'long names' based on the number of contributions\n"
" associated with each.\n"
" "
msgstr ""
#: plugin.py:148
#, docstring
msgid ""
"\n"
" Build the list of author + contributors (if any) for the requested\n"
" plugin.\n"
" "
msgstr ""
#: plugin.py:152
msgid "The %s plugin"
msgstr ""
#: plugin.py:153
msgid "has not been claimed by an author"
msgstr ""
#: plugin.py:154
msgid "and"
msgstr ""
#: plugin.py:155
msgid "has no contributors listed."
msgstr ""
#: plugin.py:160
msgid "was written by %s"
msgstr ""
#: plugin.py:171
msgid "%s %h contributed to it."
msgstr ""
#: plugin.py:176
msgid "has no additional contributors listed."
msgstr ""
#: plugin.py:178
msgid "but"
msgstr ""
#: plugin.py:181
#, docstring
msgid ""
"\n"
" Build the list of contributions (if any) for the requested person\n"
" for the requested plugin\n"
" "
msgstr ""
#: plugin.py:195
msgid "The nick specified (%s) is not a registered contributor."
msgstr ""
#: plugin.py:201
msgid "The %s plugin does not have '%s' listed as a contributor."
msgstr ""
#: plugin.py:209
msgid "command"
msgstr ""
#: plugin.py:212
msgid "the %L %s"
msgstr ""
#: plugin.py:214
msgid "the %L"
msgstr ""
#: plugin.py:217
msgid "%s wrote the %s plugin and also contributed %L."
msgstr ""
#: plugin.py:220
msgid "%s contributed %L to the %s plugin."
msgstr ""
#: plugin.py:223
msgid "%s wrote the %s plugin"
msgstr ""
#: plugin.py:226
msgid "%s has no listed contributions for the %s plugin."
msgstr ""

View File

@ -34,13 +34,17 @@ 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('Plugin')
@internationalizeDocstring
class Plugin(callbacks.Plugin): class Plugin(callbacks.Plugin):
"""This plugin exists to help users manage their plugins. Use 'plugin """This plugin exists to help users manage their plugins. Use 'plugin
list' to list the loaded plugins; use 'plugin help' to get the description list' to list the loaded plugins; use 'plugin help' to get the description
of a plugin; use the 'plugin' command itself to determine what plugin a of a plugin; use the 'plugin' command itself to determine what plugin a
command exists in.""" command exists in."""
@internationalizeDocstring
def help(self, irc, msg, args, cb): def help(self, irc, msg, args, cb):
"""<plugin> """<plugin>
@ -51,9 +55,10 @@ class Plugin(callbacks.Plugin):
if doc: if doc:
irc.reply(utils.str.normalizeWhitespace(doc)) irc.reply(utils.str.normalizeWhitespace(doc))
else: else:
irc.reply('That plugin is loaded, but has no plugin help.') irc.reply(_('That plugin is loaded, but has no plugin help.'))
help = wrap(help, ['plugin']) help = wrap(help, ['plugin'])
@internationalizeDocstring
def list(self, irc, msg, args): def list(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -64,6 +69,7 @@ class Plugin(callbacks.Plugin):
irc.reply(format('%L', L)) irc.reply(format('%L', L))
list = wrap(list) list = wrap(list)
@internationalizeDocstring
def plugin(self, irc, msg, args, command): def plugin(self, irc, msg, args, command):
"""<command> """<command>
@ -80,15 +86,16 @@ class Plugin(callbacks.Plugin):
irc.reply(format('%L', L)) irc.reply(format('%L', L))
else: else:
if len(L) > 1: if len(L) > 1:
plugin = 'plugins' plugin = _('plugins')
else: else:
plugin = 'plugin' plugin = _('plugin')
irc.reply(format('The %q command is available in the %L %s.', irc.reply(format(_('The %q command is available in the %L '
command, L, plugin)) '%s.'), command, L, plugin))
else: else:
irc.error(format('There is no command %q.', command)) irc.error(format(_('There is no command %q.'), command))
plugin = wrap(plugin, [many('something')]) plugin = wrap(plugin, [many('something')])
@internationalizeDocstring
def author(self, irc, msg, args, cb): def author(self, irc, msg, args, cb):
"""<plugin> """<plugin>
@ -96,15 +103,16 @@ class Plugin(callbacks.Plugin):
if you have ideas, suggestions, or other comments about a given plugin. if you have ideas, suggestions, or other comments about a given plugin.
""" """
if cb is None: if cb is None:
irc.error('That plugin does not seem to be loaded.') irc.error(_('That plugin does not seem to be loaded.'))
return return
module = cb.classModule module = cb.classModule
if hasattr(module, '__author__') and module.__author__: if hasattr(module, '__author__') and module.__author__:
irc.reply(str(module.__author__)) irc.reply(str(module.__author__))
else: else:
irc.reply('That plugin doesn\'t have an author that claims it.') irc.reply(_('That plugin doesn\'t have an author that claims it.'))
author = wrap(author, [('plugin')]) author = wrap(author, [('plugin')])
@internationalizeDocstring
def contributors(self, irc, msg, args, cb, nick): def contributors(self, irc, msg, args, cb, nick):
"""<plugin> [<nick>] """<plugin> [<nick>]
@ -141,15 +149,15 @@ class Plugin(callbacks.Plugin):
Build the list of author + contributors (if any) for the requested Build the list of author + contributors (if any) for the requested
plugin. plugin.
""" """
head = 'The %s plugin' % cb.name() head = _('The %s plugin') % cb.name()
author = 'has not been claimed by an author' author = _('has not been claimed by an author')
conjunction = 'and' conjunction = _('and')
contrib = 'has no contributors listed.' contrib = _('has no contributors listed.')
hasAuthor = False hasAuthor = False
hasContribs = False hasContribs = False
if hasattr(module, '__author__'): if hasattr(module, '__author__'):
if module.__author__ != supybot.authors.unknown: if module.__author__ != supybot.authors.unknown:
author = 'was written by %s' % \ author = _('was written by %s') % \
utils.web.mungeEmail(str(module.__author__)) utils.web.mungeEmail(str(module.__author__))
hasAuthor = True hasAuthor = True
if hasattr(module, '__contributors__'): if hasattr(module, '__contributors__'):
@ -160,14 +168,14 @@ class Plugin(callbacks.Plugin):
except ValueError: except ValueError:
pass pass
if contribs: if contribs:
contrib = format('%s %h contributed to it.', contrib = format(_('%s %h contributed to it.'),
buildContributorsString(contribs), buildContributorsString(contribs),
len(contribs)) len(contribs))
hasContribs = True hasContribs = True
elif hasAuthor: elif hasAuthor:
contrib = 'has no additional contributors listed.' contrib = _('has no additional contributors listed.')
if hasContribs and not hasAuthor: if hasContribs and not hasAuthor:
conjunction = 'but' conjunction = _('but')
return ' '.join([head, author, conjunction, contrib]) return ' '.join([head, author, conjunction, contrib])
def buildPersonString(module): def buildPersonString(module):
""" """
@ -184,39 +192,39 @@ class Plugin(callbacks.Plugin):
break break
authorInfo = authorInfo or getattr(supybot.authors, nick, None) authorInfo = authorInfo or getattr(supybot.authors, nick, None)
if not authorInfo: if not authorInfo:
return 'The nick specified (%s) is not a registered ' \ return _('The nick specified (%s) is not a registered '
'contributor.' % nick 'contributor.') % nick
fullName = utils.web.mungeEmail(str(authorInfo)) fullName = utils.web.mungeEmail(str(authorInfo))
contributions = [] contributions = []
if hasattr(module, '__contributors__'): if hasattr(module, '__contributors__'):
if authorInfo not in module.__contributors__: if authorInfo not in module.__contributors__:
return 'The %s plugin does not have \'%s\' listed as a ' \ return _('The %s plugin does not have \'%s\' listed as a '
'contributor.' % (cb.name(), nick) 'contributor.') % (cb.name(), nick)
contributions = module.__contributors__[authorInfo] contributions = module.__contributors__[authorInfo]
isAuthor = getattr(module, '__author__', False) == authorInfo isAuthor = getattr(module, '__author__', False) == authorInfo
(nonCommands, commands) = utils.iter.partition(lambda s: ' ' in s, (nonCommands, commands) = utils.iter.partition(lambda s: ' ' in s,
contributions) contributions)
results = [] results = []
if commands: if commands:
s = 'command' s = _('command')
if len(commands) > 1: if len(commands) > 1:
s = utils.str.pluralize(s) s = utils.str.pluralize(s)
results.append(format('the %L %s', commands, s)) results.append(format(_('the %L %s'), commands, s))
if nonCommands: if nonCommands:
results.append(format('the %L', nonCommands)) results.append(format(_('the %L'), nonCommands))
if results and isAuthor: if results and isAuthor:
return format( return format(
'%s wrote the %s plugin and also contributed %L.', _('%s wrote the %s plugin and also contributed %L.'),
(fullName, cb.name(), results)) (fullName, cb.name(), results))
elif results and not isAuthor: elif results and not isAuthor:
return format('%s contributed %L to the %s plugin.', return format(_('%s contributed %L to the %s plugin.'),
fullName, results, cb.name()) fullName, results, cb.name())
elif isAuthor and not results: elif isAuthor and not results:
return '%s wrote the %s plugin' % (fullName, cb.name()) return _('%s wrote the %s plugin') % (fullName, cb.name())
# XXX Does this ever actually get reached? # XXX Does this ever actually get reached?
else: else:
return '%s has no listed contributions for the %s plugin.' % \ return _('%s has no listed contributions for the %s '
(fullName, cb.name()) 'plugin.') % (fullName, cb.name())
# First we need to check and see if the requested plugin is loaded # First we need to check and see if the requested plugin is loaded
module = cb.classModule module = cb.classModule
if not nick: if not nick:

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('Praise')
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):
Praise = conf.registerPlugin('Praise') Praise = conf.registerPlugin('Praise')
# 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(Praise, 'someConfigVariableName', # conf.registerGlobalValue(Praise, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName.""")) # registry.Boolean(False, _("""Help for someConfigVariableName.""")))
conf.registerChannelValue(Praise, 'showIds', conf.registerChannelValue(Praise, 'showIds',
registry.Boolean(False, """Determines whether the bot will show the ids of registry.Boolean(False, _("""Determines whether the bot will show the ids of
a praise when the praise is given.""")) a praise when the praise is given.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -0,0 +1,60 @@
# 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 18:33+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 of\n"
" a praise when the praise is given."
msgstr ""
#: plugin.py:40
#, docstring
msgid ""
"Praise is a plugin for ... well, praising things. Feel free to add\n"
" your own flavor to it by customizing what praises it gives. Use \"praise\n"
" add <text>\" to add new ones, making sure to include \"$who\" in <text> where\n"
" you want to insert the thing being praised.\n"
" "
msgstr ""
#: plugin.py:54
msgid "Praises must contain $who."
msgstr ""
#: plugin.py:58
#, docstring
msgid ""
"[<channel>] [<id>] <who|what> [for <reason>]\n"
"\n"
" Praises <who|what> (for <reason>, if given). If <id> is given, uses\n"
" that specific praise. <channel> is only necessary if the message isn't\n"
" sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:74
msgid "There is no praise with id #%i."
msgstr ""
#: plugin.py:79
msgid "There are no praises in my database for %s."
msgstr ""
#: plugin.py:87
msgid " for "
msgstr ""

View File

@ -32,7 +32,10 @@ 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('Praise')
@internationalizeDocstring
class Praise(plugins.ChannelIdDatabasePlugin): class Praise(plugins.ChannelIdDatabasePlugin):
"""Praise is a plugin for ... well, praising things. Feel free to add """Praise is a plugin for ... well, praising things. Feel free to add
your own flavor to it by customizing what praises it gives. Use "praise your own flavor to it by customizing what praises it gives. Use "praise
@ -48,8 +51,9 @@ class Praise(plugins.ChannelIdDatabasePlugin):
def addValidator(self, irc, text): def addValidator(self, irc, text):
if '$who' not in text: if '$who' not in text:
irc.error('Praises must contain $who.', Raise=True) irc.error(_('Praises must contain $who.'), Raise=True)
@internationalizeDocstring
def praise(self, irc, msg, args, channel, id, text): def praise(self, irc, msg, args, channel, id, text):
"""[<channel>] [<id>] <who|what> [for <reason>] """[<channel>] [<id>] <who|what> [for <reason>]
@ -67,20 +71,20 @@ class Praise(plugins.ChannelIdDatabasePlugin):
try: try:
praise = self.db.get(channel, id) praise = self.db.get(channel, id)
except KeyError: except KeyError:
irc.error(format('There is no praise with id #%i.', id)) irc.error(format(_('There is no praise with id #%i.'), id))
return return
else: else:
praise = self.db.random(channel) praise = self.db.random(channel)
if not praise: if not praise:
irc.error(format('There are no praises in my database ' \ irc.error(format(_('There are no praises in my database ' \
'for %s.', channel)) 'for %s.'), channel))
return return
text = self._replaceFirstPerson(praise.text, msg.nick) text = self._replaceFirstPerson(praise.text, msg.nick)
reason = self._replaceFirstPerson(reason, msg.nick) reason = self._replaceFirstPerson(reason, msg.nick)
target = self._replaceFirstPerson(target, msg.nick) target = self._replaceFirstPerson(target, msg.nick)
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)', praise.id) text += format(' (#%i)', praise.id)
irc.reply(text, action=True) irc.reply(text, action=True)

View File

@ -30,6 +30,8 @@
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('Protector')
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,17 +44,17 @@ def configure(advanced):
Protector = conf.registerPlugin('Protector') Protector = conf.registerPlugin('Protector')
conf.registerChannelValue(Protector, 'enable', conf.registerChannelValue(Protector, 'enable',
registry.Boolean(True, """Determines whether this plugin is enabled in a registry.Boolean(True, _("""Determines whether this plugin is enabled in a
given channel.""")) given channel.""")))
class ImmuneNicks(conf.ValidNicks): class ImmuneNicks(conf.ValidNicks):
List = ircutils.IrcSet List = ircutils.IrcSet
conf.registerChannelValue(Protector, 'immune', conf.registerChannelValue(Protector, 'immune',
ImmuneNicks([], """Determines what nicks the bot will consider to ImmuneNicks([], _("""Determines what nicks the bot will consider to
be immune from enforcement. These nicks will not even have their actions be immune from enforcement. These nicks will not even have their actions
watched by this plugin. In general, only the ChanServ for this network watched by this plugin. In general, only the ChanServ for this network
will be in this list.""")) will be in this list.""")))

View File

@ -0,0 +1,31 @@
# 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 18:34+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 whether this plugin is enabled in a\n"
" given channel."
msgstr ""
#: config.py:54
msgid ""
"Determines what nicks the bot will consider to\n"
" be immune from enforcement. These nicks will not even have their actions\n"
" watched by this plugin. In general, only the ChanServ for this network\n"
" will be in this list."
msgstr ""

View File

@ -32,6 +32,8 @@ import supybot.ircdb as ircdb
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('Protector')
class Protector(callbacks.Plugin): class Protector(callbacks.Plugin):
def isImmune(self, irc, msg): def isImmune(self, irc, msg):

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

View File

@ -0,0 +1,31 @@
# 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 18:34+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:38
#, docstring
msgid ""
"[<channel>]\n"
"\n"
" Returns a random quote from <channel>. <channel> is only necessary if\n"
" the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:47
msgid "I have no quotes in my database for %s."
msgstr ""

View File

@ -29,8 +29,11 @@
from supybot.commands import * from supybot.commands import *
import supybot.plugins as plugins import supybot.plugins as plugins
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Quote')
class Quote(plugins.ChannelIdDatabasePlugin): class Quote(plugins.ChannelIdDatabasePlugin):
@internationalizeDocstring
def random(self, irc, msg, args, channel): def random(self, irc, msg, args, channel):
"""[<channel>] """[<channel>]
@ -41,7 +44,7 @@ class Quote(plugins.ChannelIdDatabasePlugin):
if quote: if quote:
irc.reply(self.showRecord(quote)) irc.reply(self.showRecord(quote))
else: else:
irc.error('I have no quotes in my database for %s.' % channel) irc.error(_('I have no quotes in my database for %s.') % channel)
random = wrap(random, ['channeldb']) random = wrap(random, ['channeldb'])
Class = Quote Class = Quote

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('QuoteGrabs')
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,24 +44,24 @@ def configure(advanced):
QuoteGrabs = conf.registerPlugin('QuoteGrabs') QuoteGrabs = conf.registerPlugin('QuoteGrabs')
# 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(QuoteGrabs, 'someConfigVariableName', # conf.registerGlobalValue(QuoteGrabs, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName.""")) # registry.Boolean(False, _("""Help for someConfigVariableName.""")))
conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs, 'randomGrabber', conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs, 'randomGrabber',
registry.Boolean(False, """Determines whether the bot will randomly grab registry.Boolean(False, _("""Determines whether the bot will randomly grab
possibly-suitable quotes on occasion. The suitability of a given message possibly-suitable quotes on occasion. The suitability of a given message
is determined by ...""")) is determined by ...""")))
conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber, conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber,
'averageTimeBetweenGrabs', 'averageTimeBetweenGrabs',
registry.PositiveInteger(864000, """Determines about how many seconds, on registry.PositiveInteger(864000, _("""Determines about how many seconds, on
average, should elapse between random grabs. This is only an average average, should elapse between random grabs. This is only an average
value; grabs can happen from any time after half this time until never, value; grabs can happen from any time after half this time until never,
although that's unlikely to occur.""")) although that's unlikely to occur.""")))
conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber, conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber,
'minimumWords', registry.PositiveInteger(3, """Determines the minimum 'minimumWords', registry.PositiveInteger(3, _("""Determines the minimum
number of words in a message for it to be considered for random number of words in a message for it to be considered for random
grabbing.""")) grabbing.""")))
conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber, conf.registerChannelValue(conf.supybot.plugins.QuoteGrabs.randomGrabber,
'minimumCharacters', registry.PositiveInteger(8, """Determines the 'minimumCharacters', registry.PositiveInteger(8, _("""Determines the
minimum number of characters in a message for it to be considered for minimum number of characters in a message for it to be considered for
random grabbing.""")) random grabbing.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

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 18:36+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 randomly grab\n"
" possibly-suitable quotes on occasion. The suitability of a given message\n"
" is determined by ..."
msgstr ""
#: config.py:54
msgid ""
"Determines about how many seconds, on\n"
" average, should elapse between random grabs. This is only an average\n"
" value; grabs can happen from any time after half this time until never,\n"
" although that's unlikely to occur."
msgstr ""
#: config.py:59
msgid ""
"Determines the minimum\n"
" number of words in a message for it to be considered for random\n"
" grabbing."
msgstr ""
#: config.py:63
msgid ""
"Determines the\n"
" minimum number of characters in a message for it to be considered for\n"
" random grabbing."
msgstr ""
#: plugin.py:57
msgid "%s (Said by: %s; grabbed by %s at %t)"
msgstr ""
#: plugin.py:210
#, docstring
msgid "Add the help for \"@help QuoteGrabs\" here."
msgstr ""
#: plugin.py:249
#, docstring
msgid ""
"[<channel>] <nick>\n"
"\n"
" Grabs a quote from <channel> by <nick> for the quotegrabs table.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:262
msgid "You can't quote grab yourself."
msgstr ""
#: plugin.py:269
msgid "I couldn't find a proper message to grab."
msgstr ""
#: plugin.py:274
#, docstring
msgid ""
"[<channel>] <number>\n"
"\n"
" Removes the grab <number> (the last by default) on <channel>.\n"
" <channel> is only necessary if the message isn't sent in the channel\n"
" itself.\n"
" "
msgstr ""
#: plugin.py:285
msgid "Nothing to ungrab."
msgstr ""
#: plugin.py:287
msgid "Invalid grab number."
msgstr ""
#: plugin.py:292
#, docstring
msgid ""
"[<channel>] <nick>\n"
"\n"
" Returns <nick>'s latest quote grab in <channel>. <channel> is only\n"
" necessary if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:300
msgid "I couldn't find a matching quotegrab for %s."
msgstr ""
#: plugin.py:306
#, docstring
msgid ""
"[<channel>] <nick>\n"
"\n"
" Returns a list of shortened quotes that have been grabbed for <nick>\n"
" as well as the id of each quote. These ids can be used to get the\n"
" full quote. <channel> is only necessary if the message isn't sent in\n"
" the channel itself.\n"
" "
msgstr ""
#: plugin.py:323
msgid "I couldn't find any quotegrabs for %s."
msgstr ""
#: plugin.py:329
#, docstring
msgid ""
"[<channel>] [<nick>]\n"
"\n"
" Returns a randomly grabbed quote, optionally choosing only from those\n"
" quotes grabbed for <nick>. <channel> is only necessary if the message\n"
" isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:339
msgid "Couldn't get a random quote for that nick."
msgstr ""
#: plugin.py:341
msgid "Couldn't get a random quote. Are there any grabbed quotes in the database?"
msgstr ""
#: plugin.py:347
#, docstring
msgid ""
"[<channel>] <id>\n"
"\n"
" Return the quotegrab with the given <id>. <channel> is only necessary\n"
" if the message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:355
msgid "No quotegrab for id %s"
msgstr ""
#: plugin.py:361
#, docstring
msgid ""
"[<channel>] <text>\n"
"\n"
" Searches for <text> in a quote. <channel> is only necessary if the\n"
" message isn't sent in the channel itself.\n"
" "
msgstr ""
#: plugin.py:376
msgid "No quotegrabs matching %s"
msgstr ""

View File

@ -40,6 +40,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('QuoteGrabs')
class QuoteGrabsRecord(dbi.Record): class QuoteGrabsRecord(dbi.Record):
__fields__ = [ __fields__ = [
@ -52,7 +54,7 @@ class QuoteGrabsRecord(dbi.Record):
def __str__(self): def __str__(self):
grabber = plugins.getUserName(self.grabber) grabber = plugins.getUserName(self.grabber)
return format('%s (Said by: %s; grabbed by %s at %t)', return format(_('%s (Said by: %s; grabbed by %s at %t)'),
self.text, self.hostmask, grabber, self.at) self.text, self.hostmask, grabber, self.at)
class SqliteQuoteGrabsDB(object): class SqliteQuoteGrabsDB(object):
@ -242,6 +244,7 @@ class QuoteGrabs(callbacks.Plugin):
s = 'jots down a new quote for %s' % msg.nick s = 'jots down a new quote for %s' % msg.nick
irc.reply(s, action=True, prefixNick=False) irc.reply(s, action=True, prefixNick=False)
@internationalizeDocstring
def grab(self, irc, msg, args, channel, nick): def grab(self, irc, msg, args, channel, nick):
"""[<channel>] <nick> """[<channel>] <nick>
@ -256,16 +259,17 @@ class QuoteGrabs(callbacks.Plugin):
if chan is None: if chan is None:
raise callbacks.ArgumentError raise callbacks.ArgumentError
if ircutils.nickEqual(nick, msg.nick): if ircutils.nickEqual(nick, msg.nick):
irc.error('You can\'t quote grab yourself.', Raise=True) irc.error(_('You can\'t quote grab yourself.'), Raise=True)
for m in reversed(irc.state.history): for m in reversed(irc.state.history):
if m.command == 'PRIVMSG' and ircutils.nickEqual(m.nick, nick) \ if m.command == 'PRIVMSG' and ircutils.nickEqual(m.nick, nick) \
and ircutils.strEqual(m.args[0], chan): and ircutils.strEqual(m.args[0], chan):
self._grab(channel, irc, m, msg.prefix) self._grab(channel, irc, m, msg.prefix)
irc.replySuccess() irc.replySuccess()
return return
irc.error('I couldn\'t find a proper message to grab.') irc.error(_('I couldn\'t find a proper message to grab.'))
grab = wrap(grab, ['channeldb', 'nick']) grab = wrap(grab, ['channeldb', 'nick'])
@internationalizeDocstring
def ungrab(self, irc, msg, args, channel, grab): def ungrab(self, irc, msg, args, channel, grab):
"""[<channel>] <number> """[<channel>] <number>
@ -278,11 +282,12 @@ class QuoteGrabs(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
except dbi.NoRecordError: except dbi.NoRecordError:
if grab is None: if grab is None:
irc.error('Nothing to ungrab.') irc.error(_('Nothing to ungrab.'))
else: else:
irc.error('Invalid grab number.') irc.error(_('Invalid grab number.'))
ungrab = wrap(ungrab, ['channeldb', optional('id')]) ungrab = wrap(ungrab, ['channeldb', optional('id')])
@internationalizeDocstring
def quote(self, irc, msg, args, channel, nick): def quote(self, irc, msg, args, channel, nick):
"""[<channel>] <nick> """[<channel>] <nick>
@ -292,10 +297,11 @@ class QuoteGrabs(callbacks.Plugin):
try: try:
irc.reply(self.db.getQuote(channel, nick)) irc.reply(self.db.getQuote(channel, nick))
except dbi.NoRecordError: except dbi.NoRecordError:
irc.error('I couldn\'t find a matching quotegrab for %s.' % nick, irc.error(_('I couldn\'t find a matching quotegrab for %s.') %
Raise=True) nick, Raise=True)
quote = wrap(quote, ['channeldb', 'nick']) quote = wrap(quote, ['channeldb', 'nick'])
@internationalizeDocstring
def list(self, irc, msg, args, channel, nick): def list(self, irc, msg, args, channel, nick):
"""[<channel>] <nick> """[<channel>] <nick>
@ -314,10 +320,11 @@ class QuoteGrabs(callbacks.Plugin):
L.append(item) L.append(item)
irc.reply(utils.str.commaAndify(L)) irc.reply(utils.str.commaAndify(L))
except dbi.NoRecordError: except dbi.NoRecordError:
irc.error('I couldn\'t find any quotegrabs for %s.' % nick, irc.error(_('I couldn\'t find any quotegrabs for %s.') % nick,
Raise=True) Raise=True)
list = wrap(list, ['channeldb', 'nick']) list = wrap(list, ['channeldb', 'nick'])
@internationalizeDocstring
def random(self, irc, msg, args, channel, nick): def random(self, irc, msg, args, channel, nick):
"""[<channel>] [<nick>] """[<channel>] [<nick>]
@ -329,12 +336,13 @@ class QuoteGrabs(callbacks.Plugin):
irc.reply(self.db.random(channel, nick)) irc.reply(self.db.random(channel, nick))
except dbi.NoRecordError: except dbi.NoRecordError:
if nick: if nick:
irc.error('Couldn\'t get a random quote for that nick.') irc.error(_('Couldn\'t get a random quote for that nick.'))
else: else:
irc.error('Couldn\'t get a random quote. Are there any ' irc.error(_('Couldn\'t get a random quote. Are there any '
'grabbed quotes in the database?') 'grabbed quotes in the database?'))
random = wrap(random, ['channeldb', additional('nick')]) random = wrap(random, ['channeldb', additional('nick')])
@internationalizeDocstring
def get(self, irc, msg, args, channel, id): def get(self, irc, msg, args, channel, id):
"""[<channel>] <id> """[<channel>] <id>
@ -344,10 +352,11 @@ class QuoteGrabs(callbacks.Plugin):
try: try:
irc.reply(self.db.get(channel, id)) irc.reply(self.db.get(channel, id))
except dbi.NoRecordError: except dbi.NoRecordError:
irc.error('No quotegrab for id %s' % utils.str.quoted(id), irc.error(_('No quotegrab for id %s') % utils.str.quoted(id),
Raise=True) Raise=True)
get = wrap(get, ['channeldb', 'id']) get = wrap(get, ['channeldb', 'id'])
@internationalizeDocstring
def search(self, irc, msg, args, channel, text): def search(self, irc, msg, args, channel, text):
"""[<channel>] <text> """[<channel>] <text>
@ -364,7 +373,7 @@ class QuoteGrabs(callbacks.Plugin):
L.append(item) L.append(item)
irc.reply(utils.str.commaAndify(L)) irc.reply(utils.str.commaAndify(L))
except dbi.NoRecordError: except dbi.NoRecordError:
irc.error('No quotegrabs matching %s' % utils.str.quoted(text), irc.error(_('No quotegrabs matching %s') % utils.str.quoted(text),
Raise=True) Raise=True)
search = wrap(search, ['channeldb', 'text']) search = wrap(search, ['channeldb', '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('User')
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

288
plugins/User/messages.pot Normal file
View File

@ -0,0 +1,288 @@
# 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 13: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"
#: plugin.py:49
#, docstring
msgid ""
"[--capability=<capability>] [<glob>]\n"
"\n"
" Returns the valid registered usernames matching <glob>. If <glob> is\n"
" not given, returns all registered usernames.\n"
" "
msgstr ""
#: plugin.py:80
msgid "There are no matching registered users."
msgstr ""
#: plugin.py:82
msgid "There are no registered users."
msgstr ""
#: plugin.py:88
#, docstring
msgid ""
"<name> <password>\n"
"\n"
" Registers <name> with the given password <password> and the current\n"
" hostmask of the person registering. You shouldn't register twice; if\n"
" you're not recognized as a user but you've already registered, use the\n"
" hostmask add command to add another hostmask to your already-registered\n"
" user, or use the identify command to identify just for a session.\n"
" This command (and all other commands that include a password) must be\n"
" sent to the bot privately, not in a channel.\n"
" "
msgstr ""
#: plugin.py:101
msgid "That name is already assigned to someone."
msgstr ""
#: plugin.py:106
msgid "username"
msgstr ""
#: plugin.py:107
msgid "Hostmasks are not valid usernames."
msgstr ""
#: plugin.py:114
msgid "Your hostmask is already registered to %s"
msgstr ""
#: plugin.py:130
#, docstring
msgid ""
"<name> [<password>]\n"
"\n"
" Unregisters <name> from the user database. If the user giving this\n"
" command is an owner user, the password is not necessary.\n"
" "
msgstr ""
#: plugin.py:145
msgid "This command has been disabled. You'll have to ask the owner of this bot to unregister your user."
msgstr ""
#: plugin.py:158
#, docstring
msgid ""
"<name> <new name> [<password>]\n"
"\n"
" Changes your current user database name to the new name given.\n"
" <password> is only necessary if the user isn't recognized by hostmask.\n"
" This message must be sent to the bot privately (not on a channel) since\n"
" it may contain a password.\n"
" "
msgstr ""
#: plugin.py:167
msgid "%q is already registered."
msgstr ""
#: plugin.py:181
#, docstring
msgid ""
"[<name>] <old password> <new password>\n"
"\n"
" Sets the new password for the user specified by <name> to <new\n"
" password>. Obviously this message must be sent to the bot\n"
" privately (not in a channel). If the requesting user is an owner\n"
" user (and the user whose password is being changed isn't that same\n"
" owner user), then <old password> needn't be correct.\n"
" "
msgstr ""
#: plugin.py:209
#, docstring
msgid ""
"<password> [<True|False>]\n"
"\n"
" Sets the secure flag on the user of the person sending the message.\n"
" Requires that the person's hostmask be in the list of hostmasks for\n"
" that user in addition to the password being correct. When the\n"
" secure flag is set, the user *must* identify before he can be\n"
" recognized. If a specific True/False value is not given, it\n"
" inverts the current value.\n"
" "
msgstr ""
#: plugin.py:224
msgid "Secure flag set to %s"
msgstr ""
#: plugin.py:232
#, docstring
msgid ""
"<hostmask|nick>\n"
"\n"
" Returns the username of the user specified by <hostmask> or <nick> if\n"
" the user is registered.\n"
" "
msgstr ""
#: plugin.py:241
msgid "I haven't seen %s."
msgstr ""
#: plugin.py:246
msgid "I don't know who that is."
msgstr ""
#: plugin.py:252
#, docstring
msgid ""
"[<nick>]\n"
"\n"
" Returns the hostmask of <nick>. If <nick> isn't given, return the\n"
" hostmask of the person giving the command.\n"
" "
msgstr ""
#: plugin.py:264
#, docstring
msgid ""
"[<name>]\n"
"\n"
" Returns the hostmasks of the user specified by <name>; if <name>\n"
" isn't specified, returns the hostmasks of the user calling the\n"
" command.\n"
" "
msgstr ""
#: plugin.py:276
msgid "%s has no registered hostmasks."
msgstr ""
#: plugin.py:283
msgid "You may only retrieve your own (hostmasks."
msgstr ""
#: plugin.py:299
#, docstring
msgid ""
"[<name>] [<hostmask>] [<password>]\n"
"\n"
" Adds the hostmask <hostmask> to the user specified by <name>. The\n"
" <password> may only be required if the user is not recognized by\n"
" hostmask. <password> is also not required if an owner user is\n"
" giving the command on behalf of some other user. If <hostmask> is\n"
" not given, it defaults to your current hostmask. If <name> is not\n"
" given, it defaults to your currently identified name. This message\n"
" must be sent to the bot privately (not on a channel) since it may\n"
" contain a password.\n"
" "
msgstr ""
#: plugin.py:313
msgid "hostmask"
msgstr ""
#: plugin.py:314
msgid "Make sure your hostmask includes a nick, then an exclamation point (!), then a user, then an at symbol (@), then a host. Feel free to use wildcards (* and ?, which work just like they do on the command line) in any of these parts."
msgstr ""
#: plugin.py:324 plugin.py:347
msgid "That hostmask is already registered."
msgstr ""
#: plugin.py:355
#, docstring
msgid ""
"<name> <hostmask> [<password>]\n"
"\n"
" Removes the hostmask <hostmask> from the record of the user\n"
" specified by <name>. If the hostmask given is 'all' then all\n"
" hostmasks will be removed. The <password> may only be required if\n"
" the user is not recognized by his hostmask. This message must be\n"
" sent to the bot privately (not on a channel) since it may contain a\n"
" password.\n"
" "
msgstr ""
#: plugin.py:374
msgid "All hostmasks removed."
msgstr ""
#: plugin.py:378
msgid "There was no such hostmask."
msgstr ""
#: plugin.py:387
#, docstring
msgid ""
"[<name>]\n"
"\n"
" Returns the capabilities of the user specified by <name>; if <name>\n"
" isn't specified, returns the capabilities of the user calling the\n"
" command.\n"
" "
msgstr ""
#: plugin.py:407
#, docstring
msgid ""
"<name> <password>\n"
"\n"
" Identifies the user as <name>. This command (and all other\n"
" commands that include a password) must be sent to the bot privately,\n"
" not in a channel.\n"
" "
msgstr ""
#: plugin.py:419
msgid "Your secure flag is true and your hostmask doesn't match any of your known hostmasks."
msgstr ""
#: plugin.py:429
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Un-identifies you. Note that this may not result in the desired\n"
" effect of causing the bot not to recognize you anymore, since you may\n"
" have added hostmasks to your user that can cause the bot to continue to\n"
" recognize you.\n"
" "
msgstr ""
#: plugin.py:447
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns the name of the user calling the command.\n"
" "
msgstr ""
#: plugin.py:455
msgid "I don't recognize you."
msgstr ""
#: plugin.py:460
#, docstring
msgid ""
"takes no arguments\n"
"\n"
" Returns some statistics on the user database.\n"
" "
msgstr ""
#: plugin.py:478
msgid "I have %s registered users with %s registered hostmasks; %n and %n."
msgstr ""

View File

@ -36,12 +36,15 @@ import supybot.ircdb as ircdb
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('User')
class User(callbacks.Plugin): class User(callbacks.Plugin):
def _checkNotChannel(self, irc, msg, password=' '): def _checkNotChannel(self, irc, msg, password=' '):
if password and irc.isChannel(msg.args[0]): if password and irc.isChannel(msg.args[0]):
raise callbacks.Error, conf.supybot.replies.requiresPrivacy() raise callbacks.Error, conf.supybot.replies.requiresPrivacy()
@internationalizeDocstring
def list(self, irc, msg, args, optlist, glob): def list(self, irc, msg, args, optlist, glob):
"""[--capability=<capability>] [<glob>] """[--capability=<capability>] [<glob>]
@ -74,12 +77,13 @@ class User(callbacks.Plugin):
irc.reply(format('%L', users)) irc.reply(format('%L', users))
else: else:
if predicates: if predicates:
irc.reply('There are no matching registered users.') irc.reply(_('There are no matching registered users.'))
else: else:
irc.reply('There are no registered users.') irc.reply(_('There are no registered users.'))
list = wrap(list, [getopts({'capability':'capability'}), list = wrap(list, [getopts({'capability':'capability'}),
additional('glob')]) additional('glob')])
@internationalizeDocstring
def register(self, irc, msg, args, name, password): def register(self, irc, msg, args, name, password):
"""<name> <password> """<name> <password>
@ -94,18 +98,21 @@ class User(callbacks.Plugin):
addHostmask = True addHostmask = True
try: try:
ircdb.users.getUserId(name) ircdb.users.getUserId(name)
irc.error('That name is already assigned to someone.', Raise=True) irc.error(_('That name is already assigned to someone.'),
Raise=True)
except KeyError: except KeyError:
pass pass
if ircutils.isUserHostmask(name): if ircutils.isUserHostmask(name):
irc.errorInvalid('username', name, irc.errorInvalid(_('username'), name,
'Hostmasks are not valid usernames.', Raise=True) _('Hostmasks are not valid usernames.'),
Raise=True)
try: try:
u = ircdb.users.getUser(msg.prefix) u = ircdb.users.getUser(msg.prefix)
if u._checkCapability('owner'): if u._checkCapability('owner'):
addHostmask = False addHostmask = False
else: else:
irc.error('Your hostmask is already registered to %s' % u.name) irc.error(_('Your hostmask is already registered to %s') %
u.name)
return return
except KeyError: except KeyError:
pass pass
@ -118,6 +125,7 @@ class User(callbacks.Plugin):
irc.replySuccess() irc.replySuccess()
register = wrap(register, ['private', 'something', 'something']) register = wrap(register, ['private', 'something', 'something'])
@internationalizeDocstring
def unregister(self, irc, msg, args, user, password): def unregister(self, irc, msg, args, user, password):
"""<name> [<password>] """<name> [<password>]
@ -134,9 +142,9 @@ class User(callbacks.Plugin):
if not caller or not isOwner: if not caller or not isOwner:
self.log.warning('%s tried to unregister user %s.', self.log.warning('%s tried to unregister user %s.',
msg.prefix, user.name) msg.prefix, user.name)
irc.error('This command has been disabled. You\'ll have to ' irc.error(_('This command has been disabled. You\'ll have to '
'ask the owner of this bot to unregister your user.', 'ask the owner of this bot to unregister your '
Raise=True) 'user.'), Raise=True)
if isOwner or user.checkPassword(password): if isOwner or user.checkPassword(password):
ircdb.users.delUser(user.id) ircdb.users.delUser(user.id)
irc.replySuccess() irc.replySuccess()
@ -145,6 +153,7 @@ class User(callbacks.Plugin):
unregister = wrap(unregister, ['private', 'otherUser', unregister = wrap(unregister, ['private', 'otherUser',
additional('anything')]) additional('anything')])
@internationalizeDocstring
def changename(self, irc, msg, args, user, newname, password): def changename(self, irc, msg, args, user, newname, password):
"""<name> <new name> [<password>] """<name> <new name> [<password>]
@ -155,7 +164,7 @@ class User(callbacks.Plugin):
""" """
try: try:
id = ircdb.users.getUserId(newname) id = ircdb.users.getUserId(newname)
irc.error(format('%q is already registered.', newname)) irc.error(format(_('%q is already registered.'), newname))
return return
except KeyError: except KeyError:
pass pass
@ -167,6 +176,7 @@ class User(callbacks.Plugin):
additional('something', '')]) additional('something', '')])
class set(callbacks.Commands): class set(callbacks.Commands):
@internationalizeDocstring
def password(self, irc, msg, args, user, password, newpassword): def password(self, irc, msg, args, user, password, newpassword):
"""[<name>] <old password> <new password> """[<name>] <old password> <new password>
@ -194,6 +204,7 @@ class User(callbacks.Plugin):
password = wrap(password, ['private', optional('otherUser'), password = wrap(password, ['private', optional('otherUser'),
'something', 'something']) 'something', 'something'])
@internationalizeDocstring
def secure(self, irc, msg, args, user, password, value): def secure(self, irc, msg, args, user, password, value):
"""<password> [<True|False>] """<password> [<True|False>]
@ -210,12 +221,13 @@ class User(callbacks.Plugin):
user.checkHostmask(msg.prefix, useAuth=False): user.checkHostmask(msg.prefix, useAuth=False):
user.secure = value user.secure = value
ircdb.users.setUser(user) ircdb.users.setUser(user)
irc.reply('Secure flag set to %s' % value) irc.reply(_('Secure flag set to %s') % value)
else: else:
irc.error(conf.supybot.replies.incorrectAuthentication()) irc.error(conf.supybot.replies.incorrectAuthentication())
secure = wrap(secure, ['private', 'user', 'something', secure = wrap(secure, ['private', 'user', 'something',
additional('boolean')]) additional('boolean')])
@internationalizeDocstring
def username(self, irc, msg, args, hostmask): def username(self, irc, msg, args, hostmask):
"""<hostmask|nick> """<hostmask|nick>
@ -226,15 +238,16 @@ class User(callbacks.Plugin):
try: try:
hostmask = irc.state.nickToHostmask(hostmask) hostmask = irc.state.nickToHostmask(hostmask)
except KeyError: except KeyError:
irc.error('I haven\'t seen %s.' % hostmask, Raise=True) irc.error(_('I haven\'t seen %s.') % hostmask, Raise=True)
try: try:
user = ircdb.users.getUser(hostmask) user = ircdb.users.getUser(hostmask)
irc.reply(user.name) irc.reply(user.name)
except KeyError: except KeyError:
irc.error('I don\'t know who that is.') irc.error(_('I don\'t know who that is.'))
username = wrap(username, [first('nick', 'hostmask')]) username = wrap(username, [first('nick', 'hostmask')])
class hostmask(callbacks.Commands): class hostmask(callbacks.Commands):
@internationalizeDocstring
def hostmask(self, irc, msg, args, nick): def hostmask(self, irc, msg, args, nick):
"""[<nick>] """[<nick>]
@ -246,6 +259,7 @@ class User(callbacks.Plugin):
irc.reply(irc.state.nickToHostmask(nick)) irc.reply(irc.state.nickToHostmask(nick))
hostmask = wrap(hostmask, [additional('seenNick')]) hostmask = wrap(hostmask, [additional('seenNick')])
@internationalizeDocstring
def list(self, irc, msg, args, name): def list(self, irc, msg, args, name):
"""[<name>] """[<name>]
@ -259,14 +273,15 @@ class User(callbacks.Plugin):
hostmasks.sort() hostmasks.sort()
return format('%L', hostmasks) return format('%L', hostmasks)
else: else:
return format('%s has no registered hostmasks.', user.name) return format(_('%s has no registered hostmasks.'),
user.name)
try: try:
user = ircdb.users.getUser(msg.prefix) user = ircdb.users.getUser(msg.prefix)
if name: if name:
if name != user.name and \ if name != user.name and \
not ircdb.checkCapability(msg.prefix, 'owner'): not ircdb.checkCapability(msg.prefix, 'owner'):
irc.error('You may only retrieve your own hostmasks.', irc.error(_('You may only retrieve your own '
Raise=True) '(hostmasks.'), Raise=True)
else: else:
try: try:
user = ircdb.users.getUser(name) user = ircdb.users.getUser(name)
@ -279,6 +294,7 @@ class User(callbacks.Plugin):
irc.errorNotRegistered() irc.errorNotRegistered()
list = wrap(list, ['private', additional('something')]) list = wrap(list, ['private', additional('something')])
@internationalizeDocstring
def add(self, irc, msg, args, user, hostmask, password): def add(self, irc, msg, args, user, hostmask, password):
"""[<name>] [<hostmask>] [<password>] """[<name>] [<hostmask>] [<password>]
@ -294,18 +310,18 @@ class User(callbacks.Plugin):
if not hostmask: if not hostmask:
hostmask = msg.prefix hostmask = msg.prefix
if not ircutils.isUserHostmask(hostmask): if not ircutils.isUserHostmask(hostmask):
irc.errorInvalid('hostmask', hostmask, irc.errorInvalid(_('hostmask'), hostmask,
'Make sure your hostmask includes a nick, ' _('Make sure your hostmask includes a nick, '
'then an exclamation point (!), then a user, ' 'then an exclamation point (!), then a user, '
'then an at symbol (@), then a host. Feel ' 'then an at symbol (@), then a host. Feel '
'free to use wildcards (* and ?, which work ' 'free to use wildcards (* and ?, which work '
'just like they do on the command line) in ' 'just like they do on the command line) in '
'any of these parts.', 'any of these parts.'),
Raise=True) Raise=True)
try: try:
otherId = ircdb.users.getUserId(hostmask) otherId = ircdb.users.getUserId(hostmask)
if otherId != user.id: if otherId != user.id:
irc.error('That hostmask is already registered.', irc.error(_('That hostmask is already registered.'),
Raise=True) Raise=True)
except KeyError: except KeyError:
pass pass
@ -328,11 +344,13 @@ class User(callbacks.Plugin):
except ValueError, e: except ValueError, e:
irc.error(str(e), Raise=True) irc.error(str(e), Raise=True)
except ircdb.DuplicateHostmask: except ircdb.DuplicateHostmask:
irc.error('That hostmask is already registered.', Raise=True) irc.error(_('That hostmask is already registered.'),
Raise=True)
irc.replySuccess() irc.replySuccess()
add = wrap(add, ['private', first('otherUser', 'user'), add = wrap(add, ['private', first('otherUser', 'user'),
optional('something'), additional('something', '')]) optional('something'), additional('something', '')])
@internationalizeDocstring
def remove(self, irc, msg, args, user, hostmask, password): def remove(self, irc, msg, args, user, hostmask, password):
"""<name> <hostmask> [<password>] """<name> <hostmask> [<password>]
@ -353,17 +371,18 @@ class User(callbacks.Plugin):
s = '' s = ''
if hostmask == 'all': if hostmask == 'all':
user.hostmasks.clear() user.hostmasks.clear()
s = 'All hostmasks removed.' s = _('All hostmasks removed.')
else: else:
user.removeHostmask(hostmask) user.removeHostmask(hostmask)
except KeyError: except KeyError:
irc.error('There was no such hostmask.') irc.error(_('There was no such hostmask.'))
return return
ircdb.users.setUser(user) ircdb.users.setUser(user)
irc.replySuccess(s) irc.replySuccess(s)
remove = wrap(remove, ['private', 'otherUser', 'something', remove = wrap(remove, ['private', 'otherUser', 'something',
additional('something', '')]) additional('something', '')])
@internationalizeDocstring
def capabilities(self, irc, msg, args, user): def capabilities(self, irc, msg, args, user):
"""[<name>] """[<name>]
@ -383,6 +402,7 @@ class User(callbacks.Plugin):
Raise=True) Raise=True)
capabilities = wrap(capabilities, [first('otherUser', 'user')]) capabilities = wrap(capabilities, [first('otherUser', 'user')])
@internationalizeDocstring
def identify(self, irc, msg, args, user, password): def identify(self, irc, msg, args, user, password):
"""<name> <password> """<name> <password>
@ -396,14 +416,15 @@ class User(callbacks.Plugin):
ircdb.users.setUser(user, flush=False) ircdb.users.setUser(user, flush=False)
irc.replySuccess() irc.replySuccess()
except ValueError: except ValueError:
irc.error('Your secure flag is true and your hostmask ' irc.error(_('Your secure flag is true and your hostmask '
'doesn\'t match any of your known hostmasks.') 'doesn\'t match any of your known hostmasks.'))
else: else:
self.log.warning('Failed identification attempt by %s (password ' self.log.warning('Failed identification attempt by %s (password '
'did not match for %s).', msg.prefix, user.name) 'did not match for %s).', msg.prefix, user.name)
irc.error(conf.supybot.replies.incorrectAuthentication()) irc.error(conf.supybot.replies.incorrectAuthentication())
identify = wrap(identify, ['private', 'otherUser', 'something']) identify = wrap(identify, ['private', 'otherUser', 'something'])
@internationalizeDocstring
def unidentify(self, irc, msg, args, user): def unidentify(self, irc, msg, args, user):
"""takes no arguments """takes no arguments
@ -421,6 +442,7 @@ class User(callbacks.Plugin):
'recognized.') 'recognized.')
unidentify = wrap(unidentify, ['user']) unidentify = wrap(unidentify, ['user'])
@internationalizeDocstring
def whoami(self, irc, msg, args): def whoami(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -430,9 +452,10 @@ class User(callbacks.Plugin):
user = ircdb.users.getUser(msg.prefix) user = ircdb.users.getUser(msg.prefix)
irc.reply(user.name) irc.reply(user.name)
except KeyError: except KeyError:
irc.reply('I don\'t recognize you.') irc.reply(_('I don\'t recognize you.'))
whoami = wrap(whoami) whoami = wrap(whoami)
@internationalizeDocstring
def stats(self, irc, msg, args): def stats(self, irc, msg, args):
"""takes no arguments """takes no arguments
@ -452,9 +475,9 @@ class User(callbacks.Plugin):
admins += 1 admins += 1
except KeyError: except KeyError:
pass pass
irc.reply(format('I have %s registered users ' irc.reply(format(_('I have %s registered users '
'with %s registered hostmasks; ' 'with %s registered hostmasks; '
'%n and %n.', '%n and %n.'),
users, hostmasks, users, hostmasks,
(owners, 'owner'), (admins, 'admin'))) (owners, 'owner'), (admins, 'admin')))
stats = wrap(stats) stats = wrap(stats)