summaryrefslogtreecommitdiffstats
path: root/kopete/plugins/alias
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/plugins/alias')
-rw-r--r--kopete/plugins/alias/Makefile.am19
-rw-r--r--kopete/plugins/alias/aliasdialog.ui193
-rw-r--r--kopete/plugins/alias/aliasdialogbase.ui107
-rw-r--r--kopete/plugins/alias/aliasplugin.cpp38
-rw-r--r--kopete/plugins/alias/aliasplugin.h31
-rw-r--r--kopete/plugins/alias/aliaspreferences.cpp502
-rw-r--r--kopete/plugins/alias/aliaspreferences.h56
-rw-r--r--kopete/plugins/alias/editaliasdialog.cpp51
-rw-r--r--kopete/plugins/alias/editaliasdialog.h38
-rw-r--r--kopete/plugins/alias/kopete_alias.desktop108
-rw-r--r--kopete/plugins/alias/kopete_alias_config.desktop104
11 files changed, 1247 insertions, 0 deletions
diff --git a/kopete/plugins/alias/Makefile.am b/kopete/plugins/alias/Makefile.am
new file mode 100644
index 00000000..d295e0cc
--- /dev/null
+++ b/kopete/plugins/alias/Makefile.am
@@ -0,0 +1,19 @@
+METASOURCES = AUTO
+AM_CPPFLAGS = $(KOPETE_INCLUDES) $(all_includes)
+
+kde_module_LTLIBRARIES = kopete_alias.la kcm_kopete_alias.la
+
+kopete_alias_la_SOURCES = aliasplugin.cpp
+kopete_alias_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries)
+kopete_alias_la_LIBADD = ../../libkopete/libkopete.la
+
+kcm_kopete_alias_la_SOURCES = aliaspreferences.cpp aliasdialogbase.ui aliasdialog.ui editaliasdialog.cpp
+kcm_kopete_alias_la_LDFLAGS = -module -no-undefined $(KDE_PLUGIN) $(all_libraries)
+kcm_kopete_alias_la_LIBADD = $(LIB_KOPETECOMPAT) $(LIB_KUTILS) ../../libkopete/libkopete.la
+
+service_DATA = kopete_alias.desktop
+servicedir = $(kde_servicesdir)
+
+kcm_DATA = kopete_alias_config.desktop
+kcmdir = $(kde_servicesdir)/kconfiguredialog
+
diff --git a/kopete/plugins/alias/aliasdialog.ui b/kopete/plugins/alias/aliasdialog.ui
new file mode 100644
index 00000000..1d980d52
--- /dev/null
+++ b/kopete/plugins/alias/aliasdialog.ui
@@ -0,0 +1,193 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AliasDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AliasDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>361</width>
+ <height>268</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Add New Alias</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Command:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>command</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>command</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>This is the command that you want to run when you execute this alias. </string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;qt&gt;This is the command that you want to run when you execute this alias.
+
+You can use the variables &lt;b&gt;%1, %2 ... %9&lt;/b&gt; in your command, and they will be replaced with the arguments of the alias. The variable &lt;b&gt;%s&lt;/b&gt; will be replaced with all arguments. &lt;b&gt;%n&lt;/b&gt; expands to your nickname.
+
+Do not include the '/' in the command (if you do it will be stripped off anyway).&lt;/qt&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Alias:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>alias</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>alias</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>This is the alias you are adding (what you will type after the command identifier, '/').</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the alias you are adding (what you will type after the command identifier, '/'). Do not include the '/' (it will be stripped off if you do anyway).</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>addButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Save</string>
+ </property>
+ <property name="default">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>kPushButton3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <widget class="KListView" row="2" column="1" rowspan="1" colspan="2">
+ <column>
+ <property name="text">
+ <string>Protocols</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>protocolList</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode" stdset="0">
+ <enum>Multi</enum>
+ </property>
+ <property name="itemMargin">
+ <number>0</number>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>If you want this alias to only be active for certain protocols, select those protocols here.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If you want this alias to only be active for certain protocols, select those protocols here.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>For protocols:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignTop</set>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kListView2</cstring>
+ </property>
+ </widget>
+ <widget class="Line" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>kPushButton3</sender>
+ <signal>clicked()</signal>
+ <receiver>AliasDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>addButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AliasDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>alias</tabstop>
+ <tabstop>command</tabstop>
+ <tabstop>protocolList</tabstop>
+ <tabstop>addButton</tabstop>
+ <tabstop>kPushButton3</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/kopete/plugins/alias/aliasdialogbase.ui b/kopete/plugins/alias/aliasdialogbase.ui
new file mode 100644
index 00000000..f70cc5bf
--- /dev/null
+++ b/kopete/plugins/alias/aliasdialogbase.ui
@@ -0,0 +1,107 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>AliasDialogBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>AliasDialogBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>602</width>
+ <height>424</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView" row="0" column="0" rowspan="1" colspan="3">
+ <column>
+ <property name="text">
+ <string>Alias</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Command</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Protocols</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>aliasList</cstring>
+ </property>
+ <property name="selectionMode" stdset="0">
+ <enum>Extended</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="fullWidth">
+ <bool>false</bool>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This is the list of custom aliases and the commands that you have already added</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>addButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add New Alias...</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>deleteButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete Selected</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>editButton</cstring>
+ </property>
+ <property name="text">
+ <string>Edit Alias...</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kopete/plugins/alias/aliasplugin.cpp b/kopete/plugins/alias/aliasplugin.cpp
new file mode 100644
index 00000000..1594a836
--- /dev/null
+++ b/kopete/plugins/alias/aliasplugin.cpp
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kgenericfactory.h>
+
+#include "kopetemessagemanagerfactory.h"
+
+#include "aliasplugin.h"
+
+typedef KGenericFactory<AliasPlugin> AliasPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( kopete_alias, AliasPluginFactory( "kopete_alias" ) )
+AliasPlugin * AliasPlugin::pluginStatic_ = 0L;
+
+AliasPlugin::AliasPlugin( QObject *parent, const char * name, const QStringList & )
+ : Kopete::Plugin( AliasPluginFactory::instance(), parent, name )
+{
+ if( !pluginStatic_ )
+ pluginStatic_ = this;
+
+}
+
+AliasPlugin::~AliasPlugin()
+{
+ pluginStatic_ = 0L;
+}
+
+AliasPlugin * AliasPlugin::plugin()
+{
+ return pluginStatic_ ;
+}
+
+#include "aliasplugin.moc"
diff --git a/kopete/plugins/alias/aliasplugin.h b/kopete/plugins/alias/aliasplugin.h
new file mode 100644
index 00000000..8e55dc20
--- /dev/null
+++ b/kopete/plugins/alias/aliasplugin.h
@@ -0,0 +1,31 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef AliasPLUGIN_H
+#define AliasPLUGIN_H
+
+#include "kopeteplugin.h"
+
+class AliasPlugin : public Kopete::Plugin
+{
+ Q_OBJECT
+
+ public:
+ static AliasPlugin *plugin();
+
+ AliasPlugin( QObject *parent, const char *name, const QStringList &args );
+ ~AliasPlugin();
+
+ private:
+ static AliasPlugin * pluginStatic_;
+};
+
+#endif
+
+
diff --git a/kopete/plugins/alias/aliaspreferences.cpp b/kopete/plugins/alias/aliaspreferences.cpp
new file mode 100644
index 00000000..65342ddf
--- /dev/null
+++ b/kopete/plugins/alias/aliaspreferences.cpp
@@ -0,0 +1,502 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kpushbutton.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <klineedit.h>
+#include <kglobal.h>
+#include <kgenericfactory.h>
+#include <kmessagebox.h>
+#include <kconfig.h>
+#include <qregexp.h>
+#include <qlayout.h>
+#include <kplugininfo.h>
+#include <kiconloader.h>
+#include <qpainter.h>
+
+#include "kopetecommandhandler.h"
+#include "kopetepluginmanager.h"
+#include "kopeteaccount.h"
+#include "kopeteprotocol.h"
+
+#include "aliasdialogbase.h"
+#include "editaliasdialog.h"
+#include "aliaspreferences.h"
+
+typedef KGenericFactory<AliasPreferences> AliasPreferencesFactory;
+
+class AliasItem : public QListViewItem
+{
+ public:
+ AliasItem( QListView *parent,
+ uint number,
+ const QString &alias,
+ const QString &command, const ProtocolList &p ) :
+ QListViewItem( parent, alias, command )
+ {
+ protocolList = p;
+ id = number;
+ }
+
+ ProtocolList protocolList;
+ uint id;
+
+ protected:
+ void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int align )
+ {
+ if ( column == 2 )
+ {
+ int cellWidth = width - ( protocolList.count() * 16 ) - 4;
+ if ( cellWidth < 0 )
+ cellWidth = 0;
+
+ QListViewItem::paintCell( p, cg, column, cellWidth, align );
+
+ // Draw the rest of the background
+ QListView *lv = listView();
+ if ( !lv )
+ return;
+
+ int marg = lv->itemMargin();
+ int r = marg;
+ const BackgroundMode bgmode = lv->viewport()->backgroundMode();
+ const QColorGroup::ColorRole crole =
+ QPalette::backgroundRoleFromMode( bgmode );
+ p->fillRect( cellWidth, 0, width - cellWidth, height(),
+ cg.brush( crole ) );
+
+ if ( isSelected() && ( column == 0 || listView()->allColumnsShowFocus() ) )
+ {
+ p->fillRect( QMAX( cellWidth, r - marg ), 0,
+ width - cellWidth - r + marg, height(),
+ cg.brush( QColorGroup::Highlight ) );
+ if ( isEnabled() || !lv )
+ p->setPen( cg.highlightedText() );
+ else if ( !isEnabled() && lv )
+ p->setPen( lv->palette().disabled().highlightedText() );
+ }
+
+ // And last, draw the online status icons
+ int mc_x = 0;
+
+ for ( ProtocolList::Iterator it = protocolList.begin();
+ it != protocolList.end(); ++it )
+ {
+ QPixmap icon = SmallIcon( (*it)->pluginIcon() );
+ p->drawPixmap( mc_x + 4, height() - 16,
+ icon );
+ mc_x += 16;
+ }
+ }
+ else
+ {
+ // Use Qt's own drawing
+ QListViewItem::paintCell( p, cg, column, width, align );
+ }
+ }
+};
+
+class ProtocolItem : public QListViewItem
+{
+ public:
+ ProtocolItem( QListView *parent, KPluginInfo *p ) :
+ QListViewItem( parent, p->name() )
+ {
+ this->setPixmap( 0, SmallIcon( p->icon() ) );
+ id = p->pluginName();
+ }
+
+ QString id;
+};
+
+K_EXPORT_COMPONENT_FACTORY( kcm_kopete_alias, AliasPreferencesFactory( "kcm_kopete_alias" ) )
+
+AliasPreferences::AliasPreferences( QWidget *parent, const char *, const QStringList &args )
+ : KCModule( AliasPreferencesFactory::instance(), parent, args )
+{
+ ( new QVBoxLayout( this ) )->setAutoAdd( true );
+ preferencesDialog = new AliasDialogBase( this );
+
+ connect( preferencesDialog->addButton, SIGNAL(clicked()), this, SLOT( slotAddAlias() ) );
+ connect( preferencesDialog->editButton, SIGNAL(clicked()), this, SLOT( slotEditAlias() ) );
+ connect( preferencesDialog->deleteButton, SIGNAL(clicked()), this, SLOT( slotDeleteAliases() ) );
+ connect( Kopete::PluginManager::self(), SIGNAL( pluginLoaded( Kopete::Plugin * ) ),
+ this, SLOT( slotPluginLoaded( Kopete::Plugin * ) ) );
+
+ connect( preferencesDialog->aliasList, SIGNAL(selectionChanged()),
+ this, SLOT( slotCheckAliasSelected() ) );
+
+ load();
+}
+
+AliasPreferences::~AliasPreferences()
+{
+ QListViewItem *myChild = preferencesDialog->aliasList->firstChild();
+ while( myChild )
+ {
+ ProtocolList protocols = static_cast<AliasItem*>( myChild )->protocolList;
+ for( ProtocolList::Iterator it = protocols.begin(); it != protocols.end(); ++it )
+ {
+ Kopete::CommandHandler::commandHandler()->unregisterAlias(
+ *it,
+ myChild->text(0)
+ );
+ }
+
+ myChild = myChild->nextSibling();
+ }
+}
+
+// reload configuration reading it from kopeterc
+void AliasPreferences::load()
+{
+ KConfig *config = KGlobal::config();
+ if( config->hasGroup( "AliasPlugin" ) )
+ {
+ config->setGroup("AliasPlugin");
+ QStringList aliases = config->readListEntry("AliasNames");
+ for( QStringList::Iterator it = aliases.begin(); it != aliases.end(); ++it )
+ {
+ uint aliasNumber = config->readUnsignedNumEntry( (*it) + "_id" );
+ QString aliasCommand = config->readEntry( (*it) + "_command" );
+ QStringList protocols = config->readListEntry( (*it) + "_protocols" );
+
+ ProtocolList protocolList;
+ for( QStringList::Iterator it2 = protocols.begin(); it2 != protocols.end(); ++it2 )
+ {
+ Kopete::Plugin *p = Kopete::PluginManager::self()->plugin( *it2 );
+ protocolList.append( (Kopete::Protocol*)p );
+ }
+
+ addAlias( *it, aliasCommand, protocolList, aliasNumber );
+ }
+
+ }
+
+ slotCheckAliasSelected();
+}
+
+void AliasPreferences::slotPluginLoaded( Kopete::Plugin *plugin )
+{
+ Kopete::Protocol *protocol = static_cast<Kopete::Protocol*>( plugin );
+ if( protocol )
+ {
+ KConfig *config = KGlobal::config();
+ if( config->hasGroup( "AliasPlugin" ) )
+ {
+ config->setGroup("AliasPlugin");
+ QStringList aliases = config->readListEntry("AliasNames");
+ for( QStringList::Iterator it = aliases.begin(); it != aliases.end(); ++it )
+ {
+ uint aliasNumber = config->readUnsignedNumEntry( (*it) + "_id" );
+ QString aliasCommand = config->readEntry( (*it) + "_command" );
+ QStringList protocols = config->readListEntry( (*it) + "_protocols" );
+
+ for( QStringList::iterator it2 = protocols.begin(); it2 != protocols.end(); ++it2 )
+ {
+ if( *it2 == protocol->pluginId() )
+ {
+ QPair<Kopete::Protocol*, QString> pr( protocol, *it );
+ if( protocolMap.find( pr ) == protocolMap.end() )
+ {
+ Kopete::CommandHandler::commandHandler()->registerAlias(
+ protocol,
+ *it,
+ aliasCommand,
+ QString::fromLatin1("Custom alias for %1").arg(aliasCommand),
+ Kopete::CommandHandler::UserAlias
+ );
+
+ protocolMap.insert( pr, true );
+
+ AliasItem *item = aliasMap[ *it ];
+ if( item )
+ {
+ item->protocolList.append( protocol );
+ item->repaint();
+ }
+ else
+ {
+ ProtocolList pList;
+ pList.append( protocol );
+ aliasMap.insert( *it, new AliasItem( preferencesDialog->aliasList, aliasNumber, *it, aliasCommand, pList ) );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+// save list to kopeterc and creates map out of it
+void AliasPreferences::save()
+{
+ KConfig *config = KGlobal::config();
+ config->deleteGroup( QString::fromLatin1("AliasPlugin") );
+ config->setGroup( QString::fromLatin1("AliasPlugin") );
+
+ QStringList aliases;
+ AliasItem *item = (AliasItem*)preferencesDialog->aliasList->firstChild();
+ while( item )
+ {
+ QStringList protocols;
+ for( ProtocolList::Iterator it = item->protocolList.begin();
+ it != item->protocolList.end(); ++it )
+ {
+ protocols += (*it)->pluginId();
+ }
+
+ aliases += item->text(0);
+
+ config->writeEntry( item->text(0) + "_id", item->id );
+ config->writeEntry( item->text(0) + "_command", item->text(1) );
+ config->writeEntry( item->text(0) + "_protocols", protocols );
+
+ item = (AliasItem*)item->nextSibling();
+ }
+
+ config->writeEntry( "AliasNames", aliases );
+ config->sync();
+ emit KCModule::changed(false);
+}
+
+void AliasPreferences::addAlias( QString &alias, QString &command, const ProtocolList &p, uint id )
+{
+ QRegExp spaces( QString::fromLatin1("\\s+") );
+
+ if( alias.startsWith( QString::fromLatin1("/") ) )
+ alias = alias.section( '/', 1 );
+ if( command.startsWith( QString::fromLatin1("/") ) )
+ command = command.section( '/', 1 );
+
+ if( id == 0 )
+ {
+ if( preferencesDialog->aliasList->lastItem() )
+ id = static_cast<AliasItem*>( preferencesDialog->aliasList->lastItem() )->id + 1;
+ else
+ id = 1;
+ }
+
+ QString newAlias = command.section( spaces, 0, 0 );
+
+ aliasMap.insert( alias, new AliasItem( preferencesDialog->aliasList, id, alias, command, p ) );
+
+ // count the number of arguments present in 'command'
+ QRegExp rx( "(%\\d+)" );
+ QStringList list;
+ int pos = 0;
+ while ( pos >= 0 ) {
+ pos = rx.search( command, pos );
+ if ( pos > -1 ) {
+ list += rx.cap( 1 );
+ pos += rx.matchedLength();
+ }
+ }
+ int argc = list.count();
+
+ for( ProtocolList::ConstIterator it = p.begin(); it != p.end(); ++it )
+ {
+ Kopete::CommandHandler::commandHandler()->registerAlias(
+ *it,
+ alias,
+ command,
+ QString::fromLatin1("Custom alias for %1").arg(command),
+ Kopete::CommandHandler::UserAlias,
+ 0,
+ argc
+ );
+
+ protocolMap.insert( QPair<Kopete::Protocol*,QString>( *it, alias ), true );
+ }
+}
+
+void AliasPreferences::slotAddAlias()
+{
+ EditAliasDialog addDialog;
+ loadProtocols( &addDialog );
+ addDialog.addButton->setText( i18n("&Add") );
+
+ if( addDialog.exec() == QDialog::Accepted )
+ {
+ QString alias = addDialog.alias->text();
+ if( alias.startsWith( QString::fromLatin1("/") ) )
+ alias = alias.section( '/', 1 );
+
+ if( alias.contains( QRegExp("[_=]") ) )
+ {
+ KMessageBox::error( this, i18n("<qt>Could not add alias <b>%1</b>. An"
+ " alias name cannot contain the characters \"_\" or \"=\"."
+ "</qt>").arg(alias),i18n("Invalid Alias Name") );
+ }
+ else
+ {
+ QString command = addDialog.command->text();
+ ProtocolList protocols = selectedProtocols( &addDialog );
+
+ // Loop through selected protocols
+
+ for( ProtocolList::Iterator it = protocols.begin(); it != protocols.end(); ++it )
+ {
+
+ // And check if they already have the command enabled
+
+ if( Kopete::CommandHandler::commandHandler()->commandHandledByProtocol( alias, *it ) )
+ {
+ KMessageBox::error( this, i18n("<qt>Could not add alias <b>%1</b>. This "
+ "command is already being handled by either another alias or "
+ "Kopete itself.</qt>").arg(alias), i18n("Could Not Add Alias") );
+ return;
+ }
+ }
+ addAlias( alias, command, protocols );
+ emit KCModule::changed(true);
+
+ }
+ }
+}
+
+const ProtocolList AliasPreferences::selectedProtocols( EditAliasDialog *dialog )
+{
+ ProtocolList protocolList;
+ QListViewItem *item = dialog->protocolList->firstChild();
+
+ while( item )
+ {
+ if( item->isSelected() )
+ {
+
+ // If you dont have the selected protocol enabled, Kopete::PluginManager::self()->plugin
+ // will return NULL, check for that
+
+ if(Kopete::PluginManager::self()->plugin( static_cast<ProtocolItem*>(item)->id) )
+ protocolList.append( (Kopete::Protocol*)
+ Kopete::PluginManager::self()->plugin( static_cast<ProtocolItem*>(item)->id )
+ );
+ }
+ item = item->nextSibling();
+ }
+
+ return protocolList;
+}
+
+void AliasPreferences::loadProtocols( EditAliasDialog *dialog )
+{
+ QValueList<KPluginInfo*> plugins = Kopete::PluginManager::self()->availablePlugins("Protocols");
+ for( QValueList<KPluginInfo*>::Iterator it = plugins.begin(); it != plugins.end(); ++it )
+ {
+ ProtocolItem *item = new ProtocolItem( dialog->protocolList, *it );
+ itemMap[ (Kopete::Protocol*)Kopete::PluginManager::self()->plugin( (*it)->pluginName() ) ] = item;
+ }
+}
+
+void AliasPreferences::slotEditAlias()
+{
+ EditAliasDialog editDialog;
+ loadProtocols( &editDialog );
+
+ QListViewItem *item = preferencesDialog->aliasList->selectedItems().first();
+ if( item )
+ {
+ QString oldAlias = item->text(0);
+ editDialog.alias->setText( oldAlias );
+ editDialog.command->setText( item->text(1) );
+ ProtocolList protocols = static_cast<AliasItem*>( item )->protocolList;
+ for( ProtocolList::Iterator it = protocols.begin(); it != protocols.end(); ++it )
+ {
+ itemMap[ *it ]->setSelected( true );
+ }
+
+ if( editDialog.exec() == QDialog::Accepted )
+ {
+ QString alias = editDialog.alias->text();
+ if( alias.startsWith( QString::fromLatin1("/") ) )
+ alias = alias.section( '/', 1 );
+ if( alias.contains( QRegExp("[_=]") ) )
+ {
+ KMessageBox::error( this, i18n("<qt>Could not add alias <b>%1</b>. An"
+ " alias name cannot contain the characters \"_\" or \"=\"."
+ "</qt>").arg(alias),i18n("Invalid Alias Name") );
+ }
+ else
+ {
+ QString command = editDialog.command->text();
+
+ if( alias == oldAlias )
+ {
+ for( ProtocolList::Iterator it = protocols.begin(); it != protocols.end(); ++it )
+ {
+ Kopete::CommandHandler::commandHandler()->unregisterAlias(
+ *it,
+ oldAlias
+ );
+ }
+
+
+ ProtocolList selProtocols = selectedProtocols( &editDialog );
+
+ for( ProtocolList::Iterator it = selProtocols.begin(); it != selProtocols.end(); ++it )
+ {
+ if( Kopete::CommandHandler::commandHandler()->commandHandledByProtocol( alias, *it ) )
+ {
+ KMessageBox::error( this, i18n("<qt>Could not add alias <b>%1</b>. This "
+ "command is already being handled by either another alias or "
+ "Kopete itself.</qt>").arg(alias), i18n("Could Not Add Alias") );
+ return;
+ }
+ }
+
+ delete item;
+
+ addAlias( alias, command, selProtocols );
+ emit KCModule::changed(true);
+ }
+ }
+ }
+ }
+}
+
+void AliasPreferences::slotDeleteAliases()
+{
+ if( KMessageBox::warningContinueCancel(this, i18n("Are you sure you want to delete the selected aliases?"), i18n("Delete Aliases"), KGuiItem(i18n("Delete"), "editdelete") ) == KMessageBox::Continue )
+ {
+ QPtrList< QListViewItem > items = preferencesDialog->aliasList->selectedItems();
+ for( QListViewItem *i = items.first(); i; i = items.next() )
+ {
+ ProtocolList protocols = static_cast<AliasItem*>( i )->protocolList;
+ for( ProtocolList::Iterator it = protocols.begin(); it != protocols.end(); ++it )
+ {
+ Kopete::CommandHandler::commandHandler()->unregisterAlias(
+ *it,
+ i->text(0)
+ );
+
+ protocolMap.erase( QPair<Kopete::Protocol*,QString>( *it, i->text(0) ) );
+ }
+
+ aliasMap.erase( i->text(0) );
+ delete i;
+ emit KCModule::changed(true);
+ }
+
+ save();
+ }
+}
+
+void AliasPreferences::slotCheckAliasSelected()
+{
+ int numItems = preferencesDialog->aliasList->selectedItems().count();
+ preferencesDialog->deleteButton->setEnabled( numItems > 0 );
+ preferencesDialog->editButton->setEnabled( numItems == 1 );
+}
+
+#include "aliaspreferences.moc"
+
diff --git a/kopete/plugins/alias/aliaspreferences.h b/kopete/plugins/alias/aliaspreferences.h
new file mode 100644
index 00000000..330553a3
--- /dev/null
+++ b/kopete/plugins/alias/aliaspreferences.h
@@ -0,0 +1,56 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef AliasPREFERENCES_H
+#define AliasPREFERENCES_H
+
+#include "kcmodule.h"
+
+typedef QValueList<Kopete::Protocol*> ProtocolList;
+
+class AliasDialogBase;
+namespace Kopete { class Protocol; }
+class ProtocolItem;
+class AliasItem;
+class AliasDialog;
+namespace Kopete { class Plugin; }
+
+class AliasPreferences : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ AliasPreferences( QWidget *parent = 0, const char *name = 0,
+ const QStringList &args = QStringList() );
+ ~AliasPreferences();
+
+ virtual void save();
+ virtual void load();
+
+ private slots:
+ void slotAddAlias();
+ void slotEditAlias();
+ void slotDeleteAliases();
+ void slotCheckAliasSelected();
+ void slotPluginLoaded( Kopete::Plugin * );
+
+ private:
+ AliasDialogBase * preferencesDialog;
+ void addAlias( QString &alias, QString &command, const ProtocolList &p, uint id = 0 );
+ void loadProtocols( EditAliasDialog *dialog );
+ const ProtocolList selectedProtocols( EditAliasDialog *dialog );
+ QMap<Kopete::Protocol*,ProtocolItem*> itemMap;
+ QMap<QPair<Kopete::Protocol*,QString>, bool> protocolMap;
+ QMap<QString,AliasItem*> aliasMap;
+};
+
+#endif
+
+// vim: set noet ts=4 sts=4 sw=4:
+
diff --git a/kopete/plugins/alias/editaliasdialog.cpp b/kopete/plugins/alias/editaliasdialog.cpp
new file mode 100644
index 00000000..42eb2f4b
--- /dev/null
+++ b/kopete/plugins/alias/editaliasdialog.cpp
@@ -0,0 +1,51 @@
+/*
+ Kopete Alias Plugin
+
+ Copyright (c) 2005 by Matt Rogers <mattr@kde.org>
+ Kopete Copyright (c) 2002-2005 by the Kopete Developers <kopete-devel@kde.org>
+
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************
+
+*/
+
+#include "editaliasdialog.h"
+#include <qobject.h>
+#include <kpushbutton.h>
+#include <qwidget.h>
+#include <qstring.h>
+#include <klineedit.h>
+#include <klistview.h>
+
+
+EditAliasDialog::EditAliasDialog( QWidget* parent, const char* name )
+: AliasDialog( parent, name )
+{
+ QObject::connect( alias, SIGNAL( textChanged( const QString& ) ), this, SLOT( checkButtonsEnabled() ) );
+ QObject::connect( command, SIGNAL( textChanged( const QString& ) ), this, SLOT( checkButtonsEnabled() ) );
+ QObject::connect( protocolList, SIGNAL( selectionChanged() ), this, SLOT( checkButtonsEnabled() ) );
+
+ checkButtonsEnabled();
+}
+
+EditAliasDialog::~EditAliasDialog()
+{
+}
+
+void EditAliasDialog::checkButtonsEnabled()
+{
+ if ( !alias->text().isEmpty() && !command->text().isEmpty() && !protocolList->selectedItems().isEmpty() )
+ addButton->setEnabled( true );
+ else
+ addButton->setEnabled( false ) ;
+}
+
+#include "editaliasdialog.moc"
+
+// kate: space-indent off; replace-tabs off; tab-width 4; indent-mode csands;
diff --git a/kopete/plugins/alias/editaliasdialog.h b/kopete/plugins/alias/editaliasdialog.h
new file mode 100644
index 00000000..869e8903
--- /dev/null
+++ b/kopete/plugins/alias/editaliasdialog.h
@@ -0,0 +1,38 @@
+/*
+ Kopete Alias Plugin
+
+ Copyright (c) 2005 by Matt Rogers <mattr@kde.org>
+ Kopete Copyright (c) 2002-2005 by the Kopete Developers <kopete-devel@kde.org>
+
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************
+
+*/
+
+#ifndef _EDITALIASDIALOG_H_
+#define _EDITALIASDIALOG_H_
+
+#include "aliasdialog.h"
+
+class QWidget;
+
+class EditAliasDialog : public AliasDialog
+{
+ Q_OBJECT
+public:
+ EditAliasDialog( QWidget* parent = 0, const char* name = 0 );
+ virtual ~EditAliasDialog();
+
+public slots:
+ void checkButtonsEnabled();
+};
+
+#endif
+
+// kate: space-indent off; replace-tabs off; tab-width 4; indent-mode csands;
diff --git a/kopete/plugins/alias/kopete_alias.desktop b/kopete/plugins/alias/kopete_alias.desktop
new file mode 100644
index 00000000..4a23fcd3
--- /dev/null
+++ b/kopete/plugins/alias/kopete_alias.desktop
@@ -0,0 +1,108 @@
+[Desktop Entry]
+Type=Service
+X-Kopete-Version=1000900
+Icon=alias
+ServiceTypes=Kopete/Plugin
+X-KDE-Library=kopete_alias
+X-KDE-PluginInfo-Author=Jason Keirstead
+X-KDE-PluginInfo-Email=jason@keirstead.org
+X-KDE-PluginInfo-Name=kopete_alias
+X-KDE-PluginInfo-Version=0.8.0
+X-KDE-PluginInfo-Website=http://kopete.kde.org
+X-KDE-PluginInfo-Category=Plugins
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+Name=Alias
+Name[ar]=اسم مستعار
+Name[be]=Псеўданім
+Name[bg]=Запазени думи
+Name[bn]=ছদ্মনাম
+Name[br]=Lesanv
+Name[ca]=Àlies
+Name[cy]=Ffugenw
+Name[el]=Αντιστοιχία
+Name[eo]=Alinomo
+Name[eu]=Aliasa
+Name[fa]=نام‌گردان
+Name[fi]=Uusi nimi
+Name[ga]=Ailias
+Name[he]=כינוי
+Name[hi]=अलाएस
+Name[hu]=Alias nevek
+Name[is]=Samheiti
+Name[ja]=エイリアス
+Name[ka]=ფსევდონიმი
+Name[kk]=Бүркеншік атаулар
+Name[km]=ឈ្មោះ​ក្លែងក្លាយ
+Name[lt]=Kitas vardas
+Name[mk]=Други имиња
+Name[ne]=उपनाम
+Name[pa]=ਉਪ-ਨਾਂ
+Name[pt]=Nome Alternativo
+Name[pt_BR]=Apelidos
+Name[ru]=Псевдоним
+Name[sl]=Drugo ime
+Name[sr]=Алијас
+Name[sr@Latn]=Alijas
+Name[ta]=மாற்றுப்பெயர்
+Name[tg]=Тахаллус
+Name[tr]=Takma İsim
+Name[uk]=Псевдонім
+Name[zh_CN]=别名
+Name[zh_HK]=別名
+Name[zh_TW]=別名
+Comment=Adds custom aliases for commands
+Comment[ar]=يضيف أسماء مستعارة للأوامر
+Comment[be]=Дадаць адмысловыя псеўданімы для загадаў
+Comment[bg]=Приставка за добавяне на запазени думи, при въвеждането на които ще се изпълняват зададени команди
+Comment[bn]=কম্যান্ডের জন্য স্বনির্বাচিত ছদ্মনাম যোগ করে
+Comment[bs]=Dodajte vlastite aliase naredbama
+Comment[ca]=Afegeix àlies personalitzats als vostres comandaments
+Comment[cs]=Přidává vlastní přezdívky pro příkazy
+Comment[cy]=Ychwanegu ffugenwau addasiedig ar gyfer gorchmynion
+Comment[da]=Tilføj personligt alias for kommandoer
+Comment[de]=Fügt benutzerdefinierte Aliase für Befehle hinzu
+Comment[el]=Προσθέτει προσαρμοσμένες αντιστοιχίες για εντολές
+Comment[es]=Añade alias personales a las órdenes
+Comment[et]=Lisab käskudele kohandatud aliase
+Comment[eu]=Alias pertsonalizatuak gehitzen ditu aginduentzat
+Comment[fa]=نام‌گردانهای سفارشی را برای فرمانها می‌افزاید
+Comment[fi]=Lisää uusia nimiä komennoille
+Comment[fr]=Ajoute des alias personnalisés à des commandes
+Comment[gl]=Engadir alias persoáis para comandos
+Comment[he]=הוספת כינוים מותאמים אישית עבור פקודות
+Comment[hi]=कमांड्स के लिए मनपसंद अलाएस जोड़े
+Comment[hr]=Dodaje posebne aliase za naredbe
+Comment[hu]=Egyéni másodlagos (alias) nevek megadása parancsokhoz
+Comment[is]=Bætir við samheitum á skipanir
+Comment[it]=Aggiungi alias personalizzati per i comandi
+Comment[ja]=コマンドのカスタムエイリアスを追加
+Comment[ka]=ბრძანებებს ანიჭებს სხვადასხვა ფსევდონიმებს
+Comment[kk]=Командаларға бүркеншік атауларды беру
+Comment[km]=បន្ថែម​ឈ្មោះ​ក្លែងក្លាយ​ផ្ទាល់​ខ្លួន​សម្រាប់​ពាក្យ​បញ្ជា
+Comment[lt]=Komandoms suteikiami papildomi vardai
+Comment[mk]=Додава сопствени алтернативни имиња на командите
+Comment[nb]=Legg til egne alias for kommandoer
+Comment[nds]=Föögt egen Aliases för Befehlen to
+Comment[ne]=आदेशका लागि अनुकूल उपनामहरू थप्दछ
+Comment[nl]=Toevoegen van eigen aliassen voor commando's
+Comment[nn]=Legg til eigne alias for kommandoar
+Comment[pl]=Dodawanie własnych aliasów dla poleceń
+Comment[pt]=Adiciona novos nomes para os comandos
+Comment[pt_BR]=Adiciona notas pessoais em seus contatos
+Comment[ru]=Добавляет псевдонимы для команд
+Comment[se]=Lasit iežat aliasaid gohččumiid várás
+Comment[sk]=Pridá vlastné aliasy pre príkazy
+Comment[sl]=Dodajanje drugih imen za ukaze
+Comment[sr]=Додаје посебне алијасе за наредбе
+Comment[sr@Latn]=Dodaje posebne alijase za naredbe
+Comment[sv]=Lägger till egna alias för kommandon
+Comment[ta]=கட்டளைகள் தன் விருப்பப் பெயரை சேர்க்கும்
+Comment[tg]=Барои фармонҳо тахаллусҳои дигарро илова мекунад
+Comment[tr]=Komutlar için özel takma isimler ekler
+Comment[uk]=Додає псевдоніми для команд
+Comment[zh_CN]=添加命令的自定义别名
+Comment[zh_HK]=為命令加上自訂別名
+Comment[zh_TW]=新增命令的別名
+
diff --git a/kopete/plugins/alias/kopete_alias_config.desktop b/kopete/plugins/alias/kopete_alias_config.desktop
new file mode 100644
index 00000000..01fadd24
--- /dev/null
+++ b/kopete/plugins/alias/kopete_alias_config.desktop
@@ -0,0 +1,104 @@
+[Desktop Entry]
+Icon=color
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=kopete_alias
+X-KDE-FactoryName=AliasConfigFactory
+X-KDE-ParentApp=kopete_alias
+X-KDE-ParentComponents=kopete_alias
+
+Name=Alias
+Name[ar]=اسم مستعار
+Name[be]=Псеўданім
+Name[bg]=Запазени думи
+Name[bn]=ছদ্মনাম
+Name[br]=Lesanv
+Name[ca]=Àlies
+Name[cy]=Ffugenw
+Name[el]=Αντιστοιχία
+Name[eo]=Alinomo
+Name[eu]=Aliasa
+Name[fa]=نام‌گردان
+Name[fi]=Uusi nimi
+Name[ga]=Ailias
+Name[he]=כינוי
+Name[hi]=अलाएस
+Name[hu]=Alias nevek
+Name[is]=Samheiti
+Name[ja]=エイリアス
+Name[ka]=ფსევდონიმი
+Name[kk]=Бүркеншік атаулар
+Name[km]=ឈ្មោះ​ក្លែងក្លាយ
+Name[lt]=Kitas vardas
+Name[mk]=Други имиња
+Name[ne]=उपनाम
+Name[pa]=ਉਪ-ਨਾਂ
+Name[pt]=Nome Alternativo
+Name[pt_BR]=Apelidos
+Name[ru]=Псевдоним
+Name[sl]=Drugo ime
+Name[sr]=Алијас
+Name[sr@Latn]=Alijas
+Name[ta]=மாற்றுப்பெயர்
+Name[tg]=Тахаллус
+Name[tr]=Takma İsim
+Name[uk]=Псевдонім
+Name[zh_CN]=别名
+Name[zh_HK]=別名
+Name[zh_TW]=別名
+Comment=Adds custom aliases for commands
+Comment[ar]=يضيف أسماء مستعارة للأوامر
+Comment[be]=Дадаць адмысловыя псеўданімы для загадаў
+Comment[bg]=Приставка за добавяне на запазени думи, при въвеждането на които ще се изпълняват зададени команди
+Comment[bn]=কম্যান্ডের জন্য স্বনির্বাচিত ছদ্মনাম যোগ করে
+Comment[bs]=Dodajte vlastite aliase naredbama
+Comment[ca]=Afegeix àlies personalitzats als vostres comandaments
+Comment[cs]=Přidává vlastní přezdívky pro příkazy
+Comment[cy]=Ychwanegu ffugenwau addasiedig ar gyfer gorchmynion
+Comment[da]=Tilføj personligt alias for kommandoer
+Comment[de]=Fügt benutzerdefinierte Aliase für Befehle hinzu
+Comment[el]=Προσθέτει προσαρμοσμένες αντιστοιχίες για εντολές
+Comment[es]=Añade alias personales a las órdenes
+Comment[et]=Lisab käskudele kohandatud aliase
+Comment[eu]=Alias pertsonalizatuak gehitzen ditu aginduentzat
+Comment[fa]=نام‌گردانهای سفارشی را برای فرمانها می‌افزاید
+Comment[fi]=Lisää uusia nimiä komennoille
+Comment[fr]=Ajoute des alias personnalisés à des commandes
+Comment[gl]=Engadir alias persoáis para comandos
+Comment[he]=הוספת כינוים מותאמים אישית עבור פקודות
+Comment[hi]=कमांड्स के लिए मनपसंद अलाएस जोड़े
+Comment[hr]=Dodaje posebne aliase za naredbe
+Comment[hu]=Egyéni másodlagos (alias) nevek megadása parancsokhoz
+Comment[is]=Bætir við samheitum á skipanir
+Comment[it]=Aggiungi alias personalizzati per i comandi
+Comment[ja]=コマンドのカスタムエイリアスを追加
+Comment[ka]=ბრძანებებს ანიჭებს სხვადასხვა ფსევდონიმებს
+Comment[kk]=Командаларға бүркеншік атауларды беру
+Comment[km]=បន្ថែម​ឈ្មោះ​ក្លែងក្លាយ​ផ្ទាល់​ខ្លួន​សម្រាប់​ពាក្យ​បញ្ជា
+Comment[lt]=Komandoms suteikiami papildomi vardai
+Comment[mk]=Додава сопствени алтернативни имиња на командите
+Comment[nb]=Legg til egne alias for kommandoer
+Comment[nds]=Föögt egen Aliases för Befehlen to
+Comment[ne]=आदेशका लागि अनुकूल उपनामहरू थप्दछ
+Comment[nl]=Toevoegen van eigen aliassen voor commando's
+Comment[nn]=Legg til eigne alias for kommandoar
+Comment[pl]=Dodawanie własnych aliasów dla poleceń
+Comment[pt]=Adiciona novos nomes para os comandos
+Comment[pt_BR]=Adiciona notas pessoais em seus contatos
+Comment[ru]=Добавляет псевдонимы для команд
+Comment[se]=Lasit iežat aliasaid gohččumiid várás
+Comment[sk]=Pridá vlastné aliasy pre príkazy
+Comment[sl]=Dodajanje drugih imen za ukaze
+Comment[sr]=Додаје посебне алијасе за наредбе
+Comment[sr@Latn]=Dodaje posebne alijase za naredbe
+Comment[sv]=Lägger till egna alias för kommandon
+Comment[ta]=கட்டளைகள் தன் விருப்பப் பெயரை சேர்க்கும்
+Comment[tg]=Барои фармонҳо тахаллусҳои дигарро илова мекунад
+Comment[tr]=Komutlar için özel takma isimler ekler
+Comment[uk]=Додає псевдоніми для команд
+Comment[zh_CN]=添加命令的自定义别名
+Comment[zh_HK]=為命令加上自訂別名
+Comment[zh_TW]=新增命令的別名
+