summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Lundblad <malu@pidgin.im>2009-10-15 21:25:07 +0000
committerMarcus Lundblad <malu@pidgin.im>2009-10-15 21:25:07 +0000
commit0e8cf1e2db7b6125aa0839f9c8a1e1611178910a (patch)
tree9c0d5e576a1ce5a814b186ec6fcc9254f6f4c3bb
parentfa11f5bd491fd6541d60585b4166368799c2b9af (diff)
parent84daf276dc79cf6e61bf8eeedf15034044a22894 (diff)
downloadpidgin-0e8cf1e2db7b6125aa0839f9c8a1e1611178910a.tar.gz
propagate from branch 'im.pidgin.pidgin' (head 033aa23c457fe4291cb093272be42a266fc21b78)
to branch 'im.pidgin.cpw.malu.ft_thumbnails' (head f3a82bce60b69e974e32a8c08cad15dddc0f92d8)
-rw-r--r--AUTHORS1
-rw-r--r--COPYRIGHT6
-rw-r--r--ChangeLog32
-rw-r--r--configure.ac17
-rw-r--r--doc/pidgin.1.in2
-rw-r--r--finch/gntaccount.c3
-rw-r--r--finch/gntblist.c2
-rw-r--r--finch/libgnt/gntbindable.h2
-rw-r--r--finch/libgnt/gntbox.c2
-rw-r--r--finch/libgnt/gntcolors.c9
-rw-r--r--finch/libgnt/gntentry.c2
-rw-r--r--finch/libgnt/gntfilesel.c5
-rw-r--r--finch/libgnt/gnttextview.c4
-rw-r--r--finch/libgnt/gntutils.c2
-rw-r--r--finch/plugins/gnttinyurl.c147
-rw-r--r--libpurple/account.c5
-rw-r--r--libpurple/blist.c16
-rw-r--r--libpurple/certificate.c4
-rw-r--r--libpurple/connection.c11
-rw-r--r--libpurple/dbus-server.c12
-rw-r--r--libpurple/dnsquery.c14
-rw-r--r--libpurple/dnsquery.h5
-rw-r--r--libpurple/dnssrv.c35
-rw-r--r--libpurple/ft.c2
-rw-r--r--libpurple/plugins/perl/common/Prpl.xs12
-rw-r--r--libpurple/plugins/perl/perl.c3
-rw-r--r--libpurple/plugins/ssl/ssl-gnutls.c7
-rw-r--r--libpurple/protocols/jabber/auth.c13
-rw-r--r--libpurple/protocols/jabber/bosh.c3
-rw-r--r--libpurple/protocols/jabber/buddy.c13
-rw-r--r--libpurple/protocols/jabber/chat.c144
-rw-r--r--libpurple/protocols/jabber/chat.h13
-rw-r--r--libpurple/protocols/jabber/google.c57
-rw-r--r--libpurple/protocols/jabber/google.h4
-rw-r--r--libpurple/protocols/jabber/jabber.c81
-rw-r--r--libpurple/protocols/jabber/jingle/content.c4
-rw-r--r--libpurple/protocols/jabber/jingle/jingle.c2
-rw-r--r--libpurple/protocols/jabber/parser.c17
-rw-r--r--libpurple/protocols/jabber/presence.c17
-rw-r--r--libpurple/protocols/jabber/roster.c4
-rw-r--r--libpurple/protocols/msn/contact.c36
-rw-r--r--libpurple/protocols/msn/nexus.c3
-rw-r--r--libpurple/protocols/msn/notification.c10
-rw-r--r--libpurple/protocols/msn/oim.c5
-rw-r--r--libpurple/protocols/msn/servconn.c20
-rw-r--r--libpurple/protocols/msn/servconn.h4
-rw-r--r--libpurple/protocols/msn/transaction.c9
-rw-r--r--libpurple/protocols/msn/transaction.h3
-rw-r--r--libpurple/protocols/msn/user.c5
-rw-r--r--libpurple/protocols/oscar/family_feedbag.c15
-rw-r--r--libpurple/protocols/yahoo/libymsg.c557
-rw-r--r--libpurple/protocols/yahoo/libymsg.h14
-rw-r--r--libpurple/protocols/yahoo/util.c3
-rw-r--r--libpurple/protocols/yahoo/yahoo_filexfer.c4
-rw-r--r--libpurple/protocols/yahoo/yahoo_friend.c43
-rw-r--r--libpurple/protocols/yahoo/yahoo_friend.h3
-rw-r--r--libpurple/server.c262
-rw-r--r--libpurple/tests/test_yahoo_util.c6
-rw-r--r--libpurple/util.c2
-rw-r--r--pidgin/gtkconv.c3
-rw-r--r--pidgin/gtkdialogs.c99
-rw-r--r--pidgin/gtkprefs.c2
-rw-r--r--pidgin/gtkutils.c39
-rw-r--r--pidgin/pixmaps/emotes/default/24/default.theme.in2
-rw-r--r--pidgin/pixmaps/emotes/small/16/small.theme.in2
-rw-r--r--pidgin/plugins/win32/winprefs/winprefs.c41
-rw-r--r--pidgin/plugins/xmppconsole.c1
-rw-r--r--pidgin/win32/nsis/pidgin-installer.nsi4
-rw-r--r--po/ChangeLog3
-rw-r--r--po/de.po70
-rw-r--r--po/sv.po278
-rw-r--r--po/vi.po2985
-rw-r--r--share/ca-certs/Entrust.net_Secure_Server_CA.pem28
-rw-r--r--share/ca-certs/Makefile.am1
74 files changed, 2354 insertions, 2942 deletions
diff --git a/AUTHORS b/AUTHORS
index 92de8cb238..dccdb13a2d 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -20,6 +20,7 @@ Sean Egan - Developer
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
diff --git a/COPYRIGHT b/COPYRIGHT
index 5d98ccb27a..5d05cd6e0b 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -275,6 +275,7 @@ Syd Logan
Lokheed
Norberto Lopes
Shlomi Loubaton
+Brian Lu
Uli Luckas
Matthew Luckie
Marcus Lundblad
@@ -405,11 +406,10 @@ Alceste Scalas
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
@@ -419,6 +419,8 @@ Torrey Searle
Peter Seebach
Don Seiler
Leonardo Serra
+Matteo Settenvini
+Colin Seymour
Jim Seymour
Javeed Shaikh
Joe Shaw
diff --git a/ChangeLog b/ChangeLog
index e091de4d16..b1680919f9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,12 +1,38 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
version 2.6.3 (??/??/20??):
- XMPP:
- * Fix a crash when attempting to validate an invalid JID.
-
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)
+ * Fix building the GnuTLS plugin with older versions of GnuTLS.
+ * Fix DNS TXT query resolution.
+
+ 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)
version 2.6.2 (09/05/2009):
libpurple:
diff --git a/configure.ac b/configure.ac
index 15cbb56a32..ea9a42b7cb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1773,6 +1773,23 @@ if test "x$enable_gnutls" = "xyes"; then
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")
diff --git a/doc/pidgin.1.in b/doc/pidgin.1.in
index dba79a75ad..81c7fea28a 100644
--- a/doc/pidgin.1.in
+++ b/doc/pidgin.1.in
@@ -628,6 +628,8 @@ Pidgin's active developers are:
.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)
diff --git a/finch/gntaccount.c b/finch/gntaccount.c
index 9addbb331b..ff72c310a8 100644
--- a/finch/gntaccount.c
+++ b/finch/gntaccount.c
@@ -166,8 +166,7 @@ save_account_cb(AccountEditDialog *dialog)
/* Alias */
value = gnt_entry_get_text(GNT_ENTRY(dialog->alias));
- if (value && *value)
- purple_account_set_alias(account, value);
+ purple_account_set_alias(account, value);
/* Remember password and password */
purple_account_set_remember_password(account,
diff --git a/finch/gntblist.c b/finch/gntblist.c
index fad3d27809..f4e48290a2 100644
--- a/finch/gntblist.c
+++ b/finch/gntblist.c
@@ -1940,7 +1940,7 @@ key_pressed(GntWidget *widget, const char *text, FinchBlist *ggblist)
} 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
diff --git a/finch/libgnt/gntbindable.h b/finch/libgnt/gntbindable.h
index 418ea41d25..04d806d2ec 100644
--- a/finch/libgnt/gntbindable.h
+++ b/finch/libgnt/gntbindable.h
@@ -166,7 +166,7 @@ gboolean gnt_bindable_check_key(GntBindable *bindable, const char *keys);
*
* @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.
diff --git a/finch/libgnt/gntbox.c b/finch/libgnt/gntbox.c
index 7fb38e6738..8b1b29cb66 100644
--- a/finch/libgnt/gntbox.c
+++ b/finch/libgnt/gntbox.c
@@ -687,8 +687,8 @@ void gnt_box_set_title(GntBox *b, const char *title)
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)
diff --git a/finch/libgnt/gntcolors.c b/finch/libgnt/gntcolors.c
index c8bfa0929b..ceaf895c95 100644
--- a/finch/libgnt/gntcolors.c
+++ b/finch/libgnt/gntcolors.c
@@ -208,8 +208,10 @@ void gnt_colors_parse(GKeyFile *kfile)
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 @@ void gnt_color_pairs_parse(GKeyFile *kfile)
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 @@ void gnt_color_pairs_parse(GKeyFile *kfile)
else if (strcmp(key, "urgent") == 0)
type = GNT_COLOR_URGENT;
else {
+ g_strfreev(list);
g_free(key);
continue;
}
diff --git a/finch/libgnt/gntentry.c b/finch/libgnt/gntentry.c
index 85e06f351d..4cc9d23dd8 100644
--- a/finch/libgnt/gntentry.c
+++ b/finch/libgnt/gntentry.c
@@ -495,7 +495,7 @@ suggest_show(GntBindable *bind, GList *null)
{
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);
diff --git a/finch/libgnt/gntfilesel.c b/finch/libgnt/gntfilesel.c
index 7187315667..abf620a403 100644
--- a/finch/libgnt/gntfilesel.c
+++ b/finch/libgnt/gntfilesel.c
@@ -176,9 +176,13 @@ process_path(const char *path)
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 @@ gnt_file_sel_init(GTypeInstance *instance, gpointer class)
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);
diff --git a/finch/libgnt/gnttextview.c b/finch/libgnt/gnttextview.c
index 1a1354c261..77ade737a2 100644
--- a/finch/libgnt/gnttextview.c
+++ b/finch/libgnt/gnttextview.c
@@ -767,6 +767,7 @@ int gnt_text_view_tag_change(GntTextView *view, const char *name, const char *te
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 @@ int gnt_text_view_tag_change(GntTextView *view, const char *name, const char *te
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 */
diff --git a/finch/libgnt/gntutils.c b/finch/libgnt/gntutils.c
index c6712a15dc..171e2c04fb 100644
--- a/finch/libgnt/gntutils.c
+++ b/finch/libgnt/gntutils.c
@@ -374,6 +374,7 @@ void gnt_util_parse_widgets(const char *string, int num, ...)
gnt_widget_from_xmlnode(node, data, num);
xmlFreeDoc(doc);
+ xmlFreeParserCtxt(ctxt);
xmlCleanupParser();
va_end(list);
g_free(data);
@@ -470,6 +471,7 @@ gboolean gnt_util_parse_xhtml_to_textview(const char *string, GntTextView *tv)
xmlFreeDoc(doc);
ret = TRUE;
}
+ xmlFreeParserCtxt(ctxt);
xmlCleanupParser();
return ret;
#endif
diff --git a/finch/plugins/gnttinyurl.c b/finch/plugins/gnttinyurl.c
index 553d3120df..4d70de1d03 100644
--- a/finch/plugins/gnttinyurl.c
+++ b/finch/plugins/gnttinyurl.c
@@ -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 @@ typedef struct
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 @@ badentity(const char *c)
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 @@ static GList *extract_urls(char *text) {
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 @@ static GList *extract_urls(char *text) {
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 @@ static void url_fetched(PurpleUtilFetchUrlData *url_data, gpointer cb_data,
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 @@ static void free_urls(gpointer data, gpointer null)
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 @@ static gboolean receiving_msg(PurpleAccount *account, char **sender, char **mess
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 @@ static gboolean receiving_msg(PurpleAccount *account, char **sender, char **mess
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) {
- int c;
- GList *urls, *iter;
- FinchConv *fconv = FINCH_CONV(conv);
- GntTextView *tv = GNT_TEXT_VIEW(fconv->tv);
+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_RECV) || urls == NULL)
+ 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;
+ FinchConv *fconv = FINCH_CONV(conv);
+ GntTextView *tv = GNT_TEXT_VIEW(fconv->tv);
+
for (iter = urls, c = 0; iter; iter = iter->next) {
int i;
CbInfo *cbdata;
@@ -312,7 +330,6 @@ static void received_msg(PurpleAccount *account, char *sender, char *message,
g_free(url);
}
g_list_free(urls);
- purple_conversation_set_data(conv, "TinyURLs", NULL);
}
static void
@@ -324,20 +341,75 @@ free_conv_urls(PurpleConversation *conv)
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 @@ plugin_load(PurplePlugin *plugin) {
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 @@ static PurplePluginInfo info =
"Richard Nelson <wabz@whatsbeef.net>",
PURPLE_WEBSITE,
plugin_load,
- NULL,
+ plugin_unload,
NULL,
NULL,
NULL,
diff --git a/libpurple/account.c b/libpurple/account.c
index af2397ea38..8b5bc238dd 100644
--- a/libpurple/account.c
+++ b/libpurple/account.c
@@ -1052,7 +1052,10 @@ purple_account_destroy(PurpleAccount *account)
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);
diff --git a/libpurple/blist.c b/libpurple/blist.c
index 09faeb676d..6749cab811 100644
--- a/libpurple/blist.c
+++ b/libpurple/blist.c
@@ -2009,17 +2009,13 @@ void purple_blist_add_group(PurpleGroup *group, PurpleBlistNode *node)
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)
- return;
+ if (gnode == node) {
+ if (!purplebuddylist->root)
+ node = NULL;
+ else
+ return;
+ }
if (purple_find_group(group->name)) {
/* This is just being moved */
diff --git a/libpurple/certificate.c b/libpurple/certificate.c
index 8c1f85d067..83a0ad226a 100644
--- a/libpurple/certificate.c
+++ b/libpurple/certificate.c
@@ -97,8 +97,8 @@ invalidity_reason_to_string(PurpleCertificateInvalidityFlags flag)
"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.");
diff --git a/libpurple/connection.c b/libpurple/connection.c
index 59ed00f32c..3287e6876b 100644
--- a/libpurple/connection.c
+++ b/libpurple/connection.c
@@ -52,10 +52,7 @@ static gboolean
send_keepalive(gpointer data)
{
PurpleConnection *gc = data;
- PurplePluginProtocolInfo *prpl_info = NULL;
-
- if (gc == NULL)
- return TRUE;
+ PurplePluginProtocolInfo *prpl_info;
/* Only send keep-alives if we haven't heard from the
* server in a while.
@@ -63,12 +60,8 @@ send_keepalive(gpointer data)
if ((time(NULL) - gc->last_received) < KEEPALIVE_INTERVAL)
return TRUE;
- if (gc->prpl == NULL)
- return TRUE;
-
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
-
- if (prpl_info && prpl_info->keepalive)
+ if (prpl_info->keepalive)
prpl_info->keepalive(gc);
return TRUE;
diff --git a/libpurple/dbus-server.c b/libpurple/dbus-server.c
index efe59770f2..9fe0dccbbe 100644
--- a/libpurple/dbus-server.c
+++ b/libpurple/dbus-server.c
@@ -126,8 +126,10 @@ purple_dbus_pointer_to_id(gconstpointer node)
gint id = GPOINTER_TO_INT(g_hash_table_lookup(map_node_id, node));
if ((id == 0) && (node != NULL))
{
- purple_debug_warning("dbus",
- "Need to register an object with the dbus subsystem. (If you are not a developer, please ignore this message.)\n");
+ if (purple_debug_is_verbose())
+ purple_debug_warning("dbus",
+ "Need to register an object with the dbus subsystem."
+ " (If you are not a developer, please ignore this message.)\n");
return 0;
}
return id;
@@ -795,7 +797,11 @@ purple_dbus_signal_emit_purple(const char *name, int num_values,
dbus_message_iter_init_append(signal, &iter);
if (purple_dbus_message_append_purple_values(&iter, num_values, values, vargs))
- purple_debug_warning("dbus", "The signal \"%s\" caused some dbus error. (If you are not a developer, please ignore this message.)\n", name);
+ if (purple_debug_is_verbose())
+ purple_debug_warning("dbus",
+ "The signal \"%s\" caused some dbus error."
+ " (If you are not a developer, please ignore this message.)\n",
+ name);
dbus_connection_send(purple_dbus_connection, signal, NULL);
diff --git a/libpurple/dnsquery.c b/libpurple/dnsquery.c
index 6f02c8f893..baf7a18730 100644
--- a/libpurple/dnsquery.c
+++ b/libpurple/dnsquery.c
@@ -328,6 +328,8 @@ purple_dnsquery_resolver_run(int child_out, int child_in, gboolean show_debug)
printf("dns[%d] Error: getaddrinfo returned %d\n",
getpid(), rc);
dns_params.hostname[0] = '\0';
+ g_free(hostname);
+ hostname = NULL;
continue;
}
tmp = res;
@@ -774,11 +776,8 @@ dns_thread(gpointer data)
if (!dns_str_is_ascii(query_data->hostname)) {
rc = purple_network_convert_idn_to_ascii(query_data->hostname, &hostname);
if (rc != 0) {
- /* FIXME: Dirty 2.6.0 string freeze hack */
- char tmp[8];
- g_snprintf(tmp, sizeof(tmp), "%d", rc);
- query_data->error_message = g_strdup_printf(_("Error resolving %s:\n%s"),
- query_data->hostname, tmp);
+ query_data->error_message = g_strdup_printf(_("Error converting %s "
+ "to punycode: %d"), query_data->hostname, rc);
/* back to main thread */
purple_timeout_add(0, dns_main_thread_cb, query_data);
return 0;
@@ -918,7 +917,6 @@ resolve_host(gpointer data)
PurpleDnsQueryData *query_data;
struct sockaddr_in sin;
GSList *hosts = NULL;
- char *hostname;
query_data = data;
query_data->timeout = 0;
@@ -931,6 +929,7 @@ resolve_host(gpointer data)
if (!inet_aton(query_data->hostname, &sin.sin_addr)) {
struct hostent *hp;
+ gchar *hostname;
#ifdef USE_IDN
if (!dns_str_is_ascii(query_data->hostname)) {
int ret = purple_network_convert_idn_to_ascii(query_data->hostname,
@@ -951,16 +950,17 @@ resolve_host(gpointer data)
g_snprintf(message, sizeof(message), _("Error resolving %s: %d"),
query_data->hostname, h_errno);
purple_dnsquery_failed(query_data, message);
+ g_free(hostname);
return FALSE;
}
memset(&sin, 0, sizeof(struct sockaddr_in));
memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length);
sin.sin_family = hp->h_addrtype;
+ g_free(hostname);
} else
sin.sin_family = AF_INET;
sin.sin_port = htons(query_data->port);
- g_free(hostname);
hosts = g_slist_append(hosts, GINT_TO_POINTER(sizeof(sin)));
hosts = g_slist_append(hosts, g_memdup(&sin, sizeof(sin)));
diff --git a/libpurple/dnsquery.h b/libpurple/dnsquery.h
index f03ac23b64..d68286414c 100644
--- a/libpurple/dnsquery.h
+++ b/libpurple/dnsquery.h
@@ -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;
/**
diff --git a/libpurple/dnssrv.c b/libpurple/dnssrv.c
index 82b1f0deaa..041dc5c71f 100644
--- a/libpurple/dnssrv.c
+++ b/libpurple/dnssrv.c
@@ -361,8 +361,12 @@ end:
/* 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 @@ resolved(gpointer data, gint source, PurpleInputCondition cond)
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 length: %s\n", g_strerror(errno));
+ size = 0;
+ 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;
- g_free(res);
+ 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 @@ purple_srv_resolve(const char *protocol, const char *transport, const char *doma
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 @@ PurpleSrvQueryData *purple_txt_resolve(const char *owner, const char *domain, Pu
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");
diff --git a/libpurple/ft.c b/libpurple/ft.c
index b751d0ccc3..13102c5bbe 100644
--- a/libpurple/ft.c
+++ b/libpurple/ft.c
@@ -1038,7 +1038,7 @@ do_transfer(PurpleXfer *xfer)
* watcher.
*/
if (xfer->watcher != 0) {
- purple_timeout_remove(xfer->watcher);
+ purple_input_remove(xfer->watcher);
xfer->watcher = 0;
}
diff --git a/libpurple/plugins/perl/common/Prpl.xs b/libpurple/plugins/perl/common/Prpl.xs
index ec535ac806..765ce5d41a 100644
--- a/libpurple/plugins/perl/common/Prpl.xs
+++ b/libpurple/plugins/perl/common/Prpl.xs
@@ -62,11 +62,15 @@ purple_prpl_send_raw(gc, str)
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
diff --git a/libpurple/plugins/perl/perl.c b/libpurple/plugins/perl/perl.c
index 89942e9a8d..7fbafb65a4 100644
--- a/libpurple/plugins/perl/perl.c
+++ b/libpurple/plugins/perl/perl.c
@@ -621,6 +621,9 @@ destroy_perl_plugin(PurplePlugin *plugin)
g_free(gps);
plugin->info->extra_info = NULL;
}
+
+ g_free(plugin->info);
+ plugin->info = NULL;
}
}
diff --git a/libpurple/plugins/ssl/ssl-gnutls.c b/libpurple/plugins/ssl/ssl-gnutls.c
index 0d6655c75a..3b9b08d3ff 100644
--- a/libpurple/plugins/ssl/ssl-gnutls.c
+++ b/libpurple/plugins/ssl/ssl-gnutls.c
@@ -698,9 +698,8 @@ x509_certificate_signed_by(PurpleCertificate * crt,
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 @@ x509_certificate_signed_by(PurpleCertificate * crt,
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 @@ x509_certificate_signed_by(PurpleCertificate * crt,
"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
diff --git a/libpurple/protocols/jabber/auth.c b/libpurple/protocols/jabber/auth.c
index 1e57a7f635..60ca6592b8 100644
--- a/libpurple/protocols/jabber/auth.c
+++ b/libpurple/protocols/jabber/auth.c
@@ -692,7 +692,8 @@ void jabber_auth_start_old(JabberStream *js)
JabberIq *iq;
xmlnode *query, *username;
- /* We can end up here without encryption if the server doesn't support
+ /*
+ * We can end up here without encryption if the server doesn't support
* <stream:features/> and we're not using old-style SSL. If the user
* is requiring SSL/TLS, we need to enforce it.
*/
@@ -704,6 +705,16 @@ void jabber_auth_start_old(JabberStream *js)
return;
}
+ /*
+ * IQ Auth doesn't have support for resource binding, so we need to pick a
+ * default resource so it will work properly. jabberd14 throws an error and
+ * iChat server just fails silently.
+ */
+ if (!js->user->resource || *js->user->resource == '\0') {
+ g_free(js->user->resource);
+ js->user->resource = g_strdup("Home");
+ }
+
#ifdef HAVE_CYRUS_SASL
/* If we have Cyrus SASL, then passwords will have been set
* to OPTIONAL for this protocol. So, we need to do our own
diff --git a/libpurple/protocols/jabber/bosh.c b/libpurple/protocols/jabber/bosh.c
index f7438ad99c..4868064915 100644
--- a/libpurple/protocols/jabber/bosh.c
+++ b/libpurple/protocols/jabber/bosh.c
@@ -401,7 +401,8 @@ jabber_bosh_connection_send(PurpleBOSHConnection *conn,
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) {
diff --git a/libpurple/protocols/jabber/buddy.c b/libpurple/protocols/jabber/buddy.c
index f2a8853eb0..62e598303f 100644
--- a/libpurple/protocols/jabber/buddy.c
+++ b/libpurple/protocols/jabber/buddy.c
@@ -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 @@ static void jabber_vcard_parse(JabberStream *js, const char *from,
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 @@ static GList *jabber_buddy_menu(PurpleBuddy *buddy)
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
*
diff --git a/libpurple/protocols/jabber/chat.c b/libpurple/protocols/jabber/chat.c
index b1db544f36..1f43dda4c2 100644
--- a/libpurple/protocols/jabber/chat.c
+++ b/libpurple/protocols/jabber/chat.c
@@ -99,6 +99,9 @@ JabberChat *jabber_chat_find(JabberStream *js, const char *room,
{
JabberChat *chat = NULL;
+ g_return_val_if_fail(room != NULL, NULL);
+ g_return_val_if_fail(server != NULL, NULL);
+
if(NULL != js->chats)
{
char *room_jid = g_strdup_printf("%s@%s", room, server);
@@ -206,19 +209,98 @@ static void insert_in_hash_table(gpointer key, gpointer value, gpointer user_dat
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;
- xmlnode *presence, *x;
- char *tmp, *room_jid, *full_jid;
- JabberStream *js = gc->proto_data;
- PurplePresence *gpresence;
+ 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;
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");
@@ -253,51 +335,23 @@ void jabber_chat_join(PurpleConnection *gc, GHashTable *data)
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);
-
- 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);
+ if (jid == NULL) {
+ /* TODO: Error message */
- 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)
diff --git a/libpurple/protocols/jabber/chat.h b/libpurple/protocols/jabber/chat.h
index 466bafb0c5..3caf61733b 100644
--- a/libpurple/protocols/jabber/chat.h
+++ b/libpurple/protocols/jabber/chat.h
@@ -57,6 +57,19 @@ typedef struct _JabberChat {
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 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);
diff --git a/libpurple/protocols/jabber/google.c b/libpurple/protocols/jabber/google.c
index 5619881289..415c7f4d5d 100644
--- a/libpurple/protocols/jabber/google.c
+++ b/libpurple/protocols/jabber/google.c
@@ -31,6 +31,7 @@
#include "jabber.h"
#include "presence.h"
#include "iq.h"
+#include "chat.h"
#include "jingle/jingle.h"
@@ -95,21 +96,22 @@ google_session_send_candidates(PurpleMedia *media, gchar *session_id,
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, *pref, *username, *password;
+ gchar *ip, *port, *username, *password;
+ gchar pref[16];
PurpleMediaCandidateType type;
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);
@@ -123,9 +125,8 @@ google_session_send_candidates(PurpleMedia *media, gchar *session_id,
ip = purple_media_candidate_get_ip(transport);
port = g_strdup_printf("%d",
purple_media_candidate_get_port(transport));
- pref = g_strdup_printf("%f",
- purple_media_candidate_get_priority(transport)
- /1000.0);
+ g_ascii_dtostr(pref, 16,
+ purple_media_candidate_get_priority(transport) / 1000.0);
username = purple_media_candidate_get_username(transport);
password = purple_media_candidate_get_password(transport);
type = purple_media_candidate_get_candidate_type(transport);
@@ -163,12 +164,12 @@ google_session_send_candidates(PurpleMedia *media, gchar *session_id,
g_free(ip);
g_free(port);
- g_free(pref);
g_free(username);
g_free(password);
jabber_iq_send(iq);
}
+ purple_media_candidate_list_free(candidates);
}
static void
@@ -1425,3 +1426,43 @@ jabber_google_send_jingle_info(JabberStream *js)
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);
+}
diff --git a/libpurple/protocols/jabber/google.h b/libpurple/protocols/jabber/google.h
index ae6d21cef5..8489a63028 100644
--- a/libpurple/protocols/jabber/google.h
+++ b/libpurple/protocols/jabber/google.h
@@ -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 @@ void jabber_google_handle_jingle_info(JabberStream *js, const char *from,
xmlnode *child);
void jabber_google_send_jingle_info(JabberStream *js);
+void google_buddy_node_chat(PurpleBlistNode *node, gpointer data);
+
#endif /* PURPLE_JABBER_GOOGLE_H_ */
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
index d4cd5804d8..5629fe5f15 100644
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -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 @@ static char *jabber_prep_resource(char *input) {
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 @@ void jabber_stream_features_parse(JabberStream *js, xmlnode *packet)
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 @@ void jabber_process_packet(JabberStream *js, xmlnode **packet)
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);
@@ -1077,53 +1079,33 @@ jabber_register_cb(JabberRegisterCBData *cbdata, PurpleRequestFields *fields)
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);
}
@@ -1570,6 +1552,8 @@ void jabber_close(PurpleConnection *gc)
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:
@@ -1593,15 +1577,6 @@ void jabber_stream_set_state(JabberStream *js, JabberStreamState state)
if(js->protocol_version == JABBER_PROTO_0_9 && js->registration) {
jabber_register_start(js);
} else if(js->auth_type == JABBER_AUTH_IQ_AUTH) {
- /* with dreamhost's xmpp server at least, you have to
- specify a resource or you will get a "406: Not
- Acceptable"
- */
- if(!js->user->resource || *js->user->resource == '\0') {
- g_free(js->user->resource);
- js->user->resource = g_strdup("Home");
- }
-
jabber_auth_start_old(js);
}
break;
@@ -1616,6 +1591,8 @@ void jabber_stream_set_state(JabberStream *js, JabberStreamState state)
purple_connection_set_state(js->gc, PURPLE_CONNECTED);
break;
}
+
+#undef JABBER_CONNECT_STEPS
}
char *jabber_get_next_id(JabberStream *js)
diff --git a/libpurple/protocols/jabber/jingle/content.c b/libpurple/protocols/jabber/jingle/content.c
index f57fce6255..c049410d06 100644
--- a/libpurple/protocols/jabber/jingle/content.c
+++ b/libpurple/protocols/jabber/jingle/content.c
@@ -330,8 +330,8 @@ jingle_content_get_transport(JingleContent *content)
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);
}
diff --git a/libpurple/protocols/jabber/jingle/jingle.c b/libpurple/protocols/jabber/jingle/jingle.c
index 99c1e6b08a..8c5fc2bebe 100644
--- a/libpurple/protocols/jabber/jingle/jingle.c
+++ b/libpurple/protocols/jabber/jingle/jingle.c
@@ -115,7 +115,7 @@ jingle_handle_content_modify(JingleSession *session, xmlnode *jingle)
const gchar *creator = xmlnode_get_attrib(content, "creator");
JingleContent *local_content = jingle_session_find_content(session, name, creator);
- if (content != NULL) {
+ if (local_content != NULL) {
const gchar *senders = xmlnode_get_attrib(content, "senders");
gchar *local_senders = jingle_content_get_senders(local_content);
if (strcmp(senders, local_senders))
diff --git a/libpurple/protocols/jabber/parser.c b/libpurple/protocols/jabber/parser.c
index e2115c6412..9ab7a24176 100644
--- a/libpurple/protocols/jabber/parser.c
+++ b/libpurple/protocols/jabber/parser.c
@@ -62,11 +62,6 @@ jabber_parser_element_start_libxml(void *user_data,
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 @@ void jabber_parser_process(JabberStream *js, const char *buf, int len)
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);
+ }
}
diff --git a/libpurple/protocols/jabber/presence.c b/libpurple/protocols/jabber/presence.c
index bb88c1189e..2080e595ad 100644
--- a/libpurple/protocols/jabber/presence.c
+++ b/libpurple/protocols/jabber/presence.c
@@ -403,19 +403,20 @@ jabber_vcard_parse_avatar(JabberStream *js, const char *from,
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);
}
}
diff --git a/libpurple/protocols/jabber/roster.c b/libpurple/protocols/jabber/roster.c
index e13df65ab0..7f2b77b1f4 100644
--- a/libpurple/protocols/jabber/roster.c
+++ b/libpurple/protocols/jabber/roster.c
@@ -229,7 +229,7 @@ void jabber_roster_parse(JabberStream *js, const char *from,
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;
@@ -354,7 +354,7 @@ void jabber_roster_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
}
/* Adding a chat room or a chat buddy to the roster is *not* supported. */
- if (jabber_chat_find(js, jid->node, jid->domain) != NULL) {
+ if (jid->node && jabber_chat_find(js, jid->node, jid->domain) != NULL) {
/*
* This is the same thing Bonjour does. If it causes problems, move
* it to an idle callback.
diff --git a/libpurple/protocols/msn/contact.c b/libpurple/protocols/msn/contact.c
index fc9e160832..c214c30f0d 100644
--- a/libpurple/protocols/msn/contact.c
+++ b/libpurple/protocols/msn/contact.c
@@ -206,6 +206,7 @@ msn_contact_request_cb(MsnSoapMessage *req, MsnSoapMessage *resp,
"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 @@ msn_parse_each_member(MsnSession *session, xmlnode *member, const char *node,
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 @@ msn_parse_each_member(MsnSession *session, xmlnode *member, const char *node,
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 @@ msn_parse_each_member(MsnSession *session, xmlnode *member, const char *node,
g_free(type);
g_free(member_id);
g_free(invite);
+ g_free(display_text);
}
static void
@@ -1417,12 +1426,20 @@ msn_update_contact(MsnSession *session, const char *passport, MsnContactUpdateTy
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 @@ msn_update_contact(MsnSession *session, const char *passport, MsnContactUpdateTy
g_return_if_reached();
}
-
-
state = msn_callback_state_new(session);
state->body = xmlnode_from_str(MSN_CONTACT_UPDATE_TEMPLATE, -1);
@@ -1465,14 +1480,13 @@ msn_update_contact(MsnSession *session, const char *passport, MsnContactUpdateTy
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);
diff --git a/libpurple/protocols/msn/nexus.c b/libpurple/protocols/msn/nexus.c
index 6707a7f627..85147ddd8c 100644
--- a/libpurple/protocols/msn/nexus.c
+++ b/libpurple/protocols/msn/nexus.c
@@ -338,8 +338,10 @@ nexus_parse_collection(MsnNexus *nexus, int id, xmlnode *collection)
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 @@ nexus_got_update_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
}
g_free(ud);
+ g_free(key);
}
void
diff --git a/libpurple/protocols/msn/notification.c b/libpurple/protocols/msn/notification.c
index 9aef684904..38acf46ac3 100644
--- a/libpurple/protocols/msn/notification.c
+++ b/libpurple/protocols/msn/notification.c
@@ -583,6 +583,7 @@ msn_notification_send_fqy(MsnSession *session,
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 @@ update_contact_network(MsnSession *session, const char *passport, MsnNetwork net
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 @@ fqy_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
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 @@ iln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
}
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 @@ nln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
if (msn_user_set_friendly_name(user, friendly))
{
- serv_got_alias(gc, passport, friendly);
msn_update_contact(session, passport, MSN_UPDATE_DISPLAY, friendly);
}
diff --git a/libpurple/protocols/msn/oim.c b/libpurple/protocols/msn/oim.c
index ddd36c45ca..ee938ddfde 100644
--- a/libpurple/protocols/msn/oim.c
+++ b/libpurple/protocols/msn/oim.c
@@ -373,6 +373,7 @@ msn_oim_send_read_cb(MsnSoapMessage *request, MsnSoapMessage *response,
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 @@ msn_oim_send_read_cb(MsnSoapMessage *request, MsnSoapMessage *response,
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 @@ msn_oim_send_read_cb(MsnSoapMessage *request, MsnSoapMessage *response,
}
}
}
+
+ if (msg)
+ msn_oim_free_send_req(msg);
}
void
diff --git a/libpurple/protocols/msn/servconn.c b/libpurple/protocols/msn/servconn.c
index 1d57865a06..28a9226ca6 100644
--- a/libpurple/protocols/msn/servconn.c
+++ b/libpurple/protocols/msn/servconn.c
@@ -86,7 +86,7 @@ msn_servconn_destroy(MsnServConn *servconn)
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 @@ msn_servconn_disconnect(MsnServConn *servconn)
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 @@ msn_servconn_disconnect(MsnServConn *servconn)
static gboolean
servconn_idle_timeout_cb(MsnServConn *servconn)
{
- msn_servconn_disconnect(servconn);
servconn->timeout_handle = 0;
+ msn_servconn_disconnect(servconn);
return FALSE;
}
@@ -308,7 +308,7 @@ static void
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 @@ read_cb(gpointer data, gint source, PurpleInputCondition cond)
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 @@ void msn_servconn_process_data(MsnServConn *servconn)
servconn->processing = FALSE;
- if (servconn->wasted)
+ if (servconn->wasted) {
msn_servconn_destroy(servconn);
+ servconn = NULL;
+ }
g_free(old_rx_buf);
+ return servconn;
}
#if 0
diff --git a/libpurple/protocols/msn/servconn.h b/libpurple/protocols/msn/servconn.h
index 6023a7cd04..70a9cbb3ad 100644
--- a/libpurple/protocols/msn/servconn.h
+++ b/libpurple/protocols/msn/servconn.h
@@ -178,8 +178,10 @@ void msn_servconn_got_error(MsnServConn *servconn, MsnServConnError error,
* 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
diff --git a/libpurple/protocols/msn/transaction.c b/libpurple/protocols/msn/transaction.c
index 0c490179a3..936f665696 100644
--- a/libpurple/protocols/msn/transaction.c
+++ b/libpurple/protocols/msn/transaction.c
@@ -59,6 +59,9 @@ msn_transaction_destroy(MsnTransaction *trans)
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 @@ msn_transaction_set_data(MsnTransaction *trans, void *data)
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)
diff --git a/libpurple/protocols/msn/transaction.h b/libpurple/protocols/msn/transaction.h
index 98bffc61cc..61181dd93d 100644
--- a/libpurple/protocols/msn/transaction.h
+++ b/libpurple/protocols/msn/transaction.h
@@ -48,6 +48,8 @@ struct _MsnTransaction
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_unqueue_cmd(MsnTransaction *trans, MsnCmdProc *cmdproc);
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);
diff --git a/libpurple/protocols/msn/user.c b/libpurple/protocols/msn/user.c
index de4e4aabd0..741989b616 100644
--- a/libpurple/protocols/msn/user.c
+++ b/libpurple/protocols/msn/user.c
@@ -183,12 +183,15 @@ msn_user_set_friendly_name(MsnUser *user, const char *name)
{
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;
}
diff --git a/libpurple/protocols/oscar/family_feedbag.c b/libpurple/protocols/oscar/family_feedbag.c
index 0ef5370068..9ce98b3bb2 100644
--- a/libpurple/protocols/oscar/family_feedbag.c
+++ b/libpurple/protocols/oscar/family_feedbag.c
@@ -135,13 +135,18 @@ static struct aim_ssi_item *aim_ssi_itemlist_add(struct aim_ssi_item **list, con
}
} while (exists);
}
- } else if (type == AIM_SSI_TYPE_ICONINFO) {
+ } else if (new->gid == 0x0000) {
+ /*
+ * This is weird, but apparently items in the root group can't
+ * have a buddy ID equal to any group ID. You'll get error
+ * 0x0003 when trying to add, which is "item already exists"
+ */
if (new->bid == 0xFFFF) {
do {
new->bid += 0x0001;
exists = FALSE;
for (cur = *list; cur != NULL; cur = cur->next)
- if ((cur->bid >= new->bid) || (cur->gid >= new->bid)) {
+ if (cur->bid == new->bid || cur->gid == new->bid) {
exists = TRUE;
break;
}
@@ -153,7 +158,7 @@ static struct aim_ssi_item *aim_ssi_itemlist_add(struct aim_ssi_item **list, con
new->bid += 0x0001;
exists = FALSE;
for (cur = *list; cur != NULL; cur = cur->next)
- if ((cur->bid == new->bid) && (cur->gid == new->gid)) {
+ if (cur->bid == new->bid && cur->gid == new->gid) {
exists = TRUE;
break;
}
@@ -687,10 +692,6 @@ int aim_ssi_cleanlist(OscarData *od)
cur = cur->next;
}
- /* Check if the master group is empty */
- if ((cur = aim_ssi_itemlist_find(od->ssi.local, 0x0000, 0x0000)) && (!cur->data))
- aim_ssi_itemlist_del(&od->ssi.local, cur);
-
/* If we've made any changes then sync our list with the server's */
return aim_ssi_sync(od);
}
diff --git a/libpurple/protocols/yahoo/libymsg.c b/libpurple/protocols/yahoo/libymsg.c
index 6d9c07d1f7..dae74368e5 100644
--- a/libpurple/protocols/yahoo/libymsg.c
+++ b/libpurple/protocols/yahoo/libymsg.c
@@ -153,7 +153,7 @@ static void yahoo_process_status(PurpleConnection *gc, struct yahoo_packet *pkt)
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 @@ static void yahoo_process_status(PurpleConnection *gc, struct yahoo_packet *pkt)
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 @@ static void yahoo_process_status(PurpleConnection *gc, struct yahoo_packet *pkt)
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 @@ static void yahoo_process_status(PurpleConnection *gc, struct yahoo_packet *pkt)
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 @@ static void yahoo_process_list_15(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_list_15(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_list_15(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_list_15(PurpleConnection *gc, struct yahoo_packet *pkt
}
g_free(norm_bud);
-
- protocol = 0;
+ norm_bud=NULL;
+ fed = YAHOO_FEDERATION_NONE;
stealth = 0;
g_free(temp);
temp = NULL;
@@ -573,8 +590,8 @@ static void yahoo_process_list_15(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_notify(PurpleConnection *gc, struct yahoo_packet *pkt,
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 @@ static void yahoo_process_notify(PurpleConnection *gc, struct yahoo_packet *pkt,
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 @@ static void yahoo_process_notify(PurpleConnection *gc, struct yahoo_packet *pkt,
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);
- }
- else {
- if (*stat == '1')
- serv_got_typing(gc, from, 0, PURPLE_TYPING);
- else
- serv_got_typing_stopped(gc, 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;
}
+
+ 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 @@ struct _yahoo_im {
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 @@ static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt
/* 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 @@ static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt
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 @@ static void yahoo_process_message(PurpleConnection *gc, struct yahoo_packet *pkt
}
}
+ 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 @@ struct yahoo_add_request {
PurpleConnection *gc;
char *id;
char *who;
- int protocol;
+ YahooFederation fed;
};
static void
@@ -1156,16 +1189,24 @@ yahoo_buddy_add_authorize_cb(gpointer data)
YahooData *yd = add_req->gc->proto_data;
const char *who = add_req->who;
- if (add_req->protocol == 2)
- 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);
+ if (add_req->fed) {
+ who += 4;
+ 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 @@ yahoo_buddy_add_deny_cb(struct yahoo_add_request *add_req, const char *msg)
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 @@ static void yahoo_buddy_auth_req_15(PurpleConnection *gc, struct yahoo_packet *p
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 @@ static void yahoo_buddy_auth_req_15(PurpleConnection *gc, struct yahoo_packet *p
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 @@ static void yahoo_buddy_auth_req_15(PurpleConnection *gc, struct yahoo_packet *p
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 @@ static void yahoo_buddy_auth_req_15(PurpleConnection *gc, struct yahoo_packet *p
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 @@ static void yahoo_buddy_auth_req_15(PurpleConnection *gc, struct yahoo_packet *p
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 @@ static void yahoo_buddy_auth_req_15(PurpleConnection *gc, struct yahoo_packet *p
}
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 @@ static void yahoo_process_addbuddy(PurpleConnection *gc, struct yahoo_packet *pk
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 @@ static void yahoo_process_addbuddy(PurpleConnection *gc, struct yahoo_packet *pk
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 @@ static void yahoo_process_addbuddy(PurpleConnection *gc, struct yahoo_packet *pk
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 @@ void yahoo_send_p2p_pkt(PurpleConnection *gc, const char *who, int val_13)
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 @@ const char *yahoo_list_emblem(PurpleBuddy *b)
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 @@ int yahoo_send_im(PurpleConnection *gc, const char *who, const char *what, Purpl
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,9 +4366,19 @@ int yahoo_send_im(PurpleConnection *gc, const char *who, const char *what, Purpl
}
}
- 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( strncmp(who, "+", 1) == 0 ) {
+ if (who[0] == '+') {
/* we have an sms to be sent */
gchar *carrier = NULL;
const char *alias = NULL;
@@ -4334,15 +4426,20 @@ int yahoo_send_im(PurpleConnection *gc, const char *who, const char *what, Purpl
}
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);
- }
- 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);
+ 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, "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 @@ int yahoo_send_im(PurpleConnection *gc, const char *who, const char *what, Purpl
* 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 @@ int yahoo_send_im(PurpleConnection *gc, const char *who, const char *what, Purpl
/* 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 @@ unsigned int yahoo_send_typing(PurpleConnection *gc, const char *who, PurpleTypi
{
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 @@ unsigned int yahoo_send_typing(PurpleConnection *gc, const char *who, PurpleTypi
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 @@ unsigned int yahoo_send_typing(PurpleConnection *gc, const char *who, PurpleTypi
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);
}
@@ -4543,7 +4662,7 @@ void yahoo_set_idle(PurpleConnection *gc, int idle)
yd->current_status = get_yahoo_status_from_purple_status(status);
}
- invisible = !( purple_presence_is_available(purple_account_get_presence(purple_connection_get_account(gc))) );
+ invisible = (yd->current_status == YAHOO_STATUS_INVISIBLE);
pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_STATUS_UPDATE, YAHOO_STATUS_AVAILABLE, yd->session_id);
@@ -4680,17 +4799,29 @@ void yahoo_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *g)
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 @@ void yahoo_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *g)
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 @@ void yahoo_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *g
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 @@ void yahoo_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *g
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_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *g
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 @@ void yahoo_add_deny(PurpleConnection *gc, const char *who) {
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_add_deny(PurpleConnection *gc, const char *who) {
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 @@ void yahoo_change_buddys_group(PurpleConnection *gc, const char *who,
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 @@ void yahoo_change_buddys_group(PurpleConnection *gc, const char *who,
if (!f)
return;
- if(f->protocol == 2) {
- msn = TRUE;
+ if(f->fed) {
temp = who+4;
} else
temp = who;
@@ -4888,9 +5043,9 @@ void yahoo_change_buddys_group(PurpleConnection *gc, const char *who,
}
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),
diff --git a/libpurple/protocols/yahoo/libymsg.h b/libpurple/protocols/yahoo/libymsg.h
index f94dedbe32..24e0799cd6 100644
--- a/libpurple/protocols/yahoo/libymsg.h
+++ b/libpurple/protocols/yahoo/libymsg.h
@@ -128,6 +128,20 @@ enum yahoo_status {
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;
diff --git a/libpurple/protocols/yahoo/util.c b/libpurple/protocols/yahoo/util.c
index 2299e03ea6..cb71e0948b 100644
--- a/libpurple/protocols/yahoo/util.c
+++ b/libpurple/protocols/yahoo/util.c
@@ -881,6 +881,9 @@ char *yahoo_html_to_codes(const char *src)
}
g_free(etag);
}
+ } else {
+ /* We don't know what the tag is. Send it unmodified. */
+ g_string_append(dest, tag);
}
i = j;
diff --git a/libpurple/protocols/yahoo/yahoo_filexfer.c b/libpurple/protocols/yahoo/yahoo_filexfer.c
index 53797a49dd..c475d8f267 100644
--- a/libpurple/protocols/yahoo/yahoo_filexfer.c
+++ b/libpurple/protocols/yahoo/yahoo_filexfer.c
@@ -1363,7 +1363,6 @@ static void yahoo_p2p_ft_POST_cb(gpointer data, gint source, PurpleInputConditio
xfer = data;
if (!(xd = xfer->data)) {
- purple_input_remove(xd->input_event);
purple_xfer_cancel_remote(xfer);
return;
}
@@ -1387,7 +1386,6 @@ static void yahoo_p2p_ft_HEAD_GET_cb(gpointer data, gint source, PurpleInputCond
xfer = data;
if (!(xd = xfer->data)) {
- purple_input_remove(xd->input_event);
purple_xfer_cancel_remote(xfer);
return;
}
@@ -1491,7 +1489,7 @@ static void yahoo_p2p_ft_server_listen_cb(int listenfd, gpointer data)
char *filename_without_spaces = NULL;
xfer = data;
- if ( !( (xd = xfer->data) || (listenfd != -1) ) ) {
+ if (!(xd = xfer->data) || (listenfd == -1)) {
purple_debug_warning("yahoo","p2p: error starting server for p2p file transfer\n");
purple_xfer_cancel_remote(xfer);
return;
diff --git a/libpurple/protocols/yahoo/yahoo_friend.c b/libpurple/protocols/yahoo/yahoo_friend.c
index 342502c9dd..a3de458457 100644
--- a/libpurple/protocols/yahoo/yahoo_friend.c
+++ b/libpurple/protocols/yahoo/yahoo_friend.c
@@ -151,9 +151,8 @@ void yahoo_process_presence(PurpleConnection *gc, struct yahoo_packet *pkt)
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 @@ void yahoo_process_presence(PurpleConnection *gc, struct yahoo_packet *pkt)
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 @@ void yahoo_process_presence(PurpleConnection *gc, struct yahoo_packet *pkt)
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 @@ void yahoo_friend_update_presence(PurpleConnection *gc, const char *name,
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 @@ void yahoo_friend_update_presence(PurpleConnection *gc, const char *name,
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 @@ void yahoo_friend_update_presence(PurpleConnection *gc, const char *name,
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",
diff --git a/libpurple/protocols/yahoo/yahoo_friend.h b/libpurple/protocols/yahoo/yahoo_friend.h
index d2642e3a85..143d8d84d9 100644
--- a/libpurple/protocols/yahoo/yahoo_friend.h
+++ b/libpurple/protocols/yahoo/yahoo_friend.h
@@ -41,6 +41,7 @@ typedef enum {
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 @@ typedef struct _YahooFriend {
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;
diff --git a/libpurple/server.c b/libpurple/server.c
index 351e6d0888..11e979c881 100644
--- a/libpurple/server.c
+++ b/libpurple/server.c
@@ -44,17 +44,16 @@
unsigned int
serv_send_typing(PurpleConnection *gc, const char *name, PurpleTypingState state)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->send_typing)
- return prpl_info->send_typing(gc, name, state);
+ if (prpl_info->send_typing)
+ return prpl_info->send_typing(gc, name, state);
+ }
return 0;
}
@@ -142,7 +141,7 @@ int serv_send_im(PurpleConnection *gc, const char *name, const char *message,
conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, account);
- if(prpl_info && prpl_info->send_im)
+ if (prpl_info->send_im)
val = prpl_info->send_im(gc, name, message, flags);
/*
@@ -167,43 +166,40 @@ int serv_send_im(PurpleConnection *gc, const char *name, const char *message,
void serv_get_info(PurpleConnection *gc, const char *name)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(gc && prpl_info && prpl_info->get_info)
- prpl_info->get_info(gc, name);
+ if (prpl_info->get_info)
+ prpl_info->get_info(gc, name);
+ }
}
void serv_set_info(PurpleConnection *gc, const char *info)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
- PurpleAccount *account = NULL;;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
+ PurpleAccount *account;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->set_info) {
+ if (prpl_info->set_info) {
+ account = purple_connection_get_account(gc);
- account = purple_connection_get_account(gc);
+ if (purple_signal_emit_return_1(purple_accounts_get_handle(),
+ "account-setting-info", account, info))
+ return;
- if(purple_signal_emit_return_1(purple_accounts_get_handle(),
- "account-setting-info", account, info))
- return;
-
- prpl_info->set_info(gc, info);
+ prpl_info->set_info(gc, info);
- purple_signal_emit(purple_accounts_get_handle(),
- "account-set-info", account, info);
+ purple_signal_emit(purple_accounts_get_handle(),
+ "account-set-info", account, info);
+ }
}
}
@@ -212,25 +208,27 @@ void serv_set_info(PurpleConnection *gc, const char *info)
*/
void serv_alias_buddy(PurpleBuddy *b)
{
- PurpleAccount *account = NULL;
- PurpleConnection *gc = NULL;
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurpleAccount *account;
+ PurpleConnection *gc;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(b)
+ if (b) {
account = purple_buddy_get_account(b);
- if(account)
- gc = purple_account_get_connection(account);
+ if (account) {
+ gc = purple_account_get_connection(account);
- if(gc)
- prpl = purple_connection_get_prpl(gc);
+ if (gc) {
+ prpl = purple_connection_get_prpl(gc);
+ prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl)
- prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
-
- if(b && prpl_info && prpl_info->alias_buddy) {
- prpl_info->alias_buddy(gc, purple_buddy_get_name(b), purple_buddy_get_local_buddy_alias(b));
+ if (prpl_info->alias_buddy)
+ prpl_info->alias_buddy(gc,
+ purple_buddy_get_name(b),
+ purple_buddy_get_local_buddy_alias(b));
+ }
+ }
}
}
@@ -349,10 +347,10 @@ serv_got_attention(PurpleConnection *gc, const char *who, guint type_code)
*/
void serv_move_buddy(PurpleBuddy *b, PurpleGroup *og, PurpleGroup *ng)
{
- PurpleAccount *account = NULL;
- PurpleConnection *gc = NULL;
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurpleAccount *account;
+ PurpleConnection *gc;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
g_return_if_fail(b != NULL);
g_return_if_fail(og != NULL);
@@ -361,131 +359,120 @@ void serv_move_buddy(PurpleBuddy *b, PurpleGroup *og, PurpleGroup *ng)
account = purple_buddy_get_account(b);
gc = purple_account_get_connection(account);
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(gc && og && ng) {
- if (prpl_info && prpl_info->group_buddy) {
+ if (prpl_info->group_buddy)
prpl_info->group_buddy(gc, purple_buddy_get_name(b),
- purple_group_get_name(og),
- purple_group_get_name(ng));
- }
+ purple_group_get_name(og),
+ purple_group_get_name(ng));
}
}
void serv_add_permit(PurpleConnection *gc, const char *name)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->add_permit)
- prpl_info->add_permit(gc, name);
+ if (prpl_info->add_permit)
+ prpl_info->add_permit(gc, name);
+ }
}
void serv_add_deny(PurpleConnection *gc, const char *name)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->add_deny)
- prpl_info->add_deny(gc, name);
+ if (prpl_info->add_deny)
+ prpl_info->add_deny(gc, name);
+ }
}
void serv_rem_permit(PurpleConnection *gc, const char *name)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->rem_permit)
- prpl_info->rem_permit(gc, name);
+ if (prpl_info->rem_permit)
+ prpl_info->rem_permit(gc, name);
+ }
}
void serv_rem_deny(PurpleConnection *gc, const char *name)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->rem_deny)
- prpl_info->rem_deny(gc, name);
+ if (prpl_info->rem_deny)
+ prpl_info->rem_deny(gc, name);
+ }
}
void serv_set_permit_deny(PurpleConnection *gc)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- /*
- * this is called when either you import a buddy list, and make lots
- * of changes that way, or when the user toggles the permit/deny mode
- * in the prefs. In either case you should probably be resetting and
- * resending the permit/deny info when you get this.
- */
- if(prpl_info && prpl_info->set_permit_deny)
- prpl_info->set_permit_deny(gc);
+ /*
+ * this is called when either you import a buddy list, and make lots
+ * of changes that way, or when the user toggles the permit/deny mode
+ * in the prefs. In either case you should probably be resetting and
+ * resending the permit/deny info when you get this.
+ */
+ if (prpl_info->set_permit_deny)
+ prpl_info->set_permit_deny(gc);
+ }
}
void serv_join_chat(PurpleConnection *gc, GHashTable *data)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->join_chat)
- prpl_info->join_chat(gc, data);
+ if (prpl_info->join_chat)
+ prpl_info->join_chat(gc, data);
+ }
}
void serv_reject_chat(PurpleConnection *gc, GHashTable *data)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->reject_chat)
- prpl_info->reject_chat(gc, data);
+ if (prpl_info->reject_chat)
+ prpl_info->reject_chat(gc, data);
+ }
}
void serv_chat_invite(PurpleConnection *gc, int id, const char *message, const char *name)
@@ -523,51 +510,44 @@ void serv_chat_invite(PurpleConnection *gc, int id, const char *message, const c
* Then again, something might want to use this, from outside prpl-land
* to leave a chat without destroying the conversation.
*/
-
void serv_chat_leave(PurpleConnection *gc, int id)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
prpl = purple_connection_get_prpl(gc);
+ prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl)
- prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
-
- if(prpl_info && prpl_info->chat_leave)
+ if (prpl_info->chat_leave)
prpl_info->chat_leave(gc, id);
}
void serv_chat_whisper(PurpleConnection *gc, int id, const char *who, const char *message)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->chat_whisper)
- prpl_info->chat_whisper(gc, id, who, message);
+ if (prpl_info->chat_whisper)
+ prpl_info->chat_whisper(gc, id, who, message);
+ }
}
int serv_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags)
{
- int val = -EINVAL;
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
prpl = purple_connection_get_prpl(gc);
+ prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl)
- prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
-
- if(prpl_info && prpl_info->chat_send)
- val = prpl_info->chat_send(gc, id, message, flags);
+ if (prpl_info->chat_send)
+ return prpl_info->chat_send(gc, id, message, flags);
- return val;
+ return -EINVAL;
}
/*
@@ -980,18 +960,16 @@ void serv_got_chat_in(PurpleConnection *g, int id, const char *who,
void serv_send_file(PurpleConnection *gc, const char *who, const char *file)
{
- PurplePlugin *prpl = NULL;
- PurplePluginProtocolInfo *prpl_info = NULL;
+ PurplePlugin *prpl;
+ PurplePluginProtocolInfo *prpl_info;
- if(gc)
+ if (gc) {
prpl = purple_connection_get_prpl(gc);
-
- if(prpl)
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if (prpl_info && prpl_info->send_file) {
- if (!prpl_info->can_receive_file || prpl_info->can_receive_file(gc, who)) {
+ if (prpl_info->send_file &&
+ (!prpl_info->can_receive_file
+ || prpl_info->can_receive_file(gc, who)))
prpl_info->send_file(gc, who, file);
- }
}
}
diff --git a/libpurple/tests/test_yahoo_util.c b/libpurple/tests/test_yahoo_util.c
index 4a049c53a1..bbcc86abd3 100644
--- a/libpurple/tests/test_yahoo_util.c
+++ b/libpurple/tests/test_yahoo_util.c
@@ -180,6 +180,12 @@ START_TEST(test_html_to_codes)
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
diff --git a/libpurple/util.c b/libpurple/util.c
index 7f26e0078f..7621dcc316 100644
--- a/libpurple/util.c
+++ b/libpurple/util.c
@@ -3140,7 +3140,7 @@ purple_normalize(const PurpleAccount *account, const char *str)
{
PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
- if(prpl_info && prpl_info->normalize)
+ if (prpl_info->normalize)
ret = prpl_info->normalize(account, str);
}
}
diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c
index ee7b50739e..1335265921 100644
--- a/pidgin/gtkconv.c
+++ b/pidgin/gtkconv.c
@@ -4812,6 +4812,9 @@ setup_chat_userlist(PidginConversation *gtkconv, GtkWidget *hpaned)
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),
diff --git a/pidgin/gtkdialogs.c b/pidgin/gtkdialogs.c
index 2bf6dfc21a..2560d0a95f 100644
--- a/pidgin/gtkdialogs.c
+++ b/pidgin/gtkdialogs.c
@@ -73,69 +73,70 @@ struct artist {
/* 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 @@ if (purple_plugins_find_with_id("core-tcl") != NULL) {
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
diff --git a/pidgin/gtkprefs.c b/pidgin/gtkprefs.c
index a150cb3688..1b1e2c029b 100644
--- a/pidgin/gtkprefs.c
+++ b/pidgin/gtkprefs.c
@@ -1841,7 +1841,7 @@ network_page(void)
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);
diff --git a/pidgin/gtkutils.c b/pidgin/gtkutils.c
index 614863951f..85db4cd1bc 100644
--- a/pidgin/gtkutils.c
+++ b/pidgin/gtkutils.c
@@ -3901,6 +3901,40 @@ register_gnome_url_handlers(void)
return (gnome_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 protocol[256];
+ /* I don't think we need to worry about non-ASCII protocol names */
+ ret = RegEnumKeyExA(HKEY_CLASSES_ROOT, idx++, protocol, &nameSize,
+ NULL, NULL, NULL, NULL);
+ if (ret == ERROR_SUCCESS) {
+ HKEY reg_key = NULL;
+ ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, protocol, 0, KEY_READ, &reg_key);
+ if (ret == ERROR_SUCCESS) {
+ ret = RegQueryValueExA(reg_key, "URL Protocol", NULL, NULL, NULL, NULL);
+ if (ret == ERROR_SUCCESS) {
+ /* 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 +3952,11 @@ void pidgin_utils_init(void)
/* 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)
diff --git a/pidgin/pixmaps/emotes/default/24/default.theme.in b/pidgin/pixmaps/emotes/default/24/default.theme.in
index 5dab7d2c6e..8ddb77e61d 100644
--- a/pidgin/pixmaps/emotes/default/24/default.theme.in
+++ b/pidgin/pixmaps/emotes/default/24/default.theme.in
@@ -491,7 +491,7 @@ smile.png :) :-) =)
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 :( :-( =(
diff --git a/pidgin/pixmaps/emotes/small/16/small.theme.in b/pidgin/pixmaps/emotes/small/16/small.theme.in
index f9dd3713b8..64dc0e4f88 100644
--- a/pidgin/pixmaps/emotes/small/16/small.theme.in
+++ b/pidgin/pixmaps/emotes/small/16/small.theme.in
@@ -188,7 +188,7 @@ smile.png :) :-) =)
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 :( :-( =(
diff --git a/pidgin/plugins/win32/winprefs/winprefs.c b/pidgin/plugins/win32/winprefs/winprefs.c
index e44571a831..57326c9807 100644
--- a/pidgin/plugins/win32/winprefs/winprefs.c
+++ b/pidgin/plugins/win32/winprefs/winprefs.c
@@ -101,10 +101,7 @@ static void blist_dock_cb(gboolean val) {
blist_set_ontop(TRUE);
} else {
purple_debug_info(WINPREFS_PLUGIN_ID, "Blist Undocking...\n");
- if(purple_prefs_get_int(PREF_BLIST_ON_TOP) == BLIST_TOP_ALWAYS)
- blist_set_ontop(TRUE);
- else
- blist_set_ontop(FALSE);
+ blist_set_ontop(purple_prefs_get_int(PREF_BLIST_ON_TOP) == BLIST_TOP_ALWAYS);
}
}
@@ -120,10 +117,7 @@ static void blist_set_dockable(gboolean val) {
blist_ab = NULL;
}
- if(purple_prefs_get_int(PREF_BLIST_ON_TOP) == BLIST_TOP_ALWAYS)
- blist_set_ontop(TRUE);
- else
- blist_set_ontop(FALSE);
+ blist_set_ontop(purple_prefs_get_int(PREF_BLIST_ON_TOP) == BLIST_TOP_ALWAYS);
}
}
@@ -210,6 +204,12 @@ winprefs_set_autostart(GtkWidget *w) {
}
static void
+winprefs_set_multiple_instances(GtkWidget *w) {
+ wpurple_write_reg_string(HKEY_CURRENT_USER, "Environment", "PIDGIN_MULTI_INST",
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)) ? "1" : NULL);
+}
+
+static void
winprefs_set_blist_dockable(const char *pref, PurplePrefType type,
gconstpointer value, gpointer user_data)
{
@@ -270,34 +270,18 @@ static GtkWidget* get_config_frame(PurplePlugin *plugin) {
GtkWidget *ret;
GtkWidget *vbox;
GtkWidget *button;
- char *gtk_version = NULL;
char *run_key_val;
char *tmp;
ret = gtk_vbox_new(FALSE, 18);
gtk_container_set_border_width(GTK_CONTAINER(ret), 12);
- gtk_version = g_strdup_printf("GTK+\t%u.%u.%u\nGlib\t%u.%u.%u",
- gtk_major_version, gtk_minor_version, gtk_micro_version,
- glib_major_version, glib_minor_version, glib_micro_version);
-
- /* Display Installed GTK+ Runtime Version */
- if(gtk_version) {
- GtkWidget *label;
- vbox = pidgin_make_frame(ret, _("GTK+ Runtime Version"));
- label = gtk_label_new(gtk_version);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
- gtk_widget_show(label);
- g_free(gtk_version);
- }
-
/* Autostart */
vbox = pidgin_make_frame(ret, _("Startup"));
tmp = g_strdup_printf(_("_Start %s on Windows startup"), PIDGIN_NAME);
button = gtk_check_button_new_with_mnemonic(tmp);
g_free(tmp);
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
-
if ((run_key_val = wpurple_read_reg_string(HKEY_CURRENT_USER, RUNKEY, "Pidgin"))
|| (run_key_val = wpurple_read_reg_string(HKEY_LOCAL_MACHINE, RUNKEY, "Pidgin"))) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
@@ -306,6 +290,15 @@ static GtkWidget* get_config_frame(PurplePlugin *plugin) {
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(winprefs_set_autostart), NULL);
gtk_widget_show(button);
+ button = gtk_check_button_new_with_mnemonic(_("Allow multiple instances"));
+ gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
+ if ((run_key_val = wpurple_read_reg_string(HKEY_CURRENT_USER, "Environment", "PIDGIN_MULTI_INST"))) {
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+ g_free(run_key_val);
+ }
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(winprefs_set_multiple_instances), NULL);
+ gtk_widget_show(button);
+
/* Buddy List */
vbox = pidgin_make_frame(ret, _("Buddy List"));
pidgin_prefs_checkbox(_("_Dockable Buddy List"),
diff --git a/pidgin/plugins/xmppconsole.c b/pidgin/plugins/xmppconsole.c
index 19aedd44a4..10ecd8f891 100644
--- a/pidgin/plugins/xmppconsole.c
+++ b/pidgin/plugins/xmppconsole.c
@@ -660,7 +660,6 @@ signed_off_cb(PurpleConnection *gc)
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) {
diff --git a/pidgin/win32/nsis/pidgin-installer.nsi b/pidgin/win32/nsis/pidgin-installer.nsi
index 6ec169eadf..09d5e38100 100644
--- a/pidgin/win32/nsis/pidgin-installer.nsi
+++ b/pidgin/win32/nsis/pidgin-installer.nsi
@@ -717,6 +717,7 @@ Section Uninstall
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"
@@ -1345,13 +1346,14 @@ Function .onInit
StrCpy $LANGUAGE_SET "0"
ClearErrors
${GetOptions} "$R3" "/L=" $R1
- IfErrors +3
+ IfErrors +4
StrCpy $LANGUAGE $R1
StrCpy $LANGUAGE_SET "1"
Goto skip_lang
; Select Language
; Display Language selection dialog
+ !define MUI_LANGDLL_ALWAYSSHOW
!insertmacro MUI_LANGDLL_DISPLAY
skip_lang:
diff --git a/po/ChangeLog b/po/ChangeLog
index 8c22f3d586..74a5185b54 100644
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@ -1,5 +1,8 @@
Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
+version 2.6.3
+ * Vietnamese translation updated (Clytie Siddall)
+
version 2.6.2
* Afrikaans translation updated (Friedel Wolff)
* Albanian translation updated (Besnik Bleta)
diff --git a/po/de.po b/po/de.po
index 672450c3ac..11e9c1feed 100644
--- a/po/de.po
+++ b/po/de.po
@@ -11,8 +11,8 @@ msgid ""
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 @@ msgstr "Einladen"
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 @@ msgid "Pounce When Buddy..."
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 @@ msgid "%s sent a message in %s"
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 @@ msgstr ""
"\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 @@ msgid "Resolver process exited without answering our request"
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 @@ msgid "Buddy Goes _Idle"
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 @@ msgstr ""
#, 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 @@ msgstr "Einen Benutzer zum Chat einladen..."
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 @@ msgid "Dismiss"
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 @@ msgid "_Buddy name:"
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 @@ msgid "Paused while typing"
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 @@ msgid "Stopped typing"
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 @@ msgstr "Eine Nachricht senden"
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 @@ msgstr ""
"\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 @@ msgstr "Start"
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"
diff --git a/po/sv.po b/po/sv.po
index 4b51982a0e..49b40fa8d5 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Pidgin\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-07 18:26-0700\n"
-"PO-Revision-Date: 2009-07-15 18:36+0100\n"
+"POT-Creation-Date: 2009-09-24 22:37+0200\n"
+"PO-Revision-Date: 2009-09-24 22:37+0100\n"
"Last-Translator: Peter Hjalmarsson <xake@rymdraket.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -365,7 +365,7 @@ msgid "OK"
msgstr "OK"
msgid "New Instant Message"
-msgstr "Nytt snabbmeddelanden"
+msgstr "Nytt snabbmeddelande"
msgid "Please enter the username or alias of the person you would like to IM."
msgstr ""
@@ -636,8 +636,8 @@ msgid_plural "List of %d users:\n"
msgstr[0] "Lista över %d användare:\n"
msgstr[1] "Lista över %d användare:\n"
-msgid "Supported debug options are: version"
-msgstr "De felsökningsalternativ som stöds är: version"
+msgid "Supported debug options are: plugins version"
+msgstr "De felsökningsalternativ som stöds är: moduler version"
msgid "No such command (in this context)."
msgstr "Det finns inget sådant kommando (i denna kontext)."
@@ -1300,10 +1300,10 @@ msgid "Always"
msgstr "Alltid"
msgid "Only when available"
-msgstr "Endast vid tillgänglig"
+msgstr "Endast när \"Tillgänglig\""
msgid "Only when not available"
-msgstr "Endast vid Ej tillgänglig"
+msgstr "Endast när \"Ej tillgänglig\""
msgid "Volume(0-100):"
msgstr "Volym(0-100):"
@@ -1510,9 +1510,8 @@ msgstr ""
"\n"
"Hämtar TinyURL..."
-#, fuzzy
msgid "Only create TinyURL for URLs of this length or greater"
-msgstr "Skapa enbart TinyURL om url:en är av denna längd eller större"
+msgstr "Skapa enbart TinyURL om url:en är av denna längd eller längre"
msgid "TinyURL (or other) address prefix"
msgstr "TinyURL (eller annan) adressprefix"
@@ -1523,9 +1522,10 @@ msgstr "TinyURL"
msgid "TinyURL plugin"
msgstr "TinyURL modul"
-#, fuzzy
msgid "When receiving a message with URL(s), use TinyURL for easier copying"
-msgstr "När du får en/flera URL/URLer, TinyURL för att lättare hantering"
+msgstr ""
+"När du får meddelande med en/flera URL/URLer, använd TinyURL för att lättare "
+"hantering"
msgid "Online"
msgstr "Ansluten"
@@ -1631,28 +1631,22 @@ msgstr "Kompisar"
msgid "buddy list"
msgstr "kompislista"
-#, fuzzy
msgid "The certificate is self-signed and cannot be automatically checked."
msgstr ""
-"Certifikatet uppvisat av \"%s\" är självsignerat. Det kan inte kontrolleras "
-"automatiskt."
+"Detta certifikatet är självsignerat och kan inte kontrolleras automatiskt."
-#, fuzzy
msgid "The root certificate this one claims to be issued by is unknown."
-msgstr "Rootcertifikatet som denna påstås använda är okänd för Pidgin."
+msgstr "Rootcertifikatet som denna påstås använda är okänd."
-#, fuzzy
msgid "The certificate is not valid yet."
-msgstr "Certifikatskedjan uppvisad för %s är inte giltig."
+msgstr "Certifikatet är inte giltigt än."
-#, fuzzy
msgid "The certificate has expired and should not be considered valid."
-msgstr "Certifikatskedjan uppvisad för %s är inte giltig."
+msgstr "Certifikatet är för gammalt och bör inte anses giltigt."
#. Translators: "domain" refers to a DNS domain (e.g. talk.google.com)
-#, fuzzy
msgid "The certificate presented is not issued to this domain."
-msgstr "Certifikatskedjan uppvisad för %s är inte giltig."
+msgstr "Certifikatet är inte utfärdat för denna domän."
msgid ""
"You have no database of root certificates, so this certificate cannot be "
@@ -1661,17 +1655,14 @@ msgstr ""
"Du har ingen databas över rootcertifikat, så detta certifikat kan inte bli "
"verifierat."
-#, fuzzy
msgid "The certificate chain presented is invalid."
-msgstr "Certifikatskedjan uppvisad för %s är inte giltig."
+msgstr "Certifikatskedjan som uppvisades är ogiltig."
-#, fuzzy
msgid "The certificate has been revoked."
-msgstr "Samtalet avslutat."
+msgstr "Certifikatet är taget tillbaka."
-#, fuzzy
msgid "An unknown certificate error occurred."
-msgstr "Ett okänt inloggningsfel har inträffat: %s."
+msgstr "Ett okänt certifikatsfel har inträffat."
msgid "(DOES NOT MATCH)"
msgstr "(MATCHAR INTE)"
@@ -1717,25 +1708,24 @@ msgstr "SSL Certifikatsverifikation"
msgid "_View Certificate..."
msgstr "_Visa Certifikat..."
-#, fuzzy, c-format
+#, c-format
msgid "The certificate for %s could not be validated."
-msgstr "Certifikatskedjan uppvisad för %s är inte giltig."
+msgstr "Certifikatet för %s kunde inte valideras."
#. TODO: Probably wrong.
msgid "SSL Certificate Error"
msgstr "SSL Certifikatsfel"
-#, fuzzy
msgid "Unable to validate certificate"
-msgstr "Kan inte autentisera: %s"
+msgstr "Kan inte validera certifikat."
-#, fuzzy, c-format
+#, 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 ""
-"Certifikatet uppvisat av \"%s\" påstår sig istället vara för \"%s\". Detta "
-"kan betyda att du inte ansluter till den tjänst du tror du ansluter till."
+"Certifikatet påstår sig vara för \"%s\" istället. Detta kan betyda att du "
+"inte ansluter till den tjänst du tror du ansluter till."
#. Make messages
#, c-format
@@ -1973,18 +1963,18 @@ msgstr "Överföringen av filen %s är färdig"
msgid "File transfer complete"
msgstr "Filöverföringen slutfördes"
-#, fuzzy, c-format
+#, c-format
msgid "You cancelled the transfer of %s"
msgstr "Du avbröt överföringen av %s"
msgid "File transfer cancelled"
msgstr "Filöverföringen avbröts"
-#, fuzzy, c-format
+#, c-format
msgid "%s cancelled the transfer of %s"
msgstr "%s avbröt överföringen av %s"
-#, fuzzy, c-format
+#, c-format
msgid "%s cancelled the file transfer"
msgstr "%s avbröt filöverföringen"
@@ -2167,28 +2157,29 @@ msgid ""
"No codecs found. Install some GStreamer codecs found in GStreamer plugins "
"packages."
msgstr ""
+"Hittade inga codecs. Installera några GStreamer codecs vilka finns i "
+"GStreamers pluginpaket."
msgid ""
"No codecs left. Your codec preferences in fs-codecs.conf are too strict."
msgstr ""
+"Ingen codec kvar. Dina codec-inställningar i fs-codecs.conf är för strikta."
-#, fuzzy
msgid "A non-recoverable Farsight2 error has occurred."
-msgstr "Ett okänt inloggningsfel har inträffat: %s."
+msgstr "Ett okänt Farsight2-fel har inträffat."
-#, fuzzy
-msgid "Conference error."
-msgstr "Konferansen är stängd"
+msgid "Conference error"
+msgstr "Konferensfel"
-msgid "Error with your microphone."
-msgstr ""
+msgid "Error with your microphone"
+msgstr "Problem med din mikrofon"
-msgid "Error with your webcam."
-msgstr ""
+msgid "Error with your webcam"
+msgstr "Problem med din webbkamera"
-#, fuzzy, c-format
+#, c-format
msgid "Error creating session: %s"
-msgstr "Fel vid skapandet av anslutning"
+msgstr "Problem att skapa session: %s"
msgid "Error creating conference."
msgstr "Fel vid skapandet av konferens."
@@ -2397,7 +2388,7 @@ msgid "_Unset"
msgstr "_Ta bort"
msgid "Set Idle Time for All Accounts"
-msgstr "Ange Inaktivitetstiden för alla konton"
+msgstr "Ange inaktivitetstiden för alla konton"
msgid "Unset Idle Time for All Idled Accounts"
msgstr "Tar bort inaktivitetstiden för alla inaktiva konton"
@@ -2450,14 +2441,14 @@ msgstr ""
"kommandona."
msgid "Hide Joins/Parts"
-msgstr ""
+msgstr "Göm gå med/lämna"
#. Translators: Followed by an input request a number of people
msgid "For rooms with more than this many people"
-msgstr ""
+msgstr "För rum med fler än detta antalet personer"
msgid "If user has not spoken in this many minutes"
-msgstr ""
+msgstr "Om användaren inte pratat på så här många minuter"
msgid "Apply hiding rules to buddies"
msgstr "Verkställ döljningsregler för kompisar"
@@ -3921,11 +3912,12 @@ msgstr "Foto"
msgid "Logo"
msgstr "Logotyp"
-#, fuzzy, c-format
+#, c-format
msgid ""
"%s will no longer be able to see your status updates. Do you want to "
"continue?"
-msgstr "Du håller på att ta bort %s från din kompislista. Vill du fortsätta?"
+msgstr ""
+"%s kommer inte längre kunna se dina statusuppdateringar. Vill du fortsätta?"
msgid "Cancel Presence Notification"
msgstr "Avbryt närvarorapportering"
@@ -4275,7 +4267,7 @@ msgstr "Ändra användarinfo..."
#. if (js->protocol_options & CHANGE_PASSWORD) {
msgid "Change Password..."
-msgstr "Byt lösenor..."
+msgstr "Byt lösenord..."
#. }
msgid "Search for Users..."
@@ -4540,12 +4532,11 @@ msgstr ""
"affiliate &lt;ägare|admin|medlem|utstött|ingen&gt;: [nick1] [nick2] ...: "
"Hämta eller ange användarnas anknytning till rummet."
-#, fuzzy
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;moderator|deltagare|besökare|inget&gt;: [nick1] [nick2] ...: Hämta "
+"role &lt;moderator|participant|visitor|none&gt;: [nick1] [nick2] ...: Hämta "
"eller ange användarnas roll i rummet."
msgid "invite &lt;user&gt; [message]: Invite a user to the room."
@@ -4969,7 +4960,6 @@ msgstr "Fel på friend-fil"
msgid "Not expected"
msgstr "Ej väntat"
-#, fuzzy
msgid "Friendly name is changing too rapidly"
msgstr "Smeknamn ändras för ofta"
@@ -5197,7 +5187,7 @@ msgstr ""
#, 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 ""
"Kunde inte lägga till kompisen %s eftersom användarnamnet är ogiltigt. "
"Användarnamnet måste vara en giltig epost-adress."
@@ -5536,10 +5526,10 @@ msgstr ""
"%s har frågar efter att få se fin webbkamera, men denna förfrågan stöds inte "
"än."
-#, fuzzy, c-format
+#, c-format
msgid "%s invited you to view his/her webcam, but this is not yet supported."
msgstr ""
-"%s har frågar efter att få se fin webbkamera, men denna förfrågan stöds inte "
+"%s har gett dig en inbjudan att se dennes webbkamera, men detta stöds inte "
"än."
msgid "Away From Computer"
@@ -6274,9 +6264,9 @@ msgid "Server port"
msgstr "Serverport"
#. Note to translators: %s in this string is a URL
-#, fuzzy, c-format
+#, c-format
msgid "Received unexpected response from %s"
-msgstr "Mottog oväntat svar från"
+msgstr "Mottog oväntat svar från %s"
#. username connecting too frequently
msgid ""
@@ -6288,9 +6278,9 @@ msgstr ""
#. 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 "Fel vid efterfrågan av"
+msgstr "Fel vid efterfrågan av %s: %s"
msgid "AOL does not allow your screen name to authenticate here"
msgstr "AOL tillåter inte ditt skärmnamn att autentisera här"
@@ -7077,9 +7067,8 @@ msgstr ""
msgid "C_onnect"
msgstr "_Anslut"
-#, fuzzy
msgid "You closed the connection."
-msgstr "Servern stängde anslutningen"
+msgstr "Du stängde anslutningen."
msgid "Get AIM Info"
msgstr "Hämta AIM-info"
@@ -7091,9 +7080,8 @@ msgstr "Ändra kompiskommentar"
msgid "Get Status Msg"
msgstr "Hämta statusmeddelande"
-#, fuzzy
msgid "End Direct IM Session"
-msgstr "Direktmeddelande har etablerats"
+msgstr "Avsluta direkt-IM session"
msgid "Direct IM"
msgstr "Direktmeddelande"
@@ -7925,7 +7913,7 @@ msgstr "%d har har nekat filen %s"
msgid "File Send"
msgstr "Filsändning"
-#, fuzzy, c-format
+#, c-format
msgid "%d cancelled the transfer of %s"
msgstr "%d avbröt överföringen av %s"
@@ -9455,7 +9443,7 @@ msgid "Ignore conference and chatroom invitations"
msgstr "Ignorera inbjudningar till konferenser och chatrum"
msgid "Use account proxy for SSL connections"
-msgstr ""
+msgstr "Använd kontoproxy för SSL-anslutningar"
msgid "Chat room list URL"
msgstr "URL för chattrumlista"
@@ -9560,26 +9548,27 @@ msgstr ""
msgid "Ignore buddy?"
msgstr "Ignorera kompis?"
-#, fuzzy
msgid "Invalid username or password"
msgstr "Felaktigt användarnamn eller lösenord"
-#, fuzzy
msgid ""
"Your account has been locked due to too many failed login attempts. Please "
"try logging into the Yahoo! website."
msgstr ""
-"Kontot låst: För många inloggningsförsök. Logga in på Yahoo!s hemsida kan "
-"fixa detta."
+"Ditt kontot har låsts på grund av för många inloggningsförsök. Försök att "
+"logga in på Yahoo!s hemsida."
#, c-format
msgid "Unknown error 52. Reconnecting should fix this."
-msgstr ""
+msgstr "Okänt fel 52. En återanslutning borde fixa detta."
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 ""
+"Fel 1013: Användarnamnet du har angivit är ogiltigt. Den vanligaste "
+"anledningen till detta är att du angett din epost-adress istället flr ditt "
+"Yahoo! ID."
#, c-format
msgid "Unknown error number %d. Logging into the Yahoo! website may fix this."
@@ -9667,6 +9656,15 @@ msgstr "Gå med användare i chatt..."
msgid "Open Inbox"
msgstr "Öppna Inkorg"
+msgid "Can't send SMS. Unable to obtain mobile carrier."
+msgstr ""
+
+msgid "Can't send SMS. Unknown mobile carrier."
+msgstr ""
+
+msgid "Getting mobile carrier to send the SMS."
+msgstr ""
+
#. Write a local message to this conversation showing that a request for a
#. * Doodle session has been made
#.
@@ -9749,9 +9747,9 @@ msgstr ""
msgid "The user's profile is empty."
msgstr "Användarens profil är tom."
-#, fuzzy, c-format
+#, c-format
msgid "%s has declined to join."
-msgstr "%s har loggat in."
+msgstr "%s har nekat att ansluta."
msgid "Failed to join chat"
msgstr "Kunde inte ansluta till chatt"
@@ -10022,7 +10020,7 @@ msgid "SSL Handshake Failed"
msgstr "SSL_handskakning misslyckades"
msgid "SSL peer presented an invalid certificate"
-msgstr "SSL-motparten uppvisade ett ogiltig certifikat"
+msgstr "SSL-motparten uppvisade ett ogiltigt certifikat"
msgid "Unknown SSL error"
msgstr "Okänt SSL-fel"
@@ -10343,7 +10341,6 @@ msgstr "Bakgrundsfärgen för kompislistan"
msgid "Layout"
msgstr "Utseende"
-#, fuzzy
msgid "The layout of icons, name, and status of the buddy list"
msgstr "Utseendet på ikoner, namn och status i kompislistan"
@@ -10399,7 +10396,6 @@ msgstr "Textinformationen för när en kontakt är expanderad"
#. 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 "Ansluten-text"
@@ -10416,11 +10412,9 @@ msgstr "Textinformationen för när en kompis är borta"
#. 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 "Frånkopplad-text"
-#, fuzzy
msgid "The text information for when a buddy is offline"
msgstr "Textinformationen för när en kompis är frånkopplad"
@@ -10445,7 +10439,6 @@ msgstr "Textinformationen för när en kompis har ett oläst meddelande"
msgid "Message (Nick Said) Text"
msgstr "Meddelande (Smeknamn nämnt) Text"
-#, fuzzy
msgid ""
"The text information for when a chat has an unread message that mentions "
"your nickname"
@@ -10651,7 +10644,7 @@ msgid "/Tools/_Certificates"
msgstr "/Verktyg/_Certifikat"
msgid "/Tools/Custom Smile_ys"
-msgstr "/Verktyg/Egna Smile_ys"
+msgstr "/Verktyg/Egna smile_ys"
msgid "/Tools/Plu_gins"
msgstr "/Verktyg/Insticksmodu_ler"
@@ -10891,9 +10884,8 @@ msgstr "A_lias:"
msgid "_Group:"
msgstr "_Grupp:"
-#, fuzzy
msgid "Auto_join when account connects."
-msgstr "_Gå med automatiskt då kontot är anslutet."
+msgstr "_Gå med automatiskt då kontot ansluter."
msgid "_Remain in chat after window is closed."
msgstr "Va_r kvar i chattfönster efter att det stängts."
@@ -11009,9 +11001,8 @@ msgstr "/_Konversation"
msgid "/Conversation/New Instant _Message..."
msgstr "/Konversation/Nytt snabb_meddelande..."
-#, fuzzy
msgid "/Conversation/Join a _Chat..."
-msgstr "/Konversation/_Bjud in..."
+msgstr "/Konversation/Anslut till en _chatt..."
msgid "/Conversation/_Find..."
msgstr "/Konversation/_Sök..."
@@ -11403,7 +11394,7 @@ msgid "Estonian"
msgstr "Estniska"
msgid "Basque"
-msgstr ""
+msgstr "Baskiska"
msgid "Persian"
msgstr "Persiska"
@@ -11612,6 +11603,12 @@ msgid ""
"primary language is <b>English</b>. You are welcome to post in another "
"language, but the responses may be less helpful.<br/><br/>"
msgstr ""
+"<font size=\"4\">Hjälp från andra Pidgin-användare:</font> <a href=\"mailto:"
+"support@pidgin.im\">support@pidgin.im</a><br/>Detta är en <b>publik</b> "
+"epostlista! (<a href=\"http://pidgin.im/pipermail/support/\">arkiv</a>)<br/"
+">Vi kan inte hjälpa dig med 3:djepartsmoduler och protokoll!<br/>Listans "
+"huvudspråk är <b>Engelska</b>. Du är välkommen att skriva i ett annat "
+"språk, men svaren kan vara mindre hjälpsamma.<br/><br/>"
#, c-format
msgid ""
@@ -12173,43 +12170,48 @@ msgid ""
"Usage: %s [OPTION]...\n"
"\n"
msgstr ""
+"Användning: %s [FLAGGOR]...\n"
+"\n"
msgid "DIR"
-msgstr ""
+msgstr "KATALOG"
msgid "use DIR for config files"
-msgstr ""
+msgstr "Använd KATALOG för konfigurationsfiler"
msgid "print debugging messages to stdout"
-msgstr ""
+msgstr "skriv ut felsökningsmeddelanden till stdout"
msgid "force online, regardless of network status"
-msgstr ""
+msgstr "tvinga ansluten, oavsätt nätverkets status"
msgid "display this help and exit"
-msgstr ""
+msgstr "visa denna hjältexten och avsluta"
-#, fuzzy
msgid "allow multiple instances"
-msgstr "Tillåt många samtidiga inloggningar"
+msgstr "tillåt flera instanser"
msgid "don't automatically login"
-msgstr ""
+msgstr "anslut inte automatiskt"
msgid "NAME"
-msgstr ""
+msgstr "NAMN"
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 ""
+"aktivera valda konton (det ej obligatoriska argumentet NAMN\n"
+" specificerar en kommaseparerad lista av konton.\n"
+" Utan denna lista kommer enbart det första kontot "
+"aktiveras)."
msgid "X display to use"
-msgstr ""
+msgstr "X displayen att använda"
msgid "display the current version and exit"
-msgstr ""
+msgstr "Visar nuvarande version och avslutar"
#, c-format
msgid ""
@@ -12263,7 +12265,7 @@ msgid "%s wishes to start a video session with you."
msgstr "%s önskar påbörja en videosession med dig."
msgid "Incoming Call"
-msgstr ""
+msgstr "Inkommande samtal"
msgid "_Pause"
msgstr "_Pausa"
@@ -12481,6 +12483,21 @@ msgstr "Skicka ett meddelande"
msgid "Unknown.... Please report this!"
msgstr "Okänd... Var snäll och rapportera detta!"
+msgid "(Custom)"
+msgstr "(Egen)"
+
+msgid "(Default)"
+msgstr "(Förvald)"
+
+msgid "The default Pidgin sound theme"
+msgstr "Pidgins förvalda ljudtema"
+
+msgid "The default Pidgin buddy list theme"
+msgstr "Pidgins förvalda tema för kompislistan"
+
+msgid "The default Pidgin status icon theme"
+msgstr "Pidgins förvalda statusikon-tema"
+
msgid "Theme failed to unpack."
msgstr "Temat kunde inte packas upp."
@@ -12511,7 +12528,7 @@ msgstr "_Stäng konversationsfönster med Escape-knappen"
#. Buddy List Themes
msgid "Buddy List Theme"
-msgstr "Tema för Kompislista"
+msgstr "Tema för kompislista"
#. System Tray
msgid "System Tray Icon"
@@ -12624,9 +12641,8 @@ msgstr "Kan inte starta konfigurationsprogrammet för proxy."
msgid "Cannot start browser configuration program."
msgstr "Kan inte starta konfigurationsprogrammet för webbläsaren"
-#, fuzzy
msgid "Disabled"
-msgstr "A_vaktivera"
+msgstr "Avaktiverad"
#, c-format
msgid "Use _automatically detected IP address: %s"
@@ -12657,9 +12673,8 @@ msgstr "_Slutport:"
msgid "Relay Server (TURN)"
msgstr "Återsändningsserver (TURN)"
-#, fuzzy
msgid "_TURN server:"
-msgstr "ST_UN-server:"
+msgstr "_TURN-server:"
msgid "Proxy Server &amp; Browser"
msgstr "Proxyserver &amp; Webbläsare"
@@ -12674,7 +12689,7 @@ msgid ""
"Proxy & Browser preferences are configured\n"
"in GNOME Preferences"
msgstr ""
-"Proxy- & Webbläsar-inställningarna konfigureras i\n"
+"Proxy- & webbläsar-inställningarna konfigureras i\n"
"GNOMEs inställningar"
msgid "Configure _Proxy"
@@ -12839,7 +12854,7 @@ msgid "_Report idle time:"
msgstr "_Rapportera inaktivitetstid:"
msgid "Based on keyboard or mouse use"
-msgstr "Baserat på tangetbord eller musanvändning"
+msgstr "Baserat på tangentbord eller musanvändning"
msgid "_Auto-reply:"
msgstr "_Automatiskt svar:"
@@ -13038,7 +13053,7 @@ msgid "Shortcut Text"
msgstr "Genvägstext"
msgid "Custom Smiley Manager"
-msgstr "Hanterare för egna Smileys"
+msgstr "Hanterare för egna smileys"
msgid "Select Buddy Icon"
msgstr "Välj kompisikon"
@@ -13233,7 +13248,7 @@ msgid "Small"
msgstr "Liten"
msgid "Smaller versions of the default smilies"
-msgstr "Mindre versioner av de förvadla smiliesarna."
+msgstr "Mindre versioner av de förvalda smiliesarna."
msgid "Response Probability:"
msgstr "Trolighet för svar:"
@@ -14215,35 +14230,29 @@ msgstr ""
"Denna modul tillåter användaren att personifiera konversationernas och "
"loggarnas tidsstämpelformat."
-#, fuzzy
msgid "Audio"
-msgstr "Auto"
+msgstr "Ljud"
-#, fuzzy
msgid "Video"
-msgstr " Video"
+msgstr "Video"
msgid "Output"
-msgstr ""
+msgstr "Utmatning"
-#, fuzzy
msgid "_Plugin"
-msgstr "Insticksmoduler"
+msgstr "_Insticksmoduler"
-#, fuzzy
msgid "_Device"
-msgstr "Enhet"
+msgstr "_Enhet"
msgid "Input"
-msgstr ""
+msgstr "Inmatning"
-#, fuzzy
msgid "P_lugin"
-msgstr "Insticksmoduler"
+msgstr "Insticksmodu_ler"
-#, fuzzy
msgid "D_evice"
-msgstr "Enhet"
+msgstr "_Enhet"
#. *< magic
#. *< major version
@@ -14254,18 +14263,18 @@ msgstr "Enhet"
#. *< dependencies
#. *< priority
#. *< id
-#, fuzzy
msgid "Voice/Video Settings"
-msgstr "Ändra inställningar"
+msgstr "Röst/videoinställningar"
#. *< name
#. *< version
msgid "Configure your microphone and webcam."
-msgstr ""
+msgstr "Konfigurerar din mikrofon och kamera."
#. *< summary
msgid "Configure microphone and webcam settings for voice/video calls."
msgstr ""
+"Konfigurera mikrofon och webbkamera-inställningar för röst/videosamtal."
msgid "Opacity:"
msgstr "Ogenomskinlighet:"
@@ -14323,9 +14332,6 @@ msgstr ""
"\n"
"* Observera: Denna insticksmodul kräver Win2000 eller senare."
-msgid "GTK+ Runtime Version"
-msgstr "GTK+ Runtime-version"
-
#. Autostart
msgid "Startup"
msgstr "Uppstart"
@@ -14334,6 +14340,9 @@ msgstr "Uppstart"
msgid "_Start %s on Windows startup"
msgstr "_Starta %s när Windows startar"
+msgid "Allow multiple instances"
+msgstr "Tillåt flera instanser"
+
msgid "_Dockable Buddy List"
msgstr "_Dockningsbar kompislista"
@@ -14394,11 +14403,14 @@ msgstr "Skicka och ta emot råa XMPP strofer."
msgid "This plugin is useful for debbuging XMPP servers or clients."
msgstr "Denna modul är användbar vid felsökning av XMPP serverar och klienter."
+#~ msgid "GTK+ Runtime Version"
+#~ msgstr "GTK+ Runtime-version"
+
#~ msgid "Calling ... "
#~ msgstr "Ringer..."
#~ msgid "Invalid certificate chain"
-#~ msgstr "Ogiltigt certifikatskedja"
+#~ msgstr "Ogiltig certifikatskedja"
#~ msgid ""
#~ "The certificate chain presented by %s does not have a valid digital "
diff --git a/po/vi.po b/po/vi.po
index afe4d93dfb..08b392292a 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -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 @@ msgstr "Finch"
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 @@ msgid ""
" -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 @@ msgstr "Thông báo thư mới"
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 @@ msgstr "Sửa"
#, 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 @@ msgid "Default"
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 @@ msgid "The selected account is not online."
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 @@ msgid "Account"
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 @@ msgid "Get Info"
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 @@ msgid "Enter empty string to reset the name."
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 @@ msgid "Empty groups"
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 @@ msgid "Show Timestamps"
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 @@ msgstr "Bật âm thanh"
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"
+msgstr[0] "Danh sách %d 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"
+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 @@ msgstr ""
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 @@ msgstr "Mọi cuộc trao đổi"
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 @@ msgid "Reject"
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 ""
+"%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ợ."
-#, fuzzy
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 @@ msgid "Info for %s"
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 @@ msgstr "Mời"
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 @@ msgid "Preferences"
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 @@ msgstr "Tên buddy:"
#. 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 @@ msgid "Are you sure you want to delete the pounce on %s for %s?"
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 @@ msgid "Show Offline Buddies"
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 @@ msgid "Room List"
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 @@ msgid "%s sent a message in %s"
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 @@ msgid ""
"\n"
"Fetching TinyURL..."
msgstr ""
+"\n"
+"Đang lấy TinyURL..."
-msgid "Only create TinyURL for URLs of this length or greater"
+#, c-format
+msgid "TinyURL for above: %s"
msgstr ""
-msgid "TinyURL (or other) address prefix"
+msgid "Please wait while TinyURL fetches a shorter URL ..."
msgstr ""
-#, fuzzy
+msgid "Only create TinyURL for URLs of this length or greater"
+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 "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 @@ msgid "Offline"
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 @@ msgid "No Grouping"
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 @@ msgstr "Bạn bè"
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."
+msgstr "Chứng nhận này tự ký thì không thể được tự động kiểm tra."
-#, fuzzy
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."
+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ó."
-#, fuzzy
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ệ."
+msgstr "Chứng nhận này chưa hợp lệ."
-#, fuzzy
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 @@ msgstr ""
"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ệ."
+msgstr "Dãy chứng nhận đưa ra không phải hợp lệ."
-#, fuzzy
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ệ."
+msgstr "Chứng nhận đã bị hủy bỏ."
-#, fuzzy
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 @@ msgstr "Thẩm tra chứng nhận SSL"
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"
+msgstr "Không thể thẩm tra chứng nhận"
-#, fuzzy, c-format
+#, 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 @@ msgstr "%s rời phòng."
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 @@ msgstr ""
#, 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 @@ msgstr "Muốn gửi %s cho %s"
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"
+msgstr "Đã truyền hoàn toàn tập tin"
-#, fuzzy, c-format
+#, 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"
+msgstr "%s đã thôi tiến trình truyền %s"
-#, fuzzy, c-format
+#, 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 @@ msgid ""
"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 ""
+"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ế."
-#, fuzzy
msgid "A non-recoverable Farsight2 error has occurred."
-msgstr "Lỗi đăng nhập không rõ : %s."
+msgstr "Gặp một lỗi Farsight2 từ đó không thể phục hồi."
-#, fuzzy
-msgid "Conference error."
-msgstr "Hội thảo bị đóng"
+msgid "Conference error"
+msgstr "Lỗi hội thảo"
-msgid "Error with your microphone."
-msgstr ""
+msgid "Error with your microphone"
+msgstr "Gặp lỗi với cái máy vi âm"
-msgid "Error with your webcam."
-msgstr ""
+msgid "Error with your webcam"
+msgstr "Gặp lỗi với cái máy ảnh Web"
-#, fuzzy, c-format
+#, c-format
msgid "Error creating session: %s"
-msgstr "Lỗi khi tạo kết nối"
+msgstr "Gặp lỗi khi tạo buổi hợp: %s"
-#, fuzzy
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 @@ msgstr ""
"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 @@ msgstr "Sửa ghi chú..."
#. *< 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 @@ msgstr ""
"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 @@ msgstr ""
"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 @@ msgid ""
"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 @@ msgstr "Mô phỏng tin nhẳn ngoại tuyến"
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 @@ msgstr "Tin nhẳn ngoại tuyến"
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 @@ msgstr "Lưu tin nhẳn ngoại tuyến trong thông báo"
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 @@ msgstr "Nhập mật khẩu"
#. *< 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 @@ msgid ""
"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 @@ msgid "Notify When"
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 @@ msgstr "Bạn thân đăn_g nhập/xuất"
#. *< 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 @@ msgid ""
"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 @@ msgstr ""
"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."
+"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."
-#, fuzzy
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 @@ msgid "Purple Person"
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 @@ msgstr "%s đã đóng cửa sổ cuộc thoại."
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"
+msgstr "Không thể tạo ổ cắm: %s"
-#, fuzzy, c-format
+#, c-format
msgid "Unable to bind socket to port: %s"
-msgstr "Không thể đóng kết ổ cắm tới cổng"
+msgstr "Không thể đóng kết ổ cắm tới cổng: %s"
-#, fuzzy, c-format
+#, 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 @@ msgstr "Lưu danh sách bạn bè..."
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ý."
+msgstr "Phải điền vào tất cả các trường đăng ký"
-#, fuzzy
msgid "Passwords do not match"
-msgstr "Hai mật khẩu không trùng."
+msgstr "Hai mật khẩu không trùng nhau"
-#, fuzzy
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 @@ msgid "Password (again)"
msgstr "Nhập lại mật khẩu"
msgid "Enter captcha text"
-msgstr ""
+msgstr "Gõ chuỗi Captcha"
-#, fuzzy
+# 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 @@ msgstr "Đổi mật khẩu Gadu-Gadu"
#, 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 @@ msgstr "Thêm vào chát"
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 @@ msgstr "Lỗi chát"
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 @@ msgstr "Hệ tin nhắn nhanh phổ biến ở Phần Lan"
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 @@ msgstr "Chưa lập chủ đề"
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 @@ msgstr "MOTD cho %s"
#.
#. 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 @@ msgstr "_Kênh:"
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"
+msgstr "Không thể kết nối: %s"
-#, fuzzy, c-format
+#, 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 @@ msgid "Encodings"
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 @@ msgstr "Dùng SSL"
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 @@ msgstr ""
#. 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"
+msgstr "Tên hiệu « %s » đang được dùng."
-#, fuzzy
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 @@ msgstr ""
"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 @@ msgstr "Lệnh như thế đã bị lỗi"
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."
+"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."
-#, fuzzy
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 @@ msgstr ""
msgid "Plaintext Authentication"
msgstr "Xác thực nhập thô"
-#, fuzzy
msgid "SASL authentication failed"
-msgstr "Không xác thực được"
+msgstr "Lỗi xác thực SASL"
-#, fuzzy
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 @@ msgstr "Bạn cần mật mã, nhưng máy phục vụ này không cung cấp."
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 ""
+msgstr "Bộ quản lý kết nối BOSH đã chấm dứt buổi hợp của bạn."
-#, fuzzy
msgid "No session ID given"
-msgstr "Không nêu lý do."
+msgstr "Chưa đưa ra mã số buổi hợp"
-#, fuzzy
msgid "Unsupported version of BOSH protocol"
-msgstr "Phiên bản không được hỗ trợ"
+msgstr "Phiên bản giao thức BOSH không được hỗ trợ"
-#, fuzzy
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"
+msgstr "Không thể thiết lập kết nối đến máy phục vụ"
-#, fuzzy, c-format
+#, 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"
+msgstr "Không thể thiết lập kết nối đến máy phục vụ : %s"
-#, fuzzy
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 @@ msgstr "Trình khách"
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 @@ msgstr "Tài nguyên"
#, c-format
msgid "%s ago"
-msgstr ""
+msgstr "%s trước"
-#, fuzzy
msgid "Logged Off"
msgstr "Đã đăng xuất"
@@ -3963,12 +3939,13 @@ msgstr "Ảnh chụp"
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 @@ msgstr "Chọn một máy phục vụ hội thảo để hỏi"
msgid "Find Rooms"
msgstr "Tìm phòng"
-#, fuzzy
msgid "Affiliations:"
-msgstr "Bí danh:"
+msgstr "Nhập hội:"
-#, fuzzy
msgid "No users found"
-msgstr "Không tìm thấy người dùng tương ứng"
+msgstr "Không tìm thấy người dùng nào"
-#, fuzzy
msgid "Roles:"
-msgstr "Vị trí"
+msgstr "Vai trò :"
-#, fuzzy
msgid "Ping timed out"
msgstr "Quá hạn ping"
@@ -4141,6 +4114,8 @@ msgid ""
"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 @@ msgstr "ID XMPP không hợp lệ"
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 @@ msgid "Re-initializing Stream"
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 @@ msgstr "Không thể đá người dùng %s"
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."
+msgstr "Không thể kêu gọi vì không biết gì về %s."
-#, fuzzy, c-format
+#, 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."
+msgstr "Không thể kêu gọi, vì %s có thể chưa đăng nhập."
-#, fuzzy, c-format
+#, 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 @@ msgstr "Kêu gọi"
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ệ"
+msgstr "Không thể khởi đầu phương tiện với %s, JID không hợp lệ"
-#, fuzzy, c-format
+#, 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"
+msgstr "Không thể khởi đầu phương tiện với %s, người dùng chưa kết nối"
-#, fuzzy, c-format
+#, 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"
+"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"
-#, fuzzy
msgid "Media Initiation Failed"
-msgstr "Lỗi đăng ký"
+msgstr "Lỗi khởi đầu phương tiện"
-#, fuzzy, c-format
+#, 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 @@ msgstr "topic [chủ đề mới]: Xem hay thay đổi chủ đề."
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ó."
+" • member\t\tthành viên\n"
+" • outcast\t\tngười bị ruồng bỏ\n"
+" • none\t\tkhông có"
-#, fuzzy
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 @@ msgid "File transfer proxies"
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 @@ msgstr "_Cấu hình phòng"
msgid "_Accept Defaults"
msgstr "Chấp nhận _mặc định"
-#, fuzzy
msgid "No reason"
-msgstr "Không nêu lý do."
+msgstr "Không có lý do"
-#, fuzzy, c-format
+#, c-format
msgid "You have been kicked: (%s)"
-msgstr "Bạn bị %s đá: (%s)"
+msgstr "Bạn bị đá: (%s)"
-#, fuzzy, c-format
+#, c-format
msgid "Kicked (%s)"
-msgstr "Bị %s đá (%s)"
+msgstr "Bị đá (%s)"
-#, fuzzy
msgid "An error occurred on the in-band bytestream transfer\n"
-msgstr "Gặp lỗi trong khi mở tập tin."
+msgstr "Gặp lỗi trong khi truyền luồng byte bên trong băng\n"
-#, fuzzy
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 @@ msgid "Unable to add \"%s\"."
msgstr "Không thể thêm « %s »."
msgid "Buddy Add error"
-msgstr ""
+msgstr "Lỗi thêm bạn chát"
-#, fuzzy
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 @@ msgid ""
"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 @@ msgid ""
"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 @@ msgstr "Tập tin bạn bè hỏng"
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 @@ msgstr "Passport của trẻ không có sự đồng ý của cha mẹ"
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 @@ msgstr "Mã lỗi không rõ %d"
msgid "MSN Error: %s\n"
msgstr "Lỗi MSN: %s\n"
-#, fuzzy
msgid "Other Contacts"
-msgstr "Liên lạc đã thích"
+msgstr "Liên lạc khác"
-#, fuzzy
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 ""
+"%s đã gửi một trích tiếng nói. <a href='audio://%s'>Bấm đây để phát nó</a>"
-#, fuzzy, c-format
+#, 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ợ."
+msgstr "%s đã gửi một trích tiếng nói mà không lưu được"
-#, fuzzy, c-format
+#, 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 @@ msgstr "Cho phép"
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"
+msgstr "Chuỗi bị chặn cho %s"
-#, fuzzy
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 ""
+"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"
-#, fuzzy
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 ""
+msgstr "Chơi lượt"
-#, fuzzy
msgid "Working"
-msgstr "Việc làm"
+msgstr "Đi làm"
msgid "Has you"
msgstr "Có bạn"
@@ -5216,13 +5186,11 @@ msgstr "Nghệ sĩ"
msgid "Album"
msgstr "Tập nhạc"
-#, fuzzy
msgid "Game Title"
-msgstr "Tên điệu"
+msgstr "Tên trò chơi"
-#, fuzzy
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 @@ msgid "Allow/Disallow Mobile Pages..."
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 @@ msgstr "Khởi tạo _Chát"
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."
+"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ệ. 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ố."
+"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ệ."
-#, fuzzy
msgid "Unable to Add"
msgstr "Không thể thêm"
@@ -5436,9 +5402,8 @@ msgstr ""
"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 @@ msgstr "nudge: làm nổi bật một liên lạc để thu hút sự chú ý"
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 @@ msgstr "Không thể thêm người dùng"
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"
+msgstr "Sổ địa chỉ của bạn còn thiếu những người dùng theo đây"
-#, fuzzy
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 @@ msgid ""
"Message was not sent because the system is unavailable. This normally "
"happens when the user is blocked or does not exist."
msgstr ""
+"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."
-#, fuzzy
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:"
+msgstr "Tin nhẳn chưa đi được vì các tin nhẳn được gửi quá nhanh."
-#, fuzzy
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õ :"
+msgstr "Tin nhẳn chưa đi được vì gặp một lỗi mã hoá không được nhận ra."
-#, fuzzy
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 @@ msgstr ""
"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ụ."
+msgstr "Giao thức mình không được hỗ trợ bởi trình phục vụ."
-#, fuzzy
msgid "Error parsing HTTP"
-msgstr "Lỗi phân tích HTTP."
+msgstr "Gặp lỗi khi phân tích cú pháp của mã HTTP"
-#, fuzzy
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 @@ msgstr "Đang gửi cookie"
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ợ."
+msgstr "%s yêu cầu xem máy ảnh Web của bạn, mà chưa được hỗ trợ."
-#, fuzzy, c-format
+#, 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 @@ msgstr "Thông điệp không gửi đi được vì có lỗi trong hệ thốn
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ỉ"
+msgstr "Xoá bạn chát khỏi Sổ địa chỉ ?"
-#, fuzzy
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 @@ msgid "This Hotmail account may not be active."
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 @@ msgstr ""
"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 @@ msgid "MySpace"
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 @@ msgid_plural ""
"%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 @@ msgstr "Thêm liên lạc từ máy phục vụ"
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 @@ msgid "Invalid input condition"
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 @@ msgid ""
"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 @@ msgstr "Người dùng này đang ngoại tuyến hoặc bạn đã bị chặn
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 @@ msgid ""
"%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 @@ msgid "Server port"
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 @@ msgstr ""
#. 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 @@ msgstr "Không thể tham gia phòng trò chuyện"
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 @@ msgid "AIM Protocol Plugin"
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 @@ msgstr "Mất kết nối với người dùng từ xa:<br>%s"
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 @@ msgid ""
"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 @@ msgstr ""
#. 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 @@ msgid "Warning Level"
msgstr "Mức cảnh báo"
msgid "Buddy Comment"
-msgstr "Chú thích bạn thân"
+msgstr "Chú thích bạn chát"
-#, fuzzy, c-format
+#, 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"
+msgstr "Không thể kết nối tới máy phục vụ xác thực: %s"
-#, fuzzy, c-format
+#, 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 @@ msgstr "Kết nối được thiết lập, đã gửi cookie"
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ố."
+"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
+#, 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 @@ msgstr "Nhận được sự cho phép"
#. 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 @@ msgid "The client version you are using is too old. Please upgrade at %s"
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 @@ msgstr ""
#, 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 @@ msgstr[0] ""
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 @@ msgstr ""
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 @@ msgstr ""
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 @@ msgstr ""
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 @@ msgstr "Sửa chú thích bạn chát"
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 @@ msgstr "Tìm kiếm bạn chát theo địa chỉ thư..."
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 @@ msgstr "Hợi"
msgid "Other"
msgstr "Khác"
-#, fuzzy
msgid "Visible"
-msgstr "Giấu mặt"
+msgstr "Hiện rõ"
msgid "Friend Only"
-msgstr ""
+msgstr "Chỉ người bạn"
-#, fuzzy
msgid "Private"
-msgstr "Riêng tư"
+msgstr "Riêng"
msgid "QQ Number"
msgstr "Số QQ"
@@ -7355,9 +7293,8 @@ msgstr "Mã bưu điện"
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 @@ msgstr "Điện thoại di động"
msgid "Personal Introduction"
msgstr "Giới thiệu cá nhân"
-#, fuzzy
msgid "City/Area"
-msgstr "T.P."
+msgstr "T.P./Vùng"
-#, fuzzy
msgid "Publish Mobile"
-msgstr "Điện thoại di động cá nhân"
+msgstr "Xuất số di động"
-#, fuzzy
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"
+msgstr "Tử vi"
-#, fuzzy
msgid "Zodiac"
-msgstr "Ký hiệu hoàng đạo"
+msgstr "Hoàng đạo"
-#, fuzzy
msgid "Blood"
-msgstr "Bị chặn"
+msgstr "Máu"
-#, fuzzy
msgid "True"
-msgstr "Kim Ngưu"
+msgstr "Đúng"
-#, fuzzy
msgid "False"
-msgstr "Bị lỗi"
+msgstr "Sai"
-#, fuzzy
msgid "Modify Contact"
-msgstr "Sửa tài khoản"
+msgstr "Sửa liên lạc"
-#, fuzzy
msgid "Modify Address"
-msgstr "Địa chỉ nhà"
+msgstr "Sửa địa chỉ"
-#, fuzzy
msgid "Modify Extended Information"
-msgstr "Sửa đổi thông tin của tôi"
+msgstr "Sửa thông tin mở rộng"
-#, fuzzy
msgid "Modify Information"
-msgstr "Sửa đổi thông tin của tôi"
+msgstr "Sửa thông tin"
-#, fuzzy
msgid "Update"
-msgstr "Cập nhật lần cuối"
+msgstr "Cập nhật"
-#, fuzzy
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 @@ msgid "Note"
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 ""
+msgstr "Sửa đổi bản ghi nhớ của họ theo ý kiến của bạn"
-#, fuzzy
msgid "_Modify"
-msgstr "Sửa"
+msgstr "_Sửa"
-#, fuzzy
msgid "Memo Modify"
-msgstr "Sửa"
+msgstr "Sửa ghi nhớ"
-#, fuzzy
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 ""
+msgstr "Yêu cầu của bạn bị từ chối."
-#, fuzzy, c-format
+#, c-format
msgid "%u requires verification"
-msgstr "Cần thiết sự cho phép"
+msgstr "%u cần thiết sự thẩm tra"
-#, fuzzy
msgid "Add buddy question"
-msgstr "Có thêm bạn thân vào danh sách của bạn không?"
+msgstr "Hỏi câu cho bạn chát"
-#, fuzzy
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..."
+msgstr "Tiếc là tôi quá bận."
-#, fuzzy, c-format
+#, c-format
msgid "%u needs authorization"
-msgstr "Người dùng %d yêu cầu sự cho phép"
+msgstr "%u yêu cầu sự cho phép"
-#, fuzzy
msgid "Add buddy authorize"
-msgstr "Có thêm bạn thân vào danh sách của bạn không?"
+msgstr "Thêm sự cho phép bạn chát"
-#, fuzzy
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"
+msgstr "Bạn chát QQ"
-#, fuzzy
msgid "Add buddy"
-msgstr "Thêm bạn thân"
+msgstr "Thêm bạn chát"
-#, fuzzy
msgid "Invalid QQ Number"
-msgstr "Mặt QQ không hợp lệ"
+msgstr "Con số QQ không hợp lệ"
-#, fuzzy
msgid "Failed sending authorize"
-msgstr "Xin hãy cho phép tôi."
+msgstr "Lỗi gửi sự cho phép"
-#, fuzzy, c-format
+#, c-format
msgid "Failed removing buddy %u"
-msgstr "Không gỡ bỏ được bạn thân"
+msgstr "Lỗi gỡ bỏ bạn chát %u"
-#, fuzzy, c-format
+#, 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è."
+msgstr "Lỗi gỡ bỏ mình khỏi danh sách bạn chát của %d"
-#, fuzzy
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 @@ msgstr "Bạn đã được %s thêm"
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 @@ msgstr "ID nhóm"
msgid "QQ Qun"
msgstr "QQ Qun"
-#, fuzzy
msgid "Please enter Qun number"
-msgstr "Hãy nhập tên mới cho %s"
+msgstr "Hãy gõ con số Qun"
-#, fuzzy
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"
+msgstr "Bạn chỉ có khả năng tìm kiếm QQ bên bỉ\n"
-#, fuzzy
msgid "(Invalid UTF-8 string)"
-msgstr "Thiết lập ủy nhiệm không hợp lệ"
+msgstr "(Chuỗi UTF-8 không hợp lệ)"
-#, fuzzy
msgid "Not member"
-msgstr "Tôi không phải là thành viên"
+msgstr "Không phải thành viên"
-#, fuzzy
msgid "Member"
-msgstr "Là thành viên từ"
+msgstr "Thành viên"
-#, fuzzy
msgid "Requesting"
-msgstr "Hộp thoại yêu cầu"
+msgstr " Đăng yêu cầu"
-# Tên của ứng dụng khách tin nhắn khác: đừng dịch.
-#, fuzzy
msgid "Admin"
-msgstr "Adium"
+msgstr "Quản trị"
-#, fuzzy
msgid "Notice"
-msgstr "Ghi chú"
+msgstr "Thông báo"
-#, fuzzy
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"
+msgstr "Giới thiệu mình"
-#, fuzzy
msgid "Category"
-msgstr "Lỗi chát"
+msgstr "Loại"
-#, fuzzy
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"
+msgstr "Qun này không cho phép người khác tham gia"
-#, fuzzy
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"
+msgstr "Đã tham gia thành công Qun %s (%u)"
-#, fuzzy
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 ""
+msgstr "Tham gia Qun, Đáp ứng không rõ"
-#, fuzzy
msgid "Quit Qun"
-msgstr "QQ Qun"
+msgstr "Thoát khỏi Qun"
msgid ""
"Note, if you are the creator, \n"
@@ -7642,51 +7533,47 @@ msgstr ""
"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..."
+msgstr "Tiếc là nhóm này quá đầy"
-#, fuzzy
msgid "Successfully changed Qun members"
-msgstr "Bạn đã sửa đổi thành công thành viên Qun"
+msgstr "Đã thay đổi thành công thành viên Qun"
-#, fuzzy
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"
+msgstr "%u đã yêu cầu tham gia Qun %u cho %s"
-#, fuzzy, c-format
+#, c-format
msgid "%u request to join Qun %u"
-msgstr "Người dùng %d đã yêu cầu tham gia nhóm %d"
+msgstr "%u yêu cầu tham gia Qun %u"
-#, fuzzy, c-format
+#, 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 ""
+msgstr "<b>Tham gia Qun %u được %u tán thành cho %s</b>"
-#, fuzzy, c-format
+#, c-format
msgid "<b>Removed buddy %u.</b>"
-msgstr "Bỏ bạn chát"
+msgstr "<b>Đã gỡ bỏ bạn chát %u.</b>"
-#, fuzzy, c-format
+#, 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 @@ msgid "Level"
msgstr "Cấp"
msgid " VIP"
-msgstr ""
+msgstr " VIP"
msgid " TCP"
-msgstr ""
+msgstr " TCP"
-#, fuzzy
msgid " FromMobile"
-msgstr "Di động"
+msgstr " FromMobile"
-#, fuzzy
msgid " BindMobile"
-msgstr "Di động"
+msgstr " BindMobile"
-#, fuzzy
msgid " Video"
-msgstr "Ảnh động trực tiếp"
+msgstr " Phim"
-#, fuzzy
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..."
+msgstr "Chọn biểu tượng..."
-#, fuzzy, c-format
+#, 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"
+msgstr "<b>Thời gian đăng nhập</b>: %d-%d-%d, %d:%d:%d<br>\n"
-#, fuzzy, c-format
+#, 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"
+msgstr "<b>Tổng các bạn chát trực tuyến</b>: %d<br>\n"
-#, fuzzy, c-format
+#, 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"
+msgstr "<b>Cập nhật cuối:</b>: %d-%d-%d, %d:%d:%d<br>\n"
-#, fuzzy, c-format
+#, c-format
msgid "<b>Server</b>: %s<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
+msgstr "<b>Máy phục vụ</b>: %s<br>\n"
-#, fuzzy, c-format
+#, 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"
+msgstr "<b>Chế độ kết nối</b>: %s<br>\n"
-#, fuzzy, c-format
+#, c-format
msgid "<b>My Internet IP</b>: %s:%d<br>\n"
-msgstr "<b>Chế độ kết nối:</b> %s<br>\n"
+msgstr "<b>Địa chỉ IP Internet của mình</b>: %s:%d<br>\n"
-#, fuzzy, c-format
+#, c-format
msgid "<b>Sent</b>: %lu<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
+msgstr "<b>Đã gửi</b>: %lu<br>\n"
-#, fuzzy, c-format
+#, c-format
msgid "<b>Resend</b>: %lu<br>\n"
-msgstr "<b>Cập nhật cuối:</b> %s<br>\n"
+msgstr "<b>Gửi lại</b>: %lu<br>\n"
-#, fuzzy, c-format
+#, c-format
msgid "<b>Lost</b>: %lu<br>\n"
-msgstr "<b>Cập nhật cuối:</b> %s<br>\n"
+msgstr "<b>Bị mất</b>: %lu<br>\n"
-#, fuzzy, c-format
+#, c-format
msgid "<b>Received</b>: %lu<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
+msgstr "<b>Đã nhận</b>: %lu<br>\n"
-#, fuzzy, c-format
+#, c-format
msgid "<b>Received Duplicate</b>: %lu<br>\n"
-msgstr "<b>IP công của tôi:</b> %s<br>\n"
+msgstr "<b>Đã nhận bản sao</b>: %lu<br>\n"
-#, fuzzy, c-format
+#, 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"
+msgstr "<b>Thời gian</b>: %d-%d-%d, %d:%d:%d<br>\n"
-#, fuzzy, c-format
+#, 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 ""
+msgstr "<p><b>Người đóng góp mã nguồn</b>:<br>\n"
-#, fuzzy
msgid "<p><b>Lovely Patch Writers</b>:<br>\n"
-msgstr "<b>Cập nhật cuối:</b> %s<br>\n"
+msgstr "<p><b>Người tạo đắp vá rất hữu ích</b>:<br>\n"
-#, fuzzy
msgid "<p><b>Acknowledgement</b>:<br>\n"
-msgstr "<b>IP máy phục vụ </b>: %s: %d<br>\n"
+msgstr "<p><b>Công trạng</b>:<br>\n"
-#, fuzzy
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 ""
+msgstr "<i>Mời bạn tham gia !</i> :)"
-#, fuzzy, c-format
+#, c-format
msgid "About OpenQ %s"
-msgstr "Giới thiệu %s"
+msgstr "Giới thiệu OpenQ %s"
-#, fuzzy
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 ""
+msgstr "Cập nhật mọi QQ Qun"
-#, fuzzy
msgid "About OpenQ"
-msgstr "Giới thiệu %s"
+msgstr "Giới thiệu OpenQ"
-#, fuzzy
msgid "Modify Buddy Memo"
-msgstr "Địa chỉ nhà"
+msgstr "Sửa ghi nhớ bạn chát"
#. *< type
#. *< ui_requirement
@@ -7852,189 +7727,171 @@ msgstr "Địa chỉ nhà"
#. *< version
#. * summary
#. * description
-#, fuzzy
msgid "QQ Protocol Plugin"
-msgstr "Phần bổ sung\tgiao thức QQ"
+msgstr "Phần bổ sung giao thức QQ"
-#, fuzzy
msgid "Auto"
-msgstr "Tác giả"
+msgstr "Tự động"
-#, fuzzy
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 ""
+msgstr "QQ2008"
-#, fuzzy
msgid "Connect by TCP"
-msgstr "Kết nối bằng TCP"
+msgstr "Kết nối qua TCP"
-#, fuzzy
msgid "Show server notice"
-msgstr "Cổng máy phục vụ"
+msgstr "Hiện thông báo máy phục vụ"
-#, fuzzy
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 ""
+msgstr "Nhận được tin nhẳn thì cũng hiển thị phòng chát"
-#, fuzzy
msgid "Keep alive interval (seconds)"
-msgstr "Lỗi giữ cho kết nối hoạt động"
+msgstr "Khoảng giữ cho kết nối hoạt động (giây)"
-#, fuzzy
msgid "Update interval (seconds)"
-msgstr "Lỗi giữ cho kết nối hoạt động"
+msgstr "Khoảng cập nhật (giây)"
-#, fuzzy
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 ""
+msgstr "Lỗi yêu cầu hiệu bài, 0x%02X"
-#, fuzzy, c-format
+#, 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 ""
+msgstr "Gặp mã đáp ứng không được nhận ra khi đăng nhập (0x%02X)"
-#, fuzzy
msgid "Requesting captcha"
-msgstr "Đang yêu cầu sự chú ý của %s..."
+msgstr "Đang yêu cầu Captcha"
-#, fuzzy
msgid "Checking captcha"
-msgstr "Đang yêu cầu sự chú ý của %s..."
+msgstr "Đang kiểm tra Captcha"
-#, fuzzy
msgid "Failed captcha verification"
-msgstr "Lỗi xác thực Yahoo"
+msgstr "Lỗi thẩm tra Captcha"
-#, fuzzy
msgid "Captcha Image"
-msgstr "Lưu ảnh"
+msgstr "Ảnh Captcha"
-#, fuzzy
msgid "Enter code"
-msgstr "Nhập mật khẩu"
+msgstr "Gõ mã"
-#, fuzzy
msgid "QQ Captcha Verification"
-msgstr "Thẩm tra chứng nhận SSL"
+msgstr "Thẩm tra Captcha QQ"
-#, fuzzy
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..."
+msgstr "Đang lấy máy phục vụ"
-#, fuzzy
msgid "Requesting token"
-msgstr "Yêu cầu bị từ chối"
+msgstr "Đang yêu cầu hiệu bài"
-#, fuzzy
msgid "Unable to resolve hostname"
-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"
-#, fuzzy
msgid "Invalid server or port"
-msgstr "Lỗi không hợp lệ"
+msgstr "Sai máy phục vụ hay cổng"
-#, fuzzy
msgid "Connecting to server"
-msgstr "Đang kết nối tới máy phục vụ SILC"
+msgstr "Đang kết nối tới máy phục vụ"
-#, fuzzy
msgid "QQ Error"
-msgstr "Lỗi QQid"
+msgstr "Lỗi QQ"
-#, fuzzy, c-format
+#, c-format
msgid ""
"Server News:\n"
"%s\n"
"%s\n"
"%s"
-msgstr "Chuyển tiếp máy phục vụ ICQ"
+msgstr ""
+"Tin tức Máy phục vụ :\n"
+"%s\n"
+"%s\n"
+"%s"
-#, fuzzy, c-format
+#, c-format
msgid "%s:%s"
-msgstr "%s (%s)"
+msgstr "%s:%s"
-#, fuzzy, c-format
+#, c-format
msgid "From %s:"
-msgstr "Từ"
+msgstr "Từ %s:"
-#, fuzzy, c-format
+#, c-format
msgid ""
"Server notice From %s: \n"
"%s"
-msgstr "Hướng dẫn máy phục vụ : %s"
+msgstr ""
+"Thông báo máy phục vụ Từ %s: \n"
+"%s"
-#, fuzzy
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 ""
+"Lỗi đáp ứng %s(0x%02X)\n"
+"Phòng %u, đáp ứng 0x%02X"
-#, fuzzy
msgid "QQ Qun Command"
-msgstr "Lệnh"
+msgstr "Lệnh QQ Qun"
-#, fuzzy
msgid "Unable to decrypt login 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 đăng nhập"
-#, fuzzy
msgid "Unknown LOGIN CMD"
-msgstr "Lý do không rõ"
+msgstr "Câu lệnh đăng nhập (LOGIN CMD) không rõ"
-#, fuzzy
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 @@ msgstr "%d đã từ chối nhận tập tin %s"
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 @@ msgstr "Kiểu khoá công không được hỗ trợ"
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 @@ msgstr ""
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ớ"
+msgstr "Không đủ bộ nhớ"
-#, fuzzy
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 @@ msgstr "Ký điện và thẩm tra mọi thông điệp"
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 @@ msgstr "Thất bại: Cookie không hợp lệ"
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"
+msgstr "Nguyễn Văn Không_tên"
-#, fuzzy, c-format
+#, 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ụ"
+msgstr "Không nhận ra đáp ứng máy phục vụ"
-#, fuzzy
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 @@ msgstr "list: Liệt kê các phòng trên mạng Yahoo"
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 @@ msgstr "ID Yahoo"
#. *< 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 @@ msgid "Ignore conference and chatroom invitations"
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 @@ msgstr "Máy phục vụ chát Yahoo"
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 @@ msgstr "ID Yahoo"
#. *< 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 @@ msgid "Add buddy rejected"
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 @@ msgstr ""
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"
+msgstr "Sai gõ tên người dùng hay mật khẩu"
-#, fuzzy
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ụ."
+msgstr "Nhận được đáp ứng HTTP bất thường từ máy phục vụ"
-#, fuzzy, c-format
+#, c-format
msgid "Lost connection with %s: %s"
-msgstr ""
-"Mất kết nối với %s:\n"
-"%s"
+msgstr "Mất kết nối với %s: %s"
-#, fuzzy, c-format
+#, 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 @@ msgid "Start Doodling"
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 @@ msgstr "Tham gia với người dùng trong chat..."
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 @@ msgstr "Liên kết ưa thích 3"
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 @@ msgstr ""
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 @@ msgstr "Không thể lấy danh sách phòng."
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 @@ msgstr "Địa hạt"
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 @@ msgstr "Không thể mở %s: chuyển hướng quá nhiều lần"
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 @@ msgid "Connection refused."
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 @@ msgstr "Thông báo thư _mới"
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 @@ msgstr "Cơ _bản"
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 @@ msgstr "Đã bật"
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 @@ msgstr ""
"<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"
+"<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, "
-"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ạ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"
+msgstr "Màu nền của danh sách bạn chát"
-#, fuzzy
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"
+msgstr "Chú giải Ngoại tuyến"
-#, fuzzy
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 ""
+"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"
-#, fuzzy
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 @@ msgstr ""
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 @@ msgstr "Lấy thông t_in"
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 ""
+msgstr "Gọi thoại/_phim"
-#, fuzzy
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 @@ msgstr "Thêm thông _báo bạn chát..."
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 @@ msgstr "/Công cụ/Thông _báo bạn chát"
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 @@ msgid "By status"
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 @@ msgid "Re-enable"
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 @@ msgstr "Chào mừng lại !"
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 @@ msgstr "_Bí danh:"
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 @@ msgstr "/Công cụ"
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 @@ msgstr "Lờ"
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 @@ msgstr "/_Cuộc thoại"
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 @@ msgstr "/Cuộc thoại/_Lưu dạng..."
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"
+msgstr "/Cuộc thoại/_Phương tiện"
-#, fuzzy
msgid "/Conversation/Media/_Audio Call"
-msgstr "/Cuộc thoại/Nữ_a"
+msgstr "/Cuộc thoại/Phương tiện/Gọi th_oại"
-#, fuzzy
msgid "/Conversation/Media/_Video Call"
-msgstr "/Cuộc thoại/Nữ_a"
+msgstr "/Cuộc thoại/Phương tiện/Gọi _phim"
-#, fuzzy
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 @@ msgstr "/Cuộc thoại"
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"
+msgstr "/Cuộc thoại/Phương tiện/Gọi thoại"
-#, fuzzy
msgid "/Conversation/Media/Video Call"
-msgstr "/Cuộc thoại/Xem bản ghi"
+msgstr "/Cuộc thoại/Phương tiện/Gọi phim"
-#, fuzzy
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 @@ msgid "Fatal Error"
msgstr "Lỗi nghiêm trọng"
msgid "bug master"
-msgstr ""
+msgstr "chủ lỗi"
-#, fuzzy
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 @@ msgid "support/QA"
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 @@ msgid "Estonian"
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 @@ msgstr "Tiếng Phần Lan"
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 @@ msgstr "Tiếng Hin-đi"
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 @@ msgstr "Tiếng Gi-oa-gi-a"
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 @@ msgid "Kannada Translation team"
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 @@ msgstr "Tiếng Li-tu-a-ni"
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 @@ msgid "Swedish"
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 @@ msgid ""
"<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 @@ msgid ""
"primary language is <b>English</b>. You are welcome to post in another "
"language, but the responses may be less helpful.<br/><br/>"
msgstr ""
+"<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/>"
-#, fuzzy, c-format
+#, 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>"
+msgstr "<FONT SIZE=\"4\">Kênh IRC:</FONT> #pidgin on irc.freenode.net<BR><BR>"
-#, fuzzy, c-format
+#, 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 @@ msgstr "Màu siêu liên kết"
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"
+msgstr "Màu siêu liên kết đã thăm"
-#, fuzzy
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 @@ msgstr "Màu để vẽ tên của tin nhẳn hành động."
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 @@ msgid ""
"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 ""
+msgstr "hiển thị trợ giúp này, sau đó thoát"
-#, fuzzy
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 ""
+msgstr "hiển thị phiên bản hiện thời, sau đó thoát"
-#, fuzzy, c-format
+#, 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 @@ msgstr ""
"Đâ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 @@ msgstr ""
"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 @@ msgstr "Pidgin"
#, 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 @@ msgid ""
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 @@ msgstr "Mở mọi tin nhẳn"
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 ""
+msgstr "Hủy"
-#, fuzzy
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 @@ msgstr "<b>Chi tiết về phần bổ sung</b>"
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 @@ msgstr "_Lặp lại"
msgid "Pounce Target"
msgstr "Đích thông báo"
-#, fuzzy, c-format
+#, c-format
msgid "Started typing"
-msgstr "Bắt đầu gõ phím"
+msgstr "Đã bắt đầu gõ phím"
-#, fuzzy, c-format
+#, c-format
msgid "Paused while typing"
-msgstr "Tạm dừng khi gõ phím"
+msgstr "Đã tạm dừng khi gõ phím"
-#, fuzzy, c-format
+#, c-format
msgid "Signed on"
-msgstr "Đăng nhập"
+msgstr "Đã đăng nhập"
-#, fuzzy, c-format
+#, c-format
msgid "Returned from being idle"
-msgstr "%s hoạt động trở lại từ trạng thái nghỉ (%s)"
+msgstr "Đã trở lại từ trạng thái nghỉ"
-#, fuzzy, c-format
+#, c-format
msgid "Returned from being away"
-msgstr "Có mặt trở lại"
+msgstr "Đã có mặt trở lại"
-#, fuzzy, c-format
+#, c-format
msgid "Stopped typing"
-msgstr "Dừng gõ phím"
+msgstr "Đã dừng gõ phím"
-#, fuzzy, c-format
+#, c-format
msgid "Signed off"
-msgstr "Đăng xuất"
+msgstr "Đã đăng xuất"
-#, fuzzy, c-format
+#, 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"
+msgstr "Đã vắng mặt"
-#, fuzzy, c-format
+#, c-format
msgid "Sent a message"
-msgstr "Gửi tin nhẳn"
+msgstr "Đã gửi tin nhẳn"
-#, fuzzy, c-format
+#, 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!"
+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"
-#, fuzzy
msgid "Theme failed to unpack."
-msgstr "Sắc thái hình cười không giải nén được."
+msgstr "Sắc thái không giải nén được."
-#, fuzzy
msgid "Theme failed to load."
-msgstr "Sắc thái hình cười không giải nén được."
+msgstr "Sắc thái không nạp được."
-#, fuzzy
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 @@ msgid "Cl_ose conversations with the Escape key"
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 @@ msgstr "_Hiện biểu tượng trên khay:"
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 @@ msgstr "Không thể khởi chạy chương trình cấu hình máy phục vụ
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"
+msgstr "Bị tắt"
-#, fuzzy, c-format
+#, 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 @@ msgstr "Cổng cuố_i:"
#. TURN server
msgid "Relay Server (TURN)"
-msgstr ""
+msgstr "Máy phục vụ tiếp lại (TURN)"
-#, fuzzy
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 @@ msgstr "Không ủy nhiệm"
#. 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 @@ msgid "Konqueror"
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 @@ msgid "_Browser:"
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 @@ msgstr ""
"_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:"
+msgstr "_Bật âm thanh:"
-#, fuzzy
msgid "V_olume:"
-msgstr "Âm lượng:"
+msgstr "Â_m lượng:"
msgid "Play"
msgstr "Chơi"
@@ -13034,7 +12844,7 @@ msgid "Based on keyboard or mouse use"
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 @@ msgstr "Lưu _và Dùng"
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 @@ msgstr "Sửa hình cười"
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"
+msgstr "Bộ Quản lý Hình cười Riêng"
-#, fuzzy
msgid "Select Buddy Icon"
-msgstr "Chọn bạn chát"
+msgstr "Chọn biểu tượng bạn chát"
-#, fuzzy
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:"
+msgstr "Nhấn vào để thay đổi biểu tượng bạn chát cho tài khoản này."
-#, fuzzy
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 @@ msgstr ""
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 @@ msgid ""
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 @@ msgid ""
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 @@ msgstr "_Chép địa chỉ liên kết"
msgid "_Copy Email Address"
msgstr "_Chép địa chỉ thư"
-#, fuzzy
msgid "_Open File"
-msgstr "Mở tập tin..."
+msgstr "_Mở tập tin"
-#, fuzzy
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"
+msgstr "_Phát âm thanh"
-#, fuzzy
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 @@ msgstr "_Lấy thông tin"
msgid "_Invite"
msgstr "Mờ_i"
-#, fuzzy
msgid "_Modify..."
-msgstr "_Sửa"
+msgstr "_Sửa..."
-#, fuzzy
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 @@ msgstr "Chọn điều này thì tắt dùng biểu tượng xúc cảm kiểu
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 @@ msgstr "Áp dụng trong Tin Nhắn"
#. 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ụ"
+msgstr "Yêu cầu tên máy phục vụ"
-#, fuzzy
msgid "Enter an XMPP Server"
-msgstr "Nhập máy phục vụ hội thảo"
+msgstr "Nhập một máy phục vụ XMPP"
-#, fuzzy
msgid "Select an XMPP server to query"
-msgstr "Chọn một máy phục vụ hội thảo để hỏi"
+msgstr "Chọn một máy phục vụ XMPP để hỏi"
-#, fuzzy
msgid "Find Services"
-msgstr "Dịch vụ trực tuyến"
+msgstr "Tìm dịch vụ"
-#, fuzzy
msgid "Add to Buddy List"
-msgstr "Gửi danh sách bạn bè"
+msgstr "Thêm vào danh sách bạn chát"
-#, fuzzy
msgid "Gateway"
-msgstr "Đi vắng"
+msgstr "Cổng ra"
-#, fuzzy
msgid "Directory"
-msgstr "Thư mục chứa sổ theo dõi"
+msgstr "Thư mục"
-#, fuzzy
msgid "PubSub Collection"
-msgstr "Chọn âm thanh"
+msgstr "Tập hợp PubSub"
-#, fuzzy
msgid "PubSub Leaf"
-msgstr "Dịch vụ PubSub"
+msgstr "PubSub Leaf"
-#, fuzzy
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ụ"
+msgstr "Phát hiện Dịch vụ"
-#, fuzzy
msgid "_Browse"
-msgstr "Trình _duyệt:"
+msgstr "_Duyệt"
-#, fuzzy
msgid "Server does not exist"
-msgstr "Người dùng đó không tồn tại."
+msgstr "Máy phục vụ không tồn tại"
-#, fuzzy
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"
+msgstr "Máy phục vụ không hỗ trợ chức năng phát hiện dịch vụ"
-#, fuzzy
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 ""
+msgstr "Cho phép duyệt qua và đăng ký các dịch vụ."
-#, fuzzy
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 @@ msgid "Music Messaging Plugin for collaborative composition."
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 @@ msgstr "Chèn số đếm tin nhẳn mới vào thuộc tính _X"
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 @@ msgstr ""
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 @@ msgstr "Phông giao diện GTK+"
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õ"
+msgstr "Tắt chuỗi thông báo đang gõ"
-#, fuzzy
msgid "GTK+ Theme Control Settings"
-msgstr "Điều khiển sắc thái GTK+ Pidgin"
+msgstr "Thiết lập Điều khiển Sắc thái GTK+"
-#, fuzzy
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 @@ msgstr ""
#, 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"
+msgstr "Về sau"
-#, fuzzy
msgid "Download Now"
-msgstr "Người dùng trên %s: %s"
+msgstr "Tải về ngay"
#. *< type
#. *< ui_requirement
@@ -14208,12 +13979,11 @@ msgid "Conversation Window Send Button."
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 @@ msgid "Replaces text in outgoing messages according to user-defined rules."
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"
+msgstr "Mới đăng nhập"
-#, fuzzy
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 ""
+"Biểu tượng cho Liên lạc\n"
+"Biểu tượng cho Người lạ"
-#, fuzzy
msgid "Icon for Chat"
-msgstr "Tham gia Chat"
+msgstr "Biểu tượng cho Chát"
-#, fuzzy
msgid "Ignored"
-msgstr "Lờ"
+msgstr "Bị lờ"
-#, fuzzy
msgid "Founder"
-msgstr "To hơn"
+msgstr "Người sáng lập"
-# Tên trình duyệt Web
#. 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 ""
+msgstr "Nửa thao tác viên"
-#, fuzzy
msgid "Authorization dialog"
-msgstr "Cho phép"
+msgstr "Hộp thoại cho phép"
-#, fuzzy
msgid "Error dialog"
-msgstr "Lỗi "
+msgstr "Hộp thoại lỗi "
-#, fuzzy
msgid "Information dialog"
-msgstr "Thông tin"
+msgstr "Hộp thoại thông tin"
msgid "Mail dialog"
-msgstr ""
+msgstr "Hộp thoại thư tín"
-#, fuzzy
msgid "Question dialog"
-msgstr "Hộp thoại yêu cầu"
+msgstr "Hộp thoại câu hỏi"
-#, fuzzy
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 ""
+msgstr "Hộp thoại này có loại nào?"
-#, fuzzy
msgid "Status Icons"
-msgstr "Trạng thái cho %s"
+msgstr "Biểu tượng Trạng thái"
-#, fuzzy
msgid "Chatroom Emblems"
-msgstr "Miền địa phương phòng chát"
+msgstr "Hình tượng phòng chát"
-#, fuzzy
msgid "Dialog Icons"
-msgstr "Lưu biểu tượng"
+msgstr "Biểu tượng Hộp thoại"
-#, fuzzy
msgid "Pidgin Icon Theme Editor"
-msgstr "Điều khiển sắc thái GTK+ Pidgin"
+msgstr "Bộ Sửa Sắc thái Biểu tượng Pidgin"
-#, fuzzy
msgid "Contact"
-msgstr "Thông tin liên lạc"
+msgstr "Liên lạc"
-#, fuzzy
msgid "Pidgin Buddylist Theme Editor"
-msgstr "Danh sách bạn bè"
+msgstr "Bộ Sửa Sắc thái Danh sách Bạn chát Pidgin"
-#, fuzzy
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 @@ msgstr ""
#. *< 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 @@ msgstr ""
"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ả"
+msgstr "Âm thanh"
-#, fuzzy
msgid "Video"
-msgstr "Ảnh động trực tiếp"
+msgstr "Phim"
msgid "Output"
-msgstr ""
+msgstr "Kết xuất"
-#, fuzzy
msgid "_Plugin"
-msgstr "Phần bổ sung"
+msgstr "_Phần bổ sung"
-#, fuzzy
msgid "_Device"
-msgstr "Thiết bị"
+msgstr "_Thiết bị"
msgid "Input"
-msgstr ""
+msgstr "Đầu vào"
-#, fuzzy
msgid "P_lugin"
-msgstr "Phần bổ sung"
+msgstr "Phần bổ _sung"
-#, fuzzy
msgid "D_evice"
-msgstr "Thiết bị"
+msgstr "Thiết _bị"
#. *< magic
#. *< major version
@@ -14501,18 +14246,19 @@ msgstr "Thiết bị"
#. *< 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 @@ msgstr ""
"\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 @@ msgstr "Khởi chạy"
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 @@ msgstr "Tùy chọn Pidgin Windows"
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 @@ msgstr "Gửi và nhận các đoạn dòng XMPP thô."
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"
diff --git a/share/ca-certs/Entrust.net_Secure_Server_CA.pem b/share/ca-certs/Entrust.net_Secure_Server_CA.pem
new file mode 100644
index 0000000000..4b8939ccba
--- /dev/null
+++ b/share/ca-certs/Entrust.net_Secure_Server_CA.pem
@@ -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-----
diff --git a/share/ca-certs/Makefile.am b/share/ca-certs/Makefile.am
index b9a0d0b17f..4ec9d6ab76 100644
--- a/share/ca-certs/Makefile.am
+++ b/share/ca-certs/Makefile.am
@@ -2,6 +2,7 @@ CERTIFICATES = \
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 \