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
# generally means they can't mess with channel capabilities.
if ircutils.strEqual(capability, 'owner'):
irc.error(_('The "owner" capability can\'t be added in the'
irc.error(_('The "owner" capability can\'t be added in the '
'bot. Use the supybot-adduser program (or edit the '
'users.conf file yourself) to add an owner '
'capability.'))

View File

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

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

View File

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

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 *
import supybot.ircmsgs as ircmsgs
import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Anonymous')
@internationalizeDocstring
class Anonymous(callbacks.Plugin):
"""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
@ -73,6 +76,7 @@ class Anonymous(callbacks.Plugin):
action),
Raise=True)
@internationalizeDocstring
def say(self, irc, msg, args, target, text):
"""<channel|nick> <text>
@ -86,6 +90,7 @@ class Anonymous(callbacks.Plugin):
irc.noReply()
say = wrap(say, [first('nick', 'inChannel'), 'text'])
@internationalizeDocstring
def do(self, irc, msg, args, channel, text):
"""<channel> <action>

View File

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

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.schedule as schedule
import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('AutoMode')
class Continue(Exception):
pass # Used below, look in the "do" function nested in doJoin.

View File

@ -31,12 +31,15 @@ import time
import supybot.conf as conf
import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('BadWords')
def configure(advanced):
from supybot.questions import output, expect, anything, something, yn
conf.registerPlugin('BadWords', True)
if yn('Would you like to add some bad words?'):
words = anything('What words? (separate individual words by spaces)')
if yn(_('Would you like to add some bad words?')):
words = anything(_('What words? (separate individual words by '
'spaces)'))
conf.supybot.plugins.BadWords.words.set(words)
class LastModifiedSetOfStrings(registry.SpaceSeparatedSetOfStrings):
@ -47,14 +50,14 @@ class LastModifiedSetOfStrings(registry.SpaceSeparatedSetOfStrings):
BadWords = conf.registerPlugin('BadWords')
conf.registerGlobalValue(BadWords, 'words',
LastModifiedSetOfStrings([], """Determines what words are
considered to be 'bad' so the bot won't say them."""))
LastModifiedSetOfStrings([], _("""Determines what words are
considered to be 'bad' so the bot won't say them.""")))
conf.registerGlobalValue(BadWords,'requireWordBoundaries',
registry.Boolean(False, """Determines whether the bot will require bad
registry.Boolean(False, _("""Determines whether the bot will require bad
words to be independent words, or whether it will censor them within other
words. For instance, if 'darn' is a bad word, then if this is true, 'darn'
will be censored, but 'darnit' will not. You probably want this to be
false."""))
false.""")))
class String256(registry.String):
def __call__(self):
@ -65,39 +68,39 @@ class String256(registry.String):
return self.value
conf.registerGlobalValue(BadWords, 'nastyChars',
String256('!@#&', """Determines what characters will replace bad words; a
String256('!@#&', _("""Determines what characters will replace bad words; a
chunk of these characters matching the size of the replaced bad word will
be used to replace the bad words you've configured."""))
be used to replace the bad words you've configured.""")))
class ReplacementMethods(registry.OnlySomeStrings):
validStrings = ('simple', 'nastyCharacters')
conf.registerGlobalValue(BadWords, 'replaceMethod',
ReplacementMethods('nastyCharacters', """Determines the manner in which
ReplacementMethods('nastyCharacters', _("""Determines the manner in which
bad words will be replaced. 'nastyCharacters' (the default) will replace a
bad word with the same number of 'nasty characters' (like those used in
comic books; configurable by supybot.plugins.BadWords.nastyChars).
'simple' will replace a bad word with a simple strings (regardless of the
length of the bad word); this string is configurable via
supybot.plugins.BadWords.simpleReplacement."""))
supybot.plugins.BadWords.simpleReplacement.""")))
conf.registerGlobalValue(BadWords,'simpleReplacement',
registry.String('[CENSORED]', """Determines what word will replace bad
words if the replacement method is 'simple'."""))
registry.String('[CENSORED]', _("""Determines what word will replace bad
words if the replacement method is 'simple'.""")))
conf.registerGlobalValue(BadWords, 'stripFormatting',
registry.Boolean(True, """Determines whether the bot will strip
registry.Boolean(True, _("""Determines whether the bot will strip
formatting characters from messages before it checks them for bad words.
If this is False, it will be relatively trivial to circumvent this plugin's
filtering. If it's True, however, it will interact poorly with other
plugins that do coloring or bolding of text."""))
plugins that do coloring or bolding of text.""")))
conf.registerChannelValue(BadWords, 'kick',
registry.Boolean(False, """Determines whether the bot will kick people with
a warning when they use bad words."""))
registry.Boolean(False, _("""Determines whether the bot will kick people with
a warning when they use bad words.""")))
conf.registerChannelValue(BadWords.kick, 'message',
registry.NormalizedString("""You have been kicked for using a word
registry.NormalizedString(_("""You have been kicked for using a word
prohibited in the presence of this bot. Please use more appropriate
language in the future.""", """Determines the kick message used by the bot
when kicking users for saying bad words."""))
language in the future."""), _("""Determines the kick message used by the
bot when kicking users for saying bad words.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

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

View File

@ -30,6 +30,8 @@
import supybot.conf as conf
import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('ChannelLogger')
def configure(advanced):
# This will be called by supybot to configure this module. advanced is
@ -41,50 +43,50 @@ def configure(advanced):
ChannelLogger = conf.registerPlugin('ChannelLogger')
conf.registerChannelValue(ChannelLogger, 'enable',
registry.Boolean(True, """Determines whether logging is enabled."""))
registry.Boolean(True, _("""Determines whether logging is enabled.""")))
conf.registerGlobalValue(ChannelLogger, 'flushImmediately',
registry.Boolean(False, """Determines whether channel logfiles will be
registry.Boolean(False, _("""Determines whether channel logfiles will be
flushed anytime they're written to, rather than being buffered by the
operating system."""))
operating system.""")))
conf.registerChannelValue(ChannelLogger, 'stripFormatting',
registry.Boolean(True, """Determines whether formatting characters (such
as bolding, color, etc.) are removed when writing the logs to disk."""))
registry.Boolean(True, _("""Determines whether formatting characters (such
as bolding, color, etc.) are removed when writing the logs to disk.""")))
conf.registerChannelValue(ChannelLogger, 'timestamp',
registry.Boolean(True, """Determines whether the logs for this channel are
timestamped with the timestamp in supybot.log.timestampFormat."""))
registry.Boolean(True, _("""Determines whether the logs for this channel are
timestamped with the timestamp in supybot.log.timestampFormat.""")))
conf.registerChannelValue(ChannelLogger, 'noLogPrefix',
registry.String('[nolog]', """Determines what string a message should be
registry.String('[nolog]', _("""Determines what string a message should be
prefixed with in order not to be logged. If you don't want any such
prefix, just set it to the empty string."""))
prefix, just set it to the empty string.""")))
conf.registerChannelValue(ChannelLogger, 'rotateLogs',
registry.Boolean(False, """Determines whether the bot will automatically
registry.Boolean(False, _("""Determines whether the bot will automatically
rotate the logs for this channel. The bot will rotate logs when the
timestamp for the log changes. The timestamp is set according to
the 'filenameTimestamp' configuration variable."""))
the 'filenameTimestamp' configuration variable.""")))
conf.registerChannelValue(ChannelLogger, 'filenameTimestamp',
registry.String('%Y-%m-%d', """Determines how to represent the timestamp
registry.String('%Y-%m-%d', _("""Determines how to represent the timestamp
used for the filename in rotated logs. When this timestamp changes, the
old logfiles will be closed and a new one started. The format characters
for the timestamp are in the time.strftime docs at python.org. In order
for your logs to be rotated, you'll also have to enable
supybot.plugins.ChannelLogger.rotateLogs."""))
supybot.plugins.ChannelLogger.rotateLogs.""")))
conf.registerGlobalValue(ChannelLogger, 'directories',
registry.Boolean(True, """Determines whether the bot will partition its
channel logs into separate directories based on different criteria."""))
registry.Boolean(True, _("""Determines whether the bot will partition its
channel logs into separate directories based on different criteria.""")))
conf.registerGlobalValue(ChannelLogger.directories, 'network',
registry.Boolean(True, """Determines whether the bot will use a network
directory if using directories."""))
registry.Boolean(True, _("""Determines whether the bot will use a network
directory if using directories.""")))
conf.registerGlobalValue(ChannelLogger.directories, 'channel',
registry.Boolean(True, """Determines whether the bot will use a channel
directory if using directories."""))
registry.Boolean(True, _("""Determines whether the bot will use a channel
directory if using directories.""")))
conf.registerGlobalValue(ChannelLogger.directories, 'timestamp',
registry.Boolean(False, """Determines whether the bot will use a timestamp
registry.Boolean(False, _("""Determines whether the bot will use a timestamp
(determined by supybot.plugins.ChannelLogger.directories.timestamp.format)
if using directories."""))
if using directories.""")))
conf.registerGlobalValue(ChannelLogger.directories.timestamp, 'format',
registry.String('%B', """Determines what timestamp format will be used in
registry.String('%B', _("""Determines what timestamp format will be used in
the directory stucture for channel logs if
supybot.plugins.ChannelLogger.directories.timestamp is True."""))
supybot.plugins.ChannelLogger.directories.timestamp is True.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

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.registry as registry
import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('ChannelLogger')
class FakeLog(object):
def flush(self):

View File

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

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

View File

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

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

View File

@ -29,22 +29,24 @@
import supybot.conf as conf
import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Dict')
def configure(advanced):
from supybot.questions import output, expect, anything, something, yn
conf.registerPlugin('Dict', True)
output('The default dictd server is dict.org.')
if yn('Would you like to specify a different dictd server?'):
output(_('The default dictd server is dict.org.'))
if yn(_('Would you like to specify a different dictd server?')):
server = something('What server?')
conf.supybot.plugins.Dict.server.set(server)
Dict = conf.registerPlugin('Dict')
conf.registerGlobalValue(Dict, 'server',
registry.String('dict.org', """Determines what server the bot will
retrieve definitions from."""))
registry.String('dict.org', _("""Determines what server the bot will
retrieve definitions from.""")))
conf.registerChannelValue(Dict, 'default',
registry.String('', """Determines the default dictionary the bot will
registry.String('', _("""Determines the default dictionary the bot will
ask for definitions in. If this value is '*' (without the quotes) the bot
will use all dictionaries to define words."""))
will use all dictionaries to define words.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

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

View File

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

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 *
import supybot.plugins as plugins
import supybot.ircutils as ircutils
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Dunno')
@internationalizeDocstring
class Dunno(plugins.ChannelIdDatabasePlugin):
"""This plugin was written initially to work with MoobotFactoids, the two
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.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Factoids')
def configure(advanced):
# This will be called by supybot to configure this module. advanced is
@ -46,22 +48,22 @@ class FactoidFormat(registry.TemplatedString):
Factoids = conf.registerPlugin('Factoids')
conf.registerChannelValue(Factoids, 'learnSeparator',
registry.String('as', """Determines what separator must be used in the
registry.String('as', _("""Determines what separator must be used in the
learn command. Defaults to 'as' -- learn <key> as <value>. Users might
feel more comfortable with 'is' or something else, so it's
configurable."""))
configurable.""")))
conf.registerChannelValue(Factoids, 'showFactoidIfOnlyOneMatch',
registry.Boolean(True, """Determines whether the bot will reply with the
registry.Boolean(True, _("""Determines whether the bot will reply with the
single matching factoid if only one factoid matches when using the search
command."""))
command.""")))
conf.registerChannelValue(Factoids, 'replyWhenInvalidCommand',
registry.Boolean(True, """Determines whether the bot will reply to invalid
registry.Boolean(True, _("""Determines whether the bot will reply to invalid
commands by searching for a factoid; basically making the whatis
unnecessary when you want all factoids for a given key."""))
unnecessary when you want all factoids for a given key.""")))
conf.registerChannelValue(Factoids, 'format',
FactoidFormat('$key could be $value.', """Determines the format of
FactoidFormat('$key could be $value.', _("""Determines the format of
the response given when a factoid's value is requested. All the standard
substitutes apply, in addition to "$key" for the factoid's key and "$value"
for the factoid's value."""))
for the factoid's value.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

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

View File

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

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

View File

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

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

View File

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

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

View File

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

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

View File

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

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

View File

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

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

View File

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

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

View File

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

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

View File

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

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.ircutils as ircutils
import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Later')
@internationalizeDocstring
class Later(callbacks.Plugin):
"""Used to do things later; currently, it only allows the sending of
nick-based notes. Do note (haha!) that these notes are *not* private
@ -81,7 +84,7 @@ class Later(callbacks.Plugin):
try:
return utils.timeElapsed(diff, seconds=False) + ' ago'
except ValueError:
return 'just now'
return _('just now')
def _addNote(self, nick, whence, text, at=None, maximum=None):
if at is None:
@ -100,6 +103,7 @@ class Later(callbacks.Plugin):
self.wildcards.append(nick)
self._flushNotes()
@internationalizeDocstring
def tell(self, irc, msg, args, nick, text):
"""<nick> <text>
@ -108,15 +112,16 @@ class Later(callbacks.Plugin):
given the note.
"""
if ircutils.strEqual(nick, irc.nick):
irc.error('I can\'t send notes to myself.')
irc.error(_('I can\'t send notes to myself.'))
return
try:
self._addNote(nick, msg.nick, text)
irc.replySuccess()
except ValueError:
irc.error('That person\'s message queue is already full.')
irc.error(_('That person\'s message queue is already full.'))
tell = wrap(tell, ['something', 'text'])
@internationalizeDocstring
def notes(self, irc, msg, args, nick):
"""[<nick>]
@ -129,17 +134,18 @@ class Later(callbacks.Plugin):
for (when, whence, note) in self._notes[nick]]
irc.reply(format('%L', notes))
else:
irc.error('I have no notes for that nick.')
irc.error(_('I have no notes for that nick.'))
else:
nicks = self._notes.keys()
if nicks:
utils.sortBy(ircutils.toLower, nicks)
irc.reply(format('I currently have notes waiting for %L.',
irc.reply(format(_('I currently have notes waiting for %L.'),
nicks))
else:
irc.error('I have no notes waiting to be delivered.')
irc.error(_('I have no notes waiting to be delivered.'))
notes = wrap(notes, [additional('something')])
@internationalizeDocstring
def remove(self, irc, msg, args, nick):
"""<nick>
@ -150,7 +156,7 @@ class Later(callbacks.Plugin):
self._flushNotes()
irc.replySuccess()
except KeyError:
irc.error('There were no notes for %r' % nick)
irc.error(_('There were no notes for %r') % nick)
remove = wrap(remove, [('checkCapability', 'admin'), 'something'])
def doPrivmsg(self, irc, msg):
@ -174,7 +180,7 @@ class Later(callbacks.Plugin):
self._flushNotes()
def _formatNote(self, when, whence, note):
return 'Sent %s: <%s> %s' % (self._timestamp(when), whence, note)
return _('Sent %s: <%s> %s') % (self._timestamp(when), whence, note)

View File

@ -29,6 +29,8 @@
import supybot.conf as conf
import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Limiter')
def configure(advanced):
# This will be called by supybot to configure this module. advanced is
@ -41,17 +43,17 @@ def configure(advanced):
Limiter = conf.registerPlugin('Limiter')
conf.registerChannelValue(Limiter, 'enable',
registry.Boolean(False, """Determines whether the bot will maintain the
registry.Boolean(False, _("""Determines whether the bot will maintain the
channel limit to be slightly above the current number of people in the
channel, in order to make clone/drone attacks harder."""))
channel, in order to make clone/drone attacks harder.""")))
conf.registerChannelValue(Limiter, 'minimumExcess',
registry.PositiveInteger(5, """Determines the minimum number of free
registry.PositiveInteger(5, _("""Determines the minimum number of free
spots that will be saved when limits are being enforced. This should
always be smaller than supybot.plugins.Limiter.limit.maximumExcess."""))
always be smaller than supybot.plugins.Limiter.limit.maximumExcess.""")))
conf.registerChannelValue(Limiter, 'maximumExcess',
registry.PositiveInteger(10, """Determines the maximum number of free spots
registry.PositiveInteger(10, _("""Determines the maximum number of free spots
that will be saved when limits are being enforced. This should always be
larger than supybot.plugins.Limiter.limit.minimumExcess."""))
larger than supybot.plugins.Limiter.limit.minimumExcess.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

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.ircutils as ircutils
import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Limiter')
@internationalizeDocstring
class Limiter(callbacks.Plugin):
"""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

View File

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

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

View File

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

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

View File

@ -29,6 +29,8 @@
import supybot.conf as conf
import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('MoobotFactoids')
def configure(advanced):
# This will be called by supybot to configure this module. advanced is
@ -41,12 +43,12 @@ def configure(advanced):
MoobotFactoids = conf.registerPlugin('MoobotFactoids')
conf.registerChannelValue(MoobotFactoids,
'showFactoidIfOnlyOneMatch', registry.Boolean(True, """Determines whether
'showFactoidIfOnlyOneMatch', registry.Boolean(True, _("""Determines whether
or not the factoid value will be shown when a listkeys search returns only
one factoid key."""))
one factoid key.""")))
conf.registerChannelValue(MoobotFactoids,
'mostCount', registry.Integer(10, """Determines how many items are shown
when the 'most' command is called."""))
'mostCount', registry.Integer(10, _("""Determines how many items are shown
when the 'most' command is called.""")))
# vim:set shiftwidth=4 softtabstop=8 expandtab textwidth=78

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

View File

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

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

View File

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

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

View File

@ -29,6 +29,8 @@
import supybot.conf as conf
import supybot.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('NickCapture')
def configure(advanced):
# This will be called by supybot to configure this module. advanced is
@ -42,11 +44,11 @@ def configure(advanced):
NickCapture = conf.registerPlugin('NickCapture')
conf.registerPlugin('NickCapture')
conf.registerGlobalValue(NickCapture, 'ison',
registry.Boolean(True, """Determines whether the bot will check
occasionally if its preferred nick is in use via the ISON command."""))
registry.Boolean(True, _("""Determines whether the bot will check
occasionally if its preferred nick is in use via the ISON command.""")))
conf.registerGlobalValue(NickCapture.ison, 'period',
registry.PositiveInteger(600, """Determines how often (in seconds) the bot
will check whether its nick ISON."""))
registry.PositiveInteger(600, _("""Determines how often (in seconds) the bot
will check whether its nick ISON.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

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.ircutils as ircutils
import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('NickCapture')
@internationalizeDocstring
class NickCapture(callbacks.Plugin):
"""This module constantly tries to take whatever nick is configured as
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.registry as registry
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Nickometer')
def configure(advanced):
# This will be called by setup.py to configure this module. Advanced is
@ -42,7 +44,7 @@ def configure(advanced):
Nickometer = conf.registerPlugin('Nickometer')
# This is where your configuration variables (if any) should go. For example:
# conf.registerGlobalValue(Nickometer, 'someConfigVariableName',
# registry.Boolean(False, """Help for someConfigVariableName."""))
# registry.Boolean(False, _("""Help for someConfigVariableName.""")))
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

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

View File

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

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

View File

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

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 *
import supybot.plugins as plugins
import supybot.ircutils as ircutils
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Praise')
@internationalizeDocstring
class Praise(plugins.ChannelIdDatabasePlugin):
"""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
@ -48,8 +51,9 @@ class Praise(plugins.ChannelIdDatabasePlugin):
def addValidator(self, irc, text):
if '$who' not in text:
irc.error('Praises must contain $who.', Raise=True)
irc.error(_('Praises must contain $who.'), Raise=True)
@internationalizeDocstring
def praise(self, irc, msg, args, channel, id, text):
"""[<channel>] [<id>] <who|what> [for <reason>]
@ -67,20 +71,20 @@ class Praise(plugins.ChannelIdDatabasePlugin):
try:
praise = self.db.get(channel, id)
except KeyError:
irc.error(format('There is no praise with id #%i.', id))
irc.error(format(_('There is no praise with id #%i.'), id))
return
else:
praise = self.db.random(channel)
if not praise:
irc.error(format('There are no praises in my database ' \
'for %s.', channel))
irc.error(format(_('There are no praises in my database ' \
'for %s.'), channel))
return
text = self._replaceFirstPerson(praise.text, msg.nick)
reason = self._replaceFirstPerson(reason, msg.nick)
target = self._replaceFirstPerson(target, msg.nick)
text = text.replace('$who', target)
if reason:
text += ' for ' + reason
text += _(' for ') + reason
if self.registryValue('showIds', channel):
text += format(' (#%i)', praise.id)
irc.reply(text, action=True)

View File

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

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.ircutils as ircutils
import supybot.callbacks as callbacks
from supybot.i18n import PluginInternationalization, internationalizeDocstring
_ = PluginInternationalization('Protector')
class Protector(callbacks.Plugin):
def isImmune(self, irc, msg):

View File

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

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

View File

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

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

View File

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