summaryrefslogtreecommitdiff
path: root/modules/extra
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-02-04 15:30:31 -0500
committerAdam <Adam@anope.org>2011-02-04 15:30:31 -0500
commit08583dc107974252312fb7c87532c9deb68e7f63 (patch)
tree0c42ec7422752cabd8352b49be976b4dc100c56c /modules/extra
parentc362a1e077d5ede9eadbe79483f2a755b5883e9a (diff)
Moved the language strings which are only used once
out of the core and into the modules that use them.
Diffstat (limited to 'modules/extra')
-rw-r--r--modules/extra/cs_appendtopic.cpp4
-rw-r--r--modules/extra/cs_enforce.cpp8
-rw-r--r--modules/extra/cs_entrymsg.cpp50
-rw-r--r--modules/extra/cs_set_misc.cpp8
-rw-r--r--modules/extra/cs_tban.cpp10
-rw-r--r--modules/extra/db_mysql.cpp10
-rw-r--r--modules/extra/db_mysql_live.cpp2
-rw-r--r--modules/extra/hs_request.cpp20
-rw-r--r--modules/extra/language/CMakeLists.txt38
-rw-r--r--modules/extra/language/cs_appendtopic.de_DE.po37
-rw-r--r--modules/extra/language/cs_appendtopic.it_IT.po38
-rw-r--r--modules/extra/language/cs_appendtopic.nl_NL.po37
-rw-r--r--modules/extra/language/cs_appendtopic.pot32
-rw-r--r--modules/extra/language/cs_appendtopic.pt_PT.po35
-rw-r--r--modules/extra/language/cs_appendtopic.ru_RU.po40
-rw-r--r--modules/extra/language/cs_enforce.de_DE.po85
-rw-r--r--modules/extra/language/cs_enforce.it_IT.po85
-rw-r--r--modules/extra/language/cs_enforce.nl_NL.po88
-rw-r--r--modules/extra/language/cs_enforce.pot64
-rw-r--r--modules/extra/language/cs_enforce.pt_PT.po87
-rw-r--r--modules/extra/language/cs_enforce.ru_RU.po89
-rw-r--r--modules/extra/language/cs_entrymsg.pot71
-rw-r--r--modules/extra/language/cs_tban.de_DE.po39
-rw-r--r--modules/extra/language/cs_tban.it_IT.po40
-rw-r--r--modules/extra/language/cs_tban.nl_NL.po40
-rw-r--r--modules/extra/language/cs_tban.pot36
-rw-r--r--modules/extra/language/cs_tban.pt_PT.po39
-rw-r--r--modules/extra/language/cs_tban.ru_RU.po41
-rw-r--r--modules/extra/language/db_mysql.pot34
-rw-r--r--modules/extra/language/hs_request.it_IT.po135
-rw-r--r--modules/extra/language/hs_request.nl_NL.po136
-rw-r--r--modules/extra/language/hs_request.pot126
-rw-r--r--modules/extra/language/hs_request.pt_PT.po134
-rw-r--r--modules/extra/language/hs_request.ru_RU.po137
-rw-r--r--modules/extra/language/ns_maxemail.de_DE.po28
-rw-r--r--modules/extra/language/ns_maxemail.it_IT.po32
-rw-r--r--modules/extra/language/ns_maxemail.nl_NL.po28
-rw-r--r--modules/extra/language/ns_maxemail.pot26
-rw-r--r--modules/extra/language/ns_maxemail.pt_PT.po28
-rw-r--r--modules/extra/language/ns_maxemail.ru_RU.po30
-rwxr-xr-xmodules/extra/language/update.sh14
-rw-r--r--modules/extra/ns_set_misc.cpp8
42 files changed, 2012 insertions, 57 deletions
diff --git a/modules/extra/cs_appendtopic.cpp b/modules/extra/cs_appendtopic.cpp
index 8124aa535..c8c641876 100644
--- a/modules/extra/cs_appendtopic.cpp
+++ b/modules/extra/cs_appendtopic.cpp
@@ -59,9 +59,9 @@ class CommandCSAppendTopic : public Command
Channel *c = ci->c;
if (!c)
- u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, ci->name.c_str());
+ u->SendMessage(ChanServ, LanguageString::CHAN_X_NOT_IN_USE, ci->name.c_str());
else if (!check_access(u, ci, CA_TOPIC))
- u->SendMessage(ChanServ, ACCESS_DENIED);
+ u->SendMessage(ChanServ, LanguageString::ACCESS_DENIED);
else
{
Anope::string topic;
diff --git a/modules/extra/cs_enforce.cpp b/modules/extra/cs_enforce.cpp
index 568d0b17f..c5a2ee590 100644
--- a/modules/extra/cs_enforce.cpp
+++ b/modules/extra/cs_enforce.cpp
@@ -89,7 +89,7 @@ class CommandCSEnforce : public Command
if (check_access(uc->user, ci, CA_NOJOIN))
{
get_idealban(ci, uc->user, mask);
- Anope::string reason = GetString(uc->user, CHAN_NOT_ALLOWED_TO_JOIN);
+ Anope::string reason = GetString(uc->user->Account(), LanguageString::CHAN_NOT_ALLOWED_TO_JOIN);
c->SetMode(NULL, CMODE_BAN, mask);
c->Kick(NULL, uc->user, "%s", reason.c_str());
}
@@ -113,7 +113,7 @@ class CommandCSEnforce : public Command
if (!uc->user->IsIdentified())
{
get_idealban(ci, uc->user, mask);
- Anope::string reason = GetString(uc->user, CHAN_NOT_ALLOWED_TO_JOIN);
+ Anope::string reason = GetString(uc->user->Account(), LanguageString::CHAN_NOT_ALLOWED_TO_JOIN);
if (!c->HasMode(CMODE_REGISTERED))
c->SetMode(NULL, CMODE_BAN, mask);
c->Kick(NULL, uc->user, "%s", reason.c_str());
@@ -134,9 +134,9 @@ class CommandCSEnforce : public Command
Channel *c = ci->c;
if (!c)
- u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, ci->name.c_str());
+ u->SendMessage(ChanServ, LanguageString::CHAN_X_NOT_IN_USE, ci->name.c_str());
else if (!check_access(u, ci, CA_AKICK))
- u->SendMessage(ChanServ, ACCESS_DENIED);
+ u->SendMessage(ChanServ, LanguageString::ACCESS_DENIED);
else
{
if (what.empty() || what.equals_ci("SET"))
diff --git a/modules/extra/cs_entrymsg.cpp b/modules/extra/cs_entrymsg.cpp
index 3edeef84c..b32937847 100644
--- a/modules/extra/cs_entrymsg.cpp
+++ b/modules/extra/cs_entrymsg.cpp
@@ -33,40 +33,40 @@ unsigned EntryMsg::MaxEntries = 0;
class CommandEntryMessage : public Command
{
private:
- void DoList(User *u, ChannelInfo *ci)
+ void DoList(CommandSource &source, ChannelInfo *ci)
{
std::vector<EntryMsg> messages;
if (ci->GetExtRegular("cs_entrymsg", messages))
{
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_LIST_HEADER, ci->name.c_str());
+ source.Reply(_("Entry message list for \2%s\2:"), ci->name.c_str());
for (unsigned i = 0; i < messages.size(); ++i)
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_LIST_ENTRY, i + 1, messages[i].message.c_str(), messages[i].creator.c_str(), do_strftime(messages[i].when).c_str());
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_LIST_END);
+ source.Reply(LanguageString::CHAN_LIST_ENTRY, i + 1, messages[i].message.c_str(), messages[i].creator.c_str(), do_strftime(messages[i].when).c_str());
+ source.Reply(_("End of entry message list."));
}
else
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_LIST_EMPTY, ci->name.c_str());
+ source.Reply(_("Entry message list for \2%s\2 is empty."), ci->name.c_str());
}
- void DoAdd(User *u, ChannelInfo *ci, const Anope::string &message)
+ void DoAdd(CommandSource &source, ChannelInfo *ci, const Anope::string &message)
{
std::vector<EntryMsg> messages;
ci->GetExtRegular("cs_entrymsg", messages);
if (EntryMsg::MaxEntries && messages.size() >= EntryMsg::MaxEntries)
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_LIST_FULL, ci->name.c_str());
+ source.Reply(_("The entry message list for \2%s\2 is full."), ci->name.c_str());
else
{
- messages.push_back(EntryMsg(u->nick, message));
+ messages.push_back(EntryMsg(source.u->nick, message));
ci->Extend("cs_entrymsg", new ExtensibleItemRegular<std::vector<EntryMsg> >(messages));
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_ADDED, ci->name.c_str());
+ source.Reply(_("Entry message added to \2%s\2"), ci->name.c_str());
}
}
- void DoDel(User *u, ChannelInfo *ci, const Anope::string &message)
+ void DoDel(CommandSource &source, ChannelInfo *ci, const Anope::string &message)
{
std::vector<EntryMsg> messages;
if (!message.is_pos_number_only())
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_NOT_FOUND, message.c_str(), ci->name.c_str());
+ source.Reply(("Entry message \002%s\002 not found on channel \002%s\002."), message.c_str(), ci->name.c_str());
else if (ci->GetExtRegular("cs_entrymsg", messages))
{
unsigned i = convertTo<unsigned>(message);
@@ -74,19 +74,19 @@ class CommandEntryMessage : public Command
{
messages.erase(messages.begin() + i - 1);
ci->Extend("cs_entrymsg", new ExtensibleItemRegular<std::vector<EntryMsg> >(messages));
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_DELETED, i, ci->name.c_str());
+ source.Reply(_("Entry message \2%i\2 for \2%s\2 deleted."), i, ci->name.c_str());
}
else
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_NOT_FOUND, message.c_str(), ci->name.c_str());
+ source.Reply(_("Entry message \2%s\2 not found on channel \2%s\2."), message.c_str(), ci->name.c_str());
}
else
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_LIST_EMPTY, ci->name.c_str());
+ source.Reply(_("Entry message list for \2%s\2 is empty."), ci->name.c_str());
}
- void DoClear(User *u, ChannelInfo *ci)
+ void DoClear(CommandSource &source, ChannelInfo *ci)
{
ci->Shrink("cs_entrymsg");
- u->SendMessage(ChanServ, CHAN_ENTRYMSG_CLEARED, ci->name.c_str());
+ source.Reply(_("Entry messages for \2%s\2 have been cleared."), ci->name.c_str());
}
public:
@@ -103,18 +103,18 @@ class CommandEntryMessage : public Command
{
bool success = true;
if (params[1].equals_ci("LIST"))
- this->DoList(u, ci);
+ this->DoList(source, ci);
else if (params[1].equals_ci("CLEAR"))
- this->DoClear(u, ci);
+ this->DoClear(source, ci);
else if (params.size() < 3)
{
success = false;
this->OnSyntaxError(source, "");
}
else if (params[1].equals_ci("ADD"))
- this->DoAdd(u, ci, params[2]);
+ this->DoAdd(source, ci, params[2]);
else if (params[1].equals_ci("DEL"))
- this->DoDel(u, ci, params[2]);
+ this->DoDel(source, ci, params[2]);
else
{
success = false;
@@ -125,7 +125,7 @@ class CommandEntryMessage : public Command
}
else
{
- u->SendMessage(ChanServ, ACCESS_DENIED);
+ u->SendMessage(ChanServ, LanguageString::ACCESS_DENIED);
}
return MOD_CONT;
@@ -133,18 +133,20 @@ class CommandEntryMessage : public Command
void OnSyntaxError(CommandSource &source, const Anope::string &)
{
- SyntaxError(source, "ENTRYMSG", CHAN_ENTRYMSG_SYNTAX);
+ SyntaxError(source, "ENTRYMSG", _("ENTRYMSG \037channel\037 {ADD|DEL|LIST|CLEAR} [\037message\037|\037num\037]"));
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
{
- source.Reply(CHAN_HELP_ENTRYMSG);
+ source.Reply(_("Syntax: \002ENTRYMSG \037channel\037 {ADD|DEL|LIST|CLEAR} [\037message\037|\037num\037]\002\n"
+ " \n"
+ "Controls what messages will be sent to users when they join the channel."));
return true;
}
void OnServHelp(CommandSource &source)
{
- source.Reply(CHAN_HELP_CMD_ENTRYMSG);
+ source.Reply(_(" ENTRYMSG Manage the channel's entrymsgs"));
}
};
diff --git a/modules/extra/cs_set_misc.cpp b/modules/extra/cs_set_misc.cpp
index 1a21b66d5..e91f32860 100644
--- a/modules/extra/cs_set_misc.cpp
+++ b/modules/extra/cs_set_misc.cpp
@@ -31,17 +31,17 @@ class CommandCSSetMisc : public Command
if (params.size() > 1)
{
ci->Extend("chanserv:" + this->name, new ExtensibleItemRegular<Anope::string>(params[1]));
- u->SendMessage(ChanServ, CHAN_SETTING_CHANGED, this->name.c_str(), ci->name.c_str(), params[1].c_str());
+ u->SendMessage(ChanServ, LanguageString::CHAN_SETTING_CHANGED, this->name.c_str(), ci->name.c_str(), params[1].c_str());
}
else
- u->SendMessage(ChanServ, CHAN_SETTING_UNSET, this->name.c_str(), ci->name.c_str());
+ u->SendMessage(ChanServ, LanguageString::CHAN_SETTING_UNSET, this->name.c_str(), ci->name.c_str());
return MOD_CONT;
}
void OnSyntaxError(CommandSource &source, const Anope::string &)
{
- SyntaxError(source, "SET", CHAN_SET_SYNTAX);
+ SyntaxError(source, "SET", LanguageString::CHAN_SET_SYNTAX);
}
void OnServHelp(CommandSource &source)
@@ -59,7 +59,7 @@ class CommandCSSASetMisc : public CommandCSSetMisc
void OnSyntaxError(CommandSource &source, const Anope::string &)
{
- SyntaxError(source, "SASET", CHAN_SASET_SYNTAX);
+ SyntaxError(source, "SASET", LanguageString::CHAN_SASET_SYNTAX);
}
};
diff --git a/modules/extra/cs_tban.cpp b/modules/extra/cs_tban.cpp
index 35757ff1e..6e54da6be 100644
--- a/modules/extra/cs_tban.cpp
+++ b/modules/extra/cs_tban.cpp
@@ -40,11 +40,11 @@ static bool CanBanUser(Channel *c, User *u, User *u2)
ChannelInfo *ci = c->ci;
bool ok = false;
if (!check_access(u, ci, CA_BAN))
- u->SendMessage(ChanServ, ACCESS_DENIED);
+ u->SendMessage(ChanServ, LanguageString::ACCESS_DENIED);
else if (matches_list(c, u2, CMODE_EXCEPT))
- u->SendMessage(ChanServ, CHAN_EXCEPTED, u2->nick.c_str(), ci->name.c_str());
+ u->SendMessage(ChanServ, LanguageString::CHAN_EXCEPTED, u2->nick.c_str(), ci->name.c_str());
else if (u2->IsProtected())
- u->SendMessage(ChanServ, ACCESS_DENIED);
+ u->SendMessage(ChanServ, LanguageString::ACCESS_DENIED);
else
ok = true;
@@ -70,9 +70,9 @@ class CommandCSTBan : public Command
User *u2;
if (!c)
- u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, chan.c_str());
+ u->SendMessage(ChanServ, LanguageString::CHAN_X_NOT_IN_USE, chan.c_str());
else if (!(u2 = finduser(nick)))
- u->SendMessage(ChanServ, NICK_X_NOT_IN_USE, nick.c_str());
+ u->SendMessage(ChanServ, LanguageString::NICK_X_NOT_IN_USE, nick.c_str());
else
if (CanBanUser(c, u, u2))
{
diff --git a/modules/extra/db_mysql.cpp b/modules/extra/db_mysql.cpp
index 180b66463..03515d239 100644
--- a/modules/extra/db_mysql.cpp
+++ b/modules/extra/db_mysql.cpp
@@ -129,13 +129,17 @@ class CommandSQLSync : public Command
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
{
- source.Reply(OPER_HELP_SYNC);
+ source.Reply(_("Syntax: \002SQLSYNC\002\n"
+ " \n"
+ "This command syncs your databases with SQL. You should\n"
+ "only have to execute this command once, when you initially\n"
+ "import your databases into SQL."));
return true;
}
void OnServHelp(CommandSource &source)
{
- source.Reply(OPER_HELP_CMD_SQLSYNC);
+ source.Reply(_(" SQLSYNC Import your databases to SQL"));
}
};
@@ -1393,7 +1397,7 @@ CommandReturn CommandSQLSync::Execute(CommandSource &source, const std::vector<A
{
User *u = source.u;
SaveDatabases();
- u->SendMessage(OperServ, OPER_SYNC_UPDATED);
+ u->SendMessage(OperServ, _("Updating MySQL."));
return MOD_CONT;
}
diff --git a/modules/extra/db_mysql_live.cpp b/modules/extra/db_mysql_live.cpp
index bf5a1e6f7..55e891623 100644
--- a/modules/extra/db_mysql_live.cpp
+++ b/modules/extra/db_mysql_live.cpp
@@ -42,7 +42,7 @@ class CommandMutex : public Thread
if (!command->permission.empty() && !u->Account()->HasCommand(command->permission))
{
- u->SendMessage(bi, ACCESS_DENIED);
+ u->SendMessage(bi, LanguageString::ACCESS_DENIED);
Log(LOG_COMMAND, "denied", bi) << "Access denied for user " << u->GetMask() << " with command " << command;
}
else
diff --git a/modules/extra/hs_request.cpp b/modules/extra/hs_request.cpp
index 6f9111b5e..3a1237328 100644
--- a/modules/extra/hs_request.cpp
+++ b/modules/extra/hs_request.cpp
@@ -67,19 +67,19 @@ class CommandHSRequest : public Command
}
if (vIdent.length() > Config->UserLen)
{
- source.Reply(HOST_SET_IDENTTOOLONG, Config->UserLen);
+ source.Reply(LanguageString::HOST_SET_IDENTTOOLONG, Config->UserLen);
return MOD_CONT;
}
else
for (Anope::string::iterator s = vIdent.begin(), s_end = vIdent.end(); s != s_end; ++s)
if (!isvalidchar(*s))
{
- source.Reply(HOST_SET_IDENT_ERROR);
+ source.Reply(LanguageString::HOST_SET_IDENT_ERROR);
return MOD_CONT;
}
if (!ircd->vident)
{
- source.Reply(HOST_NO_VIDENT);
+ source.Reply(LanguageString::HOST_NO_VIDENT);
return MOD_CONT;
}
}
@@ -87,13 +87,13 @@ class CommandHSRequest : public Command
hostmask = rawhostmask;
else
{
- source.Reply(HOST_SET_TOOLONG, Config->HostLen);
+ source.Reply(LanguageString::HOST_SET_TOOLONG, Config->HostLen);
return MOD_CONT;
}
if (!isValidHost(hostmask, 3))
{
- source.Reply(HOST_SET_ERROR);
+ source.Reply(LanguageString::HOST_SET_ERROR);
return MOD_CONT;
}
@@ -167,7 +167,7 @@ class CommandHSActivate : public Command
me->SendMessage(source, _("No request for nick %s found."), nick.c_str());
}
else
- u->SendMessage(HostServ, NICK_X_NOT_REGISTERED, nick.c_str());
+ u->SendMessage(HostServ, LanguageString::NICK_X_NOT_REGISTERED, nick.c_str());
return MOD_CONT;
}
@@ -222,7 +222,7 @@ class CommandHSReject : public Command
if (!reason.empty())
snprintf(message, sizeof(message), _("[auto memo] Your requested vHost has been rejected. Reason: %s"), reason.c_str());
else
- snprintf(message, sizeof(message), _("[auto memo] Your requested vHost has been rejected."));
+ snprintf(message, sizeof(message), "%s", _("[auto memo] Your requested vHost has been rejected."));
memo_send(source, nick, message, 2);
}
@@ -269,13 +269,13 @@ class HSListBase : public Command
{
++display_counter;
if (!hr->ident.empty())
- u->SendMessage(HostServ, HOST_IDENT_ENTRY, counter, it->first.c_str(), hr->ident.c_str(), hr->host.c_str(), it->first.c_str(), do_strftime(hr->time).c_str());
+ u->SendMessage(HostServ, _("#%d Nick:\002%s\002, vhost:\002%s\002@\002%s\002 (%s - %s)"), counter, it->first.c_str(), hr->ident.c_str(), hr->host.c_str(), it->first.c_str(), do_strftime(hr->time).c_str());
else
- u->SendMessage(HostServ, HOST_ENTRY, counter, it->first.c_str(), hr->host.c_str(), it->first.c_str(), do_strftime(hr->time).c_str());
+ u->SendMessage(HostServ, _("#%d Nick:\002%s\002, vhost:\002%s\002 (%s - %s)"), counter, it->first.c_str(), hr->host.c_str(), it->first.c_str(), do_strftime(hr->time).c_str());
}
++counter;
}
- u->SendMessage(HostServ, HOST_LIST_FOOTER, display_counter);
+ u->SendMessage(HostServ, _("Displayed all records (Count: \002%d\002)"), display_counter);
return MOD_CONT;
}
diff --git a/modules/extra/language/CMakeLists.txt b/modules/extra/language/CMakeLists.txt
new file mode 100644
index 000000000..af4dd90a6
--- /dev/null
+++ b/modules/extra/language/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Only do this if gettext is installed
+if(GETTEXT_FOUND)
+ # Get all of the .po files
+ file(GLOB LANG_SRCS_PO RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.*.po")
+ sort_list(LANG_SRCS_PO)
+
+ foreach(LANG_PO ${LANG_SRCS_PO})
+ # Get the domain for this language file
+ string(LENGTH ${LANG_PO} LANG_PO_LENGTH)
+ math(EXPR DOMAIN_LENGTH "${LANG_PO_LENGTH} - 9")
+ string(SUBSTRING ${LANG_PO} 0 ${DOMAIN_LENGTH} LANG_DOMAIN)
+
+ # Get the language for this language file
+ math(EXPR DOMAIN_LENGTH "${LANG_PO_LENGTH} - 8")
+ string(SUBSTRING ${LANG_PO} ${DOMAIN_LENGTH} 5 LANG_LANG)
+
+ # Get the .mo file name
+ string(REGEX REPLACE "\\.po$" ".mo" LANG_MO ${LANG_PO})
+ # Add the .mo file to a list for use later with add_custom_target
+ set(LANG_SRCS_MO ${LANG_SRCS_MO} ${CMAKE_CURRENT_BINARY_DIR}/${LANG_MO})
+ # Run msgfmt on the language file, depends on the .po file
+ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${LANG_MO}
+ COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -c ${CMAKE_CURRENT_SOURCE_DIR}/${LANG_PO} -o ${CMAKE_CURRENT_BINARY_DIR}/${LANG_MO}
+ MAIN_DEPENDENCY ${LANG_PO}
+ )
+ # Add to cpack ignored files if not on Windows.
+ if(NOT WIN32)
+ add_to_cpack_ignored_files("${LANG_MO}")
+ endif(NOT WIN32)
+
+ # Install the new language file
+ install(CODE "FILE(MAKE_DIRECTORY \${CMAKE_INSTALL_PREFIX}/data/languages/${LANG_LANG}/LC_MESSAGES/)")
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG_MO} DESTINATION data/languages/${LANG_LANG}/LC_MESSAGES RENAME ${LANG_DOMAIN}.mo PERMISSIONS ${PERMS})
+ endforeach(LANG_PO)
+
+ # Generate languages, depends on the mo files
+ add_custom_target(module_language DEPENDS ${LANG_SRCS_MO})
+endif(GETTEXT_FOUND)
diff --git a/modules/extra/language/cs_appendtopic.de_DE.po b/modules/extra/language/cs_appendtopic.de_DE.po
new file mode 100644
index 000000000..8e5111d5d
--- /dev/null
+++ b/modules/extra/language/cs_appendtopic.de_DE.po
@@ -0,0 +1,37 @@
+# German translations for cs_appendtopic
+# German messages for cs_appendtopic
+# Copyright (C) 2011 Anope Team
+# This file is distributed under the same license as Anope IRC Services
+# Adam <adam@anope.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Anope\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-04 03:41-0500\n"
+"PO-Revision-Date: 2010-09-25 20:57-0400\n"
+"Last-Translator: Adam <adam@anope.org>\n"
+"Language-Team: German\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../cs_appendtopic.cpp:106
+msgid " APPENDTOPIC Add text to a channels topic"
+msgstr " APPENDTOPIC Fügt einen Text zu einem Channel-Topic hinzu."
+
+#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
+msgid "Syntax: APPENDTOPIC channel text"
+msgstr "Syntax: APPENDTOPIC Channel Text"
+
+#: ../cs_appendtopic.cpp:92
+msgid ""
+"This command allows users to append text to a currently set\n"
+"channel topic. When TOPICLOCK is on, the topic is updated and\n"
+"the new, updated topic is locked."
+msgstr ""
+"Dieser Befehl erlaubt Benutzern, einen Text zu dem vorhandenen Channel-"
+"Topic\n"
+"hinzuzufügen. Wenn TOPICLOCK gesetzt ist, wird das Topic aktualisiert\n"
+"und das neue, aktualisierte Topic wird gesperrt."
diff --git a/modules/extra/language/cs_appendtopic.it_IT.po b/modules/extra/language/cs_appendtopic.it_IT.po
new file mode 100644
index 000000000..827fe5bd6
--- /dev/null
+++ b/modules/extra/language/cs_appendtopic.it_IT.po
@@ -0,0 +1,38 @@
+# Italian translations for cs_appendtopic
+# Traduzioni italiane per il cs_appendtopic
+# Copyright (C) 2011 Anope Team
+# This file is distributed under the same license as Anope IRC Services
+# Adam <adam@anope.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Anope\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-04 03:41-0500\n"
+"PO-Revision-Date: 2010-09-25 21:04-0400\n"
+"Last-Translator: Adam <adam@anope.org>\n"
+"Language-Team: Italian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../cs_appendtopic.cpp:106
+msgid " APPENDTOPIC Add text to a channels topic"
+msgstr " APPENDTOPIC Aggiunge del testo al topic di un canale"
+
+#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
+msgid "Syntax: APPENDTOPIC channel text"
+msgstr "Sintassi: APPENDTOPIC canale testo"
+
+#: ../cs_appendtopic.cpp:92
+msgid ""
+"This command allows users to append text to a currently set\n"
+"channel topic. When TOPICLOCK is on, the topic is updated and\n"
+"the new, updated topic is locked."
+msgstr ""
+"Questo comando permette agli utenti di aggiungere del testo ad un topic di "
+"un canale\n"
+"già impostato. Se TOPICLOCK è attivato, il topic viene aggiornato e il nuovo "
+"topic\n"
+"viene bloccato."
diff --git a/modules/extra/language/cs_appendtopic.nl_NL.po b/modules/extra/language/cs_appendtopic.nl_NL.po
new file mode 100644
index 000000000..15e857506
--- /dev/null
+++ b/modules/extra/language/cs_appendtopic.nl_NL.po
@@ -0,0 +1,37 @@
+# Dutch translations for cs_appendtopic
+# Engelse vertalingen voor het cs_appendtopic
+# Copyright (C) 2011 Anope Team
+# This file is distributed under the same license as Anope IRC Services
+# Adam <adam@anope.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Anope\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-04 03:41-0500\n"
+"PO-Revision-Date: 2010-09-25 20:55-0400\n"
+"Last-Translator: Adam <adam@anope.org>\n"
+"Language-Team: Dutch\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../cs_appendtopic.cpp:106
+msgid " APPENDTOPIC Add text to a channels topic"
+msgstr " APPENDTOPIC Voeg tekst aan een kanaal onderwerp toe"
+
+#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
+msgid "Syntax: APPENDTOPIC channel text"
+msgstr "Gebruik: APPENDTOPIC kanaal tekst"
+
+#: ../cs_appendtopic.cpp:92
+msgid ""
+"This command allows users to append text to a currently set\n"
+"channel topic. When TOPICLOCK is on, the topic is updated and\n"
+"the new, updated topic is locked."
+msgstr ""
+"Dit command stelt gebruikers in staat om text toe te voegen\n"
+"achter het huidige onderwerp van een kanaal. Als TOPICLOCK aan\n"
+"staat, zal het onderwerp worden bijgewerkt en zal het nieuwe,\n"
+"bijgewerkte topic worden geforceerd."
diff --git a/modules/extra/language/cs_appendtopic.pot b/modules/extra/language/cs_appendtopic.pot
new file mode 100644
index 000000000..4c37b8d37
--- /dev/null
+++ b/modules/extra/language/cs_appendtopic.pot
@@ -0,0 +1,32 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-04 03:41-0500\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: 8bit\n"
+
+#: ../cs_appendtopic.cpp:106
+msgid " APPENDTOPIC Add text to a channels topic"
+msgstr ""
+
+#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
+msgid "Syntax: APPENDTOPIC channel text"
+msgstr ""
+
+#: ../cs_appendtopic.cpp:92
+msgid ""
+"This command allows users to append text to a currently set\n"
+"channel topic. When TOPICLOCK is on, the topic is updated and\n"
+"the new, updated topic is locked."
+msgstr ""
diff --git a/modules/extra/language/cs_appendtopic.pt_PT.po b/modules/extra/language/cs_appendtopic.pt_PT.po
new file mode 100644
index 000000000..853f0502c
--- /dev/null
+++ b/modules/extra/language/cs_appendtopic.pt_PT.po
@@ -0,0 +1,35 @@
+# Portuguese translations for cs_appendtopic
+# Copyright (C) 2011 Anope Team
+# This file is distributed under the same license as Anope IRC Services
+# Adam <adam@anope.org>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Anope\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-02-04 03:41-0500\n"
+"PO-Revision-Date: 2010-09-25 21:00-0400\n"
+"Last-Translator: Adam <adam@anope.org>\n"
+"Language-Team: Portuguese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../cs_appendtopic.cpp:106
+msgid " APPENDTOPIC Add text to a channels topic"
+msgstr " APPENDTOPIC Adiciona texto ao tópico de um canal"
+
+#: ../cs_appendtopic.cpp:90 ../cs_appendtopic.cpp:101
+msgid "Syntax: APPENDTOPIC channel text"
+msgstr "Sintaxe: APPENDTOPIC canal texto"
+
+#: ../cs_appendtopic.cpp:92
+msgid ""
+"This command allows users to append text to a currently set\n"
+"channel topic. When TOPICLOCK is on, the topic is updated and\n"
+"the new, updated topic is