/* X-Chat
* Copyright (C) 2002 Peter Zelezny.
*
* 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.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
/* IRC RFC1459(+commonly used extensions) protocol implementation */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdarg.h>
#include "xchat.h"
#include "ctcp.h"
#include "fe.h"
#include "ignore.h"
#include "inbound.h"
#include "modes.h"
#include "notify.h"
#include "plugin.h"
#include "server.h"
#include "text.h"
#include "outbound.h"
#include "util.h"
#include "xchatc.h"
static void
irc_login (server *serv, char *user, char *realname)
{
if (serv->password[0])
tcp_sendf (serv, "PASS %s\r\n", serv->password);
tcp_sendf (serv,
"NICK %s\r\n"
"USER %s %s %s :%s\r\n",
serv->nick, user, user, serv->servername, realname);
}
static void
irc_nickserv (server *serv, char *cmd, char *arg1, char *arg2, char *arg3)
{
/* are all ircd authors idiots? */
switch (serv->nickservtype)
{
case 0:
tcp_sendf (serv, "PRIVMSG NICKSERV :%s %s%s%s\r\n", cmd, arg1, arg2, arg3);
break;
case 1:
tcp_sendf (serv, "NICKSERV %s %s%s%s\r\n", cmd, arg1, arg2, arg3);
break;
case 2:
tcp_sendf (serv, "NS %s %s%s%s\r\n", cmd, arg1, arg2, arg3);
break;
case 3:
tcp_sendf (serv, "PRIVMSG NS :%s %s%s%s\r\n", cmd, arg1, arg2, arg3);
break;
case 4:
/* why couldn't QuakeNet implement one of the existing ones? */
tcp_sendf (serv, "AUTH %s%s%s\r\n", cmd, arg1, arg2, arg3);
}
}
static void
irc_ns_identify (server *serv, char *pass)
{
irc_nickserv (serv, "IDENTIFY", pass, "", "");
}
static void
irc_ns_ghost (server *serv, char *usname, char *pass)
{
if (serv->nickservtype != 4)
irc_nickserv (serv, "GHOST", usname, " ", pass);
}
static void
irc_join (server *serv, char *channel, char *key)
{
if (key[0])
tcp_sendf (serv, "JOIN %s %s\r\n", channel, key);
else
tcp_sendf (serv, "JOIN %s\r\n", channel);
}
static void
irc_join_list_flush (server *serv, GString *c, GString *k)
{
char *chanstr, *keystr;
chanstr = g_string_free (c, FALSE);
keystr = g_string_free (k, FALSE);
if (chanstr[0])
{
if (keystr[0])
tcp_sendf (serv, "JOIN %s %s\r\n", chanstr, keystr);
else
tcp_sendf (serv, "JOIN %s\r\n", chanstr);
}
g_free (chanstr);
g_free (keystr);
}
/* join a whole list of channels & keys, split to multiple lines
* to get around 512 limit */
static void
irc_join_list (server *serv, GSList *channels, GSList *keys)
{
GSList *clist;
GSList *klist;
GString *c = g_string_new (NULL);
GString *k = g_string_new (NULL);
int len;
int add;
int i, j;
i = j = 0;
len = 9; /* "JOIN<space><space>\r\n" */
clist = channels;
klist = keys;
while (clist)
{
/* measure how many bytes this channel would add... */
if (1)
{
add = strlen (clist->data);
if (i != 0)
add++; /* comma */
}
if (klist->data)
{
add += strlen (klist->data);
}
else
{
add++; /* 'x' filler */
}
if (j != 0)
add++; /* comma */
/* too big? dump buffer and start a fresh one */
if (len + add > 512)
{
irc_join_list_flush (serv, c, k);
c = g_string_new (NULL);
k = g_string_new (NULL);
i = j = 0;
len = 9;
}
/* now actually add it to our GStrings */
if (1)
{
add = strlen (clist->data);
if (i != 0)
{
add++;
g_string_append_c (c, ',');
}
g_string_append (c, clist->data);
i++;
}
if (klist->data)
{
add += strlen (klist->data);
if (j != 0)
{
add++;
g_string_append_c (k, ',');
}
g_string_append (k, klist->data);
j++;
}
else
{
add++;
if (j != 0)
{
add++;
g_string_append_c (k, ',');
}
g_string_append_c (k, 'x');
j++;
}
len += add;
klist = klist->next;
clist = clist->next;
}
irc_join_list_flush (serv, c, k);
}
static void
irc_part (server *serv, char *channel, char *reason)
{
if (reason[0])
tcp_sendf (serv, "PART %s :%s\r\n", channel, reason);
else
tcp_sendf (serv, "PART %s\r\n", channel);
}
static void
irc_quit (server *serv, char *reason)
{
if (reason[0])
tcp_sendf (serv, "QUIT :%s\r\n", reason);
else
tcp_send_len (serv, "QUIT\r\n", 6);
}
static void
irc_set_back (server *serv)
{
tcp_send_len (serv, "AWAY\r\n", 6);
}
static void
irc_set_away (server *serv, char *reason)
{
if (reason)
{
if (!reason[0])
reason = " ";
}
else
{
reason = " ";
}
tcp_sendf (serv, "AWAY :%s\r\n", reason);
}
static void
irc_ctcp (server *serv, char *to, char *msg)
{
tcp_sendf (serv, "PRIVMSG %s :\001%s\001\r\n", to, msg);
}
static void
irc_nctcp (server *serv, char *to, char *msg)
{
tcp_sendf (serv, "NOTICE %s :\001%s\001\r\n", to, msg);
}
static void
irc_cycle (server *serv, char *channel, char *key)
{
tcp_sendf (serv, "PART %s\r\nJOIN %s %s\r\n", channel, channel, key);
}
static void
irc_kick (server *serv, char *channel, char *nick, char *reason)
{
if (reason[0])
tcp_sendf (serv, "KICK %s %s :%s\r\n", channel, nick, reason);
else
tcp_sendf (serv, "KICK %s %s\r\n", channel, nick);
}
static void
irc_invite (server *serv, char *channel, char *nick)
{
tcp_sendf (serv, "INVITE %s %s\r\n", nick, channel);
}
static void
irc_mode (server *serv, char *target, char *mode)
{
tcp_sendf (serv, "MODE %s %s\r\n", target, mode);
}
/* find channel info when joined */
static void
irc_join_info (server *serv, char *channel)
{
tcp_sendf (serv, "MODE %s\r\n", channel);
}
/* initiate userlist retreival */
static void
irc_user_list (server *serv, char *channel)
{
tcp_sendf (serv, "WHO %s\r\n", channel);
}
/* userhost */
static void
irc_userhost (server *serv, char *nick)
{
tcp_sendf (serv, "USERHOST %s\r\n", nick);
}
static void
irc_away_status (server *serv, char *channel)
{
if (serv->have_whox)
tcp_sendf (serv, "WHO %s %%ctnf,152\r\n", channel);
else
tcp_sendf (serv, "WHO %s\r\n", channel);
}
/*static void
irc_get_ip (server *serv, char *nick)
{
tcp_sendf (serv, "WHO %s\r\n", nick);
}*/
/*
* Command: WHOIS
* Parameters: [<server>] <nickmask>[,<nickmask>[,...]]
*/
static void
irc_user_whois (server *serv, char *nicks)
{
tcp_sendf (serv, "WHOIS %s\r\n", nicks);
}
static void
irc_message (server *serv, char *channel, char *text)
{
tcp_sendf (serv, "PRIVMSG %s :%s\r\n", channel, text);
}
static void
irc_action (server *serv, char *channel, char *act)
{
tcp_sendf (serv, "PRIVMSG %s :\001ACTION %s\001\r\n", channel, act);
}
static void
irc_notice (server *serv, char *channel, char *text)
{
tcp_sendf (serv, "NOTICE %s :%s\r\n", channel, text);
}
static void
irc_topic (server *serv, char *channel, char *topic)
{
if (!topic)
tcp_sendf (serv, "TOPIC %s :\r\n", channel);
else if (topic[0])
tcp_sendf (serv, "TOPIC %s :%s\r\n", channel, topic);
else
tcp_sendf (serv, "TOPIC %s\r\n", channel);
}
static void
irc_list_channels (server *serv, char *arg, int min_users)
{
if (arg[0])
{
tcp_sendf (serv, "LIST %s\r\n", arg);
return;
}
if (serv->use_listargs)
tcp_sendf (serv, "LIST >%d,<10000\r\n", min_users - 1);
else
tcp_send_len (serv, "LIST\r\n", 6);
}
static void
irc_names (server *serv, char *channel)
{
tcp_sendf (serv, "NAMES %s\r\n", channel);
}
static void
irc_change_nick (server *serv, char *new_nick)
{
tcp_sendf (serv, "NICK %s\r\n", new_nick);
}
static void
irc_ping (server *serv, char *to, char *timestring)
{
if (*to)
tcp_sendf (serv, "PRIVMSG %s :\001PING %s\001\r\n", to, timestring);
else
tcp_sendf (serv, "PING %s\r\n", timestring);
}
static int
irc_raw (server *serv, char *raw)
{
int len;
char tbuf[4096];
if (*raw)
{
len = strlen (raw);
if (len < sizeof (tbuf) - 3)
{
len = snprintf (tbuf, sizeof (tbuf), "%s\r\n", raw);
tcp_send_len (serv, tbuf, len);
} else
{
tcp_send_len (serv, raw, len);
tcp_send_len (serv, "\r\n", 2);
}
return TRUE;
}
return FALSE;
}
/* ============================================================== */
/* ======================= IRC INPUT ============================ */
/* ============================================================== */
static void
channel_date (session *sess, char *chan, char *timestr)
{
time_t timestamp = (time_t) atol (timestr);
char *tim = ctime (×tamp);
tim[24] = 0; /* get rid of the \n */
EMIT_SIGNAL (XP_TE_CHANDATE, sess, chan, tim, NULL, NULL, 0);
}
static void
process_numeric (session * sess, int n,
char *word[], char *word_eol[], char *text)
{
server *serv = sess->server;
/* show whois is the server tab */
session *whois_sess = serv->server_session;
/* unless this setting is on */
if (prefs.irc_whois_front)
whois_sess = serv->front_session;
switch (n)
{
case 1:
inbound_login_start (sess, word[3], word[1]);
/* if network is PTnet then you must get your IP address
from "001" server message */
if ((strncmp(word[7], "PTnet", 5) == 0) &&
(strncmp(word[8], "IRC", 3) == 0) &&
(strncmp(word[9], "Network", 7) == 0) &&
(strrchr(word[10], '@') != NULL))
{
serv->use_who = FALSE;
if (prefs.ip_from_server)
inbound_foundip (sess, strrchr(word[10], '@')+1);
}
/* use /NICKSERV */
if (strcasecmp (word[7], "DALnet") == 0 ||
strcasecmp (word[7], "BRASnet") == 0)
serv->nickservtype = 1;
/* use /NS */
else if (strcasecmp (word[7], "FreeNode") == 0)
serv->nickservtype = 2;
goto def;
case 4: /* check the ircd type */
serv->use_listargs = FALSE;
serv->modes_per_line = 3; /* default to IRC RFC */
if (strncmp (word[5], "bahamut", 7) == 0) /* DALNet */
{
serv->use_listargs = TRUE; /* use the /list args */
} else if (strncmp (word[5], "u2.10.", 6) == 0) /* Undernet */
{
serv->use_listargs = TRUE; /* use the /list args */
serv->modes_per_line = 6; /* allow 6 modes per line */
} else if (strncmp (word[5], "glx2", 4) == 0)
{
serv->use_listargs = TRUE; /* use the /list args */
}
goto def;
case 5:
inbound_005 (serv, word);
goto def;
case 263: /*Server load is temporarily too heavy */
if (fe_is_chanwindow (sess->server))
{
fe_chan_list_end (sess->server);
fe_message (word_eol[5] + 1, FE_MSG_ERROR);
}
goto def;
case 290: /* CAPAB reply */
if (strstr (word_eol[1], "IDENTIFY-MSG"))
{
serv->have_idmsg = TRUE;
break;
}
goto def;
case 301:
inbound_away (serv, word[4],
(word_eol[5][0] == ':') ? word_eol[5] + 1 : word_eol[5]);
break;
case 302:
if (serv->skip_next_userhost)
{
char *eq = strchr (word[4], '=');
if (eq)
{
*eq = 0;
if (!serv->p_cmp (word[4] + 1, serv->nick))
{
char *at = strrchr (eq + 1, '@');
if (at)
inbound_foundip (sess, at + 1);
}
}
serv->skip_next_userhost = FALSE;
break;
}
else goto def;
case 303:
word[4]++;
notify_markonline (serv, word);
break;
case 305:
inbound_uback (serv);
goto def;
case 306:
inbound_uaway (serv);
goto def;
case 312:
if (!serv->skip_next_whois)
EMIT_SIGNAL (XP_TE_WHOIS3, whois_sess, word[4], word_eol[5], NULL, NULL, 0);
else
inbound_user_info (sess, NULL, NULL, NULL, word[5], word[4], NULL, 0xff);
break;
case 311: /* WHOIS 1st line */
serv->inside_whois = 1;
inbound_user_info_start (sess, word[4]);
if (!serv->skip_next_whois)
EMIT_SIGNAL (XP_TE_WHOIS1, whois_sess, word[4], word[5],
word[6], word_eol[8] + 1, 0);
else
inbound_user_info (sess, NULL, word[5], word[6], NULL, word[4],
word_eol[8][0] == ':' ? word_eol[8] + 1 : word_eol[8], 0xff);
break;
case 314: /* WHOWAS */
inbound_user_info_start (sess, word[4]);
EMIT_SIGNAL (XP_TE_WHOIS1, whois_sess, word[4], word[5],
word[6], word_eol[8] + 1, 0);
break;
case 317:
if (!serv->skip_next_whois)
{
time_t timestamp = (time_t) atol (word[6]);
long idle = atol (word[5]);
char *tim;
char outbuf[64];
snprintf (outbuf, sizeof (outbuf),
"%02ld:%02ld:%02ld", idle / 3600, (idle / 60) % 60,
idle % 60);
if (timestamp == 0)
EMIT_SIGNAL (XP_TE_WHOIS4, whois_sess, word[4],
outbuf, NULL, NULL, 0);
else
{
tim = ctime (×tamp);
tim[19] = 0; /* get rid of the \n */
EMIT_SIGNAL (XP_TE_WHOIS4T, whois_sess, word[4],
outbuf, tim, NULL, 0);
}
}
break;
case 318: /* END OF WHOIS */
if (!serv->skip_next_whois)
EMIT_SIGNAL (XP_TE_WHOIS6, whois_sess, word[4], NULL,
NULL, NULL, 0);
serv->skip_next_whois = 0;
serv->inside_whois = 0;
break;
case 313:
case 319:
if (!serv->skip_next_whois)
EMIT_SIGNAL (XP_TE_WHOIS2, whois_sess, word[4],
word_eol[5] + 1, NULL, NULL, 0);
break;
case 307: /* dalnet version */
case 320: /* :is an identified user */
if (!serv->skip_next_whois)
EMIT_SIGNAL (XP_TE_WHOIS_ID, whois_sess, word[4],
word_eol[5] + 1, NULL, NULL, 0);
break;
case 321:
if (!fe_is_chanwindow (sess->server))
EMIT_SIGNAL (XP_TE_CHANLISTHEAD, serv->server_session, NULL, NULL, NULL, NULL, 0);
break;
case 322:
if (fe_is_chanwindow (sess->server))
{
fe_add_chan_list (sess->server, word[4], word[5], word_eol[6] + 1);
} else
{
PrintTextf (serv->server_session, "%-16s %-7d %s\017\n",
word[4], atoi (word[5]), word_eol[6] + 1);
}
break;
case 323:
if (!fe_is_chanwindow (sess->server))
EMIT_SIGNAL (XP_TE_SERVTEXT, serv->server_session, text, word[1], word[2], NULL, 0);
else
fe_chan_list_end (sess->server);
break;
case 324:
sess = find_channel (serv, word[4]);
if (!sess)
sess = serv->server_session;
if (sess->ignore_mode)
sess->ignore_mode = FALSE;
else
EMIT_SIGNAL (XP_TE_CHANMODES, sess, word[4], word_eol[5],
NULL, NULL, 0);
fe_update_mode_buttons (sess, 't', '-');
fe_update_mode_buttons (sess, 'n', '-');
fe_update_mode_buttons (sess, 's', '-');
fe_update_mode_buttons (sess, 'i', '-');
fe_update_mode_buttons (sess, 'p', '-');
fe_update_mode_buttons (sess, 'm', '-');
fe_update_mode_buttons (sess, 'l', '-');
fe_update_mode_buttons (sess, 'k', '-');
handle_mode (serv, word, word_eol, "", TRUE);
break;
case 329:
sess = find_channel (serv, word[4]);
if (sess)
{
if (sess->ignore_date)
sess->ignore_date = FALSE;
else
channel_date (sess, word[4], word[5]);
}
break;
case 330:
if (!serv->skip_next_whois)
EMIT_SIGNAL (XP_TE_WHOIS_AUTH, whois_sess, word[4],
word_eol[6] + 1, word[5], NULL, 0);
break;
case 332:
inbound_topic (serv, word[4],
(word_eol[5][0] == ':') ? word_eol[5] + 1 : word_eol[5]);
break;
case 333:
inbound_topictime (serv, word[4], word[5], atol (word[6]));
break;
#if 0
case 338: /* Undernet Real user@host, Real IP */
EMIT_SIGNAL (XP_TE_WHOIS_REALHOST, sess, word[4], word[5], word[6],
(word_eol[7][0]==':') ? word_eol[7]+1 : word_eol[7], 0);
break;
#endif
case 341: /* INVITE ACK */
EMIT_SIGNAL (XP_TE_UINVITE, sess, word[4], word[5], serv->servername,
NULL, 0);
break;
case 352: /* WHO */
{
unsigned int away = 0;
session *who_sess = find_channel (serv, word[4]);
if (*word[9] == 'G')
away = 1;
inbound_user_info (sess, word[4], word[5], word[6], word[7],
word[8], word_eol[11], away);
/* try to show only user initiated whos */
if (!who_sess || !who_sess->doing_who)
EMIT_SIGNAL (XP_TE_SERVTEXT, serv->server_session, text, word[1],
word[2], NULL, 0);
}
break;
case 354: /* undernet WHOX: used as a reply for irc_away_status */
{
unsigned int away = 0;
session *who_sess;
/* irc_away_status sends out a "152" */
if (!strcmp (word[4], "152"))
{
who_sess = find_channel (serv, word[5]);
if (*word[7] == 'G')
away = 1;
/* :SanJose.CA.us.undernet.org 354 z1 152 #zed1 z1 H@ */
inbound_user_info (sess, word[5], 0, 0, 0, word[6], 0, away);
/* try to show only user initiated whos */
if (!who_sess || !who_sess->doing_who)
EMIT_SIGNAL (XP_TE_SERVTEXT, serv->server_session, text,
word[1], word[2], NULL, 0);
} else
goto def;
}
break;
case 315: /* END OF WHO */
{
session *who_sess;
who_sess = find_channel (serv, word[4]);
if (who_sess)
{
if (!who_sess->doing_who)
EMIT_SIGNAL (XP_TE_SERVTEXT, serv->server_session, text,
word[1], word[2], NULL, 0);
who_sess->doing_who = FALSE;
} else
{
if (!serv->doing_dns)
EMIT_SIGNAL (XP_TE_SERVTEXT, serv->server_session, text,
word[1], word[2], NULL, 0);
serv->doing_dns = FALSE;
}
}
break;
case 348: /* +e-list entry */
if (!inbound_banlist (sess, atol (word[7]), word[4], word[5], word[6], TRUE))
goto def;
break;
case 349: /* end of exemption list */
sess = find_channel (serv, word[4]);
if (!sess)
{
sess = serv->front_session;
goto def;
}
if (!fe_is_banwindow (sess))
goto def;
fe_ban_list_end (sess, TRUE);
break;
case 353: /* NAMES */
inbound_nameslist (serv, word[5],
(word_eol[6][0] == ':') ? word_eol[6] + 1 : word_eol[6]);
break;
case 366:
if (!inbound_nameslist_end (serv, word[4]))
goto def;
break;
case 367: /* banlist entry */
inbound_banlist (sess, atol (word[7]), word[4], word[5], word[6], FALSE);
break;
case 368:
sess = find_channel (serv, word[4]);
if (!sess)
{
sess = serv->front_session;
goto def;
}
if (!fe_is_banwindow (sess))
goto def;
fe_ban_list_end (sess, FALSE);
break;
case 369: /* WHOWAS end */
case 406: /* WHOWAS error */
EMIT_SIGNAL (XP_TE_SERVTEXT, whois_sess, text, word[1], word[2], NULL, 0);
serv->inside_whois = 0;
break;
case 372: /* motd text */
case 375: /* motd start */
if (!prefs.skipmotd || serv->motd_skipped)
EMIT_SIGNAL (XP_TE_MOTD, serv->server_session, text, NULL, NULL,
NULL, 0);
break;
case 376: /* end of motd */
case 422: /* motd file is missing */
inbound_login_end (sess, text);
break;
case 433: /* nickname in use */
case 432: /* erroneous nickname */
if (serv->end_of_motd)
goto def;
inbound_next_nick (sess, word[4]);
break;
case 437:
if (serv->end_of_motd || is_channel (serv, word[4]))
goto def;
inbound_next_nick (sess, word[4]);
break;
case 471:
EMIT_SIGNAL (XP_TE_USERLIMIT, sess, word[4], NULL, NULL, NULL, 0);
break;
case 473:
EMIT_SIGNAL (XP_TE_INVITE, sess, word[4], NULL, NULL, NULL, 0);
break;
case 474:
EMIT_SIGNAL (XP_TE_BANNED, sess, word[4], NULL, NULL, NULL, 0);
break;
case 475:
EMIT_SIGNAL (XP_TE_KEYWORD, sess, word[4], NULL, NULL, NULL, 0);
break;
case 601:
notify_set_offline (serv, word[4], FALSE);
break;
case 605:
notify_set_offline (serv, word[4], TRUE);
break;
case 600:
case 604:
notify_set_online (serv, word[4]);
break;
default:
if (serv->inside_whois && word[4][0])
{
/* some unknown WHOIS reply, ircd coders make them up weekly */
if (!serv->skip_next_whois)
EMIT_SIGNAL (XP_TE_WHOIS_SPECIAL, whois_sess, word[4],
(word_eol[5][0] == ':') ? word_eol[5] + 1 : word_eol[5],
word[2], NULL, 0);
return;
}
def:
if (is_channel (serv, word[4]))
{
session *realsess = find_channel (serv, word[4]);
if (!realsess)
realsess = serv->server_session;
EMIT_SIGNAL (XP_TE_SERVTEXT, realsess, text, word[1], word[2], NULL, 0);
} else
{
EMIT_SIGNAL (XP_TE_SERVTEXT, serv->server_session, text, word[1],
word[2], NULL, 0);
}
}
}
/* handle named messages that starts with a ':' */
static void
process_named_msg (session *sess, char *type, pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */# SOME DESCRIPTIVE TITLE.
# This file is put in the public domain.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: HexChat\n"
"Report-Msgid-Bugs-To: www.hexchat.org\n"
"POT-Creation-Date: 2013-03-28 23:54+0100\n"
"PO-Revision-Date: 2013-03-28 23:04+0000\n"
"Last-Translator: bviktor <bviktor@hexchat.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: vi\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: src/common/cfgfiles.c:746
msgid "I'm busy"
msgstr "Tôi đang bận"
#: src/common/cfgfiles.c:773
msgid "Leaving"
msgstr "Tôi đi"
#: src/common/cfgfiles.c:834
msgid ""
"* Running IRC as root is stupid! You should\n"
" create a User Account and use that to login.\n"
msgstr "• Chạy IRC với tư cách người chủ (root) là không an toàn. •\nBạn nên tạo một tài khoản người dùng và sử dụng nó để đăng nhập.\n"
#: src/common/dcc.c:81
msgid "Waiting"
msgstr "Đang đời"
#: src/common/dcc.c:82
msgid "Active"
msgstr "Hoặt động"
#: src/common/dcc.c:83
msgid "Failed"
msgstr "Bị lỗi"
#: src/common/dcc.c:84
msgid "Done"
msgstr "Đã xong"
#: src/common/dcc.c:85 src/fe-gtk/menu.c:943
msgid "Connect"
msgstr "Kết nối"
#: src/common/dcc.c:86
msgid "Aborted"
msgstr "Bị hủy bỏ"
#: src/common/dcc.c:1885 src/common/outbound.c:2539
#, c-format
msgid "Cannot access %s\n"
msgstr "Không thể truy cập %s\n"
#: src/common/dcc.c:1886 src/common/text.c:1302 src/common/text.c:1340
#: src/common/text.c:1351 src/common/text.c:1358 src/common/text.c:1371
#: src/common/text.c:1388 src/common/text.c:1488 src/common/util.c:358
msgid "Error"
msgstr "Lỗi"
#: src/common/dcc.c:2364
#, c-format
msgid "%s is offering \"%s\". Do you want to accept?"
msgstr "%s đang cung cấp « %s ». Bạn có muốn chấp nhận không?"
#: src/common/dcc.c:2579
msgid "No active DCCs\n"
msgstr "Không có DCC (trò chuyện trực tiếp) hoặt động nào\n"
#: src/common/hexchat.c:842
msgid "_Open Dialog Window"
msgstr ""
#: src/common/hexchat.c:843
msgid "_Send a File"
msgstr ""
#: src/common/hexchat.c:844
msgid "_User Info (WhoIs)"
msgstr ""
#: src/common/hexchat.c:845
msgid "_Add to Friends List"
msgstr ""
#: src/common/hexchat.c:846
msgid "_Ignore"
msgstr ""
#: src/common/hexchat.c:847
msgid "O_perator Actions"
msgstr ""
#: src/common/hexchat.c:849
msgid "Give Ops"
msgstr "Cho quyền Quản trị"
#: src/common/hexchat.c:850
msgid "Take Ops"
msgstr "Bỏ quyền Quản trị"
#: src/common/hexchat.c:851
msgid "Give Voice"
msgstr "Cho quyền Tiếng nói"
#: src/common/hexchat.c:852
msgid "Take Voice"
msgstr "Bỏ quyền Tiếng nói"
#: src/common/hexchat.c:854
msgid "Kick/Ban"
msgstr "Đá/Đuổi"
#: src/common/hexchat.c:855 src/common/hexchat.c:892
msgid "Kick"
msgstr "Đá"
#: src/common/hexchat.c:856 src/common/hexchat.c:857 src/common/hexchat.c:858
#: src/common/hexchat.c:859 src/common/hexchat.c:860 src/common/hexchat.c:891
#: src/fe-gtk/banlist.c:60
msgid "Ban"
msgstr "Đuổi"
#: src/common/hexchat.c:861 src/common/hexchat.c:862 src/common/hexchat.c:863
#: src/common/hexchat.c:864
msgid "KickBan"
msgstr "Đá đuổi"
#: src/common/hexchat.c:874
msgid "Leave Channel"
msgstr "Rời kênh đi"
#: src/common/hexchat.c:875
msgid "Join Channel..."
msgstr "Vào kênh..."
#: src/common/hexchat.c:876 src/fe-gtk/menu.c:1336
msgid "Enter Channel to Join:"
msgstr "Nhập kênh cần vào :"
#: src/common/hexchat.c:877
msgid "Server Links"
msgstr "Liên kết máy phục vụ"
#: src/common/hexchat.c:878
msgid "Ping Server"
msgstr "Máy phục vụ Ping"
#: src/common/hexchat.c:879
msgid "Hide Version"
msgstr "Ẩn phiên bản"
#: src/common/hexchat.c:889
msgid "Op"
msgstr "QT"
#: src/common/hexchat.c:890
msgid "DeOp"
msgstr "BỏQT"
#: src/common/hexchat.c:893
msgid "bye"
msgstr "tạm biệt"
#: src/common/hexchat.c:894
#, c-format
msgid "Enter reason to kick %s:"
msgstr "Nhập lý do đá %s:"
#: src/common/hexchat.c:895
msgid "Sendfile"
msgstr "Gởi_tệp"
#: src/common/hexchat.c:896
msgid "Dialog"
msgstr "Đối thoại"
#: src/common/hexchat.c:905
msgid "WhoIs"
msgstr "Whois (là ai?)"
#: src/common/hexchat.c:906
msgid "Send"
msgstr "Gởi"
#: src/common/hexchat.c:907
msgid "Chat"
msgstr "Trò chuyện"
#: src/common/hexchat.c:908 src/fe-gtk/banlist.c:778
#: src/fe-gtk/ignoregui.c:400 src/fe-gtk/urlgrab.c:213
msgid "Clear"
msgstr "Xóa trống"
#: src/common/hexchat.c:909
msgid "Ping"
msgstr "Ping"
#: src/common/ignore.c:126 src/common/ignore.c:130 src/common/ignore.c:134
#: src/common/ignore.c:138 src/common/ignore.c:142 src/common/ignore.c:146
#: src/common/ignore.c:150
msgid "YES "
msgstr "CÓ "
#: src/common/ignore.c:128 src/common/ignore.c:132 src/common/ignore.c:136
#: src/common/ignore.c:140 src/common/ignore.c:144 src/common/ignore.c:148
#: src/common/ignore.c:152
msgid "NO "
msgstr "KHÔNG "
#: src/common/ignore.c:383
#, c-format
msgid "You are being CTCP flooded from %s, ignoring %s\n"
msgstr "Bạn đang bị tấn công bằng CTCP bởi %s nên bỏ qua %s.\n"
#: src/common/ignore.c:408
#, c-format
msgid "You are being MSG flooded from %s, setting gui_autoopen_dialog OFF.\n"
msgstr ""
#: src/common/notify.c:478
#, c-format
msgid " %-20s online\n"
msgstr " %-20s trực tuyến\n"
#: src/common/notify.c:480
#, c-format
msgid " %-20s offline\n"
msgstr " %-20s ngoạị tuyến\n"
#: src/common/outbound.c:72
msgid "No channel joined. Try /join #<channel>\n"
msgstr "Chưa vào kênh nào : hãy thử lệnh « /join #<kênh> »\n"
#: src/common/outbound.c:78
msgid "Not connected. Try /server <host> [<port>]\n"
msgstr "Chưa kêt nối: hãy thử lệnh « /server <máy> [<cổng>] »\n"
#: src/common/outbound.c:281
#, c-format
msgid "Server %s already exists on network %s.\n"
msgstr ""
#: src/common/outbound.c:287
#, c-format
msgid "Added server %s to network %s.\n"
msgstr ""
#: src/common/outbound.c:373
#, c-format
msgid "Already marked away: %s\n"
msgstr "Đã nhãn « Vắng mặt »: %s\n"
#: src/common/outbound.c:446
msgid "Already marked back.\n"
msgstr "Đã nhán « Trở về »:\n"
#: src/common/outbound.c:1812
msgid "I need /bin/sh to run!\n"
msgstr "Cần « /bin/sh » để chạy được.\n"
#: src/common/outbound.c:2203
msgid "Commands Available:"
msgstr "Các lệnh sẵn sàng:"
#: src/common/outbound.c:2217
msgid "User defined commands:"
msgstr "Các lệnh xác định riêng:"
#: src/common/outbound.c:2233
msgid "Plugin defined commands:"
msgstr "Các lệnh xác định bởi bổ sung:"
#: src/common/outbound.c:2244
msgid "Type /HELP <command> for more information, or /HELP -l"
msgstr "Hãy gõ lệnh « /HELP <lệnh> » để xem thông tin thêm (help: trợ giúp), hay « /HELP -l »."
#: src/common/outbound.c:2328
#, c-format
msgid "Unknown arg '%s' ignored."
msgstr "Không biết đối số « %s » nên bỏ qua nó."
#: src/common/outbound.c:3329
msgid "No such plugin found.\n"
msgstr "Không tìm thấy bổ sung như vậy.\n"
#: src/common/outbound.c:3334 src/fe-gtk/plugingui.c:190
msgid "That plugin is refusing to unload.\n"
msgstr "Bổ sung đó từ chối bỏ nặp.\n"
#: src/common/outbound.c:3609
msgid "ADDBUTTON <name> <action>, adds a button under the user-list"
msgstr "ADDBUTTON <tên> <hành_động>, _thêm_ một _cái nút_ bên dưới danh sách người dùng"
#: src/common/outbound.c:3610
msgid ""
"ADDSERVER <NewNetwork> <newserver/6667>, adds a new network with a new "
"server to the network list"
msgstr ""
#: src/common/outbound.c:3612
msgid "ALLCHAN <cmd>, sends a command to all channels you're in"
msgstr "ALLCHAN <lệnh>, gửi lệnh này tới _mọi kênh_ nơi bạn ở"
#: src/common/outbound.c:3614
msgid "ALLCHANL <cmd>, sends a command to all channels on the current server"
msgstr ""
#: src/common/outbound.c:3616
msgid "ALLSERV <cmd>, sends a command to all servers you're in"
msgstr "ALLSERV <lệnh>, gửi lệnh này tới _mọi máy phục vụ_ nơi bạn ở"
#: src/common/outbound.c:3617
msgid "AWAY [<reason>], sets you away"
msgstr "AWAY [<lý do>], đặt trang thái của bạn thành _vắng mặt_"
#: src/common/outbound.c:3618
msgid "BACK, sets you back (not away)"
msgstr "BACK đặt bạn đã trở về (không phải vắng mặt)"
#: src/common/outbound.c:3620
msgid ""
"BAN <mask> [<bantype>], bans everyone matching the mask from the current "
"channel. If they are already on the channel this doesn't kick them (needs "
"chanop)"
msgstr "BAN <bộ_lọc> [<kiểu_đuổi>], _đuổi_ mọi người khớp với bộ lọc này ra kênh hiện tại. Cần quyền quan trị kệnh (chanop) để đuổi ra người nào đang trên kênh"
#: src/common/outbound.c:3621
msgid "CHANOPT [-quiet] <variable> [<value>]"
msgstr ""
#: src/common/outbound.c:3622
msgid ""
"CHARSET [<encoding>], get or set the encoding used for the current "
"connection"
msgstr ""
#: src/common/outbound.c:3623
msgid "CLEAR [ALL|HISTORY], Clears the current text window or command history"
msgstr "CLEAR [ALL|HISTORY], _xoá trống_ cửa sổ văn bản (ALL: tất cả) hay _lịch sử_ lệnh (HISTORY) hiện có"
#: src/common/outbound.c:3624
msgid "CLOSE, Closes the current window/tab"
msgstr "CLOSE, _đóng_ cửa sổ/thẻ hiện có"
#: src/common/outbound.c:3627
msgid "COUNTRY [-s] <code|wildcard>, finds a country code, eg: au = australia"
msgstr "COUNTRY [-s] <mã|ký_tự_đại_diện>, tìm thấy _quốc gia_, v.d. mã « au » = Úc"
#: src/common/outbound.c:3629
msgid ""
"CTCP <nick> <message>, send the CTCP message to nick, common messages are "
"VERSION and USERINFO"
msgstr "CTCP <tên_hiệu> <tin_nhẳn>, gởi cho <tên_hiệu> <tin nhẳn> CTCP: hai tin nhẳn thường là VERSION (phiên bản) và USERINFO (thông tin người dùng)"
#: src/common/outbound.c:3631
msgid ""
"CYCLE [<channel>], parts the current or given channel and immediately "
"rejoins"
msgstr "CYCLE [<kênh>], rời kênh này hay kênh hiện tại rồi vào lại ngay (_quay lại_)"
#: src/common/outbound.c:3633
msgid ""
"\n"
"DCC GET <nick> - accept an offered file\n"
"DCC SEND [-maxcps=#] <nick> [file] - send a file to someone\n"
"DCC PSEND [-maxcps=#] <nick> [file] - send a file using passive mode\n"
"DCC LIST - show DCC list\n"
"DCC CHAT <nick> - offer DCC CHAT to someone\n"
"DCC PCHAT <nick> - offer DCC CHAT using passive mode\n"
"DCC CLOSE <type> <nick> <file> example:\n"
" /dcc close send johnsmith file.tar.gz"
msgstr "\nDCC GET <tên_hiệu> \t\tchấp nhận tập tin đã đưa ra (_lấy_)\nDCC SEND [-maxcps=#] <tên_hiệu> [tập_tin]\n\t_gởi_ [tập tin] cho <tên hiệu> (max. : tối đa)\nDCC PSEND [-maxcps=#] <tên_hiệu> [tập_tin]\n\t_gởi_ [tập_tin] cho <tên_hiệu> bằng chế độ _bị động_\nDCC LIST \t\t\t\thiển thị _danh sách_ DCC\nDCC CHAT <tên_hiệu> \tđưa ra _trò chuyện_ DCC với <tên hiệu>\nDCC PCHAT <tên_hiệu>\n\tđưa ra _trờ chuyện_ DCC với <tên_hiệu> bằng chế độ _bị động_\nDCC CLOSE <kiểu> <tên_hiệu> <tập_tin> (_đóng_) thí dụ:\n </dcc close send nguyenvan tập_tin.tar.gz>\n\tgởi cho người nguyenvan tập_tin.tar.gz rồi đóng kết nối DCC"
#: src/common/outbound.c:3645
msgid ""
"DEHOP <nick>, removes chanhalf-op status from the nick on the current "
"channel (needs chanop)"
msgstr "DEHOP <tên_hiệu>, bỏ ra <tên hiệu> trạng thái quản trị kênh nửa (chanhalf-op) trên kênh hiện tại (cần quyền quản trị kênh)\n[DE (bỏ ra) Half (nửa) OPerator (quản trị viên)]"
#: src/common/outbound.c:3647
msgid "DELBUTTON <name>, deletes a button from under the user-list"
msgstr "DELBUTTON <tên>, xóa bỏ cái nút <tên> ra dưới danh sách người dùng\n[DELete (xóa bỏ) BUTTON (nút)]"
#: src/common/outbound.c:3649
msgid ""
"DEOP <nick>, removes chanop status from the nick on the current channel "
"(needs chanop)"
msgstr "DEOP <tên_hiệu>, bỏ ra <tên hiệu> trạng thái quản trị kênh (chanop) trên kênh hiện tại (cần quyền quản trị kênh (chanop))\n[DE (bỏ) OPerator (quản trị viên)]"
#: src/common/outbound.c:3651
msgid ""
"DEVOICE <nick>, removes voice status from the nick on the current channel "
"(needs chanop)"
msgstr "DEVOICE <tên_hiệu>, bỏ ra <tên hiệu> trạng thái tiếng nói trên kênh hiện tại (cần quyền quản trị kênh [chanop])\n[DE (bỏ) VOICE (tiếng nói)]"
#: src/common/outbound.c:3652
msgid "DISCON, Disconnects from server"
msgstr "DISCON, ngắt kết nối ra máy phục vụ\n[DISCONnect (ngắt kết nối)]"
#: src/common/outbound.c:3653
msgid "DNS <nick|host|ip>, Finds a users IP number"
msgstr "DNS <tên_hiệu|máy_phục_vụ|ip>, tìm thấy địa chỉ IP của <ten hiệu>\n[Domain Name System (Hệ thống tên miền)]"
#: src/common/outbound.c:3654
msgid "ECHO <text>, Prints text locally"
msgstr "ECHO <đoạn>, in ra <đoạn> một cách địa phương\n[ECHO (vọng, phản hồi)]"
#: src/common/outbound.c:3657
msgid ""
"EXEC [-o] <command>, runs the command. If -o flag is used then output is "
"sent to current channel, else is printed to current text box"
msgstr "EXEC [-o] <lệnh>, chạy <lệnh>. Nếu thêm cờ « -o », gởi dữ liệu xuất cho kênh hiện tại, nếu không thì in ra nó vào hộp văn bản hiện tại\n[EXECute (thực hiện)]"
#: src/common/outbound.c:3659
msgid "EXECCONT, sends the process SIGCONT"
msgstr "EXECCONT, gởi tiến trình SIGCONT\n[EXECute (thực hiện) CONTinue (tiếp tục)\nSIGnal (tín hiệu) CONTinue (tiếp tục)]"
#: src/common/outbound.c:3662
msgid ""
"EXECKILL [-9], kills a running exec in the current session. If -9 is given "
"the process is SIGKILL'ed"
msgstr "EXECKILL [-9], buộc kết thúc tiến trình đang chạy trong phiên làm việc hiện tại. Nếu thêm cờ « -9 », SIGKILL tiến trình này\n[EXECute (thực hiện) KILL (buộc kết thúc)\nSIGnal (tín hiệu) KILL (buộc kết thúc)]"
#: src/common/outbound.c:3664
msgid "EXECSTOP, sends the process SIGSTOP"
msgstr "EXECSTOP, gởi tiến trình SIGSTOP\n[EXECute (thực hiện) STOP (dừng)\nSIGnal (tín hiệu) STOP (dừng)]"
#: src/common/outbound.c:3665
msgid "EXECWRITE, sends data to the processes stdin"
msgstr "EXECWRITE, gởi dữ liệu cho thiết bị nhập chuẩn của tiến trình\n[EXECute (thi hành) WRITE (ghi)]"
#: src/common/outbound.c:3669
msgid "EXPORTCONF, exports HexChat settings"
msgstr ""
#: src/common/outbound.c:3672
msgid "FLUSHQ, flushes the current server's send queue"
msgstr "FLUSHQ, xóa sạch hàng đợi gởi của máy phục vụ hiện tại\n[FLUSH (xoá sạch) Queue (hàng đời)]"
#: src/common/outbound.c:3674
msgid "GATE <host> [<port>], proxies through a host, port defaults to 23"
msgstr "GATE <máy_phục_vụ> [<cổng>], sử dụng máy ủy nhiệm; <cổng> mặc định là 23\n[GATE (cổng)]"
#: src/common/outbound.c:3678
msgid "GHOST <nick> [password], Kills a ghosted nickname"
msgstr ""
#: src/common/outbound.c:3683
msgid "HOP <nick>, gives chanhalf-op status to the nick (needs chanop)"
msgstr "HOP <tên_hiệu>, đưa ra <tên hiệu> trạng thái quản trị kênh nửa (cần quyền quản trị kênh [chanop])\n[Half (nửa) OPerator (quản trị viên)]"
#: src/common/outbound.c:3684
msgid "ID <password>, identifies yourself to nickserv"
msgstr "ID <mật_khẩu>, nhận diện bạn với máy phục vụ tên hiệu\n[IDentify (nhận diện)]"
#: src/common/outbound.c:3686
msgid ""
"IGNORE <mask> <types..> <options..>\n"
" mask - host mask to ignore, eg: *!*@*.aol.com\n"
" types - types of data to ignore, one or all of:\n"
" PRIV, CHAN, NOTI, CTCP, DCC, INVI, ALL\n"
" options - NOSAVE, QUIET"
msgstr "IGNORE <bộ_lọc> <kiểu...> <tùy_chọn...> »\n[IGNORE (bỏ qua)]\n bộ lọc\t\tbộ lọc máy cần bỏ qua, v.d. « *!*@*.aol.com »\n kiểu\t\tkiểu dữ liệu cần bỏ qua, giá trị là một hay tất cả của:\n \tPRIV\t\tPRIVate (riêng)\n\tCHAN\tCHANnel (kênh)\n\tNOTI\tNOTIfy, NOTIce (thông báo)\n\tCTCP\n\tDCC \tDirect Chat Channel (kênh trò chuyện trực tiếp)\n\tINVI\t\tINVIte (mời)\n\tALL \t\t(tất cả)\n tùy chọn\n\tNOSAVE \t(không lưu)\n\tQUIET \t(không hiện chi tiết)"
#: src/common/outbound.c:3693
msgid ""
"INVITE <nick> [<channel>], invites someone to a channel, by default the "
"current channel (needs chanop)"
msgstr "INVITE <tên_hiệu> [<kênh>], _mời_ <tên hiệu> vào <kênh>; mặc định là kênh hiện tại (cần quyền quản trị kênh [chanop])"
#: src/common/outbound.c:3694
msgid "JOIN <channel>, joins the channel"
msgstr "JOIN <kênh>, _vào_ <kênh>"
#: src/common/outbound.c:3696
msgid "KICK <nick>, kicks the nick from the current channel (needs chanop)"
msgstr "KICK <tên_hiệu>, _đá_ <tên hiệu> ra kênh hiện tại (cần quyền quản trị kênh [chanop])"
#: src/common/outbound.c:3698
msgid ""
"KICKBAN <nick>, bans then kicks the nick from the current channel (needs "
"chanop)"
msgstr "KICKBAN <tên_hiệu>, _đuổi_ rồi _đá_ <tên hiệu> ra kênh hiện tại (cần quyền quản trị kênh [chanop])"
#: src/common/outbound.c:3701
msgid "LAGCHECK, forces a new lag check"
msgstr "LAGCHECK, buộc _kiểm tra sự trễ_ mới"
#: src/common/outbound.c:3703
msgid ""
"LASTLOG [-h] [-m] [-r] [--] <string>, searches for a string in the buffer\n"
" Use -h to highlight the found string(s)\n"
" Use -m to match case\n"
" Use -r when string is a Regular Expression\n"
" Use -- (double hyphen) to end options when searching for, say, the string '-r'"
msgstr ""
#: src/common/outbound.c:3709
msgid "LOAD [-e] <file>, loads a plugin or script"
msgstr "LOAD [-e] <tập_tin>, _nạp_ một bổ sung hay tập lệnh"
#: src/common/outbound.c:3712
msgid ""
"MDEHOP, Mass deop's all chanhalf-ops in the current channel (needs chanop)"
msgstr "MDEHOP, bỏ trạng thái quản trị kênh nửa (chanhalf-op) ra mọi người trên kênh hiện tại (cần quyền quản trị kênh [chanop])\n[Mass (số nhiều) DE (bỏ) Half (nửa) OPerator (quản trị viên)]"
#: src/common/outbound.c:3714
msgid "MDEOP, Mass deop's all chanops in the current channel (needs chanop)"
msgstr "MDEOP, bỏ trạng thái quản trị kênh (chanop) ra mọi người trên kênh hiện tại (cần quyền quản trị kênh [chanop])\n[Mass (số nhiều) DE (bỏ) OPerator (quản trị viên)]"
#: src/common/outbound.c:3716
msgid ""
"ME <action>, sends the action to the current channel (actions are written in"
" the 3rd person, like /me jumps)"
msgstr "ME <hành_động>, gởi <hành động> cho kênh hiện tại (v.d. « /me jumps » gởi « <tên hiệu> nhảy »\n[ME (tôi, mình)]"
#: src/common/outbound.c:3720
msgid ""
"MKICK, Mass kicks everyone except you in the current channel (needs chanop)"
msgstr "MKICK, đá mọi người (trừ bạn) ra kênh hiện tại (cần quyền quản trị kênh [chanop])\n[Mass (số nhiều) KICK (đá)]"
#: src/common/outbound.c:3723
msgid "MOP, Mass op's all users in the current channel (needs chanop)"
msgstr "MOP, đưa ra mọi người dùng có trạng thái quản trị kênh (chanop) trên kênh hiện tại (cần quyền quản trị kênh [chanop])\n[Mass (số nhiều) OPerator (quản trị viên)]"
#: src/common/outbound.c:3724
msgid "MSG <nick> <message>, sends a private message"
msgstr "MSG <tên_hiệu> <tin_nhẳn>, gởi <tin nhẳn> riêng\n[MeSsaGe (tin nhẳn [viết tắt])]"
#: src/common/outbound.c:3727
msgid "NAMES, Lists the nicks on the current channel"
msgstr "NAMES, liệt kê _các tên_ hiệu trên kênh hiện tại"
#: src/common/outbound.c:3729
msgid "NCTCP <nick> <message>, Sends a CTCP notice"
msgstr "NCTCP <tên_hiệu> <tin_nhẳn>, gởi thông báo CTCP\n[Notice (thông báo) CTCP]"
#: src/common/outbound.c:3730
msgid "NEWSERVER [-noconnect] <hostname> [<port>]"
msgstr "NEWSERVER [-noconnect] <tên_máy> [<cổng>]\n[SERVER (máy phục vụ) NEW (mới); no connect (không kết nối)]"
#: src/common/outbound.c:3731
msgid "NICK <nickname>, sets your nick"
msgstr "NICK <tên_hiệu>, đặt <tên hiệu> của bạn\n[NICKname (tên hiệu [viết tắt])]"
#: src/common/outbound.c:3734
msgid ""
"NOTICE <nick/channel> <message>, sends a notice. Notices are a type of "
"message that should be auto reacted to"
msgstr "NOTICE <tên_hiệu/kênh> <thông_điệp>, gởi một _thông báo_: thông báo là kiểu thông điệp nên nhận trả lời tự động"
#: src/common/outbound.c:3736
msgid ""
"NOTIFY [-n network1[,network2,...]] [<nick>], displays your notify list or "
"adds someone to it"
msgstr "NOTIFY [-n mạng1[,mạng2,...]] [<tên_hiệu>], hiển thị danh sách _thông báo_ của bạn, hoặc thêm <tên_hiệu> vào nó"
#: src/common/outbound.c:3738
msgid "OP <nick>, gives chanop status to the nick (needs chanop)"
msgstr "OP <tên_hiệu>, đưa ra <tên hiệu> có trạng thái quản trị kênh (chanop) (cần quyền quản trị kênh [chanop])\n[OPerator (quản trị viên)]"
#: src/common/outbound.c:3740
msgid ""
"PART [<channel>] [<reason>], leaves the channel, by default the current one"
msgstr "PART [<kênh>] [<lý_do>], rời <kênh> đi; mặc định là kênh hiện tại\n[dePART (rời đi)]"
#: src/common/outbound.c:3742
msgid "PING <nick | channel>, CTCP pings nick or channel"
msgstr "PING <tên_hiệu | kênh>, thực hiện tiến trình « ping » CTCP với <tên hiêu> hay <kênh>\n[Tiến trình ping gửi chỉ một gói tin để thử ra nếu kết nối hoạt động hay không; nó gửi lại đến khi bạn ngắt nó.]"
#: src/common/outbound.c:3744
msgid "QUERY [-nofocus] <nick>, opens up a new privmsg window to someone"
msgstr "QUERY [-nofocus] <tên_hiệu>, mở một cửa sổ tin nhẳn riêng mới với <tên_hiệu>\n[QUERY (truy vấn); no focus (không có tiêu điểm)]"
#: src/common/outbound.c:3746
msgid "QUIT [<reason>], disconnects from the current server"
msgstr "QUIT [<lý_do>], ngắt kết nối ra máy phục vụ hiện tại\n[QUIT (_thoát_)]"
#: src/common/outbound.c:3748
msgid "QUOTE <text>, sends the text in raw form to the server"
msgstr "QUOTE <chuỗi>, gởi <chuỗi> dạng thô cho máy phục vụ\n[QUOTE (trích dẫn)]"
#: src/common/outbound.c:3751
msgid ""
"RECONNECT [-ssl] [<host>] [<port>] [<password>], Can be called just as "
"/RECONNECT to reconnect to the current server or with /RECONNECT ALL to "
"reconnect to all the open servers"
msgstr "RECONNECT [-ssl] [<máy>] [<cổng>] [<mật_khẩu>], có thể tái kết nối đến mấy phục vụ hiện tại khi chỉ đơn giản dùng « /RECONNECT », hoặc tái kết nối đến mọi máy phục vụ đang mở dùng « /RECONNECT ALL »\n[RECONNECT (tái kết nối); (phương pháp SSL bảo vệ dữ liệu cần truyền)]"
#: src/common/outbound.c:3754
msgid ""
"RECONNECT [<host>] [<port>] [<password>], Can be called just as /RECONNECT "
"to reconnect to the current server or with /RECONNECT ALL to reconnect to "
"all the open servers"
msgstr "RECONNECT [<máy>] [<cổng>] [<mật_khẩu>], có thể tái kết nối đến mấy phục vụ hiện tại chỉ đơn giản dùng « /RECONNECT », hoặc tái kết nối đến mọi máy phục vụ đang mở dùng « /RECONNECT ALL »\n[RECONNECT (tái kết nối); không có SSL bảo vệ dữ liệu)]"
#: src/common/outbound.c:3756
msgid ""
"RECV <text>, send raw data to HexChat, as if it was received from the IRC "
"server"
msgstr ""
#: src/common/outbound.c:3759
msgid "SAY <text>, sends the text to the object in the current window"
msgstr "SAY <chuỗi>, gởi <chuỗi> cho đối tượng trong cửa sổ hiện tại\n[SAY (_nói_)]"
#: src/common/outbound.c:3760
msgid "SEND <nick> [<file>]"
msgstr "SEND <tên_hiệu> [<tập_tin>], _gởi_ <tập tin> cho <tên hiệu>"
#: src/common/outbound.c:3763
msgid "SERVCHAN [-ssl] <host> <port> <channel>, connects and joins a channel"
msgstr "SERVCHAN [-ssl] <máy> <cổng> <kênh>, kết nối đến <kênh> rồi vào nó\n[SERVer (máy phục vụ) CHANnel (kênh); phương pháp SSL bảo vệ dữ liệu cần truyền)]"
#: src/common/outbound.c:3766
msgid "SERVCHAN <host> <port> <channel>, connects and joins a channel"
msgstr "SERVCHAN <máy> <cổng> <kênh>, kết nối đến <kênh> rồi vào nó\n[SERVer (máy phục vụ) CHANnel (kênh); không có SSL bảo vệ dữ liệu)]"
#: src/common/outbound.c:3770
msgid ""
"SERVER [-ssl] <host> [<port>] [<password>], connects to a server, the "
"default port is 6667 for normal connections, and 6697 for ssl connections"
msgstr ""
#: src/common/outbound.c:3773
msgid ""
"SERVER <host> [<port>] [<password>], connects to a server, the default port "
"is 6667"
msgstr "SERVER <máy> [<cổng>] [<mật_khẩu>], kết nối đến <mấy> phục vụ ; cổng mặc định là số 6667\n[SERVER (máy phục vụ); không có SSL bảo vệ dữ liệu)]"
#: src/common/outbound.c:3775
msgid "SET [-e] [-off|-on] [-quiet] <variable> [<value>]"
msgstr ""
#: src/common/outbound.c:3776
msgid "SETCURSOR [-|+]<position>, reposition the cursor in the inputbox"
msgstr ""
#: src/common/outbound.c:3777
msgid "SETTAB <new name>, change a tab's name, tab_trunc limit still applies"
msgstr ""
#: src/common/outbound.c:3778
msgid "SETTEXT <new text>, replace the text in the input box"
msgstr ""
#: src/common/outbound.c:3781
msgid ""
"TOPIC [<topic>], sets the topic if one is given, else shows the current "
"topic"
msgstr "TOPIC [<chủ_đè>], lập <chủ đề> nếu nó đã cho, nếu không thì hiển thị chủ đề hiện tại."
#: src/common/outbound.c:3783
msgid ""
"\n"
"TRAY -f <timeout> <file1> [<file2>] Blink tray between two icons.\n"
"TRAY -f <filename> Set tray to a fixed icon.\n"
"TRAY -i <number> Blink tray with an internal icon.\n"
"TRAY -t <text> Set the tray tooltip.\n"
"TRAY -b <title> <text> Set the tray balloon."
msgstr "\nTRAY -f <thời hạn> <tập tin 1> [<tập tin 2>] Chớp khay giữa hai biểu tượng.\nTRAY -f <tập tin> Đặt khay là biểu tượng riêng.\nTRAY -i <số> Chớp khay với biểu tượng bên trong.\nTRAY -t <chuỗi> Đặt mẹo công cụ của khay.\nTRAY -b <tựa> <chuỗi> Đặt khung thoại của khay."
#: src/common/outbound.c:3790
msgid "UNBAN <mask> [<mask>...], unbans the specified masks."
msgstr "UNBAN <bộ_lọc> [<bộ_lọc>...], bỏ trạng thái bị đuổi ra những bộ lọc đã ghi rõ\n[UN (hủy) BAN (đuổi)]"
#: src/common/outbound.c:3791
msgid "UNIGNORE <mask> [QUIET]"
msgstr "UNIGNORE <bộ_lọc> [QUIET]\n[UN (hủy) IGNORE (bỏ qua); QUIET (không hiện chi tiết)]"
#: src/common/outbound.c:3792
msgid "UNLOAD <name>, unloads a plugin or script"
msgstr "UNLOAD <tên>, bỏ nạp một bổ sung hay văn lệnh\n[UN (hủy) LOAD (nạp)]"
#: src/common/outbound.c:3793
msgid "URL <url>, opens a URL in your browser"
msgstr "URL <url>, mở địa chỉ <url> trong trình duyệt Mạng của bạn."
#: src/common/outbound.c:3795
msgid ""
"USELECT [-a] [-s] <nick1> <nick2> etc, highlights nick(s) in channel "
"userlist"
msgstr "USELECT [-a] [-s] <tên_hiệu1> <tên_hiệu2> v.v., tô sáng những tên hiệu này trong danh sách các người dùng trên kênh\n[User (người dùng) SELECT (lựa chọn)]"
#: src/common/outbound.c:3798
msgid "VOICE <nick>, gives voice status to someone (needs chanop)"
msgstr "VOICE <tên_hiệu>, đưa ra <tên hiệu> trạng thái _tiếng nói_ (cần quyền quản trị kênh [chanop])."
#: src/common/outbound.c:3800
msgid "WALLCHAN <message>, writes the message to all channels"
msgstr "WALLCHAN <thông_điệp>, ghi <thông_điệp> vào mọi kênh\n[Write (ghi) ALL (mọị) CHANnel (kênh)]"
#: src/common/outbound.c:3802
msgid ""
"WALLCHOP <message>, sends the message to all chanops on the current channel"
msgstr "WALLCHOP <thông_điệp>, gởi <thông_điệp> cho mọi quản trị kênh [chanop] trên kênh hiện tại\n[Write (ghi) ALL (mọi) CHannel (kênh) OPerator (quản trị viên)]"
#: src/common/outbound.c:3835
#, c-format
msgid "Usage: %s\n"
msgstr "Cách sử dụng: %s\n"
#: src/common/outbound.c:3840
msgid ""
"\n"
"No help available on that command.\n"
msgstr "\nKhông có trợ giúp về lệnh đó.\n"
#: src/common/outbound.c:3846
msgid "No such command.\n"
msgstr "Không có lệnh như vậy.\n"
#: src/common/outbound.c:4177
msgid "Bad arguments for user command.\n"
msgstr "Lệnh người dùng có đối số sai.\n"
#: src/common/outbound.c:4338
msgid "Too many recursive usercommands, aborting."
msgstr "Quá nhiều lệnh người dùng đệ qui nên hủy bỏ."
#: src/common/outbound.c:4421
msgid "Unknown Command. Try /help\n"
msgstr "Không biết lệnh này: bạn hãy thử lệnh « /help » (trợ giúp).\n"
#: src/common/plugin.c:383 src/common/plugin.c:424
msgid "No hexchat_plugin_init symbol; is this really a HexChat plugin?"
msgstr ""
#: src/common/server.c:643
msgid "Are you sure this is a SSL capable server and port?\n"
msgstr "Bạn có chắc điều này là máy phục vụ và cổng có khả năng SSL không?\n"
#: src/common/server.c:1011
#, c-format
msgid ""
"Cannot resolve hostname %s\n"
"Check your IP Settings!\n"
msgstr "Không tìm thấy tên máy %s.\nHãy kiểm tra thiết lập IP của bạn.\n"
#: src/common/server.c:1016
msgid "Proxy traversal failed.\n"
msgstr "Việc đi qua máy phục vụ ủy nhiệm bị lỗi.\n"
#: src/common/servlist.c:767
#, c-format
msgid "Cycling to next server in %s...\n"
msgstr "Đang quay lại đến mấy phục vụ kế tiếp trong %s...\n"
#: src/common/servlist.c:1252
#, c-format
msgid ""
"Warning: \"%s\" character set is unknown. No conversion will be applied for "
"network %s."
msgstr "Cảnh báo : không biết bộ ký tự « %s » nên không chuyển đổi cho mạng %s."
#: src/common/textevents.h:6
msgid "%C18*%O$t%C18$1%O added to notify list."
msgstr ""
#: src/common/textevents.h:9
msgid "%C22*%O$t%C22$1%O Banlist: %C18$2%O on %C24$4%O by %C26$3%O"
msgstr ""
#: src/common/textevents.h:12
msgid "%C22*%O$tCannot join %C22$1 %O(%C20You are banned%O)."
msgstr ""
#: src/common/textevents.h:18
msgid "%C29*%O$tCapabilities acknowledged: %C29$2%O"
msgstr ""
#: src/common/textevents.h:21
msgid "%C23*%O$tCapabilities supported: %C29$2%O"
msgstr ""
#: src/common/textevents.h:24
msgid "%C23*%O$tCapabilities requested: %C29$1%O"
msgstr ""
#: src/common/textevents.h:27
msgid "%C24*%O$t%C28$1%O is now known as %C18$2%O"
msgstr ""
#: src/common/textevents.h:36
msgid "%C22*%O$t%C26$1%O sets ban on %C18$2%O"
msgstr ""
#: src/common/textevents.h:39
msgid "%C22*%O$tChannel %C22$1%O created on %C24$2%O"
msgstr ""
#: src/common/textevents.h:42
msgid "%C22*%O$t%C26$1%O removes channel half-operator status from %C18$2%O"
msgstr ""
#: src/common/textevents.h:45
msgid "%C22*%O$t%C26$1%O removes channel operator status from %C18$2%O"
msgstr ""
#: src/common/textevents.h:48
msgid "%C22*%O$t%C26$1%O removes voice from %C18$2%O"
msgstr ""
#: src/common/textevents.h:51
msgid "%C22*%O$t%C26$1%C sets exempt on %C18$2%O"
msgstr ""
#: src/common/textevents.h:54
msgid "%C22*%O$t%C26$1%O gives channel half-operator status to %C18$2%O"
msgstr ""
#: src/common/textevents.h:57
msgid "%C22*%O$t%C26$1%C sets invite on %C18$2%O"
msgstr ""
#: src/common/textevents.h:60
msgid "%UChannel Users Topic"
msgstr "%UKênh \t Người Chủ đề"
#: src/common/textevents.h:66
msgid "%C22*%O$t%C26$1%O sets mode %C24$2$3%O on %C22$4%O"
msgstr ""
#: src/common/textevents.h:69
msgid "%C22*%O$tChannel %C22$1%O modes: %C24$2"
msgstr ""
#: src/common/textevents.h:78
msgid "%C22*%O$t%C26$1%O gives channel operator status to %C18$2%O"
msgstr ""
#: src/common/textevents.h:81
msgid "%C22*%O$t%C26$1%O removes exempt on %C18$2%O"
msgstr ""
#: src/common/textevents.h:84
msgid "%C22*%O$t%C26$1%O removes invite on %C18$2%O"
msgstr ""
#: src/common/textevents.h:87
msgid "%C22*%O$t%C26$1%O removes channel keyword"
msgstr ""
#: src/common/textevents.h:90
msgid "%C22*%O$t%C26$1%O removes user limit"
msgstr ""
#: src/common/textevents.h:93
msgid "%C22*%O$t%C26$1%O sets channel keyword to %C24$2%O"
msgstr ""
#: src/common/textevents.h:96
msgid "%C22*%O$t%C26$1%O sets channel limit to %C24$2%O"
msgstr ""
#: src/common/textevents.h:99
msgid "%C22*%O$t%C26$1%O removes ban on %C18$2%O"
msgstr ""
#: src/common/textevents.h:102
msgid "%C22*%O$t%C26$1%O gives voice to %C18$2%O"
msgstr ""
#: src/common/textevents.h:105
msgid "%C23*%O$tConnected. Now logging in."
msgstr ""
#: src/common/textevents.h:108
msgid "%C23*%O$tConnecting to %C29$1%C (%C23$2:$3%O)"
msgstr ""
#: src/common/textevents.h:111
msgid "%C20*%O$tConnection failed (%C20$1%O)"
msgstr ""
#: src/common/textevents.h:114
msgid "%C24*%O$tReceived a CTCP %C24$1%C from %C18$2%O"
msgstr ""
#: src/common/textevents.h:117
msgid "%C24*%C$tReceived a CTCP %C24$1%C from %C18$2%C (to %C22$3%C)%O"
msgstr ""
#: src/common/textevents.h:123
msgid "%C24*%O$tReceived a CTCP Sound %C24$1%C from %C18$2%O"
msgstr ""
#: src/common/textevents.h:126
msgid "%C24*%O$tReceived a CTCP Sound %C24$1%C from %C18$2%C (to %C22$3%O)"
msgstr ""
#: src/common/textevents.h:129
msgid "%C23*%O$tDCC CHAT to %C18$1%O aborted."
msgstr ""
#: src/common/textevents.h:132
msgid ""
"%C24*%O$tDCC CHAT connection established to %C18$1%C %C30[%C24$2%C30]%O"
msgstr ""
#: src/common/textevents.h:135
msgid "%C20*%O$tDCC CHAT to %C18$1%O lost (%C20$4%O)"
msgstr ""
#: src/common/textevents.h:138
msgid "%C24*%O$tReceived a DCC CHAT offer from %C18$1%O"
msgstr ""
#: src/common/textevents.h:141
msgid "%C24*%O$tOffering DCC CHAT to %C18$1%O"
msgstr ""
#: src/common/textevents.h:144
msgid "%C24*%O$tAlready offering CHAT to %C18$1%O"
msgstr ""
#: src/common/textevents.h:147
msgid "%C20*%O$tDCC $1 connect attempt to %C18$2%O failed (%C20$3%O)"
msgstr ""
#: src/common/textevents.h:150
msgid "%C23*%O$tReceived '%C23$1%C' from %C18$2%O"
msgstr ""
#: src/common/textevents.h:153
#, c-format
msgid "%C16,17 Type To/From Status Size Pos File "
msgstr ""
#: src/common/textevents.h:156
msgid