changeset 30507:093c79fa01c7

propagate from branch 'im.pidgin.pidgin' (head 0d33eae1cfd57cb5f459518ad5db14230f13792b) to branch 'im.pidgin.cpw.malu.xmpp.google_relay' (head 3dd0f0753787ede0cf7fd3266d03b324cf869053)
author Marcus Lundblad <ml@update.uu.se>
date Tue, 20 Oct 2009 22:31:57 +0000
parents d1c18bd588e2 (diff) e0796db1df8a (current diff)
children 2702ca44d963
files libpurple/media.c libpurple/protocols/jabber/google.c libpurple/protocols/jabber/jabber.c
diffstat 74 files changed, 2507 insertions(+), 2892 deletions(-) [+]
line wrap: on
line diff
--- a/AUTHORS	Wed Sep 30 21:31:04 2009 +0000
+++ b/AUTHORS	Tue Oct 20 22:31:57 2009 +0000
@@ -20,6 +20,7 @@
 Casey Harkins - Developer
 Gary 'grim' Kramlich - Developer
 Richard 'rlaager' Laager - Developer
+Sulabh 'sulabh_m' Mahajan - Developer
 Richard 'wabz' Nelson - Developer
 Christopher 'siege' O'Brien - Developer
 Bartosz Oler - Developer
--- a/COPYRIGHT	Wed Sep 30 21:31:04 2009 +0000
+++ b/COPYRIGHT	Tue Oct 20 22:31:57 2009 +0000
@@ -406,11 +406,10 @@
 Carsten Schaar
 Toby Schaffer
 Jonathan Schleifer <js-pidgin@webkeks.org>
-Matteo Settenvini
-Colin Seymour
 Luke Schierer
 Ralph Schmieder
 David Schmitt
+Heiko Schmitt
 Mark Schneider
 Evan Schoenberg
 Gabriel Schulhof
@@ -420,6 +419,8 @@
 Peter Seebach
 Don Seiler
 Leonardo Serra
+Matteo Settenvini
+Colin Seymour
 Jim Seymour
 Javeed Shaikh
 Joe Shaw
--- a/ChangeLog	Wed Sep 30 21:31:04 2009 +0000
+++ b/ChangeLog	Tue Oct 20 22:31:57 2009 +0000
@@ -1,18 +1,55 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.6.3 (??/??/20??):
+version 2.6.4 (??/??/20??):
+	libpurple:
+	* Actually emit the hold signal for media calls.
+
+	General:
+	* New 'plugins' sub-command to 'debug' command (i.e. '/debug plugins')
+	  to announce the list of loaded plugins (in both Finch and Pidgin).
+	* Fix building the GnuTLS plugin with older versions of GnuTLS.
+	* Fix DNS TXT query resolution.
+
+	MSN:
+	* Don't forget display names for buddies.
+	* Fix a random crash that might occur when idle.
+
 	XMPP:
+	* Users connecting to Google Talk now have an "Initiate Chat" context menu
+	  option for their buddies.  (Eion Robb)
 	* Fix a crash when attempting to validate an invalid JID.
 	* Resolve an issue when connecting to iChat Server when no resource
 	  is specified.
 	* Fix a crash when adding a buddy without an '@'.
 
+	Yahoo:
+	* Fix sending /buzz.
+	* Fix blocking behavior for federated (MSN/OCS/Sametime) service users.
+	  (Jason Cohen)
+	* Add support for adding OCS and Sametime buddies.  OCS users are added
+	  as "ocs/user@domain.tld" and Sametime users are added as
+	  "ibm/sametime_id".  (Jason Cohen)
+
+	Finch:
+	* The TinyURL plugin now creates shorter URLs for long non-conversation
+	  URLs, e.g. URLs to open Inbox in Yahoo/MSN protocols, or the Yahoo
+	  Captcha when joining chat rooms.
+
+	Pidgin:
+	* The userlist in a multiuser chat can be styled via gtkrc by using the
+	  widget name "pidgin_conv_userlist". (Heiko Schmitt)
+	* Add a hold button to the media window.
+
+version 2.6.3 (10/16/2009):
 	General:
-	* New 'plugins' sub-command to 'debug' command (i.e. '/debug plugins')
-	  to announce the list of loaded plugins (in both Finch and Pidgin).
 	* Fix a crash when performing DNS queries on Unixes that use the
 	  blocking DNS lookups.  (Brian Lu)
 
+	AIM and ICQ:
+	* Fix a crash when some clients send contacts in a format we don't
+	  understand.
+	* Fix blocking and other privacy lists.  (Thanks to AOL)
+
 version 2.6.2 (09/05/2009):
 	libpurple:
 	* Fix --disable-avahi to actually disable it in configure, as opposed
--- a/ChangeLog.API	Wed Sep 30 21:31:04 2009 +0000
+++ b/ChangeLog.API	Tue Oct 20 22:31:57 2009 +0000
@@ -1,5 +1,8 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 2.6.3 (10/16/2009):
+	No changes
+
 version 2.6.2 (09/05/2009):
 	Perl:
 		Added:
--- a/ChangeLog.win32	Wed Sep 30 21:31:04 2009 +0000
+++ b/ChangeLog.win32	Tue Oct 20 22:31:57 2009 +0000
@@ -1,3 +1,6 @@
+version 2.6.3 (10/16/2009):
+	* No changes
+
 version 2.6.2 (09/05/2009):
 	* No changes
 
--- a/NEWS	Wed Sep 30 21:31:04 2009 +0000
+++ b/NEWS	Tue Oct 20 22:31:57 2009 +0000
@@ -2,6 +2,11 @@
 
 Our development blog is available at: http://planet.pidgin.im
 
+2.6.3 (10/16/2009):
+	Mark: Someone reported a fairly serious bug in our AIM/ICQ code
+	so we're releasing a special "severe bug fix only" build.  See the
+	ChangeLog for details.  Enjoy!
+
 2.6.2 (09/05/2009):
 	Mark: Woo boy it's been a busy two weeks.  There was a lot of new code
 	in 2.6.0, and with new code comes new bugs.  The cadre of relentless
--- a/configure.ac	Wed Sep 30 21:31:04 2009 +0000
+++ b/configure.ac	Tue Oct 20 22:31:57 2009 +0000
@@ -46,7 +46,7 @@
 m4_define([purple_lt_current], [6])
 m4_define([purple_major_version], [2])
 m4_define([purple_minor_version], [6])
-m4_define([purple_micro_version], [3])
+m4_define([purple_micro_version], [4])
 m4_define([purple_version_suffix], [devel])
 m4_define([purple_version],
           [purple_major_version.purple_minor_version.purple_micro_version])
@@ -55,7 +55,7 @@
 m4_define([gnt_lt_current], [6])
 m4_define([gnt_major_version], [2])
 m4_define([gnt_minor_version], [6])
-m4_define([gnt_micro_version], [3])
+m4_define([gnt_micro_version], [4])
 m4_define([gnt_version_suffix], [devel])
 m4_define([gnt_version],
           [gnt_major_version.gnt_minor_version.gnt_micro_version])
@@ -1773,6 +1773,23 @@
         LIBS="$LIBS_save"
 fi
 
+if test "x$enable_gnutls" = "xyes"; then
+	AC_MSG_CHECKING(for GNUTLS_CERT_INSECURE_ALGORITHM)
+	LIBS_save="$LIBS"
+	LIBS="$LIBS $GNUTLS_LIBS"
+	CPPFLAGS_save="$CPPFLAGS"
+	CPPFLAGS="$CPPFLAGS $GNUTLS_CFLAGS"
+	AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <gnutls/gnutls.h>]],
+                                        [[unsigned int verify = GNUTLS_CERT_INSECURE_ALGORITHM;]])],
+	               [AC_DEFINE([HAVE_GNUTLS_CERT_INSECURE_ALGORITHM], 1,
+                                  [Define if your gnutls has the GNUTLS_CERT_INSECURE_ALGORITHM flag])
+	                AC_MSG_RESULT(yes)],
+	               [AC_MSG_RESULT(no)])
+	CPPFLAGS="$CPPFLAGS_save"
+        LIBS="$LIBS_save"
+fi
+
+
 AM_CONDITIONAL(USE_GNUTLS, test "x$enable_gnutls" = "xyes")
 
 
--- a/doc/pidgin.1.in	Wed Sep 30 21:31:04 2009 +0000
+++ b/doc/pidgin.1.in	Tue Oct 20 22:31:57 2009 +0000
@@ -628,6 +628,8 @@
 .br
   Richard 'rlaager' Laager (developer) <\fIrlaager@pidgin.im\fR>
 .br
+  Sulabh 'sulabh_m' Mahajan (developer)
+.br
   Richard 'wabz' Nelson (developer)
 .br
   Christopher 'siege' O'Brien (developer)
--- a/finch/gntblist.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/gntblist.c	Tue Oct 20 22:31:57 2009 +0000
@@ -1940,7 +1940,7 @@
 	} else if (!gnt_tree_is_searching(GNT_TREE(ggblist->tree))) {
 		if (strcmp(text, "t") == 0) {
 			finch_blist_toggle_tag_buddy(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree)));
-			gnt_bindable_perform_action_named(GNT_BINDABLE(ggblist->tree), "move-down");
+			gnt_bindable_perform_action_named(GNT_BINDABLE(ggblist->tree), "move-down", NULL);
 		} else if (strcmp(text, "a") == 0) {
 			finch_blist_place_tagged(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree)));
 		} else
--- a/finch/libgnt/gntbindable.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/libgnt/gntbindable.h	Tue Oct 20 22:31:57 2009 +0000
@@ -166,7 +166,7 @@
  *
  * @return  @c TRUE if the action was performed successfully, @c FALSE otherwise.
  */
-gboolean gnt_bindable_perform_action_named(GntBindable *bindable, const char *name, ...);
+gboolean gnt_bindable_perform_action_named(GntBindable *bindable, const char *name, ...) G_GNUC_NULL_TERMINATED;
 
 /**
  * Returns a GntTree populated with "key" -> "binding" for the widget.
--- a/finch/libgnt/gntbox.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/libgnt/gntbox.c	Tue Oct 20 22:31:57 2009 +0000
@@ -687,8 +687,8 @@
 		get_title_thingies(b, prev, &pos, &right);
 		mvwhline(w->window, 0, pos - 1, ACS_HLINE | gnt_color_pair(GNT_COLOR_NORMAL),
 				right - pos + 2);
-		g_free(prev);
 	}
+	g_free(prev);
 }
 
 void gnt_box_set_pad(GntBox *box, int pad)
--- a/finch/libgnt/gntcolors.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/libgnt/gntcolors.c	Tue Oct 20 22:31:57 2009 +0000
@@ -208,8 +208,10 @@
 				key = g_ascii_strdown(key, -1);
 				color = gnt_colors_get_color(key);
 				g_free(key);
-				if (color == -EINVAL)
+				if (color == -EINVAL) {
+					g_strfreev(list);
 					continue;
+				}
 
 				init_color(color, r, g, b);
 			}
@@ -251,8 +253,10 @@
 			int bg = gnt_colors_get_color(bgc);
 			g_free(fgc);
 			g_free(bgc);
-			if (fg == -EINVAL || bg == -EINVAL)
+			if (fg == -EINVAL || bg == -EINVAL) {
+				g_strfreev(list);
 				continue;
+			}
 
 			key = g_ascii_strdown(key, -1);
 
@@ -275,6 +279,7 @@
 			else if (strcmp(key, "urgent") == 0)
 				type = GNT_COLOR_URGENT;
 			else {
+				g_strfreev(list);
 				g_free(key);
 				continue;
 			}
--- a/finch/libgnt/gntentry.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/libgnt/gntentry.c	Tue Oct 20 22:31:57 2009 +0000
@@ -495,7 +495,7 @@
 {
 	GntEntry *entry = GNT_ENTRY(bind);
 	if (entry->ddown) {
-		gnt_bindable_perform_action_named(GNT_BINDABLE(entry->ddown), "move-down");
+		gnt_bindable_perform_action_named(GNT_BINDABLE(entry->ddown), "move-down", NULL);
 		return TRUE;
 	}
 	return show_suggest_dropdown(entry);
--- a/finch/libgnt/gntfilesel.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/libgnt/gntfilesel.c	Tue Oct 20 22:31:57 2009 +0000
@@ -176,9 +176,13 @@
 	splits = g_strsplit(path, G_DIR_SEPARATOR_S, -1);
 	for (i = 0, j = 0; splits[i]; i++) {
 		if (strcmp(splits[i], ".") == 0) {
+			g_free(splits[i]);
+			splits[i] = NULL;
 		} else if (strcmp(splits[i], "..") == 0) {
 			if (j)
 				j--;
+			g_free(splits[i]);
+			splits[i] = NULL;
 		} else {
 			if (i != j) {
 				g_free(splits[j]);
@@ -625,6 +629,7 @@
 
 	sel->files = gnt_tree_new_with_columns(2);  /* Name, Size */
 	gnt_tree_set_compare_func(GNT_TREE(sel->files), (GCompareFunc)g_utf8_collate);
+	gnt_tree_set_hash_fns(GNT_TREE(sel->files), g_str_hash, g_str_equal, g_free);
 	gnt_tree_set_column_titles(GNT_TREE(sel->files), "Filename", "Size");
 	gnt_tree_set_show_title(GNT_TREE(sel->files), TRUE);
 	gnt_tree_set_col_width(GNT_TREE(sel->files), 0, 25);
--- a/finch/libgnt/gnttextview.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/libgnt/gnttextview.c	Tue Oct 20 22:31:57 2009 +0000
@@ -767,6 +767,7 @@
 							line->segments = g_list_delete_link(line->segments, segs);
 							if (line->segments == NULL) {
 								free_text_line(line, NULL);
+								line = NULL;
 								if (view->list == iter) {
 									if (inext)
 										view->list = inext;
@@ -780,7 +781,8 @@
 							seg->start = tag->start;
 							seg->end = tag->end - change;
 						}
-						line->length -= change;
+						if (line)
+							line->length -= change;
 						/* XXX: Make things work if the tagged text spans over several lines. */
 					} else {
 						/* XXX: handle the rest of the conditions */
--- a/finch/libgnt/gntutils.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/libgnt/gntutils.c	Tue Oct 20 22:31:57 2009 +0000
@@ -374,6 +374,7 @@
 	gnt_widget_from_xmlnode(node, data, num);
 
 	xmlFreeDoc(doc);
+	xmlFreeParserCtxt(ctxt);
 	xmlCleanupParser();
 	va_end(list);
 	g_free(data);
@@ -470,6 +471,7 @@
 		xmlFreeDoc(doc);
 		ret = TRUE;
 	}
+	xmlFreeParserCtxt(ctxt);
 	xmlCleanupParser();
 	return ret;
 #endif
--- a/finch/plugins/gnttinyurl.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/finch/plugins/gnttinyurl.c	Tue Oct 20 22:31:57 2009 +0000
@@ -41,7 +41,10 @@
 #include <gntconv.h>
 
 #include <gntplugin.h>
+
+#include <gntlabel.h>
 #include <gnttextview.h>
+#include <gntwindow.h>
 
 static int tag_num = 0;
 
@@ -52,6 +55,8 @@
 	int num;
 } CbInfo;
 
+static void process_urls(PurpleConversation *conv, GList *urls);
+
 /* 3 functions from util.c */
 static gboolean
 badchar(char c)
@@ -83,7 +88,8 @@
 	return FALSE;
 }
 
-static GList *extract_urls(char *text) {
+static GList *extract_urls(const char *text)
+{
 	const char *t, *c, *q = NULL;
 	char *url_buf;
 	GList *ret = NULL;
@@ -142,7 +148,9 @@
 					url_buf = g_strndup(c, t - c);
 					if (!g_list_find_custom(ret, url_buf, (GCompareFunc)strcmp)) {
 						purple_debug_info("TinyURL", "Added URL %s\n", url_buf);
-						ret = g_list_append(ret, g_strdup(url_buf));
+						ret = g_list_append(ret, url_buf);
+					} else {
+						g_free(url_buf);
 					}
 					c = t;
 					break;
@@ -173,6 +181,8 @@
 						if (!g_list_find_custom(ret, url_buf, (GCompareFunc)strcmp)) {
 							purple_debug_info("TinyURL", "Added URL %s\n", url_buf);
 							ret = g_list_append(ret, url_buf);
+						} else {
+							g_free(url_buf);
 						}
 						c = t;
 						break;
@@ -207,10 +217,12 @@
 			gnt_text_view_tag_change(tv, data->tag, str, FALSE);
 			g_free(str);
 			g_free(data->tag);
+			g_free(data);
 			return;
 		}
 	}
 	g_free(data->tag);
+	g_free(data);
 	purple_debug_info("TinyURL", "Conversation no longer exists... :(\n");
 }
 
@@ -219,13 +231,14 @@
 	g_free(data);
 }
 
-static gboolean receiving_msg(PurpleAccount *account, char **sender, char **message,
-				PurpleConversation *conv, PurpleMessageFlags *flags) {
+static gboolean writing_msg(PurpleAccount *account, char *sender, char **message,
+				PurpleConversation *conv, PurpleMessageFlags flags)
+{
 	GString *t;
-	GList *iter, *urls;
+	GList *iter, *urls, *next;
 	int c = 0;
 
-	if (!(*flags & PURPLE_MESSAGE_RECV) || *flags & PURPLE_MESSAGE_INVISIBLE)
+	if ((flags & (PURPLE_MESSAGE_SEND | PURPLE_MESSAGE_INVISIBLE)))
 		return FALSE;
 
 	urls = purple_conversation_get_data(conv, "TinyURLs");
@@ -238,7 +251,8 @@
 
 	t = g_string_new(*message);
 	g_free(*message);
-	for (iter = urls; iter; iter = iter->next) {
+	for (iter = urls; iter; iter = next) {
+		next = iter->next;
 		if (g_utf8_strlen((char *)iter->data, -1) >= purple_prefs_get_int(PREF_LENGTH)) {
 			int pos, x = 0;
 			gchar *j, *s, *str, *orig;
@@ -256,36 +270,40 @@
 			g_free(str);
 			continue;
 		} else {
-			if (iter->prev) {
-				iter = iter->prev;
-				g_free(iter->next->data);
-				urls = g_list_delete_link(urls, iter->next);
-			} else {
-				g_free(iter->data);
-				g_list_free(urls);
-				urls = NULL;
-			}
+			g_free(iter->data);
+			urls = g_list_delete_link(urls, iter);
 		}
 	}
 	*message = t->str;
 	g_string_free(t, FALSE);
 	if (conv == NULL)
-		conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, *sender);
+		conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, sender);
 	purple_conversation_set_data(conv, "TinyURLs", urls);
 	return FALSE;
 }
 
-static void received_msg(PurpleAccount *account, char *sender, char *message,
-				PurpleConversation *conv, PurpleMessageFlags flags) {
+static void wrote_msg(PurpleAccount *account, char *sender, char *message,
+				PurpleConversation *conv, PurpleMessageFlags flags)
+{
+	GList *urls;
+
+	urls = purple_conversation_get_data(conv, "TinyURLs");
+	if ((flags & PURPLE_MESSAGE_SEND) || urls == NULL)
+		return;
+
+	process_urls(conv, urls);
+	purple_conversation_set_data(conv, "TinyURLs", NULL);
+}
+
+/* Frees 'urls' */
+static void
+process_urls(PurpleConversation *conv, GList *urls)
+{
+	GList *iter;
 	int c;
-	GList *urls, *iter;
 	FinchConv *fconv = FINCH_CONV(conv);
 	GntTextView *tv = GNT_TEXT_VIEW(fconv->tv);
 
-	urls = purple_conversation_get_data(conv, "TinyURLs");
-	if (!(flags & PURPLE_MESSAGE_RECV) || urls == NULL)
-		return;
-
 	for (iter = urls, c = 0; iter; iter = iter->next) {
 		int i;
 		CbInfo *cbdata;
@@ -312,7 +330,6 @@
 		g_free(url);
 	}
 	g_list_free(urls);
-	purple_conversation_set_data(conv, "TinyURLs", NULL);
 }
 
 static void
@@ -324,20 +341,75 @@
 	g_list_free(urls);
 }
 
+static void tinyurl_notify_fetch_cb(PurpleUtilFetchUrlData *urldata, gpointer cbdata,
+		const gchar *urltext, gsize len, const gchar *error)
+{
+	GntWidget *win = cbdata;
+	GntWidget *label = g_object_get_data(G_OBJECT(win), "info-widget");
+	char *message;
+
+	message = g_strdup_printf(_("TinyURL for above: %s"), urltext);
+	gnt_label_set_text(GNT_LABEL(label), message);
+	g_free(message);
+
+	g_signal_handlers_disconnect_matched(G_OBJECT(win), G_SIGNAL_MATCH_FUNC,
+			0, 0, NULL,
+			G_CALLBACK(purple_util_fetch_url_cancel), NULL);
+}
+
+static void *
+tinyurl_notify_uri(const char *uri)
+{
+	char *fullurl = NULL;
+	GntWidget *win;
+	PurpleUtilFetchUrlData *urlcb;
+
+	/* XXX: The following expects that finch_notify_message gets called. This
+	 * may not always happen, e.g. when another plugin sets its own
+	 * notify_message. So tread carefully. */
+	win = purple_notify_message(NULL, PURPLE_NOTIFY_URI, _("URI"), uri,
+			_("Please wait while TinyURL fetches a shorter URL ..."), NULL, NULL);
+	if (!GNT_IS_WINDOW(win) || !g_object_get_data(G_OBJECT(win), "info-widget"))
+		return win;
+
+	if (g_ascii_strncasecmp(uri, "http://", 7) && g_ascii_strncasecmp(uri, "https://", 8)) {
+		fullurl = g_strdup_printf("%shttp%%3A%%2F%%2F%s",
+				purple_prefs_get_string(PREF_URL), purple_url_encode(uri));
+	} else {
+		fullurl = g_strdup_printf("%s%s", purple_prefs_get_string(PREF_URL),
+				purple_url_encode(uri));
+	}
+
+	/* Store the return value of _fetch_url and destroy that when win is
+	   destroyed, so that the callback for _fetch_url does not try to molest a
+	   non-existent window */
+	urlcb = purple_util_fetch_url(fullurl, TRUE, "finch", FALSE, tinyurl_notify_fetch_cb, win);
+	g_free(fullurl);
+	g_signal_connect_swapped(G_OBJECT(win), "destroy",
+			G_CALLBACK(purple_util_fetch_url_cancel), urlcb);
+
+	return win;
+}
+
 static gboolean
-plugin_load(PurplePlugin *plugin) {
+plugin_load(PurplePlugin *plugin)
+{
+	PurpleNotifyUiOps *ops = purple_notify_get_ui_ops();
+	plugin->extra = ops->notify_uri;
+	ops->notify_uri = tinyurl_notify_uri;
+
 	purple_signal_connect(purple_conversations_get_handle(),
 			"wrote-im-msg",
-			plugin, PURPLE_CALLBACK(received_msg), NULL);
+			plugin, PURPLE_CALLBACK(wrote_msg), NULL);
 	purple_signal_connect(purple_conversations_get_handle(),
 			"wrote-chat-msg",
-			plugin, PURPLE_CALLBACK(received_msg), NULL);
+			plugin, PURPLE_CALLBACK(wrote_msg), NULL);
 	purple_signal_connect(purple_conversations_get_handle(),
-			"receiving-im-msg",
-			plugin, PURPLE_CALLBACK(receiving_msg), NULL);
+			"writing-im-msg",
+			plugin, PURPLE_CALLBACK(writing_msg), NULL);
 	purple_signal_connect(purple_conversations_get_handle(),
-			"receiving-chat-msg",
-			plugin, PURPLE_CALLBACK(receiving_msg), NULL);
+			"writing-chat-msg",
+			plugin, PURPLE_CALLBACK(writing_msg), NULL);
 	purple_signal_connect(purple_conversations_get_handle(),
 			"deleting-conversation",
 			plugin, PURPLE_CALLBACK(free_conv_urls), NULL);
@@ -345,6 +417,15 @@
 	return TRUE;
 }
 
+static gboolean
+plugin_unload(PurplePlugin *plugin)
+{
+	PurpleNotifyUiOps *ops = purple_notify_get_ui_ops();
+	if (ops->notify_uri == tinyurl_notify_uri)
+		ops->notify_uri = plugin->extra;
+	return TRUE;
+}
+
 static PurplePluginPrefFrame *
 get_plugin_pref_frame(PurplePlugin *plugin) {
 
@@ -394,7 +475,7 @@
 	"Richard Nelson <wabz@whatsbeef.net>",
 	PURPLE_WEBSITE,
 	plugin_load,
-	NULL,
+	plugin_unload,
 	NULL,
 	NULL,
 	NULL,
--- a/libpurple/account.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/account.c	Tue Oct 20 22:31:57 2009 +0000
@@ -1052,7 +1052,10 @@
 
 	priv = PURPLE_ACCOUNT_GET_PRIVATE(account);
 	PURPLE_DBUS_UNREGISTER_POINTER(priv->current_error);
-	g_free(priv->current_error);
+	if (priv->current_error) {
+		g_free(priv->current_error->description);
+		g_free(priv->current_error);
+	}
 	g_free(priv);
 
 	PURPLE_DBUS_UNREGISTER_POINTER(account);
--- a/libpurple/blist.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/blist.c	Tue Oct 20 22:31:57 2009 +0000
@@ -2009,18 +2009,14 @@
 
 	ops = purple_blist_get_ui_ops();
 
-	if (!purplebuddylist->root) {
-		purplebuddylist->root = gnode;
-
-		key = g_utf8_collate_key(group->name, -1);
-		g_hash_table_insert(groups_cache, key, group);
-		return;
+	/* if we're moving to overtop of ourselves, do nothing */
+	if (gnode == node) {
+		if (!purplebuddylist->root)
+			node = NULL;
+		else
+			return;
 	}
 
-	/* if we're moving to overtop of ourselves, do nothing */
-	if (gnode == node)
-		return;
-
 	if (purple_find_group(group->name)) {
 		/* This is just being moved */
 
--- a/libpurple/certificate.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/certificate.c	Tue Oct 20 22:31:57 2009 +0000
@@ -97,8 +97,8 @@
 			         "automatically checked.");
 			break;
 		case PURPLE_CERTIFICATE_CA_UNKNOWN:
-			return _("The root certificate this one claims to be issued by is "
-			         "unknown.");
+			return _("The certificate is not trusted because no certificate "
+			         "that can verify it is currently trusted.");
 			break;
 		case PURPLE_CERTIFICATE_NOT_ACTIVATED:
 			return _("The certificate is not valid yet.");
@@ -1402,13 +1402,15 @@
 		if (flags & PURPLE_CERTIFICATE_NAME_MISMATCH) {
 			gchar *sn = purple_certificate_get_subject_name(peer_crt);
 
-			g_string_append_printf(errors, _("The certificate claims to be "
-						"from \"%s\" instead. This could mean that you are "
-						"not connecting to the service you believe you are."),
-						sn);
-			g_free(sn);
+			if (sn) {
+				g_string_append_printf(errors, _("The certificate claims to be "
+							"from \"%s\" instead. This could mean that you are "
+							"not connecting to the service you believe you are."),
+							sn);
+				g_free(sn);
 
-			flags &= ~PURPLE_CERTIFICATE_NAME_MISMATCH;
+				flags &= ~PURPLE_CERTIFICATE_NAME_MISMATCH;
+			}
 		}
 
 		while (i != PURPLE_CERTIFICATE_LAST) {
--- a/libpurple/dnsquery.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/dnsquery.h	Tue Oct 20 22:31:57 2009 +0000
@@ -30,6 +30,11 @@
 #include "eventloop.h"
 #include "account.h"
 
+/**
+ * An opaque structure representing a DNS query.  The hostname and port
+ * associated with the query can be retrieved using
+ * purple_dnsquery_get_host() and purple_dnsquery_get_port().
+ */
 typedef struct _PurpleDnsQueryData PurpleDnsQueryData;
 
 /**
--- a/libpurple/dnssrv.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/dnssrv.c	Tue Oct 20 22:31:57 2009 +0000
@@ -361,8 +361,12 @@
 		/* TODO: Check return value */
 		if (query.type == T_SRV)
 			write(out, ret->data, sizeof(PurpleSrvResponse));
-		if (query.type == T_TXT)
-			write(out, ret->data, sizeof(PurpleTxtResponse));
+		if (query.type == T_TXT) {
+			PurpleTxtResponse *response = ret->data;
+			gsize l = strlen(response->content) + 1 /* null byte */;
+			write(out, &l, sizeof(l));
+			write(out, response->content, l);
+		}
 
 		g_free(ret->data);
 		ret = g_list_remove(ret, ret->data);
@@ -429,21 +433,38 @@
 					PurpleTxtCallback cb = query_data->cb.txt;
 					ssize_t red;
 					purple_debug_info("dnssrv","found %d TXT entries\n", size);
-					res = g_new0(PurpleTxtResponse, 1);
 					for (i = 0; i < size; i++) {
-						red = read(source, res, sizeof(PurpleTxtResponse));
-						if (red != sizeof(PurpleTxtResponse)) {
+						gsize len;
+
+						red = read(source, &len, sizeof(len));
+						if (red != sizeof(len)) {
 							purple_debug_error("dnssrv","unable to read txt "
-									"response: %s\n", g_strerror(errno));
+									"response length: %s\n", g_strerror(errno));
 							size = 0;
-							g_free(res);
 							g_list_foreach(responses, (GFunc)purple_txt_response_destroy, NULL);
 							g_list_free(responses);
 							responses = NULL;
 							break;
 						}
+
+						res = g_new0(PurpleTxtResponse, 1);
+						res->content = g_new0(gchar, len);
+
+						red = read(source, res->content, len);
+						if (red != len) {
+							purple_debug_error("dnssrv","unable to read txt "
+									"response: %s\n", g_strerror(errno));
+							size = 0;
+							purple_txt_response_destroy(res);
+							g_list_foreach(responses, (GFunc)purple_txt_response_destroy, NULL);
+							g_list_free(responses);
+							responses = NULL;
+							break;
+						}
+						responses = g_list_prepend(responses, res);
 					}
 
+					responses = g_list_reverse(responses);
 					cb(responses, query_data->extradata);
 				} else {
 					purple_debug_error("dnssrv", "type unknown of DNS result entry; errno is %i\n", errno);
@@ -674,6 +695,7 @@
 
 	internal_query.type = T_SRV;
 	strncpy(internal_query.query, query, 255);
+	internal_query.query[255] = '\0';
 
 	if (write(in[1], &internal_query, sizeof(internal_query)) < 0)
 		purple_debug_error("dnssrv", "Could not write to SRV resolver\n");
@@ -787,6 +809,7 @@
 
 	internal_query.type = T_TXT;
 	strncpy(internal_query.query, query, 255);
+	internal_query.query[255] = '\0';
 
 	if (write(in[1], &internal_query, sizeof(internal_query)) < 0)
 		purple_debug_error("dnssrv", "Could not write to TXT resolver\n");
--- a/libpurple/ft.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/ft.c	Tue Oct 20 22:31:57 2009 +0000
@@ -1030,7 +1030,7 @@
 				 * watcher.
 				 */
 				if (xfer->watcher != 0) {
-					purple_timeout_remove(xfer->watcher);
+					purple_input_remove(xfer->watcher);
 					xfer->watcher = 0;
 				}
 
--- a/libpurple/ft.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/ft.h	Tue Oct 20 22:31:57 2009 +0000
@@ -674,7 +674,7 @@
 void purple_xfer_ui_ready(PurpleXfer *xfer);
 
 /**
- * Allows the prpl to signal it's readh to send/receive data (depending on
+ * Allows the prpl to signal it's ready to send/receive data (depending on
  * the direction of the file transfer. Used when the prpl provides read/write
  * ops and cannot/does not provide a raw fd to the core.
  *
--- a/libpurple/media.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/media.c	Tue Oct 20 22:31:57 2009 +0000
@@ -103,6 +103,8 @@
 	gboolean initiator;
 	gboolean accepted;
 	gboolean candidates_prepared;
+	gboolean held;
+	gboolean paused;
 
 	GList *active_local_candidates;
 	GList *active_remote_candidates;
@@ -281,7 +283,7 @@
 			{ PURPLE_MEDIA_INFO_HOLD,
 					"PURPLE_MEDIA_INFO_HOLD", "hold" },
 			{ PURPLE_MEDIA_INFO_UNHOLD,
-					"PURPLE_MEDIA_INFO_HOLD", "unhold" },
+					"PURPLE_MEDIA_INFO_UNHOLD", "unhold" },
 			{ 0, NULL, NULL }
 		};
 		type = g_enum_register_static("PurpleMediaInfoType", values);
@@ -2330,11 +2332,46 @@
 		for (; streams; streams = g_list_delete_link(streams, streams)) {
 			PurpleMediaStream *stream = streams->data;
 			if (stream->session->type & PURPLE_MEDIA_SEND_VIDEO) {
+				stream->paused = active;
+
+				if (!stream->held)
+					g_object_set(stream->stream, "direction",
+							purple_media_to_fs_stream_direction(
+							stream->session->type & ((active) ?
+							~PURPLE_MEDIA_SEND_VIDEO :
+							PURPLE_MEDIA_VIDEO)), NULL);
+			}
+		}
+	} else if (local == TRUE && (type == PURPLE_MEDIA_INFO_HOLD ||
+			type == PURPLE_MEDIA_INFO_UNHOLD)) {
+		GList *streams;
+		gboolean active = (type == PURPLE_MEDIA_INFO_HOLD);
+
+		g_return_if_fail(PURPLE_IS_MEDIA(media));
+
+		streams = purple_media_get_streams(media,
+				session_id, participant);
+		for (; streams; streams = g_list_delete_link(streams, streams)) {
+			PurpleMediaStream *stream = streams->data;
+			stream->held = active;
+			if (stream->session->type & PURPLE_MEDIA_VIDEO) {
+				FsStreamDirection direction;
+
+				direction = ((active) ?
+						~PURPLE_MEDIA_VIDEO :
+						PURPLE_MEDIA_VIDEO);
+				if (!active && stream->paused)
+					direction &= ~PURPLE_MEDIA_SEND_VIDEO;
+
+				g_object_set(stream->stream, "direction",
+						purple_media_to_fs_stream_direction(
+						stream->session->type & direction), NULL);
+			} else if (stream->session->type & PURPLE_MEDIA_AUDIO) {
 				g_object_set(stream->stream, "direction",
 						purple_media_to_fs_stream_direction(
 						stream->session->type & ((active) ?
-						~PURPLE_MEDIA_SEND_VIDEO :
-						PURPLE_MEDIA_VIDEO)), NULL);
+						~PURPLE_MEDIA_AUDIO :
+						PURPLE_MEDIA_AUDIO)), NULL);
 			}
 		}
 	}
--- a/libpurple/plugins/perl/common/Prpl.xs	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/plugins/perl/common/Prpl.xs	Tue Oct 20 22:31:57 2009 +0000
@@ -62,11 +62,15 @@
 PREINIT:
 	PurplePluginProtocolInfo *prpl_info;
 CODE:
-	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
-	if (prpl_info && prpl_info->send_raw != NULL) {
-		RETVAL = prpl_info->send_raw(gc, str, strlen(str));
-	} else {
+	if (!gc)
 		RETVAL = 0;
+	else {
+		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
+		if (prpl_info && prpl_info->send_raw != NULL) {
+			RETVAL = prpl_info->send_raw(gc, str, strlen(str));
+		} else {
+			RETVAL = 0;
+		}
 	}
 OUTPUT:
 	RETVAL
--- a/libpurple/plugins/perl/perl.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/plugins/perl/perl.c	Tue Oct 20 22:31:57 2009 +0000
@@ -621,6 +621,9 @@
 			g_free(gps);
 			plugin->info->extra_info = NULL;
 		}
+
+		g_free(plugin->info);
+		plugin->info = NULL;
 	}
 }
 
--- a/libpurple/plugins/ssl/ssl-gnutls.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/plugins/ssl/ssl-gnutls.c	Tue Oct 20 22:31:57 2009 +0000
@@ -698,9 +698,8 @@
 			crt_issuer_id =
 				purple_certificate_get_issuer_unique_id(crt);
 			purple_debug_info("gnutls/x509",
-					  "Certificate for %s claims to be "
-					  "issued by %s, but the certificate "
-					  "for %s does not match.\n",
+					  "Certificate %s is issued by "
+					  "%s, which does not match %s.\n",
 					  crt_id ? crt_id : "(null)",
 					  crt_issuer_id ? crt_issuer_id : "(null)",
 					  issuer_id ? issuer_id : "(null)");
@@ -730,6 +729,7 @@
 		return FALSE;
 	}
 
+#ifdef HAVE_GNUTLS_CERT_INSECURE_ALGORITHM
 	if (verify & GNUTLS_CERT_INSECURE_ALGORITHM) {
 		/*
 		 * A certificate in the chain is signed with an insecure
@@ -743,6 +743,7 @@
 				"Insecure hash algorithm used by %s to sign %s\n",
 				issuer_id, crt_id);
 	}
+#endif
 
 	if (verify & GNUTLS_CERT_INVALID) {
 		/* Signature didn't check out, but at least
--- a/libpurple/protocols/jabber/bosh.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/bosh.c	Tue Oct 20 22:31:57 2009 +0000
@@ -401,7 +401,8 @@
 
 void jabber_bosh_connection_close(PurpleBOSHConnection *conn)
 {
-	jabber_bosh_connection_send(conn, PACKET_TERMINATE, NULL);
+	if (conn->state == BOSH_CONN_ONLINE)
+		jabber_bosh_connection_send(conn, PACKET_TERMINATE, NULL);
 }
 
 static gboolean jabber_bosh_connection_error_check(PurpleBOSHConnection *conn, xmlnode *node) {
--- a/libpurple/protocols/jabber/buddy.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Tue Oct 20 22:31:57 2009 +0000
@@ -38,6 +38,7 @@
 #include "xdata.h"
 #include "pep.h"
 #include "adhoccommands.h"
+#include "google.h"
 
 typedef struct {
 	long idle_seconds;
@@ -1149,9 +1150,8 @@
 				char *bintext = NULL;
 				xmlnode *binval;
 
-				if( ((binval = xmlnode_get_child(child, "BINVAL")) &&
-						(bintext = xmlnode_get_data(binval))) ||
-						(bintext = xmlnode_get_data(child))) {
+				if ((binval = xmlnode_get_child(child, "BINVAL")) &&
+						(bintext = xmlnode_get_data(binval))) {
 					gsize size;
 					guchar *data;
 					gboolean photo = (strcmp(child->name, "PHOTO") == 0);
@@ -1843,6 +1843,13 @@
 		m = g_list_append(m, act);
 	}
 
+	if (js->googletalk) {
+		act = purple_menu_action_new(_("Initiate _Chat"),
+		                           PURPLE_CALLBACK(google_buddy_node_chat),
+		                           NULL, NULL);
+		m = g_list_append(m, act);
+	}
+
 	/*
 	 * This if-condition implements parts of XEP-0100: Gateway Interaction
 	 *
--- a/libpurple/protocols/jabber/chat.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/chat.c	Tue Oct 20 22:31:57 2009 +0000
@@ -106,7 +106,7 @@
 	{
 		char *room_jid = g_strdup_printf("%s@%s", room, server);
 
-		chat = g_hash_table_lookup(js->chats, jabber_normalize(NULL, room_jid));
+		chat = g_hash_table_lookup(js->chats, room_jid);
 		g_free(room_jid);
 	}
 
@@ -177,10 +177,21 @@
 		xmlnode_insert_data(body, msg, -1);
 	} else {
 		xmlnode_set_attrib(message, "to", name);
+		/*
+		 * Putting the reason into the body was an 'undocumented protocol,
+		 * ...not part of "groupchat 1.0"'.
+		 * http://xmpp.org/extensions/attic/jep-0045-1.16.html#invite
+		 *
+		 * Left here for compatibility.
+		 */
 		body = xmlnode_new_child(message, "body");
 		xmlnode_insert_data(body, msg, -1);
+
 		x = xmlnode_new_child(message, "x");
 		xmlnode_set_attrib(x, "jid", room_jid);
+
+		/* The better place for it! XEP-0249 style. */
+		xmlnode_set_attrib(x, "reason", msg);
 		xmlnode_set_namespace(x, "jabber:x:conference");
 	}
 
@@ -209,19 +220,98 @@
 	g_hash_table_insert(hash_table, g_strdup(key), g_strdup(value));
 }
 
-void jabber_chat_join(PurpleConnection *gc, GHashTable *data)
+static JabberChat *jabber_chat_new(JabberStream *js, const char *room,
+                                   const char *server, const char *handle,
+                                   const char *password, GHashTable *data)
 {
 	JabberChat *chat;
-	char *room, *server, *handle, *passwd;
+	char *jid;
+
+	if (jabber_chat_find(js, room, server) != NULL)
+		return NULL;
+
+	chat = g_new0(JabberChat, 1);
+	chat->js = js;
+
+	chat->room = g_strdup(room);
+	chat->server = g_strdup(server);
+	chat->handle = g_strdup(handle);
+
+	/* Copy the data hash table to chat->components */
+	chat->components = g_hash_table_new_full(g_str_hash, g_str_equal,
+			g_free, g_free);
+	if (data == NULL) {
+		g_hash_table_insert(chat->components, g_strdup("handle"), g_strdup(handle));
+		g_hash_table_insert(chat->components, g_strdup("room"), g_strdup(room));
+		g_hash_table_insert(chat->components, g_strdup("server"), g_strdup(server));
+		/* g_hash_table_insert(chat->components, g_strdup("password"), g_strdup(server)); */
+	} else {
+		g_hash_table_foreach(data, insert_in_hash_table, chat->components);
+	}
+
+	chat->members = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
+			(GDestroyNotify)jabber_chat_member_free);
+
+	jid = g_strdup_printf("%s@%s", room, server);
+	g_hash_table_insert(js->chats, jid, chat);
+
+	return chat;
+}
+
+JabberChat *jabber_join_chat(JabberStream *js, const char *room,
+                             const char *server, const char *handle,
+                             const char *password, GHashTable *data)
+{
+	JabberChat *chat;
+
+	PurpleConnection *gc;
+	PurpleAccount *account;
+	PurpleStatus *status;
+
 	xmlnode *presence, *x;
-	char *tmp, *room_jid, *full_jid;
-	JabberStream *js = gc->proto_data;
-	PurplePresence *gpresence;
-	PurpleStatus *status;
 	JabberBuddyState state;
 	char *msg;
 	int priority;
 
+	char *jid;
+
+	chat = jabber_chat_new(js, room, server, handle, password, data);
+	if (chat == NULL)
+		return NULL;
+
+	gc = js->gc;
+	account = purple_connection_get_account(gc);
+	status = purple_account_get_active_status(account);
+	purple_status_to_jabber(status, &state, &msg, &priority);
+
+	presence = jabber_presence_create_js(js, state, msg, priority);
+	g_free(msg);
+
+	jid = g_strdup_printf("%s@%s/%s", room, server, handle);
+	xmlnode_set_attrib(presence, "to", jid);
+	g_free(jid);
+
+	x = xmlnode_new_child(presence, "x");
+	xmlnode_set_namespace(x, "http://jabber.org/protocol/muc");
+
+	if (password && *password) {
+		xmlnode *p = xmlnode_new_child(x, "password");
+		xmlnode_insert_data(p, password, -1);
+	}
+
+	jabber_send(js, presence);
+	xmlnode_free(presence);
+
+	return chat;
+}
+
+void jabber_chat_join(PurpleConnection *gc, GHashTable *data)
+{
+	char *room, *server, *handle, *passwd;
+	JabberID *jid;
+	JabberStream *js = gc->proto_data;
+	char *tmp;
+
 	room = g_hash_table_lookup(data, "room");
 	server = g_hash_table_lookup(data, "server");
 	handle = g_hash_table_lookup(data, "handle");
@@ -256,51 +346,23 @@
 		return;
 	}
 
-	if(jabber_chat_find(js, room, server))
-		return;
-
+	/* Normalize the room and server parameters */
 	tmp = g_strdup_printf("%s@%s", room, server);
-	room_jid = g_strdup(jabber_normalize(NULL, tmp));
+	jid = jabber_id_new(tmp);
 	g_free(tmp);
 
-	chat = g_new0(JabberChat, 1);
-	chat->js = gc->proto_data;
-
-	chat->room = g_strdup(room);
-	chat->server = g_strdup(server);
-	chat->handle = g_strdup(handle);
-
-	/* Copy the data hash table to chat->components */
-	chat->components = g_hash_table_new_full(g_str_hash, g_str_equal,
-			g_free, g_free);
-	g_hash_table_foreach(data, insert_in_hash_table, chat->components);
-
-	chat->members = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
-			(GDestroyNotify)jabber_chat_member_free);
-
-	g_hash_table_insert(js->chats, room_jid, chat);
+	if (jid == NULL) {
+		/* TODO: Error message */
 
-	gpresence = purple_account_get_presence(gc->account);
-	status = purple_presence_get_active_status(gpresence);
-
-	purple_status_to_jabber(status, &state, &msg, &priority);
-
-	presence = jabber_presence_create_js(js, state, msg, priority);
-	full_jid = g_strdup_printf("%s/%s", room_jid, handle);
-	xmlnode_set_attrib(presence, "to", full_jid);
-	g_free(full_jid);
-	g_free(msg);
-
-	x = xmlnode_new_child(presence, "x");
-	xmlnode_set_namespace(x, "http://jabber.org/protocol/muc");
-
-	if(passwd && *passwd) {
-		xmlnode *password = xmlnode_new_child(x, "password");
-		xmlnode_insert_data(password, passwd, -1);
+		g_return_if_reached();
 	}
 
-	jabber_send(js, presence);
-	xmlnode_free(presence);
+	/*
+	 * Now that we've done all that nice core-interface stuff, let's join
+	 * this room!
+	 */
+	jabber_join_chat(js, jid->node, jid->domain, handle, passwd, data);
+	jabber_id_free(jid);
 }
 
 void jabber_chat_leave(PurpleConnection *gc, int id)
@@ -322,7 +384,7 @@
 	JabberStream *js = chat->js;
 	char *room_jid = g_strdup_printf("%s@%s", chat->room, chat->server);
 
-	g_hash_table_remove(js->chats, jabber_normalize(NULL, room_jid));
+	g_hash_table_remove(js->chats, room_jid);
 	g_free(room_jid);
 }
 
--- a/libpurple/protocols/jabber/chat.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/chat.h	Tue Oct 20 22:31:57 2009 +0000
@@ -57,6 +57,21 @@
 GList *jabber_chat_info(PurpleConnection *gc);
 GHashTable *jabber_chat_info_defaults(PurpleConnection *gc, const char *chat_name);
 char *jabber_get_chat_name(GHashTable *data);
+
+/**
+ * in-prpl function for joining a chat room. Doesn't require sticking goop
+ * into a hash table.
+ *
+ * @param room     The room to join. This MUST be normalized already.
+ * @param server   The server the room is on. This MUST be normalized already.
+ * @param password The password (if required) to join the room. May be NULL.
+ * @param data     The chat hash table.  May be NULL (it will be generated
+ *                 for current core<>prpl API interface.)
+ */
+JabberChat *jabber_join_chat(JabberStream *js, const char *room,
+                             const char *server, const char *handle,
+                             const char *password, GHashTable *data);
+
 void jabber_chat_join(PurpleConnection *gc, GHashTable *data);
 JabberChat *jabber_chat_find(JabberStream *js, const char *room,
 		const char *server);
--- a/libpurple/protocols/jabber/google.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/google.c	Tue Oct 20 22:31:57 2009 +0000
@@ -31,6 +31,7 @@
 #include "jabber.h"
 #include "presence.h"
 #include "iq.h"
+#include "chat.h"
 
 #include "jingle/jingle.h"
 
@@ -97,14 +98,14 @@
 		gchar *participant, GoogleSession *session)
 {
 	GList *candidates = purple_media_get_local_candidates(
-			session->media, session_id, session->remote_jid);
+			session->media, session_id, session->remote_jid), *iter;
 	PurpleMediaCandidate *transport;
 	gboolean video = FALSE;
 
 	if (!strcmp(session_id, "google-video"))
 		video = TRUE;
 
-	for (;candidates;candidates = candidates->next) {
+	for (iter = candidates; iter; iter = iter->next) {
 		JabberIq *iq;
 		gchar *ip, *port, *username, *password;
 		gchar pref[16];
@@ -112,7 +113,7 @@
 		xmlnode *sess;
 		xmlnode *candidate;
 		guint component_id;
-		transport = (PurpleMediaCandidate*)(candidates->data);
+		transport = PURPLE_MEDIA_CANDIDATE(iter->data);
 		component_id = purple_media_candidate_get_component_id(
 				transport);
 
@@ -170,6 +171,7 @@
 
 		jabber_iq_send(iq);
 	}
+	purple_media_candidate_list_free(candidates);
 }
 
 static void
@@ -1607,3 +1609,43 @@
 	purple_debug_info("jabber", "sending google:jingleinfo query\n");
 	jabber_iq_send(jingle_info);
 }
+
+void google_buddy_node_chat(PurpleBlistNode *node, gpointer data)
+{
+	PurpleBuddy *buddy;
+	PurpleConnection *gc;
+	JabberStream *js;
+	JabberChat *chat;
+	gchar *room;
+	guint32 tmp, a, b;
+
+	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
+
+	buddy = PURPLE_BUDDY(node);
+	gc = purple_account_get_connection(purple_buddy_get_account(buddy));
+	g_return_if_fail(gc != NULL);
+	js = purple_connection_get_protocol_data(gc);
+
+	/* Generate a version 4 UUID */
+	tmp = g_random_int();
+	a = 0x4000 | (tmp & 0xFFF); /* 0x4000 to 0x4FFF */
+	tmp >>= 12;
+	b = ((1 << 3) << 12) | (tmp & 0x3FFF); /* 0x8000 to 0xBFFF */
+
+	tmp = g_random_int();
+	room = g_strdup_printf("private-chat-%08x-%04x-%04x-%04x-%04x%08x",
+			g_random_int(),
+			tmp & 0xFFFF,
+			a,
+			b,
+			(tmp >> 16) & 0xFFFF, g_random_int());
+
+	chat = jabber_join_chat(js, room, GOOGLE_GROUPCHAT_SERVER, js->user->node,
+	                        NULL, NULL);
+	if (chat) {
+		chat->muc = TRUE;
+		jabber_chat_invite(gc, chat->id, "", buddy->name);
+	}
+
+	g_free(room);
+}
--- a/libpurple/protocols/jabber/google.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/google.h	Tue Oct 20 22:31:57 2009 +0000
@@ -31,6 +31,8 @@
 #define GOOGLE_VIDEO_CAP "http://www.google.com/xmpp/protocol/video/v1"
 #define GOOGLE_JINGLE_INFO_NAMESPACE "google:jingleinfo"
 
+#define GOOGLE_GROUPCHAT_SERVER "groupchat.google.com"
+
 void jabber_gmail_init(JabberStream *js);
 void jabber_gmail_poke(JabberStream *js, const char *from, JabberIqType type,
                        const char *id, xmlnode *new_mail);
@@ -59,4 +61,6 @@
                                       xmlnode *child);
 void jabber_google_send_jingle_info(JabberStream *js);
 
+void google_buddy_node_chat(PurpleBlistNode *node, gpointer data);
+
 #endif   /* PURPLE_JABBER_GOOGLE_H_ */
--- a/libpurple/protocols/jabber/jabber.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Tue Oct 20 22:31:57 2009 +0000
@@ -68,8 +68,6 @@
 #include "jingle/jingle.h"
 #include "jingle/rtp.h"
 
-#define JABBER_CONNECT_STEPS (js->gsc ? 9 : 5)
-
 PurplePlugin *jabber_plugin = NULL;
 GList *jabber_features = NULL;
 GList *jabber_identities = NULL;
@@ -198,9 +196,10 @@
 void jabber_stream_features_parse(JabberStream *js, xmlnode *packet)
 {
 	if(xmlnode_get_child(packet, "starttls")) {
-		if(jabber_process_starttls(js, packet))
-
+		if(jabber_process_starttls(js, packet)) {
+			jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION);
 			return;
+		}
 	} else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !jabber_stream_is_ssl(js)) {
 		purple_connection_error_reason(js->gc,
 			 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
@@ -211,6 +210,7 @@
 	if(js->registration) {
 		jabber_register_start(js);
 	} else if(xmlnode_get_child(packet, "mechanisms")) {
+		jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);
 		jabber_auth_start(js, packet);
 	} else if(xmlnode_get_child(packet, "bind")) {
 		xmlnode *bind, *resource;
@@ -289,8 +289,10 @@
 		if(js->state == JABBER_STREAM_AUTHENTICATING)
 			jabber_auth_handle_failure(js, *packet);
 	} else if(!strcmp((*packet)->name, "proceed")) {
-		if(js->state == JABBER_STREAM_AUTHENTICATING && !js->gsc)
+		if (js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION && !js->gsc)
 			tls_init(js);
+		else
+			purple_debug_warning("jabber", "Ignoring spurious <proceed/>\n");
 	} else {
 		purple_debug(PURPLE_DEBUG_WARNING, "jabber", "Unknown packet: %s\n",
 				(*packet)->name);
@@ -1080,53 +1082,33 @@
 					return;
 				}
 			} else {
-			const char *value = purple_request_field_string_get_value(field);
-
-			if(!strcmp(id, "username")) {
-				y = xmlnode_new_child(query, "username");
-			} else if(!strcmp(id, "password")) {
-				y = xmlnode_new_child(query, "password");
-			} else if(!strcmp(id, "name")) {
-				y = xmlnode_new_child(query, "name");
-			} else if(!strcmp(id, "email")) {
-				y = xmlnode_new_child(query, "email");
-			} else if(!strcmp(id, "nick")) {
-				y = xmlnode_new_child(query, "nick");
-			} else if(!strcmp(id, "first")) {
-				y = xmlnode_new_child(query, "first");
-			} else if(!strcmp(id, "last")) {
-				y = xmlnode_new_child(query, "last");
-			} else if(!strcmp(id, "address")) {
-				y = xmlnode_new_child(query, "address");
-			} else if(!strcmp(id, "city")) {
-				y = xmlnode_new_child(query, "city");
-			} else if(!strcmp(id, "state")) {
-				y = xmlnode_new_child(query, "state");
-			} else if(!strcmp(id, "zip")) {
-				y = xmlnode_new_child(query, "zip");
-			} else if(!strcmp(id, "phone")) {
-				y = xmlnode_new_child(query, "phone");
-			} else if(!strcmp(id, "url")) {
-				y = xmlnode_new_child(query, "url");
-			} else if(!strcmp(id, "date")) {
-				y = xmlnode_new_child(query, "date");
-			} else {
-				continue;
-			}
-			xmlnode_insert_data(y, value, -1);
+				const char *ids[] = {"username", "password", "name", "email", "nick", "first",
+					"last", "address", "city", "state", "zip", "phone", "url", "date",
+					NULL};
+				const char *value = purple_request_field_string_get_value(field);
+				int i;
+				for (i = 0; ids[i]; i++) {
+					if (!strcmp(id, ids[i]))
+						break;
+				}
+
+				if (!ids[i])
+					continue;
+				y = xmlnode_new_child(query, ids[i]);
+				xmlnode_insert_data(y, value, -1);
 				if(cbdata->js->registration && !strcmp(id, "username")) {
 					g_free(cbdata->js->user->node);
 					cbdata->js->user->node = g_strdup(value);
-			}
+				}
 				if(cbdata->js->registration && !strcmp(id, "password"))
 					purple_account_set_password(cbdata->js->gc->account, value);
+			}
 		}
 	}
-	}
 
 	if(cbdata->js->registration) {
-		username = g_strdup_printf("%s@%s/%s", cbdata->js->user->node, cbdata->js->user->domain,
-				cbdata->js->user->resource);
+		username = g_strdup_printf("%s@%s%s%s", cbdata->js->user->node, cbdata->js->user->domain,
+			cbdata->js->user->resource ? "/" : "", cbdata->js->user->resource);
 		purple_account_set_username(cbdata->js->gc->account, username);
 		g_free(username);
 	}
@@ -1588,6 +1570,8 @@
 
 void jabber_stream_set_state(JabberStream *js, JabberStreamState state)
 {
+#define JABBER_CONNECT_STEPS ((js->gsc || js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION) ? 9 : 5)
+
 	js->state = state;
 	switch(state) {
 		case JABBER_STREAM_OFFLINE:
@@ -1625,6 +1609,8 @@
 			purple_connection_set_state(js->gc, PURPLE_CONNECTED);
 			break;
 	}
+
+#undef JABBER_CONNECT_STEPS
 }
 
 char *jabber_get_next_id(JabberStream *js)
@@ -3272,7 +3258,7 @@
 	id = purple_cmd_register("part", "s", PURPLE_CMD_P_PRPL,
 	                  PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_PRPL_ONLY |
 	                  PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber",
-	                  jabber_cmd_chat_part, _("part [room]:  Leave the room."),
+	                  jabber_cmd_chat_part, _("part [message]:  Leave the room."),
 	                  NULL);
 	jabber_cmds = g_slist_prepend(jabber_cmds, GUINT_TO_POINTER(id));
 
--- a/libpurple/protocols/jabber/jingle/content.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/jingle/content.c	Tue Oct 20 22:31:57 2009 +0000
@@ -330,8 +330,8 @@
 void
 jingle_content_set_session(JingleContent *content, JingleSession *session)
 {
-	JINGLE_IS_CONTENT(content);
-	JINGLE_IS_SESSION(session);
+	g_return_if_fail(JINGLE_IS_CONTENT(content));
+	g_return_if_fail(JINGLE_IS_SESSION(session));
 	g_object_set(content, "session", session, NULL);
 }
 
--- a/libpurple/protocols/jabber/message.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/message.c	Tue Oct 20 22:31:57 2009 +0000
@@ -758,9 +758,22 @@
 					jm->type != JABBER_MESSAGE_ERROR) {
 				const char *jid = xmlnode_get_attrib(child, "jid");
 				if(jid) {
+					const char *reason = xmlnode_get_attrib(child, "reason");
+					const char *password = xmlnode_get_attrib(child, "password");
+
 					jm->type = JABBER_MESSAGE_GROUPCHAT_INVITE;
 					g_free(jm->to);
 					jm->to = g_strdup(jid);
+
+					if (reason) {
+						g_free(jm->body);
+						jm->body = g_strdup(reason);
+					}
+
+					if (password) {
+						g_free(jm->password);
+						jm->password = g_strdup(password);
+					}
 				}
 			} else if(!strcmp(xmlns, "http://jabber.org/protocol/muc#user") &&
 					jm->type != JABBER_MESSAGE_ERROR) {
@@ -775,8 +788,10 @@
 						g_free(jm->body);
 						jm->body = xmlnode_get_data(reason);
 					}
-					if((password = xmlnode_get_child(child, "password")))
+					if((password = xmlnode_get_child(child, "password"))) {
+						g_free(jm->password);
 						jm->password = xmlnode_get_data(password);
+					}
 
 					jm->type = JABBER_MESSAGE_GROUPCHAT_INVITE;
 				}
--- a/libpurple/protocols/jabber/parser.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/parser.c	Tue Oct 20 22:31:57 2009 +0000
@@ -62,11 +62,6 @@
 				g_free(attrib);
 			}
 		}
-		if(js->protocol_version == JABBER_PROTO_0_9)
-			js->auth_type = JABBER_AUTH_IQ_AUTH;
-
-		if(js->state == JABBER_STREAM_INITIALIZING || js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION)
-			jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);
 	} else {
 
 		if(js->current)
@@ -256,5 +251,17 @@
 				break;
 		}
 	}
+
+	if (js->protocol_version == JABBER_PROTO_0_9 && !js->gc->disconnect_timeout &&
+			(js->state == JABBER_STREAM_INITIALIZING ||
+			 js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION)) {
+		/*
+		 * Legacy servers don't advertise features, so if we've just gotten
+		 * the opening <stream:stream> and there was no version, we need to
+		 * immediately start legacy IQ auth.
+		 */
+		js->auth_type = JABBER_AUTH_IQ_AUTH;
+		jabber_stream_set_state(js, JABBER_STREAM_AUTHENTICATING);
+	}
 }
 
--- a/libpurple/protocols/jabber/presence.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/presence.c	Tue Oct 20 22:31:57 2009 +0000
@@ -403,19 +403,20 @@
 			g_free(nickname);
 		}
 
-		if((photo = xmlnode_get_child(vcard, "PHOTO")) &&
-				(( (binval = xmlnode_get_child(photo, "BINVAL")) &&
-				(text = xmlnode_get_data(binval))) ||
-				(text = xmlnode_get_data(photo)))) {
+		if ((photo = xmlnode_get_child(vcard, "PHOTO")) &&
+				(binval = xmlnode_get_child(photo, "BINVAL")) &&
+				(text = xmlnode_get_data(binval))) {
 			guchar *data;
-			gchar *hash;
 			gsize size;
 
 			data = purple_base64_decode(text, &size);
-			hash = jabber_calculate_data_sha1sum(data, size);
+			if (data) {
+				gchar *hash = jabber_calculate_data_sha1sum(data, size);
+				purple_buddy_icons_set_for_user(js->gc->account, from, data,
+				                                size, hash);
+				g_free(hash);
+			}
 
-			purple_buddy_icons_set_for_user(js->gc->account, from, data, size, hash);
-			g_free(hash);
 			g_free(text);
 		}
 	}
@@ -475,7 +476,7 @@
 	/*
 	 * Versions of libpurple before 2.6.0 didn't advertise this capability, so
 	 * we can't yet use Entity Capabilities to determine whether or not the
-	 * other client supports Entity Capabilities.
+	 * other client supports Chat States.
 	 */
 	if (jabber_resource_has_capability(jbr, "http://jabber.org/protocol/chatstates"))
 		jbr->chat_states = JABBER_CHAT_STATES_SUPPORTED;
--- a/libpurple/protocols/jabber/roster.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/jabber/roster.c	Tue Oct 20 22:31:57 2009 +0000
@@ -229,7 +229,7 @@
 		else
 			jb->subscription &= ~JABBER_SUB_PENDING;
 
-		if(jb->subscription == JABBER_SUB_REMOVE) {
+		if(jb->subscription & JABBER_SUB_REMOVE) {
 			remove_purple_buddies(js, jid);
 		} else {
 			GSList *groups = NULL;
--- a/libpurple/protocols/msn/contact.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/contact.c	Tue Oct 20 22:31:57 2009 +0000
@@ -206,6 +206,7 @@
 		                   "Operation {%s} failed. No response received from server.\n",
 		                   msn_contact_operation_str(state->action));
 		msn_session_set_error(state->session, MSN_ERROR_BAD_BLIST, NULL);
+		msn_callback_state_free(state);
 		return;
 	}
 
@@ -355,9 +356,10 @@
 	char *type;
 	char *member_id;
 	MsnUser *user;
-	xmlnode *annotation;
+	xmlnode *annotation, *display;
 	guint nid = MSN_NETWORK_UNKNOWN;
 	char *invite = NULL;
+	char *display_text;
 
 	passport = xmlnode_get_data(xmlnode_get_child(member, node));
 	if (!purple_email_is_valid(passport)) {
@@ -367,7 +369,13 @@
 
 	type = xmlnode_get_data(xmlnode_get_child(member, "Type"));
 	member_id = xmlnode_get_data(xmlnode_get_child(member, "MembershipId"));
-	user = msn_userlist_find_add_user(session->userlist, passport, NULL);
+	if ((display = xmlnode_get_child(member, "DisplayName"))) {
+		display_text = xmlnode_get_data(display);
+	} else {
+		display_text = NULL;
+	}
+
+	user = msn_userlist_find_add_user(session->userlist, passport, display_text);
 
 	for (annotation = xmlnode_get_child(member, "Annotations/Annotation");
 	     annotation;
@@ -408,6 +416,7 @@
 	g_free(type);
 	g_free(member_id);
 	g_free(invite);
+	g_free(display_text);
 }
 
 static void
@@ -1417,12 +1426,20 @@
 	xmlnode *contact;
 	xmlnode *contact_info;
 	xmlnode *changes;
+	MsnUser *user = NULL;
 
-	purple_debug_info("msn", "Update contact information with new %s: %s\n",
+	purple_debug_info("msn", "Update contact information for %s with new %s: %s\n",
+		passport ? passport : "(null)",
 		type == MSN_UPDATE_DISPLAY ? "display name" : "alias",
 		value ? value : "(null)");
-	purple_debug_info("msn", "passport=%s\n", passport);
 	g_return_if_fail(passport != NULL);
+
+	if (strcmp(passport, "Me") != 0) {
+		user = msn_userlist_find_user(session->userlist, passport);
+		if (!user)
+			return;
+	}
+
 	contact_info = xmlnode_new("contactInfo");
 	changes = xmlnode_new("propertiesChanged");
 
@@ -1451,8 +1468,6 @@
 			g_return_if_reached();
 	}
 
-
-
 	state = msn_callback_state_new(session);
 
 	state->body = xmlnode_from_str(MSN_CONTACT_UPDATE_TEMPLATE, -1);
@@ -1465,14 +1480,13 @@
 	xmlnode_insert_child(contact, contact_info);
 	xmlnode_insert_child(contact, changes);
 
-	if (!strcmp(passport, "Me")) {
-		xmlnode *contactType = xmlnode_new_child(contact_info, "contactType");
-		xmlnode_insert_data(contactType, "Me", -1);
-	} else {
-		MsnUser *user = msn_userlist_find_user(session->userlist, passport);
+	if (user) {
 		xmlnode *contactId = xmlnode_new_child(contact, "contactId");
 		msn_callback_state_set_uid(state, user->uid);
 		xmlnode_insert_data(contactId, state->uid, -1);
+	} else {
+		xmlnode *contactType = xmlnode_new_child(contact_info, "contactType");
+		xmlnode_insert_data(contactType, "Me", -1);
 	}
 
 	msn_contact_request(state);
--- a/libpurple/protocols/msn/nexus.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/nexus.c	Tue Oct 20 22:31:57 2009 +0000
@@ -338,8 +338,10 @@
 			xmlnode *cipher = xmlnode_get_child(node, "RequestedSecurityToken/EncryptedData/CipherData/CipherValue");
 			xmlnode *secret = xmlnode_get_child(node, "RequestedProofToken/BinarySecret");
 
+			g_free(nexus->cipher);
 			nexus->cipher = xmlnode_get_data(cipher);
 			data = xmlnode_get_data(secret);
+			g_free(nexus->secret);
 			nexus->secret = (char *)purple_base64_decode(data, NULL);
 			g_free(data);
 
@@ -506,6 +508,7 @@
 	}
 
 	g_free(ud);
+	g_free(key);
 }
 
 void
--- a/libpurple/protocols/msn/notification.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/notification.c	Tue Oct 20 22:31:57 2009 +0000
@@ -583,6 +583,7 @@
 	trans = msn_transaction_new(cmdproc, "FQY", "%d", payload_len);
 	msn_transaction_set_payload(trans, payload, payload_len);
 	msn_transaction_set_data(trans, data);
+	msn_transaction_set_data_free(trans, g_free);
 	msn_cmdproc_send_trans(cmdproc, trans);
 }
 
@@ -621,7 +622,7 @@
 				user->list_op & MSN_LIST_OP_MASK, network);
 		payload = xmlnode_to_str(adl_node, &payload_len);
 		msn_notification_post_adl(session->notification->cmdproc, payload, payload_len);
-
+		g_free(payload);
 	} else {
 		purple_debug_error("msn",
 		                   "Got FQY update for unknown user %s on network %d.\n",
@@ -962,9 +963,8 @@
 			if (cmd->trans->data) {
 				MsnFqyCbData *fqy_data = cmd->trans->data;
 				fqy_data->cb(session, passport, network, fqy_data->data);
-				/* TODO: This leaks, but the server responds to FQY multiple times, so we
-				         can't free it yet. We need to figure out somewhere else to do so.
-				g_free(fqy_data); */
+				/* Don't free fqy_data yet since the server responds to FQY multiple times.
+				   It will be freed when cmd->trans is freed. */
 			}
 
 			g_free(passport);
@@ -1098,7 +1098,6 @@
 	}
 
 	if (msn_user_set_friendly_name(user, friendly)) {
-		serv_got_alias(gc, passport, friendly);
 		msn_update_contact(session, passport, MSN_UPDATE_DISPLAY, friendly);
 	}
 	g_free(friendly);
@@ -1263,7 +1262,6 @@
 
 	if (msn_user_set_friendly_name(user, friendly))
 	{
-		serv_got_alias(gc, passport, friendly);
 		msn_update_contact(session, passport, MSN_UPDATE_DISPLAY, friendly);
 	}
 
--- a/libpurple/protocols/msn/oim.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/oim.c	Tue Oct 20 22:31:57 2009 +0000
@@ -373,6 +373,7 @@
 								msg->oim_msg);
 							g_queue_push_head(oim->send_queue, msg);
 							msn_oim_send_msg(oim);
+							msg = NULL;
 						} else {
 							purple_debug_info("msn",
 								"Can't find lock key for OIM: %s\n",
@@ -393,6 +394,7 @@
 						purple_debug_info("msn", "Resending OIM: %s\n", msg->oim_msg);
 						g_queue_push_head(oim->send_queue, msg);
 						msn_oim_send_msg(oim);
+						msg = NULL;
 					}
 				} else {
 					/* Report the error */
@@ -426,6 +428,9 @@
 			}
 		}
 	}
+
+	if (msg)
+		msn_oim_free_send_req(msg);
 }
 
 void
--- a/libpurple/protocols/msn/servconn.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/servconn.c	Tue Oct 20 22:31:57 2009 +0000
@@ -86,7 +86,7 @@
 	if (servconn->tx_handler > 0)
 		purple_input_remove(servconn->tx_handler);
 	if (servconn->timeout_handle > 0)
-		purple_input_remove(servconn->timeout_handle);
+		purple_timeout_remove(servconn->timeout_handle);
 
 	msn_cmdproc_destroy(servconn->cmdproc);
 	g_free(servconn);
@@ -280,7 +280,7 @@
 
 	if (servconn->timeout_handle > 0)
 	{
-		purple_input_remove(servconn->timeout_handle);
+		purple_timeout_remove(servconn->timeout_handle);
 		servconn->timeout_handle = 0;
 	}
 
@@ -299,8 +299,8 @@
 static gboolean
 servconn_idle_timeout_cb(MsnServConn *servconn)
 {
+	servconn->timeout_handle = 0;
 	msn_servconn_disconnect(servconn);
-	servconn->timeout_handle = 0;
 	return FALSE;
 }
 
@@ -308,7 +308,7 @@
 servconn_timeout_renew(MsnServConn *servconn)
 {
 	if (servconn->timeout_handle) {
-		purple_input_remove(servconn->timeout_handle);
+		purple_timeout_remove(servconn->timeout_handle);
 		servconn->timeout_handle = 0;
 	}
 
@@ -440,11 +440,12 @@
 	memcpy(servconn->rx_buf + servconn->rx_len, buf, len + 1);
 	servconn->rx_len += len;
 
-	msn_servconn_process_data(servconn);
-	servconn_timeout_renew(servconn);
+	servconn = msn_servconn_process_data(servconn);
+	if (servconn)
+		servconn_timeout_renew(servconn);
 }
 
-void msn_servconn_process_data(MsnServConn *servconn)
+MsnServConn *msn_servconn_process_data(MsnServConn *servconn)
 {
 	char *cur, *end, *old_rx_buf;
 	int cur_len;
@@ -503,10 +504,13 @@
 
 	servconn->processing = FALSE;
 
-	if (servconn->wasted)
+	if (servconn->wasted) {
 		msn_servconn_destroy(servconn);
+		servconn = NULL;
+	}
 
 	g_free(old_rx_buf);
+	return servconn;
 }
 
 #if 0
--- a/libpurple/protocols/msn/servconn.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/servconn.h	Tue Oct 20 22:31:57 2009 +0000
@@ -178,8 +178,10 @@
  * data from the socket.
  *
  * @param servconn The servconn.
+ *
+ * @return @c NULL if servconn was destroyed, 'servconn' otherwise.
  */
-void msn_servconn_process_data(MsnServConn *servconn);
+MsnServConn *msn_servconn_process_data(MsnServConn *servconn);
 
 /**
  * Set a idle timeout fot this servconn
--- a/libpurple/protocols/msn/transaction.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/transaction.c	Tue Oct 20 22:31:57 2009 +0000
@@ -59,6 +59,9 @@
 	g_free(trans->params);
 	g_free(trans->payload);
 
+	if (trans->data_free)
+		trans->data_free(trans->data);
+
 #if 0
 	if (trans->pendent_cmd != NULL)
 		msn_message_unref(trans->pendent_msg);
@@ -165,6 +168,12 @@
 	trans->data = data;
 }
 
+void msn_transaction_set_data_free(MsnTransaction *trans, GDestroyNotify fn)
+{
+	g_return_if_fail(trans != NULL);
+	trans->data_free = fn;
+}
+
 void
 msn_transaction_add_cb(MsnTransaction *trans, char *answer,
 					   MsnTransCb cb)
--- a/libpurple/protocols/msn/transaction.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/transaction.h	Tue Oct 20 22:31:57 2009 +0000
@@ -48,6 +48,8 @@
 	guint timer;
 
 	void *data; /**< The data to be used on the different callbacks. */
+	GDestroyNotify data_free;  /**< The function to free 'data', or @c NULL */
+
 	GHashTable *callbacks;
 	gboolean has_custom_callbacks;
 	MsnErrorCb error_cb;
@@ -71,6 +73,7 @@
 void msn_transaction_set_payload(MsnTransaction *trans,
 								 const char *payload, int payload_len);
 void msn_transaction_set_data(MsnTransaction *trans, void *data);
+void msn_transaction_set_data_free(MsnTransaction *trans, GDestroyNotify fn);
 void msn_transaction_add_cb(MsnTransaction *trans, char *answer,
 							MsnTransCb cb);
 void msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb);
--- a/libpurple/protocols/msn/user.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/msn/user.c	Tue Oct 20 22:31:57 2009 +0000
@@ -183,12 +183,15 @@
 {
 	g_return_val_if_fail(user != NULL, FALSE);
 
-	if (user->friendly_name && name && !strcmp(user->friendly_name, name))
+	if (user->friendly_name && name && (!strcmp(user->friendly_name, name) ||
+				!strcmp(user->passport, name)))
 		return FALSE;
 
 	g_free(user->friendly_name);
 	user->friendly_name = g_strdup(name);
 
+	serv_got_alias(purple_account_get_connection(user->userlist->session->account),
+			user->passport, name);
 	return TRUE;
 }
 
--- a/libpurple/protocols/oscar/oscar.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Tue Oct 20 22:31:57 2009 +0000
@@ -2874,25 +2874,46 @@
 			gchar **text;
 			text = g_strsplit(args->msg, "\376", 0);
 			if (text) {
-				num = 0;
-				for (i=0; i<strlen(text[0]); i++)
-					num = num*10 + text[0][i]-48;
-				for (i=0; i<num; i++) {
-					struct name_data *data = g_new(struct name_data, 1);
-					gchar *message = g_strdup_printf(_("ICQ user %u has sent you a buddy: %s (%s)"), args->uin, text[i*2+2], text[i*2+1]);
-					data->gc = gc;
-					data->name = g_strdup(text[i*2+1]);
-					data->nick = g_strdup(text[i*2+2]);
-
-					purple_request_action(gc, NULL, message,
-										_("Do you want to add this buddy "
-										  "to your buddy list?"),
-										PURPLE_DEFAULT_ACTION_NONE,
-										purple_connection_get_account(gc), data->name, NULL,
-										data, 2,
-										_("_Add"), G_CALLBACK(purple_icq_buddyadd),
-										_("_Decline"), G_CALLBACK(oscar_free_name_data));
-					g_free(message);
+				/* Read the number of contacts that we were sent */
+				errno = 0;
+				num = strtoul(text[0], NULL, 10);
+
+				if (num > 0 && errno == 0) {
+					for (i=0; i<num; i++) {
+						struct name_data *data;
+						gchar *message;
+
+						if (!text[i*2 + 1] || !text[i*2 + 2]) {
+							/* We're missing the contact name or nickname.  Bail out. */
+							gchar *tmp = g_strescape(args->msg, NULL);
+							purple_debug_error("oscar", "Unknown syntax parsing "
+									"ICQ buddies.  args->msg=%s\n", tmp);
+							g_free(tmp);
+							break;
+						}
+
+						message = g_strdup_printf(_("ICQ user %u has sent you a buddy: %s (%s)"), args->uin, text[i*2+2], text[i*2+1]);
+
+						data = g_new(struct name_data, 1);
+						data->gc = gc;
+						data->name = g_strdup(text[i*2+1]);
+						data->nick = g_strdup(text[i*2+2]);
+
+						purple_request_action(gc, NULL, message,
+								_("Do you want to add this buddy "
+								  "to your buddy list?"),
+								PURPLE_DEFAULT_ACTION_NONE,
+								purple_connection_get_account(gc), data->name, NULL,
+								data, 2,
+								_("_Add"), G_CALLBACK(purple_icq_buddyadd),
+								_("_Decline"), G_CALLBACK(oscar_free_name_data));
+						g_free(message);
+					}
+				} else {
+					gchar *tmp = g_strescape(args->msg, NULL);
+					purple_debug_error("oscar", "Unknown syntax parsing "
+							"ICQ buddies.  args->msg=%s\n", tmp);
+					g_free(tmp);
 				}
 				g_strfreev(text);
 			}
@@ -3909,12 +3930,8 @@
 	od->rights.maxpermits = (guint)maxpermits;
 	od->rights.maxdenies = (guint)maxdenies;
 
-	purple_connection_set_state(gc, PURPLE_CONNECTED);
-
 	purple_debug_info("oscar", "buddy list loaded\n");
 
-	aim_srv_clientready(od, conn);
-
 	if (purple_account_get_user_info(account) != NULL)
 		serv_set_info(gc, purple_account_get_user_info(account));
 
@@ -3957,6 +3974,22 @@
 	aim_srv_requestnew(od, SNAC_FAMILY_ALERT);
 	aim_srv_requestnew(od, SNAC_FAMILY_CHATNAV);
 
+	od->bos.have_rights = TRUE;
+
+	/*
+	 * If we've already received our feedbag data then we're not waiting on
+	 * anything else, so send the server clientready.
+	 *
+	 * Normally we get bos rights before we get our feedbag data, so this
+	 * rarely (never?) happens.  And I'm not sure it actually matters if we
+	 * wait for bos rights before calling clientready.  But it seems safer
+	 * to do it this way.
+	 */
+	if (od->ssi.received_data) {
+		aim_srv_clientready(od, conn);
+		purple_connection_set_state(gc, PURPLE_CONNECTED);
+	}
+
 	return 1;
 }
 
@@ -5396,6 +5429,15 @@
 	oscar_set_icon(gc, img);
 	purple_imgstore_unref(img);
 
+	/*
+	 * If we've already received our bos rights then we're not waiting on
+	 * anything else, so send the server clientready.
+	 */
+	if (od->bos.have_rights) {
+		aim_srv_clientready(od, conn);
+		purple_connection_set_state(gc, PURPLE_CONNECTED);
+	}
+
 	return 1;
 }
 
--- a/libpurple/protocols/oscar/oscar.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.h	Tue Oct 20 22:31:57 2009 +0000
@@ -535,6 +535,10 @@
 		struct aim_userinfo_s *userinfo;
 	} locate;
 
+	struct {
+		gboolean have_rights;
+	} bos;
+
 	/* Server-stored information (ssi) */
 	struct {
 		gboolean received_data;
--- a/libpurple/protocols/yahoo/libymsg.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/yahoo/libymsg.c	Tue Oct 20 22:31:57 2009 +0000
@@ -153,7 +153,7 @@
 	char *name = NULL;
 	gboolean unicode = FALSE;
 	char *message = NULL;
-	char *msn_name = NULL;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 
 	if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) {
 		if (!purple_account_get_remember_password(account))
@@ -184,27 +184,35 @@
 			f = NULL;
 			if (pair->value && g_utf8_validate(pair->value, -1, NULL)) {
 				GSList *tmplist;
-				int protocol = 0;
 
 				name = pair->value;
 
-				/* Look ahead to see if we have the protocol info about the buddy */
+				/* Look ahead to see if we have the federation info about the buddy */
 				for (tmplist = l->next; tmplist; tmplist = tmplist->next) {
 					struct yahoo_pair *p = tmplist->data;
 					if (p->key == 7)
 						break;
 					if (p->key == 241) {
-						if(strtol(p->value, NULL, 10) == 2) {
-							g_free(msn_name);
-							msn_name = g_strconcat("msn/", name, NULL);
-							name = msn_name;
-							protocol = 2;
+						fed = strtol(p->value, NULL, 10);
+						switch (fed) {
+							case YAHOO_FEDERATION_MSN:
+								name = g_strconcat("msn/", name, NULL);
+								break;
+							case YAHOO_FEDERATION_OCS:
+								name = g_strconcat("ocs/", name, NULL);
+								break;
+							case YAHOO_FEDERATION_IBM:
+								name = g_strconcat("ibm/", name, NULL);
+								break;
+							case YAHOO_FEDERATION_NONE:
+							default:
+								break;
 						}
 						break;
 					}
 				}
 				f = yahoo_friend_find_or_new(gc, name);
-				f->protocol = protocol;
+				f->fed = fed;
 			}
 			break;
 		case 10: /* state */
@@ -361,7 +369,7 @@
 			if(f && strtol(pair->value, NULL, 10))
 				f->version_id = strtol(pair->value, NULL, 10);
 			break;
-		case 241: /* protocol buddy belongs to */
+		case 241: /* Federated network buddy belongs to */
 			break;  /* We process this when get '7' */
 		default:
 			purple_debug_warning("yahoo",
@@ -381,7 +389,7 @@
 		if (name) /* update the last buddy */
 			yahoo_update_status(gc, name, f);
 	}
-	g_free(msn_name);
+
 }
 
 static void yahoo_do_group_check(PurpleAccount *account, GHashTable *ht, const char *name, const char *group)
@@ -488,13 +496,13 @@
 	PurpleAccount *account = purple_connection_get_account(gc);
 	YahooData *yd = gc->proto_data;
 	GHashTable *ht;
-	char *norm_bud;
+	char *norm_bud = NULL;
 	char *temp = NULL;
 	YahooFriend *f = NULL; /* It's your friends. They're going to want you to share your StarBursts. */
 	                       /* But what if you had no friends? */
 	PurpleBuddy *b;
 	PurpleGroup *g;
-	int protocol = 0;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 	int stealth = 0;
 
 	ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_slist_free);
@@ -519,11 +527,20 @@
 			break;
 		case 301: /* This is 319 before all s/n's in a group after the first. It is followed by an identical 300. */
 			if(temp != NULL) {
-				if(protocol == 2)
-					norm_bud = g_strconcat("msn/", temp, NULL);
-				else
-					norm_bud = g_strdup(temp);
-
+				switch (fed) {
+					case YAHOO_FEDERATION_MSN:
+						norm_bud = g_strconcat("msn/", temp, NULL);
+						break;
+					case YAHOO_FEDERATION_OCS:
+						norm_bud = g_strconcat("ocs/", temp, NULL);
+						break;
+					case YAHOO_FEDERATION_IBM:
+						norm_bud = g_strconcat("ibm/", temp, NULL);
+						break;
+					case YAHOO_FEDERATION_NONE:
+						norm_bud = g_strdup(temp);
+						break;
+				}
 				if (yd->current_list15_grp) {
 					/* This buddy is in a group */
 					f = yahoo_friend_find_or_new(gc, norm_bud);
@@ -536,15 +553,15 @@
 						purple_blist_add_buddy(b, NULL, g, NULL);
 					}
 					yahoo_do_group_check(account, ht, norm_bud, yd->current_list15_grp);
-					if(protocol != 0) {
-						f->protocol = protocol;
-						purple_debug_info("yahoo", "Setting protocol to %d\n", f->protocol);
+					if(fed) {
+						f->fed = fed;
+						purple_debug_info("yahoo", "Setting federation to %d\n", f->fed);
 					}
 					if(stealth == 2)
 						f->presence = YAHOO_PRESENCE_PERM_OFFLINE;
 
 					/* set p2p status not connected and no p2p packet sent */
-					if(protocol == 0) {
+					if(fed == YAHOO_FEDERATION_NONE) {
 						yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
 						f->p2p_packet_sent = 0;
 					} else
@@ -556,8 +573,8 @@
 				}
 
 				g_free(norm_bud);
-
-				protocol = 0;
+				norm_bud=NULL;
+				fed = YAHOO_FEDERATION_NONE;
 				stealth = 0;
 				g_free(temp);
 				temp = NULL;
@@ -573,8 +590,8 @@
 			g_free(temp);
 			temp = g_strdup(purple_normalize(account, pair->value));
 			break;
-		case 241: /* another protocol user */
-			protocol = strtol(pair->value, NULL, 10);
+		case 241: /* user on federated network */
+			fed = strtol(pair->value, NULL, 10);
 			break;
 		case 59: /* somebody told cookies come here too, but im not sure */
 			yahoo_process_cookie(yd, pair->value);
@@ -766,7 +783,7 @@
 	GSList *l = pkt->hash;
 	gint val_11 = 0;
 	YahooData *yd = gc->proto_data;
-	gboolean msn = FALSE;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 
 	account = purple_connection_get_account(gc);
 
@@ -783,8 +800,7 @@
 		if (pair->key == 11)
 			val_11 = strtol(pair->value, NULL, 10);
 		if (pair->key == 241)
-			if(strtol(pair->value, NULL, 10) == 2)
-				msn = TRUE;
+			fed = strtol(pair->value, NULL, 10);
 		l = l->next;
 	}
 
@@ -802,20 +818,30 @@
 	if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING"))
 		&& (purple_privacy_check(account, from)))
 	{
-		if(msn) {
-			char *msn_from = g_strconcat("msn/", from, NULL);
-			if (*stat == '1')
-				serv_got_typing(gc, msn_from, 0, PURPLE_TYPING);
-			else
-				serv_got_typing_stopped(gc, msn_from);
-			g_free(msn_from);
+		char *fed_from = from;
+		switch (fed) {
+			case YAHOO_FEDERATION_MSN:
+				fed_from = g_strconcat("msn/", from, NULL);
+				break;
+			case YAHOO_FEDERATION_OCS:
+				fed_from = g_strconcat("ocs/", from, NULL);
+				break;
+			case YAHOO_FEDERATION_IBM:
+				fed_from = g_strconcat("ibm/", from, NULL);
+				break;
+			case YAHOO_FEDERATION_NONE:
+			default:
+				break;
 		}
-		else	{
-			if (*stat == '1')
-				serv_got_typing(gc, from, 0, PURPLE_TYPING);
-			else
-				serv_got_typing_stopped(gc, from);
-		}
+	
+		if (*stat == '1')
+			serv_got_typing(gc, fed_from, 0, PURPLE_TYPING);
+		else
+			serv_got_typing_stopped(gc, fed_from);
+		
+		if (fed_from != from)
+			g_free(fed_from);			
+	
 	} else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) {
 		PurpleBuddy *bud = purple_find_buddy(account, from);
 
@@ -852,7 +878,7 @@
 	int buddy_icon;
 	char *id;
 	char *msg;
-	gboolean msn;
+	YahooFederation fed;
 };
 
 static void yahoo_process_sms_message(PurpleConnection *gc, struct yahoo_packet *pkt)
@@ -926,6 +952,7 @@
 	struct _yahoo_im *im = NULL;
 	const char *imv = NULL;
 	gint val_11 = 0;
+	char *fed_from = NULL;
 
 	account = purple_connection_get_account(gc);
 
@@ -936,9 +963,10 @@
 			if (pair->key == 4 || pair->key == 1) {
 				im = g_new0(struct _yahoo_im, 1);
 				list = g_slist_append(list, im);
-				im->from = pair->value;
+				im->from = fed_from = pair->value;
 				im->time = time(NULL);
 				im->utf8 = TRUE;
+				im->fed = YAHOO_FEDERATION_NONE;
 			}
 			if (im && pair->key == 5)
 				im->active_id = pair->value;
@@ -956,8 +984,23 @@
 					im->msg = pair->value;
 			}
 			if (im && pair->key == 241) {
-				if(strtol(pair->value, NULL, 10) == 2)
-					im->msn = TRUE;
+				im->fed = strtol(pair->value, NULL, 10);
+				switch (im->fed) {
+					case YAHOO_FEDERATION_MSN:
+						fed_from = g_strconcat("msn/",im->from, NULL);
+						break;
+					case YAHOO_FEDERATION_OCS:
+						fed_from = g_strconcat("ocs/",im->from, NULL);
+						break;
+					case YAHOO_FEDERATION_IBM:
+						fed_from = g_strconcat("ibm/",im->from, NULL);
+						break;
+					case YAHOO_FEDERATION_NONE:
+					default:
+						break;
+				}
+				purple_debug_info("yahoo", "Message from federated (%d) buddy %s.\n", im->fed, fed_from);
+					
 			}
 			/* peer session id */
 			if (pair->key == 11) {
@@ -981,14 +1024,18 @@
 
 	/* disconnect the peer if connected through p2p and sends wrong value for session id */
 	if( (pkt_type == YAHOO_PKT_TYPE_P2P) && (val_11 != yd->session_id) ) {
-		purple_debug_warning("yahoo","p2p: %s sent us message with wrong session id. Disconnecting p2p connection to peer\n", im ? im->from : "(im was null)");
+		purple_debug_warning("yahoo","p2p: %s sent us message with wrong session id. Disconnecting p2p connection to peer\n", im ? fed_from : "(im was null)");
 		/* remove from p2p connection lists, also calls yahoo_p2p_disconnect_destroy_data */
-		g_hash_table_remove(yd->peers, im->from);
+		if (im) {
+			g_hash_table_remove(yd->peers, fed_from);
+			g_free(im);
+		}
 		return;
 	}
 
 	/* TODO: It seems that this check should be per IM, not global */
 	/* Check for the Doodle IMV */
+	/* no doodle with federated buddies -- assumption???  */
 	if (im != NULL && imv!= NULL && im->from != NULL)
 	{
 		g_hash_table_replace(yd->imvironments, g_strdup(im->from), g_strdup(imv));
@@ -1023,18 +1070,15 @@
 	for (l = list; l; l = l->next) {
 		YahooFriend *f;
 		char *m, *m2;
-		char *msn_from = NULL;
-		const char *from;
-		PurpleConversation *c;
 		im = l->data;
 
-		if (!im->from || !im->msg) {
+		if (!fed_from || !im->msg) {
 			g_free(im);
 			continue;
 		}
 
-		if (!purple_privacy_check(account, im->from)) {
-			purple_debug_info("yahoo", "Message from %s dropped.\n", im->from);
+		if (!purple_privacy_check(account, fed_from)) {
+			purple_debug_info("yahoo", "Message from %s dropped.\n", fed_from);
 			return;
 		}
 
@@ -1069,39 +1113,25 @@
 		g_free(m);
 		m = m2;
 		purple_util_chrreplace(m, '\r', '\n');
-
-		if (im->msn) {
-			msn_from = g_strconcat("msn/", im->from, NULL);
-			from = msn_from;
-		} else {
-			from = im->from;
-		}
-
-		c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, account);
-
 		if (!strcmp(m, "<ding>")) {
 			char *username;
 
-			if (c == NULL) {
-				c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, from);
-			}
-			username = g_markup_escape_text(from, -1);
+			username = g_markup_escape_text(fed_from, -1);
 			purple_prpl_got_attention(gc, username, YAHOO_BUZZ);
 			g_free(username);
 			g_free(m);
 			g_free(im);
-			g_free(msn_from);
 			continue;
 		}
 
 		m2 = yahoo_codes_to_html(m);
 		g_free(m);
 
-		serv_got_im(gc, from, m2, 0, im->time);
+		serv_got_im(gc, fed_from, m2, 0, im->time);
 		g_free(m2);
 
-		/* laters : implement buddy icon for msn friends */
-		if (!im->msn) {
+		/* Official clients don't share buddy images with federated buddies */
+		if (im->fed == YAHOO_FEDERATION_NONE) {
 			if ((f = yahoo_friend_find(gc, im->from)) && im->buddy_icon == 2) {
 				if (yahoo_friend_get_buddy_icon_need_request(f)) {
 					yahoo_send_picture_request(gc, im->from);
@@ -1110,9 +1140,12 @@
 			}
 		}
 
+		if(im->fed != YAHOO_FEDERATION_NONE)
+			g_free(fed_from);
+
 		g_free(im);
-		g_free(msn_from);
 	}
+
 	g_slist_free(list);
 }
 
@@ -1145,7 +1178,7 @@
 	PurpleConnection *gc;
 	char *id;
 	char *who;
-	int protocol;
+	YahooFederation fed;
 };
 
 static void
@@ -1156,16 +1189,24 @@
 	YahooData *yd = add_req->gc->proto_data;
 	const char *who = add_req->who;
 
-	if (add_req->protocol == 2)
+	pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
+	if (add_req->fed) {
 		who += 4;
-
-	pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
-	yahoo_packet_hash(pkt, "ssiii",
-					  1, add_req->id,
-					  5, who,
-					  241, add_req->protocol,
-					  13, 1,
-					  334, 0);
+		yahoo_packet_hash(pkt, "ssiii",
+						  1, add_req->id,
+						  5, who,
+						  241, add_req->fed,
+						  13, 1,
+						  334, 0);
+	}
+	else {
+		yahoo_packet_hash(pkt, "ssii",
+						  1, add_req->id,
+						  5, who,
+						  13, 1,
+						  334, 0);
+	}
+		
 	yahoo_packet_send_and_free(pkt, yd);
 
 	g_free(add_req->id);
@@ -1181,23 +1222,33 @@
 	char *encoded_msg = NULL;
 	const char *who = add_req->who;
 
-	if (add_req->protocol == 2)
-		who += 4; /* Skip 'msn/' */
-
 	if (msg && *msg)
 		encoded_msg = yahoo_string_encode(add_req->gc, msg, NULL);
 
 	pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15,
 			YAHOO_STATUS_AVAILABLE, yd->session_id);
 
-	yahoo_packet_hash(pkt, "ssiiiis",
-			1, add_req->id,
-			5, who,
-			241, add_req->protocol,
-			13, 2,
-			334, 0,
-			97, 1,
-			14, encoded_msg ? encoded_msg : "");
+	if (add_req->fed) {
+		who += 4; /* Skip fed identifier (msn|ocs|ibm)/' */
+		yahoo_packet_hash(pkt, "ssiiiis",
+						  1, add_req->id,
+						  5, who,
+						  241, add_req->fed,
+						  13, 2,
+						  334, 0,
+						  97, 1,
+						  14, encoded_msg ? encoded_msg : "");
+	}
+	else {
+		yahoo_packet_hash(pkt, "ssiiis",
+						  1, add_req->id,
+						  5, who,
+						  13, 2,
+						  334, 0,
+						  97, 1,
+						  14, encoded_msg ? encoded_msg : "");
+	}
+
 
 	yahoo_packet_send_and_free(pkt, yd);
 
@@ -1252,8 +1303,7 @@
 	PurpleAccount *account;
 	GSList *l = pkt->hash;
 	const char *msg = NULL;
-	int protocol = 0;
-
+	
 	account = purple_connection_get_account(gc);
 
 	/* Buddy authorized/declined our addition */
@@ -1261,6 +1311,7 @@
 		char *temp = NULL;
 		char *who = NULL;
 		int response = 0;
+		YahooFederation fed = YAHOO_FEDERATION_NONE;
 
 		while (l) {
 			struct yahoo_pair *pair = l->data;
@@ -1276,16 +1327,27 @@
 				msg = pair->value;
 				break;
 			case 241:
-				protocol = strtol(pair->value, NULL, 10);
+				fed = strtol(pair->value, NULL, 10);
 				break;
 			}
 			l = l->next;
 		}
 
-		if(protocol == 0)
-			who = g_strdup(temp);
-		else if(protocol == 2)
-			who = g_strconcat("msn/", temp, NULL);
+		switch (fed) {
+			case YAHOO_FEDERATION_MSN:
+				who = g_strconcat("msn/", temp, NULL);
+				break;
+			case YAHOO_FEDERATION_OCS:
+				who = g_strconcat("ocs/", temp, NULL);
+				break;
+			case YAHOO_FEDERATION_IBM:
+				who = g_strconcat("ibm/", temp, NULL);
+				break;
+			case YAHOO_FEDERATION_NONE:
+			default:
+				who = g_strdup(temp);
+				break;
+		}
 
 		if (response == 1) /* Authorized */
 			purple_debug_info("yahoo", "Received authorization from buddy '%s'.\n", who ? who : "(Unknown Buddy)");
@@ -1304,6 +1366,7 @@
 
 		add_req = g_new0(struct yahoo_add_request, 1);
 		add_req->gc = gc;
+		add_req->fed = YAHOO_FEDERATION_NONE;
 
 		while (l) {
 			struct yahoo_pair *pair = l->data;
@@ -1322,7 +1385,7 @@
 				firstname = pair->value;
 				break;
 			case 241:
-				add_req->protocol = strtol(pair->value, NULL, 10);
+				add_req->fed = strtol(pair->value, NULL, 10);
 				break;
 			case 254:
 				lastname = pair->value;
@@ -1331,10 +1394,21 @@
 			}
 			l = l->next;
 		}
-		if(add_req->protocol == 2)
-			add_req->who = g_strconcat("msn/", temp, NULL);
-		else
-			add_req->who = g_strdup(temp);
+		switch (add_req->fed) {
+			case YAHOO_FEDERATION_MSN:
+				add_req->who = g_strconcat("msn/", temp, NULL);
+				break;
+			case YAHOO_FEDERATION_OCS:
+				add_req->who = g_strconcat("ocs/", temp, NULL);
+				break;
+			case YAHOO_FEDERATION_IBM:
+				add_req->who = g_strconcat("ibm/", temp, NULL);
+				break;
+			case YAHOO_FEDERATION_NONE:
+			default:
+				add_req->who = g_strdup(temp);
+				break;
+		}
 
 		if (add_req->id && add_req->who) {
 			char *alias = NULL, *dec_msg = NULL;
@@ -2134,8 +2208,7 @@
 	YahooFriend *f;
 	GSList *l = pkt->hash;
 	YahooData *yd = gc->proto_data;
-	int protocol = 0;
-	gboolean msn = FALSE;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 
 	while (l) {
 		struct yahoo_pair *pair = l->data;
@@ -2151,9 +2224,7 @@
 			group = pair->value;
 			break;
 		case 241:
-			protocol = strtol(pair->value, NULL, 10);
-			if(protocol == 2)
-				msn = TRUE;
+			fed = strtol(pair->value, NULL, 10);
 			break;
 		}
 
@@ -2165,20 +2236,30 @@
 	if (!group)
 		group = "";
 
-	if(msn)
-		who = g_strconcat("msn/", temp, NULL);
-	else
-		who = g_strdup(temp);
+	switch (fed) {
+		case YAHOO_FEDERATION_MSN:
+			who = g_strconcat("msn/", temp, NULL);
+			break;
+		case YAHOO_FEDERATION_OCS:
+			who = g_strconcat("ocs/", temp, NULL);
+			break;
+		case YAHOO_FEDERATION_IBM:
+			who = g_strconcat("ibm/", temp, NULL);
+			break;
+		case YAHOO_FEDERATION_NONE:
+		default:
+			who = g_strdup(temp);
+			break;
+	}
 
 	if (!err || (err == 2)) { /* 0 = ok, 2 = already on serv list */
 		f = yahoo_friend_find_or_new(gc, who);
 		yahoo_update_status(gc, who, f);
-		if(protocol)
-			f->protocol = protocol;
+		f->fed = fed;
 
 		if( !g_hash_table_lookup(yd->peers, who) ) {
 			/* we are not connected as client, so set friend to not connected */
-			if(msn)
+			if(fed)
 				yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_DO_NOT_CONNECT);
 			else	{
 				yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
@@ -2550,7 +2631,7 @@
 		return;
 
 	/* Dont send p2p packet to buddies of other protocols */
-	if(f->protocol)
+	if(f->fed)
 		return;
 
 	/* Finally, don't try to connect to buddies not online or on sms */
@@ -3591,8 +3672,9 @@
 	if (purple_presence_is_online(presence)) {
 		if (yahoo_friend_get_game(f))
 			return "game";
-		if (f->protocol == 2)
-			return "msn";
+
+		if (f->fed)
+			return "external";
 	}
 	return NULL;
 }
@@ -4262,11 +4344,11 @@
 	gboolean utf8 = TRUE;
 	PurpleWhiteboard *wb;
 	int ret = 1;
-	YahooFriend *f = NULL;
+	const char *fed_who;
 	gsize lenb = 0;
 	glong lenc = 0;
 	struct yahoo_p2p_data *p2p_data;
-	gboolean msn = FALSE;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 	msg2 = yahoo_string_encode(gc, msg, &utf8);
 
 	if(msg2) {
@@ -4284,7 +4366,17 @@
 		}
 	}
 
-	msn = !g_ascii_strncasecmp(who, "msn/", 4);
+	if (who[3] == '/') {
+		if (!g_ascii_strncasecmp(who, "msn/", 4)) {
+			fed = YAHOO_FEDERATION_MSN;
+		}
+		else if (!g_ascii_strncasecmp(who, "ocs/", 4)) {
+			fed = YAHOO_FEDERATION_OCS;
+		}
+		else if (!g_ascii_strncasecmp(who, "ibm/", 4)) {
+			fed = YAHOO_FEDERATION_IBM;
+		}
+	}
 
 	if (who[0] == '+') {
 		/* we have an sms to be sent */
@@ -4334,15 +4426,20 @@
 	}
 
 	pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, yd->session_id);
-	if(msn) {
-		yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5, who+4);
-		yahoo_packet_hash_int(pkt, 241, 2);
+	fed_who = who;
+	switch (fed) {
+		case YAHOO_FEDERATION_MSN:
+		case YAHOO_FEDERATION_OCS:
+		case YAHOO_FEDERATION_IBM:
+			fed_who += 4;
+			break;
+		case YAHOO_FEDERATION_NONE:
+		default:
+			break;
 	}
-	else	{
-		yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5, who);
-		if ((f = yahoo_friend_find(gc, who)) && f->protocol)
-			yahoo_packet_hash_int(pkt, 241, f->protocol);
-	}
+	yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5, fed_who);
+	if (fed)
+		yahoo_packet_hash_int(pkt, 241, fed);
 
 	if (utf8)
 		yahoo_packet_hash_str(pkt, 97, "1");
@@ -4358,7 +4455,7 @@
 	 * just so that we don't inadvertantly reset their IMVironment back
 	 * to nothing.
 	 *
-	 * If they have no set an IMVironment, then use the default.
+	 * If they have not set an IMVironment, then use the default.
 	 */
 	wb = purple_whiteboard_get_session(gc->account, who);
 	if (wb)
@@ -4383,13 +4480,13 @@
 	/* We may need to not send any packets over 2000 bytes, but I'm not sure yet. */
 	if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) {
 		/* if p2p link exists, send through it. To-do: key 15, time value to be sent in case of p2p */
-		if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) {
+		if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !fed) {
 			yahoo_packet_hash_int(pkt, 11, p2p_data->session_id);
 			yahoo_p2p_write_pkt(p2p_data->source, pkt);
 		}
 		else	{
 			yahoo_packet_send(pkt, yd);
-			if(!msn)
+			if(!fed)
 				yahoo_send_p2p_pkt(gc, who, 0);		/* send p2p packet, with val_13=0 */
 		}
 	}
@@ -4408,9 +4505,21 @@
 {
 	YahooData *yd = gc->proto_data;
 	struct yahoo_p2p_data *p2p_data;
-	gboolean msn = !g_ascii_strncasecmp(who, "msn/", 4);
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 	struct yahoo_packet *pkt = NULL;
 
+	if (who[3] == '/') {
+		if (!g_ascii_strncasecmp(who, "msn/", 4)) {
+			fed = YAHOO_FEDERATION_MSN;
+		}
+		else if (!g_ascii_strncasecmp(who, "ocs/", 4)) {
+			fed = YAHOO_FEDERATION_OCS;
+		}
+		else if (!g_ascii_strncasecmp(who, "ibm/", 4)) {
+			fed = YAHOO_FEDERATION_IBM;
+		}
+	}
+
 	/* Don't do anything if sms is being typed */
 	if( strncmp(who, "+", 1) == 0 )
 		return 0;
@@ -4418,7 +4527,7 @@
 	pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, yd->session_id);
 
 	/* check to see if p2p link exists, send through it */
-	if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) {
+	if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !fed) {
 		yahoo_packet_hash(pkt, "sssssis", 49, "TYPING", 1, purple_connection_get_display_name(gc),
 	                  14, " ", 13, state == PURPLE_TYPING ? "1" : "0",
 	                  5, who, 11, p2p_data->session_id, 1002, "1");	/* To-do: key 15 to be sent in case of p2p */
@@ -4426,14 +4535,24 @@
 		yahoo_packet_free(pkt);
 	}
 	else	{	/* send through yahoo server */
-		if(msn)
-			yahoo_packet_hash(pkt, "sssssss", 49, "TYPING", 1, purple_connection_get_display_name(gc),
-	                  14, " ", 13, state == PURPLE_TYPING ? "1" : "0",
-	                  5, who+4, 1002, "1", 241, "2");
-		else
-			yahoo_packet_hash(pkt, "ssssss", 49, "TYPING", 1, purple_connection_get_display_name(gc),
-	                  14, " ", 13, state == PURPLE_TYPING ? "1" : "0",
-	                  5, who, 1002, "1");
+
+		const char *fed_who = who;
+		switch (fed) {
+			case YAHOO_FEDERATION_MSN:
+			case YAHOO_FEDERATION_OCS:
+			case YAHOO_FEDERATION_IBM:
+				fed_who += 4;
+				break;
+			case YAHOO_FEDERATION_NONE:
+			default:
+				break;
+		}
+		
+		yahoo_packet_hash(pkt, "ssssss", 49, "TYPING", 1, purple_connection_get_display_name(gc),
+                  14, " ", 13, state == PURPLE_TYPING ? "1" : "0",
+                  5, fed_who, 1002, "1");
+        if (fed)
+        	yahoo_packet_hash_int(pkt, 241, fed);
 		yahoo_packet_send_and_free(pkt, yd);
 	}
 
@@ -4680,17 +4799,29 @@
 	char *group2;
 	YahooFriend *f;
 	const char *bname;
-	gboolean msn = FALSE;
+	const char *fed_bname;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 
 	if (!yd->logged_in)
 		return;
 
-	bname = purple_buddy_get_name(buddy);
+	fed_bname = bname = purple_buddy_get_name(buddy);
 	if (!purple_privacy_check(purple_connection_get_account(gc), bname))
 		return;
 
 	f = yahoo_friend_find(gc, bname);
-	msn = !g_ascii_strncasecmp(bname, "msn/", 4);
+	if (bname[3] == '/') {
+		fed_bname += 4;
+		if (!g_ascii_strncasecmp(bname, "msn/", 4)) {
+			fed = YAHOO_FEDERATION_MSN;
+		}
+		else if (!g_ascii_strncasecmp(bname, "ocs/", 4)) {
+			fed = YAHOO_FEDERATION_OCS;
+		}
+		else if (!g_ascii_strncasecmp(bname, "ibm/", 4)) {
+			fed = YAHOO_FEDERATION_IBM;
+		}
+	}
 
 	g = purple_buddy_get_group(buddy);
 	if (g)
@@ -4700,37 +4831,35 @@
 
 	group2 = yahoo_string_encode(gc, group, NULL);
 	pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, yd->session_id);
-	if(msn) {
-		yahoo_packet_hash(pkt, "sssssssssss",
-			14, "",
-			65, group2,
-			97, "1",
-			1, purple_connection_get_display_name(gc),
-			302, "319",
-			300, "319",
-			7, bname + 4,
-			241, "2",
-			334, "0",
-			301, "319",
-			303, "319"
+	if (fed) {
+		yahoo_packet_hash(pkt, "sssssssisss",
+						  14, "",
+						  65, group2,
+						  97, "1",
+						  1, purple_connection_get_display_name(gc),
+						  302, "319",
+						  300, "319",
+						  7, fed_bname,
+						  241, fed,
+						  334, "0",
+						  301, "319",
+						  303, "319"
 		);
 	}
-	else	{
+	else {
 		yahoo_packet_hash(pkt, "ssssssssss",
-			14, "",
-			65, group2,
-			97, "1",
-			1, purple_connection_get_display_name(gc),
-			302, "319",
-			300, "319",
-	                7, bname,
-			334, "0",
-			301, "319",
-			303, "319"
+						  14, "",
+						  65, group2,
+						  97, "1",
+						  1, purple_connection_get_display_name(gc),
+						  302, "319",
+						  300, "319",
+						  7, fed_bname,
+						  334, "0",
+						  301, "319",
+						  303, "319"
 		);
 	}
-	if (f && f->protocol && !msn)
-		yahoo_packet_hash_int(pkt, 241, f->protocol);
 
 	yahoo_packet_send_and_free(pkt, yd);
 	g_free(group2);
@@ -4746,17 +4875,16 @@
 	char *cg;
 	const char *bname, *gname;
 	YahooFriend *f = NULL;
-	gboolean msn = FALSE;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 
 	bname = purple_buddy_get_name(buddy);
 	f = yahoo_friend_find(gc, bname);
 	if (!f)
 		return;
+	fed = f->fed;
 
 	gname = purple_group_get_name(group);
 	buddies = purple_find_buddies(purple_connection_get_account(gc), bname);
-	if(f->protocol == 2)
-		msn = TRUE;
 	for (l = buddies; l; l = l->next) {
 		g = purple_buddy_get_group(l->data);
 		if (purple_utf8_strcasecmp(gname, purple_group_get_name(g))) {
@@ -4767,20 +4895,29 @@
 
 	g_slist_free(buddies);
 
-	if (remove)
+	if (remove) {
 		g_hash_table_remove(yd->friends, bname);
+		f = NULL; /* f no longer valid - Just making it clear */
+	}
 
 	cg = yahoo_string_encode(gc, gname, NULL);
 	pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, yd->session_id);
 
-	if(msn)
-		yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc),
-	                  7, bname+4, 65, cg);
-	else
-		yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc),
+	switch (fed) {
+		case YAHOO_FEDERATION_MSN:
+		case YAHOO_FEDERATION_OCS:
+		case YAHOO_FEDERATION_IBM:
+			bname += 4;
+			break;
+		case YAHOO_FEDERATION_NONE:
+		default:
+			break;
+	}
+
+	yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc),
 	                  7, bname, 65, cg);
-	if(f->protocol)
-		yahoo_packet_hash_int(pkt, 241, f->protocol);
+	if (fed)
+		yahoo_packet_hash_int(pkt, 241, fed);
 	yahoo_packet_send_and_free(pkt, yd);
 	g_free(cg);
 }
@@ -4788,7 +4925,7 @@
 void yahoo_add_deny(PurpleConnection *gc, const char *who) {
 	YahooData *yd = (YahooData *)gc->proto_data;
 	struct yahoo_packet *pkt;
-	gboolean msn = FALSE;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 
 	if (!yd->logged_in)
 		return;
@@ -4796,11 +4933,22 @@
 	if (!who || who[0] == '\0')
 		return;
 
-	msn = !g_ascii_strncasecmp(who, "msn/", 4);
+	if (who[3] == '/') {
+		if (!g_ascii_strncasecmp(who, "msn/", 4)) {
+			fed = YAHOO_FEDERATION_MSN;
+		}
+		else if (!g_ascii_strncasecmp(who, "ocs/", 4)) {
+			fed = YAHOO_FEDERATION_OCS;
+		}
+		else if (!g_ascii_strncasecmp(who, "ibm/", 4)) {
+			fed = YAHOO_FEDERATION_IBM;
+		}
+	}
+	
 	pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, yd->session_id);
 
-	if(msn)
-		yahoo_packet_hash(pkt, "ssss", 1, purple_connection_get_display_name(gc), 7, who+4, 241, "2", 13, "1");
+	if(fed)
+		yahoo_packet_hash(pkt, "ssis", 1, purple_connection_get_display_name(gc), 7, who+4, 241, fed, 13, "1");
 	else
 		yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "1");
 
@@ -4810,19 +4958,28 @@
 void yahoo_rem_deny(PurpleConnection *gc, const char *who) {
 	YahooData *yd = (YahooData *)gc->proto_data;
 	struct yahoo_packet *pkt;
-	gboolean msn = FALSE;
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
 
 	if (!yd->logged_in)
 		return;
 
 	if (!who || who[0] == '\0')
 		return;
-
-	msn = !g_ascii_strncasecmp(who, "msn/", 4);
+	if (who[3] == '/') {
+		if (!g_ascii_strncasecmp(who, "msn/", 4)) {
+			fed = YAHOO_FEDERATION_MSN;
+		}
+		else if (!g_ascii_strncasecmp(who, "ocs/", 4)) {
+			fed = YAHOO_FEDERATION_OCS;
+		}
+		else if (!g_ascii_strncasecmp(who, "ibm/", 4)) {
+			fed = YAHOO_FEDERATION_IBM;
+		}
+	}
 	pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, YAHOO_STATUS_AVAILABLE, yd->session_id);
 
-	if(msn)
-		yahoo_packet_hash(pkt, "ssss", 1, purple_connection_get_display_name(gc), 7, who+4, 241, "2", 13, "2");
+	if(fed)
+		yahoo_packet_hash(pkt, "ssis", 1, purple_connection_get_display_name(gc), 7, who+4, 241, fed, 13, "2");
 	else
 		yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "2");
 	
@@ -4860,7 +5017,6 @@
 	struct yahoo_packet *pkt;
 	char *gpn, *gpo;
 	YahooFriend *f = yahoo_friend_find(gc, who);
-	gboolean msn = FALSE;
 	const char *temp = NULL;
 
 	/* Step 0:  If they aren't on the server list anyway,
@@ -4869,8 +5025,7 @@
 	if (!f)
 		return;
 
-	if(f->protocol == 2) {
-		msn = TRUE;
+	if(f->fed) {
 		temp = who+4;
 	} else
 		temp = who;
@@ -4888,9 +5043,9 @@
 	}
 
 	pkt = yahoo_packet_new(YAHOO_SERVICE_CHGRP_15, YAHOO_STATUS_AVAILABLE, yd->session_id);
-	if(f->protocol)
+	if(f->fed)
 		yahoo_packet_hash(pkt, "ssssissss", 1, purple_connection_get_display_name(gc),
-	                  302, "240", 300, "240", 7, temp, 241, f->protocol, 224, gpo, 264, gpn, 301,
+	                  302, "240", 300, "240", 7, temp, 241, f->fed, 224, gpo, 264, gpn, 301,
 	                  "240", 303, "240");
 	else
 		yahoo_packet_hash(pkt, "ssssssss", 1, purple_connection_get_display_name(gc),
--- a/libpurple/protocols/yahoo/libymsg.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/yahoo/libymsg.h	Tue Oct 20 22:31:57 2009 +0000
@@ -128,6 +128,20 @@
 	YAHOO_STATUS_DISCONNECTED = 0xffffffff /* in ymsg 15. doesnt mean the normal sense of 'disconnected' */
 };
 
+/*
+ * Yahoo federated networks.  Key 241 in ymsg.
+ * If it doesn't exist, it is on Yahoo's netowrk.
+ * It if does exist, send to another IM network.
+ */
+
+typedef enum {
+	YAHOO_FEDERATION_NONE = 0, /* No federation - Yahoo! network */
+	YAHOO_FEDERATION_OCS = 1,  /* LCS or OCS private networks */
+	YAHOO_FEDERATION_MSN = 2,  /* MSN or Windows Live network */
+	YAHOO_FEDERATION_IBM = 9   /* IBM/Sametime network */
+} YahooFederation;
+
+
 struct yahoo_buddy_icon_upload_data {
 	PurpleConnection *gc;
 	GString *str;
--- a/libpurple/protocols/yahoo/util.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/yahoo/util.c	Tue Oct 20 22:31:57 2009 +0000
@@ -881,6 +881,9 @@
 						}
 						g_free(etag);
 					}
+				} else {
+					/* We don't know what the tag is. Send it unmodified. */
+					g_string_append(dest, tag);
 				}
 
 				i = j;
--- a/libpurple/protocols/yahoo/yahoo_friend.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_friend.c	Tue Oct 20 22:31:57 2009 +0000
@@ -151,9 +151,8 @@
 	char *temp = NULL;
 	char *who = NULL;
 	int value = 0;
-	int protocol = 0;
-	gboolean msn = FALSE;
-
+	YahooFederation fed = YAHOO_FEDERATION_NONE;
+	
 	while (l) {
 		struct yahoo_pair *pair = l->data;
 
@@ -165,8 +164,7 @@
 				value = strtol(pair->value, NULL, 10);
 				break;
 			case 241:
-				protocol = strtol(pair->value, NULL, 10);
-				msn = TRUE;
+				fed = strtol(pair->value, NULL, 10);
 				break;
 		}
 
@@ -177,12 +175,21 @@
 		purple_debug_error("yahoo", "Received unknown value for presence key: %d\n", value);
 		return;
 	}
-
-	if(msn)
-		who = g_strconcat("msn/", temp, NULL);
-	else
-		who = g_strdup(temp);
-
+	
+	switch (fed) {
+		case YAHOO_FEDERATION_MSN:
+			who = g_strconcat("msn/", temp, NULL);
+			break;
+		case YAHOO_FEDERATION_OCS:
+			who = g_strconcat("ocs/", temp, NULL);
+			break;
+		case YAHOO_FEDERATION_IBM:
+			who = g_strconcat("ibm/", temp, NULL);
+			break;
+		case YAHOO_FEDERATION_NONE:
+			who = g_strdup(temp);
+			break;
+	}
 	g_return_if_fail(who != NULL);
 
 	f = yahoo_friend_find(gc, who);
@@ -228,12 +235,12 @@
 	f = yahoo_friend_find(gc, name);
 	if (!f)
 		return;
-
-	if(f->protocol == 2)
+	
+	if(f->fed != YAHOO_FEDERATION_NONE)
 		temp = name+4;
 	else
 		temp = name;
-
+    
 	/* No need to change the value if it is already correct */
 	if (f->presence == presence) {
 		purple_debug_info("yahoo", "Not setting presence because there are no changes.\n");
@@ -258,12 +265,12 @@
 		if (f->presence == YAHOO_PRESENCE_PERM_OFFLINE) {
 			pkt = yahoo_packet_new(YAHOO_SERVICE_PRESENCE_PERM,
 					YAHOO_STATUS_AVAILABLE, yd->session_id);
-			if(f->protocol)
+			if(f->fed)
 				yahoo_packet_hash(pkt, "ssssssiss",
 					1, purple_connection_get_display_name(gc),
 					31, "2", 13, "2",
 					302, "319", 300, "319",
-					7, temp, 241, f->protocol,
+					7, temp, 241, f->fed,
 					301, "319", 303, "319");
 			else
 				yahoo_packet_hash(pkt, "ssssssss",
@@ -285,12 +292,12 @@
 		pkt = yahoo_packet_new(service,
 				YAHOO_STATUS_AVAILABLE, yd->session_id);
 
-		if(f->protocol)
+		if(f->fed)
 			yahoo_packet_hash(pkt, "ssssssiss",
 				1, purple_connection_get_display_name(gc),
 				31, thirtyone, 13, thirteen,
 				302, "319", 300, "319",
-				7, temp, 241, f->protocol,
+				7, temp, 241, f->fed,
 				301, "319", 303, "319");
 		else
 			yahoo_packet_hash(pkt, "ssssssss",
--- a/libpurple/protocols/yahoo/yahoo_friend.h	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_friend.h	Tue Oct 20 22:31:57 2009 +0000
@@ -41,6 +41,7 @@
 	YAHOO_P2PSTATUS_WE_ARE_CLIENT
 } YahooP2PStatus;
 
+
 /* these are called friends instead of buddies mainly so I can use variables
  * named f and not confuse them with variables named b
  */
@@ -54,7 +55,7 @@
 	gchar *ip;
 	gboolean bicon_sent_request;
 	YahooPresenceVisibility presence;
-	int protocol; /* 1=LCS, 2=MSN*/
+	YahooFederation fed; 
 	long int version_id;
 	YahooPersonalDetails ypd;
 	YahooP2PStatus p2p_status;
--- a/libpurple/tests/test_jabber_jutil.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/tests/test_jabber_jutil.c	Tue Oct 20 22:31:57 2009 +0000
@@ -134,6 +134,14 @@
 	assert_invalid_jid("paul@2[::1]124/as");
 	assert_invalid_jid("paul@まつ.おおかみ/\x01");
 
+	/*
+	 * RFC 3454 Section 6 reads, in part,
+	 * "If a string contains any RandALCat character, the
+	 *  string MUST NOT contain any LCat character."
+	 * The character is U+066D (ARABIC FIVE POINTED STAR).
+	 */
+	assert_invalid_jid("foo@example.com/٭simplexe٭");
+
 	/* Ensure that jabber_id_new is properly lowercasing node and domains */
 	assert_jid_parts("paul", "darkrain42.org", "PaUL@darkrain42.org");
 	assert_jid_parts("paul", "darkrain42.org", "paul@DaRkRaIn42.org");
--- a/libpurple/tests/test_yahoo_util.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/libpurple/tests/test_yahoo_util.c	Tue Oct 20 22:31:57 2009 +0000
@@ -180,6 +180,12 @@
 
 	assert_string_equal_free("\x1B[1mbold \x1B[#FF0000mred <font face=\"Comic Sans MS\" size=\"20\">larger \x1B[#000000mbacktoblack <font size=\"12\">normalsize</font>\x1B[#FF0000m</font>\x1B[#000000m\x1B[x1m",
 			yahoo_html_to_codes("<b>bold <font color=\"#FF0000\">red <font face=\"Comic Sans MS\" size=\"5\">larger <font color=\"#000000\">backtoblack <font size=\"3\">normalsize</font></font></font></font></b>"));
+
+	/* buzz/unknown tags */
+	assert_string_equal_free("<ding>",
+			yahoo_html_to_codes("<ding>"));
+	assert_string_equal_free("Unknown <tags>",
+			yahoo_html_to_codes("Unknown <tags>"));
 }
 END_TEST
 
--- a/pidgin/gtkconv.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/gtkconv.c	Tue Oct 20 22:31:57 2009 +0000
@@ -4812,6 +4812,9 @@
 
 	list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls));
 
+	/* Allow a user to specify gtkrc settings for the chat userlist only */
+	gtk_widget_set_name(list, "pidgin_conv_userlist");
+
 	rend = gtk_cell_renderer_pixbuf_new();
 	g_object_set(G_OBJECT(rend),
 				 "stock-size", gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL),
--- a/pidgin/gtkdialogs.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/gtkdialogs.c	Tue Oct 20 22:31:57 2009 +0000
@@ -73,69 +73,70 @@
 
 /* Order: Alphabetical by Last Name */
 static const struct developer developers[] = {
-	{"Daniel 'datallah' Atallah",	NULL, NULL},
-	{"Paul 'darkrain42' Aurich",	NULL, NULL },
-	{"John 'rekkanoryo' Bailey",	N_("bug master"), NULL},
-	{"Ethan 'Paco-Paco' Blanton",	NULL, NULL},
-	{"Hylke Bons",			N_("artist"), "hylkebons@gmail.com"},
-	{"Thomas Butter",				NULL, NULL},
+	{"Daniel 'datallah' Atallah",          NULL,                  NULL},
+	{"Paul 'darkrain42' Aurich",           NULL,                  NULL},
+	{"John 'rekkanoryo' Bailey",           N_("bug master"),      NULL},
+	{"Ethan 'Paco-Paco' Blanton",          NULL,                  NULL},
+	{"Hylke Bons",                         N_("artist"),          "hylkebons@gmail.com"},
+	{"Thomas Butter",                      NULL,                  NULL},
 	/* feel free to not translate this */
-	{N_("Ka-Hing Cheung"),			NULL, NULL},
-	{"Sadrul Habib Chowdhury",		NULL, NULL},
-	{"Mark 'KingAnt' Doliner",		NULL, "mark@kingant.net"},
-	{"Sean Egan",					NULL, "sean.egan@gmail.com"},
-	{"Casey Harkins",               NULL,   NULL},
-	{"Gary 'grim' Kramlich",		NULL, "grim@pidgin.im"},
-	{"Richard 'rlaager' Laager",	NULL, "rlaager@pidgin.im"},
-	{"Richard 'wabz' Nelson",		NULL, NULL},
-	{"Christopher 'siege' O'Brien", NULL, "taliesein@users.sf.net"},
-	{"Bartosz Oler",		NULL, NULL},
-	{"Etan 'deryni' Reisner",       NULL, NULL},
-	{"Tim 'marv' Ringenbach",		NULL, NULL},
-	{"Michael 'Maiku' Ruprecht",	N_("voice and video"), NULL},
-	{"Elliott 'QuLogic' Sales de Andrade",	NULL,	NULL},
-	{"Luke 'LSchiere' Schierer",	N_("support"), "lschiere@users.sf.net"},
-	{"Evan Schoenberg",		NULL, NULL},
-	{"Kevin 'SimGuy' Stange",	N_("webmaster"),	NULL},
-	{"Will 'resiak' Thompson",	NULL,	NULL},
-	{"Stu 'nosnilmot' Tomlinson",	NULL, NULL},
+	{N_("Ka-Hing Cheung"),                 NULL,                  NULL},
+	{"Sadrul Habib Chowdhury",             NULL,                  NULL},
+	{"Mark 'KingAnt' Doliner",             NULL,                  "mark@kingant.net"},
+	{"Sean Egan",                          NULL,                  "sean.egan@gmail.com"},
+	{"Casey Harkins",                      NULL,                  NULL},
+	{"Gary 'grim' Kramlich",               NULL,                  "grim@pidgin.im"},
+	{"Richard 'rlaager' Laager",           NULL,                  "rlaager@pidgin.im"},
+	{"Sulabh 'sulabh_m' Mahajan",          NULL,                  NULL},
+	{"Richard 'wabz' Nelson",              NULL,                  NULL},
+	{"Christopher 'siege' O'Brien",        NULL,                  "taliesein@users.sf.net"},
+	{"Bartosz Oler",                       NULL,                  NULL},
+	{"Etan 'deryni' Reisner",              NULL,                  NULL},
+	{"Tim 'marv' Ringenbach",              NULL,                  NULL},
+	{"Michael 'Maiku' Ruprecht",           N_("voice and video"), NULL},
+	{"Elliott 'QuLogic' Sales de Andrade", NULL,                  NULL},
+	{"Luke 'LSchiere' Schierer",           N_("support"),         "lschiere@users.sf.net"},
+	{"Evan Schoenberg",                    NULL,                  NULL},
+	{"Kevin 'SimGuy' Stange",              N_("webmaster"),       NULL},
+	{"Will 'resiak' Thompson",             NULL,                  NULL},
+	{"Stu 'nosnilmot' Tomlinson",          NULL,                  NULL},
 	{NULL, NULL, NULL}
 };
 
 /* Order: Alphabetical by Last Name */
 static const struct developer patch_writers[] = {
-	{"Marcus 'malu' Lundblad", NULL, NULL},
-	{"Dennis 'EvilDennisR' Ristuccia",	N_("Senior Contributor/QA"),	NULL},
-	{"Peter 'Fmoo' Ruibal",		NULL,	NULL},
-	{"Gabriel 'Nix' Schulhof", 	NULL, 	NULL},
-	{"Jorge 'Masca' Villaseñor", 	NULL, 	NULL},
+	{"Marcus 'malu' Lundblad",         NULL,                        NULL},
+	{"Dennis 'EvilDennisR' Ristuccia", N_("Senior Contributor/QA"), NULL},
+	{"Peter 'Fmoo' Ruibal",            NULL,                        NULL},
+	{"Gabriel 'Nix' Schulhof",         NULL,                        NULL},
+	{"Jorge 'Masca' Villaseñor",       NULL,                        NULL},
 	{NULL, NULL, NULL}
 };
 
 /* Order: Alphabetical by Last Name */
 static const struct developer retired_developers[] = {
-	{"Herman Bloggs",		N_("win32 port"), "herman@bluedigits.com"},
-	{"Jim Duchek",			N_("maintainer"), "jim@linuxpimps.com"},
-	{"Rob Flynn",			N_("maintainer"), NULL},
-	{"Adam Fritzler",		N_("libfaim maintainer"), NULL},
-	{"Christian 'ChipX86' Hammond",	N_("webmaster"), NULL},
+	{"Herman Bloggs",               N_("win32 port"),          "herman@bluedigits.com"},
+	{"Jim Duchek",                  N_("maintainer"),          "jim@linuxpimps.com"},
+	{"Rob Flynn",                   N_("maintainer"),          NULL},
+	{"Adam Fritzler",               N_("libfaim maintainer"),  NULL},
+	{"Christian 'ChipX86' Hammond", N_("webmaster"),           NULL},
 	/* If "lazy bum" translates literally into a serious insult, use something else or omit it. */
-	{"Syd Logan",			N_("hacker and designated driver [lazy bum]"), NULL},
-	{"Megan 'Cae' Schneider",       N_("support/QA"), NULL},
-	{"Jim Seymour",			N_("XMPP"), NULL},
-	{"Mark Spencer",		N_("original author"), "markster@marko.net"},
-	{"Nathan 'faceprint' Walp",		NULL, NULL},
-	{"Eric Warmenhoven",	N_("lead developer"), "warmenhoven@yahoo.com"},
+	{"Syd Logan",                   N_("hacker and designated driver [lazy bum]"), NULL},
+	{"Megan 'Cae' Schneider",       N_("support/QA"),          NULL},
+	{"Jim Seymour",                 N_("XMPP"),                NULL},
+	{"Mark Spencer",                N_("original author"),     "markster@marko.net"},
+	{"Nathan 'faceprint' Walp",     NULL,                      NULL},
+	{"Eric Warmenhoven",            N_("lead developer"),      "warmenhoven@yahoo.com"},
 	{NULL, NULL, NULL}
 };
 
 /* Order: Alphabetical by Last Name */
 static const struct developer retired_patch_writers[] = {
-	{"Felipe 'shx' Contreras",		NULL,	NULL},
-	{"Decklin Foster",				NULL,	NULL},
-	{"Peter 'Bleeter' Lawler",      NULL,   NULL},
-	{"Robert 'Robot101' McQueen",	NULL,	NULL},
-	{"Benjamin Miller",				NULL,	NULL},
+	{"Felipe 'shx' Contreras",    NULL, NULL},
+	{"Decklin Foster",            NULL, NULL},
+	{"Peter 'Bleeter' Lawler",    NULL, NULL},
+	{"Robert 'Robot101' McQueen", NULL, NULL},
+	{"Benjamin Miller",           NULL, NULL},
 	{NULL, NULL, NULL}
 };
 
@@ -657,6 +658,12 @@
 	g_string_append(str, "    <b>Tk:</b> Disabled<br/>");
 }
 
+#ifdef USE_IDN
+	g_string_append(str, "    <b>UTF-8 DNS (IDN):</b> Enabled<br/>");
+#else
+	g_string_append(str, "    <b>UTF-8 DNS (IDN):</b> Disabled<br/>");
+#endif
+
 #ifdef USE_VV
 	g_string_append(str, "    <b>Voice and Video:</b> Enabled<br/>");
 #else
--- a/pidgin/gtkmedia.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/gtkmedia.c	Tue Oct 20 22:31:57 2009 +0000
@@ -89,6 +89,7 @@
 	GtkWidget *menubar;
 	GtkWidget *statusbar;
 
+	GtkWidget *hold;
 	GtkWidget *mute;
 	GtkWidget *pause;
 
@@ -187,6 +188,15 @@
 }
 
 static void
+pidgin_media_hold_toggled(GtkToggleButton *toggle, PidginMedia *media)
+{
+	purple_media_stream_info(media->priv->media,
+			gtk_toggle_button_get_active(toggle) ?
+			PURPLE_MEDIA_INFO_HOLD : PURPLE_MEDIA_INFO_UNHOLD,
+			NULL, NULL, TRUE);
+}
+
+static void
 pidgin_media_mute_toggled(GtkToggleButton *toggle, PidginMedia *media)
 {
 	purple_media_stream_info(media->priv->media,
@@ -633,6 +643,16 @@
 				FALSE, FALSE, 0);
 		gtk_widget_show(GTK_WIDGET(button_widget));
 		gtk_widget_show(send_widget);
+
+		/* Hold button */
+		gtkmedia->priv->hold =
+				gtk_toggle_button_new_with_mnemonic("_Hold");
+		g_signal_connect(gtkmedia->priv->hold, "toggled",
+				G_CALLBACK(pidgin_media_hold_toggled),
+				gtkmedia);
+		gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->hold,
+				FALSE, FALSE, 0);
+		gtk_widget_show(gtkmedia->priv->hold);
 	} else {
 		send_widget = gtkmedia->priv->send_widget;
 		button_widget = gtkmedia->priv->button_widget;
--- a/pidgin/gtkprefs.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/gtkprefs.c	Tue Oct 20 22:31:57 2009 +0000
@@ -1841,7 +1841,7 @@
 			G_CALLBACK(network_stun_server_changed_cb), NULL);
 	gtk_widget_show(entry);
 
-	pidgin_add_widget_to_vbox(GTK_BOX(vbox), "ST_UN server:",
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("ST_UN server:"),
 			sg, entry, TRUE, NULL);
 
 	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
--- a/pidgin/gtkroomlist.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/gtkroomlist.c	Tue Oct 20 22:31:57 2009 +0000
@@ -111,7 +111,18 @@
 static void dialog_select_account_cb(GObject *w, PurpleAccount *account,
 				     PidginRoomlistDialog *dialog)
 {
+	gboolean change = (account != dialog->account);
 	dialog->account = account;
+
+	if (change && dialog->roomlist) {
+		PidginRoomlist *rl = dialog->roomlist->ui_data;
+		if (rl->tree) {
+			gtk_widget_destroy(rl->tree);
+			rl->tree = NULL;
+		}
+		purple_roomlist_unref(dialog->roomlist);
+		dialog->roomlist = NULL;
+	}
 }
 
 static void list_button_cb(GtkButton *button, PidginRoomlistDialog *dialog)
--- a/pidgin/gtkutils.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/gtkutils.c	Tue Oct 20 22:31:57 2009 +0000
@@ -75,7 +75,7 @@
 } AopMenu;
 
 static guint accels_save_timer = 0;
-static GList *gnome_url_handlers = NULL;
+static GSList *registered_url_handlers = NULL;
 
 static gboolean
 url_clicked_idle_cb(gpointer data)
@@ -3890,7 +3890,7 @@
 				start += sizeof("/desktop/gnome/url-handlers/") - 1;
 
 				protocol = g_strdup_printf("%s:", start);
-				gnome_url_handlers = g_list_prepend(gnome_url_handlers, protocol);
+				registered_url_handlers = g_slist_prepend(registered_url_handlers, protocol);
 				gtk_imhtml_class_register_protocol(protocol, url_clicked_cb, link_context_menu);
 			}
 			start = c + 1;
@@ -3898,9 +3898,45 @@
 	}
 	g_free(tmp);
 
-	return (gnome_url_handlers != NULL);
+	return (registered_url_handlers != NULL);
 }
 
+#ifdef _WIN32
+static void
+winpidgin_register_win32_url_handlers(void)
+{
+	int idx = 0;
+	LONG ret = ERROR_SUCCESS;
+
+	do {
+		DWORD nameSize = 256;
+		char start[256];
+		/* I don't think we need to worry about non-ASCII protocol names */
+		ret = RegEnumKeyExA(HKEY_CLASSES_ROOT, idx++, start, &nameSize,
+							NULL, NULL, NULL, NULL);
+		if (ret == ERROR_SUCCESS) {
+			HKEY reg_key = NULL;
+			ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, start, 0, KEY_READ, &reg_key);
+			if (ret == ERROR_SUCCESS) {
+				ret = RegQueryValueExA(reg_key, "URL Protocol", NULL, NULL, NULL, NULL);
+				if (ret == ERROR_SUCCESS) {
+					gchar *protocol = g_strdup_printf("%s:", start);
+					registered_url_handlers = g_slist_prepend(registered_url_handlers, protocol);
+					/* We still pass everything to the "http" "open" handler for security reasons */
+					gtk_imhtml_class_register_protocol(protocol, url_clicked_cb, link_context_menu);
+				}
+				RegCloseKey(reg_key);
+			}
+			ret = ERROR_SUCCESS;
+		}
+	} while (ret == ERROR_SUCCESS);
+
+	if (ret != ERROR_NO_MORE_ITEMS)
+		purple_debug_error("winpidgin", "Error iterating HKEY_CLASSES_ROOT subkeys: %ld\n",
+						   ret);
+}
+#endif
+
 void pidgin_utils_init(void)
 {
 	gtk_imhtml_class_register_protocol("http://", url_clicked_cb, link_context_menu);
@@ -3918,6 +3954,11 @@
 	/* If we're under GNOME, try registering the system URL handlers. */
 	if (purple_running_gnome())
 		register_gnome_url_handlers();
+
+#ifdef _WIN32
+	winpidgin_register_win32_url_handlers();
+#endif
+
 }
 
 void pidgin_utils_uninit(void)
@@ -3925,16 +3966,16 @@
 	gtk_imhtml_class_register_protocol("open://", NULL, NULL);
 
 	/* If we have GNOME handlers registered, unregister them. */
-	if (gnome_url_handlers)
+	if (registered_url_handlers)
 	{
-		GList *l;
-		for (l = gnome_url_handlers ; l ; l = l->next)
+		GSList *l;
+		for (l = registered_url_handlers; l; l = l->next)
 		{
 			gtk_imhtml_class_register_protocol((char *)l->data, NULL, NULL);
 			g_free(l->data);
 		}
-		g_list_free(gnome_url_handlers);
-		gnome_url_handlers = NULL;
+		g_slist_free(registered_url_handlers);
+		registered_url_handlers = NULL;
 		return;
 	}
 
--- a/pidgin/pixmaps/emotes/default/24/default.theme.in	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/pixmaps/emotes/default/24/default.theme.in	Tue Oct 20 22:31:57 2009 +0000
@@ -491,7 +491,7 @@
 smile-big.png             :D    :-D    =D
 wink.png                  ;)    ;-)    ;^)
 shock.png                 :-o
-tongue.png                :P    :-P    :-p
+tongue.png                :P    :-P    :-p    :p
 glasses-cool.png          B-)
 angry.png                 X-(
 sad.png                   :(    :-(    =(
--- a/pidgin/pixmaps/emotes/small/16/small.theme.in	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/pixmaps/emotes/small/16/small.theme.in	Tue Oct 20 22:31:57 2009 +0000
@@ -188,7 +188,7 @@
 smile-big.png             :D    :-D    =D
 wink.png                  ;)    ;-)    ;^)
 shock.png                 :-o
-tongue.png                :P    :-P    :-p
+tongue.png                :P    :-P    :-p    :p
 glasses-cool.png          B-)
 angry.png                 X-(
 sad.png                   :(    :-(    =(
--- a/pidgin/plugins/disco/gtkdisco.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/plugins/disco/gtkdisco.c	Tue Oct 20 22:31:57 2009 +0000
@@ -141,8 +141,18 @@
 static void dialog_select_account_cb(GObject *w, PurpleAccount *account,
                                      PidginDiscoDialog *dialog)
 {
+	gboolean change = (account != dialog->account);
 	dialog->account = account;
 	gtk_widget_set_sensitive(dialog->browse_button, account != NULL);
+
+	if (change && dialog->discolist) {
+		if (dialog->discolist->tree) {
+			gtk_widget_destroy(dialog->discolist->tree);
+			dialog->discolist->tree = NULL;
+		}
+		pidgin_disco_list_unref(dialog->discolist);
+		dialog->discolist = NULL;
+	}
 }
 
 static void register_button_cb(GtkWidget *unused, PidginDiscoDialog *dialog)
--- a/pidgin/plugins/xmppconsole.c	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/plugins/xmppconsole.c	Tue Oct 20 22:31:57 2009 +0000
@@ -660,7 +660,6 @@
 
 	gtk_combo_box_remove_text(GTK_COMBO_BOX(console->dropdown), i);
 	console->accounts = g_list_remove(console->accounts, gc);
-	printf("%s\n", purple_account_get_username(gc->account));
 	console->count--;
 
 	if (gc == console->gc) {
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Wed Sep 30 21:31:04 2009 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Tue Oct 20 22:31:57 2009 +0000
@@ -717,6 +717,7 @@
     Delete "$INSTDIR\ca-certs\AOL_Member_CA.pem"
     Delete "$INSTDIR\ca-certs\CAcert_Class3.pem"
     Delete "$INSTDIR\ca-certs\CAcert_Root.pem"
+    Delete "$INSTDIR\ca-certs\Entrust.net_Secure_Server_CA.pem"
     Delete "$INSTDIR\ca-certs\Equifax_Secure_CA.pem"
     Delete "$INSTDIR\ca-certs\Equifax_Secure_Global_eBusiness_CA-1.pem"
     Delete "$INSTDIR\ca-certs\GTE_CyberTrust_Global_Root.pem"
--- a/po/ChangeLog	Wed Sep 30 21:31:04 2009 +0000
+++ b/po/ChangeLog	Tue Oct 20 22:31:57 2009 +0000
@@ -1,5 +1,11 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 2.6.4
+	* Vietnamese translation updated (Clytie Siddall)
+
+version 2.6.3
+	* No changes
+
 version 2.6.2
 	* Afrikaans translation updated (Friedel Wolff)
 	* Albanian translation updated (Besnik Bleta)
--- a/po/de.po	Wed Sep 30 21:31:04 2009 +0000
+++ b/po/de.po	Tue Oct 20 22:31:57 2009 +0000
@@ -11,8 +11,8 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-16 11:43+0200\n"
-"PO-Revision-Date: 2009-09-16 11:37+0200\n"
+"POT-Creation-Date: 2009-10-07 22:35+0200\n"
+"PO-Revision-Date: 2009-10-07 22:34+0200\n"
 "Last-Translator: Bjoern Voigt <bjoern@cs.tu-berlin.de>\n"
 "Language-Team: Deutsch <de@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -951,6 +951,9 @@
 msgid "(none)"
 msgstr "(kein)"
 
+#. XXX: The following expects that finch_notify_message gets called. This
+#. * may not always happen, e.g. when another plugin sets its own
+#. * notify_message. So tread carefully.
 msgid "URI"
 msgstr "URI"
 
@@ -1041,10 +1044,10 @@
 msgstr "Alarm, wenn Buddy..."
 
 msgid "Signs on"
-msgstr "sich anmeldet"
+msgstr "sich angemeldet"
 
 msgid "Signs off"
-msgstr "sich abmeldet"
+msgstr "sich abgemeldet"
 
 msgid "Goes away"
 msgstr "hinausgeht"
@@ -1461,7 +1464,7 @@
 msgstr "%s hat eine Nachricht in %s gesendet"
 
 msgid "Buddy signs on/off"
-msgstr "Buddy sich an/abmeldet"
+msgstr "Buddy hat sich an- oder abgemeldet"
 
 msgid "You receive an IM"
 msgstr "Sie empfangen einen Nachricht"
@@ -1526,6 +1529,13 @@
 "\n"
 "Hole TinyURL..."
 
+#, c-format
+msgid "TinyURL for above: %s"
+msgstr "TinyURL für oben: %s"
+
+msgid "Please wait while TinyURL fetches a shorter URL ..."
+msgstr "Bitte warten Sie, während TinyURL eine kürzere URL holt ..."
+
 msgid "Only create TinyURL for URLs of this length or greater"
 msgstr "TinyURL nur für URLs mit mindestens dieser Länge generieren"
 
@@ -1885,6 +1895,10 @@
 msgstr "Auflösungsprozess hat sich beendet ohne die Anfrage zu beantworten"
 
 #, c-format
+msgid "Error converting %s to punycode: %d"
+msgstr "Fehler beim Konvertieren von %s zu Punycode: %d"
+
+#, c-format
 msgid "Thread creation failure: %s"
 msgstr "Fehler beim Erzeugen eines Threads: %s"
 
@@ -2898,7 +2912,7 @@
 msgstr "Buddy _untätig wird"
 
 msgid "Buddy _Signs On/Off"
-msgstr "Buddy _sich an/abmeldet"
+msgstr "Buddy hat_sich an- oder abgemeldet"
 
 #. *< type
 #. *< ui_requirement
@@ -5179,7 +5193,7 @@
 #, c-format
 msgid ""
 "Unable to add the buddy %s because the username is invalid.  Usernames must "
-"be a valid email address."
+"be valid email addresses."
 msgstr ""
 "Konnte den Buddy %s nicht hinzufügen, da der Benutzername ungültig ist.  "
 "Benutzernamen müssen gültige E-Mail-Adressen sein."
@@ -9708,6 +9722,17 @@
 msgid "Open Inbox"
 msgstr "Öffne Posteingang"
 
+msgid "Can't send SMS. Unable to obtain mobile carrier."
+msgstr ""
+"Die SMS kann nicht gesendet werden. Es konnte kein Mobilfunkkanal erreicht "
+"werden."
+
+msgid "Can't send SMS. Unknown mobile carrier."
+msgstr "Die SMS kann nicht gesendet werden. Unbekannter Mobilfunkkanal."
+
+msgid "Getting mobile carrier to send the SMS."
+msgstr "Hole einen Mobilfunkkanal zum Senden der SMS."
+
 #. Write a local message to this conversation showing that a request for a
 #. * Doodle session has been made
 #.
@@ -12376,7 +12401,7 @@
 msgstr "Verwerfen"
 
 msgid "<span weight=\"bold\" size=\"larger\">You have pounced!</span>"
-msgstr "<span weight=\"bold\" size=\"larger\">Sie haben geklopft!</span>"
+msgstr "<span weight=\"bold\" size=\"larger\">Sie wurden angestoßen!</span>"
 
 msgid "The following plugins will be unloaded."
 msgstr "Die folgenden Plugins werden entladen."
@@ -12440,10 +12465,10 @@
 msgstr "Budd_y-Name:"
 
 msgid "Si_gns on"
-msgstr "si_ch anmeldet"
+msgstr "si_ch angemeldet"
 
 msgid "Signs o_ff"
-msgstr "sich abmel_det"
+msgstr "sich abgemel_det"
 
 msgid "Goes a_way"
 msgstr "hinausgeh_t"
@@ -12509,7 +12534,7 @@
 msgstr "Hat beim Tippen angehalten"
 
 msgid "Signed on"
-msgstr "Hat sich anmeldet"
+msgstr "Hat sich angemeldet"
 
 msgid "Returned from being idle"
 msgstr "Ist nicht mehr inaktiv"
@@ -12521,7 +12546,7 @@
 msgstr "Hat das Tippen gestoppt"
 
 msgid "Signed off"
-msgstr "Hat sich abmeldet"
+msgstr "Hat sich abgemeldet"
 
 msgid "Became idle"
 msgstr "Wurde untätig"
@@ -12535,6 +12560,21 @@
 msgid "Unknown.... Please report this!"
 msgstr "Unbekannt.... Bitte berichten Sie dieses Problem!"
 
+msgid "(Custom)"
+msgstr "(Benutzerdefiniert)"
+
+msgid "(Default)"
+msgstr "(Standard)"
+
+msgid "The default Pidgin sound theme"
+msgstr "Das Standard-Klangthema für Pidgin"
+
+msgid "The default Pidgin buddy list theme"
+msgstr "Das Standard-Buddy-Listen-Thema für Pidgin"
+
+msgid "The default Pidgin status icon theme"
+msgstr "Das Standard-Status-Icon-Thema für Pidgin"
+
 msgid "Theme failed to unpack."
 msgstr "Thema konnte nicht entpackt werden."
 
@@ -14381,9 +14421,6 @@
 "\n"
 "* Hinweis: Dieses Plugin verlangt Win2000 oder höher."
 
-msgid "GTK+ Runtime Version"
-msgstr "GTK+ Runtime Version"
-
 #. Autostart
 msgid "Startup"
 msgstr "Start"
@@ -14392,6 +14429,9 @@
 msgid "_Start %s on Windows startup"
 msgstr "_Starte %s beim Windows-Start"
 
+msgid "Allow multiple instances"
+msgstr "Mehrere Instanzen erlauben"
+
 msgid "_Dockable Buddy List"
 msgstr "An_dockbare Buddy-Liste"
 
--- a/po/vi.po	Wed Sep 30 21:31:04 2009 +0000
+++ b/po/vi.po	Tue Oct 20 22:31:57 2009 +0000
@@ -7,20 +7,20 @@
 # Trinh Minh Thanh <tmthanh@yahoo.com>.
 # Nguyễn Thái Ngọc Duy <pclouds@users.sf.net>.
 # Nguyễn Xuân Nguyên <xxxnnn@gmail.com>, 2007.
-# Clytie Siddall <clytie@riverland.net.au>, 2007-2008.
+# Clytie Siddall <clytie@riverland.net.au>, 2007-2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: CVS Version of Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-07 18:26-0700\n"
-"PO-Revision-Date: 2008-06-22 21:58+0930\n"
+"POT-Creation-Date: 2009-10-03 22:46-0700\n"
+"PO-Revision-Date: 2009-09-30 22:16+0930\n"
 "Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
 "Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: LocFactoryEditor 1.7b3\n"
+"X-Generator: LocFactoryEditor 1.8\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
@@ -31,7 +31,7 @@
 msgid "%s. Try `%s -h' for more information.\n"
 msgstr "%s. Chạy '%s -h' để biết thêm thông tin.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s\n"
 "Usage: %s [OPTION]...\n"
@@ -43,13 +43,13 @@
 "  -v, --version       display the current version and exit\n"
 msgstr ""
 "%s\n"
-"Cách sử dụng: %s [TÙY_CHỌN]...\n"
+"Sử dụng: %s [TÙY_CHỌN]...\n"
 "\n"
 "  -c, --config=THƯ_MỤC    dùng thư mục này cho các tập tin cấu hình\n"
-"  -d, --debug         in các thông điệp gỡ lỗi ra thiết bị xuất chuẩn\n"
-"  -h, --help          hiện trợ giúp này rồi thoát\n"
-"  -n, --nologin       đừng tự động đăng nhập\n"
-"  -v, --version       hiện phiên bản hiện thời rồi thoát\n"
+"  -d, --debug         ra các thông điệp gỡ lỗi ra đầu lỗi tiêu chuẩn\n"
+"  -h, --help          hiển thị trợ giúp này, sau đó thoát\n"
+"  -n, --nologin       không tự động đăng nhập\n"
+"  -v, --version       hiển thị phiên bản hiện thời, sau đó thoát\n"
 
 #, c-format
 msgid ""
@@ -76,9 +76,8 @@
 msgid "Remember password"
 msgstr "Ghi nhớ mật khẩu"
 
-#, fuzzy
 msgid "There are no protocol plugins installed."
-msgstr "Chưa cài đặt phần bổ sung giao thức."
+msgstr "Chưa cài đặt phần bổ sung giao thức nào."
 
 msgid "(You probably forgot to 'make install'.)"
 msgstr "(Rất có thể là bạn quên chạy lệnh « make install ».)"
@@ -142,17 +141,17 @@
 
 #, c-format
 msgid "%s%s%s%s has made %s his or her buddy%s%s"
-msgstr "%s%s%s%s đã đặt %s là bạn thân của họ%s%s"
+msgstr "%s%s%s%s đã đặt %s là bạn chát của họ%s%s"
 
 msgid "Add buddy to your list?"
-msgstr "Có thêm bạn thân vào danh sách của bạn không?"
+msgstr "Có thêm bạn chát vào danh sách của bạn không?"
 
 #, c-format
 msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s"
 msgstr "%s%s%s%s muốn thêm %s vào danh sách bạn bè của họ%s%s"
 
 msgid "Authorize buddy?"
-msgstr "Cho phép bạn thân không?"
+msgstr "Cho phép bạn chát không?"
 
 msgid "Authorize"
 msgstr "Cho phép"
@@ -184,7 +183,7 @@
 msgstr "Mặc định"
 
 msgid "You must provide a username for the buddy."
-msgstr "Bạn cần phải cung cấp một tên người dùng cho bạn thân."
+msgstr "Bạn cần phải cung cấp một tên người dùng cho bạn chát."
 
 msgid "You must provide a group."
 msgstr "Bạn cần phải cung cấp một nhóm."
@@ -196,7 +195,7 @@
 msgstr "Tài khoản đã chọn không phải hiện thời trực tuyến."
 
 msgid "Error adding buddy"
-msgstr "Lỗi thêm bạn thân"
+msgstr "Lỗi thêm bạn chát"
 
 msgid "Username"
 msgstr "Tên đăng nhập"
@@ -211,10 +210,10 @@
 msgstr "Tài khoản"
 
 msgid "Add Buddy"
-msgstr "Thêm bạn thân"
+msgstr "Thêm bạn chát"
 
 msgid "Please enter buddy information."
-msgstr "Hãy nhập thông tin về bạn thân."
+msgstr "Hãy nhập thông tin về bạn chát."
 
 msgid "Chats"
 msgstr "Cuộc Chat"
@@ -272,7 +271,7 @@
 msgstr "Lấy thông tin"
 
 msgid "Add Buddy Pounce"
-msgstr "Thêm thông báo bạn thân"
+msgstr "Thêm thông báo bạn chát"
 
 msgid "Send File"
 msgstr "Gửi tập tin"
@@ -297,10 +296,10 @@
 msgstr "Gõ chuỗi rỗng để đặt lại tên."
 
 msgid "Removing this contact will also remove all the buddies in the contact"
-msgstr "Gỡ bỏ liên lạc này thì cũng gỡ bỏ mọi bạn thân trong liên lạc"
+msgstr "Gỡ bỏ liên lạc này thì cũng gỡ bỏ mọi bạn chát trong liên lạc"
 
 msgid "Removing this group will also remove all the buddies in the group"
-msgstr "Gỡ bỏ nhóm này thì cũng gỡ bỏ mọi bạn thân trong nhóm"
+msgstr "Gỡ bỏ nhóm này thì cũng gỡ bỏ mọi bạn chát trong nhóm"
 
 #, c-format
 msgid "Are you sure you want to remove %s?"
@@ -421,7 +420,7 @@
 msgstr "Nhóm rỗng"
 
 msgid "Offline buddies"
-msgstr "Bạn thân ngoại tuyến"
+msgstr "Bạn chát ngoại tuyến"
 
 msgid "Sort"
 msgstr "Sắp xếp"
@@ -621,7 +620,7 @@
 msgstr "Hiện nhãn thời gian"
 
 msgid "Add Buddy Pounce..."
-msgstr "Thêm thông báo bạn thân..."
+msgstr "Thêm thông báo bạn chát..."
 
 msgid "Invite..."
 msgstr "Mời..."
@@ -635,13 +634,16 @@
 msgid "<AUTO-REPLY> "
 msgstr "<TỰ_ĐỘNG_ĐÁP_ỨNG>"
 
-#, fuzzy, c-format
+#, c-format
 msgid "List of %d user:\n"
 msgid_plural "List of %d users:\n"
-msgstr[0] "Danh sách người dùng:\n"
-
-msgid "Supported debug options are:  version"
-msgstr "Tùy chọn gỡ lỗi được hỗ trợ : phiên bản"
+msgstr[0] "Danh sách %d người dùng:\n"
+
+msgid "Supported debug options are: plugins version"
+msgstr ""
+"Tùy chọn gỡ lỗi được hỗ trợ :\n"
+" • plugins\t\tcác phần bổ sung\n"
+" • version\t\tphiên bản"
 
 msgid "No such command (in this context)."
 msgstr "Không có lệnh nào như vậy (trong ngữ cảnh này)."
@@ -676,7 +678,7 @@
 
 msgid "me &lt;action&gt;:  Send an IRC style action to a buddy or chat."
 msgstr ""
-"me &lt;hành động&gt;: Gởi một hoạt động kiểu IRC đến bạn thân hay chát."
+"me &lt;hành động&gt;: Gởi một hoạt động kiểu IRC đến bạn chát hay chát."
 
 msgid ""
 "debug &lt;option&gt;:  Send various debug information to the current "
@@ -868,12 +870,11 @@
 msgid "System Log"
 msgstr "Sổ theo dõi hệ thống"
 
-#, fuzzy
 msgid "Calling..."
-msgstr "Đang tính toán..."
+msgstr "Đang gọi..."
 
 msgid "Hangup"
-msgstr ""
+msgstr "Ngừng nói"
 
 #. Number of actions
 msgid "Accept"
@@ -883,25 +884,25 @@
 msgstr "Từ chối"
 
 msgid "Call in progress."
-msgstr ""
+msgstr "Cuộc gọi đang chạy."
 
 msgid "The call has been terminated."
-msgstr ""
+msgstr "Cuộc gọi đã bị chấm dứt."
 
 #, c-format
 msgid "%s wishes to start an audio session with you."
-msgstr ""
+msgstr "%s muốn bắt đầu một buổi hợp tiếng nói với bạn."
 
 #, c-format
 msgid "%s is trying to start an unsupported media session type with you."
 msgstr ""
-
-#, fuzzy
+"%s đang thử bắt đầu với bạn một buổi hợp kiểu phương tiện không được hỗ trợ."
+
 msgid "You have rejected the call."
-msgstr "Bạn rời khỏi kênh %s%s"
+msgstr "Bạn đã từ chối cuộc gọi."
 
 msgid "call: Make an audio call."
-msgstr ""
+msgstr "gọi: Gọi nói tiếng cho ai đó."
 
 msgid "Emails"
 msgstr "Thư điện tử"
@@ -928,7 +929,7 @@
 msgstr "Thông tin cho %s"
 
 msgid "Buddy Information"
-msgstr "Thông tin bạn thân"
+msgstr "Thông tin bạn chát"
 
 msgid "Continue"
 msgstr "Tiếp tục"
@@ -942,6 +943,9 @@
 msgid "(none)"
 msgstr "(không có)"
 
+#. XXX: The following expects that finch_notify_message gets called. This
+#. * may not always happen, e.g. when another plugin sets its own
+#. * notify_message. So tread carefully.
 msgid "URI"
 msgstr "URI"
 
@@ -1007,13 +1011,13 @@
 msgstr "Tùy thích"
 
 msgid "Please enter a buddy to pounce."
-msgstr "Hãy nhập một bạn thân để thông báo."
+msgstr "Hãy nhập một bạn chát để thông báo."
 
 msgid "New Buddy Pounce"
-msgstr "Thông báo bạn thân mới"
+msgstr "Thông báo bạn chát mới"
 
 msgid "Edit Buddy Pounce"
-msgstr "Sửa thông báo bạn thân"
+msgstr "Sửa thông báo bạn chát"
 
 msgid "Pounce Who"
 msgstr "Thông báo cho ai"
@@ -1027,7 +1031,7 @@
 
 #. Create the "Pounce When Buddy..." frame.
 msgid "Pounce When Buddy..."
-msgstr "Thông báo khi bạn thân..."
+msgstr "Thông báo khi bạn chát..."
 
 msgid "Signs on"
 msgstr "Đăng nhập"
@@ -1098,7 +1102,7 @@
 msgstr "Bạn chắc chắn muốn xoá thông báo trên %s cho %s không?"
 
 msgid "Buddy Pounces"
-msgstr "Thông báo bạn thân"
+msgstr "Thông báo bạn chát"
 
 #, c-format
 msgid "%s has started typing to you (%s)"
@@ -1159,7 +1163,7 @@
 msgstr "Hiển thị bạn bè ngoại tuyến"
 
 msgid "Notify buddies when you are typing"
-msgstr "Thông báo bạn thân mà bạn đang gõ tin nhẳn cho họ"
+msgstr "Thông báo bạn chát mà bạn đang gõ tin nhẳn cho họ"
 
 msgid "Log format"
 msgstr "Định dạng sổ theo dõi"
@@ -1220,10 +1224,10 @@
 msgstr "Danh sách phòng"
 
 msgid "Buddy logs in"
-msgstr "Bạn thân đăng nhập"
+msgstr "Bạn chát đăng nhập"
 
 msgid "Buddy logs out"
-msgstr "Bạn thân đăng xuất"
+msgstr "Bạn chát đăng xuất"
 
 msgid "Message received"
 msgstr "Nhận tin nhẳn"
@@ -1450,7 +1454,7 @@
 msgstr "%s đã gửi tin nhẳn trong %s"
 
 msgid "Buddy signs on/off"
-msgstr "Bạn thân đăng nhập/xuất"
+msgstr "Bạn chát đăng nhập/xuất"
 
 msgid "You receive an IM"
 msgstr "Bạn nhận tin nhắn"
@@ -1513,22 +1517,31 @@
 "\n"
 "Fetching TinyURL..."
 msgstr ""
+"\n"
+"Đang lấy TinyURL..."
+
+#, c-format
+msgid "TinyURL for above: %s"
+msgstr ""
+
+msgid "Please wait while TinyURL fetches a shorter URL ..."
+msgstr ""
 
 msgid "Only create TinyURL for URLs of this length or greater"
-msgstr ""
+msgstr "Chỉ tạo TinyURL cho địa chỉ URL có ít nhất chiều dài này"
 
 msgid "TinyURL (or other) address prefix"
-msgstr ""
-
-#, fuzzy
+msgstr "Tiền tố địa chỉ TinyURL (hay kiểu khác)"
+
 msgid "TinyURL"
-msgstr "URL điệu"
+msgstr "TinyURL"
 
 msgid "TinyURL plugin"
-msgstr ""
+msgstr "Phần bổ sung TinyURL"
 
 msgid "When receiving a message with URL(s), use TinyURL for easier copying"
 msgstr ""
+"Khi nhận một tin nhẳn chứa địa chỉ URL, dùng TinyURL để sao chép dễ hơn"
 
 msgid "Online"
 msgstr "Trực tuyến"
@@ -1537,10 +1550,10 @@
 msgstr "Ngoại tuyến"
 
 msgid "Online Buddies"
-msgstr "Bạn thân trực tuyến"
+msgstr "Bạn chát trực tuyến"
 
 msgid "Offline Buddies"
-msgstr "Bạn thân ngoại tuyến"
+msgstr "Bạn chát ngoại tuyến"
 
 msgid "Online/Offline"
 msgstr "Trực/Ngoại tuyến"
@@ -1552,13 +1565,13 @@
 msgstr "Không theo nhóm"
 
 msgid "Nested Subgroup"
-msgstr ""
+msgstr "Nhóm phụ lồng vào"
 
 msgid "Nested Grouping (experimental)"
-msgstr ""
+msgstr "Nhóm lại lồng nhau (vẫn thực nghiệm"
 
 msgid "Provides alternate buddylist grouping options."
-msgstr "Cung cấp thêm tùy chọn nhóm lại danh sách bạn thân."
+msgstr "Cung cấp thêm tùy chọn nhóm lại danh sách bạn chát."
 
 # Name: don't translate/Tên: đừng dịch
 msgid "Lastlog"
@@ -1636,28 +1649,22 @@
 msgid "buddy list"
 msgstr "danh sách bạn bè"
 
-#, fuzzy
 msgid "The certificate is self-signed and cannot be automatically checked."
-msgstr ""
-"« %s » cung cấp một chứng nhận tự ký. Không thể tự động kiểm tra chứng nhận "
-"như vậy."
-
-#, fuzzy
+msgstr "Chứng nhận này tự ký thì không thể được tự động kiểm tra."
+
 msgid "The root certificate this one claims to be issued by is unknown."
-msgstr "Pidgin không nhận ra chứng nhận gốc có vẻ đã cấp chứng nhận này."
-
-#, fuzzy
+msgstr "Không nhận ra chứng nhận gốc mà tùy theo chứng nhận này đã cấp nó."
+
 msgid "The certificate is not valid yet."
-msgstr "Dãy chứng nhận được cung cấp cho %s không phải là hợp lệ."
-
-#, fuzzy
+msgstr "Chứng nhận này chưa hợp lệ."
+
 msgid "The certificate has expired and should not be considered valid."
-msgstr "Dãy chứng nhận được cung cấp cho %s không phải là hợp lệ."
+msgstr ""
+"Chứng nhận này đã hết hạn sử dụng thì không nên được thấy là vẫn hợp lệ."
 
 #. Translators: "domain" refers to a DNS domain (e.g. talk.google.com)
-#, fuzzy
 msgid "The certificate presented is not issued to this domain."
-msgstr "Dãy chứng nhận được cung cấp cho %s không phải là hợp lệ."
+msgstr "Chứng nhận đưa ra không phải được cấp cho miền này."
 
 msgid ""
 "You have no database of root certificates, so this certificate cannot be "
@@ -1666,20 +1673,17 @@
 "Bạn không có cơ sở dữ liệu chứng nhận gốc nên không thể thẩm tra chứng nhận "
 "này."
 
-#, fuzzy
 msgid "The certificate chain presented is invalid."
-msgstr "Dãy chứng nhận được cung cấp cho %s không phải là hợp lệ."
-
-#, fuzzy
+msgstr "Dãy chứng nhận đưa ra không phải hợp lệ."
+
 msgid "The certificate has been revoked."
-msgstr "Dãy chứng nhận được cung cấp cho %s không phải là hợp lệ."
-
-#, fuzzy
+msgstr "Chứng nhận đã bị hủy bỏ."
+
 msgid "An unknown certificate error occurred."
-msgstr "Lỗi đăng nhập không rõ : %s."
+msgstr "Gặp một lỗi chứng nhận không rõ."
 
 msgid "(DOES NOT MATCH)"
-msgstr "(KHÔNG KHỚP)"
+msgstr "(KHÔNG TƯƠNG ỨNG)"
 
 #. Make messages
 #, c-format
@@ -1720,25 +1724,24 @@
 msgid "_View Certificate..."
 msgstr "_Xem chứng nhận..."
 
-#, fuzzy, c-format
+#, c-format
 msgid "The certificate for %s could not be validated."
-msgstr "Dãy chứng nhận được cung cấp cho %s không phải là hợp lệ."
+msgstr "Không thể thẩm tra được chứng nhận cho %s."
 
 #. TODO: Probably wrong.
 msgid "SSL Certificate Error"
 msgstr "Lỗi chứng nhận SSL"
 
-#, fuzzy
 msgid "Unable to validate certificate"
-msgstr "Không thể xác thực: %s"
-
-#, fuzzy, c-format
+msgstr "Không thể thẩm tra chứng nhận"
+
+#, c-format
 msgid ""
 "The certificate claims to be from \"%s\" instead. This could mean that you "
 "are not connecting to the service you believe you are."
 msgstr ""
-"« %s » cung cấp một chứng nhận có vẻ là theo dạng « %s » thay thế. Có thể "
-"nghĩa là bạn không phải có kết nối đến dịch vụ bạn tin là đó."
+"Chứng nhận tuyên bố là nó đến từ « %s » thay thế. Có thể nghĩa là bạn không "
+"phải có kết nối đến dịch vụ bạn tin là đó."
 
 #. Make messages
 #, c-format
@@ -1822,9 +1825,8 @@
 msgid "%s left the room (%s)."
 msgstr "%s rời phòng (%s)."
 
-#, fuzzy
 msgid "Invite to chat"
-msgstr "Mời vào hội thảo"
+msgstr "Mời chát"
 
 #. Put our happy label in it.
 msgid ""
@@ -1878,7 +1880,11 @@
 
 #, c-format
 msgid "Resolver process exited without answering our request"
-msgstr ""
+msgstr "Tiến trình giải quyết đã thoát mà không đáp ứng yêu cầu"
+
+#, c-format
+msgid "Error converting %s to punycode: %d"
+msgstr "Gặp lỗi khi chuyển đổi %s sang punycode: %d"
 
 #, c-format
 msgid "Thread creation failure: %s"
@@ -1962,31 +1968,31 @@
 msgid "Starting transfer of %s from %s"
 msgstr "Đang bắt đầu truyền %s từ %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Transfer of file <A HREF=\"file://%s\">%s</A> complete"
-msgstr "Đã truyền xong tập tin %s"
+msgstr "Đã truyền hoàn toàn tập tin <A HREF=\"file://%s\">%s</A>"
 
 #, c-format
 msgid "Transfer of file %s complete"
-msgstr "Đã truyền xong tập tin %s"
+msgstr "Đã truyền hoàn toàn tập tin %s"
 
 msgid "File transfer complete"
-msgstr "Đã truyền xong tập tin"
-
-#, fuzzy, c-format
+msgstr "Đã truyền hoàn toàn tập tin"
+
+#, c-format
 msgid "You cancelled the transfer of %s"
-msgstr "Bạn đã thôi truyền %s"
+msgstr "Bạn đã thôi tiến trình truyền %s"
 
 msgid "File transfer cancelled"
 msgstr "Tiến trình truyền tập tin bị thôi."
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s cancelled the transfer of %s"
-msgstr "%s đã thôi truyền %s"
-
-#, fuzzy, c-format
+msgstr "%s đã thôi tiến trình truyền %s"
+
+#, c-format
 msgid "%s cancelled the file transfer"
-msgstr "%s đã thôi truyền tập tin"
+msgstr "%s đã thôi tiến trình truyền tập tin"
 
 #, c-format
 msgid "File transfer to %s failed."
@@ -2184,32 +2190,33 @@
 "No codecs found. Install some GStreamer codecs found in GStreamer plugins "
 "packages."
 msgstr ""
+"Không tìm thấy codec nào. Hãy cài đặt một số codec GStreamer từ gói phần bổ "
+"sung GStreamer."
 
 msgid ""
 "No codecs left. Your codec preferences in fs-codecs.conf are too strict."
 msgstr ""
-
-#, fuzzy
+"Không có codec nào còn lại. Thiết lập codec trong tập tin cấu hình « fs-"
+"codecs.conf » vẫn quá bị hạn chế."
+
 msgid "A non-recoverable Farsight2 error has occurred."
-msgstr "Lỗi đăng nhập không rõ : %s."
-
-#, fuzzy
-msgid "Conference error."
-msgstr "Hội thảo bị đóng"
-
-msgid "Error with your microphone."
-msgstr ""
-
-msgid "Error with your webcam."
-msgstr ""
-
-#, fuzzy, c-format
+msgstr "Gặp một lỗi Farsight2 từ đó không thể phục hồi."
+
+msgid "Conference error"
+msgstr "Lỗi hội thảo"
+
+msgid "Error with your microphone"
+msgstr "Gặp lỗi với cái máy vi âm"
+
+msgid "Error with your webcam"
+msgstr "Gặp lỗi với cái máy ảnh Web"
+
+#, c-format
 msgid "Error creating session: %s"
-msgstr "Lỗi khi tạo kết nối"
-
-#, fuzzy
+msgstr "Gặp lỗi khi tạo buổi hợp: %s"
+
 msgid "Error creating conference."
-msgstr "Lỗi khi tạo kết nối"
+msgstr "Gặp lỗi khi tạo hội thảo."
 
 #, c-format
 msgid "You are using %s, but this plugin requires %s."
@@ -2310,9 +2317,8 @@
 "Tự mở thông báo khi việc truyền tập tin đã chấp nhận tự động đã chạy xong\n"
 "(chỉ khi không có cuộc thoại với người gửi)"
 
-#, fuzzy
 msgid "Create a new directory for each user"
-msgstr "Chọn một thư mục người dùng trong đó cần tìm kiếm"
+msgstr "Tạo một thư mục mới cho mỗi người dùng"
 
 msgid "Notes"
 msgstr "Ghi chú"
@@ -2332,16 +2338,16 @@
 #. *< priority
 #. *< id
 msgid "Buddy Notes"
-msgstr "Ghi chú bạn thân"
+msgstr "Ghi chú bạn chát"
 
 #. *< name
 #. *< version
 msgid "Store notes on particular buddies."
-msgstr "Lưu bản ghi chú về bạn thân nào đó"
+msgstr "Lưu bản ghi chú về bạn chát nào đó"
 
 #. *< summary
 msgid "Adds the option to store notes for buddies on your buddy list."
-msgstr "Thêm tùy chọn để lưu bản ghi chú về bạn thân trên danh sách bạn bè."
+msgstr "Thêm tùy chọn để lưu bản ghi chú về bạn chát trên danh sách bạn bè."
 
 #. *< type
 #. *< ui_requirement
@@ -2468,17 +2474,17 @@
 "lệnh IPC."
 
 msgid "Hide Joins/Parts"
-msgstr ""
+msgstr "Ẩn Vào/Rời"
 
 #. Translators: Followed by an input request a number of people
 msgid "For rooms with more than this many people"
-msgstr ""
+msgstr "Đối với phòng có nhiều hơn số các người này"
 
 msgid "If user has not spoken in this many minutes"
-msgstr ""
+msgstr "Nếu người dùng không nói gì trong vòng số các phút này"
 
 msgid "Apply hiding rules to buddies"
-msgstr ""
+msgstr "Áp dụng các quy tắc cho bạn bè"
 
 #. *< type
 #. *< ui_requirement
@@ -2618,7 +2624,6 @@
 "Bao gồm trong bộ xem bản ghi các bản ghi của ứng dụng khách tin nhắn khác."
 
 #. * description
-#, fuzzy
 msgid ""
 "When viewing logs, this plugin will include logs from other IM clients. "
 "Currently, this includes Adium, MSN Messenger, aMSN, and Trillian.\n"
@@ -2627,7 +2632,8 @@
 "at your own risk!"
 msgstr ""
 "Khi xem bản ghi, phần bổ sung này sẽ cũng bao gồm các bản ghi của ứng dụng "
-"khách tin nhắn khác. Hiện thời, gồm có Adium, MSN Messenger, và Trillian.\n"
+"khách tin nhắn khác. Hiện thời, gồm có Adium, MSN Messenger, aMSN và "
+"Trillian.\n"
 "\n"
 "CẢNH BÁO : phần bổ sung này vẫn còn là mã nguồn anfa (rất mới, chưa thử) nên "
 "có thể sụp đổ nhiều. Hãy tự chịu trách nhiệm khi dùng nó !"
@@ -2675,13 +2681,12 @@
 msgid "Save messages sent to an offline user as pounce."
 msgstr "Lưu dạng thông báo các tin nhẳn được gửi cho người dùng chưa kết nối."
 
-#, fuzzy
 msgid ""
 "The rest of the messages will be saved as pounces. You can edit/delete the "
 "pounce from the `Buddy Pounce' dialog."
 msgstr ""
 "Phần còn lại của các tin nhẳn sẽ được lưu dạng thông báo. Bạn cũng có thể "
-"chỉnh sửa/xoá thông báo trong hộp thoại « Thông báo bạn thân »."
+"sửa/xoá thông báo trong hộp thoại « Thông báo bạn chát »."
 
 #, c-format
 msgid ""
@@ -2696,7 +2701,7 @@
 
 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
 msgstr ""
-"Bạn cũng có thể chỉnh sửa/xoá thông báo trong hộp thoại « Thông báo bạn thân "
+"Bạn cũng có thể chỉnh sửa/xoá thông báo trong hộp thoại « Thông báo bạn chát "
 "»."
 
 msgid "Yes"
@@ -2711,9 +2716,8 @@
 msgid "Do not ask. Always save in pounce."
 msgstr "Đừng hỏi. Luôn luôn lưu trong thông báo."
 
-#, fuzzy
 msgid "One Time Password"
-msgstr "Nhập mật khẩu"
+msgstr "Mật khẩu Một lần"
 
 #. *< type
 #. *< ui_requirement
@@ -2722,13 +2726,13 @@
 #. *< priority
 #. *< id
 msgid "One Time Password Support"
-msgstr ""
+msgstr "Hỗ trợ Mật khẩu Một lần"
 
 #. *< name
 #. *< version
 #. *  summary
 msgid "Enforce that passwords are used only once."
-msgstr ""
+msgstr "Buộc dùng mỗi mật khẩu chỉ một lần thôi"
 
 #. *  description
 msgid ""
@@ -2736,6 +2740,10 @@
 "are only used in a single successful connection.\n"
 "Note: The account password must not be saved for this to work."
 msgstr ""
+"Cho phép bạn ép buộc đặc trưng cho mỗi tài khoản rằng mật khẩu nào chưa lưu "
+"thì được sử dụng trong chỉ một kết nối thành công.\n"
+"Ghi chú : một khi lưu được, mật khẩu tài khoản không hợp tác với tuỳ chọn "
+"này."
 
 #. *< type
 #. *< ui_requirement
@@ -2889,13 +2897,13 @@
 msgstr "Thông báo khi"
 
 msgid "Buddy Goes _Away"
-msgstr "Bạn thân đi _vắng"
+msgstr "Bạn chát đi _vắng"
 
 msgid "Buddy Goes _Idle"
-msgstr "Bạn thân mới _nghỉ:"
+msgstr "Bạn chát mới _nghỉ:"
 
 msgid "Buddy _Signs On/Off"
-msgstr "Bạn thân đăn_g nhập/xuất"
+msgstr "Bạn chát đăn_g nhập/xuất"
 
 #. *< type
 #. *< ui_requirement
@@ -2904,7 +2912,7 @@
 #. *< priority
 #. *< id
 msgid "Buddy State Notification"
-msgstr "Thông báo trạng thái bạn thân"
+msgstr "Thông báo trạng thái bạn chát"
 
 #. *< name
 #. *< version
@@ -2915,7 +2923,7 @@
 "idle."
 msgstr ""
 "Thông báo trong cửa sổ cuộc thoại trạng thái vắng mặt, có mặt, hay nghỉ của "
-"bạn thân."
+"bạn chát."
 
 msgid "Tcl Plugin Loader"
 msgstr "Bộ nạp phần bổ sung Tcl"
@@ -2930,17 +2938,15 @@
 "Không thể phát hiện bản cài đặt ActiveTCL. Muốn sử dụng phần bổ sung TCL thì "
 "cài đặt ActiveTCL từ địa chỉ « http://www.activestate.com ».\n"
 
-#, fuzzy
 msgid ""
 "Unable to find Apple's \"Bonjour for Windows\" toolkit, see http://d.pidgin."
 "im/BonjourWindows for more information."
 msgstr ""
-"Không tìm thấy bộ công cụ Apple Bonjour For Windows, xem FAQ (Hỏi Đáp) ở địa "
-"chỉ « http://d.pidgin.im/BonjourWindows » để tìm chi tiết."
-
-#, fuzzy
+"Không tìm thấy bộ công cụ Apple Bonjour For Windows, xem « http://d.pidgin.im/"
+"BonjourWindows » để tìm thêm thông tin."
+
 msgid "Unable to listen for incoming IM connections"
-msgstr "Không thể lắng nghe kết nối tin nhắn gửi đến\n"
+msgstr "Không thể lắng nghe kết nối tin nhắn gửi đến"
 
 msgid ""
 "Unable to establish connection with the local mDNS server.  Is it running?"
@@ -2978,9 +2984,8 @@
 msgstr "Người Purple"
 
 #. Creating the options for the protocol
-#, fuzzy
 msgid "Local Port"
-msgstr "Nơi ở"
+msgstr "Cổng cục bộ"
 
 # Đây là tên của giao thức Apple: đừng dịch.
 msgid "Bonjour"
@@ -2993,21 +2998,17 @@
 msgid "Unable to send the message, the conversation couldn't be started."
 msgstr "Không thể gửi tin, vì không thể bắt đầu nói chuyện."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to create socket: %s"
-msgstr ""
-"Không thể tạo ổ cắm\n"
-"%s"
-
-#, fuzzy, c-format
+msgstr "Không thể tạo ổ cắm: %s"
+
+#, c-format
 msgid "Unable to bind socket to port: %s"
-msgstr "Không thể đóng kết ổ cắm tới cổng"
-
-#, fuzzy, c-format
+msgstr "Không thể đóng kết ổ cắm tới cổng: %s"
+
+#, c-format
 msgid "Unable to listen on socket: %s"
-msgstr ""
-"Không thể tạo ổ cắm\n"
-"%s"
+msgstr "Không thể lắng nghe trên ổ cắm: %s"
 
 msgid "Error communicating with local mDNSResponder."
 msgstr "Lỗi liên lạc với cơ chế đáp ứng DNS mDNSResponder cục bộ."
@@ -3055,17 +3056,14 @@
 msgid "Load buddylist from file..."
 msgstr "Nạp danh sách bạn bè từ tập tin..."
 
-#, fuzzy
 msgid "You must fill in all registration fields"
-msgstr "Đìên vào các trường đăng ký."
-
-#, fuzzy
+msgstr "Phải điền vào tất cả các trường đăng ký"
+
 msgid "Passwords do not match"
-msgstr "Hai mật khẩu không trùng."
-
-#, fuzzy
+msgstr "Hai mật khẩu không trùng nhau"
+
 msgid "Unable to register new account.  An unknown error occurred."
-msgstr "Không thể đăng ký tài khoản mới. Lỗi xảy ra.\n"
+msgstr "Không thể đăng ký tài khoản mới. Gặp một lỗi không rõ."
 
 msgid "New Gadu-Gadu Account Registered"
 msgstr "Tài khoản Gadu-Gadu mới đã đăng ký"
@@ -3080,11 +3078,11 @@
 msgstr "Nhập lại mật khẩu"
 
 msgid "Enter captcha text"
-msgstr ""
-
-#, fuzzy
+msgstr "Gõ chuỗi Captcha"
+
+# Tên: đừng dịch
 msgid "Captcha"
-msgstr "Lưu ảnh"
+msgstr "Captcha"
 
 msgid "Register New Gadu-Gadu Account"
 msgstr "Đăng ký tài khoản Gadu-Gadu mới"
@@ -3154,7 +3152,7 @@
 
 #, c-format
 msgid "Select a chat for buddy: %s"
-msgstr "Chọn cuộc chát cho bạn thân: %s"
+msgstr "Chọn cuộc chát cho bạn chát: %s"
 
 msgid "Add to chat..."
 msgstr "Thêm vào chát..."
@@ -3223,9 +3221,9 @@
 msgid "Chat _name:"
 msgstr "Tê_n chát:"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to resolve hostname '%s': %s"
-msgstr "Không thể kết nối đến máy phục vụ."
+msgstr "Không thể quyết định tên máy « %s »: %s"
 
 #. 1. connect to server
 #. connect to the server
@@ -3238,9 +3236,8 @@
 msgid "This chat name is already in use"
 msgstr "Tên chát này đang được dùng"
 
-#, fuzzy
 msgid "Not connected to the server"
-msgstr "Không phải có kết nối tới máy phục vụ."
+msgstr "Không phải có kết nối tới máy phục vụ"
 
 msgid "Find buddies..."
 msgstr "Tìm bạn bè..."
@@ -3282,9 +3279,8 @@
 msgid "Gadu-Gadu User"
 msgstr "Người dùng Gadu-Gadu"
 
-#, fuzzy
 msgid "GG server"
-msgstr "Lập thông tin người dùng..."
+msgstr "Máy phục vụ GG"
 
 #, c-format
 msgid "Unknown command: %s"
@@ -3300,16 +3296,15 @@
 msgid "File Transfer Failed"
 msgstr "Lỗi truyền tập tin"
 
-#, fuzzy
 msgid "Unable to open a listening port."
-msgstr "Không thể mở cổng lắng nghe."
+msgstr "Không thể mở một cổng lắng nghe."
 
 # MOTD: Message Of The Day: thông điệp của hôm nay
 msgid "Error displaying MOTD"
-msgstr "Lỗi hiển thị MOTD"
+msgstr "Lỗi hiển thị MOTD (thông điệp của hôm nay)"
 
 msgid "No MOTD available"
-msgstr "MOTD hiện không có"
+msgstr "Không có sẵn MOTD (thông điệp của hôm nay)"
 
 msgid "There is no MOTD associated with this connection."
 msgstr "Không có MOTD (thông điệp của hôm nay) liên quan đến kết nối này."
@@ -3325,11 +3320,9 @@
 #.
 #. TODO: what to do here - do we really have to disconnect?
 #. TODO: do we really want to disconnect on a failure to write?
-#, fuzzy, c-format
+#, c-format
 msgid "Lost connection with server: %s"
-msgstr ""
-"Mất kết nối với máy phục vụ :\n"
-"%s"
+msgstr "Mất kết nối với máy phục vụ : %s"
 
 msgid "View MOTD"
 msgstr "Xem MOTD"
@@ -3340,24 +3333,23 @@
 msgid "_Password:"
 msgstr "_Mật khẩu :"
 
-#, fuzzy
 msgid "IRC nick and server may not contain whitespace"
-msgstr "Tên hiệu cho IRC không được chứa dấu cách"
+msgstr "Tên hiệu và máy phục vụ cho IRC không được chứa dấu cách"
 
 msgid "SSL support unavailable"
-msgstr "Hiện không có hỗ trợ SSL"
+msgstr "Hỗ trợ SSL không sẵn sàng"
 
 msgid "Unable to connect"
 msgstr "Không thể kết nối"
 
 #. this is a regular connect, error out
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to connect: %s"
-msgstr "Không thể kết nối tới %s"
-
-#, fuzzy, c-format
+msgstr "Không thể kết nối: %s"
+
+#, c-format
 msgid "Server closed the connection"
-msgstr "Máy phục vụ đã đóng kết nối."
+msgstr "Máy phục vụ đã đóng kết nối"
 
 msgid "Users"
 msgstr "Người dùng"
@@ -3392,7 +3384,7 @@
 msgstr "Bảng mã"
 
 msgid "Auto-detect incoming UTF-8"
-msgstr ""
+msgstr "Tự động phát hiện UTF-8 gửi đến"
 
 msgid "Real name"
 msgstr "Tên thật"
@@ -3407,9 +3399,9 @@
 msgid "Bad mode"
 msgstr "Chế độ sai"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Ban on %s by %s, set %s ago"
-msgstr "%s bị %s cấm, đặt %ld giây trước"
+msgstr "%s bị cấm bởi %s, đặt %s trước"
 
 #, c-format
 msgid "Ban on %s"
@@ -3541,13 +3533,12 @@
 #. We only want to do the following dance if the connection
 #. has not been successfully completed.  If it has, just
 #. notify the user that their /nick command didn't go.
-#, fuzzy, c-format
+#, c-format
 msgid "The nickname \"%s\" is already being used."
-msgstr "Tên chát này đang được dùng"
-
-#, fuzzy
+msgstr "Tên hiệu « %s » đang được dùng."
+
 msgid "Nickname in use"
-msgstr "Tên hiệu"
+msgstr "Tên hiệu vẫn được dùng"
 
 msgid "Cannot change nick"
 msgstr "Không thể thay đổi tên hiệu"
@@ -3591,10 +3582,10 @@
 "trở lại sau khi đi vắng."
 
 msgid "ctcp <nick> <msg>: sends ctcp msg to nick."
-msgstr ""
+msgstr "ctcp <tên_hiệu> <msg>: gửi thông điệp ctcp msg cho tên hiệu đó."
 
 msgid "chanserv: Send a command to chanserv"
-msgstr "chanserv: gửi lệnh cho trình phục vụ kênh"
+msgstr "chanserv: gửi một câu lệnh cho trình phục vụ kênh"
 
 msgid ""
 "deop &lt;nick1&gt; [nick2] ...:  Remove channel operator status from "
@@ -3788,15 +3779,12 @@
 msgid "execute"
 msgstr "thực hiện"
 
-#, fuzzy
 msgid "Server requires TLS/SSL, but no TLS/SSL support was found."
 msgstr ""
-"Máy phục vụ yêu cầu TLS/SSL để đăng nhập. Không tìm thấy khả năng hỗ trợ TLS/"
-"SSL."
-
-#, fuzzy
+"Máy phục vụ yêu cầu TLS/SSL còn không tìm thấy khả năng hỗ trợ TLS/SSL."
+
 msgid "You require encryption, but no TLS/SSL support was found."
-msgstr "Bạn cần chức năng mật mã, nhưng không tìm thấy hỗ trợ TLS/SSL."
+msgstr "Bạn cần chức năng mật mã còn không tìm thấy hỗ trợ TLS/SSL."
 
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr ""
@@ -3813,13 +3801,11 @@
 msgid "Plaintext Authentication"
 msgstr "Xác thực nhập thô"
 
-#, fuzzy
 msgid "SASL authentication failed"
-msgstr "Không xác thực được"
-
-#, fuzzy
+msgstr "Lỗi xác thực SASL"
+
 msgid "Invalid response from server"
-msgstr "Máy phục vụ trả lời không hợp lệ."
+msgstr "Máy phục vụ sai đáp ứng"
 
 msgid "Server does not use any supported authentication method"
 msgstr "Máy phục vụ không sử dụng bất kỳ phương thức xác thực được hỗ trợ nào"
@@ -3830,36 +3816,28 @@
 msgid "Invalid challenge from server"
 msgstr "Kiểm tra từ máy phục vụ không hợp lệ"
 
-#, fuzzy, c-format
+#, c-format
 msgid "SASL error: %s"
-msgstr "Lỗi SASL"
+msgstr "Lỗi SASL: %s"
 
 msgid "The BOSH connection manager terminated your session."
-msgstr ""
-
-#, fuzzy
+msgstr "Bộ quản lý kết nối BOSH đã chấm dứt buổi hợp của bạn."
+
 msgid "No session ID given"
-msgstr "Không nêu lý do."
-
-#, fuzzy
+msgstr "Chưa đưa ra mã số buổi hợp"
+
 msgid "Unsupported version of BOSH protocol"
-msgstr "Phiên bản không được hỗ trợ"
-
-#, fuzzy
+msgstr "Phiên bản giao thức BOSH không được hỗ trợ"
+
 msgid "Unable to establish a connection with the server"
-msgstr ""
-"Không thể thiết lập kết nối đến máy phục vụ :\n"
-"%s"
-
-#, fuzzy, c-format
+msgstr "Không thể thiết lập kết nối đến máy phục vụ"
+
+#, c-format
 msgid "Unable to establish a connection with the server: %s"
-msgstr ""
-"Không thể thiết lập kết nối đến máy phục vụ :\n"
-"%s"
-
-#, fuzzy
+msgstr "Không thể thiết lập kết nối đến máy phục vụ : %s"
+
 msgid "Unable to establish SSL connection"
-msgstr "Không thể khởi tạo kết nối"
+msgstr "Không thể thiết lập kết nối SSL"
 
 msgid "Full Name"
 msgstr "Tên đầy đủ"
@@ -3930,9 +3908,8 @@
 msgid "Operating System"
 msgstr "Hệ điều hành"
 
-#, fuzzy
 msgid "Local Time"
-msgstr "Tập tin cục bộ :"
+msgstr "Giờ địa phương"
 
 msgid "Priority"
 msgstr "Ưu tiên"
@@ -3942,9 +3919,8 @@
 
 #, c-format
 msgid "%s ago"
-msgstr ""
-
-#, fuzzy
+msgstr "%s trước"
+
 msgid "Logged Off"
 msgstr "Đã đăng xuất"
 
@@ -3963,12 +3939,13 @@
 msgid "Logo"
 msgstr "Biểu hình"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s will no longer be able to see your status updates.  Do you want to "
 "continue?"
 msgstr ""
-"Bạn sắp gỡ bỏ %s khỏi danh sách bạn bè của bạn. Bạn muốn thực hiện không?"
+"%s thì không còn có khả năng xem lại các bản cập nhật trạng thái của bạn. "
+"Vẫn muốn thực hiện không?"
 
 msgid "Cancel Presence Notification"
 msgstr "Thôi thông báo có mặt"
@@ -4121,19 +4098,15 @@
 msgid "Find Rooms"
 msgstr "Tìm phòng"
 
-#, fuzzy
 msgid "Affiliations:"
-msgstr "Bí danh:"
-
-#, fuzzy
+msgstr "Nhập hội:"
+
 msgid "No users found"
-msgstr "Không tìm thấy người dùng tương ứng"
-
-#, fuzzy
+msgstr "Không tìm thấy người dùng nào"
+
 msgid "Roles:"
-msgstr "Vị trí"
-
-#, fuzzy
+msgstr "Vai trò :"
+
 msgid "Ping timed out"
 msgstr "Quá hạn ping"
 
@@ -4141,6 +4114,8 @@
 "Unable to find alternative XMPP connection methods after failing to connect "
 "directly."
 msgstr ""
+"Không tìm thấy phương pháp kết nối XMPP xen kẽ sau khi không kết nối được "
+"một cách trực tiếp."
 
 msgid "Invalid XMPP ID"
 msgstr "ID XMPP không hợp lệ"
@@ -4148,9 +4123,8 @@
 msgid "Invalid XMPP ID. Domain must be set."
 msgstr "ID XMPP không hợp lệ. Phải đặt miền (domain)."
 
-#, fuzzy
 msgid "Malformed BOSH URL"
-msgstr "Không kết nối được với máy phục vụ."
+msgstr "Địa chỉ URL BOSH dạng sai"
 
 #, c-format
 msgid "Registration of %s@%s successful"
@@ -4239,7 +4213,7 @@
 msgstr "Đang khởi tạo lại Stream"
 
 msgid "Server doesn't support blocking"
-msgstr ""
+msgstr "Máy phục vụ không hỗ trợ chức năng chặn"
 
 msgid "Not Authorized"
 msgstr "Không cho phép"
@@ -4505,19 +4479,21 @@
 msgid "Unable to ping user %s"
 msgstr "Không thể gửi tin hiệu ping cho người dùng %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to buzz, because there is nothing known about %s."
-msgstr "Không thể kêu gọi vì không biết gì về người dùng %s."
-
-#, fuzzy, c-format
+msgstr "Không thể kêu gọi vì không biết gì về %s."
+
+#, c-format
 msgid "Unable to buzz, because %s might be offline."
-msgstr "Không thể kêu gọi, vì người dùng %s có thể chưa đăng nhập."
-
-#, fuzzy, c-format
+msgstr "Không thể kêu gọi, vì %s có thể chưa đăng nhập."
+
+#, c-format
 msgid ""
 "Unable to buzz, because %s does not support it or does not wish to receive "
 "buzzes now."
-msgstr "Không thể kêu gọi, vì người dùng %s không hỗ trợ."
+msgstr ""
+"Không thể kêu gọi, vì %s không hỗ trợ hoặc hiện thời không muốn nhận sự kêu "
+"gọi."
 
 #, c-format
 msgid "Buzzing %s..."
@@ -4532,35 +4508,36 @@
 msgid "%s has buzzed you!"
 msgstr "%s đã kêu gọi bạn !"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to initiate media with %s: invalid JID"
-msgstr "Không thể gửi tập tin cho %s, JID không hợp lệ"
-
-#, fuzzy, c-format
+msgstr "Không thể khởi đầu phương tiện với %s, JID không hợp lệ"
+
+#, c-format
 msgid "Unable to initiate media with %s: user is not online"
-msgstr "Không thể gửi tập tin cho %s, người dùng chưa kết nối"
-
-#, fuzzy, c-format
+msgstr "Không thể khởi đầu phương tiện với %s, người dùng chưa kết nối"
+
+#, c-format
 msgid "Unable to initiate media with %s: not subscribed to user presence"
 msgstr ""
-"Không thể gửi tập tin cho %s, không đăng ký với sự có mặt của người dùng"
-
-#, fuzzy
+"Không thể khởi đầu phương tiện với %s, không đăng ký với sự có mặt của người "
+"dùng"
+
 msgid "Media Initiation Failed"
-msgstr "Lỗi đăng ký"
-
-#, fuzzy, c-format
+msgstr "Lỗi khởi đầu phương tiện"
+
+#, c-format
 msgid ""
 "Please select the resource of %s with which you would like to start a media "
 "session."
-msgstr "Hãy chọn tài nguyên nào của %s cho đó bạn muốn gửi tập tin"
+msgstr ""
+"Hãy chọn tài nguyên nào của %s với đó bạn muốn khởi đầu một buổi hợp phương "
+"tiện."
 
 msgid "Select a Resource"
 msgstr "Chọn tài nguyên"
 
-#, fuzzy
 msgid "Initiate Media"
-msgstr "Khởi tạo _Chát"
+msgstr "Khởi tạo Phương tiện"
 
 msgid "config:  Configure a chat room."
 msgstr "config:  (viết tắt) cấu hình một phòng trò chuyện."
@@ -4580,30 +4557,33 @@
 msgid "ban &lt;user&gt; [reason]:  Ban a user from the room."
 msgstr "ban &lt;người_dùng&gt; [lý_do]:  Cấm một người dùng ra khỏi phòng."
 
-#, fuzzy
 msgid ""
 "affiliate &lt;owner|admin|member|outcast|none&gt; [nick1] [nick2] ...: Get "
 "the users with an affiliation or set users' affiliation with the room."
 msgstr ""
-"affiliate &lt;người_dùng&gt; &lt;owner|admin|member|outcast|none&gt;: Đặt tư "
-"cách người dùng trong phòng\n"
-" • owner\t\tngười sở hữu\n"
+"affiliate &lt;owner|admin|member|outcast|none&gt; [tên_hiệu1] "
+"[tên_hiệu2] ...\n"
+"Lấy những người dùng nhập hội với phòng đó hoặc đặt sự nhập hội\n"
+"với phòng đó của các người dùng này.\n"
+"\n"
+" • owner\t\tchủ sở hữu\n"
 " • admin\t\tquản trị\n"
-" • member\tthành viên\n"
-" • outcast\tngười bị ruồng bỏ\n"
-" • none\t\tkhông có."
-
-#, fuzzy
+" • member\t\tthành viên\n"
+" • outcast\t\tngười bị ruồng bỏ\n"
+" • none\t\tkhông có"
+
 msgid ""
 "role &lt;moderator|participant|visitor|none&gt; [nick1] [nick2] ...: Get the "
 "users with a role or set users' role with the room."
 msgstr ""
-"role &lt;người_dùng&gt; &lt;moderator|participant|visitor|none&gt;: Đặt "
-"nghiệm vụ của người dùng trong phòng\n"
-" • moderator\t\tđiều tiết viên\n"
+"role &lt;moderator|participant|visitor|none&gt; [tên_hiệu1] [tên_hiệu2] ...\n"
+"Lấy những người dùng có vài trò này, hoặc đặt vai trò này\n"
+"cho các người dùng trong phòng đó.\n"
+"\n"
+" • moderator\t\tđiều hợp viên\n"
 " • participant\t\tngười tham gia\n"
 " • visitor\t\t\tngười thăm\n"
-" • none\t\t\tkhông có."
+" • none\t\t\tkhông có"
 
 msgid "invite &lt;user&gt; [message]:  Invite a user to the room."
 msgstr "invite &lt;người_dùng&gt; [thông_điệp]:  Mời một người dùng vào phòng."
@@ -4667,13 +4647,12 @@
 msgstr "Ủy nhiệm truyền tập tin"
 
 msgid "BOSH URL"
-msgstr ""
+msgstr "URL BOSH"
 
 #. this should probably be part of global smiley theme settings later on,
 #. shared with MSN
-#, fuzzy
 msgid "Show Custom Smileys"
-msgstr "Hiển thị hình cười tự chọn"
+msgstr "Hiển thị Hình cười Riêng"
 
 #, c-format
 msgid "%s has left the conversation."
@@ -4732,28 +4711,25 @@
 msgid "_Accept Defaults"
 msgstr "Chấp nhận _mặc định"
 
-#, fuzzy
 msgid "No reason"
-msgstr "Không nêu lý do."
-
-#, fuzzy, c-format
+msgstr "Không có lý do"
+
+#, c-format
 msgid "You have been kicked: (%s)"
-msgstr "Bạn bị %s đá: (%s)"
-
-#, fuzzy, c-format
+msgstr "Bạn bị đá: (%s)"
+
+#, c-format
 msgid "Kicked (%s)"
-msgstr "Bị %s đá (%s)"
-
-#, fuzzy
+msgstr "Bị đá (%s)"
+
 msgid "An error occurred on the in-band bytestream transfer\n"
-msgstr "Gặp lỗi trong khi mở tập tin."
-
-#, fuzzy
+msgstr "Gặp lỗi trong khi truyền luồng byte bên trong băng\n"
+
 msgid "Transfer was closed."
-msgstr "Lỗi truyền tập tin"
+msgstr "Tiến trình truyền bị đóng."
 
 msgid "Failed to open in-band bytestream"
-msgstr ""
+msgstr "Lỗi mở luồng byte bên trong băng"
 
 #, c-format
 msgid "Unable to send file to %s, user does not support file transfers"
@@ -4822,11 +4798,10 @@
 msgstr "Không thể thêm « %s »."
 
 msgid "Buddy Add error"
-msgstr ""
-
-#, fuzzy
+msgstr "Lỗi thêm bạn chát"
+
 msgid "The username specified does not exist."
-msgstr "Bạn đã ghi rõ một tên người dùng không hợp lệ."
+msgstr "Bạn đã ghi rõ một tên người dùng không tồn tại."
 
 #, c-format
 msgid "Buddy list synchronization issue in %s (%s)"
@@ -4838,7 +4813,7 @@
 "Do you want this buddy to be added?"
 msgstr ""
 "%s trên danh sách cục bộ nằm trong nhóm « %s » nhưng không có trong danh sách "
-"máy phục vụ. Bạn có muốn thêm bạn thân này không?"
+"máy phục vụ. Bạn có muốn thêm bạn chát này không?"
 
 #, c-format
 msgid ""
@@ -4846,7 +4821,7 @@
 "to be added?"
 msgstr ""
 "%s nằm trên danh sách cục bộ nhưng không nằm trên danh sách máy phục vụ. Bạn "
-"có muốn thêm bạn thân này không?"
+"có muốn thêm bạn chát này không?"
 
 #, c-format
 msgid "Unable to parse message"
@@ -5028,9 +5003,8 @@
 msgid "Not expected"
 msgstr "Bất thường"
 
-#, fuzzy
 msgid "Friendly name is changing too rapidly"
-msgstr "Tên thân thiện thay đổi quá nhanh"
+msgstr "Tên thân thiện cứ thay đổi quá nhanh"
 
 #, c-format
 msgid "Server too busy"
@@ -5056,9 +5030,8 @@
 msgid "Passport account not yet verified"
 msgstr "Tài khoản Passport chưa được thẩm định"
 
-#, fuzzy
 msgid "Passport account suspended"
-msgstr "Tài khoản Passport chưa được thẩm định"
+msgstr "Tài khoản Passport bị đình chỉ"
 
 #, c-format
 msgid "Bad ticket"
@@ -5072,33 +5045,32 @@
 msgid "MSN Error: %s\n"
 msgstr "Lỗi MSN: %s\n"
 
-#, fuzzy
 msgid "Other Contacts"
-msgstr "Liên lạc đã thích"
-
-#, fuzzy
+msgstr "Liên lạc khác"
+
 msgid "Non-IM Contacts"
-msgstr "Bỏ liên lạc"
+msgstr "Liên lạc khác tin nhắn"
 
 #, c-format
 msgid "%s sent a wink. <a href='msn-wink://%s'>Click here to play it</a>"
-msgstr ""
+msgstr "%s đã gửi một wink. <a href='msn-wink://%s'>Bấm đây để phát nó</a>"
 
 #, c-format
 msgid "%s sent a wink, but it could not be saved"
-msgstr ""
+msgstr "%s đã gửi một wink mà không lưu được"
 
 #, c-format
 msgid "%s sent a voice clip. <a href='audio://%s'>Click here to play it</a>"
 msgstr ""
-
-#, fuzzy, c-format
+"%s đã gửi một trích tiếng nói. <a href='audio://%s'>Bấm đây để phát nó</a>"
+
+#, c-format
 msgid "%s sent a voice clip, but it could not be saved"
-msgstr "%s mời bạn xem máy ảnh Web, mà chưa được hỗ trợ."
-
-#, fuzzy, c-format
+msgstr "%s đã gửi một trích tiếng nói mà không lưu được"
+
+#, c-format
 msgid "%s sent you a voice chat invite, which is not yet supported."
-msgstr "%s mời bạn xem máy ảnh Web, mà chưa được hỗ trợ."
+msgstr "%s đã gửi cho bạn một lời mời chát tiếng nói mà chưa được hỗ trợ."
 
 msgid "Nudge"
 msgstr "Làm nổi bật"
@@ -5149,35 +5121,33 @@
 msgid "Disallow"
 msgstr "Cấm"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Blocked Text for %s"
-msgstr "Chú thích bạn chát về %s"
-
-#, fuzzy
+msgstr "Chuỗi bị chặn cho %s"
+
 msgid "No text is blocked for this account."
-msgstr "Dùng biểu tượng bạn chát cho tài khoản này:"
+msgstr "Không có chuỗi bị chặn cho tài khoản này."
 
 #, c-format
 msgid ""
 "MSN servers are currently blocking the following regular expressions:<br/>%s"
 msgstr ""
-
-#, fuzzy
+"Máy phục vụ MSN hiện thời chặn những biểu thức chính quy theo đây:<br/>%s"
+
 msgid "This account does not have email enabled."
-msgstr "Tài khoản Hotmail này có lẽ chưa kích hoạt."
+msgstr "Tài khoản này chưa hiệu lực thư điện tử."
 
 msgid "Send a mobile message."
-msgstr "Gửi tin nhắn tới di động."
+msgstr "Gửi tin nhẳn tới di động."
 
 msgid "Page"
 msgstr "Nhắn tin"
 
 msgid "Playing a game"
-msgstr ""
-
-#, fuzzy
+msgstr "Chơi lượt"
+
 msgid "Working"
-msgstr "Việc làm"
+msgstr "Đi làm"
 
 msgid "Has you"
 msgstr "Có bạn"
@@ -5216,13 +5186,11 @@
 msgid "Album"
 msgstr "Tập nhạc"
 
-#, fuzzy
 msgid "Game Title"
-msgstr "Tên điệu"
-
-#, fuzzy
+msgstr "Tên trò chơi"
+
 msgid "Office Title"
-msgstr "Tên điệu"
+msgstr "Tên chức vụ"
 
 msgid "Set Friendly Name..."
 msgstr "Đặt tên thân mật..."
@@ -5243,7 +5211,7 @@
 msgstr "Cho phép/Cấm tin nhắn tới thiết bị di động..."
 
 msgid "View Blocked Text..."
-msgstr ""
+msgstr "Xem chuỗi bị chặn..."
 
 msgid "Open Hotmail Inbox"
 msgstr "Mở hộp thư đến Hotmail."
@@ -5257,16 +5225,14 @@
 msgid "SSL support is needed for MSN. Please install a supported SSL library."
 msgstr "MSN yêu cầu có hỗ trợ SSL. Hãy cài đặt thư viện SSL được hỗ trợ."
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Unable to add the buddy %s because the username is invalid.  Usernames must "
-"be a valid email address."
-msgstr ""
-"Không thể thêm bạn chát %s vì tên người dùng này không hợp lệ. Tên người "
-"dùng phải là một địa chỉ thư điện tử hợp lệ, hoặc bắt đầu bằng một chữ cái "
-"và chỉ chứa chữ cái, chữ số, và khoảng trống, hoặc chỉ chứa chữ số."
-
-#, fuzzy
+"be valid email addresses."
+msgstr ""
+"Không thể thêm bạn chát %s vì tên người dùng này không hợp lệ. Mỗi tên người "
+"dùng cũng phải là một địa chỉ thư điện tử hợp lệ."
+
 msgid "Unable to Add"
 msgstr "Không thể thêm"
 
@@ -5436,9 +5402,8 @@
 "Không tìm thấy thông tin trong lý lịch của người dùng này. Người này rất có "
 "thể không tồn tại."
 
-#, fuzzy
 msgid "View web profile"
-msgstr "Ẩn khi ngoại tuyến"
+msgstr "Xem hồ sơ Web"
 
 #. *< type
 #. *< ui_requirement
@@ -5467,17 +5432,16 @@
 msgid "Windows Live ID authentication:Unable to connect"
 msgstr "Xác thực ID Windows Live: không thể kết nối"
 
-#, fuzzy
 msgid "Windows Live ID authentication:Invalid response"
-msgstr "Xác thực ID Windows Live: không thể kết nối"
+msgstr "Xác thực ID Windows Live: sai đáp ứng"
 
 #, c-format
 msgid "%s just sent you a Nudge!"
 msgstr "%s vừa gửi cho bạn một lời kêu gọi."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown error (%d): %s"
-msgstr "Lỗi không rõ (%d)"
+msgstr "Lỗi không rõ (%d): %s"
 
 msgid "Unable to add user"
 msgstr "Không thể thêm người dùng"
@@ -5487,13 +5451,11 @@
 msgid "Unknown error (%d)"
 msgstr "Lỗi không rõ (%d)"
 
-#, fuzzy
 msgid "The following users are missing from your addressbook"
-msgstr "Dưới đây là kết quả tìm kiếm"
-
-#, fuzzy
+msgstr "Sổ địa chỉ của bạn còn thiếu những người dùng theo đây"
+
 msgid "Mobile message was not sent because it was too long."
-msgstr "Tin nhẳn chưa gửi đi được vì bạn chưa đăng nhập."
+msgstr "Tin nhẳn di động chưa gửi đi được vì quá dài."
 
 #, c-format
 msgid ""
@@ -5520,18 +5482,17 @@
 "Message was not sent because the system is unavailable. This normally "
 "happens when the user is blocked or does not exist."
 msgstr ""
-
-#, fuzzy
+"Tin nhẳn chưa đi được vì hệ thống không sẵn sàng. Trường hợp này bình thường "
+"xảy ra khi người dùng bị chặn hay không tồn tại."
+
 msgid "Message was not sent because messages are being sent too quickly."
-msgstr "Thông điệp không gửi đi được vì gửi quá nhanh:"
-
-#, fuzzy
+msgstr "Tin nhẳn chưa đi được vì các tin nhẳn được gửi quá nhanh."
+
 msgid "Message was not sent because an unknown encoding error occurred."
-msgstr "Thông điệp không gửi đi được vì có lỗi không rõ :"
-
-#, fuzzy
+msgstr "Tin nhẳn chưa đi được vì gặp một lỗi mã hoá không được nhận ra."
+
 msgid "Message was not sent because an unknown error occurred."
-msgstr "Thông điệp không gửi đi được vì có lỗi không rõ :"
+msgstr "Tin nhẳn chưa đi được vì gặp một lỗi không được nhận ra."
 
 msgid "Writing error"
 msgstr "Lỗi ghi"
@@ -5547,25 +5508,21 @@
 "Lỗi kết nối từ máy phục vụ %s:\n"
 "%s"
 
-#, fuzzy
 msgid "Our protocol is not supported by the server"
-msgstr "Giao thức này không được hỗ trợ bởi trình phục vụ."
-
-#, fuzzy
+msgstr "Giao thức mình không được hỗ trợ bởi trình phục vụ."
+
 msgid "Error parsing HTTP"
-msgstr "Lỗi phân tích HTTP."
-
-#, fuzzy
+msgstr "Gặp lỗi khi phân tích cú pháp của mã HTTP"
+
 msgid "You have signed on from another location"
-msgstr "Bạn đã đăng nhập từ một vị trí khác."
+msgstr "Bạn đã đăng nhập từ một địa chỉ khác"
 
 msgid "The MSN servers are temporarily unavailable. Please wait and try again."
 msgstr ""
 "Các máy phục vụ MSN tạm thời không sẵn sàng. Vui lòng chờ và thử lại lần nữa."
 
-#, fuzzy
 msgid "The MSN servers are going down temporarily"
-msgstr "Các máy phục vụ MSN tạm thời bị ngừng."
+msgstr "Các máy phục vụ MSN tạm thời bị ngừng"
 
 #, c-format
 msgid "Unable to authenticate: %s"
@@ -5595,13 +5552,13 @@
 msgid "Retrieving buddy list"
 msgstr "Đang lấy danh sách bạn bè"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s requests to view your webcam, but this request is not yet supported."
-msgstr "%s mời bạn xem máy ảnh Web, mà chưa được hỗ trợ."
-
-#, fuzzy, c-format
+msgstr "%s yêu cầu xem máy ảnh Web của bạn, mà chưa được hỗ trợ."
+
+#, c-format
 msgid "%s invited you to view his/her webcam, but this is not yet supported."
-msgstr "%s mời bạn xem máy ảnh Web, mà chưa được hỗ trợ."
+msgstr "%s mời bạn xem máy ảnh Web của họ, mà chưa được hỗ trợ."
 
 msgid "Away From Computer"
 msgstr "Rời khỏi máy tính"
@@ -5641,13 +5598,11 @@
 msgid "Message may have not been sent because an unknown error occurred:"
 msgstr "Thông điệp không gửi đi được vì có lỗi không rõ :"
 
-#, fuzzy
 msgid "Delete Buddy from Address Book?"
-msgstr "Thêm vào sổ địa chỉ"
-
-#, fuzzy
+msgstr "Xoá bạn chát khỏi Sổ địa chỉ ?"
+
 msgid "Do you want to delete this buddy from your address book as well?"
-msgstr "Bạn muốn thêm người này vào danh sách bạn bè của bạn không?"
+msgstr "Bạn cũng muốn xoá bạn chát này khỏi sổ địa chỉ không?"
 
 msgid "The username specified is invalid."
 msgstr "Bạn đã ghi rõ một tên người dùng không hợp lệ."
@@ -5660,7 +5615,7 @@
 msgstr "Tài khoản Hotmail này có lẽ chưa kích hoạt."
 
 msgid "Profile URL"
-msgstr "URL lý lịch"
+msgstr "URL hồ sơ"
 
 #. *< type
 #. *< ui_requirement
@@ -5750,11 +5705,8 @@
 "Bạn có muốn đặt một tên người dùng ngay bây giờ không? (Ghi chú : KHÔNG THỂ "
 "THAY ĐỔI LẠI !)"
 
-#, fuzzy
 msgid "Lost connection with server"
-msgstr ""
-"Mất kết nối với máy phục vụ\n"
-"%s"
+msgstr "Mất kết nối với máy phục vụ"
 
 #. Can't write _()'d strings in array initializers. Workaround.
 #. khc: then use N_() in the array initializer and use _() when they are
@@ -5779,7 +5731,7 @@
 msgstr "MySpace"
 
 msgid "IM Friends"
-msgstr "Bạn bè Nhắn Tin"
+msgstr "Bạn bè Tin nhắn"
 
 #, c-format
 msgid ""
@@ -5789,7 +5741,7 @@
 "%d buddies were added or updated from the server (including buddies already "
 "on the server-side list)"
 msgstr[0] ""
-"%d bạn thân đã được thêm hoặc cập nhật từ máy phục vụ (gồm có bạn thân đã "
+"%d bạn chát đã được thêm hoặc cập nhật từ máy phục vụ (gồm có bạn chát đã "
 "nằm trên danh sách bên máy phục vụ)"
 
 msgid "Add contacts from server"
@@ -5799,18 +5751,18 @@
 msgid "Protocol error, code %d: %s"
 msgstr "Lỗi giao thức, mã %d: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s Your password is %zu characters, which is longer than the maximum length "
 "of %d.  Please shorten your password at http://profileedit.myspace.com/index."
 "cfm?fuseaction=accountSettings.changePassword and try again."
 msgstr ""
-"%s Bạn đã đặt một mật khẩu chứa %d ký tự, vượt quá chiều dài tối đa mong đợi "
-"%d ở MySpaceIM. Hãy cắt ngắn mật khẩu ở địa chỉ « http://profileedit.myspace."
-"com/index.cfm?fuseaction=accountSettings.changePassword », rồi thử lại."
+"%s Bạn đã đặt một mật khẩu chứa %zu ký tự, vượt quá chiều dài tối đa %d. Hãy "
+"cắt ngắn mật khẩu ở địa chỉ « http://profileedit.myspace.com/index.cfm?"
+"fuseaction=accountSettings.changePassword », sau đó thử lại."
 
 msgid "Incorrect username or password"
-msgstr "Tên người dùng hoặc mật khẩu sai"
+msgstr "Tên người dùng hoặc mật khẩu không đúng"
 
 msgid "MySpaceIM Error"
 msgstr "Lỗi MySpaceIM"
@@ -5819,19 +5771,19 @@
 msgstr "Điều kiện nhập không hợp lệ"
 
 msgid "Failed to add buddy"
-msgstr "Không thêm được bạn thân"
+msgstr "Không thêm được bạn chát"
 
 msgid "'addbuddy' command failed."
-msgstr "Lỗi « addbuddy » (thêm bạn thân) bị lỗi."
+msgstr "Lỗi « addbuddy » (thêm bạn chát) bị lỗi."
 
 msgid "persist command failed"
 msgstr "Lỗi « persist » (bền bỉ) bị lỗi"
 
 msgid "Failed to remove buddy"
-msgstr "Không gỡ bỏ được bạn thân"
+msgstr "Không gỡ bỏ được bạn chát"
 
 msgid "'delbuddy' command failed"
-msgstr "Lỗi « delbuddy » (xoá bạn thân) bị lỗi"
+msgstr "Lỗi « delbuddy » (xoá bạn chát) bị lỗi"
 
 msgid "blocklist command failed"
 msgstr "Lỗi « blocklist » (danh sách chận) bị lỗi"
@@ -5907,6 +5859,9 @@
 "visit http://editprofile.myspace.com/index.cfm?fuseaction=profile.username "
 "to set your username."
 msgstr ""
+"Gặp lỗi trong khi thử đặt tên người dùng. Hãy thử lại, hoặc thăm địa chỉ « "
+"http://editprofile.myspace.com/index.cfm?fuseaction=profile.username » để "
+"đặt tên người dùng."
 
 msgid "MySpaceIM - Username Available"
 msgstr "MySpaceIM — Tên người dùng sẵn sàng"
@@ -6165,9 +6120,9 @@
 msgid "Unknown error: 0x%X"
 msgstr "Lỗi không rõ : 0x%X"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to login: %s"
-msgstr "Không thể đăng nhập"
+msgstr "Không thể đăng nhập: %s"
 
 #, c-format
 msgid "Unable to send message. Could not get details for user (%s)."
@@ -6299,12 +6254,11 @@
 "%s appears to be offline and did not receive the message that you just sent."
 msgstr "%s có vẻ là đang ngoại tuyến nên không thể nhận tin bạn vừa gửi."
 
-#, fuzzy
 msgid ""
 "Unable to connect to server. Please enter the address of the server to which "
 "you wish to connect."
 msgstr ""
-"Không thể kết nối đến máy phục vụ. Hãy nhập địa chỉ của máy phục vụ tới đó "
+"Không thể kết nối tới máy phục vụ. Hãy nhập địa chỉ của máy phục vụ tới đó "
 "bạn muốn kết nối."
 
 msgid "This conference has been closed. No more messages can be sent."
@@ -6330,9 +6284,9 @@
 msgstr "Cổng máy phục vụ"
 
 #. Note to translators: %s in this string is a URL
-#, fuzzy, c-format
+#, c-format
 msgid "Received unexpected response from %s"
-msgstr "Nhận được đáp ứng HTTP bất thường từ máy phục vụ."
+msgstr "Nhận được đáp ứng HTTP bất thường từ %s"
 
 #. username connecting too frequently
 msgid ""
@@ -6344,12 +6298,12 @@
 
 #. Note to translators: The first %s is a URL, the second is an
 #. error message.
-#, fuzzy, c-format
+#, c-format
 msgid "Error requesting %s: %s"
-msgstr "Lỗi yêu cầu hiệu bài đăng nhập"
+msgstr "Gặp lỗi khi yêu cầu %s: %s"
 
 msgid "AOL does not allow your screen name to authenticate here"
-msgstr ""
+msgstr "AOL không cho phép tên màn hình xác thực ở đây"
 
 msgid "Could not join chat room"
 msgstr "Không thể tham gia phòng trò chuyện"
@@ -6357,9 +6311,8 @@
 msgid "Invalid chat room name"
 msgstr "Tên phòng trò chuyện không hợp lệ"
 
-#, fuzzy
 msgid "Received invalid data on connection with server"
-msgstr "Nhận dữ liệu không hợp lệ khi kết nối tới máy phục vụ."
+msgstr "Nhận được dữ liệu không hợp lệ khi kết nối tới máy phục vụ"
 
 # AIM là mạng trò chuyện khác.
 #. *< type
@@ -6376,7 +6329,7 @@
 msgstr "Phần bổ sung giao thức AIM"
 
 msgid "ICQ UIN..."
-msgstr ""
+msgstr "ICQ UIN..."
 
 # ICQ là mạng trò chuyện khác.
 #. *< type
@@ -6408,7 +6361,6 @@
 msgid "Received invalid data on connection with remote user."
 msgstr "Nhận dữ liệu không hợp lệ khi kết nối với người dùng từ xa."
 
-#, fuzzy
 msgid "Unable to establish a connection with the remote user."
 msgstr "Không thể thiết lập kết nối với người dùng từ xa."
 
@@ -6506,7 +6458,7 @@
 "encoding he is using, you can specify it in the advanced account options for "
 "your AIM/ICQ account.)"
 msgstr ""
-"(Gặp lỗi khi nhận tin này. Bạn thân với họ bạn đang nói chuyện rất có thể sử "
+"(Gặp lỗi khi nhận tin này. Bạn chát với họ bạn đang nói chuyện rất có thể sử "
 "dụng bảng mã khác với điều mong đợi. Biết bảng mã đó thì bạn ghi rõ nó trong "
 "các tùy chọn tài khoản cấp cao cho tài khoản AIM/ICQ của bạn.)"
 
@@ -6520,7 +6472,7 @@
 
 #. Label
 msgid "Buddy Icon"
-msgstr "Biểu tượng bạn thân"
+msgstr "Biểu tượng bạn chát"
 
 msgid "Voice"
 msgstr "Nói"
@@ -6609,17 +6561,15 @@
 msgstr "Mức cảnh báo"
 
 msgid "Buddy Comment"
-msgstr "Chú thích bạn thân"
-
-#, fuzzy, c-format
+msgstr "Chú thích bạn chát"
+
+#, c-format
 msgid "Unable to connect to authentication server: %s"
-msgstr ""
-"Không thể kết nối tới máy phục vụ xác thực:\n"
-"%s"
-
-#, fuzzy, c-format
+msgstr "Không thể kết nối tới máy phục vụ xác thực: %s"
+
+#, c-format
 msgid "Unable to connect to BOS server: %s"
-msgstr "Không thể kết nối đến máy phục vụ."
+msgstr "Không thể kết nối tới máy phục vụ BOS: %s"
 
 msgid "Username sent"
 msgstr "Tên người dùng đã được gửi"
@@ -6631,21 +6581,19 @@
 msgid "Finalizing connection"
 msgstr "Đang hoàn tất kết nối"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Unable to sign on as %s because the username is invalid.  Usernames must be "
 "a valid email address, or start with a letter and contain only letters, "
 "numbers and spaces, or contain only numbers."
 msgstr ""
-"Không thể đăng nhập. Không thể đăng nhập dưới %s vì tên người dùng không hợp "
-"lệ. Tên người dùng phải là một địa chỉ thư điện tử hợp lệ, hoặc bắt đầu với "
-"một chữ cái và chỉ chứa chữ cái, chữ số và khoảng trống, hoặc chỉ chứa chữ "
-"số."
-
-#, fuzzy, c-format
+"Không thể đăng nhập dưới %s vì tên người dùng không hợp lệ. Tên người dùng "
+"phải là một địa chỉ thư điện tử hợp lệ, hoặc bắt đầu với một chữ cái và chỉ "
+"chứa chữ cái, chữ số và khoảng trống, hoặc chỉ chứa chữ số."
+
+#, c-format
 msgid "You may be disconnected shortly.  If so, check %s for updates."
-msgstr ""
-"Bạn có thể bị ngắt kết nối một thời gian ngắn. Hãy kiểm tra %s để cập nhật."
+msgstr "Bạn có thể sắp bị ngắt kết nối. Có thì hãy kiểm tra %s để cập nhật."
 
 msgid "Unable to get a valid AIM login hash."
 msgstr "Không thể lấy mã đăng nhập AIM hợp lệ."
@@ -6659,14 +6607,12 @@
 #. Unregistered username
 #. uid is not exist
 #. the username does not exist
-#, fuzzy
 msgid "Username does not exist"
-msgstr "Người dùng đó không tồn tại."
+msgstr "Tên người dùng không tồn tại"
 
 #. Suspended account
-#, fuzzy
 msgid "Your account is currently suspended"
-msgstr "Tài khoản của bạn tạm thời bị đình chỉ."
+msgstr "Tài khoản của bạn hiện thời bị đình chỉ"
 
 #. service temporarily unavailable
 msgid "The AOL Instant Messenger service is temporarily unavailable."
@@ -6678,18 +6624,16 @@
 msgstr "Bạn đang dùng phiên bản trình khách quá cũ. Hãy nâng cấp tại %s"
 
 #. IP address connecting too frequently
-#, fuzzy
 msgid ""
 "You have been connecting and disconnecting too frequently. Wait a minute and "
 "try again. If you continue to try, you will need to wait even longer."
 msgstr ""
-"Bạn đã liên tục kết nối và ngắt kết nối quá nhiều. Xin chờ 10 phút rồi thử "
-"lại. Nếu bạn tiếp tục kết nối, bạn sẽ phải đợi lâu hơn."
+"Bạn đã liên tục kết nối và ngắt kết nối quá nhiều. Xin chờ một phút rồi thử "
+"lại. Cứ thử kết nối thì bạn phải đợi ngay cả lâu hơn."
 
 # SecurID là tên: đừng dịch
-#, fuzzy
 msgid "The SecurID key entered is invalid"
-msgstr "Khoá SecurID nhập vào không hợp lệ."
+msgstr "Khoá SecurID nhập vào không hợp lệ"
 
 msgid "Enter SecurID"
 msgstr "Nhập vào SecurID"
@@ -6768,7 +6712,7 @@
 
 #, c-format
 msgid "ICQ user %u has sent you a buddy: %s (%s)"
-msgstr "Người dùng ICQ %u gửi tới bạn một bạn thân: %s (%s)"
+msgstr "Người dùng ICQ %u gửi tới bạn một bạn chát: %s (%s)"
 
 msgid "Do you want to add this buddy to your buddy list?"
 msgstr "Bạn muốn thêm người này vào danh sách bạn bè của bạn không?"
@@ -7009,19 +6953,18 @@
 msgid "Away message too long."
 msgstr "Thông báo vắng mặt quá dài."
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Unable to add the buddy %s because the username is invalid.  Usernames must "
 "be a valid email address, or start with a letter and contain only letters, "
 "numbers and spaces, or contain only numbers."
 msgstr ""
-"Không thể thêm bạn chát %s vì tên người dùng này không hợp lệ. Tên người "
+"Không thể thêm bạn chát %s vì tên người dùng này không hợp lệ. Mỗi tên người "
 "dùng phải là một địa chỉ thư điện tử hợp lệ, hoặc bắt đầu bằng một chữ cái "
 "và chỉ chứa chữ cái, chữ số, và khoảng trống, hoặc chỉ chứa chữ số."
 
-#, fuzzy
 msgid "Unable to Retrieve Buddy List"
-msgstr "Không thể nhận danh sách bạn bè"
+msgstr "Không thể lấy Danh sách Bạn bè"
 
 msgid ""
 "The AIM servers were temporarily unable to send your buddy list.  Your buddy "
@@ -7033,7 +6976,7 @@
 msgid "Orphans"
 msgstr "Thừa"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Unable to add the buddy %s because you have too many buddies in your buddy "
 "list.  Please remove one and try again."
@@ -7044,7 +6987,7 @@
 msgid "(no name)"
 msgstr "(không tên)"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to add the buddy %s for an unknown reason."
 msgstr "Không thể thêm bạn chát %s vì lý do không rõ."
 
@@ -7113,9 +7056,8 @@
 msgid "C_onnect"
 msgstr "_Kết nối"
 
-#, fuzzy
 msgid "You closed the connection."
-msgstr "Máy phục vụ đã đóng kết nối."
+msgstr "Bạn đã đóng kết nối."
 
 msgid "Get AIM Info"
 msgstr "Lấy thông tin AIM"
@@ -7127,12 +7069,11 @@
 msgid "Get Status Msg"
 msgstr "Lấy thông điệp trạng thái"
 
-#, fuzzy
 msgid "End Direct IM Session"
-msgstr "Đã thiết lập nhắn tin nhanh trực tiếp"
+msgstr "Kết thúc buổi hợp Tin nhắn Trực tiếp"
 
 msgid "Direct IM"
-msgstr "Nhắn Tin Trực Tiếp"
+msgstr "Tin nhắn Trực tiếp"
 
 msgid "Re-request Authorization"
 msgstr "Yêu cầu lại sự cho phép"
@@ -7213,9 +7154,8 @@
 msgid "Search for Buddy by Information"
 msgstr "Tìm kiếm bạn chát theo thông tin"
 
-#, fuzzy
 msgid "Use clientLogin"
-msgstr "Người dùng chưa đăng nhập"
+msgstr "Dùng clientLogin"
 
 msgid ""
 "Always use AIM/ICQ proxy server for\n"
@@ -7329,16 +7269,14 @@
 msgid "Other"
 msgstr "Khác"
 
-#, fuzzy
 msgid "Visible"
-msgstr "Giấu mặt"
+msgstr "Hiện rõ"
 
 msgid "Friend Only"
-msgstr ""
-
-#, fuzzy
+msgstr "Chỉ người bạn"
+
 msgid "Private"
-msgstr "Riêng tư"
+msgstr "Riêng"
 
 msgid "QQ Number"
 msgstr "Số QQ"
@@ -7355,9 +7293,8 @@
 msgid "Phone Number"
 msgstr "Điện thoại"
 
-#, fuzzy
 msgid "Authorize adding"
-msgstr "Cho phép bạn thân không?"
+msgstr "Cho phép thêm"
 
 msgid "Cellphone Number"
 msgstr "Điện thoại di động"
@@ -7365,64 +7302,50 @@
 msgid "Personal Introduction"
 msgstr "Giới thiệu cá nhân"
 
-#, fuzzy
 msgid "City/Area"
-msgstr "T.P."
-
-#, fuzzy
+msgstr "T.P./Vùng"
+
 msgid "Publish Mobile"
-msgstr "Điện thoại di động cá nhân"
-
-#, fuzzy
+msgstr "Xuất số di động"
+
 msgid "Publish Contact"
-msgstr "Liên lạc bí danh"
+msgstr "Xuất liên lạc"
 
 msgid "College"
 msgstr "Cao đẳng"
 
-#, fuzzy
 msgid "Horoscope"
-msgstr "Ký hiệu tử vi"
-
-#, fuzzy
+msgstr "Tử vi"
+
 msgid "Zodiac"
-msgstr "Ký hiệu hoàng đạo"
-
-#, fuzzy
+msgstr "Hoàng đạo"
+
 msgid "Blood"
-msgstr "Bị chặn"
-
-#, fuzzy
+msgstr "Máu"
+
 msgid "True"
-msgstr "Kim Ngưu"
-
-#, fuzzy
+msgstr "Đúng"
+
 msgid "False"
-msgstr "Bị lỗi"
-
-#, fuzzy
+msgstr "Sai"
+
 msgid "Modify Contact"
-msgstr "Sửa tài khoản"
-
-#, fuzzy
+msgstr "Sửa liên lạc"
+
 msgid "Modify Address"
-msgstr "Địa chỉ nhà"
-
-#, fuzzy
+msgstr "Sửa địa chỉ"
+
 msgid "Modify Extended Information"
-msgstr "Sửa đổi thông tin của tôi"
-
-#, fuzzy
+msgstr "Sửa thông tin mở rộng"
+
 msgid "Modify Information"
-msgstr "Sửa đổi thông tin của tôi"
-
-#, fuzzy
+msgstr "Sửa thông tin"
+
 msgid "Update"
-msgstr "Cập nhật lần cuối"
-
-#, fuzzy
+msgstr "Cập nhật"
+
 msgid "Could not change buddy information."
-msgstr "Hãy nhập thông tin về bạn thân."
+msgstr "Không thể sửa đổi thông tin về bạn chát."
 
 msgid "Mobile"
 msgstr "Di động"
@@ -7431,99 +7354,84 @@
 msgstr "Ghi chú"
 
 #. callback
-#, fuzzy
 msgid "Buddy Memo"
-msgstr "Biểu tượng bạn thân"
+msgstr "Ghi nhớ bạn chát"
 
 msgid "Change his/her memo as you like"
-msgstr ""
-
-#, fuzzy
+msgstr "Sửa đổi bản ghi nhớ của họ theo ý kiến của bạn"
+
 msgid "_Modify"
-msgstr "Sửa"
-
-#, fuzzy
+msgstr "_Sửa"
+
 msgid "Memo Modify"
-msgstr "Sửa"
-
-#, fuzzy
+msgstr "Sửa ghi nhớ"
+
 msgid "Server says:"
-msgstr "Máy phục vụ bận"
+msgstr "Máy phục vụ nói:"
 
 msgid "Your request was accepted."
-msgstr ""
+msgstr "Yêu cầu của bạn đã được chấp nhận."
 
 msgid "Your request was rejected."
-msgstr ""
-
-#, fuzzy, c-format
+msgstr "Yêu cầu của bạn bị từ chối."
+
+#, c-format
 msgid "%u requires verification"
-msgstr "Cần thiết sự cho phép"
-
-#, fuzzy
+msgstr "%u cần thiết sự thẩm tra"
+
 msgid "Add buddy question"
-msgstr "Có thêm bạn thân vào danh sách của bạn không?"
-
-#, fuzzy
+msgstr "Hỏi câu cho bạn chát"
+
 msgid "Enter answer here"
-msgstr "Gõ yêu cầu vào đây"
+msgstr "Gõ đáp ứng vào đây"
 
 msgid "Send"
 msgstr "Gửi"
 
-#, fuzzy
 msgid "Invalid answer."
-msgstr "Tên người dùng sai."
+msgstr "Sai đáp ứng."
 
 msgid "Authorization denied message:"
 msgstr "Thông điệp từ chối cho phép:"
 
-#, fuzzy
 msgid "Sorry, you're not my style."
-msgstr "Tiếc là tôi quá bận..."
-
-#, fuzzy, c-format
+msgstr "Tiếc là tôi quá bận."
+
+#, c-format
 msgid "%u needs authorization"
-msgstr "Người dùng %d yêu cầu sự cho phép"
-
-#, fuzzy
+msgstr "%u yêu cầu sự cho phép"
+
 msgid "Add buddy authorize"
-msgstr "Có thêm bạn thân vào danh sách của bạn không?"
-
-#, fuzzy
+msgstr "Thêm sự cho phép bạn chát"
+
 msgid "Enter request here"
 msgstr "Gõ yêu cầu vào đây"
 
 msgid "Would you be my friend?"
 msgstr "Bạn có muốn nói chuyện phải không?"
 
-#, fuzzy
 msgid "QQ Buddy"
-msgstr "Bạn chát"
-
-#, fuzzy
+msgstr "Bạn chát QQ"
+
 msgid "Add buddy"
-msgstr "Thêm bạn thân"
-
-#, fuzzy
+msgstr "Thêm bạn chát"
+
 msgid "Invalid QQ Number"
-msgstr "Mặt QQ không hợp lệ"
-
-#, fuzzy
+msgstr "Con số QQ không hợp lệ"
+
 msgid "Failed sending authorize"
-msgstr "Xin hãy cho phép tôi."
-
-#, fuzzy, c-format
+msgstr "Lỗi gửi sự cho phép"
+
+#, c-format
 msgid "Failed removing buddy %u"
-msgstr "Không gỡ bỏ được bạn thân"
-
-#, fuzzy, c-format
+msgstr "Lỗi gỡ bỏ bạn chát %u"
+
+#, c-format
 msgid "Failed removing me from %d's buddy list"
-msgstr "%s đã loại bỏ bạn ra khỏi danh sách bạn bè."
-
-#, fuzzy
+msgstr "Lỗi gỡ bỏ mình khỏi danh sách bạn chát của %d"
+
 msgid "No reason given"
-msgstr "Không nêu lý do."
+msgstr "Không nêu lý do"
 
 #. only need to get value
 #, c-format
@@ -7533,9 +7441,9 @@
 msgid "Would you like to add him?"
 msgstr "Bạn có muốn thêm họ không?"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Rejected by %s"
-msgstr "Từ chối"
+msgstr "Bị %s từ chối"
 
 #, c-format
 msgid "Message: %s"
@@ -7550,90 +7458,73 @@
 msgid "QQ Qun"
 msgstr "QQ Qun"
 
-#, fuzzy
 msgid "Please enter Qun number"
-msgstr "Hãy nhập tên mới cho %s"
-
-#, fuzzy
+msgstr "Hãy gõ con số Qun"
+
 msgid "You can only search for permanent Qun\n"
-msgstr "Bạn chỉ có khả năng tìm kiếm nhóm QQ bên bỉ\n"
-
-#, fuzzy
+msgstr "Bạn chỉ có khả năng tìm kiếm QQ bên bỉ\n"
+
 msgid "(Invalid UTF-8 string)"
-msgstr "Thiết lập ủy nhiệm không hợp lệ"
-
-#, fuzzy
+msgstr "(Chuỗi UTF-8 không hợp lệ)"
+
 msgid "Not member"
-msgstr "Tôi không phải là thành viên"
-
-#, fuzzy
+msgstr "Không phải thành viên"
+
 msgid "Member"
-msgstr "Là thành viên từ"
-
-#, fuzzy
+msgstr "Thành viên"
+
 msgid "Requesting"
-msgstr "Hộp thoại yêu cầu"
-
-# Tên của ứng dụng khách tin nhắn khác: đừng dịch.
-#, fuzzy
+msgstr " Đăng yêu cầu"
+
 msgid "Admin"
-msgstr "Adium"
-
-#, fuzzy
+msgstr "Quản trị"
+
 msgid "Notice"
-msgstr "Ghi chú"
-
-#, fuzzy
+msgstr "Thông báo"
+
 msgid "Detail"
-msgstr "Mặc định"
+msgstr "Chi tiết"
 
 msgid "Creator"
 msgstr "Người tạo"
 
-#, fuzzy
 msgid "About me"
-msgstr "Giới thiệu %s"
-
-#, fuzzy
+msgstr "Giới thiệu mình"
+
 msgid "Category"
-msgstr "Lỗi chát"
-
-#, fuzzy
+msgstr "Loại"
+
 msgid "The Qun does not allow others to join"
-msgstr "Nhóm này không cho phép người khác tham gia"
-
-#, fuzzy
+msgstr "Qun này không cho phép người khác tham gia"
+
 msgid "Join QQ Qun"
-msgstr "Tham gia chát"
+msgstr "Tham gia QQ Qun"
 
 msgid "Input request here"
 msgstr "Gõ yêu cầu vào đây"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Successfully joined Qun %s (%u)"
-msgstr "Bạn đã sửa đổi thành công thành viên Qun"
-
-#, fuzzy
+msgstr "Đã tham gia thành công Qun %s (%u)"
+
 msgid "Successfully joined Qun"
-msgstr "Bạn đã sửa đổi thành công thành viên Qun"
+msgstr "Đã tham gia thành công Qun"
 
 #, c-format
 msgid "Qun %u denied from joining"
-msgstr ""
+msgstr "Qun %u từ chối tham gia"
 
 msgid "QQ Qun Operation"
 msgstr "Thao tác QQ Qun"
 
-#, fuzzy
 msgid "Failed:"
-msgstr "Bị lỗi"
+msgstr "Bị lỗi:"
 
 msgid "Join Qun, Unknown Reply"
-msgstr ""
-
-#, fuzzy
+msgstr "Tham gia Qun, Đáp ứng không rõ"
+
 msgid "Quit Qun"
-msgstr "QQ Qun"
+msgstr "Thoát khỏi Qun"
 
 msgid ""
 "Note, if you are the creator, \n"
@@ -7642,51 +7533,47 @@
 "Ghi chú : nếu bạn là người tạo, \n"
 "cuối cùng thao tác này sẽ gỡ bỏ Qun này."
 
-#, fuzzy
 msgid "Sorry, you are not our style"
-msgstr "Tiếc là tôi quá bận..."
-
-#, fuzzy
+msgstr "Tiếc là nhóm này quá đầy"
+
 msgid "Successfully changed Qun members"
-msgstr "Bạn đã sửa đổi thành công thành viên Qun"
-
-#, fuzzy
+msgstr "Đã thay đổi thành công thành viên Qun"
+
 msgid "Successfully changed Qun information"
-msgstr "Bạn đã sửa đổi thành công thông tin Qun"
+msgstr "Đã sửa đổi thành công thông tin Qun"
 
 msgid "You have successfully created a Qun"
 msgstr "Bạn đã tạo thành công một Qun"
 
-#, fuzzy
 msgid "Would you like to set up detailed information now?"
-msgstr "Bạn có muốn thiết lập chi tiết Qun ngay bây giờ không?"
+msgstr "Bạn có muốn thiết lập thông tin chi tiết ngay bây giờ không?"
 
 msgid "Setup"
 msgstr "Thiết lập"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%u requested to join Qun %u for %s"
-msgstr "Người dùng %d đã yêu cầu tham gia nhóm %d"
-
-#, fuzzy, c-format
+msgstr "%u đã yêu cầu tham gia Qun %u cho %s"
+
+#, c-format
 msgid "%u request to join Qun %u"
-msgstr "Người dùng %d đã yêu cầu tham gia nhóm %d"
-
-#, fuzzy, c-format
+msgstr "%u yêu cầu tham gia Qun %u"
+
+#, c-format
 msgid "Failed to join Qun %u, operated by admin %u"
-msgstr "Không tham gia được với bạn chát"
+msgstr "Lỗi tham gia Qun %u, được %u quản trị"
 
 #, c-format
 msgid "<b>Joining Qun %u is approved by admin %u for %s</b>"
-msgstr ""
-
-#, fuzzy, c-format
+msgstr "<b>Tham gia Qun %u được %u tán thành cho %s</b>"
+
+#, c-format
 msgid "<b>Removed buddy %u.</b>"
-msgstr "Bỏ bạn chát"
-
-#, fuzzy, c-format
+msgstr "<b>Đã gỡ bỏ bạn chát %u.</b>"
+
+#, c-format
 msgid "<b>New buddy %u joined.</b>"
-msgstr "Bỏ bạn chát"
+msgstr "<b>Bạn chát mới %u đã tham gia.</b>"
 
 #, c-format
 msgid "Unknown-%d"
@@ -7696,151 +7583,139 @@
 msgstr "Cấp"
 
 msgid " VIP"
-msgstr ""
+msgstr " VIP"
 
 msgid " TCP"
-msgstr ""
-
-#, fuzzy
+msgstr " TCP"
+
 msgid " FromMobile"
-msgstr "Di động"
-
-#, fuzzy
+msgstr " FromMobile"
+
 msgid " BindMobile"
-msgstr "Di động"
-
-#, fuzzy
+msgstr " BindMobile"
+
 msgid " Video"
-msgstr "Ảnh động trực tiếp"
-
-#, fuzzy
+msgstr " Phim"
+
 msgid " Zone"
-msgstr "Không"
+msgstr " Vùng"
 
 msgid "Flag"
-msgstr ""
+msgstr "Cờ"
 
 msgid "Ver"
-msgstr ""
+msgstr "Pb"
 
 msgid "Invalid name"
 msgstr "Tên không hợp lệ"
 
-#, fuzzy
 msgid "Select icon..."
-msgstr "Chọn thư mục..."
-
-#, fuzzy, c-format
+msgstr "Chọn biểu tượng..."
+
+#, c-format
 msgid "<b>Login time</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Thời gian đăng nhập:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Thời gian đăng nhập</b>: %d-%d-%d, %d:%d:%d<br>\n"
+
+#, c-format
 msgid "<b>Total Online Buddies</b>: %d<br>\n"
-msgstr "<b>Hiện thời trực tuyến</b>: %d<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Tổng các bạn chát trực tuyến</b>: %d<br>\n"
+
+#, c-format
 msgid "<b>Last Refresh</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Cập nhật cuối:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Cập nhật cuối:</b>: %d-%d-%d, %d:%d:%d<br>\n"
+
+#, c-format
 msgid "<b>Server</b>: %s<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Máy phục vụ</b>: %s<br>\n"
+
+#, c-format
 msgid "<b>Client Tag</b>: %s<br>\n"
-msgstr "<b>Thời gian đăng nhập:</b> %s<br>\n"
+msgstr "<b>Thẻ ứng dụng khách</b>: %s<br>\n"
 
 #, c-format
 msgid "<b>Connection Mode</b>: %s<br>\n"
-msgstr "<b>Chế độ kết nối:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Chế độ kết nối</b>: %s<br>\n"
+
+#, c-format
 msgid "<b>My Internet IP</b>: %s:%d<br>\n"
-msgstr "<b>Chế độ kết nối:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Địa chỉ IP Internet của mình</b>: %s:%d<br>\n"
+
+#, c-format
 msgid "<b>Sent</b>: %lu<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Đã gửi</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Resend</b>: %lu<br>\n"
-msgstr "<b>Cập nhật cuối:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Gửi lại</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Lost</b>: %lu<br>\n"
-msgstr "<b>Cập nhật cuối:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Bị mất</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Received</b>: %lu<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Đã nhận</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Received Duplicate</b>: %lu<br>\n"
-msgstr "<b>IP công của tôi:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Đã nhận bản sao</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Time</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Thời gian đăng nhập:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Thời gian</b>: %d-%d-%d, %d:%d:%d<br>\n"
+
+#, c-format
 msgid "<b>IP</b>: %s<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
+msgstr "<b>IP</b>: %s<br>\n"
 
 msgid "Login Information"
 msgstr "Thông tin đăng nhập"
 
 msgid "<p><b>Original Author</b>:<br>\n"
-msgstr ""
+msgstr "<p><b>Tác giả gốc</b>:<br>\n"
 
 msgid "<p><b>Code Contributors</b>:<br>\n"
-msgstr ""
-
-#, fuzzy
+msgstr "<p><b>Người đóng góp mã nguồn</b>:<br>\n"
+
 msgid "<p><b>Lovely Patch Writers</b>:<br>\n"
-msgstr "<b>Cập nhật cuối:</b> %s<br>\n"
-
-#, fuzzy
+msgstr "<p><b>Người tạo đắp vá rất hữu ích</b>:<br>\n"
+
 msgid "<p><b>Acknowledgement</b>:<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
-
-#, fuzzy
+msgstr "<p><b>Công trạng</b>:<br>\n"
+
 msgid "<p><b>Scrupulous Testers</b>:<br>\n"
-msgstr "<b>Cập nhật cuối:</b> %s<br>\n"
+msgstr "<p><b>Người thữ kỹ</b>:<br>\n"
 
 msgid "and more, please let me know... thank you!))"
-msgstr ""
+msgstr "và các người khác (xin gửi chi tiết))"
 
 msgid "<p><i>And, all the boys in the backroom...</i><br>\n"
-msgstr ""
+msgstr "<p><i>Và tất cả các người nghiên cứu bí mật...</i><br>\n"
 
 msgid "<i>Feel free to join us!</i> :)"
-msgstr ""
-
-#, fuzzy, c-format
+msgstr "<i>Mời bạn tham gia !</i> :)"
+
+#, c-format
 msgid "About OpenQ %s"
-msgstr "Giới thiệu %s"
-
-#, fuzzy
+msgstr "Giới thiệu OpenQ %s"
+
 msgid "Change Icon"
-msgstr "Lưu biểu tượng"
+msgstr "Đổi biểu tượng"
 
 msgid "Change Password"
 msgstr "Đổi mật khẩu"
 
-#, fuzzy
 msgid "Account Information"
-msgstr "Thông tin đăng nhập"
+msgstr "Thông tin Tài khoản"
 
 msgid "Update all QQ Quns"
-msgstr ""
-
-#, fuzzy
+msgstr "Cập nhật mọi QQ Qun"
+
 msgid "About OpenQ"
-msgstr "Giới thiệu %s"
-
-#, fuzzy
+msgstr "Giới thiệu OpenQ"
+
 msgid "Modify Buddy Memo"
-msgstr "Địa chỉ nhà"
+msgstr "Sửa ghi nhớ bạn chát"
 
 #. *< type
 #. *< ui_requirement
@@ -7852,189 +7727,171 @@
 #. *< version
 #. *  summary
 #. *  description
-#, fuzzy
 msgid "QQ Protocol Plugin"
-msgstr "Phần bổ sung\tgiao thức QQ"
-
-#, fuzzy
+msgstr "Phần bổ sung giao thức QQ"
+
 msgid "Auto"
-msgstr "Tác giả"
-
-#, fuzzy
+msgstr "Tự động"
+
 msgid "Select Server"
-msgstr "Chọn người dùng"
+msgstr "Chọn máy phục vụ"
 
 msgid "QQ2005"
-msgstr ""
+msgstr "QQ2005"
 
 msgid "QQ2007"
-msgstr ""
+msgstr "QQ2007"
 
 msgid "QQ2008"
-msgstr ""
-
-#, fuzzy
+msgstr "QQ2008"
+
 msgid "Connect by TCP"
-msgstr "Kết nối bằng TCP"
-
-#, fuzzy
+msgstr "Kết nối qua TCP"
+
 msgid "Show server notice"
-msgstr "Cổng máy phục vụ"
-
-#, fuzzy
+msgstr "Hiện thông báo máy phục vụ"
+
 msgid "Show server news"
-msgstr "Địa chỉ máy phục vụ"
+msgstr "Hiện tin tức máy phục vụ"
 
 msgid "Show chat room when msg comes"
-msgstr ""
-
-#, fuzzy
+msgstr "Nhận được tin nhẳn thì cũng hiển thị phòng chát"
+
 msgid "Keep alive interval (seconds)"
-msgstr "Lỗi giữ cho kết nối hoạt động"
-
-#, fuzzy
+msgstr "Khoảng giữ cho kết nối hoạt động (giây)"
+
 msgid "Update interval (seconds)"
-msgstr "Lỗi giữ cho kết nối hoạt động"
-
-#, fuzzy
+msgstr "Khoảng cập nhật (giây)"
+
 msgid "Unable to decrypt server reply"
-msgstr "Không thể lấy thông tin về máy phục vụ"
+msgstr "Không thể giải mật mã đáp ứng máy phục vụ"
 
 #, c-format
 msgid "Failed requesting token, 0x%02X"
-msgstr ""
-
-#, fuzzy, c-format
+msgstr "Lỗi yêu cầu hiệu bài, 0x%02X"
+
+#, c-format
 msgid "Invalid token len, %d"
-msgstr "Tựa đề không hợp lệ"
+msgstr "Chiều dài hiệu bài không hợp lệ, %d"
 
 #. extend redirect used in QQ2006
 msgid "Redirect_EX is not currently supported"
-msgstr ""
+msgstr "Redirect_EX hiện thời không được hỗ trợ"
 
 #. need activation
 #. need activation
 #. need activation
-#, fuzzy
 msgid "Activation required"
-msgstr "Yêu cầu đăng ký"
+msgstr "Yêu cầu kích hoạt"
 
 #, c-format
 msgid "Unknown reply code when logging in (0x%02X)"
-msgstr ""
-
-#, fuzzy
+msgstr "Gặp mã đáp ứng không được nhận ra khi đăng nhập (0x%02X)"
+
 msgid "Requesting captcha"
-msgstr "Đang yêu cầu sự chú ý của %s..."
-
-#, fuzzy
+msgstr "Đang yêu cầu Captcha"
+
 msgid "Checking captcha"
-msgstr "Đang yêu cầu sự chú ý của %s..."
-
-#, fuzzy
+msgstr "Đang kiểm tra Captcha"
+
 msgid "Failed captcha verification"
-msgstr "Lỗi xác thực Yahoo"
-
-#, fuzzy
+msgstr "Lỗi thẩm tra Captcha"
+
 msgid "Captcha Image"
-msgstr "Lưu ảnh"
-
-#, fuzzy
+msgstr "Ảnh Captcha"
+
 msgid "Enter code"
-msgstr "Nhập mật khẩu"
-
-#, fuzzy
+msgstr "Gõ mã"
+
 msgid "QQ Captcha Verification"
-msgstr "Thẩm tra chứng nhận SSL"
-
-#, fuzzy
+msgstr "Thẩm tra Captcha QQ"
+
 msgid "Enter the text from the image"
-msgstr "Hãy nhập tên của nhóm"
+msgstr "Hãy nhập chuỗi từ ảnh"
 
 #, c-format
 msgid "Unknown reply when checking password (0x%02X)"
-msgstr ""
+msgstr "Không nhận ra đáp ứng khi kiểm tra mật khẩu (0x%02X)"
 
 #, c-format
 msgid ""
 "Unknown reply code when logging in (0x%02X):\n"
 "%s"
 msgstr ""
+"Gặp mã đáp ứng không được nhận ra khi đăng nhập vào (0x%02X):\n"
+"%s"
 
 msgid "Socket error"
 msgstr "Lỗi ổ cắm"
 
-#, fuzzy
 msgid "Getting server"
-msgstr "Lập thông tin người dùng..."
-
-#, fuzzy
+msgstr "Đang lấy máy phục vụ"
+
 msgid "Requesting token"
-msgstr "Yêu cầu bị từ chối"
-
-#, fuzzy
+msgstr "Đang yêu cầu hiệu bài"
+
 msgid "Unable to resolve hostname"
-msgstr "Không thể kết nối đến máy phục vụ."
-
-#, fuzzy
+msgstr "Không thể quyết định tên máy"
+
 msgid "Invalid server or port"
-msgstr "Lỗi không hợp lệ"
-
-#, fuzzy
+msgstr "Sai máy phục vụ hay cổng"
+
 msgid "Connecting to server"
-msgstr "Đang kết nối tới máy phục vụ SILC"
-
-#, fuzzy
+msgstr "Đang kết nối tới máy phục vụ"
+
 msgid "QQ Error"
-msgstr "Lỗi QQid"
-
-#, fuzzy, c-format
+msgstr "Lỗi QQ"
+
+#, c-format
 msgid ""
 "Server News:\n"
 "%s\n"
 "%s\n"
 "%s"
-msgstr "Chuyển tiếp máy phục vụ ICQ"
-
-#, fuzzy, c-format
+msgstr ""
+"Tin tức Máy phục vụ :\n"
+"%s\n"
+"%s\n"
+"%s"
+
+#, c-format
 msgid "%s:%s"
-msgstr "%s (%s)"
-
-#, fuzzy, c-format
+msgstr "%s:%s"
+
+#, c-format
 msgid "From %s:"
-msgstr "Từ"
-
-#, fuzzy, c-format
+msgstr "Từ  %s:"
+
+#, c-format
 msgid ""
 "Server notice From %s: \n"
 "%s"
-msgstr "Hướng dẫn máy phục vụ : %s"
-
-#, fuzzy
+msgstr ""
+"Thông báo máy phục vụ Từ %s: \n"
+"%s"
+
 msgid "Unknown SERVER CMD"
-msgstr "Lý do không rõ"
+msgstr "Câu lệnh máy phục vụ (SERVER CMD) không rõ"
 
 #, c-format
 msgid ""
 "Error reply of %s(0x%02X)\n"
 "Room %u, reply 0x%02X"
 msgstr ""
-
-#, fuzzy
+"Lỗi đáp ứng %s(0x%02X)\n"
+"Phòng %u, đáp ứng 0x%02X"
+
 msgid "QQ Qun Command"
-msgstr "Lệnh"
-
-#, fuzzy
+msgstr "Lệnh QQ Qun"
+
 msgid "Unable to decrypt login reply"
-msgstr "Không thể lấy thông tin về máy phục vụ"
-
-#, fuzzy
+msgstr "Không thể giải mật mã đáp ứng đăng nhập"
+
 msgid "Unknown LOGIN CMD"
-msgstr "Lý do không rõ"
-
-#, fuzzy
+msgstr "Câu lệnh đăng nhập (LOGIN CMD) không rõ"
+
 msgid "Unknown CLIENT CMD"
-msgstr "Lý do không rõ"
+msgstr "Câu lệnh ứng dụng khách (CLIENT CMD) không rõ"
 
 #, c-format
 msgid "%d has declined the file %s"
@@ -8043,9 +7900,9 @@
 msgid "File Send"
 msgstr "Gửi tập tin"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%d cancelled the transfer of %s"
-msgstr "%d đã thôi truyền %s"
+msgstr "%d đã thôi tiến trình truyền %s"
 
 #, c-format
 msgid "<b>Group Title:</b> %s<br>"
@@ -9014,9 +8871,8 @@
 msgid "Disconnected by server"
 msgstr "Bị máy phục vụ ngắt kết nối"
 
-#, fuzzy
 msgid "Error connecting to SILC Server"
-msgstr "Gặp lỗi trong khi kết nối tới máy phục vụ SILC"
+msgstr "Gặp lỗi khi kết nối tới máy phục vụ SILC"
 
 msgid "Key Exchange failed"
 msgstr "Trao đổi mã khoá thất bại"
@@ -9030,27 +8886,25 @@
 msgid "Performing key exchange"
 msgstr "Đang thực hiện trao đổi mã khoá"
 
-#, fuzzy
 msgid "Unable to load SILC key pair"
-msgstr "Không thể nạp cặp khoá SILC"
+msgstr "Không thể nạp được cặp khoá SILC"
 
 #. Progress
 msgid "Connecting to SILC Server"
 msgstr "Đang kết nối tới máy phục vụ SILC"
 
 msgid "Out of memory"
-msgstr "Tràn bộ nhớ"
-
-#, fuzzy
+msgstr "Không đủ bộ nhớ"
+
 msgid "Unable to initialize SILC protocol"
-msgstr "Không thể khởi tạo giao thức SILC"
+msgstr "Không thể khởi tạo được giao thức SILC"
 
 msgid "Error loading SILC key pair"
 msgstr "Lỗi nạp cặp khoá SILC"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Download %s: %s"
-msgstr "Người dùng trên %s: %s"
+msgstr "Tải về %s: %s"
 
 msgid "Your Current Mood"
 msgstr "Tâm trạng hiện thời của bạn"
@@ -9348,9 +9202,8 @@
 msgid "Creating SILC key pair..."
 msgstr "Đang tạo cặp khoá SILC..."
 
-#, fuzzy
 msgid "Unable to create SILC key pair"
-msgstr "Không thể tạo cặp khoá SILC\n"
+msgstr "Không thể tạo cặp khoá SILC"
 
 #. Hint for translators: Please check the tabulator width here and in
 #. the next strings (short strings: 2 tabs, longer strings 1 tab,
@@ -9488,34 +9341,30 @@
 msgid "Failure: Authentication failed"
 msgstr "Thất bại: Không xác thực được"
 
-#, fuzzy
 msgid "Unable to initialize SILC Client connection"
-msgstr "Không thể khởi tạo kết nối Khách SILC"
+msgstr "Không thể khởi tạo được kết nối Khách SILC"
 
 msgid "John Noname"
-msgstr "Tham gia Không_tên"
-
-#, fuzzy, c-format
+msgstr "Nguyễn Văn Không_tên"
+
+#, c-format
 msgid "Unable to load SILC key pair: %s"
-msgstr "Không thể nạp cặp khoá SILC: %s"
+msgstr "Không thể nạp được cặp khoá SILC: %s"
 
 msgid "Unable to create connection"
 msgstr "Không thể tạo kết nối"
 
-#, fuzzy
 msgid "Unknown server response"
-msgstr "Không rõ đáp ứng từ máy phục vụ"
-
-#, fuzzy
+msgstr "Không nhận ra đáp ứng máy phục vụ"
+
 msgid "Unable to create listen socket"
-msgstr "Không thể tạo ổ cắm"
+msgstr "Không thể tạo ổ cắm lắng nghe"
 
 msgid "SIP usernames may not contain whitespaces or @ symbols"
 msgstr "Tên người dùng SIP không được chứa dấu cách hay ký hiệu @"
 
-#, fuzzy
 msgid "SIP connect server not specified"
-msgstr "Cổng máy phục vụ"
+msgstr "Chưa ghi rõ máy phục vụ kết nối SIP"
 
 #. *< type
 #. *< ui_requirement
@@ -9559,9 +9408,8 @@
 msgid "doodle: Request user to start a Doodle session"
 msgstr "doodle: Yêu cầu người dùng bắt đầu vẽ hình"
 
-#, fuzzy
 msgid "Yahoo ID..."
-msgstr "ID Yahoo"
+msgstr "Yahoo ID..."
 
 #. *< type
 #. *< ui_requirement
@@ -9573,9 +9421,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#, fuzzy
 msgid "Yahoo! Protocol Plugin"
-msgstr "Phần bổ sung giao thức Yahoo"
+msgstr "Phần bổ sung giao thức Yahoo!"
 
 msgid "Pager server"
 msgstr "Máy phục vụ nhắn tin"
@@ -9596,7 +9443,7 @@
 msgstr "Lời đi các lời mời vào hội thảo hay phòng chát"
 
 msgid "Use account proxy for SSL connections"
-msgstr ""
+msgstr "Dùng ủy nhiệm tài khoản cho kết nối SSL"
 
 msgid "Chat room list URL"
 msgstr "URL đến danh sách phòng chát"
@@ -9607,9 +9454,8 @@
 msgid "Yahoo Chat port"
 msgstr "Cổng chát Yahoo"
 
-#, fuzzy
 msgid "Yahoo JAPAN ID..."
-msgstr "ID Yahoo"
+msgstr "ID Yahoo NHẬT BẢN..."
 
 #. *< type
 #. *< ui_requirement
@@ -9621,16 +9467,15 @@
 #. *< version
 #. *  summary
 #. *  description
-#, fuzzy
 msgid "Yahoo! JAPAN Protocol Plugin"
-msgstr "Phần bổ sung giao thức Yahoo"
+msgstr "Phần bổ sung giao thức Yahoo NHẬT BẢN"
 
 #, c-format
 msgid "%s has sent you a webcam invite, which is not yet supported."
 msgstr "%s mời bạn xem máy ảnh Web, mà chưa được hỗ trợ."
 
 msgid "Your SMS was not delivered"
-msgstr ""
+msgstr "SMS của bạn đã không được phát"
 
 msgid "Your Yahoo! message did not get sent."
 msgstr "Tin nhẳn Yahoo! của bạn đã không được gửi."
@@ -9657,32 +9502,28 @@
 msgstr "Thêm bạn chát bị từ chối"
 
 #. Some error in the received stream
-#, fuzzy
 msgid "Received invalid data"
-msgstr "Nhận dữ liệu không hợp lệ khi kết nối tới máy phục vụ."
+msgstr "Nhận được dữ liệu không hợp lệ"
 
 #. security lock from too many failed login attempts
-#, fuzzy
 msgid ""
 "Account locked: Too many failed login attempts.  Logging into the Yahoo! "
 "website may fix this."
 msgstr ""
-"Mã lỗi không rõ %d. Đăng nhập vào địa chỉ Web của Yahoo có thể giúp khắc "
-"phục."
+"Tài khoản bị khoá: quá nhiều lần đăng nhập không thành công. Đăng nhập vào "
+"địa chỉ Web của Yahoo có thể giúp khắc phục."
 
 #. indicates a lock of some description
-#, fuzzy
 msgid ""
 "Account locked: Unknown reason.  Logging into the Yahoo! website may fix "
 "this."
 msgstr ""
-"Mã lỗi không rõ %d. Đăng nhập vào địa chỉ Web của Yahoo có thể giúp khắc "
-"phục."
+"Tài khoản bị khoá: không biết sao. Đăng nhập vào địa chỉ Web của Yahoo có "
+"thể giúp khắc phục."
 
 #. username or password missing
-#, fuzzy
 msgid "Username or password missing"
-msgstr "Tên người dùng hoặc mật khẩu sai"
+msgstr "Còn thiếu tên người dùng hay mật khẩu"
 
 #, c-format
 msgid ""
@@ -9707,63 +9548,57 @@
 msgid "Ignore buddy?"
 msgstr "Lờ bỏ bạn chát?"
 
-#, fuzzy
 msgid "Invalid username or password"
-msgstr "Tên người dùng hoặc mật khẩu sai"
-
-#, fuzzy
+msgstr "Sai gõ tên người dùng hay mật khẩu"
+
 msgid ""
 "Your account has been locked due to too many failed login attempts.  Please "
 "try logging into the Yahoo! website."
 msgstr ""
-"Mã lỗi không rõ %d. Đăng nhập vào địa chỉ Web của Yahoo có thể giúp khắc "
-"phục."
+"Tài khoản của bạn bị khoá do quá nhiều lần đăng nhập không thành công. Đăng "
+"nhập vào địa chỉ Web của Yahoo có thể giúp khắc phục."
 
 #, c-format
 msgid "Unknown error 52.  Reconnecting should fix this."
-msgstr ""
+msgstr "Gặp lỗi không rõ 52. Tái kết nối nên giúp khắc phục."
 
 msgid ""
 "Error 1013: The username you have entered is invalid.  The most common cause "
 "of this error is entering your email address instead of your Yahoo! ID."
 msgstr ""
+"Lỗi 1013: bạn đã gõ một tên người dùng không hợp lệ. Nguyên nhân thường gặp "
+"nhất của lỗi này là gõ địa chỉ thư điện tử thay cho ID Yahoo."
 
 #, c-format
 msgid "Unknown error number %d. Logging into the Yahoo! website may fix this."
 msgstr ""
-"Mã lỗi không rõ %d. Đăng nhập vào địa chỉ Web của Yahoo có thể giúp khắc "
+"Gặp lỗi không rõ số %d. Đăng nhập vào địa chỉ Web của Yahoo có thể giúp khắc "
 "phục."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to add buddy %s to group %s to the server list on account %s."
 msgstr ""
-"Không thể thêm bạn chát %s vào nhóm %s trong danh sach máy phục vụ của tài "
+"Không thể thêm bạn chát %s vào nhóm %s trong danh sach máy phục vụ trên tài "
 "khoản %s."
 
-#, fuzzy
 msgid "Unable to add buddy to server list"
-msgstr "Không thể thêm bạn chát vào danh sách máy phục vụ"
+msgstr "Không thể thêm bạn chát vào danh sách các máy phục vụ"
 
 # Audible là nhà cung cấp thông tin bằng âm thanh: tên, đừng dịch.
 #, c-format
 msgid "[ Audible %s/%s/%s.swf ] %s"
 msgstr "[ Audible %s/%s/%s.swf ] %s"
 
-#, fuzzy
 msgid "Received unexpected HTTP response from server"
-msgstr "Nhận được đáp ứng HTTP bất thường từ máy phục vụ."
-
-#, fuzzy, c-format
+msgstr "Nhận được đáp ứng HTTP bất thường từ máy phục vụ"
+
+#, c-format
 msgid "Lost connection with %s: %s"
-msgstr ""
-"Mất kết nối với %s:\n"
-"%s"
-
-#, fuzzy, c-format
+msgstr "Mất kết nối với %s: %s"
+
+#, c-format
 msgid "Unable to establish a connection with %s: %s"
-msgstr ""
-"Không thể thiết lập kết nối đến máy phục vụ :\n"
-"%s"
+msgstr "Không thể thiết lập kết nối với %s: %s"
 
 msgid "Not at Home"
 msgstr "Không có ở nhà"
@@ -9811,10 +9646,10 @@
 msgstr "Bắt đầu vẽ"
 
 msgid "Select the ID you want to activate"
-msgstr ""
+msgstr "Hãy chọn ID cần kích hoạt"
 
 msgid "Join whom in chat?"
-msgstr "Tham gia với ai trong chat?"
+msgstr "Tham gia với ai trong chát?"
 
 msgid "Activate ID..."
 msgstr "Kích hoạt ID..."
@@ -9825,6 +9660,15 @@
 msgid "Open Inbox"
 msgstr "Mở hộp thư đến"
 
+msgid "Can't send SMS. Unable to obtain mobile carrier."
+msgstr "Không thể gửi SMS. Không thể lấy mạng truyền sóng di động."
+
+msgid "Can't send SMS. Unknown mobile carrier."
+msgstr "Không thể gửi SMS. Không nhận ra mạng truyền sóng di động."
+
+msgid "Getting mobile carrier to send the SMS."
+msgstr "Đang lấy mạng truyền sóng di động để gửi SMS."
+
 #. Write a local message to this conversation showing that a request for a
 #. * Doodle session has been made
 #.
@@ -9887,12 +9731,9 @@
 msgid "Last Update"
 msgstr "Cập nhật lần cuối"
 
-#, fuzzy
 msgid ""
 "This profile is in a language or format that is not supported at this time."
-msgstr ""
-"Tiếc là hình như lý lịch này được viết bằng ngôn ngữ hay định dạng chưa được "
-"hỗ trợ."
+msgstr "Hồ sơ này được viết bằng ngôn ngữ hay định dạng chưa được hỗ trợ."
 
 msgid ""
 "Could not retrieve the user's profile. This most likely is a temporary "
@@ -9913,16 +9754,16 @@
 msgid "The user's profile is empty."
 msgstr "Lý lịch người dùng này trống."
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s has declined to join."
-msgstr "%s đã đăng nhập."
+msgstr "%s đã khước từ lời mời tham gia."
 
 msgid "Failed to join chat"
 msgstr "Không tham gia chát được"
 
 #. -6
 msgid "Unknown room"
-msgstr "Lỗi không rõ"
+msgstr "Phòng không được nhận ra"
 
 #. -15
 msgid "Maybe the room is full"
@@ -9967,9 +9808,8 @@
 msgid "User Rooms"
 msgstr "Phòng người dùng"
 
-#, fuzzy
 msgid "Connection problem with the YCHT server"
-msgstr "Kết nối có vấn đề với máy phục vụ YCHT."
+msgstr "Có vấn đề kết nối với máy phục vụ YCHT"
 
 msgid ""
 "(There was an error converting this message.\t Check the 'Encoding' option "
@@ -10097,19 +9937,19 @@
 msgid "Exposure"
 msgstr "Phơi sáng"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to parse response from HTTP proxy: %s"
-msgstr "Không thể phân tích đáp ứng từ ủy nhiệm HTTP: %s\n"
+msgstr "Không thể phân tích cú pháp của đáp ứng từ ủy nhiệm HTTP: %s"
 
 #, c-format
 msgid "HTTP proxy connection error %d"
 msgstr "Lỗi kết nối ủy nhiệm HTTP %d"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Access denied: HTTP proxy server forbids port %d tunneling"
 msgstr ""
 "Truy cập bị từ chối: máy phục vụ ủy nhiệm HTTP cấm đào đường hầm xuyên qua "
-"cổng %d."
+"cổng %d"
 
 #, c-format
 msgid "Error resolving %s"
@@ -10286,9 +10126,9 @@
 msgid "Unable to connect to %s"
 msgstr "Không thể kết nối tới %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Error reading from %s: response too long (%d bytes limit)"
-msgstr "Lỗi đọc từ %s: %s"
+msgstr "Gặp lỗi khi đọc từ %s: đáp ứng quá dài (giới hạn %d byte)"
 
 #, c-format
 msgid ""
@@ -10339,15 +10179,15 @@
 msgstr "Kết nối bị từ chối."
 
 #. 10048
-#, fuzzy, c-format
+#, c-format
 msgid "Address already in use."
-msgstr "Tên chát này đang được dùng"
+msgstr "Địa chỉ vẫn còn được dùng."
 
 #, c-format
 msgid "Error Reading %s"
 msgstr "Lỗi đọc %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "An error was encountered reading your %s.  The file has not been loaded, and "
 "the old file has been renamed to %s~."
@@ -10397,9 +10237,8 @@
 msgid "Use this buddy _icon for this account:"
 msgstr "Dùng biểu tượng bạn chát cho tài khoản này:"
 
-#, fuzzy
 msgid "Ad_vanced"
-msgstr "Cấp c_ao"
+msgstr "Cấp ca_o"
 
 msgid "Use GNOME Proxy Settings"
 msgstr "Dùng thiết lập ủy nhiệm GNOME"
@@ -10461,9 +10300,8 @@
 msgid "Create _this new account on the server"
 msgstr "_Tạo tài khoản mới này trên máy phục vụ"
 
-#, fuzzy
 msgid "P_roxy"
-msgstr "Ủy nhiệm"
+msgstr "Ủ_y nhiệm"
 
 msgid "Enabled"
 msgstr "Đã bật"
@@ -10471,7 +10309,7 @@
 msgid "Protocol"
 msgstr "Giao thức"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "<span size='larger' weight='bold'>Welcome to %s!</span>\n"
 "\n"
@@ -10486,148 +10324,136 @@
 "<span size='larger' weight='bold'>Chào mừng đến %s!</span>\n"
 "\n"
 "Bạn chưa cấu hình tài khoản tin nhắn. Để bắt đầu kết nối với %s, bấm cái nút "
-"<b>Thêm</b> bên dưới và cấu hình tài khoản thứ nhất của bạn. Muốn %s kết nối "
-"đến nhiều tài khoản thì bấm <b>Thêm</b> lần nữa để cấu hình mỗi điều.\n"
-"\n"
-"Bạn vẫn có thể trở về cửa sổ này để thêm, chỉnh sửa hay gỡ bỏ tài khoản, "
-"bằng cách chọn mục <b>Tài khoản > Thêm/Sửa</b> trong cửa sổ Danh sách bạn bè."
+"<b>Thêm...</b> bên dưới và cấu hình tài khoản đầu tiên của mình. Muốn %s kết "
+"nối đến nhiều tài khoản tin nhắn thì bấm nút <b>Thêm...</b> lần nữa để cấu "
+"hình cả.\n"
+"\n"
+"Bạn vẫn có thể trở về cửa sổ này để thêm, chỉnh sửa hay gỡ bỏ tài khoản, sử "
+"dụng mục <b>Tài khoản > Quản lý Tài khoản</b> trong cửa sổ Danh sách Bạn chát"
 
 #. Buddy List
 msgid "Background Color"
 msgstr "Màu nền"
 
-#, fuzzy
 msgid "The background color for the buddy list"
-msgstr "Nhóm này đã được thêm vào danh sách bạn bè của bạn"
-
-#, fuzzy
+msgstr "Màu nền của danh sách bạn chát"
+
 msgid "Layout"
-msgstr "Tiếng Lào"
+msgstr "Bố trí"
 
 msgid "The layout of icons, name, and status of the buddy list"
-msgstr ""
+msgstr "Cách sắp đặt các biểu tượng; tên và trạng thái của danh sách bạn chát"
 
 #. Group
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list group when in its expanded state
-#, fuzzy
 msgid "Expanded Background Color"
-msgstr "Màu nền"
+msgstr "Màu nền giãn ra"
 
 msgid "The background color of an expanded group"
-msgstr ""
+msgstr "Màu nền của một nhóm đã giãn ra"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list group when in its expanded state
-#, fuzzy
 msgid "Expanded Text"
-msgstr "Giãn _ra"
+msgstr "Chú giải giãn ra"
 
 msgid "The text information for when a group is expanded"
-msgstr ""
+msgstr "Chú giải khi một nhóm được giãn ra"
 
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list group when in its collapsed state
-#, fuzzy
 msgid "Collapsed Background Color"
-msgstr "Chọn màu nền"
+msgstr "Màu nền co lại"
 
 msgid "The background color of a collapsed group"
-msgstr ""
+msgstr "Màu nền của một nhóm đa co lại"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list group when in its collapsed state
-#, fuzzy
 msgid "Collapsed Text"
-msgstr "_Co lại"
+msgstr "Chú giải co lại"
 
 msgid "The text information for when a group is collapsed"
-msgstr ""
+msgstr "Chú giải khi một nhóm được co lại"
 
 #. Buddy
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list contact or chat room
-#, fuzzy
 msgid "Contact/Chat Background Color"
-msgstr "Chọn màu nền"
+msgstr "Màu nền Liên lạc / Chát"
 
 msgid "The background color of a contact or chat"
-msgstr ""
+msgstr "Màu nền của một liên lạc hay cuộc trò chuyện"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list contact when in its expanded state
-#, fuzzy
 msgid "Contact Text"
-msgstr "Lối tắt"
+msgstr "Chú giải Liên lạc"
 
 msgid "The text information for when a contact is expanded"
-msgstr ""
+msgstr "Chú giải khi một liên lạc được giãn ra"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is online
-#, fuzzy
 msgid "Online Text"
-msgstr "Trực tuyến"
+msgstr "Chú giải Trực tuyến"
 
 msgid "The text information for when a buddy is online"
-msgstr ""
+msgstr "Chú giải khi một bạn chát có kết nối hoạt động"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is away
-#, fuzzy
 msgid "Away Text"
-msgstr "Vắng mặt"
+msgstr "Chú giải Vắng mặt"
 
 msgid "The text information for when a buddy is away"
-msgstr ""
+msgstr "Chú giải khi một bạn chát có vắng mặt"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is offline
-#, fuzzy
 msgid "Offline Text"
-msgstr "Ngoại tuyến"
-
-#, fuzzy
+msgstr "Chú giải Ngoại tuyến"
+
 msgid "The text information for when a buddy is offline"
-msgstr "Đổi thông tin người dùng cho %s"
+msgstr "Chú giải khi một bạn chát không có kết nối hoạt động"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is idle
-#, fuzzy
 msgid "Idle Text"
-msgstr "Kiểm tra tâm trạng"
+msgstr "Chú giải Nghỉ"
 
 msgid "The text information for when a buddy is idle"
-msgstr ""
+msgstr "Chú giải khi một bạn chát đang nghỉ"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when they have sent you a new message
-#, fuzzy
 msgid "Message Text"
-msgstr "Gửi tin nhẳn"
+msgstr "Chú giải Tin nhẳn"
 
 msgid "The text information for when a buddy has an unread message"
-msgstr ""
+msgstr "Chú giải khi một bạn chát có tin nhẳn chưa đọc"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when they have sent you a new message
 msgid "Message (Nick Said) Text"
-msgstr ""
+msgstr "Chú giải Tin nhẳn (Nói tên hiệu)"
 
 msgid ""
 "The text information for when a chat has an unread message that mentions "
 "your nickname"
 msgstr ""
-
-#, fuzzy
+"Chú giải khi một cuộc trò chuyện chứa một tin nhẳn chưa đọc mà nói tên hiệu "
+"của bạn"
+
 msgid "The text information for a buddy's status"
-msgstr "Đổi thông tin người dùng cho %s"
+msgstr "Chú giải về trạng thái của bạn chát"
 
 #, c-format
 msgid "You have %d contact named %s. Would you like to merge them?"
 msgid_plural ""
 "You currently have %d contacts named %s. Would you like to merge them?"
-msgstr[0] "Bạn có %d liên lạc tên %s. Muốn trộn với nhau không?"
+msgstr[0] "Bạn có %d liên lạc tên %s. Muốn gộp lại không?"
 
 msgid ""
 "Merging these contacts will cause them to share a single entry on the buddy "
@@ -10641,9 +10467,8 @@
 msgid "Please update the necessary fields."
 msgstr "Hãy cập nhật các trường cần thiết."
 
-#, fuzzy
 msgid "A_ccount"
-msgstr "Tài khoản"
+msgstr "Tài kh_oản"
 
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
@@ -10668,16 +10493,14 @@
 msgid "I_M"
 msgstr "_Tin nhắn"
 
-#, fuzzy
 msgid "_Audio Call"
-msgstr "Thê_m chát"
+msgstr "Gọi th_oại"
 
 msgid "Audio/_Video Call"
-msgstr ""
-
-#, fuzzy
+msgstr "Gọi thoại/_phim"
+
 msgid "_Video Call"
-msgstr "Trò chuyện ảnh động"
+msgstr "Gọi _phim"
 
 msgid "_Send File..."
 msgstr "_Gửi tập tin..."
@@ -10688,11 +10511,9 @@
 msgid "View _Log"
 msgstr "_Xem bản ghi"
 
-#, fuzzy
 msgid "Hide When Offline"
 msgstr "Ẩn khi ngoại tuyến"
 
-#, fuzzy
 msgid "Show When Offline"
 msgstr "Hiện khi ngoại tuyến"
 
@@ -10820,18 +10641,17 @@
 msgid "/Tools/_Certificates"
 msgstr "/Công cụ/_Chứng nhận"
 
-#, fuzzy
 msgid "/Tools/Custom Smile_ys"
-msgstr "/Công cụ/Hình cườ_i"
+msgstr "/Công cụ/Hình cười _riêng"
 
 msgid "/Tools/Plu_gins"
-msgstr "/Công cụ/_Phần bổ sung"
+msgstr "/Công cụ/Phần bổ sun_g"
 
 msgid "/Tools/Pr_eferences"
 msgstr "/Công cụ/Tù_y chỉnh"
 
 msgid "/Tools/Pr_ivacy"
-msgstr "/Công cụ/_Riêng tư"
+msgstr "/Công cụ/R_iêng tư"
 
 msgid "/Tools/_File Transfers"
 msgstr "/Công cụ/_Truyền tập tin"
@@ -10950,11 +10770,11 @@
 msgstr "Theo trạng thái"
 
 msgid "By recent log activity"
-msgstr ""
+msgstr "Theo hoạt động vừa ghi lưu"
 
 #, c-format
 msgid "%s disconnected"
-msgstr "%s đã ngắt kết nối."
+msgstr "%s bị ngắt kết nối"
 
 #, c-format
 msgid "%s disabled"
@@ -10967,7 +10787,7 @@
 msgstr "Bật lại"
 
 msgid "SSL FAQs"
-msgstr ""
+msgstr "Hỏi Đáp SSL"
 
 msgid "Welcome back!"
 msgstr "Chào mừng lại !"
@@ -10976,7 +10796,7 @@
 msgid "%d account was disabled because you signed on from another location:"
 msgid_plural ""
 "%d accounts were disabled because you signed on from another location:"
-msgstr[0] "%d tài khoản đã bị tắt vì bạn cũng đăng nhập từ chỗ khác."
+msgstr[0] "%d tài khoản đã bị tắt vì bạn cũng đăng nhập từ địa chỉ khác:"
 
 msgid "<b>Username:</b>"
 msgstr "<b>Tên người dùng:</b>"
@@ -11058,13 +10878,11 @@
 msgid "_Group:"
 msgstr "_Nhóm:"
 
-#, fuzzy
 msgid "Auto_join when account connects."
 msgstr "Tự động tham _gia một khi tài khoản kết nối."
 
-#, fuzzy
 msgid "_Remain in chat after window is closed."
-msgstr "Ẩn c_hát khi cửa sổ bị đóng."
+msgstr "Còn lại t_rong chát sau khi cửa sổ bị đóng."
 
 msgid "Please enter the name of the group to be added."
 msgstr "Hãy nhập tên của nhóm cần thêm vào."
@@ -11093,9 +10911,8 @@
 msgid "/Buddies/Sort Buddies"
 msgstr "/Bạn chát/Sắp xếp bạn chát"
 
-#, fuzzy
 msgid "Type the host name for this certificate."
-msgstr "Gõ tên máy cho đó có chứng nhận này."
+msgstr "Gõ tên máy cho chứng nhận này."
 
 #. Widget creation function
 msgid "SSL Servers"
@@ -11144,9 +10961,8 @@
 msgid "Get Away Message"
 msgstr "Lấy thông điệp vắng mặt"
 
-#, fuzzy
 msgid "Last Said"
-msgstr "Nói lần cuối"
+msgstr "Nói cuối"
 
 msgid "Unable to save icon file to disk."
 msgstr "Không thể lưu tập tin biểu tượng vào đĩa."
@@ -11179,9 +10995,8 @@
 msgid "/Conversation/New Instant _Message..."
 msgstr "/Cuộc thoại/Tin nhắn _mới..."
 
-#, fuzzy
 msgid "/Conversation/Join a _Chat..."
-msgstr "/Cuộc thoại/Mờ_i..."
+msgstr "/Cuộc thoại/Tham gia _chát..."
 
 msgid "/Conversation/_Find..."
 msgstr "/Cuộc thoại/_Tìm..."
@@ -11195,24 +11010,20 @@
 msgid "/Conversation/Clea_r Scrollback"
 msgstr "/Cuộc thoại/Gột _vùng cuộn ngược"
 
-#, fuzzy
 msgid "/Conversation/M_edia"
-msgstr "/Cuộc thoại/Nữ_a"
-
-#, fuzzy
+msgstr "/Cuộc thoại/_Phương tiện"
+
 msgid "/Conversation/Media/_Audio Call"
-msgstr "/Cuộc thoại/Nữ_a"
-
-#, fuzzy
+msgstr "/Cuộc thoại/Phương tiện/Gọi th_oại"
+
 msgid "/Conversation/Media/_Video Call"
-msgstr "/Cuộc thoại/Nữ_a"
-
-#, fuzzy
+msgstr "/Cuộc thoại/Phương tiện/Gọi _phim"
+
 msgid "/Conversation/Media/Audio\\/Video _Call"
-msgstr "/Cuộc thoại/_Xem bản ghi"
+msgstr "/Cuộc thoại/Phương tiện/Gọi thoại\\/_phim"
 
 msgid "/Conversation/Se_nd File..."
-msgstr "/Cuộc thoại/_Gửi tập tin..."
+msgstr "/Cuộc thoại/Gửi tập ti_n..."
 
 msgid "/Conversation/Add Buddy _Pounce..."
 msgstr "/Cuộc thoại/Thêm thông bá_o bạn chát..."
@@ -11283,17 +11094,14 @@
 msgid "/Conversation/View Log"
 msgstr "/Cuộc thoại/Xem bản ghi"
 
-#, fuzzy
 msgid "/Conversation/Media/Audio Call"
-msgstr "/Cuộc thoại/_Nữa"
-
-#, fuzzy
+msgstr "/Cuộc thoại/Phương tiện/Gọi thoại"
+
 msgid "/Conversation/Media/Video Call"
-msgstr "/Cuộc thoại/Xem bản ghi"
-
-#, fuzzy
+msgstr "/Cuộc thoại/Phương tiện/Gọi phim"
+
 msgid "/Conversation/Media/Audio\\/Video Call"
-msgstr "/Cuộc thoại/_Nữa"
+msgstr "/Cuộc thoại/Phương tiện/Gọi thoại\\/phim"
 
 msgid "/Conversation/Send File..."
 msgstr "/Cuộc thoại/Gửi tập tin..."
@@ -11467,25 +11275,23 @@
 msgstr "Lỗi nghiêm trọng"
 
 msgid "bug master"
-msgstr ""
-
-#, fuzzy
+msgstr "chủ lỗi"
+
 msgid "artist"
-msgstr "Nghệ sĩ"
+msgstr "nghệ sĩ"
 
 #. feel free to not translate this
 msgid "Ka-Hing Cheung"
-msgstr ""
+msgstr "Ka-Hing Cheung"
 
 msgid "voice and video"
-msgstr ""
+msgstr "thoại và phim"
 
 msgid "support"
 msgstr "hỗ trợ"
 
-#, fuzzy
 msgid "webmaster"
-msgstr "nhà phát triển và chủ Web"
+msgstr "chủ Web"
 
 msgid "Senior Contributor/QA"
 msgstr "Người đóng góp cấp cao/ tin chắc chất lượng"
@@ -11507,7 +11313,7 @@
 msgstr "hỗ trợ / tin chắc chất lượng"
 
 msgid "XMPP"
-msgstr ""
+msgstr "XMPP"
 
 msgid "original author"
 msgstr "tác giả đầu tiên"
@@ -11573,7 +11379,7 @@
 msgstr "Tiếng E-x-tô-ni"
 
 msgid "Basque"
-msgstr ""
+msgstr "Tiếng Ba-x-quợ"
 
 msgid "Persian"
 msgstr "Tiếng Ba Tư"
@@ -11584,9 +11390,8 @@
 msgid "French"
 msgstr "Tiếng Pháp"
 
-#, fuzzy
 msgid "Irish"
-msgstr "Tiếng Kuổ-đít"
+msgstr "Tiếng Ai-len"
 
 msgid "Galician"
 msgstr "Tiếng Ga-li-xi"
@@ -11606,9 +11411,8 @@
 msgid "Hungarian"
 msgstr "Tiếng Hung-ga-ri"
 
-#, fuzzy
 msgid "Armenian"
-msgstr "Tiếng Ru-ma-ni"
+msgstr "Tiếng Ác-mê-ni"
 
 msgid "Indonesian"
 msgstr "Tiếng Nam Dương"
@@ -11625,9 +11429,8 @@
 msgid "Ubuntu Georgian Translators"
 msgstr "Nhóm Dịch Giả Gi-oa-gi-a Ubuntu"
 
-#, fuzzy
 msgid "Khmer"
-msgstr "Khác"
+msgstr "Tiếng Khơ-me"
 
 msgid "Kannada"
 msgstr "Tiếng Kan-na-đa"
@@ -11636,7 +11439,7 @@
 msgstr "Nhóm Dịch Kan-na-đa"
 
 msgid "Korean"
-msgstr "Tiếng Hàn"
+msgstr "Tiếng Triều Tiên"
 
 msgid "Kurdish"
 msgstr "Tiếng Kuổ-đít"
@@ -11650,9 +11453,8 @@
 msgid "Macedonian"
 msgstr "Tiếng Ma-xê-đô-ni"
 
-#, fuzzy
 msgid "Mongolian"
-msgstr "Tiếng Ma-xê-đô-ni"
+msgstr "Tiếng Mông Cổ"
 
 msgid "Bokmål Norwegian"
 msgstr "Tiếng Na-uy (Bóc-măn)"
@@ -11709,7 +11511,7 @@
 msgstr "Tiếng Thụy Điển"
 
 msgid "Swahili"
-msgstr ""
+msgstr "Tiếng Xouă-hi-li"
 
 msgid "Tamil"
 msgstr "Tiếng Ta-min"
@@ -11775,6 +11577,8 @@
 "<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/FAQ"
 "\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>"
 msgstr ""
+"<FONT SIZE=\"4\">Hỏi Đáp:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/"
+"FAQ\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>"
 
 #, c-format
 msgid ""
@@ -11785,15 +11589,25 @@
 "primary language is <b>English</b>.  You are welcome to post in another "
 "language, but the responses may be less helpful.<br/><br/>"
 msgstr ""
-
-#, fuzzy, c-format
+"<font size=\"4\">Sự giúp đỡ từ các người dùng Pidgin khác:</font> <a href="
+"\"mailto:support@pidgin.im\">support@pidgin.im</a><br/>Đây là một hộp thư "
+"chung loại <b>công cộng</b> ! (<a href=\"http://pidgin.im/pipermail/support/"
+"\">kho thư</a>)<br/>Tiếc là chúng tôi không thể giúp về giao thức hay phần "
+"bổ sung loại nhóm ba, chỉ với chương trình Pidgin chính nó.<br/>Ngôn ngữ "
+"chính của hộp thư chung nàu là  <b>tiếng Anh</b>.  Bạn cũng có thể gửi thư "
+"bằng một ngôn ngữ khác, nhưng mà đáp ứng có thể không có ích. (Dịch giả: để "
+"hỏi câu về phần mềm nguồn mở bằng tiếng Việt, hãy tham gia <a href=\"http://"
+"forum.vnoss.org/\">Diễn đàn VNOSS</a> hay <a href=\"http://lists.hanoilug."
+"org/listinfo\">hộp thư chung Hà Nội LUG</a>.)<br/><br/>"
+
+#, c-format
 msgid ""
 "<FONT SIZE=\"4\">IRC Channel:</FONT> #pidgin on irc.freenode.net<BR><BR>"
-msgstr "<FONT SIZE=\"3\">IRC:</FONT> #pidgin trên irc.freenode.net<BR><BR>"
-
-#, fuzzy, c-format
+msgstr "<FONT SIZE=\"4\">Kênh IRC:</FONT> #pidgin on irc.freenode.net<BR><BR>"
+
+#, c-format
 msgid "<FONT SIZE=\"4\">XMPP MUC:</FONT> devel@conference.pidgin.im<BR><BR>"
-msgstr "<FONT SIZE=\"3\">IRC:</FONT> #pidgin trên irc.freenode.net<BR><BR>"
+msgstr "<FONT SIZE=\"4\">XMPP MUC:</FONT> devel@conference.pidgin.im<BR><BR>"
 
 msgid "Current Developers"
 msgstr "Nhà phát triển hiện thời"
@@ -12027,19 +11841,17 @@
 msgid "Color to draw hyperlinks."
 msgstr "Màu để vẽ siêu liên kết."
 
-#, fuzzy
 msgid "Hyperlink visited color"
-msgstr "Màu siêu liên kết"
-
-#, fuzzy
+msgstr "Màu siêu liên kết đã thăm"
+
 msgid "Color to draw hyperlink after it has been visited (or activated)."
-msgstr "Màu siêu liên kết nổi bật khi rê chuột qua"
+msgstr "Màu siêu liên kết nổi bật sau khi nó được thăm (hay kích hoạt)."
 
 msgid "Hyperlink prelight color"
 msgstr "Màu siêu liên kết tô sáng"
 
 msgid "Color to draw hyperlinks when mouse is over them."
-msgstr "Màu siêu liên kết nổi bật khi rê chuột qua"
+msgstr "Màu siêu liên kết nổi bật khi rê chuột qua."
 
 msgid "Sent Message Name Color"
 msgstr "Màu tên tin nhẳn đã gửi"
@@ -12068,23 +11880,20 @@
 msgid "Action Message Name Color for Whispered Message"
 msgstr "Màu tên tin nhẳn hành động cho tin nhẳn thì thầm"
 
-#, fuzzy
 msgid "Color to draw the name of a whispered action message."
-msgstr "Màu để vẽ tên của tin nhẳn hành động."
+msgstr "Màu để vẽ tên của tin nhẳn hành động thì thầm."
 
 msgid "Whisper Message Name Color"
 msgstr "Màu tên tin nhẳn thì thầm"
 
-#, fuzzy
 msgid "Color to draw the name of a whispered message."
-msgstr "Màu để vẽ tên của tin nhẳn hành động."
+msgstr "Màu để vẽ tên của tin nhẳn thì thầm."
 
 msgid "Typing notification color"
 msgstr "Màu thông báo đang gõ"
 
-#, fuzzy
 msgid "The color to use for the typing notification"
-msgstr "Màu cần dùng cho phông chữ thông báo đang gõ"
+msgstr "Màu cần dùng cho thông báo đang gõ"
 
 msgid "Typing notification font"
 msgstr "Phông chữ thông báo đang gõ"
@@ -12340,45 +12149,50 @@
 "Usage: %s [OPTION]...\n"
 "\n"
 msgstr ""
+"Sử dụng: %s [TÙY_CHỌN]...\n"
+"\n"
 
 msgid "DIR"
-msgstr ""
+msgstr "THƯ_MỤC"
 
 msgid "use DIR for config files"
-msgstr ""
+msgstr "dùng thư mục này cho các tập tin cấu hình"
 
 msgid "print debugging messages to stdout"
-msgstr ""
+msgstr "in các thông điệp gỡ rối ra đầu ra tiêu chuẩn"
 
 msgid "force online, regardless of network status"
-msgstr ""
+msgstr "ép buộc trực tuyến, bất chấp trạng thái mạng"
 
 msgid "display this help and exit"
-msgstr ""
-
-#, fuzzy
+msgstr "hiển thị trợ giúp này, sau đó thoát"
+
 msgid "allow multiple instances"
-msgstr "Cho phép đăng ký nhiều lần đồng thời"
+msgstr "cho phép nhiều thể hiện đồng thời"
 
 msgid "don't automatically login"
-msgstr ""
+msgstr "không tự động đăng nhập"
 
 msgid "NAME"
-msgstr ""
+msgstr "TÊN"
 
 msgid ""
 "enable specified account(s) (optional argument NAME\n"
 "                      specifies account(s) to use, separated by commas.\n"
 "                      Without this only the first account will be enabled)."
 msgstr ""
+"hiệu lực mỗi tài khoản được đưa ra\n"
+"\t(Tùy chọn TÊN cũng có thể ghi rõ (những) tài khoản cần dùng,\n"
+"\tmỗi cặp tên định giới bằng dấu phẩy.\n"
+"\tKhông có tuỳ chọn này thì chỉ hiệu lực tài khoản đầu tiên.)"
 
 msgid "X display to use"
-msgstr ""
+msgstr "Màn hình X cần dùng"
 
 msgid "display the current version and exit"
-msgstr ""
-
-#, fuzzy, c-format
+msgstr "hiển thị phiên bản hiện thời, sau đó thoát"
+
+#, c-format
 msgid ""
 "%s %s has segfaulted and attempted to dump a core file.\n"
 "This is a bug in the software and has happened through\n"
@@ -12397,7 +12211,7 @@
 "Đây là một lỗi trong phần mềm, không phải do bạn.\n"
 "\n"
 "Nếu bạn có thể tạo lại trường hợp sụp đổ này,\n"
-"hãy thông báo nhà phát triển bằng cách báo cáo lỗi ở :\n"
+"hãy thông báo cho nhà phát triển bằng cách báo cáo lỗi ở :\n"
 "%ssimpleticket/\n"
 "\n"
 "Hãy kiểm tra xem bạn ghi rõ chính xác những hành động\n"
@@ -12405,11 +12219,6 @@
 "từ tập tin lõi. Không biết cách lấy vết lùi\n"
 "thì đọc những hướng dẫn ở :\n"
 "%swiki/GetABacktrace\n"
-"\n"
-"Cần thêm sự giúp đớ thì gửi tin nhắn cho hoặc SeanEgn\n"
-"hoặc LSchiere (qua mạng AIM). Thông tin liên lạc\n"
-"với hai nhà phát triển này qua giao thức khác nằm ở :\n"
-"%swiki/DeveloperPages\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
@@ -12418,24 +12227,24 @@
 
 #, c-format
 msgid "Exiting because another libpurple client is already running.\n"
-msgstr ""
+msgstr "Đang thoát do một ứng dụng khách libpurple đang chạy.\n"
 
 msgid "/_Media"
-msgstr ""
+msgstr "/_Phương tiện"
 
 msgid "/Media/_Hangup"
-msgstr ""
+msgstr "/Phương tiện/_Ngừng nói"
 
 #, c-format
 msgid "%s wishes to start an audio/video session with you."
-msgstr ""
+msgstr "%s muốn bắt đầu một buổi hợp thoại/phim với bạn."
 
 #, c-format
 msgid "%s wishes to start a video session with you."
-msgstr ""
+msgstr "%s muốn bắt đầu một buổi hợp phim với bạn."
 
 msgid "Incoming Call"
-msgstr ""
+msgstr "Gọi gửi đến"
 
 msgid "_Pause"
 msgstr "Tạm _dừng"
@@ -12466,9 +12275,8 @@
 msgstr ""
 "Đã chọn lệnh chạy trình duyệt « Bằng tay », nhưng không cung cấp lệnh nào."
 
-#, fuzzy
 msgid "No message"
-msgstr "Thông điệp không rõ"
+msgstr "Không có tin nhẳn"
 
 msgid "Open All Messages"
 msgstr "Mở mọi tin nhẳn"
@@ -12476,16 +12284,14 @@
 msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
 msgstr "<span weight=\"bold\" size=\"larger\">Có thư mới !</span>"
 
-#, fuzzy
 msgid "New Pounces"
-msgstr "Thông báo bạn thân mới"
+msgstr "Thông báo mới"
 
 msgid "Dismiss"
-msgstr ""
-
-#, fuzzy
+msgstr "Hủy"
+
 msgid "<span weight=\"bold\" size=\"larger\">You have pounced!</span>"
-msgstr "<span weight=\"bold\" size=\"larger\">Có thư mới !</span>"
+msgstr "<span weight=\"bold\" size=\"larger\">Có thông báo mới !</span>"
 
 msgid "The following plugins will be unloaded."
 msgstr "Những phần bổ sung theo đây sẽ được bỏ nạp."
@@ -12535,9 +12341,8 @@
 msgid "Select a file"
 msgstr "Chọn tập tin"
 
-#, fuzzy
 msgid "Modify Buddy Pounce"
-msgstr "Sửa thông báo bạn thân"
+msgstr "Sửa thông báo bạn chát"
 
 #. Create the "Pounce on Whom" frame.
 msgid "Pounce on Whom"
@@ -12612,61 +12417,73 @@
 msgid "Pounce Target"
 msgstr "Đích thông báo"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Started typing"
-msgstr "Bắt đầu gõ phím"
-
-#, fuzzy, c-format
+msgstr "Đã bắt đầu gõ phím"
+
+#, c-format
 msgid "Paused while typing"
-msgstr "Tạm dừng khi gõ phím"
-
-#, fuzzy, c-format
+msgstr "Đã tạm dừng khi gõ phím"
+
+#, c-format
 msgid "Signed on"
-msgstr "Đăng nhập"
-
-#, fuzzy, c-format
+msgstr "Đã đăng nhập"
+
+#, c-format
 msgid "Returned from being idle"
-msgstr "%s hoạt động trở lại từ trạng thái nghỉ (%s)"
-
-#, fuzzy, c-format
+msgstr "Đã trở lại từ trạng thái nghỉ"
+
+#, c-format
 msgid "Returned from being away"
-msgstr "Có mặt trở lại"
-
-#, fuzzy, c-format
+msgstr "Đã có mặt trở lại"
+
+#, c-format
 msgid "Stopped typing"
-msgstr "Dừng gõ phím"
-
-#, fuzzy, c-format
+msgstr "Đã dừng gõ phím"
+
+#, c-format
 msgid "Signed off"
-msgstr "Đăng xuất"
-
-#, fuzzy, c-format
+msgstr "Đã đăng xuất"
+
+#, c-format
 msgid "Became idle"
 msgstr "Đã rơi vào trạng thái nghỉ"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Went away"
-msgstr "Khi vắng mặt"
-
-#, fuzzy, c-format
+msgstr "Đã vắng mặt"
+
+#, c-format
 msgid "Sent a message"
-msgstr "Gửi tin nhẳn"
-
-#, fuzzy, c-format
+msgstr "Đã gửi tin nhẳn"
+
+#, c-format
 msgid "Unknown.... Please report this!"
-msgstr "Dữ kiện thông báo không rõ. Hãy ghi báo cáo việc này!"
-
-#, fuzzy
+msgstr "Không rõ... Hãy ghi báo cáo trường hợp này!"
+
+msgid "(Custom)"
+msgstr "(Tự chọn)"
+
+msgid "(Default)"
+msgstr "(Mặc định)"
+
+msgid "The default Pidgin sound theme"
+msgstr "Sắc thái âm thanh Pidgin mặc định"
+
+msgid "The default Pidgin buddy list theme"
+msgstr "Sắc thái danh sách bạn chát Pidgin mặc định"
+
+msgid "The default Pidgin status icon theme"
+msgstr "Sắc thái biểu tượng trạng thái Pidgin mặc định"
+
 msgid "Theme failed to unpack."
-msgstr "Sắc thái hình cười không giải nén được."
-
-#, fuzzy
+msgstr "Sắc thái không giải nén được."
+
 msgid "Theme failed to load."
-msgstr "Sắc thái hình cười không giải nén được."
-
-#, fuzzy
+msgstr "Sắc thái không nạp được."
+
 msgid "Theme failed to copy."
-msgstr "Sắc thái hình cười không giải nén được."
+msgstr "Sắc thái không sao chép được."
 
 msgid "Install Theme"
 msgstr "Cài đặt sắc thái"
@@ -12688,9 +12505,8 @@
 msgstr "Đóng cuộc th_oại dùng phím Esc"
 
 #. Buddy List Themes
-#, fuzzy
 msgid "Buddy List Theme"
-msgstr "Danh sách bạn bè"
+msgstr "Sắc thái Danh sách Bạn chát"
 
 #. System Tray
 msgid "System Tray Icon"
@@ -12702,9 +12518,8 @@
 msgid "On unread messages"
 msgstr "Khi có tin nhẳn chưa đọc"
 
-#, fuzzy
 msgid "Conversation Window"
-msgstr "Cửa sổ cuộc thoại Tin Nhắn"
+msgstr "Cửa sổ nói chuyện"
 
 msgid "_Hide new IM conversations:"
 msgstr "Ẩn cuộc t_hoại Tin Nhắn mới:"
@@ -12804,16 +12619,15 @@
 msgid "Cannot start browser configuration program."
 msgstr "Không thể khởi chạy chương trình cấu hình trình duyệt."
 
-#, fuzzy
 msgid "Disabled"
-msgstr "_Tắt"
-
-#, fuzzy, c-format
+msgstr "Bị tắt"
+
+#, c-format
 msgid "Use _automatically detected IP address: %s"
-msgstr "Tự động tìm r_a địa chỉ IP"
+msgstr "Dùng đị_a chỉ IP tự động phát hiện: %s"
 
 msgid "<span style=\"italic\">Example: stunserver.org</span>"
-msgstr "<span style=\"italic\">Thí dụ : stunserver.org</span>"
+msgstr "<span style=\"italic\">Ví dụ : stunserver.org</span>"
 
 msgid "Public _IP:"
 msgstr "_IP công:"
@@ -12835,11 +12649,10 @@
 
 #. TURN server
 msgid "Relay Server (TURN)"
-msgstr ""
-
-#, fuzzy
+msgstr "Máy phục vụ tiếp lại (TURN)"
+
 msgid "_TURN server:"
-msgstr "Máy phục vụ ST_UN:"
+msgstr "Máy phục vụ _TURN:"
 
 msgid "Proxy Server &amp; Browser"
 msgstr "Máy phục vụ ủy nhiệm và Trình duyệt"
@@ -12871,7 +12684,7 @@
 
 #. This is a global option that affects SOCKS4 usage even with account-specific proxy settings
 msgid "Use remote DNS with SOCKS4 proxies"
-msgstr ""
+msgstr "Dùng DNS từ xa với ủy nhiệm SOCKS4"
 
 msgid "_User:"
 msgstr "_Người dùng:"
@@ -12897,10 +12710,10 @@
 msgstr "Konqueror"
 
 msgid "Desktop Default"
-msgstr "Màn hình nền mặc định"
+msgstr "Mặc định môi trường"
 
 msgid "GNOME Default"
-msgstr "GNOME mặc định"
+msgstr "Mặc định GNOME"
 
 # Tên trình duyệt Web
 msgid "Galeon"
@@ -12928,7 +12741,7 @@
 msgstr "Trình _duyệt:"
 
 msgid "_Open link in:"
-msgstr "_Mở liên kết trong:"
+msgstr "_Mở liên kết bằng:"
 
 msgid "Browser default"
 msgstr "Trình duyệt mặc định"
@@ -13003,20 +12816,17 @@
 "_Lệnh âm thanh:\n"
 "(%s cho tên tập tin)"
 
-#, fuzzy
 msgid "M_ute sounds"
-msgstr "Câm âm _thanh"
+msgstr "Câm âm th_anh"
 
 msgid "Sounds when conversation has _focus"
 msgstr "Âm thanh khi cuộc thoại có tiê_u điểm"
 
-#, fuzzy
 msgid "_Enable sounds:"
-msgstr "Bật âm thanh:"
-
-#, fuzzy
+msgstr "_Bật âm thanh:"
+
 msgid "V_olume:"
-msgstr "Âm lượng:"
+msgstr "Â_m lượng:"
 
 msgid "Play"
 msgstr "Chơi"
@@ -13034,7 +12844,7 @@
 msgstr "Dựa vào cách sử dụng bàn phím hay con chuột"
 
 msgid "_Auto-reply:"
-msgstr "T_rả lời tự động:"
+msgstr "_Tự động đáp ứng:"
 
 msgid "When both away and idle"
 msgstr "Khi cả hai vắng mặt và nghỉ"
@@ -13196,14 +13006,13 @@
 msgid "Status for %s"
 msgstr "Trạng thái cho %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "A custom smiley for '%s' already exists.  Please use a different shortcut."
-msgstr ""
-"Đã có một hình cười tự chọn cho lối tắt đã chọn. Hãy ghi rõ một lối tắt khác."
+msgstr "Đã có một hình cười tự chọn cho « %s ». Hãy dùng một lối tắt khác."
 
 msgid "Custom Smiley"
-msgstr "Hình cười tự chọn"
+msgstr "Hình Cười Riêng"
 
 msgid "Duplicate Shortcut"
 msgstr "Nhân đôi lối tắt"
@@ -13214,36 +13023,30 @@
 msgid "Add Smiley"
 msgstr "Thêm hình cười"
 
-#, fuzzy
 msgid "_Image:"
-msgstr "Ả_nh"
+msgstr "Ả_nh:"
 
 #. Shortcut text
-#, fuzzy
 msgid "S_hortcut text:"
-msgstr "Lối tắt"
+msgstr "C_huỗi lối tắt:"
 
 msgid "Smiley"
 msgstr "Hình cười"
 
-#, fuzzy
 msgid "Shortcut Text"
-msgstr "Lối tắt"
+msgstr "Chuỗi lối tắt"
 
 msgid "Custom Smiley Manager"
-msgstr "Bộ Quản lý Hình cười Tự chọn"
-
-#, fuzzy
+msgstr "Bộ Quản lý Hình cười Riêng"
+
 msgid "Select Buddy Icon"
-msgstr "Chọn bạn chát"
-
-#, fuzzy
+msgstr "Chọn biểu tượng bạn chát"
+
 msgid "Click to change your buddyicon for this account."
-msgstr "Dùng biểu tượng bạn chát cho tài khoản này:"
-
-#, fuzzy
+msgstr "Nhấn vào để thay đổi biểu tượng bạn chát cho tài khoản này."
+
 msgid "Click to change your buddyicon for all accounts."
-msgstr "Dùng biểu tượng bạn chát cho tài khoản này:"
+msgstr "Nhấn vào để thay đổi biểu tượng bạn chát cho tất cả các tài khoản."
 
 msgid "Waiting for network connection"
 msgstr "Đợi kết nối đến mạng"
@@ -13323,13 +13126,12 @@
 msgid "Cannot send launcher"
 msgstr "Không thể gửi bộ khởi chạy"
 
-#, fuzzy
 msgid ""
 "You dragged a desktop launcher. Most likely you wanted to send the target of "
 "this launcher instead of this launcher itself."
 msgstr ""
 "Bạn đã kéo một bộ khởi chạy của môi trường. Rất có thể là bạn muốn gửi đích "
-"của bộ khởi chạy, hơn là bộ khởi chạy chính nó."
+"đến của bộ khởi chạy, hơn là bộ khởi chạy chính nó."
 
 #, c-format
 msgid ""
@@ -13339,7 +13141,7 @@
 msgstr ""
 "<b>Tập tin:</b> %s\n"
 "<b>Kích cỡ tập tin:</b> %s\n"
-"<b>Kích ỡ ảnh:</b> %dx%d"
+"<b>Kích cỡ ảnh:</b> %dx%d"
 
 #, c-format
 msgid "The file '%s' is too large for %s.  Please try a smaller image.\n"
@@ -13361,9 +13163,8 @@
 msgstr ""
 "Không nạp được ảnh « %s »: không biết sao, rất có thể là tập tin ảnh bị hỏng"
 
-#, fuzzy
 msgid "_Open Link"
-msgstr "_Mở liên kết trong:"
+msgstr "_Mở liên kết"
 
 msgid "_Copy Link Location"
 msgstr "_Chép địa chỉ liên kết"
@@ -13371,24 +13172,20 @@
 msgid "_Copy Email Address"
 msgstr "_Chép địa chỉ thư"
 
-#, fuzzy
 msgid "_Open File"
-msgstr "Mở tập tin..."
-
-#, fuzzy
+msgstr "_Mở tập tin"
+
 msgid "Open _Containing Directory"
-msgstr "Thư mục chứa sổ theo dõi"
+msgstr "Mở thư mục _chứa"
 
 msgid "Save File"
 msgstr "Lưu tập tin"
 
-#, fuzzy
 msgid "_Play Sound"
-msgstr "Chơi âm thanh"
-
-#, fuzzy
+msgstr "_Phát âm thanh"
+
 msgid "_Save File"
-msgstr "Lưu tập tin"
+msgstr "_Lưu tập tin"
 
 msgid "Select color"
 msgstr "Chọn màu"
@@ -13405,20 +13202,17 @@
 msgid "_Invite"
 msgstr "Mờ_i"
 
-#, fuzzy
 msgid "_Modify..."
-msgstr "_Sửa"
-
-#, fuzzy
+msgstr "_Sửa..."
+
 msgid "_Add..."
-msgstr "Thê_m"
+msgstr "Thê_m..."
 
 msgid "_Open Mail"
 msgstr "_Mở thư"
 
-#, fuzzy
 msgid "_Edit"
-msgstr "Sửa"
+msgstr "_Sửa"
 
 msgid "Pidgin Tooltip"
 msgstr "Gợi ý Công cụ Pidgin"
@@ -13436,12 +13230,11 @@
 msgid "none"
 msgstr "không có"
 
-#, fuzzy
 msgid "Small"
-msgstr "Địa chỉ thư"
+msgstr "Nhỏ"
 
 msgid "Smaller versions of the default smilies"
-msgstr ""
+msgstr "Phiên bản nhỏ của các hình cười mặc định"
 
 msgid "Response Probability:"
 msgstr "Xác suất đáp ứng:"
@@ -13576,78 +13369,65 @@
 
 #. Note to translators: The string "Enter an XMPP Server" is asking the
 #. user to type the name of an XMPP server which will then be queried
-#, fuzzy
 msgid "Server name request"
-msgstr "Địa chỉ máy phục vụ"
-
-#, fuzzy
+msgstr "Yêu cầu tên máy phục vụ"
+
 msgid "Enter an XMPP Server"
-msgstr "Nhập máy phục vụ hội thảo"
-
-#, fuzzy
+msgstr "Nhập một máy phục vụ XMPP"
+
 msgid "Select an XMPP server to query"
-msgstr "Chọn một máy phục vụ hội thảo để hỏi"
-
-#, fuzzy
+msgstr "Chọn một máy phục vụ XMPP để hỏi"
+
 msgid "Find Services"
-msgstr "Dịch vụ trực tuyến"
-
-#, fuzzy
+msgstr "Tìm dịch vụ"
+
 msgid "Add to Buddy List"
-msgstr "Gửi danh sách bạn bè"
-
-#, fuzzy
+msgstr "Thêm vào danh sách bạn chát"
+
 msgid "Gateway"
-msgstr "Đi vắng"
-
-#, fuzzy
+msgstr "Cổng ra"
+
 msgid "Directory"
-msgstr "Thư mục chứa sổ theo dõi"
-
-#, fuzzy
+msgstr "Thư mục"
+
 msgid "PubSub Collection"
-msgstr "Chọn âm thanh"
-
-#, fuzzy
+msgstr "Tập hợp PubSub"
+
 msgid "PubSub Leaf"
-msgstr "Dịch vụ PubSub"
-
-#, fuzzy
+msgstr "PubSub Leaf"
+
 msgid ""
 "\n"
 "<b>Description:</b> "
-msgstr "Mô tả"
+msgstr ""
+"\n"
+"<b>Mô tả:</b> "
 
 #. Create the window.
-#, fuzzy
 msgid "Service Discovery"
-msgstr "Thông tin phát hiện dịch vụ"
-
-#, fuzzy
+msgstr "Phát hiện Dịch vụ"
+
 msgid "_Browse"
-msgstr "Trình _duyệt:"
-
-#, fuzzy
+msgstr "_Duyệt"
+
 msgid "Server does not exist"
-msgstr "Người dùng đó không tồn tại."
-
-#, fuzzy
+msgstr "Máy phục vụ không tồn tại"
+
 msgid "Server does not support service discovery"
-msgstr "Máy phục vụ không sử dụng bất kỳ phương thức xác thực được hỗ trợ nào"
-
-#, fuzzy
+msgstr "Máy phục vụ không hỗ trợ chức năng phát hiện dịch vụ"
+
 msgid "XMPP Service Discovery"
-msgstr "Thông tin phát hiện dịch vụ"
+msgstr "Phát hiện Dịch vụ XMPP"
 
 msgid "Allows browsing and registering services."
-msgstr ""
-
-#, fuzzy
+msgstr "Cho phép duyệt qua và đăng ký các dịch vụ."
+
 msgid ""
 "This plugin is useful for registering with legacy transports or other XMPP "
 "services."
 msgstr ""
-"Phần bổ sung này có ích để gỡ lỗi máy phục vụ hay trình khách kiểu XMPP."
+"Phần bổ sung này có ích để đăng ký với mạng truyền tải thừa tự, hay dịch vụ "
+"XMPP khác."
 
 msgid "By conversation count"
 msgstr "Theo số đếm cuộc thoại"
@@ -13946,7 +13726,6 @@
 msgstr "Phần bổ sung tin nhẳn nhạc để soạn nhạc một cách hợp tác."
 
 #. *  summary
-#, fuzzy
 msgid ""
 "The Music Messaging Plugin allows a number of users to simultaneously work "
 "on a piece of music by editing a common score in real-time."
@@ -13983,9 +13762,8 @@
 msgid "Set window manager \"_URGENT\" hint"
 msgstr "Lập ẩn ý « _Khẩn » của bộ quản lý cửa sổ"
 
-#, fuzzy
 msgid "_Flash window"
-msgstr "Cửa sổ C_hat"
+msgstr "Nhá_y cửa sổ"
 
 #. Raise window method button
 msgid "R_aise conversation window"
@@ -14066,14 +13844,12 @@
 msgid "Hyperlink Color"
 msgstr "Màu siêu liên kết"
 
-#, fuzzy
 msgid "Visited Hyperlink Color"
-msgstr "Màu siêu liên kết"
+msgstr "Màu siêu liên kết đã thăm"
 
 msgid "Highlighted Message Name Color"
 msgstr "Màu tên tin nhẳn tô sáng"
 
-#, fuzzy
 msgid "Typing Notification Color"
 msgstr "Màu thông báo đang gõ"
 
@@ -14106,23 +13882,20 @@
 msgid "GTK+ Text Shortcut Theme"
 msgstr "Sắc thái lối tắt văn bản GTK+"
 
-#, fuzzy
 msgid "Disable Typing Notification Text"
-msgstr "Bật thông báo đang gõ"
-
-#, fuzzy
+msgstr "Tắt chuỗi thông báo đang gõ"
+
 msgid "GTK+ Theme Control Settings"
-msgstr "Điều khiển sắc thái GTK+ Pidgin"
-
-#, fuzzy
+msgstr "Thiết lập Điều khiển Sắc thái GTK+"
+
 msgid "Colors"
-msgstr "Đóng"
+msgstr "Màu sắc"
 
 msgid "Fonts"
 msgstr "Phông"
 
 msgid "Miscellaneous"
-msgstr ""
+msgstr "Linh tinh"
 
 msgid "Gtkrc File Tools"
 msgstr "Công cụ tập tin Gtkrc"
@@ -14155,18 +13928,16 @@
 
 #, c-format
 msgid "You can upgrade to %s %s today."
-msgstr ""
+msgstr "Hôm nay bạn có dịp nâng cấp lên %s %s."
 
 msgid "New Version Available"
 msgstr "Hiện đang có phiên bản mới"
 
-#, fuzzy
 msgid "Later"
-msgstr "Ngày tháng"
-
-#, fuzzy
+msgstr "Về sau"
+
 msgid "Download Now"
-msgstr "Người dùng trên %s: %s"
+msgstr "Tải về ngay"
 
 #. *< type
 #. *< ui_requirement
@@ -14208,12 +13979,11 @@
 msgstr "Cái nút Gửi trong Cửa sổ Cuộc thoại."
 
 #. *< summary
-#, fuzzy
 msgid ""
 "Adds a Send button to the entry area of the conversation window. Intended "
 "for use when no physical keyboard is present."
 msgstr ""
-"Thêm một cái nút Gửi vào vùng nhập của cửa sổ cuộc thoát. Dự định cho trường "
+"Thêm một cái nút Gửi vào vùng nhập của cửa sổ cuộc thoại. Dự định cho trường "
 "hợp không có bàn phím vật lý."
 
 msgid "Duplicate Correction"
@@ -14268,98 +14038,81 @@
 msgstr ""
 "Thay thế văn bản trong tin nhẳn gửi đi theo qui tắc người dùng định ra."
 
-#, fuzzy
 msgid "Just logged in"
-msgstr "Chưa đăng nhập"
-
-#, fuzzy
+msgstr "Mới đăng nhập"
+
 msgid "Just logged out"
-msgstr "Chưa đăng nhập"
+msgstr "Mới đăng xuất"
 
 msgid ""
 "Icon for Contact/\n"
 "Icon for Unknown person"
 msgstr ""
-
-#, fuzzy
+"Biểu tượng cho Liên lạc\n"
+"Biểu tượng cho Người lạ"
+
 msgid "Icon for Chat"
-msgstr "Tham gia Chat"
-
-#, fuzzy
+msgstr "Biểu tượng cho Chát"
+
 msgid "Ignored"
-msgstr "Lờ"
-
-#, fuzzy
+msgstr "Bị lờ"
+
 msgid "Founder"
-msgstr "To hơn"
-
-# Tên trình duyệt Web
+msgstr "Người sáng lập"
+
 #. A user in a chat room who has special privileges.
-#, fuzzy
 msgid "Operator"
-msgstr "Opera"
+msgstr "Thao tác viên"
 
 #. A half operator is someone who has a subset of the privileges
 #. that an operator has.
 msgid "Half Operator"
-msgstr ""
-
-#, fuzzy
+msgstr "Nửa thao tác viên"
+
 msgid "Authorization dialog"
-msgstr "Cho phép"
-
-#, fuzzy
+msgstr "Hộp thoại cho phép"
+
 msgid "Error dialog"
-msgstr "Lỗi "
-
-#, fuzzy
+msgstr "Hộp thoại lỗi "
+
 msgid "Information dialog"
-msgstr "Thông tin"
+msgstr "Hộp thoại thông tin"
 
 msgid "Mail dialog"
-msgstr ""
-
-#, fuzzy
+msgstr "Hộp thoại thư tín"
+
 msgid "Question dialog"
-msgstr "Hộp thoại yêu cầu"
-
-#, fuzzy
+msgstr "Hộp thoại câu hỏi"
+
 msgid "Warning dialog"
-msgstr "Mức cảnh báo"
+msgstr "Hộp thoại cảnh báo"
 
 msgid "What kind of dialog is this?"
-msgstr ""
-
-#, fuzzy
+msgstr "Hộp thoại này có loại nào?"
+
 msgid "Status Icons"
-msgstr "Trạng thái cho %s"
-
-#, fuzzy
+msgstr "Biểu tượng Trạng thái"
+
 msgid "Chatroom Emblems"
-msgstr "Miền địa phương phòng chát"
-
-#, fuzzy
+msgstr "Hình tượng phòng chát"
+
 msgid "Dialog Icons"
-msgstr "Lưu biểu tượng"
-
-#, fuzzy
+msgstr "Biểu tượng Hộp thoại"
+
 msgid "Pidgin Icon Theme Editor"
-msgstr "Điều khiển sắc thái GTK+ Pidgin"
-
-#, fuzzy
+msgstr "Bộ Sửa Sắc thái Biểu tượng Pidgin"
+
 msgid "Contact"
-msgstr "Thông tin liên lạc"
-
-#, fuzzy
+msgstr "Liên lạc"
+
 msgid "Pidgin Buddylist Theme Editor"
-msgstr "Danh sách bạn bè"
-
-#, fuzzy
+msgstr "Bộ Sửa Sắc thái Danh sách Bạn chát Pidgin"
+
 msgid "Edit Buddylist Theme"
-msgstr "Danh sách bạn bè"
+msgstr "Sửa sắc thái danh sách bạn chát"
 
 msgid "Edit Icon Theme"
-msgstr ""
+msgstr "Sửa sắc thái biểu tượng"
 
 #. *< type
 #. *< ui_requirement
@@ -14368,16 +14121,14 @@
 #. *< priority
 #. *< id
 #. *  description
-#, fuzzy
 msgid "Pidgin Theme Editor"
-msgstr "Điều khiển sắc thái GTK+ Pidgin"
+msgstr "Bộ Sửa Sắc thái Pidgin"
 
 #. *< name
 #. *< version
 #. *  summary
-#, fuzzy
 msgid "Pidgin Theme Editor."
-msgstr "Điều khiển sắc thái GTK+ Pidgin"
+msgstr "Bộ Sửa Sắc thái Pidgin."
 
 #. *< type
 #. *< ui_requirement
@@ -14462,35 +14213,29 @@
 "Phần bổ sung này cho phép người dùng tùy chỉnh các định dạng của nhãn thời "
 "gian trong tin nhẳn cuộc thoại và bản ghi."
 
-#, fuzzy
 msgid "Audio"
-msgstr "Tác giả"
-
-#, fuzzy
+msgstr "Âm thanh"
+
 msgid "Video"
-msgstr "Ảnh động trực tiếp"
+msgstr "Phim"
 
 msgid "Output"
-msgstr ""
-
-#, fuzzy
+msgstr "Kết xuất"
+
 msgid "_Plugin"
-msgstr "Phần bổ sung"
-
-#, fuzzy
+msgstr "_Phần bổ sung"
+
 msgid "_Device"
-msgstr "Thiết bị"
+msgstr "_Thiết bị"
 
 msgid "Input"
-msgstr ""
-
-#, fuzzy
+msgstr "Đầu vào"
+
 msgid "P_lugin"
-msgstr "Phần bổ sung"
-
-#, fuzzy
+msgstr "Phần bổ _sung"
+
 msgid "D_evice"
-msgstr "Thiết bị"
+msgstr "Thiết _bị"
 
 #. *< magic
 #. *< major version
@@ -14501,18 +14246,19 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#, fuzzy
 msgid "Voice/Video Settings"
-msgstr "Sửa thiết lập"
+msgstr "Thiết lập Thoại/Phim"
 
 #. *< name
 #. *< version
 msgid "Configure your microphone and webcam."
-msgstr ""
+msgstr "Cấu hình máy vi âm và máy ảnh Web."
 
 #. *< summary
 msgid "Configure microphone and webcam settings for voice/video calls."
 msgstr ""
+"Cấu hình thiết lập cái máy vi âm và cái máy ảnh Web để gọi với tiếng nói và/"
+"hay ảnh động."
 
 msgid "Opacity:"
 msgstr "Tính mờ đục:"
@@ -14570,9 +14316,6 @@
 "\n"
 "Chú ý: phần bổ sung này yêu cầu bạn dùng Win2000 hoặc sau."
 
-msgid "GTK+ Runtime Version"
-msgstr "Phiên bản GTK+ Runtime"
-
 #. Autostart
 msgid "Startup"
 msgstr "Khởi chạy"
@@ -14581,6 +14324,9 @@
 msgid "_Start %s on Windows startup"
 msgstr "_Chạy %s khi khởi động Windows"
 
+msgid "Allow multiple instances"
+msgstr "Cho phép nhiều thể hiện"
+
 msgid "_Dockable Buddy List"
 msgstr "_Danh sách bạn bè có thể neo lại"
 
@@ -14598,12 +14344,11 @@
 msgid "Options specific to Pidgin for Windows."
 msgstr "Tùy chọn riêng cho Pidgin trên Windows."
 
-#, fuzzy
 msgid ""
 "Provides options specific to Pidgin for Windows, such as buddy list docking."
 msgstr ""
-"Cung cấo thiết lập đặc biệt cho Windows Pidgin, chẳng hạn như neo danh sách "
-"bạn bè."
+"Cung cấp các tuỳ chọn đặc biệt cho Windows Pidgin, chẳng hạn như neo danh "
+"sách bạn chát."
 
 msgid "<font color='#777777'>Logged out.</font>"
 msgstr "<font color='#777777'>Đã đăng xuất.</font>"
@@ -14642,959 +14387,3 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr ""
 "Phần bổ sung này có ích để gỡ lỗi máy phục vụ hay trình khách kiểu XMPP."
-
-#, fuzzy
-#~ msgid "Calling ... "
-#~ msgstr "Đang tính toán..."
-
-#~ msgid "Invalid certificate chain"
-#~ msgstr "Dãy chứng nhận không hợp lệ"
-
-#~ msgid ""
-#~ "The certificate chain presented by %s does not have a valid digital "
-#~ "signature from the Certificate Authority from which it claims to have a "
-#~ "signature."
-#~ msgstr ""
-#~ "%s đã cung cấp một dãy chứng nhận không có chữ ký số hợp lệ từ Nhà cầm "
-#~ "quyền chứng nhận từ đó nó tuyên bố có chữ ký."
-
-#~ msgid "Invalid certificate authority signature"
-#~ msgstr "Chữ ký nhà cầm quyền chứng nhận không hợp lệ"
-
-#~ msgid "Join/Part Hiding Configuration"
-#~ msgstr "Cấu hình ẩn việc Vào/Rời"
-
-#~ msgid "Minimum Room Size"
-#~ msgstr "Kích cỡ phòng tối thiểu"
-
-#~ msgid "User Inactivity Timeout (in minutes)"
-#~ msgstr "Thời hạn người dùng không hoạt động (theo phút)"
-
-#, fuzzy
-#~ msgid "Malformed BOSH Connect Server"
-#~ msgstr "Không kết nối được với máy phục vụ."
-
-#, fuzzy
-#~ msgid "Failed to open the file"
-#~ msgstr "Không mở được tập tin « %s »: %s"
-
-#, fuzzy
-#~ msgid "Unable to not load SILC key pair"
-#~ msgstr "Không thể nạp cặp khoá SILC"
-
-#~ msgid "Your account is locked, please log in to the Yahoo! website."
-#~ msgstr ""
-#~ "Tài khoản của bạn đã bị khóa, hãy đăng nhập vào địa chỉ Web của Yahoo."
-
-#~ msgid ""
-#~ "%s declined your conference invitation to room \"%s\" because \"%s\"."
-#~ msgstr "%s đã từ chối lời mời hội thảo ở phòng « %s » bởi vì « %s »."
-
-#~ msgid "Invitation Rejected"
-#~ msgstr "Lời mời không được chấp nhận"
-
-#, fuzzy
-#~ msgid "_Proxy"
-#~ msgstr "Ủy nhiệm"
-
-#~ msgid "Euskera(Basque)"
-#~ msgstr "Tiếng Ba-x-quợ"
-
-#~ msgid "_Resume"
-#~ msgstr "Tiếp tụ_c"
-
-#, fuzzy
-#~ msgid ""
-#~ "%s %s\n"
-#~ "Usage: %s [OPTION]...\n"
-#~ "\n"
-#~ "  -c, --config=DIR    use DIR for config files\n"
-#~ "  -d, --debug         print debugging messages to stdout\n"
-#~ "  -f, --force-online  force online, regardless of network status\n"
-#~ "  -h, --help          display this help and exit\n"
-#~ "  -m, --multiple      do not ensure single instance\n"
-#~ "  -n, --nologin       don't automatically login\n"
-#~ "  -l, --login[=NAME]  enable specified account(s) (optional argument "
-#~ "NAME\n"
-#~ "                      specifies account(s) to use, separated by commas.\n"
-#~ "                      Without this only the first account will be "
-#~ "enabled).\n"
-#~ "  --display=DISPLAY   X display to use\n"
-#~ "  -v, --version       display the current version and exit\n"
-#~ msgstr ""
-#~ "%s %s\n"
-#~ "Sử dụng: %s [TÙY_CHỌN]...\n"
-#~ "\n"
-#~ "  -c, --config=THƯ_MỤC    giữ các tập tin cấu hình trong thư mục này\n"
-#~ "  -d, --debug         \tin các thông điệp gỡ lỗi ra đầu ra tiêu chuẩn\n"
-#~ "  -h, --help          \t\thiển thị trợ giúp này rồi thoát\n"
-#~ "  -m, --multiple      \tkhông đảm bảo chỉ một thể hiện\n"
-#~ "  -n, --nologin       \tđừng tự động đăng nhập\n"
-#~ "  -l, --login[=TÊN]  \tbật (những) tài khoản đã ghi rõ (đối số tùy chọn "
-#~ "TÊN\n"
-#~ "\t\tcũng ghi rõ (những) tài khoản cần dùng, định giới bằng dấu phẩy.\n"
-#~ "\t\tKhông đưa ra thì chỉ bật tài khoản thứ nhất.)\n"
-#~ "  --display=BỘ_TRÌNH_BÀY\t\tbộ trình bày X cần dùng\n"
-#~ "  -v, --version       \t\thiển thị phiên bản hiện thời rồi thoát\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "%s %s\n"
-#~ "Usage: %s [OPTION]...\n"
-#~ "\n"
-#~ "  -c, --config=DIR    use DIR for config files\n"
-#~ "  -d, --debug         print debugging messages to stdout\n"
-#~ "  -f, --force-online  force online, regardless of network status\n"
-#~ "  -h, --help          display this help and exit\n"
-#~ "  -m, --multiple      do not ensure single instance\n"
-#~ "  -n, --nologin       don't automatically login\n"
-#~ "  -l, --login[=NAME]  enable specified account(s) (optional argument "
-#~ "NAME\n"
-#~ "                      specifies account(s) to use, separated by commas.\n"
-#~ "                      Without this only the first account will be "
-#~ "enabled).\n"
-#~ "  -v, --version       display the current version and exit\n"
-#~ msgstr ""
-#~ "%s %s\n"
-#~ "Sử dụng: %s [TÙY_CHỌN]...\n"
-#~ "\n"
-#~ "  -c, --config=THƯ_MỤC    giữ các tập tin cấu hình trong thư mục này\n"
-#~ "  -d, --debug         \tin các thông điệp gỡ lỗi ra đầu ra tiêu chuẩn\n"
-#~ "  -h, --help          \t\thiển thị trợ giúp này rồi thoát\n"
-#~ "  -m, --multiple      \tkhông đảm bảo chỉ một thể hiện\n"
-#~ "  -n, --nologin       \tđừng tự động đăng nhập\n"
-#~ " -l, --login[=TÊN]  \tbật (những) tài khoản đã ghi rõ (đối số tùy chọn "
-#~ "TÊN\n"
-#~ "\t\tcũng ghi rõ (những) tài khoản cần dùng, định giới bằng dấu phẩy.\n"
-#~ "\t\tKhông đưa ra thì chỉ bật tài khoản thứ nhất.)\n"
-#~ "  -v, --version       \t\thiển thị phiên bản hiện thời rồi thoát\n"
-
-#~ msgid "Cannot open socket"
-#~ msgstr "Không thể mở ổ cắm."
-
-#~ msgid "Could not listen on socket"
-#~ msgstr "Không thể lắng nghe trên ổ cắm"
-
-#~ msgid "Unable to read socket"
-#~ msgstr "Không thể đọc ổ cắm"
-
-#~ msgid "Connection failed."
-#~ msgstr "Lỗi kết nối."
-
-#~ msgid "Server has disconnected"
-#~ msgstr "Máy phục vụ đã ngắt kết nối"
-
-#~ msgid "Couldn't create socket"
-#~ msgstr "Không thể tạo ổ cắm"
-
-#~ msgid "Couldn't connect to host"
-#~ msgstr "Không thể kết nối với máy phục vụ"
-
-#~ msgid "Read error"
-#~ msgstr "Lỗi đọc"
-
-#~ msgid ""
-#~ "Could not establish a connection with the server:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Không thể thiết lập kết nối đến máy phục vụ :\n"
-#~ "%s"
-
-#~ msgid "Write error"
-#~ msgstr "Lỗi ghi"
-
-#~ msgid "Last Activity"
-#~ msgstr "Hoạt động cuối cùng"
-
-#~ msgid "Service Discovery Info"
-#~ msgstr "Thông tin phát hiện dịch vụ"
-
-#~ msgid "Service Discovery Items"
-#~ msgstr "Mục phát hiện dịch vụ"
-
-#~ msgid "Extended Stanza Addressing"
-#~ msgstr "Đặt địa chỉ kiểu đoạn dòng mở rộng"
-
-#~ msgid "Multi-User Chat"
-#~ msgstr "Chat đa người dùng"
-
-#~ msgid "Multi-User Chat Extended Presence Information"
-#~ msgstr "Thông tin về mặt ở đã mở rộng cho chat đa người dùng"
-
-#~ msgid "In-Band Bytestreams"
-#~ msgstr "Luồng byte bên trong dải"
-
-#~ msgid "Ad-Hoc Commands"
-#~ msgstr "Lệnh như thế"
-
-#~ msgid "PubSub Service"
-#~ msgstr "Dịch vụ PubSub"
-
-#~ msgid "SOCKS5 Bytestreams"
-#~ msgstr "Luồng byte SOCKS5"
-
-#~ msgid "Out of Band Data"
-#~ msgstr "Dữ liệu bên ngoài dải"
-
-#~ msgid "XHTML-IM"
-#~ msgstr "XHTML-IM"
-
-#~ msgid "In-Band Registration"
-#~ msgstr "Đăng ký bên trong dải"
-
-#~ msgid "User Location"
-#~ msgstr "Nơi ở người dùng"
-
-#~ msgid "User Avatar"
-#~ msgstr "Ảnh riêng người dùng"
-
-#~ msgid "Chat State Notifications"
-#~ msgstr "Thông báo tình trạng chat"
-
-#~ msgid "Software Version"
-#~ msgstr "Phiên bản phần mềm"
-
-#~ msgid "Stream Initiation"
-#~ msgstr "Khởi tạo luồng"
-
-#~ msgid "User Mood"
-#~ msgstr "Tâm trạng người dùng"
-
-#~ msgid "User Activity"
-#~ msgstr "Hoạt động người dùng"
-
-#~ msgid "Entity Capabilities"
-#~ msgstr "Khả năng thực thể"
-
-#~ msgid "Encrypted Session Negotiations"
-#~ msgstr "Dàn xếp phiên bản đã mật mã"
-
-#~ msgid "User Tune"
-#~ msgstr "Điệu người dùng"
-
-#~ msgid "Roster Item Exchange"
-#~ msgstr "Trao đổi mục bản liệt kê"
-
-#~ msgid "Reachability Address"
-#~ msgstr "Địa chỉ có thể tới"
-
-#~ msgid "User Profile"
-#~ msgstr "Lý lịch người dùng"
-
-# Name: don't translate/Tên: đừng dịch
-#~ msgid "Jingle"
-#~ msgstr "Jingle"
-
-#~ msgid "Jingle Audio"
-#~ msgstr "Âm thanh Jingle"
-
-#~ msgid "User Nickname"
-#~ msgstr "Tên hiệu người dùng"
-
-#~ msgid "Jingle ICE UDP"
-#~ msgstr "Jingle ICE UDP"
-
-#~ msgid "Jingle ICE TCP"
-#~ msgstr "Jingle ICE TCP"
-
-#~ msgid "Jingle Raw UDP"
-#~ msgstr "Jingle Raw UDP"
-
-#~ msgid "Jingle Video"
-#~ msgstr "Ảnh động Jingle"
-
-#~ msgid "Jingle DTMF"
-#~ msgstr "Jingle DTMF"
-
-#~ msgid "Message Receipts"
-#~ msgstr "Người nhận tin nhẳn"
-
-#~ msgid "Public Key Publishing"
-#~ msgstr "Xuất bản khoá công"
-
-#~ msgid "User Chatting"
-#~ msgstr "Người dùng nói chuyện"
-
-#~ msgid "User Browsing"
-#~ msgstr "Người dùng duyệt"
-
-#~ msgid "User Gaming"
-#~ msgstr "Người dùng chơi trò"
-
-#~ msgid "User Viewing"
-#~ msgstr "Người dùng xem"
-
-#~ msgid "Stanza Encryption"
-#~ msgstr "Mật mã đoạn dòng"
-
-#~ msgid "Entity Time"
-#~ msgstr "Thời gian thực thể"
-
-#~ msgid "Delayed Delivery"
-#~ msgstr "Phát trễ"
-
-#~ msgid "Collaborative Data Objects"
-#~ msgstr "Đối tượng dữ liệu hợp tác"
-
-#~ msgid "File Repository and Sharing"
-#~ msgstr "Kho lưu tập tin và chia sẻ"
-
-#~ msgid "STUN Service Discovery for Jingle"
-#~ msgstr "Phát hiện dịch vụ STUN cho Jingle"
-
-#~ msgid "Simplified Encrypted Session Negotiation"
-#~ msgstr "Dàn xếp phiên chạy mật mã đơn giản"
-
-#~ msgid "Hop Check"
-#~ msgstr "Kiểm tra bước"
-
-#~ msgid "Read Error"
-#~ msgstr "Lỗi đọc"
-
-#~ msgid "Failed to connect to server."
-#~ msgstr "Không kết nối được với máy phục vụ."
-
-#~ msgid "Read buffer full (2)"
-#~ msgstr "Bộ đệm đọc đã đầy (2)"
-
-#~ msgid "Unparseable message"
-#~ msgstr "Thông điệp không thể phân tích"
-
-#~ msgid "Couldn't connect to host: %s (%d)"
-#~ msgstr "Không thể kết nối đến máy: %s (%d)"
-
-#~ msgid "Login failed (%s)."
-#~ msgstr "Không đăng nhập được (%s)"
-
-#~ msgid ""
-#~ "You have been logged out because you logged in at another workstation."
-#~ msgstr "Bạn bị đăng xuất vì bạn cũng đăng nhập bằng một máy trạm khác."
-
-#~ msgid "Error. SSL support is not installed."
-#~ msgstr "Lỗi: chưa cài đặt khả năng hỗ trợ SSL."
-
-#~ msgid "Incorrect password."
-#~ msgstr "Mật khẩu sai."
-
-#~ msgid ""
-#~ "Could not connect to BOS server:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Không thể kết nối tới máy phục vụ BOS:\n"
-#~ "%s"
-
-#~ msgid "You may be disconnected shortly.  Check %s for updates."
-#~ msgstr ""
-#~ "Bạn có thể bị ngắt kết nối một thời gian ngắn. Hãy kiểm tra %s để cập "
-#~ "nhật."
-
-#~ msgid "Could Not Connect"
-#~ msgstr "Không thể kết nối"
-
-#~ msgid "Invalid username."
-#~ msgstr "Tên người dùng sai."
-
-#, fuzzy
-#~ msgid "Could not decrypt server reply"
-#~ msgstr "Không thể lấy thông tin về máy phục vụ"
-
-#~ msgid "Connection lost"
-#~ msgstr "Kết nối bị mất"
-
-#~ msgid "Couldn't resolve host"
-#~ msgstr "Không thể giải quyết máy"
-
-#~ msgid "Connection closed (writing)"
-#~ msgstr "Kết nối bị đóng (đang ghi)"
-
-#~ msgid "Connection reset"
-#~ msgstr "Kết nối bị đặt lại"
-
-#~ msgid "Error reading from socket: %s"
-#~ msgstr "Lỗi đọc từ ổ cắm: %s"
-
-#~ msgid "Unable to connect to host"
-#~ msgstr "Không thể kết nối đến máy"
-
-#~ msgid "Could not write"
-#~ msgstr "Không thể ghi"
-
-#~ msgid "Could not connect"
-#~ msgstr "Không thể kết nối"
-
-#~ msgid "Could not create listen socket"
-#~ msgstr "Không thể tạo ổ cắm lắng nghe"
-
-#~ msgid "Could not resolve hostname"
-#~ msgstr "Không thể giải quyết tên máy"
-
-#, fuzzy
-#~ msgid "Incorrect Password"
-#~ msgstr "Mật khẩu sai"
-
-#~ msgid ""
-#~ "Could not establish a connection with %s:\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Không thể thiết lập kết nối với %s:\n"
-#~ "%s"
-
-#~ msgid "Yahoo Japan"
-#~ msgstr "Yahoo Nhật bản"
-
-#~ msgid "Japan Pager server"
-#~ msgstr "Máy phục vụ nhắn tin Nhật bản"
-
-#~ msgid "Japan file transfer server"
-#~ msgstr "Máy phục vụ truyền tập tin Nhật bản"
-
-#~ msgid ""
-#~ "Lost connection with server\n"
-#~ "%s"
-#~ msgstr ""
-#~ "Mất kết nối với máy phục vụ\n"
-#~ "%s"
-
-#~ msgid "Could not resolve host name"
-#~ msgstr "Không thể giải quyết tên máy."
-
-#, fuzzy
-#~ msgid ""
-#~ "Unable to connect to %s: Server requires TLS/SSL, but no TLS/SSL support "
-#~ "was found."
-#~ msgstr ""
-#~ "Máy phục vụ yêu cầu TLS/SSL để đăng nhập. Không tìm thấy khả năng hỗ trợ "
-#~ "TLS/SSL."
-
-#~ msgid "Conversation Window Hiding"
-#~ msgstr "Ẩn cửa sổ cuộc thoại"
-
-#~ msgid "More Data needed"
-#~ msgstr "Cần thêm dữ liệu"
-
-#~ msgid "Please provide a shortcut to associate with the smiley."
-#~ msgstr "Hãy cung cấp một lối tắt cần liên quan đến hình cười đó."
-
-#~ msgid "Please select an image for the smiley."
-#~ msgstr "Hãy chọn một ảnh cho hình cười đó."
-
-#~ msgid "Activate which ID?"
-#~ msgstr "Kích hoạt ID nào ?"
-
-#~ msgid "Cursor Color"
-#~ msgstr "Màu con trỏ"
-
-#~ msgid "Secondary Cursor Color"
-#~ msgstr "Màu con trỏ phụ"
-
-#~ msgid "Interface colors"
-#~ msgstr "Màu sắc giao diện"
-
-#~ msgid "Widget Sizes"
-#~ msgstr "Kích cỡ ô điều khiển"
-
-#~ msgid "Invite message"
-#~ msgstr "Lời mời"
-
-#~ msgid ""
-#~ "Please enter the name of the user you wish to invite,\n"
-#~ "along with an optional invite message."
-#~ msgstr ""
-#~ "Hãy nhập tên người dùng mà bạn muốn mời,\n"
-#~ "kèm theo lời mời tùy ý."
-
-#~ msgid "Unable to retrieve MSN Address Book"
-#~ msgstr "Không thể lấy Sổ địa chỉ MSN"
-
-#~ msgid "Connection to server lost (no data received within %d second)"
-#~ msgid_plural ""
-#~ "Connection to server lost (no data received within %d seconds)"
-#~ msgstr[0] ""
-#~ "Kết nối đến máy phục vụ bị mất (không nhận dữ liệu trong vòng %d giây)"
-
-#~ msgid ""
-#~ "You may be disconnected shortly.  You may want to use TOC until this is "
-#~ "fixed.  Check %s for updates."
-#~ msgstr ""
-#~ "Bạn có thể bị ngắt kết nối một thời gian ngắn. Trong lúc chờ đợi lỗi được "
-#~ "sửa, bạn có thể sử dụng TOC. Hãy kiểm tra %s để cập nhật."
-
-#, fuzzy
-#~ msgid "Add buddy Q&A"
-#~ msgstr "Thêm bạn thân"
-
-#, fuzzy
-#~ msgid "Can not decrypt get server reply"
-#~ msgstr "Không thể lấy thông tin về máy phục vụ"
-
-#~ msgid "Keep alive error"
-#~ msgstr "Lỗi giữ cho kết nối hoạt động"
-
-#, fuzzy
-#~ msgid ""
-#~ "Lost connection with server:\n"
-#~ "%d, %s"
-#~ msgstr ""
-#~ "Mất kết nối với máy phục vụ :\n"
-#~ "%s"
-
-#, fuzzy
-#~ msgid "Connecting server ..."
-#~ msgstr "Máy phục vụ kết nối"
-
-#~ msgid "Failed to send IM."
-#~ msgstr "Không gửi được tin nhắn."
-
-#, fuzzy
-#~ msgid "Not a member of room \"%s\"\n"
-#~ msgstr "Bạn [%d] đã được thêm vào nhóm « %d »"
-
-#~ msgid "Looking up %s"
-#~ msgstr "Đang tra tìm %s"
-
-#~ msgid "Connect to %s failed"
-#~ msgstr "Kết nối đến %s không được"
-
-#~ msgid "Signon: %s"
-#~ msgstr "Đăng nhập: %s"
-
-#~ msgid "Unable to write file %s."
-#~ msgstr "Không thể ghi tập tin %s."
-
-#~ msgid "Unable to read file %s."
-#~ msgstr "Không thể đọc tập tin %s."
-
-#~ msgid "Message too long, last %s bytes truncated."
-#~ msgstr "Tin nhắn quá dài, %s byte cuối bị cắt ngắn."
-
-#~ msgid "%s not currently logged in."
-#~ msgstr "%s chưa đăng nhập."
-
-#~ msgid "Warning of %s not allowed."
-#~ msgstr "Không cho phép cảnh báo cho %s."
-
-#~ msgid ""
-#~ "A message has been dropped, you are exceeding the server speed limit."
-#~ msgstr ""
-#~ "Một tin nhẳn không gửi đi được, bạn đang vượt quá tốc độ cho phép của máy "
-#~ "phục vụ."
-
-#~ msgid "Chat in %s is not available."
-#~ msgstr "Không có sẵn chát trong %s."
-
-#~ msgid "You are sending messages too fast to %s."
-#~ msgstr "Bạn đang gửi tin nhẳn quá nhanh đến %s."
-
-#~ msgid "You missed an IM from %s because it was too big."
-#~ msgstr "Bạn không nhận được tin nhắn từ %s vì nó quá lớn."
-
-#~ msgid "You missed an IM from %s because it was sent too fast."
-#~ msgstr "Bạn không nhận được tin nhắn từ %s vì nó được gửi quá nhanh."
-
-#~ msgid "Failure."
-#~ msgstr "Lỗi."
-
-#~ msgid "Too many matches."
-#~ msgstr "Quá nhiều kết quả trùng khớp."
-
-#~ msgid "Need more qualifiers."
-#~ msgstr "Cần thêm từ hạn định"
-
-#~ msgid "Dir service temporarily unavailable."
-#~ msgstr "Tạm thời không có dịch vụ danh bạ."
-
-#~ msgid "Email lookup restricted."
-#~ msgstr "Khả năng tra tìm địa chỉ thư điện tử bị hạn chế."
-
-#~ msgid "Keyword ignored."
-#~ msgstr "Từ khóa bị lờ đi."
-
-#~ msgid "No keywords."
-#~ msgstr "Không có từ khóa."
-
-#~ msgid "User has no directory information."
-#~ msgstr "Người dùng không có thông tin danh bạ."
-
-#~ msgid "Country not supported."
-#~ msgstr "Quốc gia chưa được hỗ trợ."
-
-#~ msgid "Failure unknown: %s."
-#~ msgstr "Lỗi không rõ : %s."
-
-#~ msgid "Incorrect username or password."
-#~ msgstr "Tên người dùng hay mật khẩu không đúng."
-
-#~ msgid "The service is temporarily unavailable."
-#~ msgstr "Tạm thời không có dịch vụ."
-
-#~ msgid "Your warning level is currently too high to log in."
-#~ msgstr "Mức cảnh báo của bạn hiện thời quá cao nên không đăng nhập được."
-
-#~ msgid ""
-#~ "You have been connecting and disconnecting too frequently.  Wait ten "
-#~ "minutes and try again.  If you continue to try, you will need to wait "
-#~ "even longer."
-#~ msgstr ""
-#~ "Bạn đã liên tục kết nối và ngắt kết nối quá nhiều. Hẵy đợi 10 phút và kết "
-#~ "nối lại. Nếu bạn vẫn cố kết nối, bạn sẽ phải chờ lâu hơn."
-
-#~ msgid "An unknown error, %d, has occurred.  Info: %s"
-#~ msgstr ""
-#~ "Lỗi không rõ : %d.\n"
-#~ "Thông tin: %s"
-
-#~ msgid "Invalid Groupname"
-#~ msgstr "Tên nhóm không hợp lệ"
-
-#~ msgid "Connection Closed"
-#~ msgstr "Kết nối bị đóng"
-
-#~ msgid "Waiting for reply..."
-#~ msgstr "Đợi hồi âm..."
-
-#~ msgid "TOC has come back from its pause. You may now send messages again."
-#~ msgstr ""
-#~ "TOC thôi trạng thái tạm ngừng. Bây giờ bạn có thể gửi tin nhẳn trở lại."
-
-#~ msgid "Password Change Successful"
-#~ msgstr "Đổi mật khẩu thành công"
-
-#~ msgid "Get Dir Info"
-#~ msgstr "Lấy thông tin danh bạ"
-
-#~ msgid "Set Dir Info"
-#~ msgstr "Lập thông tin danh bạ"
-
-#~ msgid "Could not open %s for writing!"
-#~ msgstr "Không thể mở %s để ghi !"
-
-#~ msgid "File transfer failed; other side probably canceled."
-#~ msgstr "Không truyền được tập tin; bên khác có thể đã hủy bỏ."
-
-#~ msgid "Could not connect for transfer."
-#~ msgstr "Không thể kết nối để truyền đi."
-
-#~ msgid "Could not write file header.  The file will not be transferred."
-#~ msgstr "Không thể ghi phần đầu tập tin. Tập tin sẽ không được truyền."
-
-#~ msgid "Save As..."
-#~ msgstr "Lưu dạng..."
-
-#~ msgid "%s requests %s to accept %d file: %s (%.2f %s)%s%s"
-#~ msgid_plural "%s requests %s to accept %d files: %s (%.2f %s)%s%s"
-#~ msgstr[0] "%s yêu cầu %s chấp nhận %d tập tin: %s (%.2f %s)%s%s"
-
-#~ msgid "%s requests you to send them a file"
-#~ msgstr "%s yêu cầu bạn gửi tập tin"
-
-#~ msgid "TOC Protocol Plugin"
-#~ msgstr "Phần bổ sung giao thức TOC"
-
-#~ msgid "User information for %s unavailable"
-#~ msgstr "Hiện không có thông tin người dùng về %s"
-
-#~ msgid "%s Options"
-#~ msgstr "%s Tùy chọn"
-
-#~ msgid "Proxy Options"
-#~ msgstr "Tùy chọn ủy nhiệm"
-
-#~ msgid "By log size"
-#~ msgstr "Theo kích cỡ bản ghi"
-
-#~ msgid "_Open Link in Browser"
-#~ msgstr "_Mở liên kết trong trình duyệt"
-
-#~ msgid "Smiley _Image"
-#~ msgstr "Ảnh cườ_i"
-
-#~ msgid "Smiley S_hortcut"
-#~ msgstr "Lối tắt _hình cười"
-
-#~ msgid "_Flash window when chat messages are received"
-#~ msgstr "Nhấp nhá_y cửa sổ khi nhận tin nhắn"
-
-#~ msgid "A group with the name already exists."
-#~ msgstr "Một nhóm tên đó đã có."
-
-#~ msgid "Primary Information"
-#~ msgstr "Thông tin chính"
-
-#~ msgid "Blood Type"
-#~ msgstr "Loại máu"
-
-#, fuzzy
-#~ msgid "Update information"
-#~ msgstr "Sửa đổi thông tin của tôi"
-
-#, fuzzy
-#~ msgid "Successed:"
-#~ msgstr "Tốc độ :"
-
-#~ msgid ""
-#~ "Setting custom faces is not currently supported. Please choose an image "
-#~ "from %s."
-#~ msgstr ""
-#~ "Hiện thời không hỗ trợ tính năng đặt mặt tự chọn. Hãy chọn một ảnh từ %s."
-
-#~ msgid "Invalid QQ Face"
-#~ msgstr "Mặt QQ không hợp lệ"
-
-#~ msgid "You rejected %d's request"
-#~ msgstr "Bạn đã từ chối yêu cầu của %d"
-
-#~ msgid "Reject request"
-#~ msgstr "Từ chối yêu cầu"
-
-#~ msgid "Add buddy with auth request failed"
-#~ msgstr "Không thêm được bạn chát với yêu cầu sự cho phép"
-
-#, fuzzy
-#~ msgid "Add into %d's buddy list"
-#~ msgstr "Không thể nạp danh sách bạn bè"
-
-#, fuzzy
-#~ msgid "QQ Number Error"
-#~ msgstr "Số QQ"
-
-#~ msgid "Group Description"
-#~ msgstr "Mô tả nhóm"
-
-#~ msgid "Auth"
-#~ msgstr "Phép"
-
-#~ msgid "Approve"
-#~ msgstr "Tán thành"
-
-#, fuzzy
-#~ msgid "Successed to join Qun %d, operated by admin %d"
-#~ msgstr "Quản trị %2$d đã từ chối yêu cầu tham gia nhóm %1$d của bạn"
-
-#, fuzzy
-#~ msgid "[%d] removed from Qun \"%d\""
-#~ msgstr "Bạn [%d] đã rời nhóm « %d »"
-
-#, fuzzy
-#~ msgid "[%d] added to Qun \"%d\""
-#~ msgstr "Bạn [%d] đã được thêm vào nhóm « %d »"
-
-#~ msgid "I am a member"
-#~ msgstr "Tôi là thành viên"
-
-#, fuzzy
-#~ msgid "I am requesting"
-#~ msgstr "Yêu cầu sai"
-
-#~ msgid "I am the admin"
-#~ msgstr "Tôi là quản trị"
-
-#~ msgid "Unknown status"
-#~ msgstr "Trạng thái không rõ"
-
-#, fuzzy
-#~ msgid "Remove from Qun"
-#~ msgstr "Bỏ nhóm"
-
-#~ msgid "You entered a group ID outside the acceptable range"
-#~ msgstr "Bạn đã gõ một ID nhóm nằm bên ngoài phạm vi hợp lệ"
-
-#~ msgid "Are you sure you want to leave this Qun?"
-#~ msgstr "Bạn chắc chắn muốn rời Qun này không?"
-
-#~ msgid "Do you want to approve the request?"
-#~ msgstr "Bạn có muốn tán thành yêu cầu không?"
-
-#, fuzzy
-#~ msgid "Change Qun member"
-#~ msgstr "Điện thoại"
-
-#, fuzzy
-#~ msgid "Change Qun information"
-#~ msgstr "Thông tin kệnh"
-
-#~ msgid "System Message"
-#~ msgstr "Thông điệp hệ thống"
-
-#~ msgid "<b>Last Login IP</b>: %s<br>\n"
-#~ msgstr "<b>IP đăng nhập cuối:</b> %s<br>\n"
-
-#~ msgid "<b>Last Login Time</b>: %s\n"
-#~ msgstr "<b>Thời gian đăng nhập cuối:</b> %s\n"
-
-#~ msgid "Set My Information"
-#~ msgstr "Đặt thông tin của tôi"
-
-#, fuzzy
-#~ msgid "Leave the QQ Qun"
-#~ msgstr "Để lại QQ Qun này"
-
-#~ msgid "Block this buddy"
-#~ msgstr "Chặn bạn chát này"
-
-#, fuzzy
-#~ msgid "Error password: %s"
-#~ msgstr "Lỗi khi thay đổi mật khẩu"
-
-#, fuzzy
-#~ msgid "Failed to connect all servers"
-#~ msgstr "Không kết nối được với máy phục vụ."
-
-#, fuzzy
-#~ msgid "Connecting server %s, retries %d"
-#~ msgstr ""
-#~ "Lỗi kết nối từ máy phục vụ %s:\n"
-#~ "%s"
-
-#, fuzzy
-#~ msgid "Do you approve the requestion?"
-#~ msgstr "Bạn có muốn tán thành yêu cầu không?"
-
-#, fuzzy
-#~ msgid "Do you add the buddy?"
-#~ msgstr "Bạn có muốn thêm bạn chát này không?"
-
-#, fuzzy
-#~ msgid "%s added you [%s] to buddy list"
-#~ msgstr "%s đã thêm bạn [%s] vào danh sách bạn bè của họ"
-
-#, fuzzy
-#~ msgid "QQ Budy"
-#~ msgstr "Bạn chát"
-
-#~ msgid "%s wants to add you [%s] as a friend"
-#~ msgstr "%s muốn thêm bạn [%s] như người bạn"
-
-#, fuzzy
-#~ msgid "%s is not in buddy list"
-#~ msgstr "%s không có trong danh sách bạn bè của bạn"
-
-#, fuzzy
-#~ msgid "Would you add?"
-#~ msgstr "Bạn có muốn thêm họ không?"
-
-#, fuzzy
-#~ msgid "QQ Server Notice"
-#~ msgstr "Cổng máy phục vụ"
-
-#, fuzzy
-#~ msgid "Network disconnected"
-#~ msgstr "Máy ở xa đã ngắt kết nối"
-
-#~ msgid "developer"
-#~ msgstr "nhà phát triển"
-
-#~ msgid "XMPP developer"
-#~ msgstr "Nhà phát triển XMPP"
-
-#~ msgid "Artists"
-#~ msgstr "Nghệ sĩ"
-
-#~ msgid ""
-#~ "You are using %s version %s.  The current version is %s.  You can get it "
-#~ "from <a href=\"%s\">%s</a><hr>"
-#~ msgstr ""
-#~ "Bạn đang sử dụng %s phiên bản %s. Phiên bản hiện thời là %s. Bạn có thể "
-#~ "lấy nó ở <a href=\"%s\">%s</a><hr>"
-
-#~ msgid "<b>ChangeLog:</b><br>%s"
-#~ msgstr "<b>Bản ghi thay đổi:</b><br>%s"
-
-#~ msgid "EOF while reading from resolver process"
-#~ msgstr "Gặp kết thúc tập tin khi đọc từ tiến trình giải quyết"
-
-#~ msgid "Your information has been updated"
-#~ msgstr "Thông tin của bạn đã được cập nhật"
-
-#~ msgid "Input your reason:"
-#~ msgstr "Gõ lý do :"
-
-#~ msgid "You have successfully removed a buddy"
-#~ msgstr "Bạn đã gỡ bỏ thành công một bạn chát"
-
-#~ msgid "You have successfully removed yourself from your friend's buddy list"
-#~ msgstr ""
-#~ "Bạn đã loại bỏ thành công bạn thân ra khỏi danh sách bạn bè của người bạn"
-
-#~ msgid "You have added %d to buddy list"
-#~ msgstr "Bạn đã thêm %d vào danh sách bạn bè"
-
-#~ msgid "Invalid QQid"
-#~ msgstr "QQid không hợp lệ"
-
-#~ msgid "Please enter external group ID"
-#~ msgstr "Hãy nhập ID nhóm bên ngoài"
-
-#~ msgid "Reason: %s"
-#~ msgstr "Lý do : %s"
-
-#~ msgid "Your request to join group %d has been approved by admin %d"
-#~ msgstr "Quản trị %2$d đã tán thành yêu cầu tham gia nhóm %1$d của bạn"
-
-#~ msgid "I am applying to join"
-#~ msgstr "Tôi muốn tham gia"
-
-#~ msgid "You have successfully left the group"
-#~ msgstr "Bạn đã rời thành công nhóm này"
-
-#~ msgid "QQ Group Auth"
-#~ msgstr "Phép nhóm QQ"
-
-#~ msgid "Your authorization request has been accepted by the QQ server"
-#~ msgstr "Máy phục vụ QQ đã chấp nhận yêu cầu sự cho phép của bạn"
-
-#~ msgid "Enter your reason:"
-#~ msgstr "Gõ lý do :"
-
-# Name: don't translate/Tên: đừng dịch
-#, fuzzy
-#~ msgid " Space"
-#~ msgstr "MySpace"
-
-#, fuzzy
-#~ msgid "<b>Real hostname</b>: %s: %d<br>\n"
-#~ msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
-
-#~ msgid "Show Login Information"
-#~ msgstr "Hiện thông tin đăng nhập"
-
-#~ msgid "Unable to login. Check debug log."
-#~ msgstr "Không thể đăng nhập, hãy kiểm tra sổ theo dõi gỡ lỗi"
-
-#, fuzzy
-#~ msgid "Failed room reply"
-#~ msgstr "Không đăng nhập được, không có đáp ứng"
-
-#~ msgid "User %s rejected your request"
-#~ msgstr "Người dùng %s đã từ chối yêu cầu của bạn"
-
-#~ msgid "User %s approved your request"
-#~ msgstr "Người dùng %s đã tán thành yêu cầu của bạn"
-
-#, fuzzy
-#~ msgid "Notice from: %s"
-#~ msgstr "Thông báo từ %s"
-
-#~ msgid "Error setting socket options"
-#~ msgstr "Lỗi đặt tùy chọn ổ cắm"
-
-#~ msgid ""
-#~ "Windows Live ID authentication: cannot find authenticate token in server "
-#~ "response"
-#~ msgstr ""
-#~ "Xác thực ID Windows Live: không tìm thấy hiệu bài xác thực trong đáp ứng "
-#~ "máy phục vụ"
-
-#~ msgid "Windows Live ID authentication Failed"
-#~ msgstr "Không xác thực được ID Windows Live"
-
-#~ msgid "Code [0x%02X]: %s"
-#~ msgstr "Mã [0x%02X]: %s"
-
-#~ msgid "Group Operation Error"
-#~ msgstr "Lỗi thao tác nhóm"
-
-#~ msgid "TCP Address"
-#~ msgstr "Địa chỉ TCP"
-
-#~ msgid "UDP Address"
-#~ msgstr "Địa chỉ UDP"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/ca-certs/Entrust.net_Secure_Server_CA.pem	Tue Oct 20 22:31:57 2009 +0000
@@ -0,0 +1,28 @@
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
+MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
+ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
+b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
+U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
+I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
+wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
+AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
+oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
+BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
+MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
+E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
+MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
+hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
+95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
+2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
--- a/share/ca-certs/Makefile.am	Wed Sep 30 21:31:04 2009 +0000
+++ b/share/ca-certs/Makefile.am	Tue Oct 20 22:31:57 2009 +0000
@@ -2,6 +2,7 @@
 		America_Online_Root_Certification_Authority_1.pem \
 		CAcert_Root.pem \
 		CAcert_Class3.pem \
+		Entrust.net_Secure_Server_CA.pem \
 		Equifax_Secure_CA.pem \
 		Equifax_Secure_Global_eBusiness_CA-1.pem \
 		GTE_CyberTrust_Global_Root.pem \