changeset 27866:b522393714d6

propagate from branch 'im.pidgin.pidgin' (head 46d8b3ade8e097ae2dc4ecc334074fe286f6b27e) to branch 'im.pidgin.pidgin.yaz' (head 782f03c632c5d3481df26ae115d5c6b70e6001ef)
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Thu, 07 Aug 2008 16:00:16 +0000
parents 76f1fd403f2c (diff) 86e7e2b5e59a (current diff)
children d777355b4a82
files libpurple/protocols/irc/irc.c libpurple/protocols/irc/parse.c libpurple/protocols/msn/msn.c libpurple/protocols/msn/slpsession.c libpurple/protocols/msn/slpsession.h libpurple/protocols/oscar/oscar.h libpurple/protocols/qq/buddy_status.c libpurple/protocols/qq/buddy_status.h libpurple/protocols/qq/keep_alive.c libpurple/protocols/qq/keep_alive.h libpurple/protocols/qq/login_logout.c libpurple/protocols/qq/login_logout.h libpurple/util.c
diffstat 168 files changed, 5865 insertions(+), 8551 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Thu Jul 31 06:23:55 2008 +0000
+++ b/COPYRIGHT	Thu Aug 07 16:00:16 2008 +0000
@@ -162,6 +162,7 @@
 Christian Hammond
 Erick Hamness
 Fred Hampton
+John Hanauer
 Phil Hannent
 Casey Harkins
 Andy Harrison
--- a/ChangeLog	Thu Jul 31 06:23:55 2008 +0000
+++ b/ChangeLog	Thu Aug 07 16:00:16 2008 +0000
@@ -12,6 +12,8 @@
 
 	IRC:
 	* /ctcp command (Vladislav Guberinić)
+	* Allow for auto-detection of incoming UTF-8 formatted text on
+	  accounts which are configured to use some other encoding.
 
 	MSN:
 	* Update MSN support to protocol 15 (Elliott Sales de Andrade, Jorge
@@ -23,6 +25,7 @@
 	* Aliasing is now supported server-side.
 	* Buddies are now emblemed. Bots and web clients should now be
 	  distinguished.
+	* Update smiley set for non-faces.
 	* Failing to update a buddy icon when the buddy has gone offline no
 	  longer crashes.
 	* Custom smileys received in a chat no longer go to a new window.
@@ -36,6 +39,7 @@
 	  side.
 	* Offer to add new buddies into the same contact as existing buddies
 	  in the same group if the alias given is the same.
+	* Minor smiley style update.
 
 	General:
 	* Group and Chat buddy list entries can now be given custom buddy
--- a/libpurple/plugins/perl/common/Account.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Account.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -107,10 +107,9 @@
     t_GL = NULL;
     t_len = av_len((AV *)SvRV(status_types));
 
-    for (i = 0; i < t_len; i++) {
-        STRLEN t_sl;
-        t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(status_types), i, 0), t_sl));
-    }
+    for (i = 0; i < t_len; i++)
+        t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(status_types), i, 0)));
+
     purple_account_set_status_types(account, t_GL);
 
 void
@@ -210,10 +209,9 @@
     t_GL = NULL;
     t_len = av_len((AV *)SvRV(list));
 
-    for (i = 0; i < t_len; i++) {
-        STRLEN t_sl;
-        t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(list), i, 0), t_sl));
-    }
+    for (i = 0; i < t_len; i++)
+        t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(list), i, 0)));
+
     purple_account_add_buddies(account, t_GL);
     g_list_free(t_GL);
 
@@ -240,18 +238,15 @@
     t_GL1 = NULL;
     t_len = av_len((AV *)SvRV(A));
 
-    for (i = 0; i < t_len; i++) {
-        STRLEN t_sl;
-        t_GL1 = g_list_append(t_GL1, SvPV(*av_fetch((AV *)SvRV(A), i, 0), t_sl));
-    }
+    for (i = 0; i < t_len; i++)
+        t_GL1 = g_list_append(t_GL1, SvPVutf8_nolen(*av_fetch((AV *)SvRV(A), i, 0)));
 
     t_GL2 = NULL;
     t_len = av_len((AV *)SvRV(B));
 
-    for (i = 0; i < t_len; i++) {
-        STRLEN t_sl;
-        t_GL2 = g_list_append(t_GL2, SvPV(*av_fetch((AV *)SvRV(B), i, 0), t_sl));
-    }
+    for (i = 0; i < t_len; i++)
+        t_GL2 = g_list_append(t_GL2, SvPVutf8_nolen(*av_fetch((AV *)SvRV(B), i, 0)));
+
     purple_account_remove_buddies(account, t_GL1, t_GL2);
     g_list_free(t_GL1);
     g_list_free(t_GL2);
@@ -315,18 +310,5 @@
     const char * name
     const char * protocol
 
-void
-purple_accounts_set_ui_ops(ops)
-    Purple::Account::UiOps ops
-
-Purple::Account::UiOps
-purple_accounts_get_ui_ops()
-
 Purple::Handle
 purple_accounts_get_handle()
-
-void
-purple_accounts_init()
-
-void
-purple_accounts_uninit()
--- a/libpurple/plugins/perl/common/AccountOpts.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/AccountOpts.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -44,10 +44,9 @@
 	t_GL = NULL;
 	t_len = av_len((AV *)SvRV(values));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(values), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(values), i, 0)));
+
 	RETVAL  = purple_account_option_list_new(text, pref_name, t_GL);
 OUTPUT:
 	RETVAL
@@ -133,10 +132,9 @@
 	t_GL = NULL;
 	t_len = av_len((AV *)SvRV(values));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(values), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(values), i, 0)));
+
 	purple_account_option_set_list(option, t_GL);
 
 void
--- a/libpurple/plugins/perl/common/BuddyIcon.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/BuddyIcon.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -45,7 +45,7 @@
 	int *width
 	int *height
 
-char *
+gchar_own *
 purple_buddy_icon_get_full_path(icon);
 	Purple::Buddy::Icon icon
 
@@ -69,8 +69,3 @@
 Purple::Handle
 purple_buddy_icons_get_handle();
 
-void
-purple_buddy_icons_init();
-
-void
-purple_buddy_icons_uninit()
--- a/libpurple/plugins/perl/common/BuddyList.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/BuddyList.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -246,25 +246,12 @@
 void
 purple_blist_request_add_group()
 
-void
-purple_blist_set_ui_ops(ops)
-	Purple::BuddyList::UiOps ops
-
-Purple::BuddyList::UiOps
-purple_blist_get_ui_ops()
-
 Purple::Handle
 purple_blist_get_handle()
 
 Purple::BuddyList::Node
 purple_blist_get_root()
 
-void
-purple_blist_init()
-
-void
-purple_blist_uninit()
-
 MODULE = Purple::BuddyList  PACKAGE = Purple::BuddyList::Node  PREFIX = purple_blist_node_
 PROTOTYPES: ENABLE
 
@@ -362,7 +349,7 @@
 	for (t_HE = hv_iternext(t_HV); t_HE != NULL; t_HE = hv_iternext(t_HV) ) {
 		t_key = hv_iterkey(t_HE, &len);
 		t_SV = *hv_fetch(t_HV, t_key, len, 0);
-		t_value = SvPV(t_SV, PL_na);
+		t_value = SvPVutf8_nolen(t_SV);
 
 		g_hash_table_insert(t_GHash, t_key, t_value);
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/plugins/perl/common/Certificate.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -0,0 +1,302 @@
+#include "module.h"
+
+struct cb_data {
+	SV *cb;
+	SV *user_data;
+};
+
+static void cb_cert_verify(PurpleCertificateVerificationStatus st, struct cb_data *d) {
+	dSP;
+
+	ENTER;
+	SAVETMPS;
+
+	PUSHMARK(SP);
+
+	XPUSHs(sv_2mortal(newSViv(st)));
+	XPUSHs(d->user_data);
+
+	PUTBACK;
+
+	call_sv(d->cb, G_VOID | G_EVAL);
+
+	if(SvTRUE(ERRSV)) {
+		STRLEN l_a;
+		purple_debug_warning("perl", "Failed to run 'certificate verify' callback: %s\n", SvPV(ERRSV, l_a));
+	}
+
+	FREETMPS;
+	LEAVE;
+
+	SvREFCNT_dec(d->cb);
+	SvREFCNT_dec(d->user_data);
+
+	g_free(d);
+}
+
+MODULE = Purple::Certificate  PACKAGE = Purple::Certificate  PREFIX = purple_certificate_
+PROTOTYPES: ENABLE
+
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::Certificate", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_CERTIFICATE_##name}
+		const_iv(INVALID),
+		const_iv(VALID),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
+
+void
+purple_certificate_add_ca_search_path(path)
+	const char* path
+
+gboolean
+purple_certificate_check_subject_name(crt, name)
+	Purple::Certificate crt
+	const gchar* name
+
+Purple::Certificate
+purple_certificate_copy(crt)
+	Purple::Certificate crt
+
+void
+purple_certificate_destroy(crt)
+	Purple::Certificate crt
+
+void
+purple_certificate_display_x509(crt)
+	Purple::Certificate crt
+
+## changed order of arguments, so that $cert->export($file) could be used
+gboolean
+purple_certificate_export(crt, filename)
+	const gchar* filename
+	Purple::Certificate crt
+	C_ARGS:
+		filename, crt
+
+Purple::Certificate::Pool
+purple_certificate_find_pool(scheme_name, pool_name)
+	const gchar* scheme_name
+	const gchar* pool_name
+
+Purple::Certificate::Scheme
+purple_certificate_find_scheme(name)
+	const gchar* name
+
+Purple::Certificate::Verifier
+purple_certificate_find_verifier(scheme_name, ver_name)
+	const gchar* scheme_name
+	const gchar* ver_name
+
+Purple::Handle
+purple_certificate_get_handle()
+
+gchar_own*
+purple_certificate_get_issuer_unique_id(crt)
+	Purple::Certificate crt
+
+gchar_own*
+purple_certificate_get_subject_name(crt)
+	Purple::Certificate crt
+
+gchar_own*
+purple_certificate_get_unique_id(crt)
+	Purple::Certificate crt
+
+Purple::Certificate
+purple_certificate_import(scheme, filename)
+	Purple::Certificate::Scheme scheme
+	const gchar* filename
+
+gboolean
+purple_certificate_register_pool(pool)
+	Purple::Certificate::Pool pool
+
+gboolean
+purple_certificate_register_scheme(scheme)
+	Purple::Certificate::Scheme scheme
+
+gboolean
+purple_certificate_register_verifier(vr)
+	Purple::Certificate::Verifier vr
+
+gboolean
+purple_certificate_signed_by(crt, issuer)
+	Purple::Certificate crt
+	Purple::Certificate issuer
+
+gboolean
+purple_certificate_unregister_pool(pool)
+	Purple::Certificate::Pool pool
+
+gboolean
+purple_certificate_unregister_scheme(scheme)
+	Purple::Certificate::Scheme scheme
+
+gboolean
+purple_certificate_unregister_verifier(vr)
+	Purple::Certificate::Verifier vr
+
+void
+purple_certificate_verify_complete(vrq, st)
+	Purple::Certificate::VerificationRequest vrq
+	Purple::Certificate::VerificationStatus st
+
+gboolean
+purple_certificate_get_times(crt, OUTLIST time_t activation, OUTLIST time_t expiration)
+	Purple::Certificate crt
+	PROTOTYPE: $
+
+void
+purple_certificate_destroy_list(...)
+	PREINIT:
+	GList* l = NULL;
+	int i = 0;
+	CODE:
+		for(i = 0; i < items; i++) { /* PurpleCertificate */
+			l = g_list_prepend(l, purple_perl_ref_object(ST(i)));
+		}
+		purple_certificate_destroy_list(l);
+
+void
+purple_certificate_get_pools()
+	PREINIT:
+		GList *l;
+	PPCODE:
+		for(l = purple_certificate_get_pools(); l; l = l->next) {
+			XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Certificate::Pool")));
+		}
+
+void
+purple_certificate_get_schemes()
+	PREINIT:
+		GList *l;
+	PPCODE:
+		for(l = purple_certificate_get_schemes(); l; l = l->next) {
+			XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Certificate::Scheme")));
+		}
+
+void
+purple_certificate_get_verifiers()
+	PREINIT:
+		GList *l;
+	PPCODE:
+		for(l = purple_certificate_get_verifiers(); l; l = l->next) {
+			XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Certificate::Verifier")));
+		}
+
+void
+purple_certificate_check_signature_chain(...)
+	PREINIT:
+		GList *l = NULL;
+		gboolean ret;
+		int i;
+	PPCODE:
+		for(i = 0; i < items; i++) { /* PurpleCertificate */
+			l = g_list_prepend(l, purple_perl_ref_object(ST(i)));
+		}
+		l = g_list_reverse(l);
+		ret = purple_certificate_check_signature_chain(l);
+		g_list_free(l);
+		if(ret) XSRETURN_YES;
+		XSRETURN_NO;
+
+SV*
+purple_certificate_get_fingerprint_sha1(crt)
+	Purple::Certificate crt
+	PREINIT:
+		GByteArray *gba = NULL;
+	CODE:
+		gba = purple_certificate_get_fingerprint_sha1(crt);
+		RETVAL = newSVpv(gba->data, gba->len);
+		g_byte_array_free(gba, TRUE);
+	OUTPUT:
+		RETVAL
+
+void
+purple_certificate_verify(verifier, subject_name, cert_chain, cb, cb_data)
+	Purple::Certificate::Verifier verifier
+	const gchar* subject_name
+	AV* cert_chain
+	CV *cb
+	SV *cb_data
+	PREINIT:
+		GList *l = NULL;
+		int len = 0, i = 0;
+		struct cb_data *d = NULL;
+	PPCODE:
+		len = av_len(cert_chain) + 1;
+		for(i = 0; i < len; i++) {
+			SV **sv = av_fetch(cert_chain, i, 0);
+			if(!sv || !purple_perl_is_ref_object(*sv)) {
+				g_list_free(l);
+				warn("Purple::Certificate::verify: cert_chain: non-purple object in array...");
+				XSRETURN_UNDEF;
+			}
+			l = g_list_prepend(l, purple_perl_ref_object(*sv));
+		}
+		l = g_list_reverse(l);
+
+		d = g_new0(struct cb_data, 1);
+		d->cb = newSVsv(ST(3));
+		d->user_data = newSVsv(cb_data);
+		
+		purple_certificate_verify(verifier, subject_name, l, (PurpleCertificateVerifiedCallback) cb_cert_verify, d);
+
+		g_list_free(l);
+
+MODULE = Purple::Certificate  PACKAGE = Purple::Certificate::Pool  PREFIX = purple_certificate_pool_
+PROTOTYPES: ENABLE
+
+void
+purple_certificate_pool_get_idlist(pool)
+	Purple::Certificate::Pool pool
+	PREINIT:
+		GList *l, *b;
+	PPCODE:
+		b = purple_certificate_pool_get_idlist(pool);
+		for(l = b; l; l = l->next) {
+			XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
+		}
+		purple_certificate_pool_destroy_idlist(b);
+
+gboolean
+purple_certificate_pool_contains(pool, id)
+	Purple::Certificate::Pool pool
+	const gchar* id
+
+gboolean
+purple_certificate_pool_delete(pool, id)
+	Purple::Certificate::Pool pool
+	const gchar* id
+
+Purple::Certificate::Scheme
+purple_certificate_pool_get_scheme(pool)
+	Purple::Certificate::Pool pool
+
+gchar_own*
+purple_certificate_pool_mkpath(pool, id)
+	Purple::Certificate::Pool pool
+	const gchar* id
+
+Purple::Certificate
+purple_certificate_pool_retrieve(pool, id)
+	Purple::Certificate::Pool pool
+	const gchar* id
+
+gboolean
+purple_certificate_pool_store(pool, id, crt)
+	Purple::Certificate::Pool pool
+	const gchar* id
+	Purple::Certificate crt
+
+gboolean
+purple_certificate_pool_usable(pool)
+	Purple::Certificate::Pool pool
+
--- a/libpurple/plugins/perl/common/Cipher.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Cipher.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -3,6 +3,49 @@
 MODULE = Purple::Cipher  PACKAGE = Purple::Cipher  PREFIX = purple_cipher_
 PROTOTYPES: ENABLE
 
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::Cipher::BatchMode", 1);
+	HV *cipher_caps = gv_stashpv("Purple::Cipher::Caps", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_CIPHER_BATCH_MODE_##name}
+		const_iv(ECB),
+		const_iv(CBC),
+#undef const_iv
+	};
+
+	static const constiv bm_const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_CIPHER_CAPS_##name}
+		const_iv(SET_OPT),
+		const_iv(GET_OPT),
+		const_iv(INIT),
+		const_iv(RESET),
+		const_iv(UNINIT),
+		const_iv(SET_IV),
+		const_iv(APPEND),
+		const_iv(DIGEST),
+		const_iv(ENCRYPT),
+		const_iv(DECRYPT),
+		const_iv(SET_SALT),
+		const_iv(GET_SALT_SIZE),
+		const_iv(SET_KEY),
+		const_iv(GET_KEY_SIZE),
+		const_iv(SET_BATCH_MODE),
+		const_iv(GET_BATCH_MODE),
+		const_iv(GET_BLOCK_SIZE),
+		const_iv(SET_KEY_WITH_LEN),
+		const_iv(UNKNOWN),
+#undef const_iv
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+
+	for (civ = bm_const_iv + sizeof(bm_const_iv) / sizeof(bm_const_iv[0]); civ-- > bm_const_iv; )
+		newCONSTSUB(cipher_caps, (char *)civ->name, newSViv(civ->iv));
+}
+
 const gchar *
 purple_cipher_get_name(cipher)
 	Purple::Cipher cipher
@@ -11,14 +54,51 @@
 purple_cipher_get_capabilities(cipher)
 	Purple::Cipher cipher
 
-gboolean
-purple_cipher_digest_region(name, data, data_len, in_len, digest, out_len)
-	const gchar * name
-	const guchar * data
-	size_t data_len
+size_t
+purple_cipher_digest_region(name, data_sv, in_len, digest)
+	const gchar *name
+	SV *data_sv
 	size_t in_len
-	guchar &digest
-	size_t * out_len
+	SV *digest
+	PREINIT:
+		gboolean ret;
+		guchar *buff = NULL;
+		guchar *data = NULL;
+		size_t data_len;
+	CODE:
+		data = SvPV(data_sv, data_len);
+		SvUPGRADE(digest, SVt_PV);
+		buff = SvGROW(digest, in_len);
+		ret = purple_cipher_digest_region(name, data, data_len, in_len, buff, &RETVAL);
+		if(!ret) {
+			SvSetSV_nosteal(digest, &PL_sv_undef);
+			XSRETURN_UNDEF;
+		}
+		SvCUR_set(digest, RETVAL);
+		SvPOK_only(digest);
+	OUTPUT:
+		RETVAL
+
+gchar_own*
+purple_cipher_http_digest_calculate_response(algorithm, method, digest_uri, qop, entity, nonce, nonce_count, client_nonce, session_key)
+	const gchar* algorithm
+	const gchar* method
+	const gchar* digest_uri
+	const gchar* qop
+	const gchar* entity
+	const gchar* nonce
+	const gchar* nonce_count
+	const gchar* client_nonce
+	const gchar* session_key
+
+gchar_own*
+purple_cipher_http_digest_calculate_session_key(algorithm, username, realm, password, nonce, client_nonce)
+	const gchar* algorithm
+	const gchar* username
+	const gchar* realm
+	const gchar* password
+	const gchar* nonce
+	const gchar* client_nonce
 
 MODULE = Purple::Cipher  PACKAGE = Purple::Ciphers  PREFIX = purple_ciphers_
 PROTOTYPES: ENABLE
@@ -48,12 +128,6 @@
 Purple::Handle
 purple_ciphers_get_handle()
 
-void
-purple_ciphers_init()
-
-void
-purple_ciphers_uninit()
-
 MODULE = Purple::Cipher  PACKAGE = Purple::Cipher::Context  PREFIX = purple_cipher_context_
 PROTOTYPES: ENABLE
 
@@ -69,17 +143,19 @@
 	gchar *name
 
 Purple::Cipher::Context
-purple_cipher_context_new(cipher, extra)
+purple_cipher_context_new(klass, cipher, extra = NULL)
 	Purple::Cipher cipher
 	void *extra
+	C_ARGS: cipher, extra
 
 Purple::Cipher::Context
-purple_cipher_context_new_by_name(name, extra)
+purple_cipher_context_new_by_name(klass, name, extra = NULL)
 	gchar *name
 	void *extra
+	C_ARGS: name, extra
 
 void
-purple_cipher_context_reset(context, extra)
+purple_cipher_context_reset(context, extra = NULL)
 	Purple::Cipher::Context context
 	gpointer extra
 
@@ -88,46 +164,103 @@
 	Purple::Cipher::Context context
 
 void
-purple_cipher_context_set_iv(context, iv, len)
-	Purple::Cipher::Context context
-	guchar * iv
-	size_t len
+purple_cipher_context_set_iv(Purple::Cipher::Context context, guchar *iv, size_t length(iv))
+	PROTOTYPE: $$
 
 void
-purple_cipher_context_append(context, data, len)
+purple_cipher_context_append(Purple::Cipher::Context context, guchar *data, size_t length(data))
+	PROTOTYPE: $$
+
+size_t
+purple_cipher_context_digest(context, in_len, digest)
 	Purple::Cipher::Context context
-	guchar * data
-	size_t len
+	size_t in_len
+	SV *digest
+	PREINIT:
+		gboolean ret;
+		guchar *buff = NULL;
+	CODE:
+		SvUPGRADE(digest, SVt_PV);
+		buff = SvGROW(digest, in_len);
+		ret = purple_cipher_context_digest(context, in_len, buff, &RETVAL);
+		if(!ret) {
+			SvSetSV_nosteal(digest, &PL_sv_undef);
+			XSRETURN_UNDEF;
+		}
+		SvCUR_set(digest, RETVAL);
+		SvPOK_only(digest);
+	OUTPUT:
+		RETVAL
 
-gboolean
-purple_cipher_context_digest(context, in_len, digest, out_len)
+size_t
+purple_cipher_context_digest_to_str(context, in_len, digest_s)
 	Purple::Cipher::Context context
 	size_t in_len
-	guchar &digest
-	size_t &out_len
-
-gboolean
-purple_cipher_context_digest_to_str(context, in_len, digest_s, out_len)
-	Purple::Cipher::Context context
-	size_t in_len
-	gchar &digest_s
-	size_t &out_len
+	SV *digest_s
+	PREINIT:
+		gboolean ret;
+		gchar *buff = NULL;
+	CODE:
+		in_len += 1; /* perl shouldn't need to care about '\0' at the end */
+		SvUPGRADE(digest_s, SVt_PV);
+		buff = SvGROW(digest_s, in_len);
+		ret = purple_cipher_context_digest_to_str(context, in_len, buff, &RETVAL);
+		if(!ret) {
+			SvSetSV_nosteal(digest_s, &PL_sv_undef);
+			XSRETURN_UNDEF;
+		}
+		SvCUR_set(digest_s, RETVAL);
+		SvPOK_only(digest_s);
+	OUTPUT:
+		RETVAL
 
 gint
-purple_cipher_context_encrypt(context, data, len, output, outlen)
+purple_cipher_context_encrypt(context, data_sv, output, OUTLIST size_t outlen)
 	Purple::Cipher::Context context
-	guchar &data
-	size_t len
-	guchar &output
-	size_t &outlen
+	SV *data_sv
+	SV *output
+	PROTOTYPE: $$$
+	PREINIT:
+		size_t datalen;
+		guchar *buff = NULL;
+		guchar *data = NULL;
+	CODE:
+		data = SvPV(data_sv, datalen);
+		SvUPGRADE(output, SVt_PV);
+		buff = SvGROW(output, datalen);
+		RETVAL = purple_cipher_context_encrypt(context, data, datalen, buff, &outlen);
+		if(outlen != 0) {
+			SvPOK_only(output);
+			SvCUR_set(output, outlen);
+		} else {
+			SvSetSV_nosteal(output, &PL_sv_undef);
+		}
+	OUTPUT:
+		RETVAL
 
 gint
-purple_cipher_context_decrypt(context, data, len, output, outlen)
+purple_cipher_context_decrypt(context, data_sv, output, OUTLIST size_t outlen)
 	Purple::Cipher::Context context
-	guchar &data
-	size_t len
-	guchar &output
-	size_t &outlen
+	SV *data_sv
+	SV *output
+	PROTOTYPE: $$$
+	PREINIT:
+		size_t datalen;
+		guchar *buff = NULL;
+		guchar *data = NULL;
+	CODE:
+		data = SvPV(data_sv, datalen);
+		SvUPGRADE(output, SVt_PV);
+		buff = SvGROW(output, datalen);
+		RETVAL = purple_cipher_context_decrypt(context, data, datalen, buff, &outlen);
+		if(outlen != 0) {
+			SvPOK_only(output);
+			SvCUR_set(output, outlen);
+		} else {
+			SvSetSV_nosteal(output, &PL_sv_undef);
+		}
+	OUTPUT:
+		RETVAL
 
 void
 purple_cipher_context_set_salt(context, salt)
@@ -155,3 +288,21 @@
 gpointer
 purple_cipher_context_get_data(context)
 	Purple::Cipher::Context context
+
+Purple::Cipher::BatchMode
+purple_cipher_context_get_batch_mode(context)
+	Purple::Cipher::Context context
+
+size_t
+purple_cipher_context_get_block_size(context)
+	Purple::Cipher::Context context
+
+void
+purple_cipher_context_set_batch_mode(context, mode)
+	Purple::Cipher::Context context
+	Purple::Cipher::BatchMode mode
+
+void
+purple_cipher_context_set_key_with_len(Purple::Cipher::Context context, guchar *key, size_t length(key))
+	PROTOTYPE: $$
+
--- a/libpurple/plugins/perl/common/Connection.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Connection.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -87,18 +87,5 @@
 		XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Connection")));
 	}
 
-void
-purple_connections_set_ui_ops(ops)
-	Purple::Connection::UiOps ops
-
-Purple::Connection::UiOps
-purple_connections_get_ui_ops()
-
-void
-purple_connections_init()
-
-void
-purple_connections_uninit()
-
 Purple::Handle
 purple_connections_get_handle()
--- a/libpurple/plugins/perl/common/Conversation.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Conversation.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -124,12 +124,6 @@
 Purple::Handle
 purple_conversations_get_handle()
 
-void
-purple_conversations_init()
-
-void
-purple_conversations_uninit()
-
 MODULE = Purple::Conversation  PACKAGE = Purple::Conversation  PREFIX = purple_conversation_
 PROTOTYPES: ENABLE
 
@@ -342,10 +336,8 @@
 	t_GL = NULL;
 	t_len = av_len((AV *)SvRV(users));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(users), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(users), i, 0)));
 
 	for (l = purple_conv_chat_set_users(chat, t_GL); l != NULL; l = l->next) {
 		XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry")));
@@ -382,10 +374,8 @@
 	t_GL = NULL;
 	t_len = av_len((AV *)SvRV(ignored));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(ignored), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(ignored), i, 0)));
 
 	for (l = purple_conv_chat_set_ignored(chat, t_GL); l != NULL; l = l->next) {
 		XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry")));
@@ -441,26 +431,20 @@
 	t_GL_users = NULL;
 	t_len = av_len((AV *)SvRV(users));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL_users = g_list_append(t_GL_users, SvPV(*av_fetch((AV *)SvRV(users), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL_users = g_list_append(t_GL_users, SvPVutf8_nolen(*av_fetch((AV *)SvRV(users), i, 0)));
 
 	t_GL_flags = NULL;
 	t_len = av_len((AV *)SvRV(flags));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL_flags = g_list_append(t_GL_flags, SvPV(*av_fetch((AV *)SvRV(flags), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL_flags = g_list_append(t_GL_flags, SvPVutf8_nolen(*av_fetch((AV *)SvRV(flags), i, 0)));
 
 	t_GL_extra_msgs = NULL;
 	t_len = av_len((AV *)SvRV(extra_msgs));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL_extra_msgs = g_list_append(t_GL_extra_msgs, SvPV(*av_fetch((AV *)SvRV(extra_msgs), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL_extra_msgs = g_list_append(t_GL_extra_msgs, SvPVutf8_nolen(*av_fetch((AV *)SvRV(extra_msgs), i, 0)));
 
 	purple_conv_chat_add_users(chat, t_GL_users, t_GL_extra_msgs, t_GL_flags, new_arrivals);
 
--- a/libpurple/plugins/perl/common/Core.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Core.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -19,10 +19,3 @@
 const char *
 purple_core_get_ui()
 
-void
-purple_core_set_ui_ops(ops)
-    Purple::Core::UiOps ops
-
-Purple::Core::UiOps
-purple_core_get_ui_ops()
-
--- a/libpurple/plugins/perl/common/FT.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/FT.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -112,10 +112,6 @@
 purple_xfer_get_type(xfer)
 	Purple::Xfer xfer
 
-Purple::XferUiOps
-purple_xfer_get_ui_ops(xfer)
-	Purple::Xfer xfer
-
 gboolean 
 purple_xfer_is_canceled(xfer)
 	Purple::Xfer xfer
@@ -188,11 +184,4 @@
 MODULE = Purple::Xfer  PACKAGE = Purple::Xfers  PREFIX = purple_xfers_
 PROTOTYPES: ENABLE
 
-Purple::XferUiOps
-purple_xfers_get_ui_ops()
- 
 
-void 
-purple_xfers_set_ui_ops(ops)
-	Purple::XferUiOps ops
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/plugins/perl/common/Idle.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -0,0 +1,12 @@
+#include "module.h"
+
+MODULE = Purple::Idle  PACKAGE = Purple::Idle  PREFIX = purple_idle_
+PROTOTYPES: ENABLE
+
+void
+purple_idle_touch()
+
+void
+purple_idle_set(time)
+	time_t time
+
--- a/libpurple/plugins/perl/common/Log.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Log.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -100,9 +100,6 @@
 	Purple::Account account
 
 void
-purple_log_init()
-
-void
 purple_log_logger_free(logger)
 	Purple::Log::Logger logger
 
--- a/libpurple/plugins/perl/common/Makefile.mingw	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Makefile.mingw	Thu Aug 07 16:00:16 2008 +0000
@@ -39,11 +39,13 @@
 				BuddyList.xs \
 				Cipher.xs \
 				Cmds.xs \
+				Certificate.xs \
 				Connection.xs \
 				Conversation.xs \
 				Core.xs \
 				Debug.xs \
 				FT.xs \
+				Idle.xs \
 				Purple.xs \
 				ImgStore.xs \
 				Log.xs \
@@ -67,6 +69,7 @@
 				Status.xs \
 				Stringref.xs \
 				Util.xs \
+				Whiteboard.xs \
 				XMLNode.xs
 
 #FALLBACKS =	const-c.inc const-xs.inc
--- a/libpurple/plugins/perl/common/Network.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Network.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -18,9 +18,6 @@
 const char *
 purple_network_get_public_ip()
 
-void
-purple_network_init()
-
 const unsigned char *
 purple_network_ip_atoi(ip)
 	const char *ip
--- a/libpurple/plugins/perl/common/Notify.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Notify.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -93,13 +93,6 @@
 	Purple::NotifyCloseCallback cb
 	gpointer user_data
 
-Purple::NotifyUiOps
-purple_notify_get_ui_ops()
-
-void
-purple_notify_set_ui_ops(ops)
-	Purple::NotifyUiOps ops
-
 void *
 purple_notify_message(handle, type, title, primary, secondary, cb, user_data)
 	void * handle
--- a/libpurple/plugins/perl/common/Plugin.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Plugin.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -164,9 +164,3 @@
 
 Purple::Handle
 purple_plugins_get_handle()
-
-void
-purple_plugins_init()
-
-void
-purple_plugins_uninit()
--- a/libpurple/plugins/perl/common/PluginPref.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/PluginPref.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -62,7 +62,7 @@
 	const char *label
 # Do the appropriate conversion based on the perl type specified.
 # Currently only Strings and Ints will work.
-	gpointer choice = (SvPOKp($arg) ? SvPV($arg, PL_na) : (SvIOKp($arg) ? GINT_TO_POINTER(SvIV($arg)) : NULL));
+	gpointer choice = (SvPOKp($arg) ? SvPVutf8_nolen($arg) : (SvIOKp($arg) ? GINT_TO_POINTER(SvIV($arg)) : NULL));
 
 void
 purple_plugin_pref_destroy(pref)
@@ -176,5 +176,7 @@
 		gpp_type = PURPLE_PLUGIN_PREF_CHOICE;
 	} else if (type == 2) {
 		gpp_type = PURPLE_PLUGIN_PREF_INFO;
+	} else if (type == 3) {
+		gpp_type = PURPLE_PLUGIN_PREF_STRING_FORMAT;
 	}
 	purple_plugin_pref_set_type(pref, gpp_type);
--- a/libpurple/plugins/perl/common/Pounce.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Pounce.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -121,15 +121,9 @@
 Purple::Handle
 purple_pounces_get_handle()
 
-void
-purple_pounces_init()
-
 gboolean
 purple_pounces_load()
 
 void
-purple_pounces_uninit()
-
-void
 purple_pounces_unregister_handler(ui)
 	const char *ui
--- a/libpurple/plugins/perl/common/Prefs.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Prefs.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -53,14 +53,35 @@
 	t_GL = NULL;
 	t_len = av_len((AV *)SvRV(value));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(value), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(value), i, 0)));
+
 	purple_prefs_add_string_list(name, t_GL);
 	g_list_free(t_GL);
 
 void
+purple_prefs_add_path(name, value)
+	const char *name
+	const char *value
+
+void
+purple_prefs_add_path_list(name, value)
+	const char *name
+	SV *value
+PREINIT:
+	GList *t_GL;
+	int i, t_len;
+PPCODE:
+	t_GL = NULL;
+	t_len = av_len((AV *)SvRV(value));
+
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(value), i, 0)));
+
+	purple_prefs_add_path_list(name, t_GL);
+	g_list_free(t_GL);
+
+void
 purple_prefs_destroy()
 
 guint
@@ -90,6 +111,21 @@
 purple_prefs_exists(name)
 	const char *name
 
+const char *
+purple_prefs_get_path(name)
+	const char *name
+
+void
+purple_prefs_get_path_list(name)
+	const char *name
+PREINIT:
+	GList *l;
+PPCODE:
+	for (l = purple_prefs_get_path_list(name); l != NULL; l = g_list_delete_link(l, l)) {
+		XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
+		g_free(l->data);
+	}
+
 gboolean
 purple_prefs_get_bool(name)
 	const char *name
@@ -120,9 +156,6 @@
 purple_prefs_get_type(name)
 	const char *name
 
-void
-purple_prefs_init()
-
 gboolean
 purple_prefs_load()
 
@@ -171,14 +204,36 @@
 	t_GL = NULL;
 	t_len = av_len((AV *)SvRV(value));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(value), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(value), i, 0)));
+
 	purple_prefs_set_string_list(name, t_GL);
 	g_list_free(t_GL);
 
 void
+purple_prefs_set_path(name, value)
+	const char *name
+	const char *value
+
+void
+purple_prefs_set_path_list(name, value)
+	const char *name
+	SV *value
+PREINIT:
+	GList *t_GL;
+	int i, t_len;
+PPCODE:
+	t_GL = NULL;
+	t_len = av_len((AV *)SvRV(value));
+
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(value), i, 0)));
+
+	purple_prefs_set_path_list(name, t_GL);
+	g_list_free(t_GL);
+
+
+void
 purple_prefs_trigger_callback(name)
 	const char *name
 
@@ -194,7 +249,4 @@
 	}
 
 void
-purple_prefs_uninit()
-
-void
 purple_prefs_update_old()
--- a/libpurple/plugins/perl/common/Privacy.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Privacy.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -3,16 +3,6 @@
 MODULE = Purple::Privacy  PACKAGE = Purple::Privacy  PREFIX = purple_privacy_
 PROTOTYPES: ENABLE
 
-Purple::Privacy::UiOps
-purple_privacy_get_ui_ops()
-
-void
-purple_privacy_init()
-
-void
-purple_privacy_set_ui_ops(ops)
-	Purple::Privacy::UiOps ops
-
 gboolean
 purple_privacy_permit_add(account, name, local_only)
 	Purple::Account account
--- a/libpurple/plugins/perl/common/Proxy.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Proxy.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -24,9 +24,6 @@
 Purple::Handle
 purple_proxy_get_handle()
 
-void
-purple_proxy_init()
-
 MODULE = Purple::Proxy  PACKAGE = Purple::ProxyInfo  PREFIX = purple_proxy_info_
 PROTOTYPES: ENABLE
 
--- a/libpurple/plugins/perl/common/Purple.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Purple.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -6,6 +6,7 @@
 PURPLE_PERL_BOOT_PROTO(Account__Option);
 PURPLE_PERL_BOOT_PROTO(Buddy__Icon);
 PURPLE_PERL_BOOT_PROTO(BuddyList);
+PURPLE_PERL_BOOT_PROTO(Certificate);
 PURPLE_PERL_BOOT_PROTO(Cipher);
 PURPLE_PERL_BOOT_PROTO(Cmd);
 PURPLE_PERL_BOOT_PROTO(Connection);
@@ -13,6 +14,7 @@
 PURPLE_PERL_BOOT_PROTO(Core);
 PURPLE_PERL_BOOT_PROTO(Debug);
 PURPLE_PERL_BOOT_PROTO(Xfer);
+PURPLE_PERL_BOOT_PROTO(Idle);
 PURPLE_PERL_BOOT_PROTO(ImgStore);
 PURPLE_PERL_BOOT_PROTO(Log);
 PURPLE_PERL_BOOT_PROTO(Network);
@@ -35,6 +37,7 @@
 PURPLE_PERL_BOOT_PROTO(Status);
 PURPLE_PERL_BOOT_PROTO(Stringref);
 PURPLE_PERL_BOOT_PROTO(Util);
+PURPLE_PERL_BOOT_PROTO(Whiteboard);
 PURPLE_PERL_BOOT_PROTO(XMLNode);
 
 MODULE = Purple PACKAGE = Purple PREFIX = purple_
@@ -45,6 +48,7 @@
 	PURPLE_PERL_BOOT(Account__Option);
 	PURPLE_PERL_BOOT(Buddy__Icon);
 	PURPLE_PERL_BOOT(BuddyList);
+	PURPLE_PERL_BOOT(Certificate);
 	PURPLE_PERL_BOOT(Cipher);
 	PURPLE_PERL_BOOT(Cmd);
 	PURPLE_PERL_BOOT(Connection);
@@ -52,6 +56,7 @@
 	PURPLE_PERL_BOOT(Core);
 	PURPLE_PERL_BOOT(Debug);
 	PURPLE_PERL_BOOT(Xfer);
+	PURPLE_PERL_BOOT(Idle);
 	PURPLE_PERL_BOOT(ImgStore);
 	PURPLE_PERL_BOOT(Log);
 	PURPLE_PERL_BOOT(Network);
@@ -74,6 +79,7 @@
 	PURPLE_PERL_BOOT(Status);
 	PURPLE_PERL_BOOT(Stringref);
 	PURPLE_PERL_BOOT(Util);
+	PURPLE_PERL_BOOT(Whiteboard);
 	PURPLE_PERL_BOOT(XMLNode);
 
 guint
--- a/libpurple/plugins/perl/common/Request.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Request.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -47,7 +47,7 @@
 	SAVETMPS;
 	PUSHMARK(sp);
 
-	XPUSHs(purple_perl_bless_object(fields, "Purple::Request::Fields"));
+	XPUSHs(sv_2mortal(purple_perl_bless_object(fields, "Purple::Request::Fields")));
 	PUTBACK;
 	call_sv(gpr->ok_fun, G_EVAL | G_SCALAR);
 	SPAGAIN;
@@ -69,7 +69,7 @@
 	SAVETMPS;
 	PUSHMARK(sp);
 
-	XPUSHs(purple_perl_bless_object(fields, "Purple::Request::Fields"));
+	XPUSHs(sv_2mortal(purple_perl_bless_object(fields, "Purple::Request::Fields")));
 	PUTBACK;
 	call_sv(gpr->cancel_fun, G_EVAL | G_SCALAR);
 	SPAGAIN;
@@ -206,12 +206,6 @@
 purple_request_close_with_handle(handle)
 	void * handle
 
-Purple::Request::UiOps
-purple_request_get_ui_ops()
-
-void
-purple_request_set_ui_ops(ops)
-	Purple::Request::UiOps ops
 
 MODULE = Purple::Request  PACKAGE = Purple::Request::Field  PREFIX = purple_request_field_
 PROTOTYPES: ENABLE
--- a/libpurple/plugins/perl/common/Roomlist.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Roomlist.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -45,10 +45,6 @@
 purple_roomlist_get_list(gc)
 	Purple::Connection gc
 
-Purple::Roomlist::UiOps
-purple_roomlist_get_ui_ops()
- 
-
 Purple::Roomlist
 purple_roomlist_new(account)
 	Purple::Account account
@@ -84,10 +80,9 @@
 	t_GL = NULL;
 	t_len = av_len((AV *)SvRV(fields));
 
-	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(fields), i, 0), t_sl));
-	}
+	for (i = 0; i < t_len; i++)
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(fields), i, 0)));
+
 	purple_roomlist_set_fields(list, t_GL);
 
 void 
@@ -96,10 +91,6 @@
 	gboolean in_progress
 
 void 
-purple_roomlist_set_ui_ops(ops)
-	Purple::Roomlist::UiOps ops
-
-void 
 purple_roomlist_show_with_account(account)
 	Purple::Account account
 
--- a/libpurple/plugins/perl/common/SSLConn.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/SSLConn.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -35,9 +35,6 @@
 Purple::Ssl::Ops
 purple_ssl_get_ops()
 
-void
-purple_ssl_init()
-
 gboolean
 purple_ssl_is_supported()
 
@@ -51,9 +48,6 @@
 purple_ssl_set_ops(ops)
 	Purple::Ssl::Ops ops
 
-void
-purple_ssl_uninit()
-
 size_t
 purple_ssl_write(gsc, buffer, len)
 	Purple::Ssl::Connection gsc
--- a/libpurple/plugins/perl/common/SavedStatuses.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/SavedStatuses.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -150,9 +150,3 @@
 
 Purple::Handle
 purple_savedstatuses_get_handle()
-
-void
-purple_savedstatuses_init()
-
-void
-purple_savedstatuses_uninit()
--- a/libpurple/plugins/perl/common/Server.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Server.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -85,7 +85,7 @@
 	for (t_HE = hv_iternext(t_HV); t_HE != NULL; t_HE = hv_iternext(t_HV) ) {
 		t_key = hv_iterkey(t_HE, &len);
 		t_SV = *hv_fetch(t_HV, t_key, len, 0);
- 		t_value = SvPV(t_SV, PL_na);
+ 		t_value = SvPVutf8_nolen(t_SV);
 
 		g_hash_table_insert(t_GHash, t_key, t_value);
 	}
@@ -140,7 +140,7 @@
 	for (t_HE = hv_iternext(t_HV); t_HE != NULL; t_HE = hv_iternext(t_HV) ) {
 		t_key = hv_iterkey(t_HE, &len);
 		t_SV = *hv_fetch(t_HV, t_key, len, 0);
- 		t_value = SvPV(t_SV, PL_na);
+ 		t_value = SvPVutf8_nolen(t_SV);
 
 		g_hash_table_insert(t_GHash, t_key, t_value);
 	}
@@ -170,7 +170,7 @@
 	for (t_HE = hv_iternext(t_HV); t_HE != NULL; t_HE = hv_iternext(t_HV) ) {
 		t_key = hv_iterkey(t_HE, &len);
 		t_SV = *hv_fetch(t_HV, t_key, len, 0);
- 		t_value = SvPV(t_SV, PL_na);
+ 		t_value = SvPVutf8_nolen(t_SV);
 
 		g_hash_table_insert(t_GHash, t_key, t_value);
 	}
--- a/libpurple/plugins/perl/common/Sound.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Sound.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -26,12 +26,6 @@
 		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
 }
 
-Purple::Sound::UiOps
-purple_sound_get_ui_ops()
-
-void
-purple_sound_init()
-
 void
 purple_sound_play_event(event, account)
 	Purple::SoundEventID event
@@ -41,10 +35,3 @@
 purple_sound_play_file(filename, account)
 	const char *filename
 	Purple::Account account
-
-void
-purple_sound_set_ui_ops(ops)
-	Purple::Sound::UiOps ops
-
-void
-purple_sound_uninit()
--- a/libpurple/plugins/perl/common/Status.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Status.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -86,8 +86,7 @@
 	t_len = av_len((AV *)SvRV(source_list));
 
 	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(source_list), i, 0), t_sl));
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(source_list), i, 0)));
 	}
 	purple_presence_add_list(presence, t_GL);
 	g_list_free(t_GL);
@@ -342,12 +341,6 @@
 	const char *id
 	const char *value
 
-void
-purple_status_init()
-
-void
-purple_status_uninit()
-
 MODULE = Purple::Status  PACKAGE = Purple::StatusType  PREFIX = purple_status_type_
 PROTOTYPES: ENABLE
 
@@ -389,8 +382,7 @@
 	t_len = av_len((AV *)SvRV(status_types));
 
 	for (i = 0; i < t_len; i++) {
-		STRLEN t_sl;
-		t_GL = g_list_append(t_GL, SvPV(*av_fetch((AV *)SvRV(status_types), i, 0), t_sl));
+		t_GL = g_list_append(t_GL, SvPVutf8_nolen(*av_fetch((AV *)SvRV(status_types), i, 0)));
 	}
 	RETVAL = (PurpleStatusType *)purple_status_type_find_with_id(t_GL, id);
 	g_list_free(t_GL);
--- a/libpurple/plugins/perl/common/Util.xs	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/Util.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -26,9 +26,24 @@
 	LEAVE;
 }
 
+static void markup_find_tag_foreach(GQuark key_id, char *data, HV *hv) {
+	const char *key = NULL;
+	key = g_quark_to_string(key_id);
+	hv_store(hv, key, strlen(key), newSVpv(data, 0), 0);
+}
+
 MODULE = Purple::Util  PACKAGE = Purple::Util  PREFIX = purple_
 PROTOTYPES: ENABLE
 
+gboolean
+purple_running_gnome()
+
+gboolean
+purple_running_kde()
+
+gboolean
+purple_running_osx()
+
 int
 purple_build_dir(path, mode)
 	const char *path
@@ -49,15 +64,30 @@
 const gchar *
 purple_home_dir()
 
-gboolean
-purple_message_meify(message, len)
-	char *message
-	size_t len
+gchar_own*
+purple_message_meify(SV *msg)
+	PREINIT:
+		char *message = NULL;
+		gboolean ret;
+		gssize len;
+	CODE:
+		message = SvPV(msg, len);
+		message = g_strndup(message, len);
+		ret = purple_message_meify(message, len);
+		if(ret) {
+			/* message will get g_free()'d later on, since RETVAL is gchar_own* */
+			RETVAL = message;
+		} else {
+			RETVAL = NULL;
+			g_free(message);
+		}
+	OUTPUT:
+		RETVAL
 
 FILE *
-purple_mkstemp(path, binary)
-	char **path
+purple_mkstemp(OUTLIST gchar_own *path, binary)
 	gboolean binary
+	PROTOTYPE: $
 
 const char *
 purple_normalize(account, str)
@@ -122,14 +152,36 @@
 purple_url_encode(str)
 	const char *str
 
-gboolean
-purple_url_parse(url, ret_host, ret_port, ret_path, ret_user, ret_passwd)
+ # XXX: this made perl assert()...
+ #
+ #gboolean
+ #purple_url_parse(url, OUTLIST gchar_own *ret_host, OUTLIST int ret_port, OUTLIST gchar_own *ret_path, OUTLIST gchar_own *ret_user, OUTLIST gchar_own *ret_passwd)
+ #	const char *url
+ #	PROTOTYPE: $
+
+void
+purple_url_parse(url)
 	const char *url
-	char **ret_host
-	int *ret_port
-	char **ret_path
-	char **ret_user
-	char **ret_passwd
+	PREINIT:
+		char *ret_host;
+		int ret_port;
+		char *ret_path;
+		char *ret_user;
+		char *ret_passwd;
+		gboolean ret;
+	PPCODE:
+		ret = purple_url_parse(url, &ret_host, &ret_port, &ret_path, &ret_user, &ret_passwd);
+		XPUSHs(sv_2mortal(newSViv(ret)));
+		XPUSHs(ret_host ? sv_2mortal(newSVpv(ret_host, 0)) : sv_2mortal(newSV(0)));
+		XPUSHs(sv_2mortal(newSViv(ret_port)));
+		XPUSHs(ret_path ? sv_2mortal(newSVpv(ret_path, 0)) : sv_2mortal(newSV(0)));
+		XPUSHs(ret_user ? sv_2mortal(newSVpv(ret_user, 0)) : sv_2mortal(newSV(0)));
+		XPUSHs(ret_passwd ? sv_2mortal(newSVpv(ret_passwd, 0)) : sv_2mortal(newSV(0)));
+		g_free(ret_host);
+		g_free(ret_path);
+		g_free(ret_user);
+		g_free(ret_passwd);
+
 
 const char *
 purple_user_dir()
@@ -137,6 +189,144 @@
 const char *
 purple_utf8_strftime(const char *format, const struct tm *tm);
 
+gboolean
+purple_utf8_has_word(haystack, needle)
+	const char* haystack
+	const char* needle
+
+gchar_own*
+purple_utf8_ncr_decode(in)
+	const char* in
+
+gchar_own*
+purple_utf8_ncr_encode(in)
+	const char* in
+
+gchar_own*
+purple_utf8_salvage(str)
+	const char* str
+
+int
+purple_utf8_strcasecmp(a, b)
+	const char* a
+	const char* b
+
+gchar_own*
+purple_utf8_try_convert(str)
+	const char* str
+
+gboolean
+purple_ip_address_is_valid(ip)
+	const char* ip
+
+const char*
+purple_normalize_nocase(account, str)
+	Purple::Account account
+	const char* str
+
+const gchar*
+purple_gai_strerror(errnum)
+	gint errnum
+
+void
+purple_got_protocol_handler_uri(uri)
+	const char* uri
+
+gchar_own*
+purple_base16_encode(const guchar *data, gsize length(data))
+	PROTOTYPE: $
+
+gchar_own*
+purple_base16_encode_chunked(const guchar *data, gsize length(data))
+	PROTOTYPE: $
+
+gchar_own*
+purple_base64_encode(const guchar *data, gsize length(data))
+	PROTOTYPE: $
+
+void
+purple_restore_default_signal_handlers()
+
+SV *
+purple_base16_decode(str)
+	const char* str
+	PREINIT:
+	gsize len;
+	guchar *ret;
+	CODE:
+		ret = purple_base16_decode(str, &len);
+		if(len) {
+			RETVAL = newSVpv(ret, len);
+		} else {
+			g_free(ret);
+			XSRETURN_UNDEF;
+		}
+		g_free(ret);
+	OUTPUT:
+		RETVAL
+
+SV*
+purple_base64_decode(str)
+	const char* str
+	PREINIT:
+	gsize len;
+	guchar *ret;
+	CODE:
+		ret = purple_base64_decode(str, &len);
+		if(len) {
+			RETVAL = newSVpv(ret, len);
+		} else {
+			g_free(ret);
+			XSRETURN_UNDEF;
+		}
+		g_free(ret);
+	OUTPUT:
+		RETVAL
+
+SV*
+purple_quotedp_decode(str)
+	const char* str
+	PREINIT:
+	gsize len;
+	guchar *ret;
+	CODE:
+		ret = purple_quotedp_decode(str, &len);
+		if(len) {
+			RETVAL = newSVpv(ret, len);
+		} else {
+			g_free(ret);
+			XSRETURN_UNDEF;
+		}
+		g_free(ret);
+	OUTPUT:
+		RETVAL
+
+void
+purple_uri_list_extract_uris(uri_list)
+	const gchar* uri_list
+	PREINIT:
+		GList *l = NULL, *gl = NULL;
+	PPCODE:
+		gl = purple_uri_list_extract_uris(uri_list);
+		for(l = gl; l; l = l->next) {
+			XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
+			g_free(l->data);
+		}
+		g_list_free(gl);
+
+void
+purple_uri_list_extract_filenames(uri_list)
+	const gchar* uri_list
+	PREINIT:
+		GList *l = NULL, *gl = NULL;
+	PPCODE:
+		gl = purple_uri_list_extract_filenames(uri_list);
+		for(l = gl; l; l = l->next) {
+			XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
+			g_free(l->data);
+		}
+		g_list_free(gl);
+
 MODULE = Purple::Util  PACKAGE = Purple::Util::Str  PREFIX = purple_str_
 PROTOTYPES: ENABLE
 
@@ -145,9 +335,8 @@
 	const char *str
 
 gchar_own *
-purple_str_binary_to_ascii(binary, len)
-	const unsigned char *binary
-	guint len
+purple_str_binary_to_ascii(const unsigned char *binary, guint length(binary))
+	PROTOTYPE: $
 
 gboolean
 purple_str_has_prefix(s, p)
@@ -168,17 +357,15 @@
 	size_t size
 
 void
-purple_str_strip_char(str, thechar)
-	char *str
+purple_str_strip_char(IN_OUT char str, thechar)
 	char thechar
 
 time_t
-purple_str_to_time(timestamp, utc = FALSE, tm = NULL, tz_off = NULL, rest = NULL)
+purple_str_to_time(timestamp, utc = FALSE, tm = NULL, OUTLIST long tz_off, OUTLIST const char *rest)
 	const char *timestamp
 	gboolean utc
 	struct tm *tm
-	long *tz_off
-	const char **rest
+	PROTOTYPE: $;$$
 
 MODULE = Purple::Util  PACKAGE = Purple::Util::Date  PREFIX = purple_date_
 PROTOTYPES: ENABLE
@@ -213,23 +400,38 @@
 	const char *link_prefix
 	Purple::Util::InfoFieldFormatCallback format_cb
 
-gboolean
-purple_markup_find_tag(needle, haystack, start, end, attributes)
+ # XXX: returning start/end to perl doesn't make a lot of sense...
+ # XXX: the actual tag data can be gotten with $start =~ s/$end//g;
+void
+purple_markup_find_tag(needle, haystack)
 	const char *needle
 	const char *haystack
-	const char **start
-	const char **end
-	GData **attributes
+	PREINIT:
+		const char *start = NULL;
+		const char *end = NULL;
+		GData *attributes;
+		gboolean ret;
+		HV *hv = NULL;
+	PPCODE:
+		ret = purple_markup_find_tag(needle, haystack, &start, &end, &attributes);
+		if(!ret) XSRETURN_UNDEF;
+
+		hv = newHV();
+		g_datalist_foreach(&attributes, (GDataForeachFunc) markup_find_tag_foreach, hv);
+		g_datalist_clear(&attributes);
+
+		XPUSHs(sv_2mortal(newSVpv(start, 0)));
+		XPUSHs(sv_2mortal(newSVpv(end, 0)));
+		XPUSHs(sv_2mortal(newRV_noinc((SV *) hv)));
 
 gchar_own *
 purple_markup_get_tag_name(tag)
 	const char *tag
 
 void
-purple_markup_html_to_xhtml(html, dest_xhtml, dest_plain)
+purple_markup_html_to_xhtml(html, OUTLIST gchar_own *dest_xhtml, OUTLIST gchar_own *dest_plain)
 	const char *html
-	char **dest_xhtml
-	char **dest_plain
+	PROTOTYPE: $
 
 gchar_own *
 purple_markup_linkify(str)
@@ -245,9 +447,33 @@
 purple_markup_strip_html(str)
 	const char *str
 
+gchar_own *
+purple_markup_get_css_property(style, opt)
+	const gchar* style
+	const gchar* opt
+
+SV*
+purple_markup_unescape_entity(text)
+	const char* text
+	PREINIT:
+	int length;
+	CODE:
+		{
+			const char *str = purple_markup_unescape_entity(text, &length);
+			if(length) {
+				RETVAL = newSVpv(str, length);
+			} else {
+				XSRETURN_UNDEF;
+			}
+		}
+	OUTPUT:
+		RETVAL
+
+
 MODULE = Purple::Util  PACKAGE = Purple::Util  PREFIX = purple_util_
 PROTOTYPES: ENABLE
 
+ #XXX: expand...
 void
 purple_util_fetch_url(plugin, url, full, user_agent, http11, cb)
 	Purple::Plugin plugin
@@ -256,14 +482,19 @@
 	const char *user_agent
 	gboolean http11
 	SV * cb
-CODE:
+PREINIT:
+	PurpleUtilFetchUrlData *data;
+PPCODE:
+	/* XXX: i don't like this... only plugins can use it... */
 	SV *sv = purple_perl_sv_from_fun(plugin, cb);
 
 	if (sv != NULL) {
-		purple_util_fetch_url(url, full, user_agent, http11,
+		data = purple_util_fetch_url(url, full, user_agent, http11,
 		                      purple_perl_util_url_cb, sv);
+		XPUSHs(sv_2mortal(purple_perl_bless_object(data, "Purple::Util::FetchUrlData")));
 	} else {
 		purple_debug_warning("perl", "Callback not a valid type, only strings and coderefs allowed in purple_util_fetch_url.\n");
+		XSRETURN_UNDEF;
 	}
 
 void
@@ -271,7 +502,43 @@
 	const char *dir
 
 gboolean
-purple_util_write_data_to_file(filename, data, size)
+purple_util_write_data_to_file(filename, const char *data, size_t length(data))
 	const char *filename
-	const char *data
-	size_t size
+	PROTOTYPE: $$
+
+void
+purple_util_set_current_song(title, artist, album)
+	const char *title
+	const char *artist
+	const char *album
+
+void
+purple_util_chrreplace(IN_OUT char string, delimiter, replacement)
+	char delimiter
+	char replacement
+
+gchar_own*
+purple_util_format_song_info(title, artist, album, unused)
+	const char* title
+	const char* artist
+	const char* album
+	gpointer unused
+
+const char*
+purple_util_get_image_extension(gconstpointer data, size_t length(data))
+	PROTOTYPE: $
+
+gchar_own*
+purple_util_get_image_filename(gconstpointer image_data, size_t length(image_data))
+	PROTOTYPE: $
+
+Purple::XMLNode
+purple_util_read_xml_from_file(filename, description)
+	const char* filename
+	const char* description
+
+gboolean
+purple_util_write_data_to_file_absolute(filename_full, char *data, gssize length(data))
+	const char* filename_full
+	PROTOTYPE: $$
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/plugins/perl/common/Whiteboard.xs	Thu Aug 07 16:00:16 2008 +0000
@@ -0,0 +1,78 @@
+#include "module.h"
+
+MODULE = Purple::Whiteboard  PACKAGE = Purple::Whiteboard  PREFIX = purple_whiteboard_
+PROTOTYPES: ENABLE
+
+void
+purple_whiteboard_clear(wb)
+	Purple::Whiteboard wb
+
+Purple::Whiteboard
+purple_whiteboard_create(account, who, state)
+	Purple::Account account
+	const char* who
+	int state
+
+void
+purple_whiteboard_destroy(wb)
+	Purple::Whiteboard wb
+
+void
+purple_whiteboard_draw_line(wb, x1, y1, x2, y2, color, size)
+	Purple::Whiteboard wb
+	int x1
+	int y1
+	int x2
+	int y2
+	int color
+	int size
+
+void
+purple_whiteboard_draw_point(wb, x, y, color, size)
+	Purple::Whiteboard wb
+	int x
+	int y
+	int color
+	int size
+
+Purple::Whiteboard
+purple_whiteboard_get_session(account, who)
+	Purple::Account account
+	const char* who
+
+void
+purple_whiteboard_send_brush(wb, size, color)
+	Purple::Whiteboard wb
+	int size
+	int color
+
+void
+purple_whiteboard_send_clear(wb)
+	Purple::Whiteboard wb
+
+void
+purple_whiteboard_set_brush(wb, size, color)
+	Purple::Whiteboard wb
+	int size
+	int color
+
+void
+purple_whiteboard_set_dimensions(wb, width, height)
+	Purple::Whiteboard wb
+	int width
+	int height
+
+gboolean
+purple_whiteboard_get_brush(wb, OUTLIST int size, OUTLIST int color)
+	Purple::Whiteboard wb
+	PROTOTYPE: $
+
+gboolean
+purple_whiteboard_get_dimensions(wb, OUTLIST int width, OUTLIST int height)
+	Purple::Whiteboard wb
+	PROTOTYPE: $
+
+void
+purple_whiteboard_start(wb)
+	Purple::Whiteboard wb
+
--- a/libpurple/plugins/perl/common/module.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/module.h	Thu Aug 07 16:00:16 2008 +0000
@@ -20,6 +20,7 @@
 #include "accountopt.h"
 #include "blist.h"
 #include "buddyicon.h"
+#include "certificate.h"
 #include "cipher.h"
 #include "cmds.h"
 #include "connection.h"
@@ -36,6 +37,7 @@
 #include "gtkconv.h"
 #include "gtkutils.h"
 #endif
+#include "idle.h"
 #include "imgstore.h"
 #include "network.h"
 #include "notify.h"
@@ -59,19 +61,18 @@
 /* Ewww. perl has it's own util.h which is in the include path :( */
 #include "libpurple/util.h"
 #include "value.h"
+#include "whiteboard.h"
 #include "xmlnode.h"
 
 /* account.h */
 typedef PurpleAccount *			Purple__Account;
 typedef PurpleAccountOption *		Purple__Account__Option;
-typedef PurpleAccountUiOps *		Purple__Account__UiOps;
 typedef PurpleAccountUserSplit *		Purple__Account__UserSplit;
 
 /* blist.h */
 typedef PurpleBlistNode *			Purple__BuddyList__Node;
 typedef PurpleBlistNodeFlags		Purple__BuddyList__NodeFlags;
 typedef PurpleBlistNodeType		Purple__BuddyList__NodeType;
-typedef PurpleBlistUiOps *		Purple__BuddyList__UiOps;
 typedef PurpleBuddyList *			Purple__BuddyList;
 typedef PurpleBuddy *			Purple__BuddyList__Buddy;
 typedef PurpleChat *			Purple__BuddyList__Chat;
@@ -81,11 +82,20 @@
 /* buddyicon.h */
 typedef PurpleBuddyIcon *			Purple__Buddy__Icon;
 
+/* certificate.h */
+typedef PurpleCertificate *			Purple__Certificate;
+typedef PurpleCertificatePool *			Purple__Certificate__Pool;
+typedef PurpleCertificateScheme *		Purple__Certificate__Scheme;
+typedef PurpleCertificateVerifier *		Purple__Certificate__Verifier;
+typedef PurpleCertificateVerificationRequest *	Purple__Certificate__VerificationRequest;
+typedef PurpleCertificateVerificationStatus	Purple__Certificate__VerificationStatus;
+
 /* cipher.h */
 typedef PurpleCipher *			Purple__Cipher;
 typedef PurpleCipherCaps			Purple__CipherCaps;
 typedef PurpleCipherContext *		Purple__Cipher__Context;
 typedef PurpleCipherOps *			Purple__Cipher__Ops;
+typedef PurpleCipherBatchMode		Purple__Cipher__BatchMode;
 
 /* cmds.h */
 typedef PurpleCmdFlag			Purple__Cmd__Flag;
@@ -97,7 +107,6 @@
 typedef PurpleConnection *		Purple__Connection;
 typedef PurpleConnectionFlags		Purple__ConnectionFlags;
 typedef PurpleConnectionState		Purple__ConnectionState;
-typedef PurpleConnectionUiOps *		Purple__Connection__UiOps;
 
 /* conversation.h */
 typedef PurpleConversationType		Purple__ConversationType;
@@ -106,7 +115,6 @@
 typedef PurpleMessageFlags		Purple__MessageFlags;
 typedef PurpleConvChatBuddyFlags		Purple__ConvChatBuddyFlags;
 typedef PurpleConversation *		Purple__Conversation;
-typedef PurpleConversationUiOps *		Purple__Conversation__UiOps;
 typedef PurpleConvIm *			Purple__Conversation__IM;
 typedef PurpleConvChat *			Purple__Conversation__Chat;
 typedef PurpleConvChatBuddy *		Purple__Conversation__ChatBuddy;
@@ -114,7 +122,6 @@
 /* core.h */
 
 typedef PurpleCore *			Purple__Core;
-typedef PurpleCoreUiOps *		Purple__Core__UiOps;
 
 /* debug.h */
 typedef PurpleDebugLevel			Purple__DebugLevel;
@@ -125,13 +132,12 @@
 
 /* eventloop.h */
 typedef PurpleInputCondition *		Purple__InputCondition;
-typedef PurpleEventLoopUiOps *		Purple__EventLoopUiOps;
 
 /* ft.h */
 typedef PurpleXfer *			Purple__Xfer;
 typedef PurpleXferType			Purple__XferType;
 typedef PurpleXferStatusType		Purple__XferStatusType;
-typedef PurpleXferUiOps *			Purple__XferUiOps;
+
 
 #ifdef PURPLE_GTKPERL
 /* gtkblish.h */
@@ -182,7 +188,6 @@
 typedef PurpleNotifySearchColumn *	Purple__NotifySearchColumn;
 typedef PurpleNotifySearchButton *	Purple__NotifySearchButton;
 typedef PurpleNotifyType			Purple__NotifyType;
-typedef PurpleNotifyUiOps *		Purple__NotifyUiOps;
 typedef PurpleNotifyUserInfo *	Purple__NotifyUserInfo;
 typedef PurpleNotifyUserInfoEntry *	Purple__NotifyUserInfoEntry;
 
@@ -209,7 +214,6 @@
 
 /* privacy.h */
 typedef PurplePrivacyType			Purple__PrivacyType;
-typedef PurplePrivacyUiOps *		Purple__Privacy__UiOps;
 
 /* proxy.h */
 typedef PurpleProxyInfo *			Purple__ProxyInfo;
@@ -227,7 +231,6 @@
 typedef PurpleRequestFieldGroup *		Purple__Request__Field__Group;
 typedef PurpleRequestFieldType		Purple__RequestFieldType;
 typedef PurpleRequestType			Purple__RequestType;
-typedef PurpleRequestUiOps *		Purple__Request__UiOps;
 
 /* roomlist.h */
 typedef PurpleRoomlist *			Purple__Roomlist;
@@ -235,7 +238,6 @@
 typedef PurpleRoomlistFieldType		Purple__RoomlistFieldType;
 typedef PurpleRoomlistRoom *		Purple__Roomlist__Room;
 typedef PurpleRoomlistRoomType		Purple__RoomlistRoomType;
-typedef PurpleRoomlistUiOps *		Purple__Roomlist__UiOps;
 
 /* savedstatuses.h */
 typedef PurpleSavedStatus *		Purple__SavedStatus;
@@ -246,7 +248,6 @@
 
 /* sound.h */
 typedef PurpleSoundEventID		Purple__SoundEventID;
-typedef PurpleSoundUiOps *		Purple__Sound__UiOps;
 
 /* sslconn.h */
 typedef PurpleInputCondition *		Purple__Input__Condition;
@@ -273,6 +274,9 @@
 /* value.h */
 typedef PurpleValue *			Purple__Value;
 
+/* whiteboard.h */
+typedef PurpleWhiteboard *		Purple__Whiteboard;
+
 /* xmlnode.h */
 typedef xmlnode *			Purple__XMLNode;
 typedef XMLNodeType			XMLNode__Type;
@@ -286,3 +290,4 @@
 	const char *name;
 	IV iv;
 } constiv;
+
--- a/libpurple/plugins/perl/common/typemap	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/common/typemap	Thu Aug 07 16:00:16 2008 +0000
@@ -18,7 +18,7 @@
 gchar *					T_PV
 gchar_own *				T_GCHAR_OWN
 guchar					T_IV
-guchar *				T_PTR
+guchar *				T_PV
 guchar **				T_PTR
 const guchar *				T_PV
 char *					T_PV
@@ -30,7 +30,7 @@
 GString *				T_PTR
 GData *					T_PTR
 GData **				T_PTR
-const unsigned char *			T_PTR
+const unsigned char *			T_PV
 struct tm *				T_PTR
 const struct tm *			T_PTR
 xmlnode *				T_PTR
@@ -40,7 +40,6 @@
 
 Purple::Account				T_PurpleObj
 Purple::Account::Option			T_PurpleObj
-Purple::Account::UiOps			T_PurpleObj
 Purple::Account::UserSplit		T_PurpleObj
 
 Purple::Buddy::Icon			T_PurpleObj
@@ -53,7 +52,6 @@
 Purple::BuddyList::Node			T_PurpleObj
 Purple::BuddyList::NodeFlags		T_IV
 Purple::BuddyList::NodeType		T_IV
-Purple::BuddyList::UiOps			T_PurpleObj
 
 Purple::Cipher				T_PurpleObj
 Purple::CipherCaps			T_IV
@@ -64,14 +62,11 @@
 Purple::Cmd::Priority			T_IV
 Purple::Cmd::Ret				T_IV
 Purple::Connection			T_PurpleObj
-Purple::Connection::UiOps			T_PurpleObj
 Purple::Conversation			T_PurpleObj
 Purple::Conversation::Chat		T_PurpleObj
 Purple::Conversation::ChatBuddy		T_PurpleObj
 Purple::Conversation::IM			T_PurpleObj
-Purple::Conversation::UiOps		T_PurpleObj
 Purple::Core				T_PurpleObj
-Purple::Core::UiOps			T_PurpleObj
 
 Purple::Desktop::Item			T_PurpleObj
 Purple::DesktopItemType			T_IV
@@ -99,7 +94,6 @@
 Purple::NotifySearchColumn		T_PurpleObj
 Purple::NotifySearchButton		T_PurpleObj
 Purple::NotifyType			T_IV
-Purple::NotifyUiOps			T_PurpleObj
 Purple::NotifyUserInfo			T_PurpleObj
 Purple::NotifyUserInfoEntry		T_PurpleObj
 
@@ -118,7 +112,6 @@
 Purple::PounceEvent			T_IV
 Purple::Presence				T_PurpleObj
 Purple::PrivacyType			T_IV
-Purple::Privacy::UiOps			T_PurpleObj
 Purple::ProtocolOptions			T_IV
 Purple::ProxyInfo				T_PurpleObj
 Purple::ProxyType				T_IV
@@ -128,12 +121,10 @@
 Purple::Request::Field			T_PurpleObj
 Purple::Request::Fields			T_PurpleObj
 Purple::Request::Field::Group		T_PurpleObj
-Purple::Request::UiOps			T_PurpleObj
 
 Purple::Roomlist				T_PurpleObj
 Purple::Roomlist::Room			T_PurpleObj
 Purple::Roomlist::Field			T_PurpleObj
-Purple::Roomlist::UiOps			T_PurpleObj
 Purple::RoomlistFieldType			T_IV
 Purple::RoomlistRoomType			T_IV
 
@@ -142,7 +133,6 @@
 Purple::SavedStatus::Sub			T_PurpleObj
 const Purple::SavedStatus::Sub			T_PurpleObj
 Purple::SoundEventID			T_IV
-Purple::Sound::UiOps			T_PurpleObj
 
 Purple::Input::Condition			T_PurpleObj
 Purple::SslErrorType			T_IV
@@ -168,14 +158,22 @@
 Purple::Xfer				T_PurpleObj
 Purple::XferType				T_IV
 Purple::XferStatusType			T_IV
-Purple::XferUiOps				T_IV
 
 Purple::XMLNode				T_PurpleObj
 XMLNode::Type				T_IV
 
 /* enums */
 
+/* certificate.h */
+Purple::Certificate				T_PurpleObj
+Purple::Certificate::Pool			T_PurpleObj
+Purple::Certificate::Scheme			T_PurpleObj
+Purple::Certificate::Verifier			T_PurpleObj
+Purple::Certificate::VerificationRequest	T_PurpleObj
+Purple::Certificate::VerificationStatus		T_IV
+
 /* cipher.h */
+Purple::Cipher::BatchMode	T_IV
 
 /* blist.h */
 
@@ -185,7 +183,7 @@
 /* conversation.h */
 Purple::ConvChatBuddyFlags		T_IV
 Purple::ConvUpdateType			T_IV
-Purple::ConversationType			T_IV
+Purple::ConversationType		T_IV
 Purple::MessageFlags			T_IV
 Purple::TypingState			T_IV
 Purple::UnseenState			T_IV
@@ -194,6 +192,9 @@
 Purple::ConnectionFlags			T_IV
 Purple::ConnectionState			T_IV
 
+/* whiteboard.h */
+Purple::Whiteboard			T_PurpleObj
+
 INPUT
 
 T_PurpleObj
--- a/libpurple/plugins/perl/perl-common.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/perl-common.c	Thu Aug 07 16:00:16 2008 +0000
@@ -176,7 +176,6 @@
 {
 	int count = 0, i, ret_value = 1;
 	SV *sv_args[argc];
-	STRLEN na;
 	dSP;
 	PERL_SET_CONTEXT(my_perl);
 	/*
@@ -207,7 +206,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug(PURPLE_DEBUG_ERROR, "perl",
 				   "Perl function %s exited abnormally: %s\n",
-				   function, SvPV(ERRSV, na));
+				   function, SvPVutf8_nolen(ERRSV));
 		(void)POPs;
 	} else if (count != 1) {
 		/*
@@ -235,7 +234,7 @@
 			 * of hackish.  I should fix it.  Look how long this comment is.
 			 * Holy crap.
 			 */
-			args[i] = g_strdup(SvPV(sv_args[i], na));
+			args[i] = g_strdup(SvPVutf8_nolen(sv_args[i]));
 		}
 	}
 
@@ -381,7 +380,6 @@
 void *
 purple_perl_data_from_sv(PurpleValue *value, SV *sv)
 {
-	STRLEN na;
 
 	switch (purple_value_get_type(value)) {
 		case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv);
@@ -391,7 +389,7 @@
 		case PURPLE_TYPE_ULONG:   return (void *)SvUV(sv);
 		case PURPLE_TYPE_INT64:   return (void *)SvIV(sv);
 		case PURPLE_TYPE_UINT64:  return (void *)SvUV(sv);
-		case PURPLE_TYPE_STRING:  return g_strdup((void *)SvPV(sv, na));
+		case PURPLE_TYPE_STRING:  return g_strdup(SvPVutf8_nolen(sv));
 		case PURPLE_TYPE_POINTER: return (void *)SvIV(sv);
 		case PURPLE_TYPE_BOXED:   return (void *)SvIV(sv);
 
--- a/libpurple/plugins/perl/perl-handlers.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/perl-handlers.c	Thu Aug 07 16:00:16 2008 +0000
@@ -23,7 +23,6 @@
 	gchar *hvname;
 	PurplePlugin *plugin;
 	PurplePerlScript *gps;
-	STRLEN na;
 	dSP;
 
 	plugin = action->plugin;
@@ -54,7 +53,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug_error("perl",
 		                 "Perl plugin action function exited abnormally: %s\n",
-		                 SvPV(ERRSV, na));
+		                 SvPVutf8_nolen(ERRSV));
 	}
 
 	PUTBACK;
@@ -68,7 +67,6 @@
 	GList *l = NULL;
 	PurplePerlScript *gps;
 	int i = 0, count = 0;
-	STRLEN na;
 	dSP;
 
 	gps = plugin->info->extra_info;
@@ -94,7 +92,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug_error("perl",
 		                 "Perl plugin actions lookup exited abnormally: %s\n",
-		                 SvPV(ERRSV, na));
+		                 SvPVutf8_nolen(ERRSV));
 	}
 
 	if (count == 0)
@@ -102,14 +100,10 @@
 
 	for (i = 0; i < count; i++) {
 		SV *sv;
-		gchar *label;
-		PurplePluginAction *act = NULL;
+		PurplePluginAction *act;
 
 		sv = POPs;
-		label = SvPV_nolen(sv);
-		/* XXX I think this leaks, but doing it without the strdup
-		 * just showed garbage */
-		act = purple_plugin_action_new(g_strdup(label), purple_perl_plugin_action_cb);
+		act = purple_plugin_action_new(SvPVutf8_nolen(sv), purple_perl_plugin_action_cb);
 		l = g_list_prepend(l, act);
 	}
 
@@ -129,7 +123,6 @@
 	MAGIC *mg;
 	GtkWidget *ret;
 	PurplePerlScript *gps;
-	STRLEN na;
 	dSP;
 
 	gps = plugin->info->extra_info;
@@ -147,7 +140,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug_error("perl",
 		                 "Perl gtk plugin frame init exited abnormally: %s\n",
-		                 SvPV(ERRSV, na));
+		                 SvPVutf8_nolen(ERRSV));
 	}
 
 	/* We have a Gtk2::Frame on top of the stack */
@@ -173,7 +166,6 @@
 	int count;
 	PurplePerlScript *gps;
 	PurplePluginPrefFrame *ret_frame;
-	STRLEN na;
 	dSP;
 
 	gps = (PurplePerlScript *)plugin->info->extra_info;
@@ -192,7 +184,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug_error("perl",
 		                 "Perl plugin prefs frame init exited abnormally: %s\n",
-		                 SvPV(ERRSV, na));
+		                 SvPVutf8_nolen(ERRSV));
 	}
 
 	if (count != 1)
@@ -249,7 +241,6 @@
 {
 	PurplePerlTimeoutHandler *handler = data;
 	gboolean ret = FALSE;
-	STRLEN na;
 
 	dSP;
 	ENTER;
@@ -263,7 +254,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug_error("perl",
 		                 "Perl timeout function exited abnormally: %s\n",
-		                 SvPV(ERRSV, na));
+		                 SvPVutf8_nolen(ERRSV));
 	}
 
 	ret = POPi;
@@ -291,7 +282,6 @@
 	PurpleValue *ret_value, **values;
 	SV **sv_args;
 	DATATYPE **copy_args;
-	STRLEN na;
 
 	dSP;
 	ENTER;
@@ -334,7 +324,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug_error("perl",
 		                 "Perl function exited abnormally: %s\n",
-		                 SvPV(ERRSV, na));
+		                 SvPVutf8_nolen(ERRSV));
 	}
 
 	/* See if any parameters changed. */
@@ -373,14 +363,13 @@
 					if (strcmp(*((char **)copy_args[i]), SvPVX(sv_args[i]))) {
 						g_free(*((char **)copy_args[i]));
 						*((char **)copy_args[i]) =
-							g_strdup(SvPV(sv_args[i], na));
+							g_strdup(SvPVutf8_nolen(sv_args[i]));
 					}
+					/* Clean up sv_args[i] - we're done with it */
+					sv_2mortal(sv_args[i]);
 					break;
 
 				case PURPLE_TYPE_POINTER:
-					*((void **)copy_args[i]) = (void *)SvIV(sv_args[i]);
-					break;
-
 				case PURPLE_TYPE_BOXED:
 					*((void **)copy_args[i]) = (void *)SvIV(sv_args[i]);
 					break;
@@ -392,6 +381,7 @@
 					break;
 			}
 
+
 #if 0
 			*((void **)copy_args[i]) = purple_perl_data_from_sv(values[i],
 															  sv_args[i]);
@@ -564,7 +554,6 @@
             gchar **args, gchar **error, void *data)
 {
 	int i = 0, count, ret_value = PURPLE_CMD_RET_OK;
-	STRLEN na;
 	SV *cmdSV, *tmpSV, *convSV;
 	PurplePerlCmdHandler *handler = data;
 
@@ -604,7 +593,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug_error("perl",
 		                 "Perl plugin command function exited abnormally: %s\n",
-		                 SvPV(ERRSV, na));
+		                 SvPVutf8_nolen(ERRSV));
 	}
 
 	SPAGAIN;
@@ -718,7 +707,6 @@
 			 gpointer data)
 {
 	PurplePerlPrefsHandler *handler = data;
-	STRLEN na;
 
 	dSP;
 	ENTER;
@@ -767,7 +755,7 @@
 	if (SvTRUE(ERRSV)) {
 		purple_debug_error("perl",
 		                 "Perl prefs callback function exited abnormally: %s\n",
-		                 SvPV(ERRSV, na));
+		                 SvPVutf8_nolen(ERRSV));
 	}
 
 	PUTBACK;
--- a/libpurple/plugins/perl/perl.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/plugins/perl/perl.c	Thu Aug 07 16:00:16 2008 +0000
@@ -288,24 +288,24 @@
 	ret = perl_parse(prober, xs_init, argc, argv, NULL);
 
 	if (ret != 0) {
-		STRLEN len;
 		const char * errmsg = "Unknown error";
 		if (SvTRUE(ERRSV))
-			errmsg = SvPV(ERRSV, len);
+			errmsg = SvPVutf8_nolen(ERRSV);
 		purple_debug_error("perl", "Unable to parse plugin %s (%d:%s)\n",
 						   plugin->path, ret, errmsg);
+		status = FALSE;
 		goto cleanup;
 	}
 
 	ret = perl_run(prober);
 
 	if (ret != 0) {
-		STRLEN len;
 		const char * errmsg = "Unknown error";
 		if (SvTRUE(ERRSV))
-			errmsg = SvPV(ERRSV, len);
+			errmsg = SvPVutf8_nolen(ERRSV);
 		purple_debug_error("perl", "Unable to run perl interpreter on plugin %s (%d:%s)\n",
 						   plugin->path, ret, errmsg);
+		status = FALSE;
 		goto cleanup;
 	}
 
@@ -335,7 +335,6 @@
 			PurplePluginInfo *info;
 			PurplePerlScript *gps;
 			char *basename;
-			STRLEN len;
 
 			info = g_new0(PurplePluginInfo, 1);
 			gps  = g_new0(PurplePerlScript, 1);
@@ -358,9 +357,9 @@
 
 			/* We know this one exists. */
 			key = hv_fetch(plugin_info, "name", strlen("name"), 0);
-			info->name = g_strdup(SvPV(*key, len));
+			info->name = g_strdup(SvPVutf8_nolen(*key));
 			/* Set id here in case we don't find one later. */
-			info->id = g_strdup(SvPV(*key, len));
+			info->id = g_strdup(info->name);
 
 #ifdef PURPLE_GTKPERL
 			if ((key = hv_fetch(plugin_info, "GTK_UI",
@@ -370,40 +369,40 @@
 
 			if ((key = hv_fetch(plugin_info, "url",
 			                    strlen("url"), 0)))
-				info->homepage = g_strdup(SvPV(*key, len));
+				info->homepage = g_strdup(SvPVutf8_nolen(*key));
 
 			if ((key = hv_fetch(plugin_info, "author",
 			                    strlen("author"), 0)))
-				info->author = g_strdup(SvPV(*key, len));
+				info->author = g_strdup(SvPVutf8_nolen(*key));
 
 			if ((key = hv_fetch(plugin_info, "summary",
 			                    strlen("summary"), 0)))
-				info->summary = g_strdup(SvPV(*key, len));
+				info->summary = g_strdup(SvPVutf8_nolen(*key));
 
 			if ((key = hv_fetch(plugin_info, "description",
 			                    strlen("description"), 0)))
-				info->description = g_strdup(SvPV(*key, len));
+				info->description = g_strdup(SvPVutf8_nolen(*key));
 
 			if ((key = hv_fetch(plugin_info, "version",
 			                    strlen("version"), 0)))
-				info->version = g_strdup(SvPV(*key, len));
+				info->version = g_strdup(SvPVutf8_nolen(*key));
 
 			/* We know this one exists. */
 			key = hv_fetch(plugin_info, "load", strlen("load"), 0);
 			gps->load_sub = g_strdup_printf("%s::%s", gps->package,
-			                                SvPV(*key, len));
+			                                SvPVutf8_nolen(*key));
 
 			if ((key = hv_fetch(plugin_info, "unload",
 			                    strlen("unload"), 0)))
 				gps->unload_sub = g_strdup_printf("%s::%s",
 				                                  gps->package,
-				                                  SvPV(*key, len));
+				                                  SvPVutf8_nolen(*key));
 
 			if ((key = hv_fetch(plugin_info, "id",
 			                    strlen("id"), 0))) {
 				g_free(info->id);
 				info->id = g_strdup_printf("perl-%s",
-				                           SvPV(*key, len));
+				                           SvPVutf8_nolen(*key));
 			}
 
 		/********************************************************/
@@ -424,7 +423,7 @@
 				 * will create a frame for us */
 				gps->prefs_sub = g_strdup_printf("%s::%s",
 				                                 gps->package,
-				                                 SvPV(*key, len));
+				                                 SvPVutf8_nolen(*key));
 				info->prefs_info = &ui_info;
 			}
 
@@ -435,7 +434,7 @@
 				 * will create a frame for us */
 				gps->gtk_prefs_sub = g_strdup_printf("%s::%s",
 				                                     gps->package,
-				                                     SvPV(*key, len));
+				                                     SvPVutf8_nolen(*key));
 				info->ui_info = &gtk_ui_info;
 			}
 #endif
@@ -444,7 +443,7 @@
 			                    strlen("plugin_action_sub"), 0))) {
 				gps->plugin_action_sub = g_strdup_printf("%s::%s",
 				                                         gps->package,
-				                                         SvPV(*key, len));
+				                                         SvPVutf8_nolen(*key));
 				info->actions = purple_perl_plugin_actions;
 			}
 
@@ -499,11 +498,9 @@
 		SPAGAIN;
 
 		if (SvTRUE(ERRSV)) {
-			STRLEN len;
-
 			purple_debug(PURPLE_DEBUG_ERROR, "perl",
 			           "Perl function %s exited abnormally: %s\n",
-			           gps->load_sub, SvPV(ERRSV, len));
+			           gps->load_sub, SvPVutf8_nolen(ERRSV));
 		}
 
 		PUTBACK;
@@ -525,7 +522,7 @@
 	SAVETMPS;
 
 	PUSHMARK(SP);
-	XPUSHs(sv_2mortal(newSVpv(package, strlen(package))));
+	XPUSHs(sv_2mortal(newSVpv(package, 0)));
 	PUTBACK;
 
 	perl_call_pv("Purple::PerlLoader::destroy_package",
@@ -563,11 +560,9 @@
 		SPAGAIN;
 
 		if (SvTRUE(ERRSV)) {
-			STRLEN len;
-
 			purple_debug(PURPLE_DEBUG_ERROR, "perl",
 			           "Perl function %s exited abnormally: %s\n",
-			           gps->load_sub, SvPV(ERRSV, len));
+			           gps->unload_sub, SvPVutf8_nolen(ERRSV));
 		}
 
 		PUTBACK;
@@ -592,21 +587,23 @@
 		PurplePerlScript *gps;
 
 		g_free(plugin->info->name);
-		g_free(plugin->info->version);
+		g_free(plugin->info->id);
+		g_free(plugin->info->homepage);
+		g_free(plugin->info->author);
 		g_free(plugin->info->summary);
 		g_free(plugin->info->description);
-		g_free(plugin->info->author);
-		g_free(plugin->info->homepage);
+		g_free(plugin->info->version);
 
 		gps = (PurplePerlScript *)plugin->info->extra_info;
 		if (gps != NULL) {
+			g_free(gps->package);
 			g_free(gps->load_sub);
 			g_free(gps->unload_sub);
-			g_free(gps->package);
 			g_free(gps->prefs_sub);
 #ifdef PURPLE_GTKPERL
 			g_free(gps->gtk_prefs_sub);
 #endif
+			g_free(gps->plugin_action_sub);
 			g_free(gps);
 			plugin->info->extra_info = NULL;
 		}
--- a/libpurple/protocols/irc/irc.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/irc/irc.c	Thu Aug 07 16:00:16 2008 +0000
@@ -989,6 +989,9 @@
 	option = purple_account_option_string_new(_("Encodings"), "encoding", IRC_DEFAULT_CHARSET);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
+	option = purple_account_option_bool_new(_("Auto-detect incoming UTF-8"), "autodetect_utf8", IRC_DEFAULT_AUTODETECT);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
+
 	option = purple_account_option_bool_new(_("Use SO/SI to send hankaku kana"), "irc_use_sosi", FALSE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
--- a/libpurple/protocols/irc/irc.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/irc/irc.h	Thu Aug 07 16:00:16 2008 +0000
@@ -35,6 +35,7 @@
 #define IRC_DEFAULT_SSL_PORT 994
 
 #define IRC_DEFAULT_CHARSET "UTF-8"
+#define IRC_DEFAULT_AUTODETECT FALSE
 #define IRC_DEFAULT_ALIAS "purple"
 
 #define IRC_DEFAULT_QUIT "Leaving."
--- a/libpurple/protocols/irc/parse.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/irc/parse.c	Thu Aug 07 16:00:16 2008 +0000
@@ -338,6 +338,7 @@
 	char *utf8 = NULL;
 	const gchar *charset, *enclist;
 	gchar **encodings;
+	gboolean autodetect;
 	int i;
 	GError *err;
 	gboolean retry;
@@ -354,6 +355,12 @@
 		return purple_utf8_salvage(string);
 	}
 
+	autodetect = purple_account_get_bool(irc->account, "autodetect_utf8", IRC_DEFAULT_AUTODETECT);
+
+	if (autodetect && g_utf8_validate(string, -1, NULL)) {
+		return g_strdup(string);
+	}
+
 	for (i = 0; encodings[i] != NULL; i++) {
 		charset = encodings[i];
 		while (*charset == ' ')
--- a/libpurple/protocols/jabber/jabber.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/jabber/jabber.h	Thu Aug 07 16:00:16 2008 +0000
@@ -108,6 +108,37 @@
 	GHashTable *buddies;
 	gboolean roster_parsed;
 
+	/*
+	 * This boolean was added to eliminate a heinous bug where we would
+	 * get into a loop with the server and move a buddy back and forth
+	 * from one group to another.
+	 *
+	 * The sequence goes something like this:
+	 * 1. Our resource and another resource both approve an authorization
+	 *    request at the exact same time.  We put the buddy in group A and
+	 *    the other resource put the buddy in group B.
+	 * 2. The server receives the roster add for group B and sends us a
+	 *    roster push.
+	 * 3. We receive this roster push and modify our local blist.  This
+	 *    triggers us to send a roster add for group B.
+	 * 4. The server recieves our earlier roster add for group A and sends
+	 *    us a roster push.
+	 * 5. We receive this roster push and modify our local blist.  This
+	 *    triggers us to send a roster add for group A.
+	 * 6. The server receives our earlier roster add for group B and sends
+	 *    us a roster push.
+	 * (repeat steps 3 through 6 ad infinitum)
+	 *
+	 * This boolean is used to short-circuit the sending of a roster add
+	 * when we receive a roster push.
+	 *
+	 * See these bug reports:
+	 * http://trac.adiumx.com/ticket/8834
+	 * http://developer.pidgin.im/ticket/5484
+	 * http://developer.pidgin.im/ticket/6188
+	 */
+	gboolean currently_parsing_roster_push;
+
 	GHashTable *chats;
 	GList *chat_servers;
 	PurpleRoomlist *roomlist;
--- a/libpurple/protocols/jabber/roster.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/jabber/roster.c	Thu Aug 07 16:00:16 2008 +0000
@@ -31,7 +31,6 @@
 
 #include <string.h>
 
-
 void jabber_roster_request(JabberStream *js)
 {
 	JabberIq *iq;
@@ -169,6 +168,8 @@
 	if(!query)
 		return;
 
+	js->currently_parsing_roster_push = TRUE;
+
 	for(item = xmlnode_get_child(query, "item"); item; item = xmlnode_get_next_twin(item))
 	{
 		const char *jid, *name, *subscription, *ask;
@@ -251,6 +252,8 @@
 		}
 	}
 
+	js->currently_parsing_roster_push = FALSE;
+
 	/* if we're just now parsing the roster for the first time,
 	 * then now would be the time to send our initial presence */
 	if(!js->roster_parsed) {
@@ -269,6 +272,9 @@
 	JabberIq *iq;
 	xmlnode *query, *item, *group;
 
+	if (js->currently_parsing_roster_push)
+		return;
+
 	if(!(b = purple_find_buddy(js->gc->account, name)))
 		return;
 
--- a/libpurple/protocols/msn/Makefile.am	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/Makefile.am	Thu Aug 07 16:00:16 2008 +0000
@@ -48,8 +48,6 @@
 	slplink.h \
 	slpmsg.c \
 	slpmsg.h \
-	slpsession.c \
-	slpsession.h \
 	soap.c \
 	soap.h \
 	state.c \
--- a/libpurple/protocols/msn/Makefile.mingw	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/Makefile.mingw	Thu Aug 07 16:00:16 2008 +0000
@@ -59,7 +59,6 @@
 			slpcall.c \
 			slplink.c \
 			slpmsg.c \
-			slpsession.c \
 			soap.c\
 			state.c \
 			switchboard.c \
--- a/libpurple/protocols/msn/msn.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/msn.c	Thu Aug 07 16:00:16 2008 +0000
@@ -618,10 +618,13 @@
 
 	if (ret) {
 		MsnSession *session = gc->proto_data;
-		MsnUser *user = msn_userlist_find_user(session->userlist, who);
-		if (user)
-			ret = (user->clientid & MSN_CLIENT_CAP_WEBMSGR) == 0;
-		/* Include these too: MSN_CLIENT_CAP_MSNMOBILE|MSN_CLIENT_CAP_MSNDIRECT ? */
+		if (session) {
+			MsnUser *user = msn_userlist_find_user(session->userlist, who);
+			if (user)
+				/* Include these too: MSN_CLIENT_CAP_MSNMOBILE|MSN_CLIENT_CAP_MSNDIRECT ? */
+				ret = (user->clientid & MSN_CLIENT_CAP_WEBMSGR) == 0;
+		} else
+			ret = FALSE;
 	}
 
 	return ret;
--- a/libpurple/protocols/msn/nexus.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/nexus.c	Thu Aug 07 16:00:16 2008 +0000
@@ -390,7 +390,7 @@
 	msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE);
 
 	username = purple_account_get_username(session->account);
-	password = g_strndup(purple_connection_get_password(session->account->gc), 16);
+	password = g_markup_escape_text(purple_connection_get_password(session->account->gc), 16);
 
 	purple_debug_info("msn", "Logging on %s, with policy '%s', nonce '%s'\n",
 	                  username, nexus->policy, nexus->nonce);
--- a/libpurple/protocols/msn/servconn.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/servconn.c	Thu Aug 07 16:00:16 2008 +0000
@@ -391,7 +391,8 @@
 	session = servconn->session;
 
 	len = read(servconn->fd, buf, sizeof(buf) - 1);
-	servconn->session->account->gc->last_received = time(NULL);
+	if (servconn->type == MSN_SERVCONN_NS)
+		servconn->session->account->gc->last_received = time(NULL);
 
 	if (len < 0 && errno == EAGAIN) {
 		return;
--- a/libpurple/protocols/msn/slp.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/slp.c	Thu Aug 07 16:00:16 2008 +0000
@@ -25,7 +25,6 @@
 #include "slp.h"
 #include "slpcall.h"
 #include "slpmsg.h"
-#include "slpsession.h"
 
 #include "object.h"
 #include "user.h"
@@ -256,7 +255,6 @@
 		/* Emoticon or UserDisplay */
 		char *content;
 		gsize len;
-		MsnSlpSession *slpsession;
 		MsnSlpLink *slplink;
 		MsnSlpMessage *slpmsg;
 		MsnObject *obj;
@@ -306,14 +304,10 @@
 			g_return_if_reached();
 		}
 
-		slpsession = msn_slplink_find_slp_session(slplink,
-												  slpcall->session_id);
-
 		/* DATA PREP */
 		slpmsg = msn_slpmsg_new(slplink);
 		slpmsg->slpcall = slpcall;
-		slpmsg->slpsession = slpsession;
-		slpmsg->session_id = slpsession->id;
+		slpmsg->session_id = slpcall->session_id;
 		msn_slpmsg_set_body(slpmsg, NULL, 4);
 #ifdef MSN_DEBUG_SLP
 		slpmsg->info = "SLP DATA PREP";
@@ -323,7 +317,6 @@
 		/* DATA */
 		slpmsg = msn_slpmsg_new(slplink);
 		slpmsg->slpcall = slpcall;
-		slpmsg->slpsession = slpsession;
 		slpmsg->flags = 0x20;
 #ifdef MSN_DEBUG_SLP
 		slpmsg->info = "SLP DATA";
--- a/libpurple/protocols/msn/slpcall.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/slpcall.c	Thu Aug 07 16:00:16 2008 +0000
@@ -24,7 +24,6 @@
 #include "msn.h"
 #include "msnutils.h"
 #include "slpcall.h"
-#include "slpsession.h"
 
 #include "slp.h"
 
@@ -98,8 +97,10 @@
 	if (slpcall->end_cb != NULL)
 		slpcall->end_cb(slpcall, session);
 
-	if (slpcall->xfer != NULL)
+	if (slpcall->xfer != NULL) {
+		slpcall->xfer->data = NULL;
 		purple_xfer_unref(slpcall->xfer);
+	}
 
 	g_free(slpcall);
 }
@@ -115,12 +116,8 @@
 void
 msn_slp_call_session_init(MsnSlpCall *slpcall)
 {
-	MsnSlpSession *slpsession;
-
-	slpsession = msn_slp_session_new(slpcall);
-
 	if (slpcall->session_init_cb)
-		slpcall->session_init_cb(slpsession);
+		slpcall->session_init_cb(slpcall);
 
 	slpcall->started = TRUE;
 }
--- a/libpurple/protocols/msn/slpcall.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/slpcall.h	Thu Aug 07 16:00:16 2008 +0000
@@ -25,11 +25,11 @@
 #define _MSN_SLPCALL_H_
 
 #include "internal.h"
+#include "ft.h"
 
 typedef struct _MsnSlpCall MsnSlpCall;
 
 #include "slplink.h"
-#include "slpsession.h"
 
 /* The official client seems to timeout slp calls after 5 minutes */
 #define MSN_SLPCALL_TIMEOUT 300000
@@ -66,12 +66,12 @@
 
 	void (*progress_cb)(MsnSlpCall *slpcall,
 						gsize total_length, gsize len, gsize offset);
-	void (*session_init_cb)(MsnSlpSession *slpsession);
+	void (*session_init_cb)(MsnSlpCall *slpcall);
 
 	/* Can be checksum, or smile */
 	char *data_info;
 
-	void *xfer;
+	PurpleXfer *xfer;
 
 	MsnSlpCb cb;
 	void (*end_cb)(MsnSlpCall *slpcall, MsnSession *session);
--- a/libpurple/protocols/msn/slplink.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/slplink.c	Thu Aug 07 16:00:16 2008 +0000
@@ -154,23 +154,6 @@
 	return slplink;
 }
 
-MsnSlpSession *
-msn_slplink_find_slp_session(MsnSlpLink *slplink, long session_id)
-{
-	GList *l;
-	MsnSlpSession *slpsession;
-
-	for (l = slplink->slp_sessions; l != NULL; l = l->next)
-	{
-		slpsession = l->data;
-
-		if (slpsession->id == session_id)
-			return slpsession;
-	}
-
-	return NULL;
-}
-
 void
 msn_slplink_add_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall)
 {
@@ -394,12 +377,12 @@
 	}
 	else if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030)
 	{
-		MsnSlpSession *slpsession;
-		slpsession = slpmsg->slpsession;
+		MsnSlpCall *slpcall;
+		slpcall = slpmsg->slpcall;
 
-		g_return_if_fail(slpsession != NULL);
-		msg->msnslp_header.session_id = slpsession->id;
-		msg->msnslp_footer.value = slpsession->app_id;
+		g_return_if_fail(slpcall != NULL);
+		msg->msnslp_header.session_id = slpcall->session_id;
+		msg->msnslp_footer.value = slpcall->app_id;
 		msg->msnslp_header.ack_id = rand() % 0xFFFFFF00;
 	}
 	else if (slpmsg->flags == 0x100)
@@ -476,18 +459,15 @@
 }
 
 static void
-send_file_cb(MsnSlpSession *slpsession)
+send_file_cb(MsnSlpCall *slpcall)
 {
-	MsnSlpCall *slpcall;
 	MsnSlpMessage *slpmsg;
 	struct stat st;
 	PurpleXfer *xfer;
 
-	slpcall = slpsession->slpcall;
 	slpmsg = msn_slpmsg_new(slpcall->slplink);
 	slpmsg->slpcall = slpcall;
 	slpmsg->flags = 0x1000030;
-	slpmsg->slpsession = slpsession;
 #ifdef MSN_DEBUG_SLP
 	slpmsg->info = "SLP FILE";
 #endif
@@ -556,10 +536,17 @@
 
 					if (xfer != NULL)
 					{
-						purple_xfer_start(slpmsg->slpcall->xfer,
-							0, NULL, 0);
-						slpmsg->fp = ((PurpleXfer *)slpmsg->slpcall->xfer)->dest_fp;
-						xfer->dest_fp = NULL; /* Disable double fclose() */
+						purple_xfer_ref(xfer);
+						purple_xfer_start(xfer,	0, NULL, 0);
+
+						if (xfer->data == NULL) {
+							purple_xfer_unref(xfer);
+							return;
+						} else {
+							purple_xfer_unref(xfer);
+							slpmsg->fp = xfer->dest_fp;
+							xfer->dest_fp = NULL; /* Disable double fclose() */
+						}
 					}
 				}
 			}
--- a/libpurple/protocols/msn/slplink.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/slplink.h	Thu Aug 07 16:00:16 2008 +0000
@@ -53,7 +53,6 @@
 	MsnDirectConn *directconn;
 
 	GList *slp_calls;
-	GList *slp_sessions;
 	GList *slp_msgs;
 
 	GQueue *slp_msg_queue;
@@ -74,8 +73,6 @@
  */
 MsnSlpLink *msn_session_get_slplink(MsnSession *session, const char *username);
 
-MsnSlpSession *msn_slplink_find_slp_session(MsnSlpLink *slplink,
-											long session_id);
 void msn_slplink_add_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall);
 void msn_slplink_remove_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall);
 MsnSlpCall *msn_slplink_find_slp_call(MsnSlpLink *slplink,
--- a/libpurple/protocols/msn/slpmsg.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/slpmsg.c	Thu Aug 07 16:00:16 2008 +0000
@@ -132,22 +132,6 @@
 	slpmsg->size = purple_imgstore_get_size(img);
 }
 
-void
-msn_slpmsg_open_file(MsnSlpMessage *slpmsg, const char *file_name)
-{
-	struct stat st;
-
-	/* We can only have one data source at a time. */
-	g_return_if_fail(slpmsg->buffer == NULL);
-	g_return_if_fail(slpmsg->img == NULL);
-	g_return_if_fail(slpmsg->fp == NULL);
-
-	slpmsg->fp = g_fopen(file_name, "rb");
-
-	if (g_stat(file_name, &st) == 0)
-		slpmsg->size = st.st_size;
-}
-
 #ifdef MSN_DEBUG_SLP
 void
 msn_slpmsg_show(MsnMessage *msg)
--- a/libpurple/protocols/msn/slpmsg.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/slpmsg.h	Thu Aug 07 16:00:16 2008 +0000
@@ -28,7 +28,6 @@
 
 #include "imgstore.h"
 
-#include "slpsession.h"
 #include "slpcall.h"
 #include "slplink.h"
 #include "session.h"
@@ -42,7 +41,6 @@
  */
 struct _MsnSlpMessage
 {
-	MsnSlpSession *slpsession;
 	MsnSlpCall *slpcall; /**< The slpcall to which this slp message belongs (if applicable). */
 	MsnSlpLink *slplink; /**< The slplink through which this slp message is being sent. */
 	MsnSession *session;
--- a/libpurple/protocols/msn/slpsession.c	Thu Jul 31 06:23:55 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/**
- * @file slpsession.h SLP Session functions
- *
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-#include "slpsession.h"
-
-/**************************************************************************
- * SLP Session
- **************************************************************************/
-
-MsnSlpSession *
-msn_slp_session_new(MsnSlpCall *slpcall)
-{
-	MsnSlpSession *slpsession;
-
-	g_return_val_if_fail(slpcall != NULL, NULL);
-
-	slpsession = g_new0(MsnSlpSession, 1);
-
-	slpsession->slpcall = slpcall;
-	slpsession->id = slpcall->session_id;
-	slpsession->app_id = slpcall->app_id;
-
-	slpcall->slplink->slp_sessions =
-		g_list_append(slpcall->slplink->slp_sessions, slpsession);
-
-	return slpsession;
-}
-
-void
-msn_slp_session_destroy(MsnSlpSession *slpsession)
-{
-	g_return_if_fail(slpsession != NULL);
-
-	slpsession->slpcall->slplink->slp_sessions =
-		g_list_remove(slpsession->slpcall->slplink->slp_sessions, slpsession);
-
-	g_free(slpsession);
-}
-
-#if 0
-static void
-msn_slp_session_send_slpmsg(MsnSlpSession *slpsession, MsnSlpMessage *slpmsg)
-{
-	slpmsg->slpsession = slpsession;
-
-#if 0
-	slpmsg->session_id = slpsession->id;
-	slpmsg->app_id = slpsession->app_id;
-#endif
-
-	msn_slplink_send_slpmsg(slpsession->slpcall->slplink, slpmsg);
-}
-#endif
--- a/libpurple/protocols/msn/slpsession.h	Thu Jul 31 06:23:55 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/**
- * @file slpsession.h SLP Session functions
- *
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-#ifndef _MSN_SLPSESSION_H_
-#define _MSN_SLPSESSION_H_
-
-typedef struct _MsnSlpSession MsnSlpSession;
-
-#include "slpcall.h"
-#include "slpsession.h"
-#include "slpmsg.h"
-
-struct _MsnSlpSession
-{
-	/* MsnSlpLink *slplink; */
-	MsnSlpCall *slpcall;
-
-	long id;
-
-	long app_id;
-};
-
-MsnSlpSession *msn_slp_session_new(MsnSlpCall *slpcall);
-void msn_slp_session_destroy(MsnSlpSession *slpsession);
-void msn_slpsession_send_slpmsg(MsnSlpSession *slpsession,
-								MsnSlpMessage *slpmsg);
-#endif /* _MSN_SLPSESSION_H_ */
--- a/libpurple/protocols/msn/soap.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/msn/soap.c	Thu Aug 07 16:00:16 2008 +0000
@@ -38,7 +38,7 @@
 #endif
 
 #define SOAP_TIMEOUT (5 * 60)
-
+#define MSN_UNSAFE_DEBUG 1
 typedef struct _MsnSoapRequest {
 	char *path;
 	MsnSoapMessage *message;
--- a/libpurple/protocols/oscar/family_locate.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/oscar/family_locate.c	Thu Aug 07 16:00:16 2008 +0000
@@ -63,7 +63,8 @@
 	 {0x09, 0x46, 0x00, 0x01, 0x4c, 0x7f, 0x11, 0xd1,
 	  0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}},
 
-	{OSCAR_CAPABILITY_XHTML_IM,
+	/* OSCAR_CAPABILITY_XHTML_IM */
+	{OSCAR_CAPABILITY_GENERICUNKNOWN,
 	 {0x09, 0x46, 0x00, 0x02, 0x4c, 0x7f, 0x11, 0xd1,
 	  0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}},
 
@@ -82,7 +83,8 @@
 	  0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}},
 
 	/* "Microphone" support in Windows AIM 5.5.3501 and newer */
-	{OSCAR_CAPABILITY_MICROPHONE,
+	/* OSCAR_CAPABILITY_MICROPHONE */
+	{OSCAR_CAPABILITY_GENERICUNKNOWN,
 	 {0x09, 0x46, 0x01, 0x03, 0x4c, 0x7f, 0x11, 0xd1,
 	  0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}},
 
--- a/libpurple/protocols/oscar/oscar.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/oscar/oscar.h	Thu Aug 07 16:00:16 2008 +0000
@@ -357,15 +357,13 @@
 	OSCAR_CAPABILITY_HIPTOP               = 0x00100000,
 	OSCAR_CAPABILITY_SECUREIM             = 0x00200000,
 	OSCAR_CAPABILITY_SMS                  = 0x00400000,
-	OSCAR_CAPABILITY_MICROPHONE           = 0x00800000,
-	OSCAR_CAPABILITY_VIDEO                = 0x01000000,
-	OSCAR_CAPABILITY_ICHATAV              = 0x02000000,
-	OSCAR_CAPABILITY_LIVEVIDEO            = 0x04000000,
-	OSCAR_CAPABILITY_CAMERA               = 0x08000000,
-	OSCAR_CAPABILITY_ICHAT_SCREENSHARE    = 0x10000000,
-	OSCAR_CAPABILITY_XHTML_IM             = 0x20000000,
-	OSCAR_CAPABILITY_GENERICUNKNOWN       = 0x40000000,
-	OSCAR_CAPABILITY_LAST                 = 0x80000000
+	OSCAR_CAPABILITY_VIDEO                = 0x00800000,
+	OSCAR_CAPABILITY_ICHATAV              = 0x01000000,
+	OSCAR_CAPABILITY_LIVEVIDEO            = 0x02000000,
+	OSCAR_CAPABILITY_CAMERA               = 0x04000000,
+	OSCAR_CAPABILITY_ICHAT_SCREENSHARE    = 0x08000000,
+	OSCAR_CAPABILITY_GENERICUNKNOWN       = 0x10000000,
+	OSCAR_CAPABILITY_LAST                 = 0x20000000
 } OscarCapability;
 
 /*
--- a/libpurple/protocols/qq/ChangeLog	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/ChangeLog	Thu Aug 07 16:00:16 2008 +0000
@@ -1,3 +1,60 @@
+2008.08.03 - csyfek <csyfek(at)gmail.com>
+	* Commit lost files to Pidgin
+
+2008.08.02 - csyfek <csyfek(at)gmail.com>
+	* Commit to Pidgin
+	* Tickets:
+		Fixes #1861
+		Fixes #1902
+		References #5112
+
+2008.08.02 - ccpaging <ecc_hy(at)hotmail.com>
+	* Store all keys and md5 values of qq_data in char[QQ_KEY_LENGTH]
+	* Use random value in inikey
+	* TEA header padding in crypt.c
+	* Rewrite login part of qq_process
+
+2008.07.31 - ccpaging <ecc_hy(at)hotmail.com>
+	* Fixed: send reply when get duplicate server command. The server may not get our reply before.
+	* Tag custom picture as text "(Broken)"
+
+2008.07.30 - ccpaging <ecc_hy(at)hotmail.com>, csyfek <csyfek(at)gmail.com>
+	* Change some debug message
+	* Modify buddy status flag according to eva for QQ2006
+	* Modify buddy status parse and correspond to eva2
+	* Add getIP/putIP functions to packet_parse.c, and replace some gen_ip_str
+	* Replace guint32 *ip with struct in_addr, and reduce g_new/g_free operation
+	* Source file changed:
+   		Merge buddy_status into buddy_list
+   		Change login_logout to qq_base
+   		Merge keep_alive into qq_base
+   		New qq_process extract from qq_network
+	* Fixed: Byte alignment bug in crypt.c, tested in ARM PDA
+	* Fixed: group chat message may get in before getting group info, and so group info is empty
+	* Add qq_send_cmd_group_get_group_info when joined a group chat in group_im.c
+	* Add some new group command identify according eva but further program
+	* Add some new QQ client version identify
+	* Fixed: Identify buddy's client version by IM packet, and not by status
+	* Add some new info in buddy's tooltip text
+	* Add video falg to buddy's emblem. But those flag in buddy status may not prasing correctly
+	* Use new timeout function to handle send keep_alive, resend packet, update buddy status
+	* Add new advanced options:
+		The end user may change interval of keep_alive, resend packet, update buddy status to feed their need.
+		For example, saving network flow when use mobile phone.
+		Keep alive packet must be sent in 60-120 seconds whatever client rcved data of not.
+		The intervals of keep alive and update status should be multiple of resend's interval,
+		Since we use counter not time() in a single timeout function for efficiency.
+	* Rewrite qq_trans.c, and use one g_list to manage:
+		Store server packet before login, and prase all of them when get login
+		Store client send packet for resend scanning, confirm server reply, filter duplicate server reply
+		Store server packet for filter out duplicate
+	* Add QQ_MSG_SYS_NOTICE = 0x06 in sys_msg.c
+	* Rewrite qq_proc_cmd_reply and qq_proc_cmd_server:
+		In QQ protocol, one packet reply may need a new packet send later.
+		We may call it packet trigger. The triggers always is hided in every qq_process_reply.
+		Now we try to extract those triggers and put into a single function, 
+		and then every trigger should be obviously and easy to manage.
+	
 2008.07.12 - ccpaging <ecc_hy(at)hotmail.com>
 	* Fixed: Always lost connection. Now send keep alive packet in every 30 seconds
 	* Minor fix for debug information
--- a/libpurple/protocols/qq/Makefile.am	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/Makefile.am	Thu Aug 07 16:00:16 2008 +0000
@@ -10,8 +10,6 @@
 	buddy_list.h \
 	buddy_opt.c \
 	buddy_opt.h \
-	buddy_status.c \
-	buddy_status.h \
 	char_conv.c \
 	char_conv.h \
 	crypt.c \
@@ -44,10 +42,10 @@
 	header_info.h \
 	im.c \
 	im.h \
-	keep_alive.c \
-	keep_alive.h \
-	login_logout.c \
-	login_logout.h \
+	qq_process.c \
+	qq_process.h \
+	qq_base.c \
+	qq_base.h \
 	packet_parse.c \
 	packet_parse.h \
 	qq.c \
--- a/libpurple/protocols/qq/Makefile.mingw	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/Makefile.mingw	Thu Aug 07 16:00:16 2008 +0000
@@ -42,7 +42,6 @@
 	buddy_info.c \
 	buddy_list.c \
 	buddy_opt.c \
-	buddy_status.c \
 	char_conv.c \
 	crypt.c \
 	file_trans.c \
@@ -59,13 +58,13 @@
 	group_search.c \
 	header_info.c \
 	im.c \
-	keep_alive.c \
-	login_logout.c \
 	packet_parse.c \
 	qq.c \
+	qq_base.c \
 	qq_network.c \
+	qq_process.c \
+	qq_trans.c \
 	send_file.c \
-	qq_trans.c \
 	sys_msg.c \
 	utils.c
 
--- a/libpurple/protocols/qq/buddy_info.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/buddy_info.c	Thu Aug 07 16:00:16 2008 +0000
@@ -29,11 +29,12 @@
 
 #include "utils.h"
 #include "packet_parse.h"
+#include "buddy_list.h"
 #include "buddy_info.h"
 #include "char_conv.h"
 #include "crypt.h"
 #include "header_info.h"
-#include "keep_alive.h"
+#include "qq_base.h"
 #include "qq_network.h"
 
 #define QQ_PRIMARY_INFORMATION _("Primary Information")
@@ -85,6 +86,7 @@
 };
 
 #define QQ_CONTACT_FIELDS                               37
+#define QQ_FACES	    100
 
 /* There is no user id stored in the reply packet for information query
  * we have to manually store the query, so that we know the query source */
@@ -954,23 +956,23 @@
 	GList *node = qd->buddies;
 	gint bytes = 0;
 
-	if (qd->buddies) {
-		/* server only sends back levels for online buddies, no point
-		 * in asking for anyone else */
-		size = 4 * g_list_length(qd->buddies) + 1;
-		buf = g_new0(guint8, size);
-		bytes += 1;
-
-		while (NULL != node) {
-			q_bud = (qq_buddy *) node->data;
-			if (NULL != q_bud) {
-				bytes += qq_put32(buf + bytes, q_bud->uid);
-			}
-			node = node->next;
+	if ( qd->buddies == NULL) {
+		return;
+	}
+	/* server only sends back levels for online buddies, no point
+	 * in asking for anyone else */
+	size = 4 * g_list_length(qd->buddies) + 1;
+	buf = g_newa(guint8, size);
+	bytes += qq_put8(buf + bytes, 0x00);
+	
+	while (NULL != node) {
+		q_bud = (qq_buddy *) node->data;
+		if (NULL != q_bud) {
+			bytes += qq_put32(buf + bytes, q_bud->uid);
 		}
-		qq_send_cmd(qd, QQ_CMD_GET_LEVEL, buf, size);
-		g_free(buf);
+		node = node->next;
 	}
+	qq_send_cmd(qd, QQ_CMD_GET_LEVEL, buf, size);
 }
 
 void qq_process_get_level_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
@@ -1009,8 +1011,8 @@
 		bytes += qq_get32(&onlineTime, decr_buf + bytes);
 		bytes += qq_get16(&level, decr_buf + bytes);
 		bytes += qq_get16(&timeRemainder, decr_buf + bytes);
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", 
-				"Level uid: %d, onlineTime: %d, level: %d, timeRemainder: %d\n", 
+		purple_debug(PURPLE_DEBUG_INFO, "QQ_LEVEL", 
+				"%d, tmOnline: %d, level: %d, tmRemainder: %d\n", 
 				uid, onlineTime, level, timeRemainder);
 		purple_name = uid_to_purple_name(uid);
 		b = purple_find_buddy(account, purple_name);
@@ -1033,3 +1035,4 @@
 	}
 	g_free(decr_buf);
 }
+
--- a/libpurple/protocols/qq/buddy_info.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/buddy_info.h	Thu Aug 07 16:00:16 2008 +0000
@@ -31,11 +31,34 @@
 #include "buddy_opt.h"
 #include "qq.h"
 
-#define QQ_COMM_FLAG_QQ_MEMBER      0x02
-#define QQ_COMM_FLAG_TCP_MODE       0x10
-#define QQ_COMM_FLAG_MOBILE         0x20
-#define QQ_COMM_FLAG_BIND_MOBILE    0x40
-#define QQ_COMM_FLAG_VIDEO          0x80
+/* use is openq2005
+ * ext_flag: (0-7)
+ *        bit1 => qq space
+ * comm_flag: (0-7)
+ *        bit1 => member
+ *        bit4 => TCP mode
+ *        bit5 => open mobile QQ
+ *        bit6 => bind to mobile
+ *        bit7 => whether having a video
+#define QQ_COMM_FLAG_QQ_MEMBER		0x02
+#define QQ_COMM_FLAG_TCP_MODE    	0x10
+#define QQ_COMM_FLAG_MOBILE       	0x20
+#define QQ_COMM_FLAG_BIND_MOBILE	0x40
+#define QQ_COMM_FLAG_VIDEO          	0x80
+ */
+/* status in eva for qq2006
+#define QQ_FRIEND_FLAG_QQ_MEMBER  0x01
+#define QQ_FRIEND_FLAG_MOBILE           0x10
+#define QQ_FRIEND_FLAG_BIND_MOBILE  0x20
+*/
+#define QQ_COMM_FLAG_QQ_MEMBER		0x02
+#define QQ_COMM_FLAG_QQ_VIP			0x04
+#define QQ_COMM_FLAG_TCP_MODE    	0x10
+#define QQ_COMM_FLAG_MOBILE       	0x20
+#define QQ_COMM_FLAG_BIND_MOBILE	0x40
+#define QQ_COMM_FLAG_VIDEO          	0x80
+
+#define QQ_EXT_FLAG_SPACE				0x02
 
 #define QQ_BUDDY_GENDER_GG          0x00
 #define QQ_BUDDY_GENDER_MM          0x01
@@ -54,5 +77,4 @@
 void qq_send_packet_get_level(PurpleConnection *gc, guint32 uid);
 void qq_send_packet_get_buddies_levels(PurpleConnection *gc);
 void qq_process_get_level_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
-
 #endif
--- a/libpurple/protocols/qq/buddy_list.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/buddy_list.c	Thu Aug 07 16:00:16 2008 +0000
@@ -32,12 +32,11 @@
 #include "packet_parse.h"
 #include "buddy_info.h"
 #include "buddy_list.h"
-#include "buddy_status.h"
 #include "buddy_opt.h"
 #include "char_conv.h"
 #include "crypt.h"
 #include "header_info.h"
-#include "keep_alive.h"
+#include "qq_base.h"
 #include "group.h"
 #include "group_find.h"
 #include "group_internal.h"
@@ -48,16 +47,14 @@
 #define QQ_GET_ONLINE_BUDDY_02          0x02
 #define QQ_GET_ONLINE_BUDDY_03          0x03	/* unknown function */
 
-#define QQ_ONLINE_BUDDY_ENTRY_LEN       38
-
-typedef struct _qq_friends_online_entry {
-	qq_buddy_status *s;
+typedef struct _qq_buddy_online {
+	qq_buddy_status bs;
 	guint16 unknown1;
-	guint8 flag1;
+	guint8 ext_flag;
 	guint8 comm_flag;
 	guint16 unknown2;
 	guint8 ending;		/* 0x00 */
-} qq_friends_online_entry;
+} qq_buddy_online;
 
 /* get a list of online_buddies */
 void qq_send_packet_get_buddies_online(PurpleConnection *gc, guint8 position)
@@ -81,7 +78,7 @@
 	/* 003-004 */
 	bytes += qq_put16(raw_data + bytes, 0x0000);
 
-	qq_send_cmd(qd, QQ_CMD_GET_FRIENDS_ONLINE, raw_data, 5);
+	qq_send_cmd(qd, QQ_CMD_GET_BUDDIES_ONLINE, raw_data, 5);
 	qd->last_get_online = time(NULL);
 }
 
@@ -102,7 +99,7 @@
 	 * March 22, found the 00,00,00 starts to work as well */
 	bytes += qq_put8(raw_data + bytes, 0x00);
 
-	qq_send_cmd(qd, QQ_CMD_GET_FRIENDS_LIST, raw_data, bytes);
+	qq_send_cmd(qd, QQ_CMD_GET_BUDDIES_LIST, raw_data, bytes);
 }
 
 /* get all list, buddies & Quns with groupsid support */
@@ -123,27 +120,45 @@
 	qq_send_cmd(qd, QQ_CMD_GET_ALL_LIST_WITH_GROUP, raw_data, bytes);
 }
 
-static void _qq_buddies_online_reply_dump_unclear(qq_friends_online_entry *fe)
+/* parse the data into qq_buddy_status */
+static gint get_buddy_status(qq_buddy_status *bs, guint8 *data)
 {
-	GString *dump;
+	gint bytes = 0;
 
-	g_return_if_fail(fe != NULL);
-
-	qq_buddy_status_dump_unclear(fe->s);
+	g_return_val_if_fail(data != NULL && bs != NULL, -1);
 
-	dump = g_string_new("");
-	g_string_append_printf(dump, "unclear fields for [%d]:\n", fe->s->uid);
-	g_string_append_printf(dump, "031-032: %04x (unknown)\n", fe->unknown1);
-	g_string_append_printf(dump, "033:     %02x   (flag1)\n", fe->flag1);
-	g_string_append_printf(dump, "034:     %02x   (comm_flag)\n", fe->comm_flag);
-	g_string_append_printf(dump, "035-036: %04x (unknown)\n", fe->unknown2);
+	/* 000-003: uid */
+	bytes += qq_get32(&bs->uid, data + bytes);
+	/* 004-004: 0x01 */
+	bytes += qq_get8(&bs->unknown1, data + bytes);
+	/* this is no longer the IP, it seems QQ (as of 2006) no longer sends
+	 * the buddy's IP in this packet. all 0s */
+	/* 005-008: ip */
+	bytes += qq_getIP(&bs->ip, data + bytes);
+	/* port info is no longer here either */
+	/* 009-010: port */
+	bytes += qq_get16(&bs->port, data + bytes);
+	/* 011-011: 0x00 */
+	bytes += qq_get8(&bs->unknown2, data + bytes);
+	/* 012-012: status */
+	bytes += qq_get8(&bs->status, data + bytes);
+	/* 013-014: client_version */
+	bytes += qq_get16(&bs->unknown3, data + bytes);
+	/* 015-030: unknown key */
+	bytes += qq_getdata(&(bs->unknown_key[0]), QQ_KEY_LENGTH, data + bytes);
 
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Online buddy entry, %s", dump->str);
-	g_string_free(dump, TRUE);
+	purple_debug(PURPLE_DEBUG_INFO, "QQ_STATUS", 
+			"uid: %d, U1: %d, ip: %s:%d, U2:%d, status:%d, U3:%04X\n", 
+			bs->uid, bs->unknown1, inet_ntoa(bs->ip), bs->port,
+			bs->unknown2, bs->status, bs->unknown3);
+
+	return bytes;
 }
 
+#define QQ_ONLINE_BUDDY_ENTRY_LEN       38
+
 /* process the reply packet for get_buddies_online packet */
-void qq_process_get_buddies_online_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
+guint8 qq_process_get_buddies_online_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
 {
 	qq_data *qd;
 	gint len, bytes, bytes_buddy;
@@ -151,9 +166,9 @@
 	guint8 *data, position;
 	PurpleBuddy *b;
 	qq_buddy *q_bud;
-	qq_friends_online_entry *fe;
+	qq_buddy_online bo;
 
-	g_return_if_fail(buf != NULL && buf_len != 0);
+	g_return_val_if_fail(buf != NULL && buf_len != 0, -1);
 
 	qd = (qq_data *) gc->proto_data;
 	len = buf_len;
@@ -163,70 +178,68 @@
 
 	if (!qq_decrypt(buf, buf_len, qd->session_key, data, &len)) {
 		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt buddies online");
-		return;
+		return -1;
 	}
 
-	qq_show_packet("Get buddies online reply packet", data, len);
+	/* qq_show_packet("Get buddies online reply packet", data, len); */
 
 	bytes = 0;
 	bytes += qq_get8(&position, data + bytes);
 
-	fe = g_newa(qq_friends_online_entry, 1);
-	fe->s = g_newa(qq_buddy_status, 1);
-
 	count = 0;
 	while (bytes < len) {
+		if (len - bytes < QQ_ONLINE_BUDDY_ENTRY_LEN) {
+			purple_debug(PURPLE_DEBUG_ERROR, "QQ", 
+					"[buddies online] only %d, need %d", 
+					(len - bytes), QQ_ONLINE_BUDDY_ENTRY_LEN);
+			break;
+		}
+		memset(&bo, 0 ,sizeof(bo));
+		
 		/* set flag */
 		bytes_buddy = bytes;
 		/* based on one online buddy entry */
-		/* ATTTENTION! NEWED in the sub function, but FREED here */
 		/* 000-030 qq_buddy_status */
-		bytes += qq_buddy_status_read(fe->s, data + bytes);
-		/* 031-032: unknown4 */
-		bytes += qq_get16(&fe->unknown1, data + bytes);
-		/* 033-033: flag1 */
-		bytes += qq_get8(&fe->flag1, data + bytes);
+		bytes += get_buddy_status(&(bo.bs), data + bytes);
+		/* 031-032: */
+		bytes += qq_get16(&bo.unknown1, data + bytes);
+		/* 033-033: ext_flag */
+		bytes += qq_get8(&bo.ext_flag, data + bytes);
 		/* 034-034: comm_flag */
-		bytes += qq_get8(&fe->comm_flag, data + bytes);
+		bytes += qq_get8(&bo.comm_flag, data + bytes);
 		/* 035-036: */
-		bytes += qq_get16(&fe->unknown2, data + bytes);
+		bytes += qq_get16(&bo.unknown2, data + bytes);
 		/* 037-037: */
-		bytes += qq_get8(&fe->ending, data + bytes);	/* 0x00 */
+		bytes += qq_get8(&bo.ending, data + bytes);	/* 0x00 */
 
-		if (fe->s->uid == 0 || (bytes - bytes_buddy) != QQ_ONLINE_BUDDY_ENTRY_LEN) {
+		if (bo.bs.uid == 0 || (bytes - bytes_buddy) != QQ_ONLINE_BUDDY_ENTRY_LEN) {
 			purple_debug(PURPLE_DEBUG_ERROR, "QQ", 
 					"uid=0 or entry complete len(%d) != %d", 
 					(bytes - bytes_buddy), QQ_ONLINE_BUDDY_ENTRY_LEN);
-			g_free(fe->s->ip);
-			g_free(fe->s->unknown_key);
 			continue;
 		}	/* check if it is a valid entry */
 
-		if (QQ_DEBUG) {
-			_qq_buddies_online_reply_dump_unclear(fe);
-		}
-
 		/* update buddy information */
-		b = purple_find_buddy(purple_connection_get_account(gc), uid_to_purple_name(fe->s->uid));
+		b = purple_find_buddy(purple_connection_get_account(gc), 
+												uid_to_purple_name(bo.bs.uid) );
 		q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data;
-
-		if (q_bud != NULL) {	/* we find one and update qq_buddy */
-			if(0 != fe->s->client_version)
-				q_bud->client_version = fe->s->client_version;
-			g_memmove(q_bud->ip, fe->s->ip, 4);
-			q_bud->port = fe->s->port;
-			q_bud->status = fe->s->status;
-			q_bud->flag1 = fe->flag1;
-			q_bud->comm_flag = fe->comm_flag;
-			qq_update_buddy_contact(gc, q_bud);
-			count++;
-		} else {
+		if (q_bud == NULL) {
 			purple_debug(PURPLE_DEBUG_ERROR, "QQ", 
-					"Got an online buddy %d, but not in my buddy list\n", fe->s->uid);
+					"Got an online buddy %d, but not in my buddy list\n", bo.bs.uid);
+			continue;
 		}
-
-		g_free(fe->s->ip);
-		g_free(fe->s->unknown_key);
+		/* we find one and update qq_buddy */
+		/*
+		if(0 != fe->s->client_version)
+			q_bud->client_version = fe->s->client_version;
+		*/
+		q_bud->ip.s_addr = bo.bs.ip.s_addr;
+		q_bud->port = bo.bs.port;
+		q_bud->status = bo.bs.status;
+		q_bud->ext_flag = bo.ext_flag;
+		q_bud->comm_flag = bo.comm_flag;
+		qq_update_buddy_contact(gc, q_bud);
+		count++;
 	}
 
 	if(bytes > len) {
@@ -236,20 +249,12 @@
 
 	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d online buddies, nextposition=%u\n",
 							count, (guint) position);
-	if (position != QQ_FRIENDS_ONLINE_POSITION_END
-		  && position != QQ_FRIENDS_ONLINE_POSITION_START) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more online buddies\n"); 
-		qq_send_packet_get_buddies_online(gc, position);
-	} else {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "All online buddies received\n"); 
-		qq_send_packet_get_buddies_levels(gc);
-		qq_refresh_all_buddy_status(gc);
-	}
+	return position;
 }
 
 
 /* process reply for get_buddies_list */
-void qq_process_get_buddies_list_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
+guint16 qq_process_get_buddies_list_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
 {
 	qq_data *qd;
 	qq_buddy *q_bud;
@@ -260,7 +265,7 @@
 	gchar *name;
 	PurpleBuddy *b;
 
-	g_return_if_fail(buf != NULL && buf_len != 0);
+	g_return_val_if_fail(buf != NULL && buf_len != 0, -1);
 
 	qd = (qq_data *) gc->proto_data;
 	len = buf_len;
@@ -268,7 +273,7 @@
 
 	if (!qq_decrypt(buf, buf_len, qd->session_key, data, &len)) {
 		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt buddies list");
-		return;
+		return -1;
 	}
 	bytes = 0;
 	bytes += qq_get16(&position, data + bytes);
@@ -291,16 +296,7 @@
 		bytes += pascal_len;
 
 		bytes += qq_get16(&unknown, data + bytes);
-		/* flag1: (0-7)
-		 *        bit1 => qq show
-		 * comm_flag: (0-7)
-		 *        bit1 => member
-		 *        bit4 => TCP mode
-		 *        bit5 => open mobile QQ
-		 *        bit6 => bind to mobile
-		 *        bit7 => whether having a video
-		 */
-		bytes += qq_get8(&q_bud->flag1, data + bytes);
+		bytes += qq_get8(&q_bud->ext_flag, data + bytes);
 		bytes += qq_get8(&q_bud->comm_flag, data + bytes);
 
 		bytes_expected = 12 + pascal_len;
@@ -317,8 +313,8 @@
 
 		if (QQ_DEBUG) {
 			purple_debug(PURPLE_DEBUG_INFO, "QQ",
-					"buddy [%09d]: flag1=0x%02x, comm_flag=0x%02x, nick=%s\n",
-					q_bud->uid, q_bud->flag1, q_bud->comm_flag, q_bud->nickname);
+					"buddy [%09d]: ext_flag=0x%02x, comm_flag=0x%02x, nick=%s\n",
+					q_bud->uid, q_bud->ext_flag, q_bud->comm_flag, q_bud->nickname);
 		}
 
 		name = uid_to_purple_name(q_bud->uid);
@@ -341,17 +337,10 @@
 
 	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d buddies, nextposition=%u\n",
 		count, (guint) position);
-	if (position != QQ_FRIENDS_LIST_POSITION_START
-		&& position != QQ_FRIENDS_LIST_POSITION_END) { 
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more buddies\n"); 
-		qq_send_packet_get_buddies_list(gc, position);
-	} else {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "All buddies received. Requesting for online buddies list\n");
-		qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_LIST_POSITION_START); 
-	}
+	return position;
 }
 
-void qq_process_get_all_list_with_group_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
+guint32 qq_process_get_all_list_with_group_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
 {
 	qq_data *qd;
 	gint len, i, j;
@@ -363,7 +352,7 @@
 	guint8 type, groupid;
 	qq_group *group;
 
-	g_return_if_fail(buf != NULL && buf_len != 0);
+	g_return_val_if_fail(buf != NULL && buf_len != 0, -1);
 
 	qd = (qq_data *) gc->proto_data;
 	len = buf_len;
@@ -371,11 +360,11 @@
 
 	if (!qq_decrypt(buf, buf_len, qd->session_key, data, &len)) {
 		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt all list with group");
-		return;
+		return -1;
 	}
 
 	bytes += qq_get8(&sub_cmd, data + bytes);
-	g_return_if_fail(sub_cmd == 0x01);
+	g_return_val_if_fail(sub_cmd == 0x01, -1);
 
 	bytes += qq_get8(&reply_code, data + bytes);
 	if(0 != reply_code) {
@@ -429,14 +418,273 @@
 				"qq_process_get_all_list_with_group_reply: Dangerous error! maybe protocol changed, notify developers!");
 	}
 
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Get all list done, %d buddies and %d Quns\n", i, j);
 	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d buddies and %d groups, nextposition=%u\n", i, j, (guint) position);
+	return position;
+}
+
+#define QQ_MISC_STATUS_HAVING_VIIDEO      0x00000001
+#define QQ_CHANGE_ONLINE_STATUS_REPLY_OK 	0x30	/* ASCII value of "0" */
+
+/* TODO: figure out what's going on with the IP region. Sometimes I get valid IP addresses, 
+ * but the port number's weird, other times I get 0s. I get these simultaneously on the same buddy, 
+ * using different accounts to get info. */
+
+/* check if status means online or offline */
+gboolean is_online(guint8 status)
+{
+	switch(status) {
+		case QQ_BUDDY_ONLINE_NORMAL:
+		case QQ_BUDDY_ONLINE_AWAY:
+		case QQ_BUDDY_ONLINE_INVISIBLE:
+			return TRUE;
+		case QQ_BUDDY_ONLINE_OFFLINE:
+			return FALSE;
+	}
+	return FALSE;
+}
+
+/* Help calculate the correct icon index to tell the server. */
+gint get_icon_offset(PurpleConnection *gc)
+{ 
+	PurpleAccount *account;
+	PurplePresence *presence; 
+
+	account = purple_connection_get_account(gc);
+	presence = purple_account_get_presence(account);
+
+	if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE)) {
+		return 2;
+	} else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_AWAY)
+			|| purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_EXTENDED_AWAY)
+			|| purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
+
+/* send a packet to change my online status */
+void qq_send_packet_change_status(PurpleConnection *gc)
+{
+	qq_data *qd;
+	guint8 raw_data[16] = {0};
+	gint bytes = 0;
+	guint8 away_cmd;
+	guint32 misc_status;
+	gboolean fake_video;
+	PurpleAccount *account;
+	PurplePresence *presence; 
+
+	account = purple_connection_get_account(gc);
+	presence = purple_account_get_presence(account);
 
-	if (position != QQ_FRIENDS_ALL_LIST_POSITION_START
-		&& position != QQ_FRIENDS_ALL_LIST_POSITION_END) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more buddies and groups\n");
-		qq_send_packet_get_all_list_with_group(gc, position);
+	qd = (qq_data *) gc->proto_data;
+	if (!qd->logged_in)
+		return;
+
+	if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE)) {
+		away_cmd = QQ_BUDDY_ONLINE_INVISIBLE;
+	} else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_AWAY)
+			|| purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_EXTENDED_AWAY)
+			|| purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE)) {
+		away_cmd = QQ_BUDDY_ONLINE_AWAY;
 	} else {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "All buddies and groups received\n"); 
+		away_cmd = QQ_BUDDY_ONLINE_NORMAL;
+	}
+
+	misc_status = 0x00000000;
+	fake_video = purple_prefs_get_bool("/plugins/prpl/qq/show_fake_video");
+	if (fake_video)
+		misc_status |= QQ_MISC_STATUS_HAVING_VIIDEO;
+
+	bytes = 0;
+	bytes += qq_put8(raw_data + bytes, away_cmd);
+	bytes += qq_put32(raw_data + bytes, misc_status);
+
+	qq_send_cmd(qd, QQ_CMD_CHANGE_ONLINE_STATUS, raw_data, bytes);
+}
+
+/* parse the reply packet for change_status */
+void qq_process_change_status_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
+{
+	qq_data *qd;
+	gint len, bytes;
+	guint8 *data, reply;
+	PurpleBuddy *b;
+	qq_buddy *q_bud;
+	gchar *name;
+
+	g_return_if_fail(buf != NULL && buf_len != 0);
+
+	qd = (qq_data *) gc->proto_data;
+	len = buf_len;
+	data = g_newa(guint8, len);
+
+	if ( !qq_decrypt(buf, buf_len, qd->session_key, data, &len) ) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt chg status reply\n");
+		return;
+	}
+
+	bytes = 0;
+	bytes = qq_get8(&reply, data + bytes);
+	if (reply != QQ_CHANGE_ONLINE_STATUS_REPLY_OK) {
+		purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Change status fail 0x%02X\n", reply);
+		return;
+	}
+
+	/* purple_debug(PURPLE_DEBUG_INFO, "QQ", "Change status OK\n"); */
+	name = uid_to_purple_name(qd->uid);
+	b = purple_find_buddy(gc->account, name);
+	g_free(name);
+	q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data;
+	if (q_bud != NULL) {
+		qq_update_buddy_contact(gc, q_bud);
 	}
 }
+
+/* it is a server message indicating that one of my buddies has changed its status */
+void qq_process_buddy_change_status(guint8 *buf, gint buf_len, PurpleConnection *gc) 
+{
+	qq_data *qd;
+	gint bytes;
+	guint32 my_uid;
+	guint8 *data;
+	gint data_len;
+	PurpleBuddy *b;
+	qq_buddy *q_bud;
+	qq_buddy_status bs;
+	gchar *name;
+
+	g_return_if_fail(buf != NULL && buf_len != 0);
+
+	qd = (qq_data *) gc->proto_data;
+	data_len = buf_len;
+	data = g_newa(guint8, data_len);
+
+	if ( !qq_decrypt(buf, buf_len, qd->session_key, data, &data_len) ) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "[buddy status change] Failed decrypt\n");
+		return;
+	}
+
+	if (data_len < 35) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "[buddy status change] only %d, need 35 bytes\n", data_len);
+		return;
+	}
+	
+	memset(&bs, 0, sizeof(bs));
+	bytes = 0;
+	/* 000-030: qq_buddy_status */
+	bytes += get_buddy_status(&bs, data + bytes);
+	/* 031-034:  Unknow, maybe my uid */ 
+	/* This has a value of 0 when we've changed our status to 
+	 * QQ_BUDDY_ONLINE_INVISIBLE */
+	bytes += qq_get32(&my_uid, data + bytes);
+
+	name = uid_to_purple_name(bs.uid);
+	b = purple_find_buddy(gc->account, name);
+	g_free(name);
+	q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data;
+	if (q_bud == NULL) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", 
+				"got information of unknown buddy %d\n", bs.uid);
+		return;
+	}
+
+	purple_debug(PURPLE_DEBUG_INFO, "QQ", "status:.uid = %d, q_bud->uid = %d\n", bs.uid , q_bud->uid);
+	if(bs.ip.s_addr != 0) { 
+		q_bud->ip.s_addr = bs.ip.s_addr;
+		q_bud->port = bs.port;
+	}
+	q_bud->status =bs.status;
+
+	if (q_bud->status == QQ_BUDDY_ONLINE_NORMAL) {
+		qq_send_packet_get_level(gc, q_bud->uid);
+	}
+	qq_update_buddy_contact(gc, q_bud);
+}
+
+/*TODO: maybe this should be qq_update_buddy_status() ?*/
+void qq_update_buddy_contact(PurpleConnection *gc, qq_buddy *q_bud)
+{
+	gchar *name;
+	PurpleBuddy *bud;
+	gchar *status_id;
+	
+	g_return_if_fail(q_bud != NULL);
+
+	name = uid_to_purple_name(q_bud->uid);
+	bud = purple_find_buddy(gc->account, name);
+
+	if (bud == NULL) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "unknown buddy: %d\n", q_bud->uid);
+		g_free(name);
+		return;
+	}
+	
+	purple_blist_server_alias_buddy(bud, q_bud->nickname); /* server */
+	q_bud->last_refresh = time(NULL);
+
+	/* purple supports signon and idle time
+	 * but it is not much use for QQ, I do not use them */
+	/* serv_got_update(gc, name, online, 0, q_bud->signon, q_bud->idle, bud->uc); */
+	status_id = "available";
+	switch(q_bud->status) {
+	case QQ_BUDDY_OFFLINE:
+		status_id = "offline";
+		break;
+	case QQ_BUDDY_ONLINE_NORMAL:
+		status_id = "available";
+		break;
+	case QQ_BUDDY_ONLINE_OFFLINE:
+		status_id = "offline";
+		break;
+	case QQ_BUDDY_ONLINE_AWAY:
+		status_id = "away";
+		break;
+	case QQ_BUDDY_ONLINE_INVISIBLE:
+		status_id = "invisible";
+		break;
+	default:
+		status_id = "invisible";
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "unknown status: %x\n", q_bud->status);
+		break;
+	}
+	purple_debug(PURPLE_DEBUG_INFO, "QQ", "buddy %d %s\n", q_bud->uid, status_id);
+	purple_prpl_got_user_status(gc->account, name, status_id, NULL);
+
+	if (q_bud->comm_flag & QQ_COMM_FLAG_MOBILE && q_bud->status != QQ_BUDDY_OFFLINE)
+		purple_prpl_got_user_status(gc->account, name, "mobile", NULL);
+	else
+		purple_prpl_got_user_status_deactive(gc->account, name, "mobile");
+
+	if (q_bud->comm_flag & QQ_COMM_FLAG_VIDEO && q_bud->status != QQ_BUDDY_OFFLINE)
+		purple_prpl_got_user_status(gc->account, name, "video", NULL);
+	else
+		purple_prpl_got_user_status_deactive(gc->account, name, "video");
+
+	g_free(name);
+}
+
+/* refresh all buddies online/offline,
+ * after receiving reply for get_buddies_online packet */
+void qq_refresh_all_buddy_status(PurpleConnection *gc)
+{
+	time_t now;
+	GList *list;
+	qq_data *qd;
+	qq_buddy *q_bud;
+
+	qd = (qq_data *) (gc->proto_data);
+	now = time(NULL);
+	list = qd->buddies;
+
+	while (list != NULL) {
+		q_bud = (qq_buddy *) list->data;
+		if (q_bud != NULL && now > q_bud->last_refresh + QQ_UPDATE_ONLINE_INTERVAL
+				&& q_bud->status != QQ_BUDDY_ONLINE_INVISIBLE) {
+			q_bud->status = QQ_BUDDY_ONLINE_OFFLINE;
+			qq_update_buddy_contact(gc, q_bud);
+		}
+		list = list->next;
+	}
+}
--- a/libpurple/protocols/qq/buddy_list.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/buddy_list.h	Thu Aug 07 16:00:16 2008 +0000
@@ -28,18 +28,45 @@
 #include <glib.h>
 #include "connection.h"
 
-#define QQ_FRIENDS_LIST_POSITION_START 		0x0000
-#define QQ_FRIENDS_LIST_POSITION_END 		0xffff
-#define QQ_FRIENDS_ONLINE_POSITION_START 	0x00
-#define QQ_FRIENDS_ONLINE_POSITION_END 		0xff
-#define QQ_FRIENDS_ALL_LIST_POSITION_START  0x00000000
-#define QQ_FRIENDS_ALL_LIST_POSITION_END  0xffffffff
+#include "qq.h"
+typedef struct _qq_buddy_status {
+	guint32 uid;
+	guint8 unknown1;
+	struct in_addr ip;
+	guint16 port;
+	guint8 unknown2;
+	guint8 status;
+	guint16 unknown3;
+	guint8 unknown_key[QQ_KEY_LENGTH];
+} qq_buddy_status;
+
+enum {
+	QQ_BUDDY_OFFLINE = 0x00,
+	QQ_BUDDY_ONLINE_NORMAL = 0x0a,
+	QQ_BUDDY_ONLINE_OFFLINE = 0x14,
+	QQ_BUDDY_ONLINE_AWAY = 0x1e,
+	QQ_BUDDY_ONLINE_INVISIBLE = 0x28
+};
 
 void qq_send_packet_get_buddies_online(PurpleConnection *gc, guint8 position);
-void qq_process_get_buddies_online_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
+guint8 qq_process_get_buddies_online_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
+
 void qq_send_packet_get_buddies_list(PurpleConnection *gc, guint16 position);
-void qq_process_get_buddies_list_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
+guint16 qq_process_get_buddies_list_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
+
 void qq_send_packet_get_all_list_with_group(PurpleConnection *gc, guint32 position);
-void qq_process_get_all_list_with_group_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
+guint32 qq_process_get_all_list_with_group_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
+
+void qq_refresh_all_buddy_status(PurpleConnection *gc);
+
+gboolean is_online(guint8 status);
+
+gint get_icon_offset(PurpleConnection *gc);
 
+void qq_send_packet_change_status(PurpleConnection *gc);
+void qq_process_change_status_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
+void qq_process_buddy_change_status(guint8 *buf, gint buf_len, PurpleConnection *gc);
+
+void qq_refresh_all_buddy_status(PurpleConnection *gc);
+void qq_update_buddy_contact(PurpleConnection *gc, qq_buddy *q_bud);
 #endif
--- a/libpurple/protocols/qq/buddy_opt.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/buddy_opt.c	Thu Aug 07 16:00:16 2008 +0000
@@ -34,7 +34,7 @@
 #include "crypt.h"
 #include "header_info.h"
 #include "im.h"
-#include "keep_alive.h"
+#include "qq_base.h"
 #include "packet_parse.h"
 #include "qq_network.h"
 #include "utils.h"
@@ -67,7 +67,7 @@
 	g_return_if_fail(uid > 0);
 
 	g_snprintf(uid_str, sizeof(uid_str), "%d", uid);
-	qq_send_cmd(qd, QQ_CMD_DEL_FRIEND, (guint8 *) uid_str, strlen(uid_str));
+	qq_send_cmd(qd, QQ_CMD_DEL_BUDDY, (guint8 *) uid_str, strlen(uid_str));
 }
 
 /* try to remove myself from someone's buddy list */
@@ -95,7 +95,7 @@
 
 	/* we need to send the ascii code of this uid to qq server */
 	g_snprintf(uid_str, sizeof(uid_str), "%d", uid);
-	qq_send_cmd(qd, QQ_CMD_ADD_FRIEND_WO_AUTH, (guint8 *) uid_str, strlen(uid_str));
+	qq_send_cmd(qd, QQ_CMD_ADD_BUDDY_WO_AUTH, (guint8 *) uid_str, strlen(uid_str));
 
 	/* must be set after sending packet to get the correct send_seq */
 	req = g_new0(qq_add_buddy_request, 1);
@@ -481,7 +481,7 @@
 		b->proto_data = q_bud;
 		qd->buddies = g_list_append(qd->buddies, q_bud);
 		qq_send_packet_get_info(gc, q_bud->uid, FALSE);
-		qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_ONLINE_POSITION_START);
+		qq_send_packet_get_buddies_online(gc, 0);
 	}
 
 	purple_blist_add_buddy(b, NULL, g, NULL);
--- a/libpurple/protocols/qq/buddy_status.c	Thu Jul 31 06:23:55 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,280 +0,0 @@
-/**
- * @file buddy_status.c
- *
- * purple
- *
- * Purple is the legal property ofr its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#include <string.h>
-#include "internal.h"
-#include "debug.h"
-#include "prefs.h"
-
-#include "buddy_info.h"
-#include "buddy_status.h"
-#include "crypt.h"
-#include "header_info.h"
-#include "keep_alive.h"
-#include "packet_parse.h"
-#include "utils.h"
-
-#include "qq_network.h"
-
-#define QQ_MISC_STATUS_HAVING_VIIDEO      0x00000001
-#define QQ_CHANGE_ONLINE_STATUS_REPLY_OK 	0x30	/* ASCII value of "0" */
-
-void qq_buddy_status_dump_unclear(qq_buddy_status *s)
-{
-	GString *dump;
-
-	g_return_if_fail(s != NULL);
-
-	dump = g_string_new("");
-	g_string_append_printf(dump, "unclear fields for [%d]:\n", s->uid);
-	g_string_append_printf(dump, "004:     %02x   (unknown)\n", s->unknown1);
-	/* g_string_append_printf(dump, "005-008:     %09x   (ip)\n", *(s->ip)); */
-	g_string_append_printf(dump, "009-010:     %04x   (port)\n", s->port);
-	g_string_append_printf(dump, "011:     %02x   (unknown)\n", s->unknown2);
-	g_string_append_printf(dump, "012:     %02x   (status)\n", s->status);
-	g_string_append_printf(dump, "013-014:     %04x   (client_version)\n", s->client_version);
-	/* g_string_append_printf(dump, "015-030:     %s   (unknown key)\n", s->unknown_key); */
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Buddy status entry, %s", dump->str);
-	qq_show_packet("Unknown key", s->unknown_key, QQ_KEY_LENGTH);
-	g_string_free(dump, TRUE);
-}
-
-/* TODO: figure out what's going on with the IP region. Sometimes I get valid IP addresses, 
- * but the port number's weird, other times I get 0s. I get these simultaneously on the same buddy, 
- * using different accounts to get info. */
-
-/* parse the data into qq_buddy_status */
-gint qq_buddy_status_read(qq_buddy_status *s, guint8 *data)
-{
-	gint bytes = 0;
-
-	g_return_val_if_fail(data != NULL && s != NULL, -1);
-
-	/* 000-003: uid */
-	bytes += qq_get32(&s->uid, data + bytes);
-	/* 004-004: 0x01 */
-	bytes += qq_get8(&s->unknown1, data + bytes);
-	/* this is no longer the IP, it seems QQ (as of 2006) no longer sends
-	 * the buddy's IP in this packet. all 0s */
-	/* 005-008: ip */
-	s->ip = g_new0(guint8, 4);
-	bytes += qq_getdata(s->ip, 4, data + bytes);
-	/* port info is no longer here either */
-	/* 009-010: port */
-	bytes += qq_get16(&s->port, data + bytes);
-	/* 011-011: 0x00 */
-	bytes += qq_get8(&s->unknown2, data + bytes);
-	/* 012-012: status */
-	bytes += qq_get8(&s->status, data + bytes);
-	/* 013-014: client_version */
-	bytes += qq_get16(&s->client_version, data + bytes);
-	/* 015-030: unknown key */
-	s->unknown_key = g_new0(guint8, QQ_KEY_LENGTH);
-	bytes += qq_getdata(s->unknown_key, QQ_KEY_LENGTH, data + bytes);
-
-	if (s->uid == 0 || bytes != 31)
-		return -1;
-
-	return bytes;
-}
-
-/* check if status means online or offline */
-gboolean is_online(guint8 status)
-{
-	switch(status) {
-		case QQ_BUDDY_ONLINE_NORMAL:
-		case QQ_BUDDY_ONLINE_AWAY:
-		case QQ_BUDDY_ONLINE_INVISIBLE:
-			return TRUE;
-		case QQ_BUDDY_ONLINE_OFFLINE:
-			return FALSE;
-	}
-	return FALSE;
-}
-
-/* Help calculate the correct icon index to tell the server. */
-gint get_icon_offset(PurpleConnection *gc)
-{ 
-	PurpleAccount *account;
-	PurplePresence *presence; 
-
-	account = purple_connection_get_account(gc);
-	presence = purple_account_get_presence(account);
-
-	if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE)) {
-		return 2;
-	} else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_AWAY)
-			|| purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_EXTENDED_AWAY)
-			|| purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE)) {
-		return 1;
-	} else {
-		return 0;
-	}
-}
-
-/* send a packet to change my online status */
-void qq_send_packet_change_status(PurpleConnection *gc)
-{
-	qq_data *qd;
-	guint8 raw_data[16] = {0};
-	gint bytes = 0;
-	guint8 away_cmd;
-	guint32 misc_status;
-	gboolean fake_video;
-	PurpleAccount *account;
-	PurplePresence *presence; 
-
-	account = purple_connection_get_account(gc);
-	presence = purple_account_get_presence(account);
-
-	qd = (qq_data *) gc->proto_data;
-	if (!qd->logged_in)
-		return;
-
-	if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE)) {
-		away_cmd = QQ_BUDDY_ONLINE_INVISIBLE;
-	} else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_AWAY)
-			|| purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_EXTENDED_AWAY)
-			|| purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE)) {
-		away_cmd = QQ_BUDDY_ONLINE_AWAY;
-	} else {
-		away_cmd = QQ_BUDDY_ONLINE_NORMAL;
-	}
-
-	misc_status = 0x00000000;
-	fake_video = purple_prefs_get_bool("/plugins/prpl/qq/show_fake_video");
-	if (fake_video)
-		misc_status |= QQ_MISC_STATUS_HAVING_VIIDEO;
-
-	bytes = 0;
-	bytes += qq_put8(raw_data + bytes, away_cmd);
-	bytes += qq_put32(raw_data + bytes, misc_status);
-
-	qq_send_cmd(qd, QQ_CMD_CHANGE_ONLINE_STATUS, raw_data, bytes);
-}
-
-/* parse the reply packet for change_status */
-void qq_process_change_status_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
-{
-	qq_data *qd;
-	gint len, bytes;
-	guint8 *data, reply;
-	PurpleBuddy *b;
-	qq_buddy *q_bud;
-	gchar *name;
-
-	g_return_if_fail(buf != NULL && buf_len != 0);
-
-	qd = (qq_data *) gc->proto_data;
-	len = buf_len;
-	data = g_newa(guint8, len);
-
-	if ( !qq_decrypt(buf, buf_len, qd->session_key, data, &len) ) {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt chg status reply\n");
-		return;
-	}
-
-	bytes = 0;
-	bytes = qq_get8(&reply, data + bytes);
-	if (reply != QQ_CHANGE_ONLINE_STATUS_REPLY_OK) {
-		purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Change status fail\n");
-	} else {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Change status OK\n");
-		name = uid_to_purple_name(qd->uid);
-		b = purple_find_buddy(gc->account, name);
-		g_free(name);
-		q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data;
-		if (q_bud != NULL) {
-			qq_update_buddy_contact(gc, q_bud);
-		}
-	}
-}
-
-/* it is a server message indicating that one of my buddies has changed its status */
-void qq_process_friend_change_status(guint8 *buf, gint buf_len, PurpleConnection *gc) 
-{
-	qq_data *qd;
-	gint len, bytes;
-	guint32 my_uid;
-	guint8 *data;
-	PurpleBuddy *b;
-	qq_buddy *q_bud;
-	qq_buddy_status *s;
-	gchar *name;
-
-	g_return_if_fail(buf != NULL && buf_len != 0);
-
-	qd = (qq_data *) gc->proto_data;
-	len = buf_len;
-	data = g_newa(guint8, len);
-
-	if ( !qq_decrypt(buf, buf_len, qd->session_key, data, &len) ) {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt buddy status change packet\n");
-		return;
-	}
-
-	s = g_new0(qq_buddy_status, 1);
-	bytes = 0;
-	/* 000-030: qq_buddy_status */
-	bytes += qq_buddy_status_read(s, data + bytes);
-	/* 031-034: my uid */ 
-	/* This has a value of 0 when we've changed our status to 
-	 * QQ_BUDDY_ONLINE_INVISIBLE */
-	bytes += qq_get32(&my_uid, data + bytes);
-
-	if (bytes != 35) {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "bytes(%d) != 35\n", bytes);
-		g_free(s->ip);
-		g_free(s->unknown_key);
-		g_free(s);
-		return;
-	}
-
-	name = uid_to_purple_name(s->uid);
-	b = purple_find_buddy(gc->account, name);
-	g_free(name);
-	q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data;
-	if (q_bud) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "s->uid = %d, q_bud->uid = %d\n", s->uid , q_bud->uid);
-		if(0 != *((guint32 *)s->ip)) { 
-			g_memmove(q_bud->ip, s->ip, 4);
-			q_bud->port = s->port;
-		}
-		q_bud->status = s->status;
-		if(0 != s->client_version) {
-			q_bud->client_version = s->client_version; 
-		}
-		if (q_bud->status == QQ_BUDDY_ONLINE_NORMAL) {
-			qq_send_packet_get_level(gc, q_bud->uid);
-		}
-		qq_update_buddy_contact(gc, q_bud);
-	} else {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", 
-				"got information of unknown buddy %d\n", s->uid);
-	}
-
-	g_free(s->ip);
-	g_free(s->unknown_key);
-	g_free(s);
-}
--- a/libpurple/protocols/qq/buddy_status.h	Thu Jul 31 06:23:55 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/**
- * @file buddy_status.h
- *
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- *
- */
-
-#ifndef _QQ_BUDDY_STATUS_H_
-#define _QQ_BUDDY_STATUS_H_
-
-#include <glib.h>
-#include "connection.h"
-#include "qq.h"
-
-typedef struct _qq_buddy_status {
-	guint32 uid;
-	guint8 unknown1;
-	guint8 *ip;
-	guint16 port;
-	guint8 unknown2;
-	guint8 status;
-	guint16 client_version;
-	guint8 *unknown_key;
-} qq_buddy_status;
-
-enum {
-	QQ_BUDDY_OFFLINE = 0x00,
-	QQ_BUDDY_ONLINE_NORMAL = 0x0a,
-	QQ_BUDDY_ONLINE_OFFLINE = 0x14,
-	QQ_BUDDY_ONLINE_AWAY = 0x1e,
-	QQ_BUDDY_ONLINE_INVISIBLE = 0x28
-};
-
-void qq_buddy_status_dump_unclear(qq_buddy_status *s);
-gboolean is_online(guint8 status);
-
-gint qq_buddy_status_read(qq_buddy_status *s, guint8 *data);
-gint get_icon_offset(PurpleConnection *gc);
-
-void qq_send_packet_change_status(PurpleConnection *gc);
-
-void qq_process_change_status_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
-void qq_process_friend_change_status(guint8 *buf, gint buf_len, PurpleConnection *gc);
-#endif
--- a/libpurple/protocols/qq/char_conv.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/char_conv.c	Thu Aug 07 16:00:16 2008 +0000
@@ -37,7 +37,7 @@
 #define QQ_CHARSET_ENG        "ISO-8859-1"
 
 #define QQ_NULL_MSG           "(NULL)"	/* return this if conversion fails */
-#define QQ_NULL_SMILEY        "(SM)"	/* return this if smiley conversion fails */
+#define QQ_NULL_SMILEY        "(Broken)"	/* return this if smiley conversion fails */
 
 const gchar qq_smiley_map[QQ_SMILEY_AMOUNT] = {
 	0x41, 0x43, 0x42, 0x44, 0x45, 0x46, 0x47, 0x48,
@@ -113,9 +113,9 @@
 	}
 	
 	/* conversion error */
-	purple_debug(PURPLE_DEBUG_ERROR, "QQ", "%s\n", error->message);
+	purple_debug(PURPLE_DEBUG_ERROR, "QQ_CONVERT", "%s\n", error->message);
 
-	qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ",
+	qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ_CONVERT",
 		(guint8 *) str, (len == -1) ? strlen(str) : len,
 		"Dump failed text");
 
@@ -151,7 +151,7 @@
 	gint bytes = 0;
 
 	/* checked qq_show_packet OK */
-	qq_show_packet("QQ_MESG recv for font style", data, len);
+	/* qq_show_packet("QQ_MESG recv for font style", data, len); */
 
 	bytes += qq_get8(&font_attr, data + bytes);
 	bytes += qq_getdata(color, 3, data + bytes);	/* red,green,blue */
@@ -231,7 +231,7 @@
 	GString *converted;
 
 	converted = g_string_new("");
-	segments = split_data((guint8 *) text, strlen(text), "\x14", 0);
+	segments = split_data((guint8 *) text, strlen(text), "\x14\x15", 0);
 	g_string_append(converted, segments[0]);
 
 	while ((*(++segments)) != NULL) {
@@ -286,7 +286,7 @@
 	}
 
 	for (temp = str; *temp != 0; temp++) {
-		if (*temp == '\r' || *temp == '\n')  *temp = 0x20;
+		if (*temp == '\r' || *temp == '\n')  *temp = ' ';
 	}
 	g_strstrip(str);
 }
--- a/libpurple/protocols/qq/crypt.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/crypt.c	Thu Aug 07 16:00:16 2008 +0000
@@ -19,7 +19,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  *
  * QQ encryption algorithm
@@ -28,7 +28,7 @@
  * Puzzlebird, Nov-Dec 2002
  */
 
-/*Notes: (QQ uses 16 rounds, and modified something...)
+/* Notes: (QQ uses 16 rounds, and modified something...)
 
 IN : 64  bits of data in v[0] - v[1].
 OUT: 64  bits of data in w[0] - w[1].
@@ -45,6 +45,13 @@
 #include "crypt.h"
 #include "debug.h"
 
+/* 1, fixed alignment problem, when compiled on different platform
+ * 2, whether we need core debug
+ * 20070717, s3e */
+#if 0 
+#define CORE_DEBUG
+#endif
+
 /********************************************************************
  * encryption 
  *******************************************************************/
@@ -52,7 +59,8 @@
 /* Tiny Encryption Algorithm (TEA) */
 static void qq_encipher(guint32 *const v, const guint32 *const k, guint32 *const w)
 {
-	register guint32 y = g_ntohl(v[0]), 
+	register guint32
+		y = g_ntohl(v[0]), 
 		 z = g_ntohl(v[1]), 
 		 a = g_ntohl(k[0]), 
 		 b = g_ntohl(k[1]), 
@@ -72,24 +80,86 @@
 	w[1] = g_htonl(z);
 }
 
-static gint rand(void) {	/* it can be the real random seed function */
-	return 0xdead;
-}			/* override with number, convenient for debug */
+/* it can be the real random seed function */
+/* override with number, convenient for debug */
+#ifdef DEBUG
+static gint rand(void) {	
+	return 0xdead; 
+}
+#else
+#include <stdlib.h>
+#endif
 
 /* 64-bit blocks and some kind of feedback mode of operation */
-static void encrypt_block(guint8 *plain, guint8 *plain_pre_8, guint8 **crypted, 
+static inline void encrypt_block(guint8 *plain, guint8 *plain_pre_8, guint8 **crypted, 
 		guint8 **crypted_pre_8, const guint8 *const key, gint *count, 
 		gint *pos_in_block, gint *is_header) 
 {
+	/* loop it */
+	int j;
+	/* ships in encipher */
+	guint32 ptr_p[2];	/* 64 bits, guint32[2] */
+	guint32 ptr_k[4];	/* 128 bits, guint32[4] */
+	guint32 ptr_c[2];	/* 64 bits, guint32[2] */
+
 	/* prepare input text */
-	if (!*is_header)
-		*(guint64 *) plain ^= **(guint64 **) crypted_pre_8;
+#ifdef CORE_DEBUG
+	purple_debug(PURPLE_DEBUG_ERROR, "QQ_CORE_DEBUG",
+		"!we are in encrypt_block! *pos_in_block comes: %d, *is_header comes: %d\n",
+		*pos_in_block, *is_header);
+#endif
+	for(j = 0; j < 8; j++) {
+#ifdef CORE_DEBUG
+		purple_debug(PURPLE_DEBUG_INFO, "QQ_CORE_DEBUG",
+			"plain[%d]: 0x%02x, plain_pre_8[%d]: 0x%02x\n",
+			j, plain[j], j, plain_pre_8[j]);
+#endif
+		if (!*is_header) {
+#ifdef CORE_DEBUG
+			purple_debug(PURPLE_DEBUG_INFO, "QQ_CORE_DEBUG",
+				"(*crypted_pre_8 + %d): 0x%02x\n",
+				j, *(*crypted_pre_8 + j));
+#endif
+			plain[j] ^= (*(*crypted_pre_8 + j));
+#ifdef CORE_DEBUG
+			purple_debug(PURPLE_DEBUG_INFO, "QQ_CORE_DEBUG",
+				"NOW plain[%d]: 0x%02x\n",
+				j, plain[j]);
+#endif
+		} else {
+			plain[j] ^= plain_pre_8[j];
+#ifdef CORE_DEBUG
+			purple_debug(PURPLE_DEBUG_INFO, "QQ_CORE_DEBUG",
+				"NOW plain[%d]: 0x%02x\n",
+				j, plain[j]);
+#endif
+		}
+	}
+
+	g_memmove(ptr_p, plain, 8);
+	g_memmove(ptr_k, key, 16);
+	g_memmove(ptr_c, *crypted, 8);
 
 	/* encrypt it */
-	qq_encipher((guint32 *) plain, (guint32 *) key, (guint32 *) *crypted);
+	qq_encipher(ptr_p, ptr_k, ptr_c);
+	
+	g_memmove(plain, ptr_p, 8);
+	g_memmove(*crypted, ptr_c, 8);
 
-	**(guint64 **) crypted ^= *(guint64 *) plain_pre_8;
-
+	for(j = 0; j < 8; j++) {
+#ifdef CORE_DEBUG
+		purple_debug(PURPLE_DEBUG_INFO, "QQ_CORE_DEBUG",
+			"j: %d, *(*crypted + %d): 0x%02x, plain_pre_8[%d]: 0x%02x\n",
+			j, j, *(*crypted + j), j, plain_pre_8[j]);
+#endif
+		(*(*crypted + j)) ^= plain_pre_8[j];
+#ifdef CORE_DEBUG
+		purple_debug(PURPLE_DEBUG_INFO, "QQ_CORE_DEBUG",
+			"NOW *(*crypted + [%d]): 0x%02x\n",
+			j, *(*crypted + j));
+#endif
+	}
+	
 	memcpy(plain_pre_8, plain, 8);	/* prepare next */
 
 	*crypted_pre_8 = *crypted;	/* store position of previous 8 byte */
@@ -171,7 +241,8 @@
 
 static void qq_decipher(guint32 *const v, const guint32 *const k, guint32 *const w)
 {
-	register guint32 y = g_ntohl(v[0]), 
+	register guint32
+		y = g_ntohl(v[0]), 
 		z = g_ntohl(v[1]), 
 		a = g_ntohl(k[0]), 
 		b = g_ntohl(k[1]), 
@@ -196,12 +267,25 @@
 		const guint8 *const key, gint *context_start, 
 		guint8 *decrypted, gint *pos_in_block)
 {
+	/* loop */
+	int i;
+	/* ships in decipher */
+	guint32 ptr_v[2];
+	guint32 ptr_k[4];
+
 	if (*context_start == instrlen)
 		return 1;
 
-	*(guint64 *) decrypted ^= **(guint64 **) crypt_buff;
+	for(i = 0; i < 8; i++) {
+		decrypted[i] ^= (*(*crypt_buff + i));
+	}
+	
+	g_memmove(ptr_v, decrypted, 8);
+	g_memmove(ptr_k, key, 16);
 
-	qq_decipher((guint32 *) decrypted, (guint32 *) key, (guint32 *) decrypted);
+	qq_decipher(ptr_v, ptr_k, ptr_v);
+
+	g_memmove(decrypted, ptr_v, 8);
 
 	*context_start += 8;
 	*crypt_buff += 8;
@@ -218,6 +302,10 @@
 	guint8 decrypted[8], m[8], *outp;
 	const guint8 *crypt_buff, *crypt_buff_pre_8;
 	gint count, context_start, pos_in_block, padding;
+	/* ships */
+	guint32 ptr_instr[2];
+	guint32 ptr_key[4];
+	guint32 ptr_decr[2];
 
 	/* at least 16 bytes and %8 == 0 */
 	if ((instrlen % 8) || (instrlen < 16)) { 
@@ -226,8 +314,14 @@
 			instrlen);
 		return 0;
 	}
-	/* get information from header */
-	qq_decipher((guint32 *) instr, (guint32 *) key, (guint32 *) decrypted);
+	g_memmove(ptr_instr, instr, 8);
+	g_memmove(ptr_key, key, 16);
+	g_memmove(ptr_decr, decrypted, 8);
+
+	qq_decipher(ptr_instr, ptr_key, ptr_decr);
+
+	g_memmove(decrypted, ptr_decr, 8);
+
 	pos_in_block = decrypted[0] & 0x7;
 	count = instrlen - pos_in_block - 10;	/* this is the plaintext length */
 	/* return if outstr buffer is not large enough or error plaintext length */
@@ -294,22 +388,6 @@
 			}
 		}
 	}
-	return 1;
-}
-
-/* return 1 is succeed, otherwise return 0
-gint qq_crypt(gint flag,
-		const guint8 *const instr, gint instrlen, 
-		const guint8 *const key, 
-		guint8 *outstr, gint *outstrlen_ptr)
-{
-	if (flag == DECRYPT)
-		return qq_decrypt(instr, instrlen, key, outstr, outstrlen_ptr);
-	else if (flag == ENCRYPT)
-		qq_encrypt(instr, instrlen, key, outstr, outstrlen_ptr);
-	else 
-		return 0;
 
 	return 1;
 }
-*/
--- a/libpurple/protocols/qq/crypt.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/crypt.h	Thu Aug 07 16:00:16 2008 +0000
@@ -1,4 +1,4 @@
-/**
+ /**
  * @file crypt.h
  *
  * purple
@@ -19,7 +19,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 #ifndef _QQ_CRYPT_H_
@@ -27,6 +27,9 @@
 
 #include <glib.h>
 
+#define DECRYPT 0x00
+#define ENCRYPT 0x01
+
 void qq_encrypt(const guint8 *const instr, gint instrlen, 
 		const guint8 *const key, 
 		guint8 *outstr, gint *outstrlen_ptr);
@@ -34,14 +37,4 @@
 gint qq_decrypt(const guint8 *const instr, gint instrlen, 
 		const guint8 *const key,
 		guint8 *outstr, gint *outstrlen_ptr);
-		
-/*
-#define DECRYPT 0x00
-#define ENCRYPT 0x01
-
-gint qq_crypt(gint flag,
-	     const guint8 *const instr, gint instrlen, 
-	     const guint8 *const key, 
-	     guint8 *outstr, gint *outstrlen_ptr);
-*/
 #endif
--- a/libpurple/protocols/qq/file_trans.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/file_trans.c	Thu Aug 07 16:00:16 2008 +0000
@@ -76,26 +76,10 @@
 	return (~uid) ^ key;
 }
 
-static void _fill_filename_md5(const gchar *filename, guint8 *md5)
-{
-	PurpleCipher *cipher;
-	PurpleCipherContext *context;
-
-	g_return_if_fail(filename != NULL && md5 != NULL);
-
-	cipher = purple_ciphers_find_cipher("md5");
-	context = purple_cipher_context_new(cipher, NULL);
-	purple_cipher_context_append(context, (guint8 *) filename, strlen(filename));
-	purple_cipher_context_digest(context, 16, md5, NULL);
-	purple_cipher_context_destroy(context);
-}
-
 static void _fill_file_md5(const gchar *filename, gint filelen, guint8 *md5)
 {
 	FILE *fp;
 	guint8 *buffer;
-	PurpleCipher *cipher;
-	PurpleCipherContext *context;
 	size_t wc;
 
 	const gint QQ_MAX_FILE_MD5_LENGTH = 10002432;
@@ -118,11 +102,7 @@
 		return;
 	}
 
-	cipher = purple_ciphers_find_cipher("md5");
-	context = purple_cipher_context_new(cipher, NULL);
-	purple_cipher_context_append(context, buffer, filelen);
-	purple_cipher_context_digest(context, 16, md5, NULL);
-	purple_cipher_context_destroy(context);
+	qq_get_md5(md5, QQ_KEY_LENGTH, buffer, filelen);
 }
 
 static gint _qq_get_file_header(qq_file_header *fh, guint8 *buf)
@@ -265,7 +245,7 @@
 	ft_info *info;
 
 	qd = (qq_data *) gc->proto_data;
-	g_return_val_if_fail(qd->session_key != NULL, -1);
+
 	info = (ft_info *) qd->xfer->data;
 
 	raw_data = g_newa(guint8, MAX_PACKET_SIZE);
@@ -395,7 +375,7 @@
 	guint8 *raw_data, filename_md5[QQ_KEY_LENGTH], file_md5[QQ_KEY_LENGTH];
 	gint bytes;
 	guint32 fragment_size = 1000;
-	gchar *filename;
+	const char *filename;
 	gint filename_len, filesize;
 	qq_data *qd;
 	ft_info *info;
@@ -403,7 +383,7 @@
 	qd = (qq_data *) gc->proto_data;
 	info = (ft_info *) qd->xfer->data;
 
-	filename = (gchar *) purple_xfer_get_filename(qd->xfer);
+	filename = purple_xfer_get_filename(qd->xfer);
 	filesize = purple_xfer_get_size(qd->xfer);
 
 	raw_data = g_newa(guint8, MAX_PACKET_SIZE);
@@ -423,11 +403,11 @@
 			{
 				case QQ_FILE_BASIC_INFO:
 					filename_len = strlen(filename);
-					_fill_filename_md5(filename, filename_md5);
+					qq_get_md5(filename_md5, sizeof(filename_md5), (guint8 *)filename, filename_len);
 					_fill_file_md5(purple_xfer_get_local_filename(qd->xfer),
 							purple_xfer_get_size(qd->xfer),
 							file_md5);
-
+					
 					info->fragment_num = (filesize - 1) / QQ_FILE_FRAGMENT_MAXLEN + 1;
 					info->fragment_len = QQ_FILE_FRAGMENT_MAXLEN;
 
--- a/libpurple/protocols/qq/group_conv.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/group_conv.c	Thu Aug 07 16:00:16 2008 +0000
@@ -27,8 +27,8 @@
 
 #include "conversation.h"
 
-#include "buddy_status.h"
 #include "group_conv.h"
+#include "buddy_list.h"
 #include "utils.h"
 
 /* show group conversation window */
--- a/libpurple/protocols/qq/group_find.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/group_find.c	Thu Aug 07 16:00:16 2008 +0000
@@ -138,6 +138,9 @@
 	group = NULL;
 	while (list != NULL) {
 		group = (qq_group *) list->data;
+		if (group->group_name_utf8 == NULL) {
+			continue;
+		}
 		if (!g_ascii_strcasecmp(purple_conversation_get_name(conv), group->group_name_utf8))
 			break;
 		list = list->next;
--- a/libpurple/protocols/qq/group_free.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/group_free.c	Thu Aug 07 16:00:16 2008 +0000
@@ -26,7 +26,7 @@
 
 #include "debug.h"
 
-#include "buddy_status.h"
+#include "buddy_list.h"
 #include "group_free.h"
 #include "group_network.h"
 
--- a/libpurple/protocols/qq/group_im.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/group_im.c	Thu Aug 07 16:00:16 2008 +0000
@@ -65,7 +65,7 @@
 	g_return_if_fail(group != NULL && msg != NULL);
 
 	msg_filtered = purple_markup_strip_html(msg);
-	purple_debug_info("QQ_MESG", "filterd qq qun mesg: %s\n", msg_filtered);
+	purple_debug_info("QQ_MESG", "Send qun mesg filterd: %s\n", msg_filtered);
 	msg_len = strlen(msg_filtered);
 
 	data_len = 7 + msg_len + QQ_SEND_IM_AFTER_MSG_LEN;
@@ -311,9 +311,7 @@
 
 	qd = (qq_data *) gc->proto_data;
 
-	qq_hex_dump(PURPLE_DEBUG_INFO, "QQ",
-		data, data_len,
-		"group im hex dump");
+	/* qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", data, data_len, "group im hex dump"); */
 
 	im_group = g_newa(qq_recv_group_im, 1);
 
@@ -379,6 +377,9 @@
 
 	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->group_name_utf8, purple_connection_get_account(gc));
 	if (conv == NULL && purple_prefs_get_bool("/plugins/prpl/qq/prompt_group_msg_on_recv")) {
+		/* New conv should open, get group info*/
+		qq_send_cmd_group_get_group_info(gc, group);
+		
 		serv_got_joined_chat(gc, qd->channel++, group->group_name_utf8);
 		conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->group_name_utf8, purple_connection_get_account(gc));
 	}
--- a/libpurple/protocols/qq/group_info.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/group_info.c	Thu Aug 07 16:00:16 2008 +0000
@@ -27,12 +27,11 @@
 #include "conversation.h"
 #include "debug.h"
 
-#include "buddy_status.h"
 #include "char_conv.h"
 #include "group_find.h"
 #include "group_internal.h"
 #include "group_info.h"
-#include "buddy_status.h"
+#include "buddy_list.h"
 #include "group_network.h"
 
 /* we check who needs to update member info every minutes
@@ -77,6 +76,27 @@
 }
 
 /* send packet to get online group member, called by keep_alive */
+void qq_send_cmd_group_all_get_online_members(PurpleConnection *gc)
+{
+	qq_data *qd;
+	qq_group *group;
+	GList *list;
+
+	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
+	qd = (qq_data *) gc->proto_data;
+
+	list = qd->groups;
+	while (list != NULL) {
+		group = (qq_group *) list->data;
+		if (group->my_status == QQ_GROUP_MEMBER_STATUS_IS_MEMBER ||
+		    group->my_status == QQ_GROUP_MEMBER_STATUS_IS_ADMIN)
+			/* no need to get info time and time again, online members enough */
+			qq_send_cmd_group_get_online_members(gc, group);
+
+		list = list->next;
+	}
+}
+
 void qq_send_cmd_group_get_online_members(PurpleConnection *gc, qq_group *group)
 {
 	guint8 raw_data[16] = {0};
@@ -87,7 +107,7 @@
 	/* only get online members when conversation window is on */
 	if (NULL == purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,group->group_name_utf8, purple_connection_get_account(gc))) {
 		purple_debug(PURPLE_DEBUG_WARNING, "QQ",
-				"Conversation for \"%s\" is not open, ignore to get online members\n", group->group_name_utf8);
+				"Conversation \"%s\" is not open, ignore to get online members\n", group->group_name_utf8);
 		return;
 	}
 
@@ -113,7 +133,7 @@
 	}
 
 	if (num <= 0) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "No group member needs to to update info now.\n");
+		purple_debug(PURPLE_DEBUG_INFO, "QQ", "No group member info needs to be updated now.\n");
 		return;
 	}
 
@@ -209,9 +229,11 @@
 		bytes += qq_get8(&organization, data + bytes);
 		bytes += qq_get8(&role, data + bytes);
 
+		/*
 		if(organization != 0 || role != 0) {
-			purple_debug(PURPLE_DEBUG_INFO, "QQ", "group member %d: organization=%d, role=%d\n", member_uid, organization, role);
+			purple_debug(PURPLE_DEBUG_INFO, "QQ_GRP", "%d, organization=%d, role=%d\n", member_uid, organization, role);
 		}
+		*/
 		member = qq_group_find_or_add_member(gc, group, member_uid);
 		if (member != NULL)
 			member->role = role;
@@ -231,7 +253,7 @@
 			group->group_name_utf8, purple_connection_get_account(gc));
 	if(NULL == purple_conv) {
 		purple_debug(PURPLE_DEBUG_WARNING, "QQ",
-				"Conversation for \"%s\" is not open, do not set topic\n", group->group_name_utf8);
+				"Conversation \"%s\" is not open, do not set topic\n", group->group_name_utf8);
 		return;
 	}
 
@@ -322,7 +344,7 @@
 		bytes += qq_get8(&(member->gender), data + bytes);
 		bytes += convert_as_pascal_string(data + bytes, &nick, QQ_CHARSET_DEFAULT);
 		bytes += qq_get16(&unknown, data + bytes);
-		bytes += qq_get8(&(member->flag1), data + bytes);
+		bytes += qq_get8(&(member->ext_flag), data + bytes);
 		bytes += qq_get8(&(member->comm_flag), data + bytes);
 
 		/* filter \r\n in nick */
@@ -333,8 +355,8 @@
 		/*
 		if (QQ_DEBUG) {
 			purple_debug(PURPLE_DEBUG_INFO, "QQ",
-					"member [%09d]: flag1=0x%02x, comm_flag=0x%02x, nick=%s\n",
-					member_uid, member->flag1, member->comm_flag, member->nickname);
+					"member [%09d]: ext_flag=0x%02x, comm_flag=0x%02x, nick=%s\n",
+					member_uid, member->ext_flag, member->comm_flag, member->nickname);
 		}
 		*/
 
--- a/libpurple/protocols/qq/group_info.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/group_info.h	Thu Aug 07 16:00:16 2008 +0000
@@ -31,7 +31,10 @@
 
 void qq_send_cmd_group_get_group_info(PurpleConnection *gc, qq_group *group);
 void qq_send_cmd_group_get_online_members(PurpleConnection *gc, qq_group *group);
+void qq_send_cmd_group_all_get_online_members(PurpleConnection *gc);
+
 void qq_send_cmd_group_get_members_info(PurpleConnection *gc, qq_group *group);
+
 void qq_process_group_cmd_get_group_info(guint8 *data, gint len, PurpleConnection *gc);
 void qq_process_group_cmd_get_online_members(guint8 *data, gint len, PurpleConnection *gc);
 void qq_process_group_cmd_get_members_info(guint8 *data, gint len, PurpleConnection *gc);
--- a/libpurple/protocols/qq/group_network.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/group_network.c	Thu Aug 07 16:00:16 2008 +0000
@@ -75,6 +75,30 @@
 		return "QQ_GROUP_CMD_GET_ONLINE_MEMBER";
 	case QQ_GROUP_CMD_GET_MEMBER_INFO:
 		return "QQ_GROUP_CMD_GET_MEMBER_INFO";
+	case QQ_GROUP_CMD_MODIFY_CARD:
+		return "QQ_GROUP_CMD_MODIFY_CARD";
+	case QQ_GROUP_CMD_REQUEST_ALL_REALNAMES:
+		return "QQ_GROUP_CMD_REQUEST_ALL_REALNAMES";
+	case QQ_GROUP_CMD_REQUEST_CARD:
+		return "QQ_GROUP_CMD_REQUEST_CARD";
+	case QQ_GROUP_CMD_SEND_IM_EX:
+		return "QQ_GROUP_CMD_SEND_IM_EX";
+	case QQ_GROUP_CMD_ADMIN:
+		return "QQ_GROUP_CMD_ADMIN";
+	case QQ_GROUP_CMD_TRANSFER:
+		return "QQ_GROUP_CMD_TRANSFER";
+	case QQ_GROUP_CMD_CREATE_TEMP_QUN:
+		return "QQ_GROUP_CMD_CREATE_TEMP_QUN";
+	case QQ_GROUP_CMD_MODIFY_TEMP_QUN_MEMBER:
+		return "QQ_GROUP_CMD_MODIFY_TEMP_QUN_MEMBER";
+	case QQ_GROUP_CMD_EXIT_TEMP_QUN:
+		return "QQ_GROUP_CMD_EXIT_TEMP_QUN";
+	case QQ_GROUP_CMD_GET_TEMP_QUN_INFO:
+		return "QQ_GROUP_CMD_GET_TEMP_QUN_INFO";
+	case QQ_GROUP_CMD_SEND_TEMP_QUN_IM:
+		return "QQ_GROUP_CMD_SEND_TEMP_QUN_IM";
+	case QQ_GROUP_CMD_GET_TEMP_QUN_MEMBERS:
+		return "QQ_GROUP_CMD_GET_TEMP_QUN_MEMBERS";
 	default:
 		return "Unknown QQ Group Command";
 	}
--- a/libpurple/protocols/qq/group_network.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/group_network.h	Thu Aug 07 16:00:16 2008 +0000
@@ -42,7 +42,20 @@
 	QQ_GROUP_CMD_EXIT_GROUP = 0x09,
 	QQ_GROUP_CMD_SEND_MSG = 0x0a,
 	QQ_GROUP_CMD_GET_ONLINE_MEMBER = 0x0b,
-	QQ_GROUP_CMD_GET_MEMBER_INFO = 0x0c
+	QQ_GROUP_CMD_GET_MEMBER_INFO = 0x0c,
+
+	QQ_GROUP_CMD_MODIFY_CARD = 0x0E,
+	QQ_GROUP_CMD_REQUEST_ALL_REALNAMES = 0x0F,
+	QQ_GROUP_CMD_REQUEST_CARD = 0x10,
+	QQ_GROUP_CMD_SEND_IM_EX = 0x1A,
+	QQ_GROUP_CMD_ADMIN = 0x1B,
+	QQ_GROUP_CMD_TRANSFER = 0x1C,
+	QQ_GROUP_CMD_CREATE_TEMP_QUN = 0x30,
+	QQ_GROUP_CMD_MODIFY_TEMP_QUN_MEMBER = 0x31,
+	QQ_GROUP_CMD_EXIT_TEMP_QUN = 0x32,
+	QQ_GROUP_CMD_GET_TEMP_QUN_INFO = 0x33,
+	QQ_GROUP_CMD_SEND_TEMP_QUN_IM = 0x35,
+	QQ_GROUP_CMD_GET_TEMP_QUN_MEMBERS = 0x37,
 } qq_group_cmd;
 
 typedef struct _group_packet {
--- a/libpurple/protocols/qq/header_info.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/header_info.c	Thu Aug 07 16:00:16 2008 +0000
@@ -34,11 +34,31 @@
 #define QQ_CLIENT_0B2F 0x0b2f	/* GB QQ2003iii build 0117 */
 #define QQ_CLIENT_0B35 0x0b35	/* GB QQ2003iii build 0304 (offical release) */
 #define QQ_CLIENT_0B37 0x0b37	/* GB QQ2003iii build 0304 (April 05 updates) */
-#define QQ_CLIENT_0E1B 0x0e1b	/* QQ2005? QQ2006? */
+#define QQ_CLIENT_0E1B 0x0e1b	/* QQ2005 ? */
 #define QQ_CLIENT_0E35 0x0e35	/* EN QQ2005 V05.0.200.020 */
 #define QQ_CLIENT_0F15 0x0f15	/* QQ2006 Spring Festival build */
 #define QQ_CLIENT_0F5F 0x0f5f	/* QQ2006 final build */
 
+#define QQ_CLIENT_0C0B 0x0C0B	/* QQ2004 */
+#define QQ_CLIENT_0C0D 0x0C0D	/* QQ2004 preview*/
+#define QQ_CLIENT_0C21 0x0C21	/* QQ2004 */
+#define QQ_CLIENT_0C49 0x0C49	/* QQ2004II */
+#define QQ_CLIENT_0D05 0x0D05	/* QQ2005 beta1 */
+#define QQ_CLIENT_0D51 0x0D51	/* QQ2005 beta2 */
+#define QQ_CLIENT_0D61 0x0D61	/* QQ2005 */
+#define QQ_CLIENT_05A5 0x05A5	/* ? */
+#define QQ_CLIENT_05F1 0x0F15	/* QQ2006 Spring Festival */
+#define QQ_CLIENT_0F4B 0x0F4B	/* QQ2006 Beta 3  */
+
+#define QQ_CLIENT_1105 0x1105	/* QQ2007 beta4*/
+#define QQ_CLIENT_111D 0x111D	/* QQ2007 */
+#define QQ_CLIENT_115B 0x115B	/* QQ2008 */
+#define QQ_CLIENT_1203 0x1203	/* QQ2008 */
+#define QQ_CLIENT_1205 0x1205	/* QQ2008 */
+#define QQ_CLIENT_120B 0x120B	/* QQ2008 July 8.0.978.400 */
+#define QQ_CLIENT_1412 0x1412	/* QQMac 1.0 preview1 build 670 */
+#define QQ_CLIENT_1441 0x1441	/* QQ2009 preview2 */
+
 #define QQ_SERVER_0100 0x0100	/* server */
 
 /* given command alias, return the command name accordingly */
@@ -55,10 +75,10 @@
 		return "QQ_CMD_SEARCH_USER";
 	case QQ_CMD_GET_USER_INFO:
 		return "QQ_CMD_GET_USER_INFO";
-	case QQ_CMD_ADD_FRIEND_WO_AUTH:
-		return "QQ_CMD_ADD_FRIEND_WO_AUTH";
-	case QQ_CMD_DEL_FRIEND:
-		return "QQ_CMD_DEL_FRIEND";
+	case QQ_CMD_ADD_BUDDY_WO_AUTH:
+		return "QQ_CMD_ADD_BUDDY_WO_AUTH";
+	case QQ_CMD_DEL_BUDDY:
+		return "QQ_CMD_DEL_BUDDY";
 	case QQ_CMD_BUDDY_AUTH:
 		return "QQ_CMD_BUDDY_AUTH";
 	case QQ_CMD_CHANGE_ONLINE_STATUS:
@@ -73,29 +93,29 @@
 		return "QQ_CMD_REMOVE_SELF";
 	case QQ_CMD_LOGIN:
 		return "QQ_CMD_LOGIN";
-	case QQ_CMD_GET_FRIENDS_LIST:
-		return "QQ_CMD_GET_FRIENDS_LIST";
-	case QQ_CMD_GET_FRIENDS_ONLINE:
-		return "QQ_CMD_GET_FRIENDS_ONLINE";
+	case QQ_CMD_GET_BUDDIES_LIST:
+		return "QQ_CMD_GET_BUDDIES_LIST";
+	case QQ_CMD_GET_BUDDIES_ONLINE:
+		return "QQ_CMD_GET_BUDDIES_ONLINE";
 	case QQ_CMD_GROUP_CMD:
 		return "QQ_CMD_GROUP_CMD";
 	case QQ_CMD_GET_ALL_LIST_WITH_GROUP:
 		return "QQ_CMD_GET_ALL_LIST_WITH_GROUP";
 	case QQ_CMD_GET_LEVEL:
 		return "QQ_CMD_GET_LEVEL";
-	case QQ_CMD_REQUEST_LOGIN_TOKEN:
-		return "QQ_CMD_REQUEST_LOGIN_TOKEN";
+	case QQ_CMD_TOKEN:
+		return "QQ_CMD_TOKEN";
 	case QQ_CMD_RECV_MSG_SYS:
 		return "QQ_CMD_RECV_MSG_SYS";
-	case QQ_CMD_RECV_MSG_FRIEND_CHANGE_STATUS:
-		return "QQ_CMD_RECV_MSG_FRIEND_CHANGE_STATUS";
+	case QQ_CMD_RECV_MSG_BUDDY_CHANGE_STATUS:
+		return "QQ_CMD_RECV_MSG_BUDDY_CHANGE_STATUS";
 	default:
-		return "UNKNOWN_TYPE";
+		return "Unknown";
 	}
 }
 
 /* given source tag, return its description accordingly */
-const gchar *qq_get_source_str(gint source)
+const gchar *qq_get_ver_desc(gint source)
 {
 	switch (source) {
 	case QQ_CLIENT_062E:
@@ -114,17 +134,46 @@
 		return "GB QQ2003iii build 0304";
 	case QQ_CLIENT_0B37:
 		return "GB QQ2003iii build 0304 (April 5 update)";
+	case QQ_CLIENT_0C0B:
+		return "QQ2004";
+	case QQ_CLIENT_0C0D:
+		return "QQ2004 preview";
+	case QQ_CLIENT_0C21:
+		return "QQ2004";
+	case QQ_CLIENT_0C49:
+		return "QQ2004II";
+	case QQ_CLIENT_0D05:
+		return "QQ2005 beta1";
+	case QQ_CLIENT_0D51:
+		return "QQ2005 beta2";
+	case QQ_CLIENT_0D61:
+		return "QQ2005";
 	case QQ_CLIENT_0E1B:
 		return "QQ2005 or QQ2006";
 	case QQ_CLIENT_0E35:
 		return "En QQ2005 V05.0.200.020";
 	case QQ_CLIENT_0F15:
-		return "QQ2006 Spring Festival build";
+		return "QQ2006 Spring Festival";
+	case QQ_CLIENT_0F4B:
+		return "QQ2006 beta3";
 	case QQ_CLIENT_0F5F:
 		return "QQ2006 final build";
+	case QQ_CLIENT_1105:
+		return "QQ2007 beta4";
+	case QQ_CLIENT_111D:
+		return "QQ2007";
+	case QQ_CLIENT_115B:
+	case QQ_CLIENT_1203:
+	case QQ_CLIENT_1205:
+	case QQ_CLIENT_120B:
+		return "QQ2008";
+	case QQ_CLIENT_1412:
+		return "QQMac 1.0 preview1 build 670";
+	case QQ_CLIENT_1441:
+		return "QQ2009 preview2";
 	case QQ_SERVER_0100:
 		return "QQ Server 0100";
 	default:
-		return "QQ unknown version";
+		return "Unknown";
 	}
 }
--- a/libpurple/protocols/qq/header_info.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/header_info.h	Thu Aug 07 16:00:16 2008 +0000
@@ -42,8 +42,8 @@
 	QQ_CMD_UPDATE_INFO = 0x0004,			/* update information */
 	QQ_CMD_SEARCH_USER = 0x0005,			/* search for user */
 	QQ_CMD_GET_USER_INFO = 0x0006,			/* get user information */
-	QQ_CMD_ADD_FRIEND_WO_AUTH = 0x0009,		/* add friend without auth */
-	QQ_CMD_DEL_FRIEND = 0x000a,			/* delete a friend  */
+	QQ_CMD_ADD_BUDDY_WO_AUTH = 0x0009,		/* add buddy without auth */
+	QQ_CMD_DEL_BUDDY = 0x000a,			/* delete a buddy  */
 	QQ_CMD_BUDDY_AUTH = 0x000b,			/* buddy authentication */
 	QQ_CMD_CHANGE_ONLINE_STATUS = 0x000d,		/* change my online status */
 	QQ_CMD_ACK_SYS_MSG = 0x0012,			/* ack system message */
@@ -53,19 +53,19 @@
 	QQ_CMD_REQUEST_KEY = 0x001d,			/* request key for file transfer */
 	QQ_CMD_CELL_PHONE_1 = 0x0021,			/* cell phone 1 */
 	QQ_CMD_LOGIN = 0x0022,				/* login */
-	QQ_CMD_GET_FRIENDS_LIST = 0x0026,		/* retrieve my freinds list */
-	QQ_CMD_GET_FRIENDS_ONLINE = 0x0027,		/* get my online friends list */
+	QQ_CMD_GET_BUDDIES_LIST = 0x0026,		/* get buddies list */
+	QQ_CMD_GET_BUDDIES_ONLINE = 0x0027,		/* get online buddies list */
 	QQ_CMD_CELL_PHONE_2 = 0x0029,			/* cell phone 2 */
 	QQ_CMD_GROUP_CMD = 0x0030,			/* group command */
 	QQ_CMD_GET_ALL_LIST_WITH_GROUP = 0x0058,  
 	QQ_CMD_GET_LEVEL = 0x005C,			/* get level for one or more buddies */
-	QQ_CMD_REQUEST_LOGIN_TOKEN  = 0x0062, 		/* get login token */
+	QQ_CMD_TOKEN  = 0x0062, 		/* get login token */
 	QQ_CMD_RECV_MSG_SYS = 0x0080,			/* receive a system message */
-	QQ_CMD_RECV_MSG_FRIEND_CHANGE_STATUS = 0x0081,	/* friends change status */
+	QQ_CMD_RECV_MSG_BUDDY_CHANGE_STATUS = 0x0081,	/* buddy change status */
 };
 
 const gchar *qq_get_cmd_desc(gint type);
 
-const gchar *qq_get_source_str(gint source);
+const gchar *qq_get_ver_desc(gint source);
 
 #endif
--- a/libpurple/protocols/qq/im.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/im.c	Thu Aug 07 16:00:16 2008 +0000
@@ -79,7 +79,7 @@
 	guint16 sender_ver;
 	guint32 sender_uid;
 	guint32 receiver_uid;
-	guint8 *session_md5;
+	guint8 session_md5[QQ_KEY_LENGTH];
 	guint16 normal_im_type;
 };
 
@@ -109,7 +109,7 @@
 	guint32 sender_uid;
 	guint32 receiver_uid;
 	guint32 server_im_seq;
-	guint8 sender_ip[4];
+	struct in_addr sender_ip;
 	guint16 sender_port;
 	guint16 im_type;
 };
@@ -179,7 +179,7 @@
 	send_im_tail[5] = 0x00;
 	send_im_tail[6] = 0x86;
 	send_im_tail[7] = 0x22;	/* encoding, 0x8622=GB, 0x0000=EN, define BIG5 support here */
-	qq_show_packet("QQ_MESG", send_im_tail, tail_len);
+	/* qq_show_packet("QQ_MESG", send_im_tail, tail_len); */
 	return (guint8 *) send_im_tail;
 }
 
@@ -237,10 +237,7 @@
 	bytes += qq_get16(&(common->sender_ver), data + bytes);
 	bytes += qq_get32(&(common->sender_uid), data + bytes);
 	bytes += qq_get32(&(common->receiver_uid), data + bytes);
-
-	common->session_md5 = g_memdup(data + bytes, QQ_KEY_LENGTH);
-	bytes += QQ_KEY_LENGTH;
-
+	bytes += qq_getdata(common->session_md5, QQ_KEY_LENGTH, data + bytes);
 	bytes += qq_get16(&(common->normal_im_type), data + bytes);
 
 	if (bytes != 28) {	/* read common place fail */
@@ -261,6 +258,8 @@
 	qq_data *qd;
 	qq_recv_normal_im_text *im_text;
 	gint bytes = 0;
+	PurpleBuddy *b;
+	qq_buddy *qq_b;
 
 	g_return_if_fail(common != NULL);
 	qd = (qq_data *) gc->proto_data;
@@ -308,9 +307,16 @@
 	}			/* if im_text->msg_type */
 
 	name = uid_to_purple_name(common->sender_uid);
-	if (purple_find_buddy(gc->account, name) == NULL)
+	b = purple_find_buddy(gc->account, name);
+	if (b == NULL) {
 		qq_add_buddy_by_recv_packet(gc, common->sender_uid, FALSE, TRUE);
-
+		b = purple_find_buddy(gc->account, name);
+	}
+	qq_b = (b == NULL) ? NULL : (qq_buddy *) b->proto_data;
+	if (qq_b != NULL) {
+		qq_b->client_version = common->sender_ver; 
+	}
+	
 	purple_msg_type = (im_text->msg_type == QQ_IM_AUTO_REPLY) ? PURPLE_MESSAGE_AUTO_RESP : 0;
 
 	msg_with_purple_smiley = qq_smiley_to_purple(im_text->msg);
@@ -353,9 +359,9 @@
 	switch (common->normal_im_type) {
 		case QQ_NORMAL_IM_TEXT:
 			purple_debug (PURPLE_DEBUG_INFO, "QQ",
-					"Normal IM, text type:\n [%d] => [%d], src: %s\n",
+					"Normal IM, text type:\n [%d] => [%d], src: %s (%04X)\n",
 					common->sender_uid, common->receiver_uid,
-					qq_get_source_str (common->sender_ver));
+					qq_get_ver_desc (common->sender_ver), common->sender_ver);
 			if (bytes >= len - 1) {
 				purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Received normal IM text is empty\n");
 				return;
@@ -387,11 +393,8 @@
 					"Normal IM, unprocessed type [0x%04x], len %d\n",
 					common->normal_im_type, im_unprocessed->length);
 			qq_show_packet ("QQ unk-im", im_unprocessed->unknown, im_unprocessed->length);
-			g_free (common->session_md5);
 			return;
 	}
-
-	g_free (common->session_md5);
 }
 
 /* process im from system administrator */
@@ -603,7 +606,7 @@
 	bytes += qq_get32(&(im_header->receiver_uid), data + bytes);
 	bytes += qq_get32(&(im_header->server_im_seq), data + bytes);
 	/* if the message is delivered via server, it is server IP/port */
-	bytes += qq_getdata((guint8 *) & (im_header->sender_ip), 4, data + bytes);
+	bytes += qq_getIP(&(im_header->sender_ip), data + bytes);
 	bytes += qq_get16(&(im_header->sender_port), data + bytes);
 	bytes += qq_get16(&(im_header->im_type), data + bytes);
 	/* im_header prepared */
--- a/libpurple/protocols/qq/keep_alive.c	Thu Jul 31 06:23:55 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-/**
- * @file keep_alive.c
- *
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- *
- *
- * OICQ encryption algorithm
- * Convert from ASM code provided by PerlOICQ
- * 
- * Puzzlebird, Nov-Dec 2002
- */
-
-#include "internal.h"
-
-#include "debug.h"
-#include "server.h"
-
-#include "buddy_info.h"
-#include "buddy_list.h"
-#include "buddy_status.h"
-#include "crypt.h"
-#include "header_info.h"
-#include "keep_alive.h"
-#include "packet_parse.h"
-#include "qq_network.h"
-#include "utils.h"
-
-#define QQ_UPDATE_ONLINE_INTERVAL   300	/* in sec */
-
-/* send keep-alive packet to QQ server (it is a heart-beat) */
-void qq_send_packet_keep_alive(PurpleConnection *gc)
-{
-	qq_data *qd;
-	guint8 raw_data[16] = {0};
-	gint bytes= 0;
-
-	qd = (qq_data *) gc->proto_data;
-
-	/* In fact, we can send whatever we like to server
-	 * with this command, server return the same result including
-	 * the amount of online QQ users, my ip and port */
-	bytes += qq_put32(raw_data + bytes, qd->uid);
-
-	qq_send_cmd(qd, QQ_CMD_KEEP_ALIVE, raw_data, 4);
-}
-
-/* parse the return of keep-alive packet, it includes some system information */
-void qq_process_keep_alive_reply(guint8 *buf, gint buf_len, PurpleConnection *gc) 
-{
-	qq_data *qd;
-	gint len;
-	gchar **segments;
-	guint8 *data;
-
-	g_return_if_fail(buf != NULL && buf_len != 0);
-
-	qd = (qq_data *) gc->proto_data;
-	len = buf_len;
-	data = g_newa(guint8, len);
-
-	if (qq_decrypt(buf, buf_len, qd->session_key, data, &len)) {
-		/* the last one is 60, don't know what it is */
-		if (NULL == (segments = split_data(data, len, "\x1f", 6)))
-			return;
-		/* segments[0] and segment[1] are all 0x30 ("0") */
-		qd->all_online = strtol(segments[2], NULL, 10);
-		if(0 == qd->all_online)
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-					_("Keep alive error"));
-		g_free(qd->my_ip);
-		qd->my_ip = g_strdup(segments[3]);
-		qd->my_port = strtol(segments[4], NULL, 10);
-		g_strfreev(segments);
-	} else
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt keep alive reply\n");
-
-	/* we refresh buddies's online status periodically */
-	/* qd->last_get_online is updated when setting get_buddies_online packet */
-	if ((time(NULL) - qd->last_get_online) >= QQ_UPDATE_ONLINE_INTERVAL)
-		qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_ONLINE_POSITION_START);
-}
-
-/* refresh all buddies online/offline,
- * after receiving reply for get_buddies_online packet */
-void qq_refresh_all_buddy_status(PurpleConnection *gc)
-{
-	time_t now;
-	GList *list;
-	qq_data *qd;
-	qq_buddy *q_bud;
-
-	qd = (qq_data *) (gc->proto_data);
-	now = time(NULL);
-	list = qd->buddies;
-
-	while (list != NULL) {
-		q_bud = (qq_buddy *) list->data;
-		if (q_bud != NULL && now > q_bud->last_refresh + QQ_UPDATE_ONLINE_INTERVAL
-				&& q_bud->status != QQ_BUDDY_ONLINE_INVISIBLE) {
-			q_bud->status = QQ_BUDDY_ONLINE_OFFLINE;
-			qq_update_buddy_contact(gc, q_bud);
-		}
-		list = list->next;
-	}
-}
-
-/*TODO: maybe this should be qq_update_buddy_status() ?*/
-void qq_update_buddy_contact(PurpleConnection *gc, qq_buddy *q_bud)
-{
-	gchar *name;
-	PurpleBuddy *bud;
-	gchar *status_id;
-	
-	g_return_if_fail(q_bud != NULL);
-
-	name = uid_to_purple_name(q_bud->uid);
-	bud = purple_find_buddy(gc->account, name);
-	g_return_if_fail(bud != NULL);
-
-	if (bud != NULL) {
-		purple_blist_server_alias_buddy(bud, q_bud->nickname); /* server */
-		q_bud->last_refresh = time(NULL);
-
-		/* purple supports signon and idle time
-		 * but it is not much use for QQ, I do not use them */
-		/* serv_got_update(gc, name, online, 0, q_bud->signon, q_bud->idle, bud->uc); */
-		status_id = "available";
-		switch(q_bud->status) {
-		case QQ_BUDDY_OFFLINE:
-			status_id = "offline";
-			break;
-		case QQ_BUDDY_ONLINE_NORMAL:
-			status_id = "available";
-			break;
-		case QQ_BUDDY_ONLINE_OFFLINE:
-			status_id = "offline";
-			break;
-	        case QQ_BUDDY_ONLINE_AWAY:
-			status_id = "away";
-			break;
-	       	case QQ_BUDDY_ONLINE_INVISIBLE:
-			status_id = "invisible";
-			break;
-		default:
-			status_id = "invisible";
-			purple_debug(PURPLE_DEBUG_ERROR, "QQ", "unknown status: %x\n", q_bud->status);
-			break;
-		}
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "set buddy %d to %s\n", q_bud->uid, status_id);
-		purple_prpl_got_user_status(gc->account, name, status_id, NULL);
-
-		if (q_bud->comm_flag & QQ_COMM_FLAG_BIND_MOBILE && q_bud->status != QQ_BUDDY_OFFLINE)
-			purple_prpl_got_user_status(gc->account, name, "mobile", NULL);
-		else
-			purple_prpl_got_user_status_deactive(gc->account, name, "mobile");
-	} else {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "unknown buddy: %d\n", q_bud->uid);
-	}
-
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "qq_update_buddy_contact, client=%04x\n", q_bud->client_version);
-	g_free(name);
-}
--- a/libpurple/protocols/qq/keep_alive.h	Thu Jul 31 06:23:55 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/**
- * @file keep_alive.h
- *
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- *
- */
-
-#ifndef _QQ_KEEP_ALIVE_H_
-#define _QQ_KEEP_ALIVE_H_
-
-#include <glib.h>
-#include "connection.h"
-#include "qq.h"
-
-void qq_send_packet_keep_alive(PurpleConnection *gc);
-
-void qq_process_keep_alive_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
-void qq_refresh_all_buddy_status(PurpleConnection *gc);
-
-void qq_update_buddy_contact(PurpleConnection *gc, qq_buddy *q_bud);
-
-#endif
--- a/libpurple/protocols/qq/login_logout.c	Thu Jul 31 06:23:55 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,520 +0,0 @@
-/**
- * @file login_logout.c
- *
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#include "debug.h"
-#include "internal.h"
-#include "server.h"
-#include "cipher.h"
-
-#include "buddy_info.h"
-#include "buddy_list.h"
-#include "buddy_status.h"
-#include "char_conv.h"
-#include "crypt.h"
-#include "group.h"
-#include "header_info.h"
-#include "login_logout.h"
-#include "packet_parse.h"
-#include "qq.h"
-#include "qq_network.h"
-#include "utils.h"
-
-#define QQ_LOGIN_DATA_LENGTH		    416
-#define QQ_LOGIN_REPLY_OK_PACKET_LEN        139
-#define QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN  11
-
-#define QQ_REQUEST_LOGIN_TOKEN_REPLY_OK 	0x00
-
-#define QQ_LOGIN_REPLY_OK                   0x00
-#define QQ_LOGIN_REPLY_REDIRECT             0x01
-#define QQ_LOGIN_REPLY_PWD_ERROR            0x05
-#define QQ_LOGIN_REPLY_MISC_ERROR           0xff	/* defined by myself */
-
-/* for QQ 2003iii 0117, fixed value */
-/* static const guint8 login_23_51[29] = {
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0xbf, 0x14, 0x11, 0x20,
-	0x03, 0x9d, 0xb2, 0xe6, 0xb3, 0x11, 0xb7, 0x13,
-	0x95, 0x67, 0xda, 0x2c, 0x01 
-}; */
-
-/* for QQ 2003iii 0304, fixed value */
-/*
-static const guint8 login_23_51[29] = {
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x9a, 0x93, 0xfe, 0x85,
-	0xd3, 0xd9, 0x2a, 0x41, 0xc8, 0x0d, 0xff, 0xb6,
-	0x40, 0xb8, 0xac, 0x32, 0x01
-};
-*/
-
-/* for QQ 2005? copy from lumaqq */
-/* FIXME: change to guint8 */
-static const guint8 login_23_51[29] = {
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x86, 0xcc, 0x4c, 0x35,
-	0x2c, 0xd3, 0x73, 0x6c, 0x14, 0xf6, 0xf6, 0xaf,
-	0xc3, 0xfa, 0x33, 0xa4, 0x01
-};
-
-static const guint8 login_53_68[16] = {
- 	0x8D, 0x8B, 0xFA, 0xEC, 0xD5, 0x52, 0x17, 0x4A,
- 	0x86, 0xF9, 0xA7, 0x75, 0xE6, 0x32, 0xD1, 0x6D
-};
-
-static const guint8 login_100_bytes[100] = {
-	0x40, 0x0B, 0x04, 0x02, 0x00, 0x01, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xE9, 0x03, 0x01,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF3, 0x03,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xED,
-	0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-	0xEC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x01, 0xEE, 0x03, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x01, 0xEF, 0x03, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x01, 0xEB, 0x03, 0x00,
-	0x00, 0x00, 0x00, 0x00
-};
-
-
-/* fixed value, not affected by version, or mac address */
-/*
-static const guint8 login_53_68[16] = {
-	0x82, 0x2a, 0x91, 0xfd, 0xa5, 0xca, 0x67, 0x4c,
-	0xac, 0x81, 0x1f, 0x6f, 0x52, 0x05, 0xa7, 0xbf
-};
-*/
-
-
-typedef struct _qq_login_reply_ok qq_login_reply_ok_packet;
-typedef struct _qq_login_reply_redirect qq_login_reply_redirect_packet;
-
-struct _qq_login_reply_ok {
-	guint8 result;
-	guint8 *session_key;
-	guint32 uid;
-	guint8 client_ip[4];	/* those detected by server */
-	guint16 client_port;
-	guint8 server_ip[4];
-	guint16 server_port;
-	time_t login_time;
-	guint8 unknown1[26];
-	guint8 unknown_server1_ip[4];
-	guint16 unknown_server1_port;
-	guint8 unknown_server2_ip[4];
-	guint16 unknown_server2_port;
-	guint16 unknown2;	/* 0x0001 */
-	guint16 unknown3;	/* 0x0000 */
-	guint8 unknown4[32];
-	guint8 unknown5[12];
-	guint8 last_client_ip[4];
-	time_t last_login_time;
-	guint8 unknown6[8];
-};
-
-struct _qq_login_reply_redirect {
-	guint8 result;
-	guint32 uid;
-	guint8 new_server_ip[4];
-	guint16 new_server_port;
-};
-
-/* generate a md5 key using uid and session_key */
-static guint8 *gen_session_md5(gint uid, guint8 *session_key)
-{
-	guint8 *src, md5_str[QQ_KEY_LENGTH];
-	PurpleCipher *cipher;
-	PurpleCipherContext *context;
-
-	src = g_newa(guint8, 20);
-	/* bug found by QuLogic */
-	memcpy(src, &uid, sizeof(uid));
-	memcpy(src + sizeof(uid), session_key, QQ_KEY_LENGTH);
-
-	cipher = purple_ciphers_find_cipher("md5");
-	context = purple_cipher_context_new(cipher, NULL);
-	purple_cipher_context_append(context, src, 20);
-	purple_cipher_context_digest(context, sizeof(md5_str), md5_str, NULL);
-	purple_cipher_context_destroy(context);
-
-	return g_memdup(md5_str, QQ_KEY_LENGTH);
-}
-
-/* process login reply which says OK */
-static gint _qq_process_login_ok(PurpleConnection *gc, guint8 *data, gint len)
-{
-	gint bytes;
-	qq_data *qd;
-	qq_login_reply_ok_packet lrop;
-
-	qd = (qq_data *) gc->proto_data;
-	/* FIXME, check QQ_LOGIN_REPLY_OK_PACKET_LEN here */
-	bytes = 0;
-
-	/* 000-000: reply code */
-	bytes += qq_get8(&lrop.result, data + bytes);
-	/* 001-016: session key */
-	lrop.session_key = g_memdup(data + bytes, QQ_KEY_LENGTH);
-	bytes += QQ_KEY_LENGTH;
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Get session_key done\n");
-	/* 017-020: login uid */
-	bytes += qq_get32(&lrop.uid, data + bytes);
-	/* 021-024: server detected user public IP */
-	bytes += qq_getdata((guint8 *) &lrop.client_ip, 4, data + bytes);
-	/* 025-026: server detected user port */
-	bytes += qq_get16(&lrop.client_port, data + bytes);
-	/* 027-030: server detected itself ip 127.0.0.1 ? */
-	bytes += qq_getdata((guint8 *) &lrop.server_ip, 4, data + bytes);
-	/* 031-032: server listening port */
-	bytes += qq_get16(&lrop.server_port, data + bytes);
-	/* 033-036: login time for current session */
-	bytes += qq_getime(&lrop.login_time, data + bytes);
-	/* 037-062: 26 bytes, unknown */
-	bytes += qq_getdata((guint8 *) &lrop.unknown1, 26, data + bytes);
-	/* 063-066: unknown server1 ip address */
-	bytes += qq_getdata((guint8 *) &lrop.unknown_server1_ip, 4, data + bytes);
-	/* 067-068: unknown server1 port */
-	bytes += qq_get16(&lrop.unknown_server1_port, data + bytes);
-	/* 069-072: unknown server2 ip address */
-	bytes += qq_getdata((guint8 *) &lrop.unknown_server2_ip, 4, data + bytes);
-	/* 073-074: unknown server2 port */
-	bytes += qq_get16(&lrop.unknown_server2_port, data + bytes);
-	/* 075-076: 2 bytes unknown */
-	bytes += qq_get16(&lrop.unknown2, data + bytes);
-	/* 077-078: 2 bytes unknown */
-	bytes += qq_get16(&lrop.unknown3, data + bytes);
-	/* 079-110: 32 bytes unknown */
-	bytes += qq_getdata((guint8 *) &lrop.unknown4, 32, data + bytes);
-	/* 111-122: 12 bytes unknown */
-	bytes += qq_getdata((guint8 *) &lrop.unknown5, 12, data + bytes);
-	/* 123-126: login IP of last session */
-	bytes += qq_getdata((guint8 *) &lrop.last_client_ip, 4, data + bytes);
-	/* 127-130: login time of last session */
-	bytes += qq_getime(&lrop.last_login_time, data + bytes);
-	/* 131-138: 8 bytes unknown */
-	bytes += qq_getdata((guint8 *) &lrop.unknown6, 8, data + bytes);
-
-	if (bytes != QQ_LOGIN_REPLY_OK_PACKET_LEN) {	/* fail parsing login info */
-		purple_debug(PURPLE_DEBUG_WARNING, "QQ",
-			   "Fail parsing login info, expect %d bytes, read %d bytes\n",
-			   QQ_LOGIN_REPLY_OK_PACKET_LEN, bytes);
-	}			/* but we still go on as login OK */
-
-	g_return_val_if_fail(qd->session_key == NULL, QQ_LOGIN_REPLY_MISC_ERROR);
-	qd->session_key = lrop.session_key;
-	
-	g_return_val_if_fail(qd->session_md5 == NULL, QQ_LOGIN_REPLY_MISC_ERROR);
-	qd->session_md5 = gen_session_md5(qd->uid, qd->session_key);
-	
-	g_return_val_if_fail(qd->my_ip == NULL, QQ_LOGIN_REPLY_MISC_ERROR);
-	qd->my_ip = gen_ip_str(lrop.client_ip);
-	
-	qd->my_port = lrop.client_port;
-	qd->login_time = lrop.login_time;
-	qd->last_login_time = lrop.last_login_time;
-	qd->last_login_ip = gen_ip_str(lrop.last_client_ip);
-
-	purple_connection_set_state(gc, PURPLE_CONNECTED);
-	qd->logged_in = TRUE;	/* must be defined after sev_finish_login */
-
-	/* now initiate QQ Qun, do it first as it may take longer to finish */
-	qq_group_init(gc);
-
-	/* Now goes on updating my icon/nickname, not showing info_window */
-	qd->modifying_face = FALSE;
-	qq_send_packet_get_info(gc, qd->uid, FALSE);
-	/* grab my level */
-	qq_send_packet_get_level(gc, qd->uid);
-
-	qq_send_packet_change_status(gc);
-
-	/* refresh buddies */
-	qq_send_packet_get_buddies_list(gc, QQ_FRIENDS_LIST_POSITION_START);
-	/* refresh groups */
-	qq_send_packet_get_all_list_with_group(gc, QQ_FRIENDS_LIST_POSITION_START);
-
-	return QQ_LOGIN_REPLY_OK;
-}
-
-/* process login reply packet which includes redirected new server address */
-static gint _qq_process_login_redirect(PurpleConnection *gc, guint8 *data, gint len)
-{
-	gint bytes, ret;
-	qq_data *qd;
-	qq_login_reply_redirect_packet lrrp;
-
-	qd = (qq_data *) gc->proto_data;
-	bytes = 0;
-	/* 000-000: reply code */
-	bytes += qq_get8(&lrrp.result, data + bytes);
-	/* 001-004: login uid */
-	bytes += qq_get32(&lrrp.uid, data + bytes);
-	/* 005-008: redirected new server IP */
-	bytes += qq_getdata(lrrp.new_server_ip, 4, data + bytes);
-	/* 009-010: redirected new server port */
-	bytes += qq_get16(&lrrp.new_server_port, data + bytes);
-
-	if (bytes != QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN) {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ",
-			   "Fail parsing login redirect packet, expect %d bytes, read %d bytes\n",
-			   QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN, bytes);
-		ret = QQ_LOGIN_REPLY_MISC_ERROR;
-	} else {
-		/* redirect to new server, do not disconnect or connect here
-		 * those connect should be called at packet_process */
-		if (qd->real_hostname) {
-			purple_debug(PURPLE_DEBUG_INFO, "QQ", "free real_hostname\n");
-			g_free(qd->real_hostname);
-			qd->real_hostname = NULL;
-		}
-		qd->real_hostname = gen_ip_str(lrrp.new_server_ip);
-		qd->real_port = lrrp.new_server_port;
-		qd->is_redirect = TRUE;
-
-		purple_debug(PURPLE_DEBUG_WARNING, "QQ",
-			   "Redirected to new server: %s:%d\n", qd->real_hostname, qd->real_port);
-
-		ret = QQ_LOGIN_REPLY_REDIRECT;
-	}
-
-	return ret;
-}
-
-/* process login reply which says wrong password */
-static gint _qq_process_login_wrong_pwd(PurpleConnection *gc, guint8 *data, gint len)
-{
-	gchar *server_reply, *server_reply_utf8;
-	server_reply = g_new0(gchar, len);
-	g_memmove(server_reply, data + 1, len - 1);
-	server_reply_utf8 = qq_to_utf8(server_reply, QQ_CHARSET_DEFAULT);
-	purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Wrong password, server msg in UTF8: %s\n", server_reply_utf8);
-	g_free(server_reply);
-	g_free(server_reply_utf8);
-
-	return QQ_LOGIN_REPLY_PWD_ERROR;
-}
-
-/* request before login */
-void qq_send_packet_request_login_token(PurpleConnection *gc)
-{
-	qq_data *qd;
-	guint8 buf[16] = {0};
-	gint bytes = 0;
-
-	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
-	qd = (qq_data *) gc->proto_data;
-
-	bytes += qq_put8(buf + bytes, 0);
-	
-	qq_send_data(qd, QQ_CMD_REQUEST_LOGIN_TOKEN, buf, bytes);
-}
-
-/* send login packet to QQ server */
-static void qq_send_packet_login(PurpleConnection *gc, guint8 token_length, guint8 *token)
-{
-	qq_data *qd;
-	guint8 *buf, *raw_data;
-	gint bytes;
-	guint8 *encrypted_data;
-	gint encrypted_len;
-
-	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
-	qd = (qq_data *) gc->proto_data;
-
-	raw_data = g_newa(guint8, QQ_LOGIN_DATA_LENGTH);
-	memset(raw_data, 0, QQ_LOGIN_DATA_LENGTH);
-
-	encrypted_data = g_newa(guint8, QQ_LOGIN_DATA_LENGTH + 16);	/* 16 bytes more */
-	if (qd->inikey) {
-		g_free(qd->inikey);
-	}
-	qd->inikey = (guint8 *) g_strnfill(QQ_KEY_LENGTH, 0x01);
-
-	bytes = 0;
-	/* now generate the encrypted data
-	 * 000-015 use pwkey as key to encrypt empty string */
-	qq_encrypt((guint8 *) "", 0, qd->pwkey, raw_data + bytes, &encrypted_len);
-	bytes += 16;
-	/* 016-016 */
-	bytes += qq_put8(raw_data + bytes, 0x00);
-	/* 017-020, used to be IP, now zero */
-	bytes += qq_put32(raw_data + bytes, 0x00000000);
-	/* 021-022, used to be port, now zero */
-	bytes += qq_put16(raw_data + bytes, 0x0000);
-	/* 023-051, fixed value, unknown */
-	bytes += qq_putdata(raw_data + bytes, login_23_51, 29);
-	/* 052-052, login mode */
-	bytes += qq_put8(raw_data + bytes, qd->login_mode);
-	/* 053-068, fixed value, maybe related to per machine */
-	bytes += qq_putdata(raw_data + bytes, login_53_68, 16);
-	/* 069, login token length */
-	bytes += qq_put8(raw_data + bytes, token_length);
-	/* 070-093, login token, normally 24 bytes */
-	bytes += qq_putdata(raw_data + bytes, token, token_length);
-	/* 100 bytes unknown */
-	bytes += qq_putdata(raw_data + bytes, login_100_bytes, 100);
-	/* all zero left */
-
-	qq_encrypt(raw_data, QQ_LOGIN_DATA_LENGTH, qd->inikey, encrypted_data, &encrypted_len);
-
-	buf = g_newa(guint8, MAX_PACKET_SIZE);
-	memset(buf, 0, MAX_PACKET_SIZE);
-	bytes = 0;
-	bytes += qq_putdata(buf + bytes, qd->inikey, QQ_KEY_LENGTH);
-	bytes += qq_putdata(buf + bytes, encrypted_data, encrypted_len);
-
-	qq_send_data(qd, QQ_CMD_LOGIN, buf, bytes);
-}
-
-void qq_process_request_login_token_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
-{
-	qq_data *qd;
-	gchar *error_msg;
-
-	g_return_if_fail(buf != NULL && buf_len != 0);
-
-	qd = (qq_data *) gc->proto_data;
-
-	if (buf[0] == QQ_REQUEST_LOGIN_TOKEN_REPLY_OK) {
-		if (buf[1] != buf_len-2) {
-			purple_debug(PURPLE_DEBUG_INFO, "QQ",
-					"Malformed login token reply packet. Packet specifies length of %d, actual length is %d\n", buf[1], buf_len-2);
-			purple_debug(PURPLE_DEBUG_INFO, "QQ",
-					"Attempting to proceed with the actual packet length.\n");
-		}
-		qq_hex_dump(PURPLE_DEBUG_INFO, "QQ",
-				buf+2, buf_len-2,
-				"<<< got a token -> [default] decrypt and dump");
-		qq_send_packet_login(gc, buf_len-2, buf+2);
-	} else {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Unknown request login token reply code : %d\n", buf[0]);
-		qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ",
-				buf, buf_len,
-				">>> [default] decrypt and dump");
-		error_msg = try_dump_as_gbk(buf, buf_len);
-		if (error_msg) {
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg);
-			g_free(error_msg);
-		} else {
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Error requesting login token"));
-		}
-	}
-}
-
-/* send logout packets to QQ server */
-void qq_send_packet_logout(PurpleConnection *gc)
-{
-	gint i;
-	qq_data *qd;
-
-	qd = (qq_data *) gc->proto_data;
-	for (i = 0; i < 4; i++)
-		qq_send_cmd_detail(qd, QQ_CMD_LOGOUT, 0xffff, FALSE, qd->pwkey, QQ_KEY_LENGTH);
-
-	qd->logged_in = FALSE;	/* update login status AFTER sending logout packets */
-}
-
-/* process the login reply packet */
-void qq_process_login_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
-{
-	gint len, ret, bytes;
-	guint8 *data;
-	qq_data *qd;
-	gchar* error_msg;
-
-	g_return_if_fail(buf != NULL && buf_len != 0);
-
-	qd = (qq_data *) gc->proto_data;
-	len = buf_len;
-	data = g_newa(guint8, len);
-
-	if (qq_decrypt(buf, buf_len, qd->pwkey, data, &len)) {
-		/* should be able to decrypt with pwkey */
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Decrypt login reply packet with pwkey, %d bytes\n", len);
-		if (data[0] == QQ_LOGIN_REPLY_OK) {
-			ret = _qq_process_login_ok(gc, data, len);
-		} else {
-			purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Unknown login reply code : %d\n", data[0]);
-			ret = QQ_LOGIN_REPLY_MISC_ERROR;
-		}
-	} else {		/* decrypt with pwkey error */
-		len = buf_len;	/* reset len, decrypt will fail if len is too short */
-		if (qq_decrypt(buf, buf_len, qd->inikey, data, &len)) {
-			/* decrypt ok with inipwd, it might be password error */
-			purple_debug(PURPLE_DEBUG_WARNING, "QQ", 
-					"Decrypt login reply packet with inikey, %d bytes\n", len);
-			bytes = 0;
-			switch (data[0]) {
-			case QQ_LOGIN_REPLY_REDIRECT:
-				ret = _qq_process_login_redirect(gc, data, len);
-				break;
-			case QQ_LOGIN_REPLY_PWD_ERROR:
-				ret = _qq_process_login_wrong_pwd(gc, data, len);
-				break;
-			default:
-				purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Unknown reply code: %d\n", data[0]);
-				qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ",
-						data, len,
-						">>> [default] decrypt and dump");
-				error_msg = try_dump_as_gbk(data, len);
-				if (error_msg)	{
-					purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg);
-					g_free(error_msg);
-				}
-				ret = QQ_LOGIN_REPLY_MISC_ERROR;
-			}
-		} else {	/* no idea how to decrypt */
-			purple_debug(PURPLE_DEBUG_ERROR, "QQ", "No idea how to decrypt login reply\n");
-			ret = QQ_LOGIN_REPLY_MISC_ERROR;
-		}
-	}
-
-	switch (ret) {
-	case QQ_LOGIN_REPLY_PWD_ERROR:
-		if (!purple_account_get_remember_password(gc->account))
-			purple_account_set_password(gc->account, NULL);
-		purple_connection_error_reason(gc,
-			PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password."));
-		break;
-	case QQ_LOGIN_REPLY_MISC_ERROR:
-			if (purple_debug_is_enabled())
-				purple_connection_error_reason(gc,
-					PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login. Check debug log."));
-			else
-				purple_connection_error_reason(gc,
-					PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login"));				
-		break;
-	case QQ_LOGIN_REPLY_OK:
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login repliess OK; everything is fine\n");
-		break;
-	case QQ_LOGIN_REPLY_REDIRECT:
-		/* the redirect has been done in _qq_process_login_reply */
-		break;
-	default:{;
-		}
-	}
-}
--- a/libpurple/protocols/qq/login_logout.h	Thu Jul 31 06:23:55 2008 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/**
- * file login_logout.h
- *
- * purple
- *
- * Purple is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#ifndef _QQ_LOGIN_LOGOUT_H_
-#define _QQ_LOGIN_LOGOUT_H_
-
-#include <glib.h>
-#include "connection.h"
-
-#define QQ_LOGIN_MODE_NORMAL        0x0a
-#define QQ_LOGIN_MODE_AWAY	    0x1e
-#define QQ_LOGIN_MODE_HIDDEN        0x28
-
-void qq_send_packet_request_login_token(PurpleConnection *gc);
-void qq_process_request_login_token_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
-void qq_process_login_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
-void qq_send_packet_logout(PurpleConnection *gc);
-
-#endif
--- a/libpurple/protocols/qq/packet_parse.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/packet_parse.c	Thu Aug 07 16:00:16 2008 +0000
@@ -27,7 +27,6 @@
 #include "packet_parse.h"
 #include "debug.h"
 
-
 /*------------------------------------------------PUT------------------------------------------------*/
 
 /* note:
@@ -68,7 +67,6 @@
 	return sizeof(w_dest);
 }
 
-
 /* read four bytes as "guint32" from buf, 
  * return the number of bytes read if succeeds, otherwise return -1 */
 gint qq_get32(guint32 *dw, guint8 *buf)
@@ -83,6 +81,11 @@
 	return sizeof(dw_dest);
 }
 
+gint qq_getIP(struct in_addr *ip, guint8 *buf)
+{
+	memcpy(ip, buf, sizeof(struct in_addr));
+	return sizeof(struct in_addr);
+}
 
 /* read datalen bytes from buf, 
  * return the number of bytes read if succeeds, otherwise return -1 */
@@ -158,6 +161,11 @@
     return sizeof(dw_porter);
 }
 
+gint qq_putIP(guint8* buf, struct in_addr *ip)
+{
+    memcpy(buf, ip, sizeof(struct in_addr));
+    return sizeof(struct in_addr);
+}
 
 /* pack datalen bytes into buf
  * return the number of bytes packed, otherwise return -1 */
--- a/libpurple/protocols/qq/packet_parse.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/packet_parse.h	Thu Aug 07 16:00:16 2008 +0000
@@ -37,15 +37,23 @@
  */
 #define MAX_PACKET_SIZE 65535
 
+#ifndef _WIN32
+#include <netinet/in.h>
+#else
+#include "win32dep.h"
+#endif
+
 gint qq_get8(guint8 *b, guint8 *buf);
 gint qq_get16(guint16 *w, guint8 *buf);
 gint qq_get32(guint32 *dw,  guint8 *buf);
+gint qq_getIP(struct in_addr *ip, guint8 *buf);
 gint qq_getime(time_t *t, guint8 *buf);
 gint qq_getdata(guint8 *data, gint datalen, guint8 *buf);
 
 gint qq_put8(guint8 *buf, guint8 b);
 gint qq_put16(guint8 *buf, guint16 w);
 gint qq_put32(guint8 *buf, guint32 dw);
+gint qq_putIP(guint8* buf, struct in_addr *ip);
 gint qq_putdata(guint8 *buf, const guint8 *data, const int datalen);
 
 /*
--- a/libpurple/protocols/qq/qq.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/qq.c	Thu Aug 07 16:00:16 2008 +0000
@@ -40,7 +40,7 @@
 
 #include "buddy_info.h"
 #include "buddy_opt.h"
-#include "buddy_status.h"
+#include "buddy_list.h"
 #include "char_conv.h"
 #include "crypt.h"
 #include "group.h"
@@ -51,8 +51,8 @@
 #include "group_opt.h"
 #include "header_info.h"
 #include "im.h"
-#include "keep_alive.h"
-#include "login_logout.h"
+#include "qq_process.h"
+#include "qq_base.h"
 #include "packet_parse.h"
 #include "qq.h"
 #include "qq_network.h"
@@ -237,78 +237,110 @@
 static void _qq_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full)
 {
 	qq_buddy *q_bud;
-	gchar *ip_str;
-	char *tmp;
-	const char *tmp2;
+	gchar *tmp;
+	GString *str;
 
 	g_return_if_fail(b != NULL);
 
 	q_bud = (qq_buddy *) b->proto_data;
-	g_return_if_fail(q_bud != NULL);
+	if (q_bud == NULL)
+		return;
+
+	/* if (PURPLE_BUDDY_IS_ONLINE(b) && q_bud != NULL) */
+	if (q_bud->ip.s_addr != 0) {
+		str = g_string_new(NULL);
+		g_string_printf(str, "%s:%d", inet_ntoa(q_bud->ip), q_bud->port);
+		if (q_bud->comm_flag & QQ_COMM_FLAG_TCP_MODE) {
+			g_string_append(str, " TCP");
+		} else {
+			g_string_append(str, " UDP");
+		}
+		g_string_free(str, TRUE);
+	}
 
-	if (PURPLE_BUDDY_IS_ONLINE(b) && q_bud != NULL)
-	{
-		ip_str = gen_ip_str(q_bud->ip);
-		if (strlen(ip_str) != 0) {
-			if (q_bud->comm_flag & QQ_COMM_FLAG_TCP_MODE)
-				tmp2 = _("TCP Address");
-			else
-				tmp2 = _("UDP Address");
-			tmp = g_strdup_printf("%s:%d", ip_str, q_bud->port);
-			purple_notify_user_info_add_pair(user_info, tmp2, tmp);
-			g_free(tmp);
-		}
-		g_free(ip_str);
+	tmp = g_strdup_printf("%d", q_bud->age);
+	purple_notify_user_info_add_pair(user_info, _("Age"), tmp);
+	g_free(tmp);
 
-		tmp = g_strdup_printf("%d", q_bud->age);
-		purple_notify_user_info_add_pair(user_info, _("Age"), tmp);
+	switch (q_bud->gender) {
+	case QQ_BUDDY_GENDER_GG:
+		purple_notify_user_info_add_pair(user_info, _("Gender"), _("Male"));
+		break;
+	case QQ_BUDDY_GENDER_MM:
+		purple_notify_user_info_add_pair(user_info, _("Gender"), _("Female"));
+		break;
+	case QQ_BUDDY_GENDER_UNKNOWN:
+		purple_notify_user_info_add_pair(user_info, _("Gender"), _("Unknown"));
+		break;
+	default:
+		tmp = g_strdup_printf("Error (%d)", q_bud->gender);
+		purple_notify_user_info_add_pair(user_info, _("Gender"), tmp);
 		g_free(tmp);
+	}
 
-		switch (q_bud->gender) {
-		case QQ_BUDDY_GENDER_GG:
-			purple_notify_user_info_add_pair(user_info, _("Gender"), _("Male"));
-			break;
-		case QQ_BUDDY_GENDER_MM:
-			purple_notify_user_info_add_pair(user_info, _("Gender"), _("Female"));
-			break;
-		case QQ_BUDDY_GENDER_UNKNOWN:
-			purple_notify_user_info_add_pair(user_info, _("Gender"), _("Unknown"));
-			break;
-		default:
-			tmp = g_strdup_printf("Error (%d)", q_bud->gender);
-			purple_notify_user_info_add_pair(user_info, _("Gender"), tmp);
-			g_free(tmp);
-		}
+	if (q_bud->level) {
+		tmp = g_strdup_printf("%d", q_bud->level);
+		purple_notify_user_info_add_pair(user_info, _("Level"), tmp);
+		g_free(tmp);
+	}
 
-		if (q_bud->level) {
-			tmp = g_strdup_printf("%d", q_bud->level);
-			purple_notify_user_info_add_pair(user_info, _("Level"), tmp);
-			g_free(tmp);
-		}
-		/* For debugging */
-		/*
-		g_string_append_printf(tooltip, "\n<b>Flag:</b> %01x", q_bud->flag1);
-		g_string_append_printf(tooltip, "\n<b>CommFlag:</b> %01x", q_bud->comm_flag);
-		g_string_append_printf(tooltip, "\n<b>Client:</b> %04x", q_bud->client_version);
-		*/
+	str = g_string_new(NULL);
+	if (q_bud->comm_flag & QQ_COMM_FLAG_QQ_MEMBER) {
+		g_string_append( str, _("Member") );
+	}
+	if (q_bud->comm_flag & QQ_COMM_FLAG_QQ_VIP) {
+		g_string_append( str, _(" VIP") );
+	}
+	if (q_bud->comm_flag & QQ_COMM_FLAG_TCP_MODE) {
+		g_string_append( str, _(" TCP") );
+	}
+	if (q_bud->comm_flag & QQ_COMM_FLAG_MOBILE) {
+		g_string_append( str, _(" FromMobile") );
+	}
+	if (q_bud->comm_flag & QQ_COMM_FLAG_BIND_MOBILE) {
+		g_string_append( str, _(" BindMobile") );
+	}
+	if (q_bud->comm_flag & QQ_COMM_FLAG_VIDEO) {
+		g_string_append( str, _(" Video") );
 	}
+
+	if (q_bud->ext_flag & QQ_EXT_FLAG_SPACE) {
+		g_string_append( str, _(" Space") );
+	}
+	purple_notify_user_info_add_pair(user_info, _("Flag"), str->str);
+
+	g_string_free(str, TRUE);
+
+#ifdef DEBUG
+	tmp = g_strdup_printf( "%s (%04X)",
+										qq_get_ver_desc(q_bud->client_version),
+										q_bud->client_version );
+	purple_notify_user_info_add_pair(user_info, _("Ver"), tmp);
+	g_free(tmp);
+
+	tmp = g_strdup_printf( "Ext 0x%X, Comm 0x%X",
+												q_bud->ext_flag, q_bud->comm_flag );
+	purple_notify_user_info_add_pair(user_info, _("Flag"), tmp);
+	g_free(tmp);
+#endif
 }
 
 /* we can show tiny icons on the four corners of buddy icon, */
 static const char *_qq_list_emblem(PurpleBuddy *b)
 {
 	/* each char** are refering to a filename in pixmaps/purple/status/default/ */
-
-	qq_buddy *q_bud = b->proto_data;
+	qq_buddy *q_bud;
+	
+	if (!b || !(q_bud = b->proto_data)) {
+		return NULL;
+	}
 
-	if (q_bud) {
-		if (q_bud->comm_flag & QQ_COMM_FLAG_QQ_MEMBER)
-			return "qq_member";
-		/*
-		if (q_bud->comm_flag & QQ_COMM_FLAG_VIDEO)
-			return "video";
-		*/
-	}
+	if (q_bud->comm_flag & QQ_COMM_FLAG_MOBILE)
+		return "mobile";
+	if (q_bud->comm_flag & QQ_COMM_FLAG_VIDEO)
+		return "video";
+	if (q_bud->comm_flag & QQ_COMM_FLAG_QQ_MEMBER)
+		return "qq_member";
 
 	return NULL;
 }
@@ -393,6 +425,7 @@
 	group = qq_group_find_by_channel(gc, channel);
 	g_return_val_if_fail(group != NULL, -1);
 
+	purple_debug_info("QQ_MESG", "Send qun mesg in utf8: %s\n", message);
 	msg = utf8_to_qq(message, QQ_CHARSET_DEFAULT);
 	msg_with_qq_smiley = purple_smiley_to_qq(msg);
 	qq_send_packet_group_im(gc, group, msg_with_qq_smiley);
@@ -479,7 +512,7 @@
 	qd = (qq_data *) gc->proto_data;
 	info = g_string_new("<html><body>\n");
 
-	g_string_append_printf(info, _("<b>Current Online</b>: %d<br>\n"), qd->all_online);
+	g_string_append_printf(info, _("<b>Current Online</b>: %d<br>\n"), qd->total_online);
 	g_string_append_printf(info, _("<b>Last Refresh</b>: %s<br>\n"), ctime(&qd->last_get_online));
 
 	g_string_append(info, "<hr>\n");
@@ -487,7 +520,7 @@
 	g_string_append_printf(info, _("<b>Server</b>: %s: %d<br>\n"), qd->server_name, qd->real_port);
 	g_string_append_printf(info, _("<b>Connection Mode</b>: %s<br>\n"), qd->use_tcp ? "TCP" : "UDP");
 	g_string_append_printf(info, _("<b>Real hostname</b>: %s: %d<br>\n"), qd->real_hostname, qd->real_port);
-	g_string_append_printf(info, _("<b>My Public IP</b>: %s<br>\n"), qd->my_ip);
+	g_string_append_printf(info, _("<b>My Public IP</b>: %s<br>\n"), inet_ntoa(qd->my_ip));
 
 	g_string_append(info, "<hr>\n");
 	g_string_append(info, "<i>Information below may not be accurate</i><br>\n");
@@ -636,30 +669,6 @@
 	return m;
 }
 
-
-static void qq_keep_alive(PurpleConnection *gc)
-{
-	qq_group *group;
-	qq_data *qd;
-	GList *list;
-
-	if (NULL == (qd = (qq_data *) gc->proto_data))
-		return;
-
-	list = qd->groups;
-	while (list != NULL) {
-		group = (qq_group *) list->data;
-		if (group->my_status == QQ_GROUP_MEMBER_STATUS_IS_MEMBER ||
-		    group->my_status == QQ_GROUP_MEMBER_STATUS_IS_ADMIN)
-			/* no need to get info time and time again, online members enough */
-			qq_send_cmd_group_get_online_members(gc, group);
-
-		list = list->next;
-	}
-
-	qq_send_packet_keep_alive(gc);
-}
-
 /* convert chat nickname to qq-uid to get this buddy info */
 /* who is the nickname of buddy in QQ chat-room (Qun) */
 static void _qq_get_chat_buddy_info(PurpleConnection *gc, gint channel, const gchar *who)
@@ -680,8 +689,8 @@
 	return chat_name_to_purple_name(who);
 }
 
-PurplePlugin *my_protocol = NULL;
-static PurplePluginProtocolInfo prpl_info	= {
+static PurplePluginProtocolInfo prpl_info =
+{
 	OPT_PROTO_CHAT_TOPIC | OPT_PROTO_USE_POINTSIZE,
 	NULL,							/* user_splits	*/
 	NULL,							/* protocol_options */
@@ -718,8 +727,8 @@
 	NULL,							/* chat_invite	*/
 	NULL,							/* chat_leave */
 	NULL,							/* chat_whisper */
-	_qq_chat_send,						/* chat_send */
-	qq_keep_alive,						/* keepalive */
+	_qq_chat_send,			/* chat_send */
+	NULL,							/* keepalive */
 	NULL,							/* register_user */
 	_qq_get_chat_buddy_info,				/* get_cb_info	*/
 	NULL,							/* get_cb_away	*/
@@ -738,17 +747,17 @@
 	qq_roomlist_cancel,					/* roomlist_cancel */
 	NULL,							/* roomlist_expand_category */
 	NULL,							/* can_receive_file */
-	qq_send_file,						/* send_file */
+	NULL,							/* qq_send_file send_file */
 	NULL,							/* new xfer */
 	NULL,							/* offline_message */
 	NULL,							/* PurpleWhiteboardPrplOps */
 	NULL,							/* send_raw */
 	NULL,							/* roomlist_room_serialize */
+	NULL,							/* unregister_user */
+	NULL,							/* send_attention */
+	NULL,							/* get attention_types */
 
-	/* padding */
-	NULL,
-	NULL,
-	NULL,
+	sizeof(PurplePluginProtocolInfo), /* struct_size */
 	NULL
 };
 
@@ -802,7 +811,14 @@
 	option = purple_account_option_bool_new(_("Connect using TCP"), "use_tcp", TRUE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
-	my_protocol = plugin;
+	option = purple_account_option_int_new(_("resend interval(s)"), "resend_interval", 10);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
+
+	option = purple_account_option_int_new(_("Keep alive interval(s)"), "keep_alive_interval", 60);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
+
+	option = purple_account_option_int_new(_("Update interval(s)"), "update_interval", 300);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
 	purple_prefs_add_none("/plugins/prpl/qq");
 	purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE);
--- a/libpurple/protocols/qq/qq.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/qq.h	Thu Aug 07 16:00:16 2008 +0000
@@ -34,7 +34,6 @@
 #include "proxy.h"
 #include "roomlist.h"
 
-#define QQ_FACES	    100
 #define QQ_KEY_LENGTH       16
 #define QQ_DEBUG            1	/* whether we are doing DEBUG */
 
@@ -45,6 +44,13 @@
 
 typedef struct _qq_data qq_data;
 typedef struct _qq_buddy qq_buddy;
+typedef struct _qq_interval qq_interval;
+
+struct _qq_interval {
+	gint resend;
+	gint keep_alive;
+	gint update; 
+};
 
 struct _qq_buddy {
 	guint32 uid;
@@ -52,10 +58,10 @@
 	guint8 age;
 	guint8 gender;
 	gchar *nickname;
-	guint8 ip[4];
+	struct in_addr ip;
 	guint16 port;
 	guint8 status;
-	guint8 flag1;
+	guint8 ext_flag;
 	guint8 comm_flag;	/* details in qq_buddy_list.c */
 	guint16 client_version;
 	guint8 onlineTime;
@@ -88,12 +94,12 @@
 	gint fd;				/* socket file handler */
 	gint tx_handler; 	/* socket can_write handle, use in udp connecting and tcp send out */
 
-	GList *send_trans;	/* check ack packet and resend */
-	guint resend_timeout;
+	qq_interval itv_config;
+	qq_interval itv_count;
+	guint network_timeout;
+	
+	GList *transactions;	/* check ack packet and resend */
 
-	guint8 rcv_window[1 << 13];		/* windows for check duplicate packet */
-	GQueue *rcv_trans;		/* queue to store packet can not process before login */
-	
 	/* tcp related */
 	PurpleCircBuffer *tcp_txbuf;
 	guint8 *tcp_rxqueue;
@@ -103,10 +109,12 @@
 	PurpleDnsQueryData *udp_query_data;
 
 	guint32 uid;			/* QQ number */
-	guint8 *inikey;			/* initial key to encrypt login packet */
-	guint8 *pwkey;			/* password in md5 (or md5' md5) */
-	guint8 *session_key;		/* later use this as key in this session */
-	guint8 *session_md5;		/* concatenate my uid with session_key and md5 it */
+	guint8 *token;		/* get from server*/
+	int token_len;
+	guint8 inikey[QQ_KEY_LENGTH];			/* initial key to encrypt login packet */
+	guint8 password_twice_md5[QQ_KEY_LENGTH];			/* password in md5 (or md5' md5) */
+	guint8 session_key[QQ_KEY_LENGTH];		/* later use this as key in this session */
+	guint8 session_md5[QQ_KEY_LENGTH];		/* concatenate my uid with session_key and md5 it */
 
 	guint16 send_seq;		/* send sequence number */
 	guint8 login_mode;		/* online of invisible */
@@ -119,11 +127,11 @@
 	time_t last_login_time;
 	gchar *last_login_ip;
 	/* get from keep_alive packet */
-	gchar *my_ip;			/* my ip address detected by server */
+	struct in_addr my_ip;			/* my ip address detected by server */
 	guint16 my_port;		/* my port detected by server */
 	guint16 my_icon;		/* my icon index */
 	guint16 my_level;		/* my level */
-	guint32 all_online;		/* the number of online QQ users */
+	guint32 total_online;		/* the number of online QQ users */
 	time_t last_get_online;		/* last time send get_friends_online packet */
 
 	PurpleRoomlist *roomlist;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/qq/qq_base.c	Thu Aug 07 16:00:16 2008 +0000
@@ -0,0 +1,523 @@
+/**
+ * @file qq_base.c
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+#include "debug.h"
+#include "internal.h"
+#include "server.h"
+#include "cipher.h"
+
+#include "buddy_info.h"
+#include "buddy_list.h"
+#include "char_conv.h"
+#include "crypt.h"
+#include "group.h"
+#include "header_info.h"
+#include "qq_base.h"
+#include "packet_parse.h"
+#include "qq.h"
+#include "qq_network.h"
+#include "utils.h"
+
+#define QQ_LOGIN_DATA_LENGTH		    416
+#define QQ_LOGIN_REPLY_OK_PACKET_LEN        139
+#define QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN  11
+
+/* for QQ 2003iii 0117, fixed value */
+/* static const guint8 login_23_51[29] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0xbf, 0x14, 0x11, 0x20,
+	0x03, 0x9d, 0xb2, 0xe6, 0xb3, 0x11, 0xb7, 0x13,
+	0x95, 0x67, 0xda, 0x2c, 0x01 
+}; */
+
+/* for QQ 2003iii 0304, fixed value */
+/*
+static const guint8 login_23_51[29] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x9a, 0x93, 0xfe, 0x85,
+	0xd3, 0xd9, 0x2a, 0x41, 0xc8, 0x0d, 0xff, 0xb6,
+	0x40, 0xb8, 0xac, 0x32, 0x01
+};
+*/
+
+/* for QQ 2005? copy from lumaqq */
+/* FIXME: change to guint8 */
+static const guint8 login_23_51[29] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x86, 0xcc, 0x4c, 0x35,
+	0x2c, 0xd3, 0x73, 0x6c, 0x14, 0xf6, 0xf6, 0xaf,
+	0xc3, 0xfa, 0x33, 0xa4, 0x01
+};
+
+static const guint8 login_53_68[16] = {
+ 	0x8D, 0x8B, 0xFA, 0xEC, 0xD5, 0x52, 0x17, 0x4A,
+ 	0x86, 0xF9, 0xA7, 0x75, 0xE6, 0x32, 0xD1, 0x6D
+};
+
+static const guint8 login_100_bytes[100] = {
+	0x40, 0x0B, 0x04, 0x02, 0x00, 0x01, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x01, 0xE9, 0x03, 0x01,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF3, 0x03,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xED,
+	0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+	0xEC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x01, 0xEE, 0x03, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x01, 0xEF, 0x03, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x01, 0xEB, 0x03, 0x00,
+	0x00, 0x00, 0x00, 0x00
+};
+
+
+/* fixed value, not affected by version, or mac address */
+/*
+static const guint8 login_53_68[16] = {
+	0x82, 0x2a, 0x91, 0xfd, 0xa5, 0xca, 0x67, 0x4c,
+	0xac, 0x81, 0x1f, 0x6f, 0x52, 0x05, 0xa7, 0xbf
+};
+*/
+
+
+typedef struct _qq_login_reply_ok qq_login_reply_ok_packet;
+typedef struct _qq_login_reply_redirect qq_login_reply_redirect_packet;
+
+struct _qq_login_reply_ok {
+	guint8 result;
+	guint8 session_key[QQ_KEY_LENGTH];
+	guint32 uid;
+	struct in_addr client_ip;	/* those detected by server */
+	guint16 client_port;
+	struct in_addr server_ip;
+	guint16 server_port;
+	time_t login_time;
+	guint8 unknown1[26];
+	struct in_addr unknown_server1_ip;
+	guint16 unknown_server1_port;
+	struct in_addr unknown_server2_ip;
+	guint16 unknown_server2_port;
+	guint16 unknown2;	/* 0x0001 */
+	guint16 unknown3;	/* 0x0000 */
+	guint8 unknown4[32];
+	guint8 unknown5[12];
+	struct in_addr last_client_ip;
+	time_t last_login_time;
+	guint8 unknown6[8];
+};
+
+struct _qq_login_reply_redirect {
+	guint8 result;
+	guint32 uid;
+	struct in_addr new_server_ip;
+	guint16 new_server_port;
+};
+
+/* generate a md5 key using uid and session_key */
+static void get_session_md5(guint8 *session_md5, guint32 uid, guint8 *session_key)
+{
+	guint8 src[QQ_KEY_LENGTH + QQ_KEY_LENGTH];
+	gint bytes = 0;
+	
+	bytes += qq_put32(src + bytes, uid);
+	bytes += qq_putdata(src + bytes, session_key, QQ_KEY_LENGTH);
+
+	qq_get_md5(session_md5, QQ_KEY_LENGTH, src, bytes);
+}
+
+/* process login reply which says OK */
+static gint8 process_login_ok(PurpleConnection *gc, guint8 *data, gint len)
+{
+	gint bytes;
+	qq_data *qd;
+	qq_login_reply_ok_packet lrop;
+
+	qd = (qq_data *) gc->proto_data;
+	/* FIXME, check QQ_LOGIN_REPLY_OK_PACKET_LEN here */
+	bytes = 0;
+
+	/* 000-000: reply code */
+	bytes += qq_get8(&lrop.result, data + bytes);
+	/* 001-016: session key */
+	bytes += qq_getdata(lrop.session_key, sizeof(lrop.session_key), data + bytes);
+	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Get session_key done\n");
+	/* 017-020: login uid */
+	bytes += qq_get32(&lrop.uid, data + bytes);
+	/* 021-024: server detected user public IP */
+	bytes += qq_getIP(&lrop.client_ip, data + bytes);
+	/* 025-026: server detected user port */
+	bytes += qq_get16(&lrop.client_port, data + bytes);
+	/* 027-030: server detected itself ip 127.0.0.1 ? */
+	bytes += qq_getIP(&lrop.server_ip, data + bytes);
+	/* 031-032: server listening port */
+	bytes += qq_get16(&lrop.server_port, data + bytes);
+	/* 033-036: login time for current session */
+	bytes += qq_getime(&lrop.login_time, data + bytes);
+	/* 037-062: 26 bytes, unknown */
+	bytes += qq_getdata((guint8 *) &lrop.unknown1, 26, data + bytes);
+	/* 063-066: unknown server1 ip address */
+	bytes += qq_getIP(&lrop.unknown_server1_ip, data + bytes);
+	/* 067-068: unknown server1 port */
+	bytes += qq_get16(&lrop.unknown_server1_port, data + bytes);
+	/* 069-072: unknown server2 ip address */
+	bytes += qq_getIP(&lrop.unknown_server2_ip, data + bytes);
+	/* 073-074: unknown server2 port */
+	bytes += qq_get16(&lrop.unknown_server2_port, data + bytes);
+	/* 075-076: 2 bytes unknown */
+	bytes += qq_get16(&lrop.unknown2, data + bytes);
+	/* 077-078: 2 bytes unknown */
+	bytes += qq_get16(&lrop.unknown3, data + bytes);
+	/* 079-110: 32 bytes unknown */
+	bytes += qq_getdata((guint8 *) &lrop.unknown4, 32, data + bytes);
+	/* 111-122: 12 bytes unknown */
+	bytes += qq_getdata((guint8 *) &lrop.unknown5, 12, data + bytes);
+	/* 123-126: login IP of last session */
+	bytes += qq_getIP(&lrop.last_client_ip, data + bytes);
+	/* 127-130: login time of last session */
+	bytes += qq_getime(&lrop.last_login_time, data + bytes);
+	/* 131-138: 8 bytes unknown */
+	bytes += qq_getdata((guint8 *) &lrop.unknown6, 8, data + bytes);
+
+	if (bytes != QQ_LOGIN_REPLY_OK_PACKET_LEN) {	/* fail parsing login info */
+		purple_debug(PURPLE_DEBUG_WARNING, "QQ",
+			   "Fail parsing login info, expect %d bytes, read %d bytes\n",
+			   QQ_LOGIN_REPLY_OK_PACKET_LEN, bytes);
+	}			/* but we still go on as login OK */
+
+	memcpy(qd->session_key, lrop.session_key, sizeof(qd->session_key));
+	get_session_md5(qd->session_md5, qd->uid, qd->session_key);
+	
+	qd->my_ip.s_addr = lrop.client_ip.s_addr;
+	
+	qd->my_port = lrop.client_port;
+	qd->login_time = lrop.login_time;
+	qd->last_login_time = lrop.last_login_time;
+	qd->last_login_ip = g_strdup( inet_ntoa(lrop.last_client_ip) );
+
+	return QQ_LOGIN_REPLY_OK;
+}
+
+/* process login reply packet which includes redirected new server address */
+static gint8 process_login_redirect(PurpleConnection *gc, guint8 *data, gint len)
+{
+	qq_data *qd;
+	gint bytes;
+	qq_login_reply_redirect_packet lrrp;
+
+	qd = (qq_data *) gc->proto_data;
+	bytes = 0;
+	/* 000-000: reply code */
+	bytes += qq_get8(&lrrp.result, data + bytes);
+	/* 001-004: login uid */
+	bytes += qq_get32(&lrrp.uid, data + bytes);
+	/* 005-008: redirected new server IP */
+	bytes += qq_getIP(&lrrp.new_server_ip, data + bytes);
+	/* 009-010: redirected new server port */
+	bytes += qq_get16(&lrrp.new_server_port, data + bytes);
+
+	if (bytes != QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ",
+			   "Fail parsing login redirect packet, expect %d bytes, read %d bytes\n",
+			   QQ_LOGIN_REPLY_REDIRECT_PACKET_LEN, bytes);
+		return QQ_LOGIN_REPLY_ERR_MISC;
+	}
+	
+	/* redirect to new server, do not disconnect or connect here
+	 * those connect should be called at packet_process */
+	if (qd->real_hostname) {
+		purple_debug(PURPLE_DEBUG_INFO, "QQ", "free real_hostname\n");
+		g_free(qd->real_hostname);
+		qd->real_hostname = NULL;
+	}
+	qd->real_hostname = g_strdup( inet_ntoa(lrrp.new_server_ip) );
+	qd->real_port = lrrp.new_server_port;
+
+	return QQ_LOGIN_REPLY_REDIRECT;
+}
+
+/* process login reply which says wrong password */
+static gint8 process_login_wrong_pwd(PurpleConnection *gc, guint8 *data, gint len)
+{
+	gchar *server_reply, *server_reply_utf8;
+	server_reply = g_new0(gchar, len);
+	g_memmove(server_reply, data + 1, len - 1);
+	server_reply_utf8 = qq_to_utf8(server_reply, QQ_CHARSET_DEFAULT);
+	purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Wrong password, server msg in UTF8: %s\n", server_reply_utf8);
+	g_free(server_reply);
+	g_free(server_reply_utf8);
+
+	return QQ_LOGIN_REPLY_ERR_PWD;
+}
+
+/* request before login */
+void qq_send_packet_token(PurpleConnection *gc)
+{
+	qq_data *qd;
+	guint8 buf[16] = {0};
+	gint bytes = 0;
+
+	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
+	qd = (qq_data *) gc->proto_data;
+
+	bytes += qq_put8(buf + bytes, 0);
+	
+	qd->send_seq++;
+	qq_send_data(qd, QQ_CMD_TOKEN, qd->send_seq, TRUE, buf, bytes);
+}
+
+/* send login packet to QQ server */
+void qq_send_packet_login(PurpleConnection *gc)
+{
+	qq_data *qd;
+	guint8 *buf, *raw_data;
+	gint bytes;
+	guint8 *encrypted_data;
+	gint encrypted_len;
+
+	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
+	qd = (qq_data *) gc->proto_data;
+
+	g_return_if_fail(qd->token != NULL && qd->token_len > 0);
+
+	raw_data = g_newa(guint8, QQ_LOGIN_DATA_LENGTH);
+	memset(raw_data, 0, QQ_LOGIN_DATA_LENGTH);
+
+	encrypted_data = g_newa(guint8, QQ_LOGIN_DATA_LENGTH + 16);	/* 16 bytes more */
+#ifdef DEBUG
+	memset(qd->inikey, 0x01, sizeof(qd->inikey));
+#else
+	for (bytes = 0; bytes < sizeof(qd->inikey); bytes++)	{
+		qd->inikey[bytes] = (guint8) (g_random_int_range(0, 255) % 256);
+	}
+#endif
+
+	bytes = 0;
+	/* now generate the encrypted data
+	 * 000-015 use password_twice_md5 as key to encrypt empty string */
+	qq_encrypt((guint8 *) "", 0, qd->password_twice_md5, raw_data + bytes, &encrypted_len);
+	bytes += 16;
+	/* 016-016 */
+	bytes += qq_put8(raw_data + bytes, 0x00);
+	/* 017-020, used to be IP, now zero */
+	bytes += qq_put32(raw_data + bytes, 0x00000000);
+	/* 021-022, used to be port, now zero */
+	bytes += qq_put16(raw_data + bytes, 0x0000);
+	/* 023-051, fixed value, unknown */
+	bytes += qq_putdata(raw_data + bytes, login_23_51, 29);
+	/* 052-052, login mode */
+	bytes += qq_put8(raw_data + bytes, qd->login_mode);
+	/* 053-068, fixed value, maybe related to per machine */
+	bytes += qq_putdata(raw_data + bytes, login_53_68, 16);
+	/* 069, login token length */
+	bytes += qq_put8(raw_data + bytes, qd->token_len);
+	/* 070-093, login token, normally 24 bytes */
+	bytes += qq_putdata(raw_data + bytes, qd->token, qd->token_len);
+	/* 100 bytes unknown */
+	bytes += qq_putdata(raw_data + bytes, login_100_bytes, 100);
+	/* all zero left */
+
+	qq_encrypt(raw_data, QQ_LOGIN_DATA_LENGTH, qd->inikey, encrypted_data, &encrypted_len);
+
+	buf = g_newa(guint8, MAX_PACKET_SIZE);
+	memset(buf, 0, MAX_PACKET_SIZE);
+	bytes = 0;
+	bytes += qq_putdata(buf + bytes, qd->inikey, QQ_KEY_LENGTH);
+	bytes += qq_putdata(buf + bytes, encrypted_data, encrypted_len);
+
+	qd->send_seq++;
+	qq_send_data(qd, QQ_CMD_LOGIN, qd->send_seq, TRUE, buf, bytes);
+}
+
+guint8 qq_process_token_reply(PurpleConnection *gc, gchar *error_msg, guint8 *buf, gint buf_len)
+{
+	qq_data *qd;
+	guint8 ret;
+	int token_len;
+
+	g_return_val_if_fail(buf != NULL && buf_len != 0, -1);
+
+	g_return_val_if_fail(gc != NULL  && gc->proto_data != NULL, -1);
+	qd = (qq_data *) gc->proto_data;
+
+	ret = buf[0];
+	
+	if (ret != QQ_TOKEN_REPLY_OK) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Unknown request login token reply code : %d\n", buf[0]);
+		qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ",
+				buf, buf_len,
+				">>> [default] decrypt and dump");
+		error_msg = try_dump_as_gbk(buf, buf_len);
+		return ret;
+	}
+	
+	token_len = buf_len-2;
+	if (token_len <= 0) {
+		error_msg = g_strdup_printf( _("Invalid token len, %d"), token_len);
+		return -1;
+	}
+	
+	if (buf[1] != token_len) {
+		purple_debug(PURPLE_DEBUG_INFO, "QQ",
+				"Invalid token len. Packet specifies length of %d, actual length is %d\n", buf[1], buf_len-2);
+	}
+	qq_hex_dump(PURPLE_DEBUG_INFO, "QQ",
+			buf+2, token_len,
+			"<<< got a token -> [default] decrypt and dump");
+			
+	qd->token = g_new0(guint8, token_len);
+	qd->token_len = token_len;
+	g_memmove(qd->token, buf + 2, qd->token_len);
+	return ret;
+}
+
+/* send logout packets to QQ server */
+void qq_send_packet_logout(PurpleConnection *gc)
+{
+	gint i;
+	qq_data *qd;
+
+	qd = (qq_data *) gc->proto_data;
+	for (i = 0; i < 4; i++)
+		qq_send_cmd_detail(qd, QQ_CMD_LOGOUT, 0xffff, FALSE, qd->password_twice_md5, QQ_KEY_LENGTH);
+
+	qd->logged_in = FALSE;	/* update login status AFTER sending logout packets */
+}
+
+/* process the login reply packet */
+guint8 qq_process_login_reply(guint8 *buf, gint buf_len, PurpleConnection *gc)
+{
+	qq_data *qd;
+	guint8 *data;
+	gint data_len;
+	gchar* error_msg;
+
+	g_return_val_if_fail(buf != NULL && buf_len != 0, QQ_LOGIN_REPLY_ERR_MISC);
+
+	qd = (qq_data *) gc->proto_data;
+
+	data_len = buf_len;
+	data = g_newa(guint8, data_len);
+
+	if (qq_decrypt(buf, buf_len, qd->inikey, data, &data_len)) {
+		purple_debug(PURPLE_DEBUG_WARNING, "QQ", 
+				"Decrypt login reply packet with inikey, %d bytes\n", data_len);
+	} else {
+		/* reset data_len since it may changed */
+		data_len = buf_len;
+		if (qq_decrypt(buf, buf_len, qd->password_twice_md5, data, &data_len)) {
+			purple_debug(PURPLE_DEBUG_INFO, "QQ",
+				"Decrypt login reply packet with password_twice_md5, %d bytes\n", data_len);
+		} else {
+			purple_debug(PURPLE_DEBUG_ERROR, "QQ",
+					"No idea how to decrypt login reply\n");
+			return QQ_LOGIN_REPLY_ERR_MISC;
+		}
+	}
+	
+	switch (data[0]) {
+		case QQ_LOGIN_REPLY_OK:
+			purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login reply is OK\n");
+			return process_login_ok(gc, data, data_len);
+		case QQ_LOGIN_REPLY_REDIRECT:
+			purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login reply is redirect\n");
+			return process_login_redirect(gc, data, data_len);
+		case QQ_LOGIN_REPLY_ERR_PWD:
+			purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login reply is error password\n");
+			return process_login_wrong_pwd(gc, data, data_len);
+		case QQ_LOGIN_REPLY_NEED_REACTIVE:
+		case QQ_LOGIN_REPLY_REDIRECT_EX:
+			purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login reply is not actived or redirect extend\n");
+		default:
+		break;
+	}
+
+	purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Unknown reply code: %d\n", data[0]);
+			qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ",
+			data, data_len,
+			">>> [default] decrypt and dump");
+	error_msg = try_dump_as_gbk(data, data_len);
+	if (error_msg)	{
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg);
+			g_free(error_msg);
+	}
+	return QQ_LOGIN_REPLY_ERR_MISC;
+}
+
+/* send keep-alive packet to QQ server (it is a heart-beat) */
+void qq_send_packet_keep_alive(PurpleConnection *gc)
+{
+	qq_data *qd;
+	guint8 raw_data[16] = {0};
+	gint bytes= 0;
+
+	qd = (qq_data *) gc->proto_data;
+
+	/* In fact, we can send whatever we like to server
+	 * with this command, server return the same result including
+	 * the amount of online QQ users, my ip and port */
+	bytes += qq_put32(raw_data + bytes, qd->uid);
+
+	qq_send_cmd(qd, QQ_CMD_KEEP_ALIVE, raw_data, 4);
+}
+
+/* parse the return of keep-alive packet, it includes some system information */
+gboolean qq_process_keep_alive(guint8 *buf, gint buf_len, PurpleConnection *gc) 
+{
+	qq_data *qd;
+	gint len;
+	gchar **segments;
+	guint8 *data;
+
+	g_return_val_if_fail(buf != NULL && buf_len != 0, FALSE);
+
+	qd = (qq_data *) gc->proto_data;
+	len = buf_len;
+	data = g_newa(guint8, len);
+
+	if ( !qq_decrypt(buf, buf_len, qd->session_key, data, &len) ) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt keep alive reply\n");
+		return FALSE;
+	}
+
+	/* qq_show_packet("Keep alive reply packet", data, len); */
+
+	/* the last one is 60, don't know what it is */
+	if (NULL == (segments = split_data(data, len, "\x1f", 6)))
+			return TRUE;
+			
+	/* segments[0] and segment[1] are all 0x30 ("0") */
+	qd->total_online = strtol(segments[2], NULL, 10);
+	if(0 == qd->total_online) {
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Keep alive error"));
+	}
+	qd->my_ip.s_addr = inet_addr(segments[3]);
+	qd->my_port = strtol(segments[4], NULL, 10);
+
+	purple_debug(PURPLE_DEBUG_INFO, "QQ", "keep alive, %s:%d\n",
+		inet_ntoa(qd->my_ip), qd->my_port);
+	
+	g_strfreev(segments);
+	return TRUE;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/qq/qq_base.h	Thu Aug 07 16:00:16 2008 +0000
@@ -0,0 +1,56 @@
+/**
+ * file qq_base.h
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+#ifndef _QQ_BASE_H_
+#define _QQ_BASE_H_
+
+#include <glib.h>
+#include "connection.h"
+
+#define QQ_TOKEN_REPLY_OK 	0x00
+
+#define QQ_LOGIN_REPLY_OK							0x00
+#define QQ_LOGIN_REPLY_REDIRECT				0x01
+#define QQ_LOGIN_REPLY_ERR_PWD					0x05
+#define QQ_LOGIN_REPLY_NEED_REACTIVE		0x06
+#define QQ_LOGIN_REPLY_REDIRECT_EX			0x0A
+#define QQ_LOGIN_REPLY_ERR_MISC				0xff	/* defined by myself */
+
+#define QQ_LOGIN_MODE_NORMAL        0x0a
+#define QQ_LOGIN_MODE_AWAY	    0x1e
+#define QQ_LOGIN_MODE_HIDDEN        0x28
+
+#define QQ_UPDATE_ONLINE_INTERVAL   300	/* in sec */
+
+void qq_send_packet_token(PurpleConnection *gc);
+guint8 qq_process_token_reply(PurpleConnection *gc, gchar *error_msg, guint8 *buf, gint buf_len);
+
+void qq_send_packet_login(PurpleConnection *gc);
+guint8 qq_process_login_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
+
+void qq_send_packet_logout(PurpleConnection *gc);
+
+void qq_send_packet_keep_alive(PurpleConnection *gc);
+gboolean qq_process_keep_alive(guint8 *buf, gint buf_len, PurpleConnection *gc);
+#endif
--- a/libpurple/protocols/qq/qq_network.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/qq_network.c	Thu Aug 07 16:00:16 2008 +0000
@@ -32,26 +32,23 @@
 #endif
 
 #include "buddy_info.h"
-#include "buddy_list.h"
-#include "buddy_opt.h"
-#include "buddy_status.h"
+#include "group_info.h"
 #include "group_free.h"
-#include "char_conv.h"
 #include "crypt.h"
-#include "group_network.h"
 #include "header_info.h"
-#include "keep_alive.h"
-#include "im.h"
-#include "login_logout.h"
+#include "qq_base.h"
+#include "buddy_list.h"
 #include "packet_parse.h"
 #include "qq_network.h"
 #include "qq_trans.h"
-#include "sys_msg.h"
 #include "utils.h"
+#include "qq_process.h"
 
 /* set QQ_RECONNECT_MAX to 1, when test reconnecting */
 #define QQ_RECONNECT_MAX					4
 #define QQ_RECONNECT_INTERVAL		5000
+#define QQ_KEEP_ALIVE_INTERVAL		60000
+#define QQ_TRANS_INTERVAL				10000
 
 static gboolean set_new_server(qq_data *qd)
 {
@@ -107,60 +104,6 @@
 	return TRUE;
 }
 
-/* QQ 2003iii uses double MD5 for the pwkey to get the session key */
-static guint8 *encrypt_account_password(const gchar *pwd)
-{
-	PurpleCipher *cipher;
-	PurpleCipherContext *context;
-
-	guchar pwkey_tmp[QQ_KEY_LENGTH];
-
-	cipher = purple_ciphers_find_cipher("md5");
-	context = purple_cipher_context_new(cipher, NULL);
-	purple_cipher_context_append(context, (guchar *) pwd, strlen(pwd));
-	purple_cipher_context_digest(context, sizeof(pwkey_tmp), pwkey_tmp, NULL);
-	purple_cipher_context_destroy(context);
-	context = purple_cipher_context_new(cipher, NULL);
-	purple_cipher_context_append(context, pwkey_tmp, QQ_KEY_LENGTH);
-	purple_cipher_context_digest(context, sizeof(pwkey_tmp), pwkey_tmp, NULL);
-	purple_cipher_context_destroy(context);
-
-	return g_memdup(pwkey_tmp, QQ_KEY_LENGTH);
-}
-
-/* default process, decrypt and dump */
-static void process_cmd_unknow(PurpleConnection *gc, guint8 *buf, gint buf_len, guint16 cmd, guint16 seq)
-{
-	qq_data *qd;
-	guint8 *data;
-	gint data_len;
-	gchar *msg_utf8 = NULL;
-
-	g_return_if_fail(buf != NULL && buf_len != 0);
-
-	qq_show_packet("Processing unknown packet", buf, buf_len);
-
-	qd = (qq_data *) gc->proto_data;
-
-	data_len = buf_len;
-	data = g_newa(guint8, data_len);
-	memset(data, 0, data_len);
-	if ( !qq_decrypt(buf, buf_len, qd->session_key, data, &data_len )) {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Fail decrypt packet with default process\n");
-		return;
-	}
-	
-	qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ",
-			data, data_len,
-			">>> [%d] %s -> [default] decrypt and dump",
-			seq, qq_get_cmd_desc(cmd));
-
-	msg_utf8 = try_dump_as_gbk(data, data_len);
-	if (msg_utf8) {
-		g_free(msg_utf8);
-	}
-}
-
 static gint packet_get_header(guint8 *header_tag,  guint16 *source_tag,
 	guint16 *cmd, guint16 *seq, guint8 *buf)
 {
@@ -172,38 +115,6 @@
 	return bytes;
 }
 
-/* check whether one sequence number is duplicated or not
- * return TRUE if it is duplicated, otherwise FALSE */
-static gboolean packet_is_dup(qq_data *qd, guint16 seq)
-{
-	guint8 *byte, mask;
-
-	g_return_val_if_fail(qd != NULL, FALSE);
-
-	byte = &(qd->rcv_window[seq / 8]);
-	mask = (1 << (seq % 8));
-
-	if ((*byte) & mask)
-		return TRUE;	/* check mask */
-	(*byte) |= mask;
-	return FALSE;		/* set mask */
-}
-
-static gboolean packet_check_ack(qq_data *qd, guint16 cmd, guint16 seq)
-{
-	gpointer trans;
-
-	g_return_val_if_fail(qd != NULL, FALSE);
-
-	trans = qq_send_trans_find(qd, cmd, seq);
-	if (trans == NULL) {
-		return FALSE;
-	}
-	
-	qq_send_trans_remove(qd, trans);
-	return TRUE;
-}
-
 static gboolean reconnect_later_cb(gpointer data)
 {
 	PurpleConnection *gc;
@@ -244,85 +155,6 @@
 		reconnect_later_cb, gc);
 }
 
-static void process_cmd_server(
-	PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len)
-{
-	/* now process the packet */
-	switch (cmd) {
-		case QQ_CMD_RECV_IM:
-			qq_process_recv_im(data, data_len, seq, gc);
-			break;
-		case QQ_CMD_RECV_MSG_SYS:
-			qq_process_msg_sys(data, data_len, seq, gc);
-			break;
-		case QQ_CMD_RECV_MSG_FRIEND_CHANGE_STATUS:
-			qq_process_friend_change_status(data, data_len, gc);
-			break;
-		default:
-			process_cmd_unknow(gc, data, data_len, cmd, seq);
-			break;
-	}
-}
-
-static void process_cmd_reply(
-	PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *data, gint data_len)
-{
-	/* now process the packet */
-	switch (cmd) {
-		case QQ_CMD_KEEP_ALIVE:
-			qq_process_keep_alive_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_UPDATE_INFO:
-			qq_process_modify_info_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_ADD_FRIEND_WO_AUTH:
-			qq_process_add_buddy_reply(data, data_len, seq, gc);
-			break;
-		case QQ_CMD_DEL_FRIEND:
-			qq_process_remove_buddy_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_REMOVE_SELF:
-			qq_process_remove_self_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_BUDDY_AUTH:
-			qq_process_add_buddy_auth_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_GET_USER_INFO:
-			qq_process_get_info_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_CHANGE_ONLINE_STATUS:
-			qq_process_change_status_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_SEND_IM:
-			qq_process_send_im_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_LOGIN:
-			qq_process_login_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_GET_FRIENDS_LIST:
-			qq_process_get_buddies_list_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_GET_FRIENDS_ONLINE:
-			qq_process_get_buddies_online_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_GROUP_CMD:
-			qq_process_group_cmd_reply(data, data_len, seq, gc);
-			break;
-		case QQ_CMD_GET_ALL_LIST_WITH_GROUP:
-			qq_process_get_all_list_with_group_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_GET_LEVEL:
-			qq_process_get_level_reply(data, data_len, gc);
-			break;
-		case QQ_CMD_REQUEST_LOGIN_TOKEN:
-			qq_process_request_login_token_reply(data, data_len, gc);
-			break;
-		default:
-			process_cmd_unknow(gc, data, data_len, cmd, seq);
-			break;
-	}
-}
-
 /* process the incoming packet from qq_pending */
 static void packet_process(PurpleConnection *gc, guint8 *buf, gint buf_len)
 {
@@ -330,15 +162,13 @@
 	gint bytes, bytes_not_read;
 
 	gboolean prev_login_status;
-	guint8 *new_data;
-	gint new_data_len;
 	
 	guint8 header_tag;
 	guint16 source_tag;
 	guint16 cmd;
 	guint16 seq;		/* May be ack_seq or send_seq, depends on cmd */
 
-	gboolean is_reply;
+	qq_transaction *trans;
 
 	g_return_if_fail(buf != NULL && buf_len > 0);
 
@@ -353,35 +183,38 @@
 	if (QQ_DEBUG) {
 		purple_debug(PURPLE_DEBUG_INFO, "QQ",
 				"==> [%05d] 0x%04X %s, from (0x%04X %s)\n",
-				seq, cmd, qq_get_cmd_desc(cmd), source_tag, qq_get_source_str(source_tag));
+				seq, cmd, qq_get_cmd_desc(cmd), source_tag, qq_get_ver_desc(source_tag));
 	}
 	
 	bytes_not_read = buf_len - bytes - 1;
 
 	/* ack packet, we need to update send tranactions */
 	/* we do not check duplication for server ack */
-	is_reply = packet_check_ack(qd, cmd, seq);
-	if ( !is_reply ) {
-		if ( !qd->logged_in ) {
-			/* packets before login */
-			qq_rcv_trans_push(qd, cmd, seq, buf + bytes, bytes_not_read);
-			return;	/* do not process it now */
+	trans = qq_trans_find_rcved(qd, cmd, seq);
+	if (trans == NULL) {
+		/* new server command */
+		qq_trans_add_server_cmd(qd, cmd, seq, buf + bytes, bytes_not_read);
+		if ( qd->logged_in ) {
+			qq_proc_cmd_server(gc, cmd, seq, buf + bytes, bytes_not_read);
 		}
-		
-		/* server intiated packet, we need to send ack and check duplicaion 
-		 * this must be put after processing b4_packet
-		 * as these packets will be passed in twice */
-		if (packet_is_dup(qd, seq)) {
-			purple_debug(PURPLE_DEBUG_WARNING,
-					"QQ", "dup [%05d] %s, discard...\n", seq, qq_get_cmd_desc(cmd));
-			return;
+		return;
+	}
+
+	if (qq_trans_is_dup(trans)) {
+		purple_debug(PURPLE_DEBUG_WARNING,
+				"QQ", "dup [%05d] %s, discard...\n", seq, qq_get_cmd_desc(cmd));
+		return;
+	}
+
+	if (qq_trans_is_server(trans)) {
+		if ( qd->logged_in ) {
+			qq_proc_cmd_server(gc, cmd, seq, buf + bytes, bytes_not_read);
 		}
-		process_cmd_server(gc, cmd, seq, buf + bytes, bytes_not_read);
 		return;
 	}
 
 	/* this is the length of all the encrypted data (also remove tail tag */
-	process_cmd_reply(gc, cmd, seq, buf + bytes, bytes_not_read);
+	qq_proc_cmd_reply(gc, cmd, seq, buf + bytes, bytes_not_read);
 
 	/* check is redirect or not, and do it now */
 	if (qd->is_redirect) {
@@ -394,18 +227,7 @@
 
 	if (prev_login_status != qd->logged_in && qd->logged_in == TRUE) {
 		/* logged_in, but we have packets before login */
-		new_data = g_newa(guint8, MAX_PACKET_SIZE);
-		while (1) {
-			memset(new_data, 0, MAX_PACKET_SIZE);
-			new_data_len = qq_rcv_trans_pop(qd, &cmd, &seq, new_data, MAX_PACKET_SIZE);
-			if (new_data_len < 0) {
-				break;
-			}
-			if (new_data_len == 0) {
-				continue;
-			}
-			process_cmd_reply(gc, seq, cmd, new_data, new_data_len);
-		}
+		qq_trans_process_before_login(qd);
 	}
 }
 
@@ -464,8 +286,10 @@
 	 *  QQ need a keep alive packet in every 60 seconds
 	 gc->last_received = time(NULL);
 	*/
+	/*
 	purple_debug(PURPLE_DEBUG_INFO, "TCP_PENDING",
 			   "Read %d bytes from socket, rxlen is %d\n", buf_len, qd->tcp_rxlen);
+	*/
 	qd->tcp_rxqueue = g_realloc(qd->tcp_rxqueue, buf_len + qd->tcp_rxlen);
 	memcpy(qd->tcp_rxqueue + qd->tcp_rxlen, buf, buf_len);
 	qd->tcp_rxlen += buf_len;
@@ -482,9 +306,10 @@
 			break;
 		}
 
+		/* 
 		purple_debug(PURPLE_DEBUG_INFO, "TCP_PENDING",
 				   "Packet len is %d bytes, rxlen is %d\n", pkt_len, qd->tcp_rxlen);
-
+		*/
 		if ( pkt_len < QQ_TCP_HEADER_LENGTH
 		    || *(qd->tcp_rxqueue + bytes) != QQ_PACKET_TAG
 			|| *(qd->tcp_rxqueue + pkt_len - 1) != QQ_PACKET_TAIL) {
@@ -518,14 +343,14 @@
 		/* jump to next packet */
 		qd->tcp_rxlen -= pkt_len;
 		if (qd->tcp_rxlen) {
-			purple_debug(PURPLE_DEBUG_ERROR, "TCP_PENDING",
-			 	"shrink tcp_rxqueue to %d\n", qd->tcp_rxlen);		
+			/*
+			purple_debug(PURPLE_DEBUG_ERROR, "TCP_PENDING", "shrink tcp_rxqueue to %d\n", qd->tcp_rxlen);		
+			*/
 			jump = g_memdup(qd->tcp_rxqueue + pkt_len, qd->tcp_rxlen);
 			g_free(qd->tcp_rxqueue);
 			qd->tcp_rxqueue = jump;
 		} else {
-			purple_debug(PURPLE_DEBUG_ERROR, "TCP_PENDING",
-			 	"free tcp_rxqueue\n");		
+			/* purple_debug(PURPLE_DEBUG_ERROR, "TCP_PENDING", "free tcp_rxqueue\n"); */
 			g_free(qd->tcp_rxqueue);
 			qd->tcp_rxqueue = NULL;
 		}
@@ -591,8 +416,10 @@
 
 	g_return_val_if_fail(qd != NULL && qd->fd >= 0 && data != NULL && data_len > 0, -1);
 
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Send %d bytes to socket %d\n", data_len, qd->fd);
-
+	/*
+	purple_debug(PURPLE_DEBUG_INFO, "UDP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd);
+	*/
+	
 	errno = 0;
 	ret = send(qd->fd, data, data_len, 0);
 	if (ret < 0 && errno == EAGAIN) {
@@ -601,7 +428,7 @@
 	
 	if (ret < 0) {
 		/* TODO: what to do here - do we really have to disconnect? */
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Send failed: %d, %s\n", errno, g_strerror(errno));
+		purple_debug(PURPLE_DEBUG_ERROR, "UDP_SEND_OUT", "Send failed: %d, %s\n", errno, g_strerror(errno));
 		purple_connection_error_reason(qd->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno));
 	}
 	return ret;
@@ -642,7 +469,7 @@
 	g_return_val_if_fail(qd != NULL && qd->fd >= 0 && data != NULL && data_len > 0, -1);
 
 	/*
-	 * purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd);
+	purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT", "Send %d bytes to socket %d\n", data_len, qd->fd);
 	 */
 
 	if (qd->tx_handler == 0) {
@@ -652,13 +479,13 @@
 		errno = EAGAIN;
 	}
 
+	/*
 	purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT",
 		"Socket %d, total %d bytes is sent %d\n", qd->fd, data_len, ret);
+	*/
 	if (ret < 0 && errno == EAGAIN) {
 		/* socket is busy, send later */
-		/*
-		 * purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT", "Socket is busy and send later\n");
-		 */
+		purple_debug(PURPLE_DEBUG_INFO, "TCP_SEND_OUT", "Socket is busy and send later\n");
 		ret = 0;
 	} else if (ret <= 0) {
 		/* TODO: what to do here - do we really have to disconnect? */
@@ -679,70 +506,44 @@
 	return ret;
 }
 
-static gboolean trans_timeout(gpointer data)
+static gboolean network_timeout(gpointer data)
 {
-	PurpleConnection *gc;
+	PurpleConnection *gc = (PurpleConnection *) data;
 	qq_data *qd;
-	guint8 *buf;
-	gint buf_len = 0;
-	guint16 cmd;
-	gint retries = 0;
-	int index;
-	
-	gc = (PurpleConnection *) data;
+	gboolean is_lost_conn;
+
 	g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, TRUE);
+	qd = (qq_data *) gc->proto_data;
 
-	qd = (qq_data *) gc->proto_data;
-	
-	index = 0;
-	buf = g_newa(guint8, MAX_PACKET_SIZE);
+	is_lost_conn = qq_trans_scan(qd);
+	if (is_lost_conn) {
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Connection lost"));
+		return TRUE;
+	}
 
-	while (1) {
-		if (index < 0) {
-			/* next record is NULL */
-			break;
-		}
-		/* purple_debug(PURPLE_DEBUG_ERROR, "QQ", "scan begin %d\n", index); */
-		memset(buf, 0, MAX_PACKET_SIZE);
-		buf_len = qq_send_trans_scan(qd, &index, buf, MAX_PACKET_SIZE, &cmd, &retries);
-		if (buf_len <= 0) {
-			/* curr record is empty, whole trans  is NULL */
-			break;
-		}
-		/* index = -1, when get last record of transactions */
-		
-		/* purple_debug(PURPLE_DEBUG_ERROR, "QQ", "retries %d next index %d\n", retries, index); */
-		if (retries > 0) {
-			if (qd->use_tcp) {
-				tcp_send_out(qd, buf, buf_len);
-			} else {
-				udp_send_out(qd, buf, buf_len);
-			}
-			continue;
-		}
+	if ( !qd->logged_in ) {
+		return TRUE;
+	}
+	
+	qd->itv_count.keep_alive--;
+	if (qd->itv_count.keep_alive <= 0) {
+		qd->itv_count.keep_alive = qd->itv_config.keep_alive;
+		qq_send_packet_keep_alive(gc);
+		return TRUE;
+	}
 
-		/* retries <= 0 */
-		switch (cmd) {
-		case QQ_CMD_KEEP_ALIVE:
-			if (qd->logged_in) {
-				purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Connection lost!\n");
-				purple_connection_error_reason(gc,
-					PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Connection lost"));
-				qd->logged_in = FALSE;
-			}
-			break;
-		case QQ_CMD_LOGIN:
-		case QQ_CMD_REQUEST_LOGIN_TOKEN:
-			if (!qd->logged_in)	{
-				/* cancel login progress */
-				purple_connection_error_reason(gc,
-					PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Login failed, no reply"));
-			}
-			break;
-		default:
-			purple_debug(PURPLE_DEBUG_WARNING, "QQ", 
-				"%s packet lost.\n", qq_get_cmd_desc(cmd));
-		}
+	if (qd->itv_config.update <= 0) {
+		return TRUE;
+	}
+
+	qd->itv_count.update--;
+	if (qd->itv_count.update <= 0) {
+		qd->itv_count.update = qd->itv_config.update;
+		qq_send_packet_get_buddies_online(gc, 0);
+
+		qq_send_cmd_group_all_get_online_members(gc);
+		return TRUE;
 	}
 
 	return TRUE;		/* if return FALSE, timeout callback stops */
@@ -756,6 +557,7 @@
 	PurpleConnection *gc;
 	gchar *conn_msg;
 	const gchar *passwd;
+	PurpleAccount *account ;
 
 	gc = (PurpleConnection *) data;
 
@@ -768,6 +570,7 @@
 	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
 
 	qd = (qq_data *) gc->proto_data;
+	account = purple_connection_get_account(gc);
 
 	/* Connect is now complete; clear the PurpleProxyConnectData */
 	qd->connect_data = NULL;
@@ -791,12 +594,34 @@
 
 	/* now generate md5 processed passwd */
 	passwd = purple_account_get_password(purple_connection_get_account(gc));
-	g_return_if_fail(qd->pwkey == NULL);
-	qd->pwkey = encrypt_account_password(passwd);
+
+	/* use twice-md5 of user password as session key since QQ 2003iii */
+	qq_get_md5(qd->password_twice_md5, sizeof(qd->password_twice_md5),
+		(guint8 *)passwd, strlen(passwd));
+	qq_get_md5(qd->password_twice_md5, sizeof(qd->password_twice_md5),
+		qd->password_twice_md5, sizeof(qd->password_twice_md5));
+
+	g_return_if_fail(qd->network_timeout == 0);
+	qd->itv_config.resend = purple_account_get_int(account, "resend_interval", 10);
+	if (qd->itv_config.resend <= 0) qd->itv_config.resend = 10;
 
-	g_return_if_fail(qd->resend_timeout == 0);
-	/* call trans_timeout every 5 seconds */
-	qd->resend_timeout = purple_timeout_add(5000, trans_timeout, gc);
+	qd->itv_config.keep_alive = purple_account_get_int(account, "keep_alive_interval", 60);
+	if (qd->itv_config.keep_alive < 30) qd->itv_config.keep_alive = 30;
+	qd->itv_config.keep_alive /= qd->itv_config.resend;
+	qd->itv_count.keep_alive = qd->itv_config.keep_alive;
+
+	qd->itv_config.update = purple_account_get_int(account, "update_interval", 300);
+	if (qd->itv_config.update > 0) {
+		if (qd->itv_config.update < qd->itv_config.keep_alive) {
+			qd->itv_config.update = qd->itv_config.keep_alive;
+		}
+		qd->itv_config.update /= qd->itv_config.resend;
+		qd->itv_count.update = qd->itv_config.update;
+	} else {
+		qd->itv_config.update = 0;
+	}
+
+	qd->network_timeout = purple_timeout_add(qd->itv_config.resend *1000, network_timeout, gc);
 	
 	if (qd->use_tcp)
 		gc->inpa = purple_input_add(qd->fd, PURPLE_INPUT_READ, tcp_pending, gc);
@@ -808,7 +633,7 @@
 	purple_connection_update_progress(gc, conn_msg, QQ_CONNECT_STEPS - 1, QQ_CONNECT_STEPS);
 	g_free(conn_msg);
 
-	qq_send_packet_request_login_token(gc);
+	qq_send_packet_token(gc);
 }
 
 static void udp_can_write(gpointer data, gint source, PurpleInputCondition cond)
@@ -1039,16 +864,17 @@
 	qd = (qq_data *) gc->proto_data;
 
 	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Disconnecting ...\n");
+
+	if (qd->network_timeout > 0) {
+		purple_timeout_remove(qd->network_timeout);
+		qd->network_timeout = 0;
+	}
+
 	/* finish  all I/O */
 	if (qd->fd >= 0 && qd->logged_in) {
 		qq_send_packet_logout(gc);
 	}
 
-	if (qd->resend_timeout > 0) {
-		purple_timeout_remove(qd->resend_timeout);
-		qd->resend_timeout = 0;
-	}
-
 	if (gc->inpa > 0) {
 		purple_input_remove(gc->inpa);
 		gc->inpa = 0;
@@ -1092,35 +918,20 @@
 		qd->udp_query_data = NULL;
 	}
 
-	memset(qd->rcv_window, 0, sizeof(qd->rcv_window));
-	qq_rcv_trans_remove_all(qd);
-	qq_send_trans_remove_all(qd);
+	qq_trans_remove_all(qd);
 	
-	if (qd->inikey) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "free inikey\n");
-		g_free(qd->inikey);
-		qd->inikey = NULL;
-	}
-	if (qd->pwkey) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "free pwkey\n");
-		g_free(qd->pwkey);
-		qd->pwkey = NULL;
+	if (qd->token) {
+		purple_debug(PURPLE_DEBUG_INFO, "QQ", "free token\n");
+		g_free(qd->token);
+		qd->token = NULL;
+		qd->token_len = 0;
 	}
-	if (qd->session_key) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "free session_key\n");
-		g_free(qd->session_key);
-		qd->session_key = NULL;
-	}
-	if (qd->session_md5) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "free session_md5\n");
-		g_free(qd->session_md5);
-		qd->session_md5 = NULL;
-	}
-	if (qd->my_ip) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ", "free my_ip\n");
-		g_free(qd->my_ip);
-		qd->my_ip = NULL;
-	}
+	memset(qd->inikey, 0, sizeof(qd->inikey));
+	memset(qd->password_twice_md5, 0, sizeof(qd->password_twice_md5));
+	memset(qd->session_key, 0, sizeof(qd->session_key));
+	memset(qd->session_md5, 0, sizeof(qd->session_md5));
+
+	qd->my_ip.s_addr = 0;
 
 	qq_group_packets_free(qd);
 	qq_group_free_all(qd);
@@ -1168,19 +979,19 @@
 	return bytes;
 }
 
-gint qq_send_data(qq_data *qd, guint16 cmd, guint8 *data, gint data_len)
+/* data has been encrypted before */
+gint qq_send_data(qq_data *qd, guint16 cmd, guint16 seq, gboolean need_ack,
+	guint8 *data, gint data_len)
 {
 	guint8 *buf;
 	gint buf_len;
 	gint bytes_sent;
-	gint seq;
 
 	g_return_val_if_fail(qd != NULL, -1);
 	g_return_val_if_fail(data != NULL && data_len > 0, -1);
 
 	buf = g_newa(guint8, MAX_PACKET_SIZE);
 	memset(buf, 0, MAX_PACKET_SIZE);
-	seq = ++(qd->send_seq);
 	buf_len = encap(qd, buf, MAX_PACKET_SIZE, cmd, seq, data, data_len);
 	if (buf_len <= 0) {
 		return -1;
@@ -1192,11 +1003,12 @@
 		bytes_sent = udp_send_out(qd, buf, buf_len);
 	}
 
-	/* always need ack */
-	qq_send_trans_append(qd, buf, buf_len, cmd, seq);
-
+	if (need_ack)  {
+		qq_trans_add_client_cmd(qd, cmd, seq, data, data_len);
+	}
+	
 	if (QQ_DEBUG) {
-		qq_show_packet("QQ_SEND_DATA", buf, buf_len);
+		/* qq_show_packet("QQ_SEND_DATA", buf, buf_len); */
 		purple_debug(PURPLE_DEBUG_INFO, "QQ",
 				"<== [%05d], %s, total %d bytes is sent %d\n", 
 				seq, qq_get_cmd_desc(cmd), buf_len, bytes_sent);
@@ -1204,19 +1016,14 @@
 	return bytes_sent;
 }
 
-/* send the packet generated with the given cmd and data
- * return the number of bytes sent to socket if succeeds
- * return -1 if there is any error */
+/* Encrypt data with session_key, then call qq_send_data */
 gint qq_send_cmd_detail(qq_data *qd, guint16 cmd, guint16 seq, gboolean need_ack,
 	guint8 *data, gint data_len)
 {
-	guint8 *buf;
-	gint buf_len;
 	guint8 *encrypted_data;
 	gint encrypted_len;
-	gint bytes_sent;
 
-	g_return_val_if_fail(qd != NULL && qd->session_key != NULL, -1);
+	g_return_val_if_fail(qd != NULL, -1);
 	g_return_val_if_fail(data != NULL && data_len > 0, -1);
 
 	encrypted_len = data_len + 16;	/* at most 16 bytes more */
@@ -1224,35 +1031,10 @@
 
 	qq_encrypt(data, data_len, qd->session_key, encrypted_data, &encrypted_len);
 
-	buf = g_newa(guint8, MAX_PACKET_SIZE);
-	memset(buf, 0, MAX_PACKET_SIZE);
-	buf_len = encap(qd, buf, MAX_PACKET_SIZE, cmd, seq, encrypted_data, encrypted_len);
-	if (buf_len <= 0) {
-		return -1;
-	}
-
-	if (QQ_DEBUG) {
-		qq_show_packet("QQ_SEND_CMD", buf, buf_len);
-	}
-	if (qd->use_tcp) {
-		bytes_sent = tcp_send_out(qd, buf, buf_len);
-	} else {
-		bytes_sent = udp_send_out(qd, buf, buf_len);
-	}
-	
-	/* if it does not need ACK, we send ACK manually several times */
-	if (need_ack)  {
-		qq_send_trans_append(qd, buf, buf_len, cmd, seq);
-	}
-
-	if (QQ_DEBUG) {
-		purple_debug(PURPLE_DEBUG_INFO, "QQ",
-				"<== [%05d], %s, total %d bytes is sent %d\n", 
-				seq, qq_get_cmd_desc(cmd), buf_len, bytes_sent);
-	}
-	return bytes_sent;
+	return qq_send_data(qd, cmd, seq, need_ack, encrypted_data, encrypted_len);
 }
 
+/* set seq and need_ack, then call qq_send_cmd_detail */
 gint qq_send_cmd(qq_data *qd, guint16 cmd, guint8 *data, gint data_len)
 {
 	g_return_val_if_fail(qd != NULL, -1);
--- a/libpurple/protocols/qq/qq_network.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/qq_network.h	Thu Aug 07 16:00:16 2008 +0000
@@ -22,8 +22,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#ifndef _QQ_PROXY_H
-#define _QQ_PROXY_H
+#ifndef _QQ_NETWORK_H
+#define _QQ_NETWORK_H
 
 #include <glib.h>
 #include "connection.h"
@@ -36,8 +36,9 @@
 void qq_disconnect(PurpleConnection *gc);
 void qq_connect_later(PurpleConnection *gc);
 
-gint qq_send_data(qq_data *qd, guint16 cmd, guint8 *data, gint datalen);
 gint qq_send_cmd(qq_data *qd, guint16 cmd, guint8 *data, gint datalen);
+gint qq_send_data(qq_data *qd, guint16 cmd, guint16 seq, gboolean need_ack,
+	guint8 *data, gint data_len);
 gint qq_send_cmd_detail(qq_data *qd, guint16 cmd, guint16 seq, gboolean need_ack,
 	guint8 *data, gint data_len);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/qq/qq_process.c	Thu Aug 07 16:00:16 2008 +0000
@@ -0,0 +1,266 @@
+/**
+ * @file qq_network.c
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+#include "cipher.h"
+#include "debug.h"
+#include "internal.h"
+
+#ifdef _WIN32
+#define random rand
+#define srandom srand
+#endif
+
+#include "buddy_info.h"
+#include "buddy_list.h"
+#include "buddy_opt.h"
+#include "group_info.h"
+#include "group_free.h"
+#include "char_conv.h"
+#include "crypt.h"
+#include "group_network.h"
+#include "header_info.h"
+#include "qq_base.h"
+#include "im.h"
+#include "qq_process.h"
+#include "packet_parse.h"
+#include "qq_network.h"
+#include "qq_trans.h"
+#include "sys_msg.h"
+#include "utils.h"
+
+/* default process, decrypt and dump */
+static void process_cmd_unknow(PurpleConnection *gc,gchar *title, guint8 *buf, gint buf_len, guint16 cmd, guint16 seq)
+{
+	qq_data *qd;
+	guint8 *data;
+	gint data_len;
+	gchar *msg_utf8 = NULL;
+
+	g_return_if_fail(buf != NULL && buf_len != 0);
+
+	qq_show_packet(title, buf, buf_len);
+
+	qd = (qq_data *) gc->proto_data;
+
+	data_len = buf_len;
+	data = g_newa(guint8, data_len);
+	memset(data, 0, data_len);
+	if ( !qq_decrypt(buf, buf_len, qd->session_key, data, &data_len )) {
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Fail decrypt packet with default process\n");
+		return;
+	}
+	
+	qq_hex_dump(PURPLE_DEBUG_WARNING, "QQ",
+			data, data_len,
+			">>> [%d] %s -> [default] decrypt and dump",
+			seq, qq_get_cmd_desc(cmd));
+
+	msg_utf8 = try_dump_as_gbk(data, data_len);
+	if (msg_utf8) {
+		g_free(msg_utf8);
+	}
+}
+
+void qq_proc_cmd_server(PurpleConnection *gc,
+	guint16 cmd, guint16 seq, guint8 *data, gint data_len)
+{
+	/* now process the packet */
+	switch (cmd) {
+		case QQ_CMD_RECV_IM:
+			qq_process_recv_im(data, data_len, seq, gc);
+			break;
+		case QQ_CMD_RECV_MSG_SYS:
+			qq_process_msg_sys(data, data_len, seq, gc);
+			break;
+		case QQ_CMD_RECV_MSG_BUDDY_CHANGE_STATUS:
+			qq_process_buddy_change_status(data, data_len, gc);
+			break;
+		default:
+			process_cmd_unknow(gc, "Unknow SERVER CMD", data, data_len, cmd, seq);
+			break;
+	}
+}
+
+static void process_cmd_login(PurpleConnection *gc, guint8 *data, gint data_len)
+{
+	qq_data *qd;
+	guint ret_8;
+
+	g_return_if_fail (gc != NULL && gc->proto_data != NULL);
+	
+	qd = (qq_data *) gc->proto_data;
+
+	ret_8 = qq_process_login_reply(data, data_len, gc);
+	if (ret_8 == QQ_LOGIN_REPLY_OK) {
+		purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login repliess OK; everything is fine\n");
+
+		purple_connection_set_state(gc, PURPLE_CONNECTED);
+		qd->logged_in = TRUE;	/* must be defined after sev_finish_login */
+
+		/* now initiate QQ Qun, do it first as it may take longer to finish */
+		qq_group_init(gc);
+
+		/* Now goes on updating my icon/nickname, not showing info_window */
+		qd->modifying_face = FALSE;
+
+		qq_send_packet_get_info(gc, qd->uid, FALSE);
+		/* grab my level */
+		qq_send_packet_get_level(gc, qd->uid);
+
+		qq_send_packet_change_status(gc);
+
+		/* refresh buddies */
+		qq_send_packet_get_buddies_list(gc, 0);
+
+		/* refresh groups */
+		qq_send_packet_get_all_list_with_group(gc, 0);
+
+		return;
+	}
+
+	if (ret_8 == QQ_LOGIN_REPLY_REDIRECT) {
+		qd->is_redirect = TRUE;
+		/*
+		purple_debug(PURPLE_DEBUG_WARNING, "QQ",
+			"Redirected to new server: %s:%d\n", qd->real_hostname, qd->real_port);
+		*/
+		return;
+	}
+
+	if (ret_8 == QQ_LOGIN_REPLY_ERR_PWD) {
+		if (!purple_account_get_remember_password(gc->account)) {
+			purple_account_set_password(gc->account, NULL);
+		}
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password."));
+		return;
+	}
+
+	if (ret_8 == QQ_LOGIN_REPLY_ERR_MISC) {
+		if (purple_debug_is_enabled())
+			purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login. Check debug log."));
+		else
+			purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login"));
+		return;
+	}
+}
+
+void qq_proc_cmd_reply(PurpleConnection *gc,
+	guint16 cmd, guint16 seq, guint8 *data, gint data_len)
+{
+	guint8 ret_8 = 0;
+	guint16 ret_16 = 0;
+	guint32 ret_32 = 0;
+	gchar *error_msg = NULL;
+
+	switch (cmd) {
+		case QQ_CMD_TOKEN:
+			ret_8 = qq_process_token_reply(gc, error_msg, data, data_len);
+			if (ret_8 != QQ_TOKEN_REPLY_OK) {
+				if (error_msg == NULL) {
+					error_msg = g_strdup_printf( _("Invalid token reply code, 0x%02X"), ret_8);
+				}
+				purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_msg);
+				g_free(error_msg);
+				return;
+			}
+			
+			qq_send_packet_login(gc);
+			break;
+		case QQ_CMD_LOGIN:
+			process_cmd_login(gc, data, data_len);
+			break;
+		case QQ_CMD_UPDATE_INFO:
+			qq_process_modify_info_reply(data, data_len, gc);
+			break;
+		case QQ_CMD_ADD_BUDDY_WO_AUTH:
+			qq_process_add_buddy_reply(data, data_len, seq, gc);
+			break;
+		case QQ_CMD_DEL_BUDDY:
+			qq_process_remove_buddy_reply(data, data_len, gc);
+			break;
+		case QQ_CMD_REMOVE_SELF:
+			qq_process_remove_self_reply(data, data_len, gc);
+			break;
+		case QQ_CMD_BUDDY_AUTH:
+			qq_process_add_buddy_auth_reply(data, data_len, gc);
+			break;
+		case QQ_CMD_GET_USER_INFO:
+			qq_process_get_info_reply(data, data_len, gc);
+			break;
+		case QQ_CMD_CHANGE_ONLINE_STATUS:
+			qq_process_change_status_reply(data, data_len, gc);
+			break;
+		case QQ_CMD_SEND_IM:
+			qq_process_send_im_reply(data, data_len, gc);
+			break;
+		case QQ_CMD_KEEP_ALIVE:
+			qq_process_keep_alive(data, data_len, gc);
+			break;
+		case QQ_CMD_GET_BUDDIES_ONLINE:
+			ret_8 = qq_process_get_buddies_online_reply(data, data_len, gc);
+			if (ret_8  > 0 && ret_8 < 0xff) {
+				purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more online buddies\n"); 
+				qq_send_packet_get_buddies_online(gc, ret_8);
+			} else {
+				purple_debug(PURPLE_DEBUG_INFO, "QQ", "All online buddies received\n"); 
+				/* Fixme: this should not be called once*/
+				qq_send_packet_get_buddies_levels(gc);
+
+				qq_refresh_all_buddy_status(gc);
+			}
+			break;
+		case QQ_CMD_GET_LEVEL:
+			qq_process_get_level_reply(data, data_len, gc);
+			break;
+		case QQ_CMD_GET_BUDDIES_LIST:
+			ret_16 = qq_process_get_buddies_list_reply(data, data_len, gc);
+			if (ret_16 > 0	&& ret_16 < 0xffff) { 
+				purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more buddies\n"); 
+				qq_send_packet_get_buddies_list(gc, ret_16);
+			} else {
+				purple_debug(PURPLE_DEBUG_INFO, "QQ", "All buddies received. Requesting buddies' levels\n");
+				qq_send_packet_get_buddies_online(gc, 0);
+			}
+			break;
+		case QQ_CMD_GROUP_CMD:
+			qq_process_group_cmd_reply(data, data_len, seq, gc);
+			break;
+		case QQ_CMD_GET_ALL_LIST_WITH_GROUP:
+			ret_32 = qq_process_get_all_list_with_group_reply(data, data_len, gc);
+			if (ret_32 > 0 && ret_32 < 0xffffffff) {
+				purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more buddies and groups\n");
+				qq_send_packet_get_all_list_with_group(gc, ret_32);
+			} else {
+				purple_debug(PURPLE_DEBUG_INFO, "QQ", "All buddies and groups received\n"); 
+			}
+			break;
+		default:
+			process_cmd_unknow(gc, "Unknow reply CMD", data, data_len, cmd, seq);
+			break;
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/qq/qq_process.h	Thu Aug 07 16:00:16 2008 +0000
@@ -0,0 +1,38 @@
+/**
+ * @file qq_process.h
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+#ifndef _QQ_PROCESS_H
+#define _QQ_PROCESS_H
+
+#include <glib.h>
+#include "connection.h"
+
+#include "qq.h"
+
+void qq_proc_cmd_reply(PurpleConnection *gc,
+		guint16 cmd, guint16 seq, guint8 *data, gint data_len);
+void qq_proc_cmd_server(PurpleConnection *gc,
+	guint16 cmd, guint16 seq, guint8 *data, gint data_len);
+#endif
+
--- a/libpurple/protocols/qq/qq_trans.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/qq_trans.c	Thu Aug 07 16:00:16 2008 +0000
@@ -32,215 +32,259 @@
 
 #include "header_info.h"
 #include "qq_network.h"
+#include "qq_process.h"
 #include "qq_trans.h"
 
-#define QQ_RESEND_MAX               8	/* max resend per packet */
-
-typedef struct _transaction {
-	guint16 seq;
-	guint16 cmd;
-	guint8 *buf;
-	gint buf_len;
-
-	gint fd;
-	gint retries;
-	time_t create_time;
-} transaction;
-
-void qq_send_trans_append(qq_data *qd, guint8 *buf, gint buf_len, guint16 cmd, guint16 seq)
-{
-	transaction *trans = g_new0(transaction, 1);
-
-	g_return_if_fail(trans != NULL);
+#define QQ_RESEND_MAX               3	/* max resend per packet */
 
-	trans->fd = qd->fd;
-	trans->cmd = cmd;
-	trans->seq = seq;
-	trans->retries = QQ_RESEND_MAX;
-	trans->create_time = time(NULL);
-	trans->buf = g_memdup(buf, buf_len);	/* don't use g_strdup, may have 0x00 */
-	trans->buf_len = buf_len;
-
-	purple_debug(PURPLE_DEBUG_ERROR, "QQ",
-			"Add to transaction, seq = %d, buf = %p, len = %d\n",
-			trans->seq, trans->buf, trans->buf_len);
-	qd->send_trans = g_list_append(qd->send_trans, trans);
-}
-
-/* Remove a packet with seq from send trans */
-void qq_send_trans_remove(qq_data *qd, gpointer data) 
-{
-	transaction *trans = (transaction *)data;
-
-	g_return_if_fail(qd != NULL && data != NULL);
-	
-	purple_debug(PURPLE_DEBUG_INFO, "QQ",
-				"ack [%05d] %s, remove from send tranactions\n",
-				trans->seq, qq_get_cmd_desc(trans->cmd));
-
-	if (trans->buf)	g_free(trans->buf);
-	qd->send_trans = g_list_remove(qd->send_trans, trans);
-	g_free(trans);
-}
-
-gpointer qq_send_trans_find(qq_data *qd, guint16 cmd, guint16 seq)
+qq_transaction *qq_trans_find_rcved(qq_data *qd, guint16 cmd, guint16 seq)
 {
 	GList *curr;
 	GList *next;
-	transaction *trans;
+	qq_transaction *trans;
+
+	if (qd->transactions == NULL) {
+		return NULL;
+	}
 
-	curr = qd->send_trans;
-	while(curr) {
+	next = qd->transactions;
+	while( (curr = next) ) {
 		next = curr->next;
-		trans = (transaction *) (curr->data);
+		
+		trans = (qq_transaction *) (curr->data);
 		if(trans->cmd == cmd && trans->seq == seq) {
+			if (trans->rcved_times == 0) {
+				trans->scan_times = 0;
+			}
+			trans->rcved_times++;
+			if (qq_trans_is_server(trans) && qq_trans_is_dup(trans)) {
+				/* server may not get our confirm reply before, send reply again*/
+				if (trans->data != NULL && trans->data_len > 0) {
+					qq_send_data(qd, trans->cmd, trans->seq, FALSE, trans->data, trans->data_len);
+				}
+			}
 			return trans;
 		}
-		curr = next;
 	}
 
 	return NULL;
 }
 
-/* clean up send trans and free all contents */
-void qq_send_trans_remove_all(qq_data *qd)
+gboolean qq_trans_is_server(qq_transaction *trans) 
+{
+	g_return_val_if_fail(trans != NULL, FALSE);
+	
+	if (trans->flag & QQ_TRANS_IS_SERVER)
+		return TRUE;
+	else
+		return FALSE;
+}
+
+gboolean qq_trans_is_dup(qq_transaction *trans) 
+{
+	g_return_val_if_fail(trans != NULL, TRUE);
+	
+	if (trans->rcved_times > 1)
+		return TRUE;
+	else
+		return FALSE;
+}
+
+/* Remove a packet with seq from send trans */
+static void trans_remove(qq_data *qd, qq_transaction *trans) 
+{
+	g_return_if_fail(qd != NULL && trans != NULL);
+	
+	purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS",
+				"Remove [%s%05d] retry %d rcved %d scan %d %s\n",
+				(trans->flag & QQ_TRANS_IS_SERVER) ? "SRV-" : "",
+				trans->seq,
+				trans->send_retries, trans->rcved_times, trans->scan_times,
+				qq_get_cmd_desc(trans->cmd));
+
+	if (trans->data)	g_free(trans->data);
+	qd->transactions = g_list_remove(qd->transactions, trans);
+	g_free(trans);
+}
+
+void qq_trans_add_client_cmd(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len)
+{
+	qq_transaction *trans = g_new0(qq_transaction, 1);
+
+	g_return_if_fail(trans != NULL);
+
+	trans->flag = 0;
+	if (cmd == QQ_CMD_TOKEN || cmd == QQ_CMD_LOGIN || cmd == QQ_CMD_KEEP_ALIVE) {
+		trans->flag |= QQ_TRANS_CLI_IMPORT;
+	}
+	trans->fd = qd->fd;
+	trans->cmd = cmd;
+	trans->seq = seq;
+	trans->send_retries = QQ_RESEND_MAX;
+	trans->rcved_times = 0;
+	trans->scan_times = 0;
+	trans->data = NULL;
+	trans->data_len = 0;
+	if (data != NULL && data_len > 0) {
+		trans->data = g_memdup(data, data_len);	/* don't use g_strdup, may have 0x00 */
+		trans->data_len = data_len;
+	}
+	purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS",
+			"Add client cmd, seq = %d, data = %p, len = %d\n",
+			trans->seq, trans->data, trans->data_len);
+	qd->transactions = g_list_append(qd->transactions, trans);
+}
+
+void qq_trans_add_server_cmd(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len)
+{
+	qq_transaction *trans = g_new0(qq_transaction, 1);
+
+	g_return_if_fail(trans != NULL);
+
+	trans->flag = QQ_TRANS_IS_SERVER;
+	if ( !qd->logged_in ) {
+		trans->flag |= QQ_TRANS_BEFORE_LOGIN;
+	}
+	trans->fd = qd->fd;
+	trans->cmd = cmd;
+	trans->seq = seq;
+	trans->send_retries = 0;
+	trans->rcved_times = 1;
+	trans->scan_times = 0;
+	trans->data = NULL;
+	trans->data_len = 0;
+	if (data != NULL && data_len > 0) {
+		trans->data = g_memdup(data, data_len);	/* don't use g_strdup, may have 0x00 */
+		trans->data_len = data_len;
+	}
+	purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS",
+			"Add server cmd, seq = %d, data = %p, len = %d\n",
+			trans->seq, trans->data, trans->data_len);
+	qd->transactions = g_list_append(qd->transactions, trans);
+}
+
+void qq_trans_process_before_login(qq_data *qd)
 {
 	GList *curr;
 	GList *next;
-	transaction *trans;
+	qq_transaction *trans;
+
+	g_return_if_fail(qd != NULL);
+
+	next = qd->transactions;
+	while( (curr = next) ) {
+		next = curr->next;
+		trans = (qq_transaction *) (curr->data);
+		/* purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS", "Scan [%d]\n", trans->seq); */
+		
+		if ( !(trans->flag & QQ_TRANS_IS_SERVER) ) {
+			continue;
+		}
+		if ( !(trans->flag & QQ_TRANS_BEFORE_LOGIN) ) {
+			continue;
+		}
+		// set QQ_TRANS_BEFORE_LOGIN off
+		trans->flag &= ~QQ_TRANS_BEFORE_LOGIN;
+
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS",
+				"Process server cmd before login, seq %d, data %p, len %d, send_retries %d\n",
+				trans->seq, trans->data, trans->data_len, trans->send_retries);
+
+		qq_proc_cmd_reply(qd->gc, trans->seq, trans->cmd, trans->data, trans->data_len);
+	}
+
+	/* purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", "Scan finished\n"); */
+	return;
+}
+
+gboolean qq_trans_scan(qq_data *qd)
+{
+	GList *curr;
+	GList *next;
+	qq_transaction *trans;
+
+	g_return_val_if_fail(qd != NULL, FALSE);
+	
+	next = qd->transactions;
+	while( (curr = next) ) {
+		next = curr->next;
+		trans = (qq_transaction *) (curr->data);
+		/* purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", "Scan [%d]\n", trans->seq); */
+		
+		if (trans->flag & QQ_TRANS_BEFORE_LOGIN) {
+			/* keep server cmd before login*/
+			continue;
+		}
+
+		trans->scan_times++;
+		if (trans->scan_times <= 1) {
+			/* skip in 10 seconds */
+			continue;
+		}
+
+		if (trans->rcved_times > 0) {
+			/* Has been received */
+			trans_remove(qd, trans);
+			continue;
+		}
+
+		if (trans->flag & QQ_TRANS_IS_SERVER) {
+			continue;
+		}
+		
+		/* Never get reply */
+		trans->send_retries--;
+		if (trans->send_retries <= 0) {
+			purple_debug(PURPLE_DEBUG_WARNING, "QQ_TRANS",
+				"[%d] %s is lost.\n",
+				trans->seq, qq_get_cmd_desc(trans->cmd));
+			if (trans->flag & QQ_TRANS_CLI_IMPORT) {
+				return TRUE;
+			}
+
+			purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS",
+				"Lost [%d] %s, data %p, len %d, retries %d\n",
+				trans->seq, qq_get_cmd_desc(trans->cmd),
+				trans->data, trans->data_len, trans->send_retries);
+			trans_remove(qd, trans);
+			continue;
+		}
+
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS",
+				"Resend [%d] %s data %p, len %d, send_retries %d\n",
+				trans->seq, qq_get_cmd_desc(trans->cmd),
+				trans->data, trans->data_len, trans->send_retries);
+		qq_send_data(qd, trans->cmd, trans->seq, FALSE, trans->data, trans->data_len);
+	}
+
+	/* purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", "Scan finished\n"); */
+	return FALSE;
+}
+
+/* clean up send trans and free all contents */
+void qq_trans_remove_all(qq_data *qd)
+{
+	GList *curr;
+	GList *next;
+	qq_transaction *trans;
 	gint count = 0;
 
-	curr = qd->send_trans;
+	curr = qd->transactions;
 	while(curr) {
 		next = curr->next;
 		
-		trans = (transaction *) (curr->data);
+		trans = (qq_transaction *) (curr->data);
 		/*
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ",
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ_TRANS",
 			"Remove to transaction, seq = %d, buf = %p, len = %d\n",
 			trans->seq, trans->buf, trans->len);
 		*/
-		qq_send_trans_remove(qd, trans);
+		trans_remove(qd, trans);
 
 		count++;
 		curr = next;
 	}
-	g_list_free(qd->send_trans);
-
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "%d packets in send tranactions are freed!\n", count);
-}
-
-gint qq_send_trans_scan(qq_data *qd, gint *start,
-	guint8 *buf, gint maxlen, guint16 *cmd, gint *retries)
-{
-	GList *curr;
-	GList *next = NULL;
-	transaction *trans;
-	gint copylen;
-
-	g_return_val_if_fail(qd != NULL && *start >= 0 && maxlen > 0, -1);
-	
-	/* purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Scan from %d\n", *start); */
-	curr = g_list_nth(qd->send_trans, *start);
-	while(curr) {
-		next = curr->next;
-		*start = g_list_position(qd->send_trans, next);
-		
-		trans = (transaction *) (curr->data);
-		if (trans->buf == NULL || trans->buf_len <= 0) {
-			qq_send_trans_remove(qd, trans);
-			curr = next;
-			continue;
-		}
-
-		if (trans->retries < 0) {
-			purple_debug(PURPLE_DEBUG_ERROR, "QQ",
-				"Remove transaction, seq %d, buf %p, len %d, retries %d, next %d\n",
-				trans->seq, trans->buf, trans->buf_len, trans->retries, *start);
-			qq_send_trans_remove(qd, trans);
-			curr = next;
-			continue;
-		}
-
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ",
-				"Resend transaction, seq %d, buf %p, len %d, retries %d, next %d\n",
-				trans->seq, trans->buf, trans->buf_len, trans->retries, *start);
-		copylen = MIN(trans->buf_len, maxlen);
-		g_memmove(buf, trans->buf, copylen);
-
-		*cmd = trans->cmd;
-		*retries = trans->retries;
-		trans->retries--;
-		return copylen;
-	}
-
-	/* purple_debug(PURPLE_DEBUG_INFO, "QQ", "Scan finished\n"); */
-	return -1;
-}
-
-void qq_rcv_trans_push(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len)
-{
-	transaction *trans = g_new0(transaction, 1);
-
-	g_return_if_fail(data != NULL && data_len > 0);
-	g_return_if_fail(trans != NULL);
+	g_list_free(qd->transactions);
 
-	trans->cmd = cmd;
-	trans->seq = seq;
-	trans->buf = g_memdup(data, data_len);
-	trans->buf_len = data_len;
-	trans->create_time = time(NULL);
-
-	if (qd->rcv_trans == NULL)
-		qd->rcv_trans = g_queue_new();
-
-	g_queue_push_head(qd->rcv_trans, trans);
+	purple_debug(PURPLE_DEBUG_INFO, "QQ_TRANS", "Free all %d packets\n", count);
 }
-
-gint qq_rcv_trans_pop(qq_data *qd, guint16 *cmd, guint16 *seq, guint8 *data, gint max_len)
-{
-	transaction *trans = NULL;
-	gint copy_len;
-
-	g_return_val_if_fail(data != NULL && max_len > 0, -1);
-
-	if (g_queue_is_empty(qd->rcv_trans)) {
-		return -1;
-	}
-	trans = (transaction *) g_queue_pop_head(qd->rcv_trans);
-	if (trans == NULL) {
-		return 0;
-	}
-	if (trans->buf == NULL || trans->buf_len <= 0) {
-		return 0;
-	}
-
-	copy_len = MIN(max_len, trans->buf_len);
-	g_memmove(data, trans->buf, copy_len);
-	*cmd = trans->cmd;
-	*seq = trans->seq;
-
-	g_free(trans->buf);
-	g_free(trans);
-	return copy_len;
-}
-
-/* clean up the packets before login */
-void qq_rcv_trans_remove_all(qq_data *qd)
-{
-	transaction *trans = NULL;
-	gint count = 0;
-
-	g_return_if_fail(qd != NULL);
-
-	/* now clean up my own data structures */
-	if (qd->rcv_trans != NULL) {
-		while (NULL != (trans = g_queue_pop_tail(qd->rcv_trans))) {
-			g_free(trans->buf);
-			g_free(trans);
-			count++;
-		}
-		g_queue_free(qd->rcv_trans);
-	}
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "%d packets in receive tranactions are freed!\n", count);
-}
--- a/libpurple/protocols/qq/qq_trans.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/qq_trans.h	Thu Aug 07 16:00:16 2008 +0000
@@ -28,15 +28,34 @@
 #include <glib.h>
 #include "qq.h"
 
-void qq_send_trans_append(qq_data *qd, guint8 *buf, gint bus_len, guint16 cmd, guint16 seq);
-void qq_send_trans_remove(qq_data *qd, gpointer data);
-gpointer qq_send_trans_find(qq_data *qd, guint16 cmd, guint16 seq);
-void qq_send_trans_remove_all(qq_data *qd);
+enum {
+	QQ_TRANS_IS_SERVER = 0x01,			/* Is server command or client command */
+	/* prefix QQ_TRANS_CLI is for client command*/
+	QQ_TRANS_CLI_EMERGE = 0x02,		/* send at once; or may wait for next reply*/
+	QQ_TRANS_CLI_IMPORT = 0x04,		/* Only notice if not get reply; or resend, disconn if reties get 0*/
+	QQ_TRANS_BEFORE_LOGIN = 0x08,	/* server command before login*/
+};
+
+typedef struct _qq_transaction {
+	guint8 flag;
+	guint16 seq;
+	guint16 cmd;
+	guint8 *data;
+	gint data_len;
 
-gint qq_send_trans_scan(qq_data *qd, gint *start, guint8 *buf, gint maxlen, guint16 *cmd, gint *retries);
+	gint fd;
+	gint send_retries;
+	gint rcved_times;
+	gint scan_times;
+} qq_transaction;
 
-void qq_rcv_trans_push(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len);
-gint qq_rcv_trans_pop(qq_data *qd, guint16 *cmd, guint16* seq, guint8 *data, gint max_len);
-void qq_rcv_trans_remove_all(qq_data *qd);
+qq_transaction *qq_trans_find_rcved(qq_data *qd, guint16 cmd, guint16 seq);
+gboolean qq_trans_is_server(qq_transaction *trans) ;
+gboolean qq_trans_is_dup(qq_transaction *trans);
+void qq_trans_add_client_cmd(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len);
+void qq_trans_add_server_cmd(qq_data *qd, guint16 cmd, guint16 seq, guint8 *data, gint data_len);
+void qq_trans_process_before_login(qq_data *qd);
+gboolean qq_trans_scan(qq_data *qd);
+void qq_trans_remove_all(qq_data *qd);
 
 #endif
--- a/libpurple/protocols/qq/send_file.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/send_file.c	Thu Aug 07 16:00:16 2008 +0000
@@ -29,12 +29,12 @@
 #include "network.h"
 #include "notify.h"
 
-#include "buddy_status.h"
+#include "buddy_list.h"
 #include "crypt.h"
 #include "file_trans.h"
 #include "header_info.h"
 #include "im.h"
-#include "keep_alive.h"
+#include "qq_base.h"
 #include "packet_parse.h"
 #include "qq_network.h"
 #include "utils.h"
@@ -447,7 +447,7 @@
 	info = g_new0(ft_info, 1);
 	info->to_uid = to_uid;
 	info->send_seq = qd->send_seq;
-	info->local_internet_ip = g_ntohl(inet_addr(qd->my_ip));
+	info->local_internet_ip = qd->my_ip.s_addr;
 	info->local_internet_port = qd->my_port;
 	info->local_real_ip = 0x00000000;
 	info->conn_method = 0x00;
@@ -784,7 +784,7 @@
 	qd = (qq_data *) gc->proto_data;
 
 	info = g_newa(ft_info, 1);
-	info->local_internet_ip = g_ntohl(inet_addr(qd->my_ip));
+	info->local_internet_ip = qd->my_ip.s_addr;
 	info->local_internet_port = qd->my_port;
 	info->local_real_ip = 0x00000000;
 	info->to_uid = sender_uid;
@@ -814,11 +814,11 @@
 		q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data;
 		if (q_bud) {
 			if(0 != info->remote_real_ip) {
-				g_memmove(q_bud->ip, &info->remote_real_ip, 4);
+				g_memmove(&(q_bud->ip), &info->remote_real_ip, sizeof(q_bud->ip));
 				q_bud->port = info->remote_minor_port;
 			}
 			else if (0 != info->remote_internet_ip) {
-				g_memmove(q_bud->ip, &info->remote_internet_ip, 4);
+				g_memmove(&(q_bud->ip), &info->remote_internet_ip, sizeof(q_bud->ip));
 				q_bud->port = info->remote_major_port;
 			}
 
@@ -831,7 +831,7 @@
 
 		}
 		else 
-			purple_debug(PURPLE_DEBUG_WARNING, "QQ", "buddy %d is not in my friendlist\n", sender_uid);
+			purple_debug(PURPLE_DEBUG_WARNING, "QQ", "buddy %d is not in list\n", sender_uid);
 
 		g_free(sender_name);	    
 		g_strfreev(fileinfo);
--- a/libpurple/protocols/qq/send_file.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/send_file.h	Thu Aug 07 16:00:16 2008 +0000
@@ -26,11 +26,12 @@
 #define _QQ_QQ_SEND_FILE_H_
 
 #include "ft.h"
+#include "qq.h"
 
 typedef struct _ft_info {
 	guint32 to_uid;
 	guint16 send_seq;
-	guint8 file_session_key[16];
+	guint8 file_session_key[QQ_KEY_LENGTH];
 	guint8 conn_method;
 	guint32 remote_internet_ip;
 	guint16 remote_internet_port;
--- a/libpurple/protocols/qq/sys_msg.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/sys_msg.c	Thu Aug 07 16:00:16 2008 +0000
@@ -44,6 +44,7 @@
 	QQ_MSG_SYS_ADD_CONTACT_REQUEST = 0x02,
 	QQ_MSG_SYS_ADD_CONTACT_APPROVED = 0x03,
 	QQ_MSG_SYS_ADD_CONTACT_REJECTED = 0x04,
+	QQ_MSG_SYS_NOTICE= 0x06,
 	QQ_MSG_SYS_NEW_VERSION = 0x09
 };
 
@@ -277,6 +278,20 @@
 	g_free(name);
 }
 
+static void _qq_process_msg_sys_notice(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8)
+{
+	gchar *title, *content;
+
+	g_return_if_fail(from != NULL && to != NULL);
+
+	title = g_strdup_printf(_("Notice from: %s"), from);
+	content = g_strdup_printf(_("%s"), msg_utf8);
+
+	purple_notify_info(gc, NULL, title, content);
+	g_free(title);
+	g_free(content);
+}
+
 void qq_process_msg_sys(guint8 *buf, gint buf_len, guint16 seq, PurpleConnection *gc)
 {
 	qq_data *qd;
@@ -320,9 +335,12 @@
 		case QQ_MSG_SYS_ADD_CONTACT_REJECTED:
 			_qq_process_msg_sys_add_contact_rejected(gc, from, to, msg_utf8);
 			break;
+		case QQ_MSG_SYS_NOTICE:
+			_qq_process_msg_sys_notice(gc, from, to, msg_utf8);
+			break;
 		case QQ_MSG_SYS_NEW_VERSION:
 			purple_debug(PURPLE_DEBUG_WARNING, "QQ",
-				   "QQ server says there is newer version than %s\n", qq_get_source_str(QQ_CLIENT));
+				   "QQ server says there is newer version than %s\n", qq_get_ver_desc(QQ_CLIENT));
 			break;
 		default:
 			purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Recv unknown sys msg code: %s\n", code);
--- a/libpurple/protocols/qq/utils.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/utils.c	Thu Aug 07 16:00:16 2008 +0000
@@ -30,6 +30,8 @@
 #include "win32dep.h"
 #endif
 
+#include "cipher.h"
+
 #include "char_conv.h"
 #include "debug.h"
 #include "prefs.h"
@@ -50,6 +52,21 @@
    }
    */
 
+void qq_get_md5(guint8 *md5, gint md5_len, const guint8* const src, gint src_len)
+{
+	PurpleCipher *cipher;
+	PurpleCipherContext *context;
+
+	g_return_if_fail(md5 != NULL && md5_len > 0);
+	g_return_if_fail(src != NULL && src_len > 0);
+
+	cipher = purple_ciphers_find_cipher("md5");
+	context = purple_cipher_context_new(cipher, NULL);
+	purple_cipher_context_append(context, src, src_len);
+	purple_cipher_context_digest(context, md5_len, md5, NULL);
+	purple_cipher_context_destroy(context);
+}
+
 gchar *get_name_by_index_str(gchar **array, const gchar *index_str, gint amount)
 {
 	gint index;
@@ -97,7 +114,7 @@
 	g_memmove(input, data, len);
 	input[len] = 0x00;
 
-	segments = g_strsplit((gchar *) input, delimit, 0);
+	segments = g_strsplit_set((gchar *) input, delimit, 0);
 	if (expected_fields <= 0)
 		return segments;
 
@@ -123,10 +140,20 @@
 	return segments;
 }
 
-/* given a four-byte ip data, convert it into a human readable ip string
- * the return needs to be freed */
-gchar *gen_ip_str(guint8 *ip)
+/* convert Purple name to original QQ UID */
+guint32 purple_name_to_uid(const gchar *const name)
 {
+	guint32 ret;
+	g_return_val_if_fail(name != NULL, 0);
+
+	ret = strtol(name, NULL, 10);
+	if (errno == ERANGE)
+		return 0;
+	else
+		return ret;
+}
+
+gchar *gen_ip_str(guint8 *ip) {
 	gchar *ret;
 	if (ip == NULL || ip[0] == 0) {
 		ret = g_new(gchar, 1);
@@ -149,19 +176,6 @@
 	return ip;
 }
 
-/* convert Purple name to original QQ UID */
-guint32 purple_name_to_uid(const gchar *const name)
-{
-	guint32 ret;
-	g_return_val_if_fail(name != NULL, 0);
-
-	ret = strtol(name, NULL, 10);
-	if (errno == ERANGE)
-		return 0;
-	else
-		return ret;
-}
-
 /* convert a QQ UID to a unique name of Purple
  * the return needs to be freed */
 gchar *uid_to_purple_name(guint32 uid)
--- a/libpurple/protocols/qq/utils.h	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/qq/utils.h	Thu Aug 07 16:00:16 2008 +0000
@@ -30,6 +30,8 @@
 
 #include "debug.h"
 
+void qq_get_md5(guint8 *md5, gint md5_len, const guint8* const src, gint src_len);
+
 gchar *get_name_by_index_str(gchar **array, const gchar *index_str, gint amount);
 gchar *get_index_str_by_name(gchar **array, const gchar *name, gint amount);
 gint qq_string_to_dec_value(const gchar *str);
--- a/libpurple/protocols/sametime/sametime.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/sametime/sametime.c	Thu Aug 07 16:00:16 2008 +0000
@@ -1816,7 +1816,7 @@
   who = g_strdup_printf(_("Announcement from %s"), who);
   msg = purple_markup_linkify(text);
 
-  purple_conversation_write(conv, who, msg, PURPLE_MESSAGE_RECV, time(NULL));
+  purple_conversation_write(conv, who, msg ? msg : "", PURPLE_MESSAGE_RECV, time(NULL));
   g_free(who);
   g_free(msg);
 }
--- a/libpurple/protocols/yahoo/yahoo_picture.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo_picture.c	Thu Aug 07 16:00:16 2008 +0000
@@ -27,6 +27,7 @@
 #include "accountopt.h"
 #include "blist.h"
 #include "debug.h"
+#include "privacy.h"
 #include "prpl.h"
 #include "proxy.h"
 #include "util.h"
@@ -109,6 +110,11 @@
 		l = l->next;
 	}
 
+	if (!purple_privacy_check(purple_connection_get_account(gc), who)) {
+		purple_debug_info("yahoo", "Picture packet from %s dropped.\n", who);
+		return;
+	}
+
 	/* Yahoo IM 6 spits out 0.png as the URL if the buddy icon is not set */
 	if (who && got_icon_info && url && !g_ascii_strncasecmp(url, "http://", 7)) {
 		/* TODO: make this work p2p, try p2p before the url */
--- a/libpurple/util.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/libpurple/util.c	Thu Aug 07 16:00:16 2008 +0000
@@ -2033,8 +2033,12 @@
 	gunichar g;
 	gboolean inside_html = FALSE;
 	int inside_paren = 0;
-	GString *ret = g_string_new("");
-	/* Assumes you have a buffer able to carry at least BUF_LEN * 2 bytes */
+	GString *ret;
+
+	if (text == NULL)
+		return NULL;
+
+	ret = g_string_new("");
 
 	c = text;
 	while (*c) {
--- a/pidgin/gtksmiley.c	Thu Jul 31 06:23:55 2008 +0000
+++ b/pidgin/gtksmiley.c	Thu Aug 07 16:00:16 2008 +0000
@@ -275,7 +275,8 @@
 			g_free(buffer);
 		}
 		emoticon = purple_smiley_new_from_file(entry, s->filename);
-		pidgin_smiley_add_to_list(emoticon);
+		if (emoticon)
+			pidgin_smiley_add_to_list(emoticon);
 	}
 
 	if (smiley_manager != NULL)
Binary file pidgin/pixmaps/emblems/16/birthday.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pixmaps/emblems/16/scalable/birthday.svg	Thu Aug 07 16:00:16 2008 +0000
@@ -0,0 +1,629 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16px"
+   height="16px"
+   id="svg8140"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="birthday.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs8142">
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4232"
+       id="linearGradient3007"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.7499999,14.982194,1.1250003)"
+       x1="7.5089025"
+       y1="2.218369"
+       x2="7.5089025"
+       y2="4.8258252" />
+    <linearGradient
+       id="linearGradient4380"
+       inkscape:collect="always">
+      <stop
+         id="stop4382"
+         offset="0"
+         style="stop-color:#fcaf3e;stop-opacity:1;" />
+      <stop
+         id="stop4384"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4380"
+       id="linearGradient3005"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.7499999,-2.9821948,0.3750003)"
+       x1="15.491097"
+       y1="4.2733984"
+       x2="15.491097"
+       y2="2.7707961" />
+    <linearGradient
+       id="linearGradient4142"
+       inkscape:collect="always">
+      <stop
+         id="stop4144"
+         offset="0"
+         style="stop-color:#5c3566;stop-opacity:1;" />
+      <stop
+         id="stop4146"
+         offset="1"
+         style="stop-color:#9253a2;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4142"
+       id="linearGradient3029"
+       gradientUnits="userSpaceOnUse"
+       x1="15.5"
+       y1="10.635184"
+       x2="15.5"
+       y2="7.1438446"
+       gradientTransform="matrix(1,0,0,0.8000001,-2.9821944,0.2999994)" />
+    <linearGradient
+       id="linearGradient4150"
+       inkscape:collect="always">
+      <stop
+         id="stop4152"
+         offset="0"
+         style="stop-color:#3c7704;stop-opacity:1" />
+      <stop
+         id="stop4154"
+         offset="1"
+         style="stop-color:#59b106;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4150"
+       id="linearGradient3034"
+       gradientUnits="userSpaceOnUse"
+       x1="7.5"
+       y1="9.4861355"
+       x2="7.5"
+       y2="7.0554562"
+       gradientTransform="matrix(1,0,0,0.8000001,-3,0.2999994)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4232"
+       id="linearGradient3048"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.7499999,-3.0178049,0.3750005)"
+       x1="7.5089025"
+       y1="2.218369"
+       x2="7.5089025"
+       y2="4.8258252" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4374">
+      <stop
+         style="stop-color:#fcaf3e;stop-opacity:1;"
+         offset="0"
+         id="stop4376" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop4378" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4374"
+       id="linearGradient3046"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.463041,0,0,1.1368063,-10.850902,0.678176)"
+       x1="6.3242626"
+       y1="2.3645318"
+       x2="6.3242626"
+       y2="1.6300712" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4232">
+      <stop
+         style="stop-color:#f57900;stop-opacity:1;"
+         offset="0"
+         id="stop4234" />
+      <stop
+         style="stop-color:#b25800;stop-opacity:1"
+         offset="1"
+         id="stop4236" />
+    </linearGradient>
+    <linearGradient
+       y2="4.8258252"
+       x2="7.5089025"
+       y1="2.218369"
+       x1="7.5089025"
+       gradientTransform="matrix(1,0,0,0.7499999,1.0000002,-0.6249996)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4308"
+       xlink:href="#linearGradient4232"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient4368"
+       inkscape:collect="always">
+      <stop
+         id="stop4370"
+         offset="0"
+         style="stop-color:#fcaf3e;stop-opacity:1;" />
+      <stop
+         id="stop4372"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       y2="1.6300712"
+       x2="6.3242626"
+       y1="2.3645318"
+       x1="6.3242626"
+       gradientTransform="matrix(2.463041,0,0,1.1368063,-6.8330964,-0.3218242)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4306"
+       xlink:href="#linearGradient4368"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3425">
+      <stop
+         style="stop-color:#204a87;stop-opacity:1;"
+         offset="0"
+         id="stop3427" />
+      <stop
+         style="stop-color:#2e69c2;stop-opacity:1"
+         offset="1"
+         id="stop3429" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3425"
+       id="linearGradient3431"
+       x1="11.5"
+       y1="9.961833"
+       x2="11.241222"
+       y2="6.6366434"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-2.9999997,-2.0000001)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4388">
+      <stop
+         style="stop-color:#d3d7cf;stop-opacity:1;"
+         offset="0"
+         id="stop4390" />
+      <stop
+         style="stop-color:#d3d7cf;stop-opacity:0;"
+         offset="1"
+         id="stop4392" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4388"
+       id="linearGradient4394"
+       x1="2.9999998"
+       y1="11.5"
+       x2="21"
+       y2="11.5"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4158">
+      <stop
+         style="stop-color:#9a9c98;stop-opacity:1"
+         offset="0"
+         id="stop4160" />
+      <stop
+         style="stop-color:#666763;stop-opacity:1"
+         offset="1"
+         id="stop4162" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4158"
+       id="linearGradient4164"
+       x1="16.274719"
+       y1="9.7764273"
+       x2="17.448"
+       y2="13.753902"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7894737,0,0,0.6666667,-1.4736843,1.8333322)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4048">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4050" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4052" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4048"
+       id="linearGradient4054"
+       x1="-10.516191"
+       y1="10.124428"
+       x2="36.795452"
+       y2="19.026175"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3941">
+      <stop
+         style="stop-color:#af6d02;stop-opacity:1"
+         offset="0"
+         id="stop3943" />
+      <stop
+         style="stop-color:#5f3b00;stop-opacity:1"
+         offset="1"
+         id="stop3945" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3941"
+       id="linearGradient3947"
+       x1="15.917198"
+       y1="16.659033"
+       x2="16.463091"
+       y2="20.489477"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7894737,0,0,0.7,-1.473684,0.4500012)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4003">
+      <stop
+         style="stop-color:#c17d11;stop-opacity:1"
+         offset="0"
+         id="stop4005" />
+      <stop
+         style="stop-color:#e9b96e;stop-opacity:1"
+         offset="1"
+         id="stop4007" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4003"
+       id="linearGradient4009"
+       x1="16.815628"
+       y1="16.941942"
+       x2="10.718681"
+       y2="16.941942"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7894737,0,0,0.7,-1.473684,0.4500012)" />
+    <filter
+       inkscape:collect="always"
+       id="filter4540"
+       x="-0.087152615"
+       width="1.1743052"
+       y="-0.21174857"
+       height="1.4234971">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.37221428"
+         id="feGaussianBlur4542" />
+    </filter>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 8 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="16 : 8 : 1"
+       inkscape:persp3d-origin="8 : 5.3333333 : 1"
+       id="perspective8148" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.197802"
+     inkscape:cx="8"
+     inkscape:cy="8"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="641"
+     inkscape:window-height="669"
+     inkscape:window-x="0"
+     inkscape:window-y="22">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8150" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata8145">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.47499999999999998;fill:#edd400;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter4540);enable-background:accumulate"
+       id="path4466"
+       sodipodi:cx="12.03125"
+       sodipodi:cy="4.265625"
+       sodipodi:rx="5.125"
+       sodipodi:ry="2.109375"
+       d="M 17.15625,4.265625 A 5.125,2.109375 0 1 1 6.90625,4.265625 A 5.125,2.109375 0 1 1 17.15625,4.265625 z"
+       transform="matrix(1.3658536,0,0,1.1656218,-8.4329267,-2.4721054)" />
+    <path
+       style="fill:url(#linearGradient4009);fill-opacity:1;stroke:url(#linearGradient3947);stroke-width:1.00000072000000007;stroke-miterlimit:4;stroke-opacity:1"
+       d="m 0.50000029,9.8437508 0,3.5562497 C 0.50000029,14.5592 3.8600006,15.5 8.0000002,15.5 12.14,15.5 15.5,14.559199 15.5,13.4 l 0,-3.5562497 z"
+       id="path3936"
+       sodipodi:nodetypes="ccsccc" />
+    <rect
+       style="opacity:0.26499999000000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect4624"
+       width="2"
+       height="3"
+       x="3"
+       y="11" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0054175"
+       inkscape:original="M 2.5 11.5 L 2.5 18.5 C 2.5 20.155999 6.7560004 21.5 12 21.5 C 17.243999 21.5 21.5 20.155998 21.5 18.5 L 21.5 11.5 L 2.5 11.5 z "
+       style="fill:none;stroke:url(#linearGradient4054);stroke-width:1.44648218000000006;stroke-miterlimit:4;stroke-opacity:1"
+       id="path3983"
+       d="m 3.5,12.5 0,6 c 0,-0.016662 0.0034472,0.121066 0.34375,0.375 0.3403028,0.253934 0.9602178,0.531845 1.75,0.78125 C 7.1733144,20.15506 9.4638941,20.5 12,20.5 c 2.536106,0 4.826685,-0.34494 6.40625,-0.84375 0.789782,-0.249405 1.409697,-0.527316 1.75,-0.78125 C 20.496553,18.621066 20.5,18.483337 20.5,18.5 l 0,-6 z"
+       transform="matrix(0.7647058,0,0,0.6249999,-1.1764702,1.6875019)" />
+    <rect
+       style="opacity:0.83499995000000005;color:#000000;fill:#8f5902;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect4056"
+       width="1"
+       height="3"
+       x="6"
+       y="11"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       style="opacity:0.83499995000000005;color:#000000;fill:#8f5902;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect4078"
+       width="1"
+       height="3"
+       x="3"
+       y="10"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       style="opacity:0.83499995000000005;color:#000000;fill:#8f5902;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect4131"
+       width="1"
+       height="3"
+       x="12"
+       y="10"
+       rx="0.5"
+       ry="0.5" />
+    <rect
+       style="opacity:0.26499999000000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect2655"
+       width="2"
+       height="3"
+       x="10"
+       y="11" />
+    <rect
+       style="opacity:0.26499999000000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect2664"
+       width="2"
+       height="2"
+       x="13"
+       y="11" />
+    <rect
+       style="opacity:0.26499999000000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect2646"
+       width="2"
+       height="3"
+       x="7"
+       y="12" />
+    <rect
+       style="opacity:0.83499995000000005;color:#000000;fill:#8f5902;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect4140"
+       width="1"
+       height="3"
+       x="8"
+       y="10"
+       rx="0.5"
+       ry="0.5" />
+    <path
+       style="fill:#eeeeec;fill-opacity:1;stroke:url(#linearGradient4164);stroke-width:1.00000059999999991;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 15.500001,9.5000002 C 15.500001,10.604 12.139999,11.5 8,11.5 3.8600003,11.5 0.5000003,10.604 0.5000003,9.5000004 0.5000003,8.3960006 3.8600004,7.5000001 8,7.5000001 c 4.140001,0 7.500001,0.89600032 7.500001,2.0000001 z"
+       id="path1307" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.0051613"
+       inkscape:original="M 12 8.5 C 6.7560004 8.5 2.5000001 9.844 2.5 11.5 C 2.5 13.155999 6.7560004 14.5 12 14.5 C 17.243999 14.5 21.5 13.155999 21.5 11.5 C 21.5 9.844 17.244 8.5000008 12 8.5 z "
+       xlink:href="#path4198"
+       style="fill:url(#linearGradient4394);fill-opacity:1;stroke:#ffffff;stroke-width:1.61721622999999992;stroke-miterlimit:4;stroke-opacity:1"
+       id="path4200"
+       d="M 12,9.5 C 9.4638721,9.5 7.1733501,9.8449289 5.59375,10.34375 4.80395,10.593161 4.1840886,10.87104 3.84375,11.125 3.5034114,11.37896 3.5,11.516552 3.5,11.5 c 0,-0.016553 0.0034113,0.12104 0.34375,0.375 0.3403387,0.25396 0.9601999,0.531839 1.75,0.78125 C 7.1733501,13.155071 9.4638722,13.5 12,13.5 c 2.536128,0 4.82665,-0.344929 6.40625,-0.84375 0.7898,-0.249411 1.409661,-0.52729 1.75,-0.78125 C 20.496589,11.62104 20.5,11.483447 20.5,11.5 c 0,0.016552 -0.003411,-0.12104 -0.34375,-0.375 -0.340339,-0.25396 -0.9602,-0.53184 -1.75,-0.78125 C 16.82665,9.844929 14.536128,9.5000004 12,9.5 z"
+       transform="matrix(0.7647058,0,0,0.4999999,-1.1764702,3.7500016)" />
+    <rect
+       style="opacity:1;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3431);stroke-width:1.00000011999999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3304"
+       width="2"
+       height="4.999999"
+       x="7.5"
+       y="4.500001"
+       rx="1"
+       ry="1" />
+    <rect
+       style="opacity:0.55500033999999998;color:#000000;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3308"
+       width="1"
+       height="1"
+       x="8"
+       y="6" />
+    <rect
+       style="opacity:0.55500033999999998;color:#000000;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3330"
+       width="1"
+       height="1"
+       x="8"
+       y="8" />
+    <rect
+       style="opacity:0.31000000999999999;color:#000000;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3608"
+       width="1"
+       height="1"
+       x="7"
+       y="6" />
+    <rect
+       style="opacity:0.31000000999999999;color:#000000;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3617"
+       width="1"
+       height="1"
+       x="7"
+       y="8" />
+    <rect
+       style="opacity:0.31000000999999999;color:#000000;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3626"
+       width="1"
+       height="1"
+       x="9"
+       y="8" />
+    <rect
+       style="opacity:0.31000000999999999;color:#000000;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3635"
+       width="1"
+       height="1"
+       x="9"
+       y="6" />
+    <path
+       style="fill:url(#linearGradient4306);fill-opacity:1;stroke:url(#linearGradient4308);stroke-width:1.00000119000000010;stroke-miterlimit:4;stroke-opacity:1"
+       d="m 8.9999763,3.4999993 c -0.827986,0 -1.499975,-0.6719998 -1.499975,-1.4999993 0,-0.82799966 0.671989,-1.4999994 1.4999755,-1.4999994 0.5378079,0 0.8279864,2.9999986 0,2.9999987 z"
+       id="path4284"
+       sodipodi:nodetypes="csss" />
+    <path
+       style="fill:url(#linearGradient3046);fill-opacity:1;stroke:url(#linearGradient3048);stroke-width:1.00000119000000010;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 4.9821711,4.4999994 C 4.1541851,4.4999994 3.4821961,3.8279997 3.4821961,3.0000001 C 3.4821961,2.1720004 4.1541851,1.5000007 4.9821711,1.5000007 C 5.5199791,1.5000007 5.8101571,4.4999993 4.9821711,4.4999994 L 4.9821711,4.4999994 z"
+       id="path2289"
+       sodipodi:nodetypes="csss" />
+    <rect
+       style="fill:#6ec31b;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3034);stroke-width:1.00000024000000010;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3469"
+       width="2"
+       height="4"
+       x="3.5"
+       y="5.5"
+       rx="1"
+       ry="1" />
+    <rect
+       style="opacity:0.55500033999999998;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3471"
+       width="1"
+       height="1"
+       x="4"
+       y="5.9999995" />
+    <rect
+       style="opacity:0.55500033999999998;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3473"
+       width="1"
+       height="1"
+       x="4"
+       y="7.9999995" />
+    <rect
+       style="fill:#ad7fa8;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3029);stroke-width:1.00000024000000010;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3533"
+       width="2"
+       height="4"
+       x="11.517806"
+       y="5.5"
+       rx="1"
+       ry="1" />
+    <rect
+       style="opacity:0.55500033999999998;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3535"
+       width="1"
+       height="1"
+       x="12.017806"
+       y="5.9999995" />
+    <rect
+       style="opacity:0.55500033999999998;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3537"
+       width="1"
+       height="1"
+       x="12.017806"
+       y="7.9999995" />
+    <rect
+       style="opacity:0.31000000999999999;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3559"
+       width="1"
+       height="1"
+       x="3"
+       y="6" />
+    <rect
+       style="opacity:0.31000000999999999;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3581"
+       width="1"
+       height="1"
+       x="3"
+       y="8" />
+    <rect
+       style="opacity:0.31000000999999999;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3590"
+       width="1"
+       height="1"
+       x="5"
+       y="8" />
+    <rect
+       style="opacity:0.31000000999999999;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3599"
+       width="1"
+       height="1"
+       x="5"
+       y="6" />
+    <rect
+       style="opacity:0.31000000999999999;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3644"
+       width="1"
+       height="1"
+       x="11.017806"
+       y="6" />
+    <rect
+       style="opacity:0.31000000999999999;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3653"
+       width="1"
+       height="1"
+       x="13.017806"
+       y="6" />
+    <rect
+       style="opacity:0.31000000999999999;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3662"
+       width="1"
+       height="1"
+       x="13.017806"
+       y="8" />
+    <rect
+       style="opacity:0.31000000999999999;fill:#c6d7ed;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3671"
+       width="1"
+       height="1"
+       x="11.017806"
+       y="8" />
+    <path
+       style="fill:url(#linearGradient3005);fill-opacity:1;stroke:url(#linearGradient3007);stroke-width:1.00000119000000010;stroke-miterlimit:4;stroke-opacity:1"
+       d="M 12.999976,4.4999993 C 12.17199,4.4999993 11.500001,3.8279995 11.500001,3 C 11.500001,2.1720003 12.17199,1.5000006 12.999977,1.5000006 C 13.537784,1.5000006 13.827963,4.4999992 12.999977,4.4999993 L 12.999976,4.4999993 z"
+       id="path4348"
+       sodipodi:nodetypes="csss" />
+  </g>
+</svg>
--- a/pidgin/pixmaps/emotes/default/24/Makefile.am	Thu Jul 31 06:23:55 2008 +0000
+++ b/pidgin/pixmaps/emotes/default/24/Makefile.am	Thu Aug 07 16:00:16 2008 +0000
@@ -16,6 +16,7 @@
     boy.png \
     brb.png \
     bulgy-eyes.png \
+    bunny.png \
     bye.png \
     cake.png \
     call-me.png \
Binary file pidgin/pixmaps/emotes/default/24/airplane.png has changed
Binary file pidgin/pixmaps/emotes/default/24/bad.png has changed
Binary file pidgin/pixmaps/emotes/default/24/beer.png has changed
Binary file pidgin/pixmaps/emotes/default/24/bomb.png has changed
Binary file pidgin/pixmaps/emotes/default/24/bowl.png has changed
Binary file pidgin/pixmaps/emotes/default/24/boy.png has changed
Binary file pidgin/pixmaps/emotes/default/24/brb.png has changed
Binary file pidgin/pixmaps/emotes/default/24/bunny.png has changed
Binary file pidgin/pixmaps/emotes/default/24/cake.png has changed
Binary file pidgin/pixmaps/emotes/default/24/camera.png has changed
Binary file pidgin/pixmaps/emotes/default/24/car.png has changed
Binary file pidgin/pixmaps/emotes/default/24/cat.png has changed
Binary file pidgin/pixmaps/emotes/default/24/clock.png has changed
Binary file pidgin/pixmaps/emotes/default/24/coffee.png has changed
Binary file pidgin/pixmaps/emotes/default/24/coins.png has changed
Binary file pidgin/pixmaps/emotes/default/24/console.png has changed
--- a/pidgin/pixmaps/emotes/default/24/default.theme.in	Thu Jul 31 06:23:55 2008 +0000
+++ b/pidgin/pixmaps/emotes/default/24/default.theme.in	Thu Aug 07 16:00:16 2008 +0000
@@ -3,7 +3,6 @@
 Icon=wink.png
 Author=Hylke Bons
 
-
 # Default smileys
 [default]
 smile.png           :)      :-)
@@ -125,6 +124,7 @@
 party.png           <:o)
 eyeroll.png         8-)
 yawn.png            |-) 
+bunny.png           ('.')
 ! skywalker.png     C:-)    c:-)    C:)     c:)
 ! monkey.png        :-(|)  :(|)
 
Binary file pidgin/pixmaps/emotes/default/24/dog.png has changed
Binary file pidgin/pixmaps/emotes/default/24/drink.png has changed
Binary file pidgin/pixmaps/emotes/default/24/film.png has changed
Binary file pidgin/pixmaps/emotes/default/24/girl.png has changed
Binary file pidgin/pixmaps/emotes/default/24/goat.png has changed
Binary file pidgin/pixmaps/emotes/default/24/good.png has changed
Binary file pidgin/pixmaps/emotes/default/24/handcuffs.png has changed
Binary file pidgin/pixmaps/emotes/default/24/lamp.png has changed
Binary file pidgin/pixmaps/emotes/default/24/love-over.png has changed
Binary file pidgin/pixmaps/emotes/default/24/love.png has changed
Binary file pidgin/pixmaps/emotes/default/24/mail.png has changed
Binary file pidgin/pixmaps/emotes/default/24/mobile.png has changed
Binary file pidgin/pixmaps/emotes/default/24/moon.png has changed
Binary file pidgin/pixmaps/emotes/default/24/msn.png has changed
Binary file pidgin/pixmaps/emotes/default/24/musical-note.png has changed
Binary file pidgin/pixmaps/emotes/default/24/phone.png has changed
Binary file pidgin/pixmaps/emotes/default/24/pizza.png has changed
Binary file pidgin/pixmaps/emotes/default/24/plate.png has changed
Binary file pidgin/pixmaps/emotes/default/24/present.png has changed
Binary file pidgin/pixmaps/emotes/default/24/rain.png has changed
Binary file pidgin/pixmaps/emotes/default/24/rose-dead.png has changed
Binary file pidgin/pixmaps/emotes/default/24/rose.png has changed
Binary file pidgin/pixmaps/emotes/default/24/sheep.png has changed
Binary file pidgin/pixmaps/emotes/default/24/soccerball.png has changed
Binary file pidgin/pixmaps/emotes/default/24/star.png has changed
Binary file pidgin/pixmaps/emotes/default/24/sun.png has changed
Binary file pidgin/pixmaps/emotes/default/24/thunder.png has changed
Binary file pidgin/pixmaps/emotes/default/24/turtle.png has changed
Binary file pidgin/pixmaps/emotes/default/24/umbrella.png has changed
Binary file pidgin/pixmaps/toolbar/16/emote-select.png has changed
--- a/pidgin/pixmaps/toolbar/16/scalable/emote-select.svg	Thu Jul 31 06:23:55 2008 +0000
+++ b/pidgin/pixmaps/toolbar/16/scalable/emote-select.svg	Thu Aug 07 16:00:16 2008 +0000
@@ -2,113 +2,26 @@
 <!-- Created with Inkscape (http://www.inkscape.org/) -->
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:cc="http://creativecommons.org/ns#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16px"
-   height="16px"
-   id="svg4346"
+   id="svg2"
    sodipodi:version="0.32"
-   inkscape:version="0.44.1"
-   sodipodi:docbase="/home/hbons/Desktop/pidgin improvements"
-   sodipodi:docname="inser-emote.svg"
-   inkscape:export-filename="/home/hbons/Desktop/pidgin improvements/insert-emote.png"
+   inkscape:version="0.46"
+   width="16"
+   height="16"
+   version="1.0"
+   sodipodi:docname="emote-select.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/hbons/Pidgin objects refresh/emote-select.png"
    inkscape:export-xdpi="90"
    inkscape:export-ydpi="90">
-  <defs
-     id="defs4348">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient5269">
-      <stop
-         style="stop-color:#fcaf3e;stop-opacity:1;"
-         offset="0"
-         id="stop5271" />
-      <stop
-         style="stop-color:#fcaf3e;stop-opacity:0;"
-         offset="1"
-         id="stop5273" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3104">
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:1;"
-         offset="0"
-         id="stop3106" />
-      <stop
-         style="stop-color:#eeeeec;stop-opacity:0;"
-         offset="1"
-         id="stop3108" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3104"
-       id="radialGradient3114"
-       cx="5.7434092"
-       cy="16.737026"
-       fx="5.7434092"
-       fy="16.737026"
-       r="9.975256"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-1.30241,1.304442,-1.325199,-1.323009,41.46631,16.11711)" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3150">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop3152" />
-      <stop
-         style="stop-color:#2e3436;stop-opacity:0;"
-         offset="1"
-         id="stop3154" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3150"
-       id="radialGradient3156"
-       cx="10.748654"
-       cy="10.457643"
-       fx="10.748654"
-       fy="10.457643"
-       r="6.6449099"
-       gradientTransform="matrix(-0.842757,0,0,-0.35721,19.80716,14.19321)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5269"
-       id="linearGradient5275"
-       x1="26.243328"
-       y1="13.001364"
-       x2="26.243328"
-       y2="10.507664"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="31.392433"
-     inkscape:cx="14.469085"
-     inkscape:cy="9.6077349"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1274"
-     inkscape:window-height="966"
-     inkscape:window-x="3"
-     inkscape:window-y="25" />
   <metadata
-     id="metadata4351">
+     id="metadata7">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
@@ -118,84 +31,573 @@
       </cc:Work>
     </rdf:RDF>
   </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#fce94f;fill-opacity:1;stroke:#f57900;stroke-width:1.53872597;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path1307"
-       sodipodi:cx="11.806158"
-       sodipodi:cy="10.983024"
-       sodipodi:rx="9.975256"
-       sodipodi:ry="9.975256"
-       d="M 21.781414 10.983024 A 9.975256 9.975256 0 1 1  1.8309021,10.983024 A 9.975256 9.975256 0 1 1  21.781414 10.983024 z"
-       transform="matrix(0.651503,0,0,0.651499,-0.691896,-0.15554)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:0.79545456;fill:url(#radialGradient3114);fill-opacity:1;stroke:none;stroke-width:1.05274069;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path3102"
-       sodipodi:cx="11.806158"
-       sodipodi:cy="10.983024"
-       sodipodi:rx="9.975256"
-       sodipodi:ry="9.975256"
-       d="M 21.781414 10.983024 A 9.975256 9.975256 0 1 1  1.8309021,10.983024 A 9.975256 9.975256 0 1 1  21.781414 10.983024 z"
-       transform="matrix(0.601488,0,0,0.601488,-0.101266,0.39384)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:0.5;fill:none;fill-opacity:1;stroke:white;stroke-width:1.81368434;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path2184"
-       sodipodi:cx="11.806158"
-       sodipodi:cy="10.983024"
-       sodipodi:rx="9.975256"
-       sodipodi:ry="9.975256"
-       d="M 21.781414 10.983024 A 9.975256 9.975256 0 1 1  1.8309021,10.983024 A 9.975256 9.975256 0 1 1  21.781414 10.983024 z"
-       transform="matrix(0.551364,0,0,0.551364,0.490507,0.944359)" />
-    <path
-       style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 15.725806,10.961292 C 15.725806,15.032532 14.403819,17 12,17 C 9.596182,17 8.1945569,15.02924 8.1945569,10.961292 C 9.1602707,14.990359 9.904443,15.152467 12,15.152467 C 14.095556,15.152468 14.914933,15.003949 15.725806,10.961292 z "
-       id="path2186"
-       sodipodi:nodetypes="cscsc"
-       transform="matrix(1.062241,0,0,0.5,-5.704588,1.519354)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path2191"
-       sodipodi:cx="9.0598059"
-       sodipodi:cy="8.7845774"
-       sodipodi:rx="1.1679889"
-       sodipodi:ry="1.4520943"
-       d="M 10.227795 8.7845774 A 1.1679889 1.4520943 0 1 1  7.891817,8.7845774 A 1.1679889 1.4520943 0 1 1  10.227795 8.7845774 z"
-       transform="matrix(0.856175,0,0,1.032991,-2.756776,-3.574387)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path2193"
-       sodipodi:cx="9.0598059"
-       sodipodi:cy="8.7845774"
-       sodipodi:rx="1.1679889"
-       sodipodi:ry="1.4520943"
-       d="M 10.227795 8.7845774 A 1.1679889 1.4520943 0 1 1  7.891817,8.7845774 A 1.1679889 1.4520943 0 1 1  10.227795 8.7845774 z"
-       transform="matrix(0.85617,0,0,1.032991,1.243263,-3.574387)" />
-    <image
-       id="image4376"
-       height="16"
-       width="16"
-       sodipodi:absref="/home/hbons/Desktop/pidgin improvements/insert-image.png"
-       xlink:href="insert-image.png"
-       transform="translate(17,-1)" />
-    <path
-       transform="matrix(1.046767,0,0,0.836179,-16.0259,3.13821)"
-       style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06887114;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 22,10 L 29.642574,10 L 25.830275,14.783663 L 22,10 z "
-       id="path4382"
-       sodipodi:nodetypes="cccc" />
-    <path
-       transform="matrix(1.046767,0,0,0.836179,-16.52887,3.138211)"
-       style="fill:url(#linearGradient5275);fill-opacity:1;stroke:#d5680b;stroke-width:1.06887114;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 22,10 L 29.642574,10 L 25.830275,14.783663 L 22,10 z "
-       id="rect4379"
-       sodipodi:nodetypes="cccc" />
-  </g>
+  <defs
+     id="defs5">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3398">
+      <stop
+         style="stop-color:#fe9906;stop-opacity:1;"
+         offset="0"
+         id="stop3400" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop3402" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3390">
+      <stop
+         style="stop-color:#fe9906;stop-opacity:1"
+         offset="0"
+         id="stop3392" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop3394" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3378">
+      <stop
+         style="stop-color:#a64a00;stop-opacity:1;"
+         offset="0"
+         id="stop3380" />
+      <stop
+         style="stop-color:#a64a00;stop-opacity:0;"
+         offset="1"
+         id="stop3382" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3357">
+      <stop
+         style="stop-color:#dd6c00;stop-opacity:1"
+         offset="0"
+         id="stop3359" />
+      <stop
+         style="stop-color:#7c3c00;stop-opacity:1"
+         offset="1"
+         id="stop3361" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective9" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="10.507664"
+       x2="26.243328"
+       y1="13.001364"
+       x1="26.243328"
+       id="linearGradient5275"
+       xlink:href="#linearGradient5269"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.842757,0,0,-0.35721,19.80716,14.19321)"
+       r="6.6449099"
+       fy="10.457643"
+       fx="10.748654"
+       cy="10.457643"
+       cx="10.748654"
+       id="radialGradient3156"
+       xlink:href="#linearGradient3150"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3150"
+       inkscape:collect="always">
+      <stop
+         id="stop3152"
+         offset="0"
+         style="stop-color:#2e3436;stop-opacity:1;" />
+      <stop
+         id="stop3154"
+         offset="1"
+         style="stop-color:#2e3436;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientTransform="matrix(-1.30241,1.304442,-1.325199,-1.323009,41.46631,16.11711)"
+       gradientUnits="userSpaceOnUse"
+       r="9.975256"
+       fy="16.737026"
+       fx="5.7434092"
+       cy="16.737026"
+       cx="5.7434092"
+       id="radialGradient3114"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3104"
+       inkscape:collect="always">
+      <stop
+         id="stop3106"
+         offset="0"
+         style="stop-color:#eeeeec;stop-opacity:1;" />
+      <stop
+         id="stop3108"
+         offset="1"
+         style="stop-color:#eeeeec;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5269"
+       inkscape:collect="always">
+      <stop
+         id="stop5271"
+         offset="0"
+         style="stop-color:#fcaf3e;stop-opacity:1;" />
+      <stop
+         id="stop5273"
+         offset="1"
+         style="stop-color:#fcaf3e;stop-opacity:0;" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective3186"
+       inkscape:persp3d-origin="8 : 5.3333333 : 1"
+       inkscape:vp_z="16 : 8 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 8 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       r="9.975256"
+       fy="14.186539"
+       fx="8.3343515"
+       cy="14.186539"
+       cx="8.3343515"
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2264"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3104"
+       id="radialGradient2233"
+       cx="8.3343515"
+       cy="14.186539"
+       fx="8.3343515"
+       fy="14.186539"
+       r="9.975256"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)" />
+    <radialGradient
+       r="9.975256"
+       fy="14.186539"
+       fx="8.3343515"
+       cy="14.186539"
+       cx="8.3343515"
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2349"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3104"
+       id="radialGradient2303"
+       cx="8.3343515"
+       cy="14.186539"
+       fx="8.3343515"
+       fy="14.186539"
+       r="9.975256"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="17.682426"
+       x2="12.720216"
+       y1="20.952612"
+       x1="12.720216"
+       id="linearGradient2873"
+       xlink:href="#linearGradient2867"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="20.761486"
+       x2="12.746171"
+       y1="18.202251"
+       x1="12.5"
+       id="linearGradient2853"
+       xlink:href="#linearGradient2847"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)"
+       gradientUnits="userSpaceOnUse"
+       r="9.975256"
+       fy="14.186539"
+       fx="8.3343515"
+       cy="14.186539"
+       cx="8.3343515"
+       id="radialGradient2230"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient2382"
+       inkscape:collect="always">
+      <stop
+         id="stop2384"
+         offset="0"
+         style="stop-color:#d3d7cf;stop-opacity:1;" />
+      <stop
+         id="stop2386"
+         offset="1"
+         style="stop-color:#d3d7cf;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2847"
+       inkscape:collect="always">
+      <stop
+         id="stop2849"
+         offset="0"
+         style="stop-color:#888a85;stop-opacity:1;" />
+      <stop
+         id="stop2851"
+         offset="1"
+         style="stop-color:#888a85;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2867"
+       inkscape:collect="always">
+      <stop
+         id="stop2869"
+         offset="0"
+         style="stop-color:#d3d7cf;stop-opacity:1;" />
+      <stop
+         id="stop2871"
+         offset="1"
+         style="stop-color:#d3d7cf;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2382"
+       id="radialGradient2259"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.591138,1.574803,-1.783257,-1.76495,68.854751,-2.8442229)"
+       cx="17.911736"
+       cy="11.083743"
+       fx="17.911736"
+       fy="11.083743"
+       r="2.5781252" />
+    <radialGradient
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)"
+       gradientUnits="userSpaceOnUse"
+       r="9.975256"
+       fy="14.186539"
+       fx="8.3343515"
+       cy="14.186539"
+       cx="8.3343515"
+       id="radialGradient3313"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <radialGradient
+       r="9.975256"
+       fy="14.186539"
+       fx="8.3343515"
+       cy="14.186539"
+       cx="8.3343515"
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient2255"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3104"
+       id="radialGradient2214"
+       cx="8.7359829"
+       cy="18.005522"
+       fx="8.7359829"
+       fy="18.005522"
+       r="9.975256"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.3308754,1.3308124,-1.4391023,-1.4390341,45.391773,16.51952)" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.842757,0,0,-0.35721,19.80716,14.19321)"
+       r="6.6449099"
+       fy="10.457643"
+       fx="10.748654"
+       cy="10.457643"
+       cx="10.748654"
+       id="radialGradient3292"
+       xlink:href="#linearGradient3150"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)"
+       gradientUnits="userSpaceOnUse"
+       r="9.975256"
+       fy="14.186539"
+       fx="8.3343515"
+       cy="14.186539"
+       cx="8.3343515"
+       id="radialGradient3175"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3104"
+       id="radialGradient3191"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.3308754,1.3308124,-1.4391023,-1.4390341,45.391773,16.51952)"
+       cx="8.7359829"
+       cy="18.005522"
+       fx="8.7359829"
+       fy="18.005522"
+       r="9.975256" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="15.449714"
+       x2="10.698112"
+       y1="16.037401"
+       x1="12.845698"
+       id="linearGradient3269"
+       xlink:href="#linearGradient3263"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)"
+       gradientUnits="userSpaceOnUse"
+       r="9.975256"
+       fy="14.186539"
+       fx="8.3343515"
+       cy="14.186539"
+       cx="8.3343515"
+       id="radialGradient2216"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3263"
+       inkscape:collect="always">
+      <stop
+         id="stop3265"
+         offset="0"
+         style="stop-color:#555753;stop-opacity:1;" />
+      <stop
+         id="stop3267"
+         offset="1"
+         style="stop-color:#555753;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3104"
+       id="radialGradient2247"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.3308754,1.3308124,-1.4391023,-1.4390341,45.391773,16.51952)"
+       cx="8.7359829"
+       cy="18.005522"
+       fx="8.7359829"
+       fy="18.005522"
+       r="9.975256" />
+    <radialGradient
+       gradientTransform="matrix(-0.9327,0.932656,-0.947494,-0.947449,33.02126,11.96667)"
+       gradientUnits="userSpaceOnUse"
+       r="9.975256"
+       fy="14.186539"
+       fx="8.3343515"
+       cy="14.186539"
+       cx="8.3343515"
+       id="radialGradient3274"
+       xlink:href="#linearGradient3104"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective3265"
+       inkscape:persp3d-origin="12 : 8 : 1"
+       inkscape:vp_z="24 : 12 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 12 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3104"
+       id="radialGradient3331"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.30241,1.304442,-1.325199,-1.323009,41.46631,16.11711)"
+       cx="5.7434092"
+       cy="16.737026"
+       fx="5.7434092"
+       fy="16.737026"
+       r="9.975256" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3104"
+       id="radialGradient3344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.30241,1.304442,-1.325199,-1.323009,41.46631,16.11711)"
+       cx="5.7434092"
+       cy="16.737026"
+       fx="5.7434092"
+       fy="16.737026"
+       r="9.975256" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3357"
+       id="linearGradient3363"
+       x1="12.549859"
+       y1="12.357164"
+       x2="13.745301"
+       y2="19.751348"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3378"
+       id="radialGradient3384"
+       cx="11.76924"
+       cy="25.560368"
+       fx="11.76924"
+       fy="25.560368"
+       r="9.8412299"
+       gradientTransform="matrix(1.6444693,0,0,1.4596828,-7.5849142,-16.236248)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3390"
+       id="linearGradient3396"
+       x1="5.0167913"
+       y1="6.0080996"
+       x2="5.9832082"
+       y2="6.9919"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3398"
+       id="linearGradient3404"
+       x1="9.9935493"
+       y1="9.1751938"
+       x2="9.4590645"
+       y2="10.073978"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-height="849"
+     inkscape:window-width="1440"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     showgrid="true"
+     inkscape:snap-bbox="true"
+     inkscape:snap-nodes="false"
+     inkscape:zoom="20.32932"
+     inkscape:cx="16.928433"
+     inkscape:cy="11.656784"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:current-layer="svg2">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3156"
+       visible="true"
+       enabled="true" />
+  </sodipodi:namedview>
+  <path
+     sodipodi:type="arc"
+     style="fill:#edd400;fill-opacity:1;stroke:url(#linearGradient3363);stroke-width:1.33355486000000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path3317"
+     sodipodi:cx="11.806158"
+     sodipodi:cy="10.983024"
+     sodipodi:rx="9.975256"
+     sodipodi:ry="9.975256"
+     d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z"
+     transform="matrix(0.751736,0,0,0.751736,-0.8751143,-0.2563346)" />
+  <path
+     sodipodi:type="arc"
+     style="opacity:0.64044948999999995;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.53465486000000007;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path3321"
+     sodipodi:cx="11.806158"
+     sodipodi:cy="10.983024"
+     sodipodi:rx="9.975256"
+     sodipodi:ry="9.975256"
+     d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z"
+     transform="matrix(0.6516124,0,0,0.6516124,0.3069616,0.8433262)" />
+  <path
+     sodipodi:type="arc"
+     style="opacity:0.79545456;fill:url(#radialGradient3344);fill-opacity:1;stroke:none;stroke-width:1.05274069;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path3319"
+     sodipodi:cx="11.806158"
+     sodipodi:cy="10.983024"
+     sodipodi:rx="9.975256"
+     sodipodi:ry="9.975256"
+     d="M 21.781414,10.983024 A 9.975256,9.975256 0 1 1 1.8309021,10.983024 A 9.975256,9.975256 0 1 1 21.781414,10.983024 z"
+     transform="matrix(0.7017364,0,0,0.7017364,-0.2848107,0.2928127)" />
+  <path
+     style="fill:#eeeeec;fill-opacity:1;stroke:url(#linearGradient3396);stroke-width:0.99999987999999995;stroke-miterlimit:4;stroke-opacity:1"
+     d="M 7.5,6.5000001 C 7.5,7.6040001 6.6040006,8.5000002 5.5000006,8.5000002 C 4.3960003,8.5000002 3.4999999,7.6040001 3.4999999,6.5000001 C 3.4999999,5.3959999 4.3960003,4.5 5.5000006,4.5 C 6.6040006,4.5 7.5,5.3959999 7.5,6.5000001 z"
+     id="path3154" />
+  <path
+     sodipodi:type="arc"
+     style="fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path2172"
+     sodipodi:cx="9.7069349"
+     sodipodi:cy="9.6526775"
+     sodipodi:rx="1.0259361"
+     sodipodi:ry="1.9413869"
+     d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z"
+     transform="matrix(0.9747194,0,0,0.5150957,-3.4615376,2.0279472)" />
+  <path
+     sodipodi:type="arc"
+     style="fill:#eeeeec;fill-opacity:1;stroke:url(#linearGradient3404);stroke-width:0.70564497000000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path3152"
+     sodipodi:cx="9.7069349"
+     sodipodi:cy="9.6526775"
+     sodipodi:rx="1.0259361"
+     sodipodi:ry="1.9413869"
+     d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z"
+     transform="matrix(1.9494389,0,0,1.0301914,-8.4230764,-3.4441052)" />
+  <path
+     sodipodi:type="arc"
+     style="opacity:0.75;fill:none;fill-opacity:1;stroke:#ce5c00;stroke-width:0.85073602000000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path2259"
+     sodipodi:cx="8.3258924"
+     sodipodi:cy="9.2232141"
+     sodipodi:rx="1.2276785"
+     sodipodi:ry="1.7410715"
+     d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499"
+     transform="matrix(1.4017776,0.3494647,-0.2648498,0.9196421,1.6361947,-7.2342213)"
+     sodipodi:start="3.5782199"
+     sodipodi:end="5.6135639"
+     sodipodi:open="true" />
+  <path
+     sodipodi:type="arc"
+     style="opacity:0.75;fill:none;fill-opacity:1;stroke:#ce5c00;stroke-width:0.85073620000000005;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path2261"
+     sodipodi:cx="8.3258924"
+     sodipodi:cy="9.2232141"
+     sodipodi:rx="1.2276785"
+     sodipodi:ry="1.7410715"
+     d="M 7.2133909,8.4869402 A 1.2276785,1.7410715 0 0 1 9.288462,8.1425499"
+     transform="matrix(-1.4017777,0.3494645,0.2648498,0.9196416,14.363806,-7.2342154)"
+     sodipodi:start="3.5782199"
+     sodipodi:end="5.6135639"
+     sodipodi:open="true" />
+  <path
+     sodipodi:type="arc"
+     style="fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:0.98640186;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path3346"
+     sodipodi:cx="9.7069349"
+     sodipodi:cy="9.6526775"
+     sodipodi:rx="1.0259361"
+     sodipodi:ry="1.9413869"
+     d="M 10.732871,9.6526775 A 1.0259361,1.9413869 0 1 1 8.6809988,9.6526775 A 1.0259361,1.9413869 0 1 1 10.732871,9.6526775 z"
+     transform="matrix(0.9747195,0,0,0.5150957,0.5384613,2.0279474)" />
+  <path
+     sodipodi:type="arc"
+     style="opacity:1;fill:none;fill-opacity:1;stroke:url(#radialGradient3384);stroke-width:2.21672367999999986;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path3367"
+     sodipodi:cx="11.806158"
+     sodipodi:cy="10.983024"
+     sodipodi:rx="9.975256"
+     sodipodi:ry="9.975256"
+     d="M 20.502108,15.870372 A 9.975256,9.975256 0 0 1 3.0363724,15.736611"
+     transform="matrix(0.4511163,0,0,0.4511162,2.6740503,3.0453797)"
+     sodipodi:start="0.51202919"
+     sodipodi:end="2.6448802"
+     sodipodi:open="true" />
 </svg>
Binary file pidgin/pixmaps/tray/22/tray-away.png has changed
Binary file pidgin/pixmaps/tray/22/tray-busy.png has changed
Binary file pidgin/pixmaps/tray/22/tray-online.png has changed
--- a/po/POTFILES.in	Thu Jul 31 06:23:55 2008 +0000
+++ b/po/POTFILES.in	Thu Aug 07 16:00:16 2008 +0000
@@ -140,10 +140,10 @@
 libpurple/protocols/qq/group_network.c
 libpurple/protocols/qq/group_opt.c
 libpurple/protocols/qq/im.c
-libpurple/protocols/qq/keep_alive.c
-libpurple/protocols/qq/login_logout.c
 libpurple/protocols/qq/qq.c
+libpurple/protocols/qq/qq_base.c
 libpurple/protocols/qq/qq_network.c
+libpurple/protocols/qq/qq_process.c
 libpurple/protocols/qq/send_file.c
 libpurple/protocols/qq/sys_msg.c
 libpurple/protocols/sametime/sametime.c
@@ -174,6 +174,7 @@
 libpurple/protocols/yahoo/ycht.c
 libpurple/protocols/zephyr/zephyr.c
 libpurple/proxy.c
+libpurple/prpl.c
 libpurple/request.h
 libpurple/savedstatuses.c
 libpurple/server.c
--- a/po/de.po	Thu Jul 31 06:23:55 2008 +0000
+++ b/po/de.po	Thu Aug 07 16:00:16 2008 +0000
@@ -11,8 +11,8 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-07-11 17:26+0200\n"
-"PO-Revision-Date: 2008-07-11 17:25+0200\n"
+"POT-Creation-Date: 2008-08-06 17:47+0200\n"
+"PO-Revision-Date: 2008-08-06 17:47+0200\n"
 "Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
 "Language-Team: Deutsch <de@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -652,9 +652,11 @@
 msgid "<AUTO-REPLY> "
 msgstr "<AUTO-REPLY> "
 
-#. Print the list of users in the room
-msgid "List of users:\n"
-msgstr "Liste der Benutzer:\n"
+#, fuzzy, c-format
+msgid "List of %d user:\n"
+msgid_plural "List of %d users:\n"
+msgstr[0] "Liste der Benutzer:\n"
+msgstr[1] "Liste der Benutzer:\n"
 
 msgid "Supported debug options are:  version"
 msgstr "Unterstützte Debug-Optionen sind:  version"
@@ -2230,6 +2232,9 @@
 "Dateiübertragung abgeschlossen ist\n"
 "(nur, wenn es keine Unterhaltung mit dem Sender gibt)"
 
+msgid "Create a new directory for each user"
+msgstr "Für jeden Benutzer ein neues Verzeichnis anlegen"
+
 msgid "Notes"
 msgstr "Notizen"
 
@@ -2873,9 +2878,6 @@
 msgid "Cannot open socket"
 msgstr "Kann die Socket nicht öffnen"
 
-msgid "Error setting socket options"
-msgstr "Fehler beim Setzen der Socket-Optionen"
-
 msgid "Could not bind socket to port"
 msgstr "Kann die Socket nicht an den Port binden"
 
@@ -3218,6 +3220,9 @@
 msgid "Encodings"
 msgstr "Kodierungen"
 
+msgid "Auto-detect incoming UTF-8"
+msgstr "Eingehendes UTF-8 automatisch erkennen"
+
 msgid "Real name"
 msgstr "Echter Name"
 
@@ -3403,6 +3408,9 @@
 "away [Nachricht]:  Setzen Sie eine Abwesenheitsnachricht. Verwenden Sie "
 "keine Nachricht, um wieder zurückzukehren."
 
+msgid "ctcp <nick> <msg>: sends ctcp msg to nick."
+msgstr "ctcp <nick> <anfrage>: Sendet CTCP-Anfrage an nick."
+
 msgid "chanserv: Send a command to chanserv"
 msgstr "chanserv: Sendet ein Kommando zum Chanserv"
 
@@ -4895,8 +4903,21 @@
 msgid "Disallow"
 msgstr "Verbieten"
 
-msgid "This Hotmail account may not be active."
-msgstr "Dieses Hotmail-Konto ist vielleicht nicht aktiv."
+#, c-format
+msgid "Blocked Text for %s"
+msgstr "Blockierter Text für %s"
+
+msgid "No text is blocked for this account."
+msgstr "Für dieses Konto ist kein Text blockiert."
+
+#, c-format
+msgid ""
+"MSN servers are currently blocking the following regular expressions:<br/>%s"
+msgstr ""
+"MSN-Server blockieren momentan die folgenden regulären Ausdrücke:<br/>%s"
+
+msgid "This account does not have email enabled."
+msgstr "Dieses Konto hat E-Mail nicht aktiviert."
 
 msgid "Send a mobile message."
 msgstr "Eine SMS senden."
@@ -4955,6 +4976,9 @@
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Erlaube/verbiete mobile Webseiten..."
 
+msgid "View Blocked Text..."
+msgstr "Blockierten Text anzeigen..."
+
 msgid "Open Hotmail Inbox"
 msgstr "Öffne Hotmail-Posteingang"
 
@@ -5158,16 +5182,8 @@
 msgid "Windows Live ID authentication:Unable to connect"
 msgstr "Windows Live ID-Authentifikation:Kann nicht verbinden"
 
-#. we must have failed!
-msgid ""
-"Windows Live ID authentication: cannot find authenticate token in server "
-"response"
-msgstr ""
-"Windows Live ID Authentifikation: Kann Authenfikationstoken nicht in der "
-"Serverantwort finden"
-
-msgid "Windows Live ID authentication Failed"
-msgstr "Windows Live ID - Authentifikation fehlgeschlagen"
+msgid "Windows Live ID authentication:Invalid response"
+msgstr "Windows Live ID-Authentifikation:Ungültige Antwort"
 
 #, c-format
 msgid "%s is not a valid group."
@@ -5214,6 +5230,9 @@
 msgid "Service Temporarily Unavailable."
 msgstr "Dienst momentan nicht verfügbar."
 
+msgid "Mobile message was not sent because it was too long."
+msgstr "Mobile Nachricht wurde nicht gesendet, da sie zu lang war."
+
 msgid "Unable to rename group"
 msgstr "Kann die Gruppe nicht umbenennen"
 
@@ -5250,6 +5269,28 @@
 "Nach Beendigung der Wartungsarbeiten können Sie sich wieder problemlos "
 "anmelden."
 
+msgid ""
+"Message was not sent because the system is unavailable. This normally "
+"happens when the user is blocked or does not exist."
+msgstr ""
+"Nachricht wurde nicht gesendet, da das System nicht erreichbar ist. Dies "
+"passiert normalerweise, wenn der Benutzer blockiert ist oder nicht existiert."
+
+msgid "Message was not sent because messages are being sent too quickly."
+msgstr ""
+"Nachricht konnte nicht gesendet werden, da Nachrichten zu schnell gesendet "
+"werden."
+
+msgid "Message was not sent because an unknown encoding error occurred."
+msgstr ""
+"Nachricht konnte nicht gesendet werden, da ein unbekannter Kodierungsfehler "
+"aufgetreten ist."
+
+msgid "Message was not sent because an unknown error occurred."
+msgstr ""
+"Nachricht konnte nicht gesendet werden, da ein unbekannter Fehler "
+"aufgetreten ist."
+
 msgid "Unable to connect"
 msgstr "Verbindung nicht möglich"
 
@@ -5379,6 +5420,9 @@
 msgid "The username specified is invalid."
 msgstr "Der angegebene Benutzername ist ungültig."
 
+msgid "This Hotmail account may not be active."
+msgstr "Dieses Hotmail-Konto ist vielleicht nicht aktiv."
+
 msgid "Has you"
 msgstr "Hat Sie"
 
@@ -7321,31 +7365,43 @@
 msgid "Failed to send IM."
 msgstr "Senden der Nachricht fehlgeschlagen."
 
-msgid "Keep alive error"
-msgstr "Fehler beim Aufrechterhalten der Verbindung (Keep alive)"
-
-msgid "Error requesting login token"
-msgstr "Fehler beim Abfragen des Anmelde-Tokens"
-
-msgid "Unable to login. Check debug log."
-msgstr "Anmeldung fehlgeschlagen, Debugmitschnitt beachten."
-
-msgid "Unable to login"
-msgstr "Anmeldung fehlgeschlagen"
-
 #, c-format
 msgid "Unknown-%d"
 msgstr "Unbekannt-%d"
 
-msgid "TCP Address"
-msgstr "TCP-Adresse"
-
-msgid "UDP Address"
-msgstr "UDP-Adresse"
-
 msgid "Level"
 msgstr "Stufe"
 
+msgid "Member"
+msgstr "Mitglied"
+
+msgid " VIP"
+msgstr " VIP"
+
+msgid " TCP"
+msgstr " TCP"
+
+#, fuzzy
+msgid " FromMobile"
+msgstr "Mobil"
+
+#, fuzzy
+msgid " BindMobile"
+msgstr "Mobil"
+
+msgid " Video"
+msgstr " Video"
+
+#, fuzzy
+msgid " Space"
+msgstr "MySpace"
+
+msgid "Flag"
+msgstr ""
+
+msgid "Ver"
+msgstr ""
+
 msgid "Invalid name"
 msgstr "QQ: Ungültiger Name"
 
@@ -7419,6 +7475,23 @@
 msgid "Connect using TCP"
 msgstr "Über TCP verbinden"
 
+msgid "resend interval(s)"
+msgstr ""
+
+#, fuzzy
+msgid "Keep alive interval(s)"
+msgstr "Fehler beim Aufrechterhalten der Verbindung (Keep alive)"
+
+msgid "Update interval(s)"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Invalid token len, %d"
+msgstr "Ungültige Bezeichnung"
+
+msgid "Keep alive error"
+msgstr "Fehler beim Aufrechterhalten der Verbindung (Keep alive)"
+
 msgid "Failed to connect server"
 msgstr "Verbinden zum Server fehlgeschlagen"
 
@@ -7442,9 +7515,6 @@
 msgid "Connection lost"
 msgstr "Verbindung verloren"
 
-msgid "Login failed, no reply"
-msgstr "Anmeldung fehlgeschlagen, keine Antwort"
-
 msgid "Couldn't resolve host"
 msgstr "Kann den Hostnamen nicht auflösen"
 
@@ -7462,6 +7532,16 @@
 msgid "Could not resolve hostname"
 msgstr "Konnte den Hostnamen nicht auflösen"
 
+msgid "Unable to login. Check debug log."
+msgstr "Anmeldung fehlgeschlagen, Debugmitschnitt beachten."
+
+msgid "Unable to login"
+msgstr "Anmeldung fehlgeschlagen"
+
+#, c-format
+msgid "Invalid token reply code, 0x%02X"
+msgstr ""
+
 #, c-format
 msgid "%d has declined the file %s"
 msgstr "%d hat die Datei %s abgelehnt"
@@ -7509,6 +7589,14 @@
 msgid "%s is not in your buddy list"
 msgstr "%s ist nicht in Ihrer Buddy-Liste"
 
+#, fuzzy, c-format
+msgid "Notice from: %s"
+msgstr "Ankündigung von %s"
+
+#, c-format
+msgid "%s"
+msgstr "%s"
+
 msgid "Connection closed (writing)"
 msgstr "Verbindung geschlossen (schreibend)"
 
@@ -9724,6 +9812,14 @@
 msgid "Could not resolve host name"
 msgstr "Kann den Hostnamen nicht auflösen"
 
+#, c-format
+msgid "Requesting %s's attention..."
+msgstr "Bitte um %ss Aufmerksamkeit..."
+
+#, c-format
+msgid "%s has requested your attention!"
+msgstr "%s hat um Ihre Aufmerksamkeit gebeten!"
+
 #. *
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
 #.
@@ -9753,14 +9849,6 @@
 msgstr "%s heißt jetzt %s.\n"
 
 #, c-format
-msgid "Requesting %s's attention..."
-msgstr "Bitte um %s's Aufmerksamkeit..."
-
-#, c-format
-msgid "%s has requested your attention!"
-msgstr "%s hat um Ihre Aufmerksamkeit gebeten!"
-
-#, c-format
 msgid ""
 "%s has invited %s to the chat room %s:\n"
 "%s"
@@ -9956,6 +10044,10 @@
 msgid "Connection refused."
 msgstr "Verbindung abgelehnt."
 
+#. 10048
+msgid "Address already in use."
+msgstr "Adresse wird bereits benutzt."
+
 msgid "Internet Messenger"
 msgstr "Internet-Sofortnachrichtendienst"
 
@@ -10906,6 +10998,10 @@
 msgid "developer"
 msgstr "Entwickler"
 
+#. feel free to not translate this
+msgid "Ka-Hing Cheung"
+msgstr "Ka-Hing Cheung"
+
 msgid "support"
 msgstr "Support"
 
--- a/po/fi.po	Thu Jul 31 06:23:55 2008 +0000
+++ b/po/fi.po	Thu Aug 07 16:00:16 2008 +0000
@@ -10,8 +10,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-05-07 12:09+0300\n"
-"PO-Revision-Date: 2008-05-07 12:09+0300\n"
+"POT-Creation-Date: 2008-08-06 16:01+0300\n"
+"PO-Revision-Date: 2008-08-06 16:01+0300\n"
 "Last-Translator: Timo Jyrinki <timo.jyrinki@iki.fi>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
@@ -21,17 +21,13 @@
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
-#: ../finch/finch.c:64 ../finch/finch.c:300 ../finch/finch.c:329
-#: ../finch/finch.c:417
 msgid "Finch"
 msgstr "Finch"
 
-#: ../finch/finch.c:206
 #, c-format
 msgid "%s. Try `%s -h' for more information.\n"
 msgstr "%s. Kirjoita \"%s -h\" saadaksesi lisää tietoja.\n"
 
-#: ../finch/finch.c:208
 #, c-format
 msgid ""
 "%s\n"
@@ -52,7 +48,6 @@
 "  -n, --nologin       älä kirjaudu automaattisesti\n"
 "  -v, --version       näytä nykyinen versionumero ja poistu\n"
 
-#: ../finch/finch.c:327 ../pidgin/gtkmain.c:738
 #, c-format
 msgid ""
 "%s encountered errors migrating your settings from %s to %s. Please "
@@ -63,254 +58,105 @@
 "Tutki asiaa ja suorita asetusten siirto käsin. Ilmoita tästä ongelmasta "
 "osoitteessa http://developer.pidgin.im/"
 
-#: ../finch/gntaccount.c:124 ../finch/gntaccount.c:484 ../finch/gntblist.c:595
-#: ../finch/gntblist.c:759 ../finch/gntblist.c:772 ../finch/gntplugin.c:196
-#: ../finch/gntplugin.c:244 ../finch/gntrequest.c:380 ../finch/gntstatus.c:301
-#: ../finch/gntstatus.c:310 ../finch/plugins/gntclipboard.c:115
-#: ../finch/plugins/gntclipboard.c:121 ../finch/plugins/gntclipboard.c:128
-#: ../libpurple/protocols/jabber/buddy.c:2079
-#: ../libpurple/protocols/jabber/chat.c:682
-#: ../libpurple/protocols/jabber/chat.c:693
-#: ../libpurple/protocols/jabber/jabber.c:1594
-#: ../libpurple/protocols/qq/group_join.c:328
-#: ../libpurple/protocols/qq/im.c:576 ../libpurple/protocols/silc/ops.c:76
-#: ../libpurple/protocols/silc/ops.c:1473
-#: ../libpurple/protocols/silc10/ops.c:1451
 msgid "Error"
 msgstr "Virhe"
 
-#: ../finch/gntaccount.c:124
 msgid "Account was not added"
 msgstr "Käyttäjätiliä ei lisätty"
 
-#: ../finch/gntaccount.c:125
 msgid "Username of an account must be non-empty."
 msgstr "Käyttäjätilin käyttäjänimi ei voi olla tyhjä."
 
-#: ../finch/gntaccount.c:437
 msgid "New mail notifications"
 msgstr "Ilmoita uudesta sähköpostista"
 
-#: ../finch/gntaccount.c:447
 msgid "Remember password"
 msgstr "Muista salasana"
 
-#: ../finch/gntaccount.c:485
 msgid "There's no protocol plugins installed."
 msgstr "Yhteyskäytäntöliitännäisiä ei ole asennettu."
 
-#: ../finch/gntaccount.c:486
 msgid "(You probably forgot to 'make install'.)"
 msgstr "(Unohdit luultavasti suorittaa \"make install\".)"
 
-#: ../finch/gntaccount.c:496 ../finch/gntconn.c:138
-#: ../pidgin/gtkaccount.c:1449 ../pidgin/gtkblist.c:4671
 msgid "Modify Account"
 msgstr "Muokkaa tiliä"
 
-#: ../finch/gntaccount.c:496
 msgid "New Account"
 msgstr "Uusi tili"
 
-#: ../finch/gntaccount.c:521 ../pidgin/gtkft.c:696
 msgid "Protocol:"
 msgstr "Yhteyskäytäntö:"
 
-#: ../finch/gntaccount.c:529
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:294
 msgid "Username:"
 msgstr "Käyttäjänimi:"
 
-#: ../finch/gntaccount.c:542
 msgid "Password:"
 msgstr "Salasana:"
 
-#: ../finch/gntaccount.c:552
 msgid "Alias:"
 msgstr "Lempinimi:"
 
+#. Register checkbox
+msgid "Create this account on the server"
+msgstr "Luo tämä käyttäjätili palvelimelle"
+
 #. Cancel button
 #. Cancel
-#: ../finch/gntaccount.c:575 ../finch/gntaccount.c:639
-#: ../finch/gntaccount.c:890 ../finch/gntblist.c:641 ../finch/gntblist.c:747
-#: ../finch/gntblist.c:782 ../finch/gntblist.c:1134 ../finch/gntblist.c:1360
-#: ../finch/gntblist.c:1494 ../finch/gntblist.c:2661 ../finch/gntblist.c:2712
-#: ../finch/gntblist.c:2776 ../finch/gntblist.c:2838 ../finch/gntcertmgr.c:90
-#: ../finch/gntplugin.c:532 ../finch/gntpounce.c:471 ../finch/gntpounce.c:679
-#: ../finch/gntprefs.c:265 ../finch/gntsound.c:1064 ../finch/gntstatus.c:145
-#: ../finch/gntstatus.c:485 ../finch/gntstatus.c:610
-#: ../finch/plugins/gnthistory.c:178 ../libpurple/account.c:1118
-#: ../libpurple/account.c:1437 ../libpurple/account.c:1472
-#: ../libpurple/conversation.c:1235 ../libpurple/plugins/buddynote.c:51
-#: ../libpurple/protocols/gg/gg.c:508 ../libpurple/protocols/gg/gg.c:667
-#: ../libpurple/protocols/gg/gg.c:804 ../libpurple/protocols/gg/gg.c:886
-#: ../libpurple/protocols/jabber/buddy.c:758
-#: ../libpurple/protocols/jabber/buddy.c:2473
-#: ../libpurple/protocols/jabber/buddy.c:2509
-#: ../libpurple/protocols/jabber/chat.c:791
-#: ../libpurple/protocols/jabber/jabber.c:1063
-#: ../libpurple/protocols/jabber/jabber.c:1072
-#: ../libpurple/protocols/jabber/jabber.c:1787
-#: ../libpurple/protocols/jabber/si.c:1118
-#: ../libpurple/protocols/jabber/usermood.c:199
-#: ../libpurple/protocols/jabber/usernick.c:78
-#: ../libpurple/protocols/jabber/xdata.c:403
-#: ../libpurple/protocols/msn/msn.c:301 ../libpurple/protocols/msn/msn.c:318
-#: ../libpurple/protocols/msn/msn.c:335 ../libpurple/protocols/msn/msn.c:352
-#: ../libpurple/protocols/msn/msn.c:373 ../libpurple/protocols/msnp9/msn.c:284
-#: ../libpurple/protocols/msnp9/msn.c:301
-#: ../libpurple/protocols/msnp9/msn.c:318
-#: ../libpurple/protocols/msnp9/msn.c:335
-#: ../libpurple/protocols/msnp9/msn.c:356
-#: ../libpurple/protocols/myspace/user.c:582
-#: ../libpurple/protocols/myspace/user.c:676
-#: ../libpurple/protocols/oscar/oscar.c:6207
-#: ../libpurple/protocols/oscar/peer.c:1048
-#: ../libpurple/protocols/qq/buddy_info.c:525
-#: ../libpurple/protocols/qq/buddy_opt.c:214
-#: ../libpurple/protocols/qq/buddy_opt.c:411
-#: ../libpurple/protocols/qq/group.c:124
-#: ../libpurple/protocols/qq/group_join.c:140
-#: ../libpurple/protocols/qq/group_join.c:365
-#: ../libpurple/protocols/qq/group_opt.c:120
-#: ../libpurple/protocols/qq/group_opt.c:375
-#: ../libpurple/protocols/qq/sys_msg.c:115
-#: ../libpurple/protocols/qq/sys_msg.c:175
-#: ../libpurple/protocols/qq/sys_msg.c:269
-#: ../libpurple/protocols/sametime/sametime.c:3440
-#: ../libpurple/protocols/sametime/sametime.c:3526
-#: ../libpurple/protocols/sametime/sametime.c:3700
-#: ../libpurple/protocols/sametime/sametime.c:5453
-#: ../libpurple/protocols/sametime/sametime.c:5543
-#: ../libpurple/protocols/sametime/sametime.c:5668
-#: ../libpurple/protocols/silc/buddy.c:455
-#: ../libpurple/protocols/silc/buddy.c:1079
-#: ../libpurple/protocols/silc/buddy.c:1194
-#: ../libpurple/protocols/silc/chat.c:619
-#: ../libpurple/protocols/silc/chat.c:753
-#: ../libpurple/protocols/silc/ops.c:1833
-#: ../libpurple/protocols/silc/silc.c:1039
-#: ../libpurple/protocols/silc/silc.c:1247
-#: ../libpurple/protocols/silc10/buddy.c:468
-#: ../libpurple/protocols/silc10/buddy.c:1087
-#: ../libpurple/protocols/silc10/buddy.c:1192
-#: ../libpurple/protocols/silc10/chat.c:600
-#: ../libpurple/protocols/silc10/chat.c:730
-#: ../libpurple/protocols/silc10/ops.c:1910
-#: ../libpurple/protocols/silc10/silc.c:742
-#: ../libpurple/protocols/silc10/silc.c:948
-#: ../libpurple/protocols/yahoo/yahoo.c:993
-#: ../libpurple/protocols/yahoo/yahoo.c:3564
-#: ../libpurple/protocols/yahoo/yahoo.c:3575 ../pidgin/gtkaccount.c:1843
-#: ../pidgin/gtkaccount.c:2404 ../pidgin/gtkblist.c:684
-#: ../pidgin/gtkblist.c:6879 ../pidgin/gtkcertmgr.c:197
-#: ../pidgin/gtkdialogs.c:767 ../pidgin/gtkdialogs.c:906
-#: ../pidgin/gtkdialogs.c:998 ../pidgin/gtkdialogs.c:1018
-#: ../pidgin/gtkdialogs.c:1042 ../pidgin/gtkdialogs.c:1064
-#: ../pidgin/gtkdialogs.c:1112 ../pidgin/gtkdialogs.c:1153
-#: ../pidgin/gtkdialogs.c:1209 ../pidgin/gtkdialogs.c:1248
-#: ../pidgin/gtkdialogs.c:1275 ../pidgin/gtkimhtmltoolbar.c:438
-#: ../pidgin/gtklog.c:327 ../pidgin/gtkplugin.c:302 ../pidgin/gtkpounce.c:1113
-#: ../pidgin/gtkprivacy.c:509 ../pidgin/gtkprivacy.c:525
-#: ../pidgin/gtkprivacy.c:550 ../pidgin/gtkprivacy.c:564
-#: ../pidgin/gtkrequest.c:273 ../pidgin/gtksavedstatuses.c:345
-#: ../pidgin/gtkstatusbox.c:1619
 msgid "Cancel"
 msgstr "Peru"
 
 #. Save button
 #. Save
-#: ../finch/gntaccount.c:579 ../finch/gntcertmgr.c:310 ../finch/gntdebug.c:297
-#: ../finch/gntplugin.c:532 ../finch/gntpounce.c:477 ../finch/gntprefs.c:265
-#: ../finch/gntsound.c:1061 ../finch/gntstatus.c:488 ../finch/gntstatus.c:598
-#: ../libpurple/account.c:1471 ../libpurple/plugins/buddynote.c:50
-#: ../libpurple/protocols/jabber/buddy.c:757 ../pidgin/gtkblist.c:684
-#: ../pidgin/gtkdebug.c:746 ../pidgin/gtkrequest.c:279
 msgid "Save"
 msgstr "Tallenna"
 
-#: ../finch/gntaccount.c:632 ../pidgin/gtkaccount.c:1834
-#: ../pidgin/gtksavedstatuses.c:333 ../pidgin/gtkstatusbox.c:1613
 #, c-format
 msgid "Are you sure you want to delete %s?"
 msgstr "Haluatko varmasti poistaa %s:n?"
 
-#: ../finch/gntaccount.c:635
 msgid "Delete Account"
 msgstr "Poista tili"
 
 #. Delete button
-#: ../finch/gntaccount.c:638 ../finch/gntaccount.c:708
-#: ../finch/gntcertmgr.c:318 ../finch/gntpounce.c:678 ../finch/gntpounce.c:741
-#: ../finch/gntstatus.c:144 ../finch/gntstatus.c:210
-#: ../pidgin/gtkaccount.c:1842 ../pidgin/gtklog.c:326
-#: ../pidgin/gtkpounce.c:1112 ../pidgin/gtkrequest.c:276
-#: ../pidgin/gtksavedstatuses.c:344 ../pidgin/gtkstatusbox.c:1618
 msgid "Delete"
 msgstr "Poista"
 
-#: ../finch/gntaccount.c:670 ../finch/gntblist.c:2528 ../finch/gntui.c:94
-#: ../pidgin/gtkaccount.c:2263 ../pidgin/gtkdocklet.c:716
 msgid "Accounts"
 msgstr "Käyttäjätilit"
 
-#: ../finch/gntaccount.c:676
 msgid "You can enable/disable accounts from the following list."
 msgstr ""
 "Voit ottaa käyttöön/pois käytöstä käyttäjätilejä seuraavasta luettelosta."
 
 #. Add button
-#: ../finch/gntaccount.c:699 ../finch/gntaccount.c:889 ../finch/gntblist.c:640
-#: ../finch/gntblist.c:747 ../finch/gntblist.c:782 ../finch/gntblist.c:2947
-#: ../finch/gntcertmgr.c:305 ../finch/gntnotify.c:385 ../finch/gntpounce.c:725
-#: ../finch/gntroomlist.c:274 ../finch/gntstatus.c:199
-#: ../libpurple/protocols/gg/gg.c:885 ../libpurple/protocols/qq/sys_msg.c:116
-#: ../libpurple/protocols/qq/sys_msg.c:176
-#: ../libpurple/protocols/qq/sys_msg.c:270
-#: ../libpurple/protocols/sametime/sametime.c:5542
-#: ../libpurple/protocols/silc/chat.c:618
-#: ../libpurple/protocols/silc10/chat.c:599 ../pidgin/gtkaccount.c:2403
-#: ../pidgin/gtkblist.c:6878 ../pidgin/gtkconv.c:1699
-#: ../pidgin/gtkrequest.c:277
 msgid "Add"
 msgstr "Lisää"
 
 #. Modify button
-#: ../finch/gntaccount.c:704 ../finch/gntpounce.c:733
 msgid "Modify"
 msgstr "Muokkaa"
 
-#: ../finch/gntaccount.c:812 ../pidgin/gtkaccount.c:2350
 #, c-format
 msgid "%s%s%s%s has made %s his or her buddy%s%s"
 msgstr "%s%s%s%s on tehnyt käyttäjästä %s tuttavansa%s%s"
 
-#: ../finch/gntaccount.c:885 ../pidgin/gtkaccount.c:2402
 msgid "Add buddy to your list?"
 msgstr "Lisää tuttava tuttavaluetteloon?"
 
-#: ../finch/gntaccount.c:945 ../pidgin/gtkaccount.c:2460
 #, c-format
 msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s"
 msgstr "%s%s%s%s haluaa lisätä käyttäjän %s tuttavaluetteloonsa%s%s"
 
-#: ../finch/gntaccount.c:970 ../finch/gntaccount.c:973
-#: ../finch/gntaccount.c:1000 ../pidgin/gtkaccount.c:2483
-#: ../pidgin/gtkaccount.c:2490
 msgid "Authorize buddy?"
 msgstr "Valtuuta tuttava?"
 
-#: ../finch/gntaccount.c:977 ../finch/gntaccount.c:1004
-#: ../pidgin/gtkaccount.c:2484 ../pidgin/gtkaccount.c:2491
 msgid "Authorize"
 msgstr "Valtuuta"
 
-#: ../finch/gntaccount.c:978 ../finch/gntaccount.c:1005
-#: ../pidgin/gtkaccount.c:2485 ../pidgin/gtkaccount.c:2492
 msgid "Deny"
 msgstr "Kiellä"
 
-#: ../finch/gntblist.c:265
 #, c-format
 msgid ""
 "Online: %d\n"
@@ -319,12 +165,10 @@
 "Kirjautuneena: %d\n"
 "Yhteensä: %d"
 
-#: ../finch/gntblist.c:274
 #, c-format
 msgid "Account: %s (%s)"
 msgstr "Tili: %s (%s)"
 
-#: ../finch/gntblist.c:286
 #, c-format
 msgid ""
 "\n"
@@ -333,344 +177,182 @@
 "\n"
 "Viimeksi nähty: %s sitten"
 
-#: ../finch/gntblist.c:306 ../pidgin/gtkprefs.c:327
-#: ../pidgin/pixmaps/emotes/default/24/default.theme.in.h:1
 msgid "Default"
 msgstr "Oletus"
 
-#: ../finch/gntblist.c:584
 msgid "You must provide a username for the buddy."
 msgstr "Tuttavan käyttäjänimi on annettava."
 
-#: ../finch/gntblist.c:586
 msgid "You must provide a group."
 msgstr "Ryhmä on määritettävä."
 
-#: ../finch/gntblist.c:588
 msgid "You must select an account."
 msgstr "Käyttäjätili täytyy valita."
 
-#: ../finch/gntblist.c:590
 msgid "The selected account is not online."
 msgstr "Valittu käyttäjätili ei ole linjoilla."
 
-#: ../finch/gntblist.c:595
 msgid "Error adding buddy"
 msgstr "Virhe lisättäessä tuttavaa"
 
-#: ../finch/gntblist.c:622 ../libpurple/protocols/irc/irc.c:974
-#: ../libpurple/protocols/irc/msgs.c:364
-#: ../libpurple/protocols/jabber/jabber.c:974
-#: ../libpurple/protocols/jabber/jabber.c:976
-#: ../libpurple/protocols/oscar/oscar.c:2942
-#: ../libpurple/protocols/oscar/oscar.c:3959
-#: ../libpurple/protocols/silc/buddy.c:1542
-#: ../libpurple/protocols/silc/ops.c:1210
-#: ../libpurple/protocols/silc/ops.c:1213
-#: ../libpurple/protocols/silc/ops.c:1349
-#: ../libpurple/protocols/silc/ops.c:1352
-#: ../libpurple/protocols/silc/silc.c:1221
-#: ../libpurple/protocols/silc10/buddy.c:1542
-#: ../libpurple/protocols/silc10/ops.c:1191
-#: ../libpurple/protocols/silc10/ops.c:1194
-#: ../libpurple/protocols/silc10/ops.c:1340
-#: ../libpurple/protocols/silc10/ops.c:1343
-#: ../libpurple/protocols/silc10/silc.c:922 ../pidgin/gtkaccount.c:1916
-#: ../pidgin/gtksavedstatuses.c:971
 msgid "Username"
 msgstr "Käyttäjänimi"
 
-#: ../finch/gntblist.c:625
 msgid "Alias (optional)"
 msgstr "Lempinimi (valinnainen) "
 
-#: ../finch/gntblist.c:628
 msgid "Add in group"
 msgstr "Lisää ryhmään"
 
-#: ../finch/gntblist.c:632 ../finch/gntblist.c:726 ../finch/gntblist.c:1705
-#: ../finch/gntblist.c:2642 ../finch/gntblist.c:2698 ../finch/gntblist.c:2763
-#: ../finch/gntblist.c:2823 ../finch/gntnotify.c:174 ../finch/gntstatus.c:576
-#: ../libpurple/plugins/idle.c:153 ../libpurple/plugins/idle.c:190
-#: ../pidgin/gtkblist.c:3319 ../pidgin/gtknotify.c:526
-#: ../pidgin/gtkpounce.c:1281 ../pidgin/plugins/gevolution/gevolution.c:447
 msgid "Account"
 msgstr "Tili"
 
-#: ../finch/gntblist.c:638 ../finch/gntblist.c:1183
-#: ../libpurple/protocols/silc/buddy.c:725
-#: ../libpurple/protocols/silc/buddy.c:1030
-#: ../libpurple/protocols/silc/buddy.c:1075
-#: ../libpurple/protocols/silc/buddy.c:1185
-#: ../libpurple/protocols/silc10/buddy.c:737
-#: ../libpurple/protocols/silc10/buddy.c:1036
-#: ../libpurple/protocols/silc10/buddy.c:1083
-#: ../libpurple/protocols/silc10/buddy.c:1183
-#: ../libpurple/protocols/yahoo/yahoo.c:3400 ../pidgin/gtkblist.c:6427
-#: ../pidgin/plugins/gevolution/add_buddy_dialog.c:449
 msgid "Add Buddy"
 msgstr "Lisää tuttava"
 
-#: ../finch/gntblist.c:638
 msgid "Please enter buddy information."
 msgstr "Syötä tuttavan tiedot."
 
-#: ../finch/gntblist.c:694 ../libpurple/blist.c:1237
 msgid "Chats"
 msgstr "Ryhmäkeskustelut"
 
 #. Extract their Name and put it in
-#: ../finch/gntblist.c:732 ../finch/gntblist.c:2637 ../finch/gntblist.c:2693
-#: ../finch/gntblist.c:2818 ../finch/gntroomlist.c:298
-#: ../libpurple/protocols/jabber/jabber.c:991
-#: ../libpurple/protocols/jabber/jabber.c:994
-#: ../libpurple/protocols/msn/msn.c:1754 ../libpurple/protocols/msn/msn.c:1819
-#: ../libpurple/protocols/msn/msn.c:1846
-#: ../libpurple/protocols/msnp9/msn.c:1595
-#: ../libpurple/protocols/msnp9/msn.c:1660
-#: ../libpurple/protocols/msnp9/msn.c:1687
-#: ../libpurple/protocols/qq/buddy_info.c:44 ../pidgin/gtkplugin.c:766
-#: ../pidgin/gtkroomlist.c:749
-#: ../pidgin/plugins/gevolution/add_buddy_dialog.c:132
-#: ../pidgin/plugins/gevolution/assoc-buddy.c:123
 msgid "Name"
 msgstr "Nimi"
 
-#: ../finch/gntblist.c:735 ../finch/gntblist.c:1646
-#: ../libpurple/protocols/msn/msn.c:1573
-#: ../libpurple/protocols/msnp9/msn.c:1413
-#: ../libpurple/protocols/silc/chat.c:609
-#: ../libpurple/protocols/silc10/chat.c:590
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:704
-#: ../libpurple/protocols/zephyr/zephyr.c:792
-#: ../libpurple/protocols/zephyr/zephyr.c:1167 ../pidgin/gtkdialogs.c:1017
-#: ../pidgin/gtkdialogs.c:1041 ../pidgin/gtkdialogs.c:1063
-#: ../pidgin/gtkrequest.c:280
 msgid "Alias"
 msgstr "Lempinimi"
 
-#: ../finch/gntblist.c:738 ../finch/gntblist.c:2963
 msgid "Group"
 msgstr "Ryhmä"
 
-#: ../finch/gntblist.c:742 ../finch/gntblist.c:1150
 msgid "Auto-join"
 msgstr "Liity automaattisesti"
 
-#: ../finch/gntblist.c:745 ../finch/gntblist.c:1185 ../pidgin/gtkblist.c:6792
 msgid "Add Chat"
 msgstr "Lisää ryhmäkeskustelu"
 
-#: ../finch/gntblist.c:746
 msgid "You can edit more information from the context menu later."
 msgstr "Voit muokata lisää tietoja myöhemmin pikavalikosta."
 
-#: ../finch/gntblist.c:759 ../finch/gntblist.c:772
 msgid "Error adding group"
 msgstr "Virhe lisättäessä ryhmää"
 
-#: ../finch/gntblist.c:760
 msgid "You must give a name for the group to add."
 msgstr "Lisättävän ryhmän nimi on annettava."
 
-#: ../finch/gntblist.c:773
 msgid "A group with the name already exists."
 msgstr "Valitun niminen ryhmä on jo olemassa"
 
-#: ../finch/gntblist.c:780 ../finch/gntblist.c:1187
-#: ../libpurple/protocols/sametime/sametime.c:5452
-#: ../libpurple/protocols/sametime/sametime.c:5540 ../pidgin/gtkblist.c:6875
 msgid "Add Group"
 msgstr "Lisää ryhmä"
 
-#: ../finch/gntblist.c:780
 msgid "Enter the name of the group"
 msgstr "Anna ryhmän nimi"
 
-#: ../finch/gntblist.c:1133 ../pidgin/gtkblist.c:683
 msgid "Edit Chat"
 msgstr "Muokkaa ryhmäkeskustelua"
 
-#: ../finch/gntblist.c:1133
 msgid "Please Update the necessary fields."
 msgstr "Päivitä vaaditut kentät."
 
-#: ../finch/gntblist.c:1134 ../finch/gntstatus.c:205
 msgid "Edit"
 msgstr "Muokkaa"
 
-#: ../finch/gntblist.c:1159
 msgid "Edit Settings"
 msgstr "Muokkaa asetuksia"
 
-#: ../finch/gntblist.c:1195 ../pidgin/gtkutils.c:980
 msgid "Information"
 msgstr "Tiedot"
 
-#: ../finch/gntblist.c:1195 ../pidgin/gtkutils.c:980
 msgid "Retrieving..."
 msgstr "Haetaan..."
 
-#: ../finch/gntblist.c:1249 ../finch/gntconv.c:591
-#: ../libpurple/protocols/silc/chat.c:906
-#: ../libpurple/protocols/silc10/chat.c:883
 msgid "Get Info"
 msgstr "Hae tiedot"
 
-#: ../finch/gntblist.c:1253
 msgid "Add Buddy Pounce"
 msgstr "Lisää tuttavailmoitin"
 
 #. if (q_bud && is_online(q_bud->status)) {
-#: ../finch/gntblist.c:1260 ../finch/gntconv.c:603
-#: ../libpurple/protocols/jabber/si.c:1118
-#: ../libpurple/protocols/oscar/oscar.c:655 ../libpurple/protocols/qq/qq.c:588
-#: ../pidgin/gtkconv.c:1647
 msgid "Send File"
 msgstr "Lähetä tiedosto"
 
-#: ../finch/gntblist.c:1267 ../libpurple/protocols/gg/gg.c:1629
-#: ../libpurple/protocols/msn/msn.c:674 ../libpurple/protocols/msnp9/msn.c:562
 msgid "Blocked"
 msgstr "Estetty"
 
-#: ../finch/gntblist.c:1273 ../finch/gntblist.c:1662 ../finch/gntblist.c:2832
 msgid "View Log"
 msgstr "Näytä loki"
 
-#: ../finch/gntblist.c:1355
 #, c-format
 msgid "Please enter the new name for %s"
 msgstr "Anna uusi nimi kohteelle %s"
 
-#: ../finch/gntblist.c:1357 ../finch/gntblist.c:1646
 msgid "Rename"
 msgstr "Nimeä uudelleen"
 
-#: ../finch/gntblist.c:1357
 msgid "Set Alias"
 msgstr "Aseta lempinimi"
 
-#: ../finch/gntblist.c:1358
 msgid "Enter empty string to reset the name."
 msgstr "Syötä tyhjä merkkijono palauttaaksesi oletusnimen."
 
-#: ../finch/gntblist.c:1472
 msgid "Removing this contact will also remove all the buddies in the contact"
 msgstr "Kontaktin poistaminen poistaa myös kaikki kontaktissa olevat tuttavat"
 
-#: ../finch/gntblist.c:1480
 msgid "Removing this group will also remove all the buddies in the group"
 msgstr "Ryhmän poistaminen poistaa myös kaikki ryhmässä olevat tuttavat"
 
-#: ../finch/gntblist.c:1485
 #, c-format
 msgid "Are you sure you want to remove %s?"
 msgstr "Haluatko varmasti poistaa %s:n?"
 
 #. XXX: anything to do with the returned ui-handle?
-#: ../finch/gntblist.c:1488
 msgid "Confirm Remove"
 msgstr "Vahvista poistaminen"
 
-#: ../finch/gntblist.c:1493 ../finch/gntblist.c:1648 ../finch/gntft.c:243
-#: ../pidgin/gtkconv.c:1696 ../pidgin/gtkrequest.c:278
-#: ../pidgin/gtkstatusbox.c:268
 msgid "Remove"
 msgstr "Poista"
 
 #. Buddy List
-#: ../finch/gntblist.c:1622 ../finch/gntblist.c:3004 ../finch/gntprefs.c:258
-#: ../finch/gntui.c:95 ../pidgin/gtkblist.c:5166
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:326
 msgid "Buddy List"
 msgstr "Tuttavat"
 
-#: ../finch/gntblist.c:1653
 msgid "Place tagged"
 msgstr "Paikka merkitty"
 
-#: ../finch/gntblist.c:1658
 msgid "Toggle Tag"
 msgstr "Merkitse/poista merkintä"
 
 #. General
-#: ../finch/gntblist.c:1698 ../libpurple/protocols/gg/gg.c:638
-#: ../libpurple/protocols/gg/gg.c:1052 ../libpurple/protocols/gg/gg.c:1125
-#: ../libpurple/protocols/gg/gg.c:2228
-#: ../libpurple/protocols/jabber/buddy.c:309
-#: ../libpurple/protocols/jabber/buddy.c:1284
-#: ../libpurple/protocols/jabber/buddy.c:2264
-#: ../libpurple/protocols/jabber/buddy.c:2456
-#: ../libpurple/protocols/jabber/jabber.c:1002
-#: ../libpurple/protocols/jabber/jabber.c:1614
-#: ../libpurple/protocols/jabber/jabber.c:1628
-#: ../libpurple/protocols/jabber/jabber.c:1642
-#: ../libpurple/protocols/jabber/jabber.c:1656
-#: ../libpurple/protocols/jabber/jabber.c:1670
-#: ../libpurple/protocols/msn/msn.c:1581 ../libpurple/protocols/msn/msn.c:1757
-#: ../libpurple/protocols/msnp9/msn.c:1421
-#: ../libpurple/protocols/msnp9/msn.c:1598
-#: ../libpurple/protocols/qq/buddy_info.c:43
-#: ../libpurple/protocols/silc/buddy.c:1538
-#: ../libpurple/protocols/silc/ops.c:1016
-#: ../libpurple/protocols/silc/ops.c:1199
-#: ../libpurple/protocols/silc/ops.c:1337
-#: ../libpurple/protocols/silc10/buddy.c:1538
-#: ../libpurple/protocols/silc10/ops.c:1036
-#: ../libpurple/protocols/silc10/ops.c:1179
-#: ../libpurple/protocols/silc10/ops.c:1328
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1073 ../pidgin/gtkblist.c:3343
 msgid "Nickname"
 msgstr "Kutsumanimi"
 
 #. Idle stuff
-#: ../finch/gntblist.c:1720 ../finch/gntprefs.c:261
-#: ../libpurple/protocols/bonjour/bonjour.c:376
-#: ../libpurple/protocols/jabber/buddy.c:817
-#: ../libpurple/protocols/jabber/buddy.c:981
-#: ../libpurple/protocols/msn/msn.c:621 ../libpurple/protocols/msn/msn.c:639
-#: ../libpurple/protocols/msn/msn.c:647 ../libpurple/protocols/msn/state.c:32
-#: ../libpurple/protocols/msnp9/msn.c:541
-#: ../libpurple/protocols/msnp9/state.c:32
-#: ../libpurple/protocols/novell/novell.c:2843
-#: ../libpurple/protocols/oscar/oscar.c:2966
-#: ../libpurple/protocols/yahoo/yahoo.c:3154
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:710 ../pidgin/gtkblist.c:3371
-#: ../pidgin/gtkblist.c:3831 ../pidgin/gtkprefs.c:2056
 msgid "Idle"
 msgstr "Jouten"
 
-#: ../finch/gntblist.c:1734
 msgid "On Mobile"
 msgstr "Liikkeellä"
 
-#: ../finch/gntblist.c:2035 ../pidgin/gtkdocklet.c:582
 msgid "New..."
 msgstr "Uusi..."
 
-#: ../finch/gntblist.c:2042 ../pidgin/gtkdocklet.c:583
 msgid "Saved..."
 msgstr "Tallennettu..."
 
-#: ../finch/gntblist.c:2496 ../finch/gntplugin.c:352 ../finch/gntui.c:100
-#: ../pidgin/gtkdocklet.c:717 ../pidgin/gtkplugin.c:715
 msgid "Plugins"
 msgstr "Liitännäiset"
 
-#: ../finch/gntblist.c:2650 ../finch/gntblist.c:2655
 msgid "Block/Unblock"
 msgstr "Estä/poista esto"
 
-#: ../finch/gntblist.c:2651 ../libpurple/protocols/gg/gg.c:1665
 msgid "Block"
 msgstr "Estä"
 
-#: ../finch/gntblist.c:2652 ../libpurple/protocols/gg/gg.c:1661
 msgid "Unblock"
 msgstr "Poista esto"
 
-#: ../finch/gntblist.c:2657
 msgid ""
 "Please enter the username or alias of the person you would like to Block/"
 "Unblock."
@@ -681,156 +363,92 @@
 #. Not multiline
 #. Not masked?
 #. No hints?
-#: ../finch/gntblist.c:2660 ../finch/gntblist.c:2711 ../finch/gntblist.c:2837
-#: ../finch/gntcertmgr.c:89 ../finch/gntconn.c:137 ../finch/gntnotify.c:80
-#: ../finch/plugins/gnthistory.c:177 ../libpurple/account.c:1117
-#: ../libpurple/account.c:1436 ../libpurple/protocols/gg/gg.c:507
-#: ../libpurple/protocols/gg/gg.c:666 ../libpurple/protocols/gg/gg.c:803
-#: ../libpurple/protocols/jabber/jabber.c:1786
-#: ../libpurple/protocols/jabber/xdata.c:402
-#: ../libpurple/protocols/msn/msn.c:300 ../libpurple/protocols/msn/msn.c:317
-#: ../libpurple/protocols/msn/msn.c:334 ../libpurple/protocols/msn/msn.c:351
-#: ../libpurple/protocols/msnp9/msn.c:283
-#: ../libpurple/protocols/msnp9/msn.c:300
-#: ../libpurple/protocols/msnp9/msn.c:317
-#: ../libpurple/protocols/msnp9/msn.c:334
-#: ../libpurple/protocols/myspace/user.c:581
-#: ../libpurple/protocols/myspace/user.c:675
-#: ../libpurple/protocols/oscar/oscar.c:6206
-#: ../libpurple/protocols/silc/buddy.c:454
-#: ../libpurple/protocols/silc/buddy.c:1193
-#: ../libpurple/protocols/silc/chat.c:448
-#: ../libpurple/protocols/silc/chat.c:485
-#: ../libpurple/protocols/silc/chat.c:752
-#: ../libpurple/protocols/silc/ops.c:1306
-#: ../libpurple/protocols/silc/ops.c:1832
-#: ../libpurple/protocols/silc/silc.c:1038
-#: ../libpurple/protocols/silc10/buddy.c:467
-#: ../libpurple/protocols/silc10/buddy.c:1191
-#: ../libpurple/protocols/silc10/chat.c:425
-#: ../libpurple/protocols/silc10/chat.c:464
-#: ../libpurple/protocols/silc10/chat.c:729
-#: ../libpurple/protocols/silc10/ops.c:1297
-#: ../libpurple/protocols/silc10/ops.c:1909
-#: ../libpurple/protocols/silc10/silc.c:741
-#: ../libpurple/protocols/yahoo/yahoo.c:992
-#: ../libpurple/protocols/yahoo/yahoo.c:3563
-#: ../libpurple/protocols/yahoo/yahoo.c:3574 ../pidgin/gtkcertmgr.c:195
-#: ../pidgin/gtkdialogs.c:766 ../pidgin/gtkdialogs.c:905
-#: ../pidgin/gtkdialogs.c:997 ../pidgin/gtkrequest.c:272
 msgid "OK"
 msgstr "OK"
 
-#: ../finch/gntblist.c:2706 ../pidgin/gtkdialogs.c:761
 msgid "New Instant Message"
 msgstr "Uusi pikaviesti"
 
-#: ../finch/gntblist.c:2708 ../pidgin/gtkdialogs.c:763
 msgid "Please enter the username or alias of the person you would like to IM."
 msgstr ""
 "Syötä sen henkilön käyttäjänimi tai lempinimi, jolle haluat lähettää "
 "pikaviestin."
 
-#: ../finch/gntblist.c:2759
 msgid "Channel"
 msgstr "Kanava"
 
-#: ../finch/gntblist.c:2771 ../pidgin/gtkblist.c:1036
 msgid "Join a Chat"
 msgstr "Liity ryhmäkeskusteluun"
 
-#: ../finch/gntblist.c:2773
 msgid "Please enter the name of the chat you want to join."
 msgstr "Syötä liityttävän ryhmäkeskustelun nimi."
 
-#: ../finch/gntblist.c:2775 ../finch/gntnotify.c:394
 msgid "Join"
 msgstr "Liity"
 
-#: ../finch/gntblist.c:2834 ../pidgin/gtkdialogs.c:994
 msgid ""
 "Please enter the username or alias of the person whose log you would like to "
 "view."
 msgstr "Syötä sen henkilön käyttäjänimi jonka lokia haluat katsella."
 
 #. Create the "Options" frame.
-#: ../finch/gntblist.c:2882 ../finch/gntpounce.c:459 ../pidgin/gtkpounce.c:802
 msgid "Options"
 msgstr "Valinnat"
 
-#: ../finch/gntblist.c:2888
 msgid "Send IM..."
 msgstr "Lähetä pikaviesti..."
 
-#: ../finch/gntblist.c:2893
 msgid "Block/Unblock..."
 msgstr "Estä/poista esto..."
 
-#: ../finch/gntblist.c:2898
 msgid "Join Chat..."
 msgstr "Liity ryhmäkeskusteluun..."
 
-#: ../finch/gntblist.c:2903 ../finch/gntconv.c:611
 msgid "View Log..."
 msgstr "Näytä loki..."
 
-#: ../finch/gntblist.c:2908
+msgid "View All Logs"
+msgstr "Näytä kaikki lokit"
+
 msgid "Show"
 msgstr "Näytä"
 
-#: ../finch/gntblist.c:2913
 msgid "Empty groups"
 msgstr "Tyhjät ryhmät"
 
-#: ../finch/gntblist.c:2920
 msgid "Offline buddies"
 msgstr "Poissa linjoilta olevat tuttavat"
 
-#: ../finch/gntblist.c:2927
 msgid "Sort"
 msgstr "Lajittele"
 
-#: ../finch/gntblist.c:2932
 msgid "By Status"
 msgstr "Tilan mukaan"
 
-#: ../finch/gntblist.c:2937 ../pidgin/gtkblist.c:4322
 msgid "Alphabetically"
 msgstr "Aakkosittain"
 
-#: ../finch/gntblist.c:2942
 msgid "By Log Size"
 msgstr "Lokin koon mukaan"
 
-#: ../finch/gntblist.c:2953
 msgid "Buddy"
 msgstr "Tuttava"
 
-#: ../finch/gntblist.c:2958 ../libpurple/protocols/oscar/oscar.c:649
-#: ../libpurple/protocols/silc/silc.c:984
-#: ../libpurple/protocols/silc/util.c:559
-#: ../libpurple/protocols/silc10/silc.c:685
-#: ../libpurple/protocols/silc10/util.c:553
 msgid "Chat"
 msgstr "Keskustelu"
 
-#: ../finch/gntblist.c:2968 ../finch/plugins/grouping.c:255
 msgid "Grouping"
 msgstr "Ryhmittely"
 
-#: ../finch/gntcertmgr.c:85 ../pidgin/gtkcertmgr.c:188
 msgid "Certificate Import"
 msgstr "Varmenteen tuonti"
 
-#: ../finch/gntcertmgr.c:86 ../pidgin/gtkcertmgr.c:189
 msgid "Specify a hostname"
 msgstr "Määrittele isäntänimi"
 
-#: ../finch/gntcertmgr.c:87 ../pidgin/gtkcertmgr.c:190
 msgid "Type the host name this certificate is for."
 msgstr "Kirjoita se isäntänimi jolle tämä varmenne on tehty."
 
-#: ../finch/gntcertmgr.c:96 ../pidgin/gtkcertmgr.c:210
 #, c-format
 msgid ""
 "File %s could not be imported.\n"
@@ -839,19 +457,15 @@
 "Tiedostoa %s ei voi tuoda.\n"
 "Varmista että tiedosto on luettavissa ja PEM-muodossa.\n"
 
-#: ../finch/gntcertmgr.c:98 ../pidgin/gtkcertmgr.c:212
 msgid "Certificate Import Error"
 msgstr "Varmenteen tuontivirhe"
 
-#: ../finch/gntcertmgr.c:99 ../pidgin/gtkcertmgr.c:213
 msgid "X.509 certificate import failed"
 msgstr "X.509-varmenteen tuonti epäonnistui"
 
-#: ../finch/gntcertmgr.c:109 ../pidgin/gtkcertmgr.c:224
 msgid "Select a PEM certificate"
 msgstr "Valitse PEM-varmenne"
 
-#: ../finch/gntcertmgr.c:126 ../pidgin/gtkcertmgr.c:245
 #, c-format
 msgid ""
 "Export to file %s failed.\n"
@@ -860,24 +474,19 @@
 "Tiedostoon %s vienti epäonnistui.\n"
 "Tarkista että kohdepolkuun on kirjoitusoikeudet\n"
 
-#: ../finch/gntcertmgr.c:128 ../pidgin/gtkcertmgr.c:247
 msgid "Certificate Export Error"
 msgstr "Varmenteen vientivirhe"
 
-#: ../finch/gntcertmgr.c:129 ../pidgin/gtkcertmgr.c:248
 msgid "X.509 certificate export failed"
 msgstr "X.509-varmenteen vienti epäonnistui"
 
-#: ../finch/gntcertmgr.c:158 ../pidgin/gtkcertmgr.c:298
 msgid "PEM X.509 Certificate Export"
 msgstr "PEM X.509 -varmenteen vienti"
 
-#: ../finch/gntcertmgr.c:187
 #, c-format
 msgid "Certificate for %s"
 msgstr "Varmenne kohteelle %s"
 
-#: ../finch/gntcertmgr.c:194
 #, c-format
 msgid ""
 "Common name: %s\n"
@@ -890,57 +499,38 @@
 "SHA1-sormenjälki:\n"
 "%s"
 
-#: ../finch/gntcertmgr.c:197
 msgid "SSL Host Certificate"
 msgstr "SSL Host -varmenne"
 
-#: ../finch/gntcertmgr.c:232 ../pidgin/gtkcertmgr.c:371
 #, c-format
 msgid "Really delete certificate for %s?"
 msgstr "Poistetaanko kohteen %s varmenne?"
 
-#: ../finch/gntcertmgr.c:235 ../pidgin/gtkcertmgr.c:373
 msgid "Confirm certificate delete"
 msgstr "Vahvista varmenteen poisto"
 
-#: ../finch/gntcertmgr.c:292 ../pidgin/gtkcertmgr.c:613
 msgid "Certificate Manager"
 msgstr "Varmennehallinta"
 
 #. Creating the user splits
-#: ../finch/gntcertmgr.c:297 ../libpurple/protocols/bonjour/bonjour.c:694
-#: ../libpurple/protocols/silc/silc.c:1223
-#: ../libpurple/protocols/silc10/silc.c:924 ../pidgin/gtkcertmgr.c:446
 msgid "Hostname"
 msgstr "Isäntä"
 
-#: ../finch/gntcertmgr.c:314 ../finch/gntnotify.c:388 ../pidgin/gtkconv.c:1675
-#: ../pidgin/gtkdebug.c:832
 msgid "Info"
 msgstr "Tiedot"
 
 #. Close button
-#: ../finch/gntcertmgr.c:323 ../finch/gntft.c:253 ../finch/gntnotify.c:182
-#: ../finch/gntplugin.c:220 ../finch/gntplugin.c:413 ../finch/gntpounce.c:750
-#: ../finch/gntroomlist.c:275 ../finch/gntstatus.c:216
-#: ../libpurple/protocols/msn/msn.c:417 ../libpurple/protocols/msnp9/msn.c:400
-#: ../libpurple/protocols/silc/util.c:385
-#: ../libpurple/protocols/silc10/util.c:377 ../pidgin/gtkaccount.c:2377
-#: ../pidgin/gtkrequest.c:275
 msgid "Close"
 msgstr "Sulje"
 
-#: ../finch/gntconn.c:126
 #, c-format
 msgid "%s (%s)"
 msgstr "%s (%s)"
 
-#: ../finch/gntconn.c:129
 #, c-format
 msgid "%s disconnected."
 msgstr "Yhteys katkennut kohteeseen %s."
 
-#: ../finch/gntconn.c:130
 #, c-format
 msgid ""
 "%s\n"
@@ -953,11 +543,9 @@
 "Finch ei yritä uudelleenyhdistää käyttäjätiliä kunnes korjaat virheen ja "
 "otat tilin uudelleen käyttöön."
 
-#: ../finch/gntconn.c:139
 msgid "Re-enable Account"
 msgstr "Ota tili uudelleen käyttöön"
 
-#: ../finch/gntconn.c:156
 msgid ""
 "The account has disconnected and you are no longer in this chat. You will be "
 "automatically rejoined in the chat when the account reconnects."
@@ -965,46 +553,36 @@
 "Yhteys käyttäjätiliin on katkennut, etkä ole enää tässä keskustelussa. "
 "Keskusteluun liitytään uudelleen kun käyttäjätili on jälleen yhdistettynä. "
 
-#: ../finch/gntconv.c:159
 msgid "No such command."
 msgstr "Sellaista komentoa ei ole."
 
-#: ../finch/gntconv.c:163 ../pidgin/gtkconv.c:495
 msgid "Syntax Error:  You typed the wrong number of arguments to that command."
 msgstr ""
 "Syntaksivirhe: Syötit väärän määrän argumentteja kyseiselle komennolle."
 
-#: ../finch/gntconv.c:168 ../pidgin/gtkconv.c:501
 msgid "Your command failed for an unknown reason."
 msgstr "Komento epäonnistui tuntemattomasta syystä."
 
-#: ../finch/gntconv.c:173 ../pidgin/gtkconv.c:508
 msgid "That command only works in chats, not IMs."
 msgstr "Komento toimii vain ryhmäkeskusteluissa, ei pikaviesteissä."
 
-#: ../finch/gntconv.c:176 ../pidgin/gtkconv.c:511
 msgid "That command only works in IMs, not chats."
 msgstr "Komento toimii vain pikaviesteissä, ei ryhmäkeskusteluissa."
 
-#: ../finch/gntconv.c:180 ../pidgin/gtkconv.c:516
 msgid "That command doesn't work on this protocol."
 msgstr "Tämä komento ei toimi tälle yhteyskäytännölle."
 
-#: ../finch/gntconv.c:188
 msgid "Message was not sent, because you are not signed on."
 msgstr "Viestiä ei lähetetty, koska ei olla kirjauduttu sisään."
 
-#: ../finch/gntconv.c:268
 #, c-format
 msgid "%s (%s -- %s)"
 msgstr "%s (%s -- %s)"
 
-#: ../finch/gntconv.c:291
 #, c-format
 msgid "%s [%s]"
 msgstr "%s [%s]"
 
-#: ../finch/gntconv.c:296 ../finch/gntconv.c:882 ../pidgin/gtkconv.c:3540
 #, c-format
 msgid ""
 "\n"
@@ -1013,68 +591,71 @@
 "\n"
 "%s kirjoittaa..."
 
-#: ../finch/gntconv.c:315
 msgid "You have left this chat."
 msgstr "Olet poistunut tästä keskustelusta."
 
-#: ../finch/gntconv.c:433 ../pidgin/gtkconv.c:1381
 msgid "Logging started. Future messages in this conversation will be logged."
 msgstr ""
 "Kirjaaminen lokiin aloitettu. Tämän keskustelun viestit kirjataan nyt lokiin."
 
-#: ../finch/gntconv.c:437 ../pidgin/gtkconv.c:1389
 msgid ""
 "Logging stopped. Future messages in this conversation will not be logged."
 msgstr ""
 "Kirjaaminen lokiin lopetettu. Tämän keskustelun viestejä ei enää kirjata "
 "lokiin."
 
-#: ../finch/gntconv.c:523
 msgid "Send To"
 msgstr "Lähetä käyttäjälle"
 
-#: ../finch/gntconv.c:568
+msgid "Invite message"
+msgstr "Kutsuviesti"
+
+msgid "Invite"
+msgstr "Kutsu"
+
+msgid ""
+"Please enter the name of the user you wish to invite,\n"
+"along with an optional invite message."
+msgstr ""
+"Anna kutsuttavan käyttäjän nimi sekä vapaaehtoinen \n"
+"kutsuviesti."
+
 msgid "Conversation"
 msgstr "Keskustelu"
 
-#: ../finch/gntconv.c:574
 msgid "Clear Scrollback"
 msgstr "Tyhjennä takaisinvieritys"
 
-#: ../finch/gntconv.c:578 ../finch/gntprefs.c:191
 msgid "Show Timestamps"
 msgstr "Näytä aikaleimat"
 
-#: ../finch/gntconv.c:596
 msgid "Add Buddy Pounce..."
 msgstr "Lisää tuttavailmoitin..."
 
-#: ../finch/gntconv.c:615
+msgid "Invite..."
+msgstr "Kutsu..."
+
 msgid "Enable Logging"
 msgstr "Ota lokiinkirjaus käyttöön"
 
-#: ../finch/gntconv.c:621
 msgid "Enable Sounds"
 msgstr "Ota äänet käyttöön"
 
-#: ../finch/gntconv.c:835
 msgid "<AUTO-REPLY> "
 msgstr "<AUTOMAATTIVASTAUS> "
 
-#. Print the list of users in the room
-#: ../finch/gntconv.c:970
-msgid "List of users:\n"
-msgstr "Luettelo käyttäjistä:\n"
-
-#: ../finch/gntconv.c:1132 ../pidgin/gtkconv.c:340
+#, c-format
+msgid "List of %d user:\n"
+msgid_plural "List of %d users:\n"
+msgstr[0] "Luettelo %d käyttäjästä:\n"
+msgstr[1] "Luettelo %d käyttäjistä:\n"
+
 msgid "Supported debug options are:  version"
 msgstr "Tuetut vianjäljitysvalinnat ovat: versio"
 
-#: ../finch/gntconv.c:1168 ../pidgin/gtkconv.c:392
 msgid "No such command (in this context)."
 msgstr "Komento ei saatavilla (tässä kontekstissa)."
 
-#: ../finch/gntconv.c:1171 ../pidgin/gtkconv.c:395
 msgid ""
 "Use \"/help &lt;command&gt;\" for help on a specific command.\n"
 "The following commands are available in this context:\n"
@@ -1082,7 +663,20 @@
 "Kirjoita \"/help &lt;komento&gt;\" saadaksesi ohjeen tietystä komennosta.\n"
 "Seuraavat komennot ovat saatavilla tässä kontekstissa:\n"
 
-#: ../finch/gntconv.c:1244 ../pidgin/gtkconv.c:7942
+#, c-format
+msgid ""
+"%s is not a valid message class. See '/help msgcolor' for valid message "
+"classes."
+msgstr ""
+"%s ei ole kelvollinen viestiluokka. Katso kelvolliset viestiluokat "
+"komennolla \"/help msgcolor\"."
+
+#, c-format
+msgid "%s is not a valid color. See '/help msgcolor' for valid colors."
+msgstr ""
+"%s ei ole kelvollinen väri. Katso kelvolliset värit komennolla \"/help "
+"msgcolor\"."
+
 msgid ""
 "say &lt;message&gt;:  Send a message normally as if you weren't using a "
 "command."
@@ -1090,61 +684,60 @@
 "say &lt;viesti&gt;: Lähetä viesti normaalisti, niin kuin et olisi "
 "käyttämässä komentoa."
 
-#: ../finch/gntconv.c:1247 ../pidgin/gtkconv.c:7945
 msgid "me &lt;action&gt;:  Send an IRC style action to a buddy or chat."
 msgstr ""
 "me &lt;toiminta&gt;: Lähetä IRC-tyylinen toiminta tuttavalle tai "
 "keskusteluun."
 
-#: ../finch/gntconv.c:1250 ../pidgin/gtkconv.c:7948
 msgid ""
 "debug &lt;option&gt;:  Send various debug information to the current "
 "conversation."
 msgstr ""
 "debug &lt;valinta&gt;: Lähetä eri debug-tietoja senhetkiseen keskusteluun."
 
-#: ../finch/gntconv.c:1253 ../pidgin/gtkconv.c:7951
 msgid "clear: Clears the conversation scrollback."
 msgstr "clear: Tyhjentää keskustelun"
 
-#: ../finch/gntconv.c:1256 ../pidgin/gtkconv.c:7957
 msgid "help &lt;command&gt;:  Help on a specific command."
 msgstr "help &lt;komento&gt;: Ohje tietylle komennolle."
 
-#: ../finch/gntconv.c:1259
 msgid "users:  Show the list of users in the chat."
 msgstr "users:  Näytä luettelo keskustelussa olevista käyttäjistä"
 
-#: ../finch/gntconv.c:1264
 msgid "plugins: Show the plugins window."
 msgstr "plugins: Näytä liitännäiset-ikkuna."
 
-#: ../finch/gntconv.c:1267
 msgid "buddylist: Show the buddylist."
 msgstr "buddylist: Näytä tuttavaluettelo."
 
-#: ../finch/gntconv.c:1270
 msgid "accounts: Show the accounts window."
 msgstr "accounts: Näytä käyttäjätilit-ikkuna."
 
-#: ../finch/gntconv.c:1273
 msgid "debugwin: Show the debug window."
 msgstr "debugwin: Näytä virheenjäljitysikkuna."
 
-#: ../finch/gntconv.c:1276
 msgid "prefs: Show the preference window."
 msgstr "prefs: Näytä asetukset-ikkuna."
 
-#: ../finch/gntconv.c:1279
 msgid "statuses: Show the savedstatuses window."
 msgstr "statuses: Näytä tallennetut tilat -ikkuna"
 
-#: ../finch/gntdebug.c:231 ../pidgin/gtkconv.c:945 ../pidgin/gtkconv.c:2681
-#: ../pidgin/gtkdebug.c:219 ../pidgin/gtkft.c:543
+msgid ""
+"msgcolor &lt;class&gt; &lt;foreground&gt; &lt;background&gt;: Set the color "
+"for different classes of messages in the conversation window.<br>    &lt;"
+"class&gt;: receive, send, highlight, action, timestamp<br>    &lt;foreground/"
+"background&gt;: black, red, green, blue, white, gray, darkgray, magenta, "
+"cyan, default<br><br>EXAMPLE:<br>    msgcolor send cyan default"
+msgstr ""
+"msgcolor &lt;luokka&gt; &lt;edustaväri&gt; &lt;taustaväri&gt;: Aseta "
+"keskusteluikkunan värit eri viestiluokille.<br >    &lt;luokka&gt;: receive, "
+"send, highlight, action, timestamp<br>    &lt;edusta/taustaväri&gt;: black, "
+"red, green, blue, white, gray, darkgray, magenta, cyan, "
+"default<br><br>ESIMERKKI:<br>    msgcolor send cyan default"
+
 msgid "Unable to open file."
 msgstr "Tiedoston avaaminen epäonnistui."
 
-#: ../finch/gntdebug.c:271 ../finch/gntui.c:98 ../pidgin/gtkdebug.c:689
 msgid "Debug Window"
 msgstr "Virheenjäljitysikkuna"
 
@@ -1152,144 +745,96 @@
 #. * it's necessary to make the width of the debug window resizable ... like I said,
 #. * it doesn't make sense. The bug is likely in the packing in gntbox.c.
 #.
-#: ../finch/gntdebug.c:292 ../pidgin/gtkdebug.c:751
 msgid "Clear"
 msgstr "Tyhjennä"
 
-#: ../finch/gntdebug.c:303
 msgid "Filter:"
 msgstr "Suodatin:"
 
-#: ../finch/gntdebug.c:309 ../pidgin/gtkdebug.c:760
 msgid "Pause"
 msgstr "Tauko"
 
-#: ../finch/gntft.c:120 ../pidgin/gtkft.c:229
-#, c-format
-msgid "File Transfers - %d%% of %d files"
-msgstr "Tiedostonsiirrrot - tiedosto %d%% / %d"
+#, c-format
+msgid "File Transfers - %d%% of %d file"
+msgid_plural "File Transfers - %d%% of %d files"
+msgstr[0] "Tiedostonsiirrot - tiedosto %d%% / %d"
+msgstr[1] "Tiedostonsiirrot - tiedosto %d%% / %d"
 
 #. Create the window.
-#: ../finch/gntft.c:125 ../finch/gntft.c:212 ../finch/gntui.c:99
-#: ../pidgin/gtkft.c:234 ../pidgin/gtkft.c:761
 msgid "File Transfers"
 msgstr "Tiedostonsiirrot"
 
-#: ../finch/gntft.c:217 ../pidgin/gtkft.c:645
 msgid "Progress"
 msgstr "Valmiina"
 
-#: ../finch/gntft.c:217 ../pidgin/gtkft.c:652
 msgid "Filename"
 msgstr "Tiedoston nimi"
 
-#: ../finch/gntft.c:217 ../pidgin/gtkft.c:659
 msgid "Size"
 msgstr "Koko"
 
-#: ../finch/gntft.c:217
 msgid "Speed"
 msgstr "Nopeus"
 
-#: ../finch/gntft.c:217 ../pidgin/gtkft.c:666
 msgid "Remaining"
 msgstr "Jäljellä"
 
 #. XXX: Use of ggp_str_to_uin() is an ugly hack!
-#: ../finch/gntft.c:217 ../finch/gntstatus.c:547 ../finch/gntstatus.c:576
-#: ../libpurple/protocols/bonjour/bonjour.c:380
-#: ../libpurple/protocols/gg/gg.c:1041 ../libpurple/protocols/gg/gg.c:1584
-#: ../libpurple/protocols/gg/gg.c:1592
-#: ../libpurple/protocols/jabber/buddy.c:808
-#: ../libpurple/protocols/jabber/buddy.c:812
-#: ../libpurple/protocols/jabber/buddy.c:971
-#: ../libpurple/protocols/jabber/jabber.c:1579
-#: ../libpurple/protocols/msn/msn.c:631 ../libpurple/protocols/msn/msn.c:641
-#: ../libpurple/protocols/msn/msn.c:646 ../libpurple/protocols/msn/msn.c:649
-#: ../libpurple/protocols/msnp9/msn.c:540
-#: ../libpurple/protocols/novell/novell.c:2853
-#: ../libpurple/protocols/oscar/oscar.c:822
-#: ../libpurple/protocols/oscar/oscar.c:827
-#: ../libpurple/protocols/oscar/oscar.c:829
-#: ../libpurple/protocols/oscar/oscar.c:2754
-#: ../libpurple/protocols/oscar/oscar.c:3817
-#: ../libpurple/protocols/sametime/sametime.c:3315
-#: ../libpurple/protocols/sametime/sametime.c:4206
-#: ../libpurple/protocols/yahoo/yahoo.c:3305 ../pidgin/gtkblist.c:3415
-#: ../pidgin/gtkblist.c:3429 ../pidgin/gtkblist.c:3431
-#: ../pidgin/gtksavedstatuses.c:990 ../pidgin/gtksavedstatuses.c:1134
 msgid "Status"
 msgstr "Tila"
 
-#: ../finch/gntft.c:227
 msgid "Close this window when all transfers finish"
 msgstr "Sulje tämä ikkuna kun kaikki siirrot ovat valmiita"
 
-#: ../finch/gntft.c:234
 msgid "Clear finished transfers"
 msgstr "Poista valmiit siirrot"
 
-#: ../finch/gntft.c:248 ../finch/gntroomlist.c:272
 msgid "Stop"
 msgstr "Pysäytä"
 
-#: ../finch/gntft.c:321 ../pidgin/gtkft.c:169 ../pidgin/gtkft.c:934
 msgid "Waiting for transfer to begin"
 msgstr "Odotetaan lähetyksen alkamista"
 
-#: ../finch/gntft.c:388 ../pidgin/gtkft.c:163 ../pidgin/gtkft.c:1015
 msgid "Canceled"
 msgstr "Peruutettu"
 
-#: ../finch/gntft.c:390 ../pidgin/gtkft.c:1017
 msgid "Failed"
 msgstr "Epäonnistunut"
 
-#: ../finch/gntft.c:436 ../pidgin/gtkft.c:134
 #, c-format
 msgid "%.2f KiB/s"
 msgstr "%.2f KiB/s"
 
-#: ../finch/gntft.c:447
 msgid "Sent"
 msgstr "Lähetetty"
 
-#: ../finch/gntft.c:447
 msgid "Received"
 msgstr "Vastaanotettu"
 
-#: ../finch/gntft.c:448 ../pidgin/gtkft.c:160 ../pidgin/gtkft.c:1080
 msgid "Finished"
 msgstr "Valmis"
 
-#: ../finch/gntft.c:450
 #, c-format
 msgid "The file was saved as %s."
 msgstr "Tiedosto tallennettiin nimellä %s."
 
-#: ../finch/gntft.c:457
 msgid "Sending"
 msgstr "Lähetetään"
 
-#: ../finch/gntft.c:457
 msgid "Receiving"
 msgstr "Vastaanotetaan"
 
-#: ../finch/gntlog.c:184
 #, c-format
 msgid "Conversation in %s on %s"
 msgstr "Keskustelu paikassa %s aiheesta %s"
 
-#: ../finch/gntlog.c:187
 #, c-format
 msgid "Conversation with %s on %s"
 msgstr "Keskustelu henkilön %s kanssa aiheesta %s"
 
-#: ../finch/gntlog.c:230 ../pidgin/gtklog.c:503
 msgid "%B %Y"
 msgstr "%B %Y"
 
-#: ../finch/gntlog.c:270 ../pidgin/gtklog.c:550
 msgid ""
 "System events will only be logged if the \"Log all status changes to system "
 "log\" preference is enabled."
@@ -1297,7 +842,6 @@
 "Järjestelmätapahtumat kirjataan lokiin vain jos \"Kirjaa kaikki "
 "tilamuutokset järjestelmälokiin\" on asetettu."
 
-#: ../finch/gntlog.c:274 ../pidgin/gtklog.c:554
 msgid ""
 "Instant messages will only be logged if the \"Log all instant messages\" "
 "preference is enabled."
@@ -1305,111 +849,85 @@
 "Pikaviestit kirjataan lokiin vain jos \"Kirjaa kaikki pikaviestit lokiin\" "
 "on asetettu."
 
-#: ../finch/gntlog.c:277 ../pidgin/gtklog.c:557
 msgid ""
 "Chats will only be logged if the \"Log all chats\" preference is enabled."
 msgstr ""
 "Ryhmäkeskustelut kirjataan lokiin vain jos \"Kirjaa kaikki ryhmäkeskustelut "
 "lokiin\" on asetettu."
 
-#: ../finch/gntlog.c:283 ../pidgin/gtklog.c:566
 msgid "No logs were found"
 msgstr "Lokeja ei löytynyt"
 
-#: ../finch/gntlog.c:330 ../pidgin/gtklog.c:646
 msgid "Total log size:"
 msgstr "Lokin kokonaiskoko:"
 
 #. Search box *********
-#: ../finch/gntlog.c:338
 msgid "Scroll/Search: "
 msgstr "Vieritä/etsi:"
 
-#: ../finch/gntlog.c:382 ../pidgin/gtklog.c:716
 #, c-format
 msgid "Conversations in %s"
 msgstr "Keskustelut paikassa %s"
 
-#: ../finch/gntlog.c:390 ../finch/gntlog.c:448 ../pidgin/gtklog.c:724
-#: ../pidgin/gtklog.c:799
 #, c-format
 msgid "Conversations with %s"
 msgstr "Keskustelut käyttäjän %s kanssa"
 
-#: ../finch/gntlog.c:473 ../pidgin/gtklog.c:824
+msgid "All Conversations"
+msgstr "Kaikki keskustelut"
+
 msgid "System Log"
 msgstr "Järjestelmäloki"
 
-#: ../finch/gntnotify.c:165
 msgid "Emails"
 msgstr "Sähköpostit"
 
-#: ../finch/gntnotify.c:171 ../finch/gntnotify.c:226
 msgid "You have mail!"
 msgstr "Sinulle on postia."
 
-#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:533
 msgid "Sender"
 msgstr "Lähettäjä"
 
-#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:540
 msgid "Subject"
 msgstr "Aihe"
 
-#: ../finch/gntnotify.c:202
 #, c-format
 msgid "%s (%s) has %d new message."
 msgid_plural "%s (%s) has %d new messages."
 msgstr[0] "%s (%s): %d uusi viesti."
 msgstr[1] "%s (%s): %d uutta viestiä."
 
-#: ../finch/gntnotify.c:226 ../pidgin/gtknotify.c:352
 msgid "New Mail"
 msgstr "Uusi sähköposti"
 
-#: ../finch/gntnotify.c:291 ../pidgin/gtknotify.c:972
 #, c-format
 msgid "Info for %s"
 msgstr "%s tiedot"
 
-#: ../finch/gntnotify.c:292 ../libpurple/protocols/toc/toc.c:476
-#: ../pidgin/gtknotify.c:973
 msgid "Buddy Information"
 msgstr "Tuttavan tiedot"
 
-#: ../finch/gntnotify.c:382 ../libpurple/protocols/qq/group_join.c:367
 msgid "Continue"
 msgstr "Jatka"
 
-#: ../finch/gntnotify.c:391 ../pidgin/gtkconv.c:1636
 msgid "IM"
 msgstr "Pikaviesti"
 
-#: ../finch/gntnotify.c:397 ../libpurple/protocols/sametime/sametime.c:3525
-msgid "Invite"
-msgstr "Kutsu"
-
-#: ../finch/gntnotify.c:400
 msgid "(none)"
 msgstr "(ei mitään)"
 
-#: ../finch/gntnotify.c:426
 msgid "URI"
 msgstr "URI"
 
-#: ../finch/gntplugin.c:84 ../finch/gntplugin.c:93
 msgid "ERROR"
 msgstr "VIRHE"
 
-#: ../finch/gntplugin.c:84
 msgid "loading plugin failed"
 msgstr "liitännäisen lataus epäonnistui"
 
-#: ../finch/gntplugin.c:93
 msgid "unloading plugin failed"
 msgstr "liitännäisen poistaminen käytöstä epäonnistui"
 
-#: ../finch/gntplugin.c:139
 #, c-format
 msgid ""
 "Name: %s\n"
@@ -1426,43 +944,34 @@
 "Sivusto: %s\n"
 "Tiedostonimi: %s\n"
 
-#: ../finch/gntplugin.c:197
 msgid "Plugin need to be loaded before you can configure it."
 msgstr ""
 "Liitännäinen tulee olla käytössä ennen kuin sen asetuksia voidaan muuttaa."
 
-#: ../finch/gntplugin.c:245
 msgid "No configuration options for this plugin."
 msgstr "Tälle liitännäiselle ei ole asetuksia."
 
-#: ../finch/gntplugin.c:266
 msgid "Error loading plugin"
 msgstr "Liitännäistä ladattaessa tapahtui virhe"
 
-#: ../finch/gntplugin.c:267
 msgid "The selected file is not a valid plugin."
 msgstr "Valittu tiedosto ei ole kelvollinen liitännäinen."
 
-#: ../finch/gntplugin.c:268
 msgid ""
 "Please open the debug window and try again to see the exact error message."
 msgstr ""
 "Avaa virheenjäljitysikkuna ja yritä uudelleen nähdäksesi tarkan virheviestin."
 
-#: ../finch/gntplugin.c:331
 msgid "Select plugin to install"
 msgstr "Valitse asennettava liitännäinen"
 
-#: ../finch/gntplugin.c:357
 msgid "You can (un)load plugins from the following list."
 msgstr ""
 "Voit ottaa käyttöön/pois käytöstä liitännäisiä seuraavasta luettelosta."
 
-#: ../finch/gntplugin.c:408
 msgid "Install Plugin..."
 msgstr "Asenna liitännäinen..."
 
-#: ../finch/gntplugin.c:418
 msgid "Configure Plugin"
 msgstr "Liitännäisen asetukset"
 
@@ -1471,388 +980,290 @@
 #. (that should have been "effect," right?)
 #. Back to instant-apply! I win!  BU-HAHAHA!
 #. Create the window
-#: ../finch/gntplugin.c:524 ../finch/gntplugin.c:531 ../finch/gntprefs.c:264
-#: ../finch/gntui.c:103 ../pidgin/gtkdocklet.c:718 ../pidgin/gtkprefs.c:2180
 msgid "Preferences"
 msgstr "Asetukset"
 
-#: ../finch/gntpounce.c:193 ../pidgin/gtkpounce.c:256
 msgid "Please enter a buddy to pounce."
 msgstr "Syötä ilmoitettava tuttava."
 
-#: ../finch/gntpounce.c:338 ../pidgin/gtkpounce.c:524
 msgid "New Buddy Pounce"
 msgstr "Uusi tuttavailmoitin"
 
-#: ../finch/gntpounce.c:338 ../pidgin/gtkpounce.c:524
 msgid "Edit Buddy Pounce"
 msgstr "Muokkaa tuttavailmoitinta"
 
-#: ../finch/gntpounce.c:343
 msgid "Pounce Who"
 msgstr "Kenestä ilmoitetaan"
 
 #. Account:
-#: ../finch/gntpounce.c:346 ../finch/gntstatus.c:456
 msgid "Account:"
 msgstr "Käyttäjätili:"
 
-#: ../finch/gntpounce.c:368
 msgid "Buddy name:"
 msgstr "Tuttavan nimi:"
 
 #. Create the "Pounce When Buddy..." frame.
-#: ../finch/gntpounce.c:386 ../pidgin/gtkpounce.c:592
 msgid "Pounce When Buddy..."
 msgstr "Ilmoita kun tuttava..."
 
-#: ../finch/gntpounce.c:388
 msgid "Signs on"
 msgstr "kirjautuu sisään"
 
-#: ../finch/gntpounce.c:389
 msgid "Signs off"
 msgstr "kirjautuu ulos"
 
-#: ../finch/gntpounce.c:390
 msgid "Goes away"
 msgstr "poistuu"
 
-#: ../finch/gntpounce.c:391
 msgid "Returns from away"
 msgstr "palaa"
 
-#: ../finch/gntpounce.c:392
 msgid "Becomes idle"
 msgstr "on jouten"
 
-#: ../finch/gntpounce.c:393
 msgid "Is no longer idle"
 msgstr "ei enää ole jouten"
 
-#: ../finch/gntpounce.c:394
 msgid "Starts typing"
 msgstr "alkaa kirjoittaa"
 
-#: ../finch/gntpounce.c:395
 msgid "Pauses while typing"
 msgstr "keskeyttää kirjoittamisen"
 
-#: ../finch/gntpounce.c:396
 msgid "Stops typing"
 msgstr "lopettaa kirjoittamisen"
 
-#: ../finch/gntpounce.c:397
 msgid "Sends a message"
 msgstr "lähettää viestin"
 
 #. Create the "Action" frame.
-#: ../finch/gntpounce.c:426 ../pidgin/gtkpounce.c:653
 msgid "Action"
 msgstr "Toiminto"
 
-#: ../finch/gntpounce.c:428
 msgid "Open an IM window"
 msgstr "Avaa pikaviesti-ikkuna"
 
-#: ../finch/gntpounce.c:429
 msgid "Pop up a notification"
 msgstr "Ponnahdusilmoitus"
 
-#: ../finch/gntpounce.c:430
 msgid "Send a message"
 msgstr "Lähetä viesti"
 
-#: ../finch/gntpounce.c:431
 msgid "Execute a command"
 msgstr "Suorita komento"
 
-#: ../finch/gntpounce.c:432
 msgid "Play a sound"
 msgstr "Soita ääni"
 
-#: ../finch/gntpounce.c:460
 msgid "Pounce only when my status is not Available"
 msgstr "Ilmoita vain kun tilani ei ole Tavoitettavissa"
 
-#: ../finch/gntpounce.c:462 ../pidgin/gtkpounce.c:1294
 msgid "Recurring"
 msgstr "Toistuva"
 
-#: ../finch/gntpounce.c:630
 msgid "Cannot create pounce"
 msgstr "Ilmoitinta ei voi luoda"
 
-#: ../finch/gntpounce.c:631
 msgid "You do not have any accounts."
 msgstr "Yhtäkään käyttäjätiliä ei ole määritelty."
 
-#: ../finch/gntpounce.c:632
 msgid "You must create an account first before you can create a pounce."
 msgstr "Käyttäjätili tulee luoda ennen ilmoittimen luomista."
 
-#: ../finch/gntpounce.c:674 ../pidgin/gtkpounce.c:1108
 #, c-format
 msgid "Are you sure you want to delete the pounce on %s for %s?"
 msgstr "Haluatko varmasti poistaa ilmoituksen %s käyttäjältä %s?"
 
-#: ../finch/gntpounce.c:708 ../finch/gntui.c:96 ../pidgin/gtkpounce.c:1337
 msgid "Buddy Pounces"
 msgstr "Tuttavailmoittimet"
 
-#: ../finch/gntpounce.c:817 ../pidgin/gtkpounce.c:1436
 #, c-format
 msgid "%s has started typing to you (%s)"
 msgstr "%s alkoi kirjoittaa sinulle (%s)"
 
-#: ../finch/gntpounce.c:818 ../pidgin/gtkpounce.c:1438
 #, c-format
 msgid "%s has paused while typing to you (%s)"
 msgstr "%s keskeytti kirjoittamisen sinulle (%s)"
 
-#: ../finch/gntpounce.c:819 ../pidgin/gtkpounce.c:1440
 #, c-format
 msgid "%s has signed on (%s)"
 msgstr "%s on kirjautunut sisään (%s)"
 
-#: ../finch/gntpounce.c:820 ../pidgin/gtkpounce.c:1442
 #, c-format
 msgid "%s has returned from being idle (%s)"
 msgstr "%s on palannut oltuaan jouten (%s)"
 
-#: ../finch/gntpounce.c:821 ../pidgin/gtkpounce.c:1444
 #, c-format
 msgid "%s has returned from being away (%s)"
 msgstr "%s on palannut oltuaan poissa (%s)"
 
-#: ../finch/gntpounce.c:822 ../pidgin/gtkpounce.c:1446
 #, c-format
 msgid "%s has stopped typing to you (%s)"
 msgstr "%s on lopettanut kirjoittamisen sinulle (%s)"
 
-#: ../finch/gntpounce.c:823 ../pidgin/gtkpounce.c:1448
 #, c-format
 msgid "%s has signed off (%s)"
 msgstr "%s on kirjautunut ulos (%s)"
 
-#: ../finch/gntpounce.c:824 ../pidgin/gtkpounce.c:1450
 #, c-format
 msgid "%s has become idle (%s)"
 msgstr "%s on jouten (%s)"
 
-#: ../finch/gntpounce.c:825 ../pidgin/gtkpounce.c:1452
 #, c-format
 msgid "%s has gone away. (%s)"
 msgstr "%s on poissa. (%s)"
 
-#: ../finch/gntpounce.c:826 ../pidgin/gtkpounce.c:1454
 #, c-format
 msgid "%s has sent you a message. (%s)"
 msgstr "%s on lähettämässä sinulle viestiä. (%s)"
 
-#: ../finch/gntpounce.c:845 ../pidgin/gtkpounce.c:1455
 #, c-format
 msgid "Unknown pounce event. Please report this!"
 msgstr "Tuntematon ilmoitinviesti. Raportoi tästä!"
 
-#: ../finch/gntprefs.c:92
 msgid "Based on keyboard use"
 msgstr "Perustuen näppäimistön käyttöön"
 
-#: ../finch/gntprefs.c:94 ../pidgin/gtkprefs.c:2061
 msgid "From last sent message"
 msgstr "Viimeisestä lähetetystä viestistä"
 
-#: ../finch/gntprefs.c:96 ../pidgin/gtkprefs.c:948 ../pidgin/gtkprefs.c:956
-#: ../pidgin/gtkprefs.c:2060 ../pidgin/gtkprefs.c:2074
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:333
 msgid "Never"
 msgstr "Ei koskaan"
 
-#: ../finch/gntprefs.c:184
 msgid "Show Idle Time"
 msgstr "Näytä joutenoloaika"
 
-#: ../finch/gntprefs.c:185
 msgid "Show Offline Buddies"
 msgstr "Näytä poissa linjoilta olevat tuttavat"
 
-#: ../finch/gntprefs.c:192
 msgid "Notify buddies when you are typing"
 msgstr "Ilmoita tuttaville kun kirjoitat heille"
 
-#: ../finch/gntprefs.c:198 ../finch/plugins/gnthistory.c:153
 msgid "Log format"
 msgstr "Lokin muoto"
 
-#: ../finch/gntprefs.c:199 ../finch/plugins/gnthistory.c:143
 msgid "Log IMs"
 msgstr "Kirjaa pikaviestit"
 
-#: ../finch/gntprefs.c:200 ../finch/plugins/gnthistory.c:144
 msgid "Log chats"
 msgstr "Kirjaa ryhmäkeskustelut"
 
-#: ../finch/gntprefs.c:201
 msgid "Log status change events"
 msgstr "Kirjaa tilamuutokset"
 
-#: ../finch/gntprefs.c:207
 msgid "Report Idle time"
 msgstr "Ilmoita joutenoloaika"
 
-#: ../finch/gntprefs.c:208
 msgid "Change status when idle"
 msgstr "Vaihda tila, kun ollaan jouten"
 
-#: ../finch/gntprefs.c:209
 msgid "Minutes before changing status"
 msgstr "Minuutteja ennen tilan asetusta"
 
-#: ../finch/gntprefs.c:210
 msgid "Change status to"
 msgstr "Vaihda tila seuraavaksi"
 
 #. Conversations
-#: ../finch/gntprefs.c:259 ../pidgin/gtkprefs.c:1046 ../pidgin/gtkprefs.c:2147
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:340
 msgid "Conversations"
 msgstr "Keskustelut"
 
-#: ../finch/gntprefs.c:260 ../finch/plugins/gnthistory.c:151
-#: ../pidgin/gtkprefs.c:1617 ../pidgin/gtkprefs.c:2158
 msgid "Logging"
 msgstr "Kirjataan lokiin"
 
-#: ../finch/gntrequest.c:381
 msgid "You must fill all the required fields."
 msgstr "Täytä kaikki vaaditut kentät."
 
-#: ../finch/gntrequest.c:382
 msgid "The required fields are underlined."
 msgstr "Alleviivatut kentät ovat vaadittuja."
 
-#: ../finch/gntrequest.c:640
 msgid "Not implemented yet."
 msgstr "Ominaisuutta ei ole vielä toteutettu."
 
-#: ../finch/gntrequest.c:745 ../pidgin/gtkrequest.c:1553
-#: ../pidgin/gtkrequest.c:1599
 msgid "Save File..."
 msgstr "Tallenna tiedosto..."
 
-#: ../finch/gntrequest.c:745 ../pidgin/gtkrequest.c:1554
-#: ../pidgin/gtkrequest.c:1600
 msgid "Open File..."
 msgstr "Avaa tiedosto..."
 
-#: ../finch/gntrequest.c:762
 msgid "Choose Location..."
 msgstr "Valitse sijainti..."
 
-#: ../finch/gntroomlist.c:208
 msgid "Hit 'Enter' to find more rooms of this category."
 msgstr "Paina \"Enter\" nähdäksesi lisää tämän luokan huoneita."
 
-#: ../finch/gntroomlist.c:273
 msgid "Get"
 msgstr "Hae"
 
 #. Create the window.
-#: ../finch/gntroomlist.c:285 ../finch/gntui.c:101 ../pidgin/gtkroomlist.c:530
 msgid "Room List"
 msgstr "Huoneluettelo"
 
-#: ../finch/gntsound.c:96 ../pidgin/gtksound.c:62
 msgid "Buddy logs in"
 msgstr "Tuttava kirjautuu sisään"
 
-#: ../finch/gntsound.c:97 ../pidgin/gtksound.c:63
 msgid "Buddy logs out"
 msgstr "Tuttava kirjautuu ulos"
 
-#: ../finch/gntsound.c:98 ../pidgin/gtksound.c:64
 msgid "Message received"
 msgstr "Viesti vastaanotettu"
 
-#: ../finch/gntsound.c:99 ../pidgin/gtksound.c:65
 msgid "Message received begins conversation"
 msgstr "Vastaanotettu viesti aloittaa keskustelun"
 
-#: ../finch/gntsound.c:100 ../pidgin/gtksound.c:66
 msgid "Message sent"
 msgstr "Viesti lähetetty"
 
-#: ../finch/gntsound.c:101 ../pidgin/gtksound.c:67
 msgid "Person enters chat"
 msgstr "Joku saapuu ryhmäkeskusteluun"
 
-#: ../finch/gntsound.c:102 ../pidgin/gtksound.c:68
 msgid "Person leaves chat"
 msgstr "Joku poistuu ryhmäkeskustelusta"
 
-#: ../finch/gntsound.c:103 ../pidgin/gtksound.c:69
 msgid "You talk in chat"
 msgstr "Sinä puhut ryhmäkeskustelussa"
 
-#: ../finch/gntsound.c:104 ../pidgin/gtksound.c:70
 msgid "Others talk in chat"
 msgstr "Muut puhuvat ryhmäkeskustelussa"
 
-#: ../finch/gntsound.c:106 ../pidgin/gtksound.c:73
 msgid "Someone says your username in chat"
 msgstr "Joku sanoo käyttäjänimesi ryhmäkeskustelussa"
 
-#: ../finch/gntsound.c:367 ../pidgin/gtksound.c:309
 msgid "GStreamer Failure"
 msgstr "GStreamer-virhe"
 
-#: ../finch/gntsound.c:368 ../pidgin/gtksound.c:310
 msgid "GStreamer failed to initialize."
 msgstr "GStreameria ei voi alustaa."
 
-#: ../finch/gntsound.c:722 ../finch/gntsound.c:808 ../pidgin/gtkprefs.c:1741
-#: ../pidgin/gtkprefs.c:1830 ../pidgin/gtkprefs.c:2003
 msgid "(default)"
 msgstr "(oletus)"
 
-#: ../finch/gntsound.c:735
 msgid "Select Sound File ..."
 msgstr "Valitse äänitiedosto..."
 
-#: ../finch/gntsound.c:910
 msgid "Sound Preferences"
 msgstr "Ääniasetukset"
 
-#: ../finch/gntsound.c:921
 msgid "Profiles"
 msgstr "Profiilit"
 
-#: ../finch/gntsound.c:960 ../pidgin/gtkprefs.c:1868
 msgid "Automatic"
 msgstr "Automaattinen"
 
-#: ../finch/gntsound.c:963
 msgid "Console Beep"
 msgstr "Konsoliäänimerkki"
 
-#: ../finch/gntsound.c:964 ../pidgin/gtkprefs.c:1872
 msgid "Command"
 msgstr "Komento"
 
-#: ../finch/gntsound.c:965
 msgid "No Sound"
 msgstr "Ei ääntä"
 
-#: ../finch/gntsound.c:967 ../pidgin/gtkprefs.c:1863
 msgid "Sound Method"
 msgstr "Äänimenetelmä"
 
-#: ../finch/gntsound.c:972
 msgid "Method: "
 msgstr "Menetelmä: "
 
-#: ../finch/gntsound.c:979
 #, c-format
 msgid ""
 "Sound Command\n"
@@ -1862,82 +1273,56 @@
 "(%s tiedostonimeksi)"
 
 #. Sound options
-#: ../finch/gntsound.c:987 ../pidgin/gtkprefs.c:1894
 msgid "Sound Options"
 msgstr "Äänivalinnat"
 
-#: ../finch/gntsound.c:988
 msgid "Sounds when conversation has focus"
 msgstr "Äänet kun keskusteluikkuna on aktiivinen"
 
-#: ../finch/gntsound.c:996 ../pidgin/gtkprefs.c:946 ../pidgin/gtkprefs.c:958
-#: ../pidgin/gtkprefs.c:1901 ../pidgin/plugins/timestamp_format.c:42
-#: ../pidgin/plugins/timestamp_format.c:51
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:334
 msgid "Always"
 msgstr "Aina"
 
-#: ../finch/gntsound.c:997 ../pidgin/gtkprefs.c:1899
 msgid "Only when available"
 msgstr "Kun tavoitettavissa"
 
-#: ../finch/gntsound.c:998 ../pidgin/gtkprefs.c:1900
 msgid "Only when not available"
 msgstr "Kun ei tavoitettavissa"
 
-#: ../finch/gntsound.c:1005
 msgid "Volume(0-100):"
 msgstr "Äänenvoimakkuus(0-100):"
 
 #. Sound events
-#: ../finch/gntsound.c:1024 ../pidgin/gtkprefs.c:1929
 msgid "Sound Events"
 msgstr "Äänitapahtumat"
 
-#: ../finch/gntsound.c:1026 ../pidgin/gtkprefs.c:1988
 msgid "Event"
 msgstr "Tapahtuma"
 
-#: ../finch/gntsound.c:1026
 msgid "File"
 msgstr "Tiedosto"
 
-#: ../finch/gntsound.c:1045 ../pidgin/gtkprefs.c:2007
 msgid "Test"
 msgstr "Kokeile"
 
-#: ../finch/gntsound.c:1048 ../pidgin/gtkprefs.c:2011
 msgid "Reset"
 msgstr "Nollaa"
 
-#: ../finch/gntsound.c:1051 ../pidgin/gtkprefs.c:2015
 msgid "Choose..."
 msgstr "Valitse..."
 
-#: ../finch/gntstatus.c:138
 #, c-format
 msgid "Are you sure you want to delete \"%s\""
 msgstr "Haluatko varmasti poistaa kohteen \"%s\""
 
-#: ../finch/gntstatus.c:141
 msgid "Delete Status"
 msgstr "Poista tila"
 
-#: ../finch/gntstatus.c:176 ../pidgin/gtksavedstatuses.c:597
 msgid "Saved Statuses"
 msgstr "Tallennetut tilat"
 
-#: ../finch/gntstatus.c:183 ../finch/gntstatus.c:539
-#: ../libpurple/protocols/jabber/buddy.c:321
-#: ../libpurple/protocols/jabber/buddy.c:1396
-#: ../libpurple/protocols/msn/msn.c:747
-#: ../libpurple/protocols/myspace/myspace.c:171
-#: ../libpurple/protocols/novell/novell.c:1493
-#: ../pidgin/gtksavedstatuses.c:500
 msgid "Title"
 msgstr "Otsikko"
 
-#: ../finch/gntstatus.c:183 ../pidgin/gtksavedstatuses.c:515
 msgid "Type"
 msgstr "Tyyppi"
 
@@ -1949,132 +1334,71 @@
 #. user_settable
 #. not independent
 #. Attributes - each status can have a message.
-#: ../finch/gntstatus.c:183 ../finch/gntstatus.c:564 ../finch/gntstatus.c:576
-#: ../libpurple/protocols/bonjour/bonjour.c:292
-#: ../libpurple/protocols/bonjour/bonjour.c:299
-#: ../libpurple/protocols/bonjour/bonjour.c:382
-#: ../libpurple/protocols/gg/gg.c:1079 ../libpurple/protocols/gg/gg.c:1587
-#: ../libpurple/protocols/gg/gg.c:1605 ../libpurple/protocols/gg/gg.c:1615
-#: ../libpurple/protocols/gg/gg.c:1621 ../libpurple/protocols/gg/gg.c:1630
-#: ../libpurple/protocols/gg/gg.c:1635 ../libpurple/protocols/irc/irc.c:245
-#: ../libpurple/protocols/jabber/jabber.c:1611
-#: ../libpurple/protocols/jabber/jabber.c:1625
-#: ../libpurple/protocols/jabber/jabber.c:1639
-#: ../libpurple/protocols/jabber/jabber.c:1653
-#: ../libpurple/protocols/jabber/jabber.c:1667
-#: ../libpurple/protocols/jabber/jabber.c:1683
-#: ../libpurple/protocols/msn/msn.c:699 ../libpurple/protocols/msn/msn.c:705
-#: ../libpurple/protocols/msn/msn.c:711 ../libpurple/protocols/msn/msn.c:717
-#: ../libpurple/protocols/msn/msn.c:722 ../libpurple/protocols/msn/msn.c:727
-#: ../libpurple/protocols/myspace/myspace.c:148
-#: ../libpurple/protocols/novell/novell.c:2856
-#: ../libpurple/protocols/novell/novell.c:2959
-#: ../libpurple/protocols/novell/novell.c:2965
-#: ../libpurple/protocols/novell/novell.c:2971
-#: ../libpurple/protocols/oscar/oscar.c:5667
-#: ../libpurple/protocols/oscar/oscar.c:5885
-#: ../libpurple/protocols/oscar/oscar.c:5899
-#: ../libpurple/protocols/oscar/oscar.c:5915
-#: ../libpurple/protocols/oscar/oscar.c:5922
-#: ../libpurple/protocols/oscar/oscar.c:5929
-#: ../libpurple/protocols/sametime/sametime.c:3338
-#: ../libpurple/protocols/sametime/sametime.c:3344
-#: ../libpurple/protocols/sametime/sametime.c:3350
-#: ../libpurple/protocols/sametime/sametime.c:3429
-#: ../libpurple/protocols/silc/buddy.c:1554
-#: ../libpurple/protocols/silc10/buddy.c:1554
-#: ../libpurple/protocols/simple/simple.c:247
-#: ../libpurple/protocols/yahoo/yahoo.c:3817
-#: ../libpurple/protocols/yahoo/yahoo.c:3823
-#: ../libpurple/protocols/zephyr/zephyr.c:2352
-#: ../pidgin/gtksavedstatuses.c:526 ../pidgin/gtksavedstatuses.c:1001
 msgid "Message"
 msgstr "Viesti"
 
 #. Use
-#: ../finch/gntstatus.c:194 ../finch/gntstatus.c:593
 msgid "Use"
 msgstr "Käytä"
 
-#: ../finch/gntstatus.c:301
 msgid "Invalid title"
 msgstr "Epäkelpo otsikko"
 
-#: ../finch/gntstatus.c:302
 msgid "Please enter a non-empty title for the status."
 msgstr "Tilan otsikko ei voi olla tyhjä."
 
-#: ../finch/gntstatus.c:310
 msgid "Duplicate title"
 msgstr "Otsikon toisinto"
 
-#: ../finch/gntstatus.c:311
 msgid "Please enter a different title for the status."
 msgstr "Anna toinen otsikko tilalle."
 
-#: ../finch/gntstatus.c:452
 msgid "Substatus"
 msgstr "Alatila"
 
-#: ../finch/gntstatus.c:464 ../pidgin/gtkft.c:699
 msgid "Status:"
 msgstr "Tila:"
 
-#: ../finch/gntstatus.c:479
 msgid "Message:"
 msgstr "Viesti:"
 
-#: ../finch/gntstatus.c:528
 msgid "Edit Status"
 msgstr "Muokkaa tilaa"
 
-#: ../finch/gntstatus.c:570
 msgid "Use different status for following accounts"
 msgstr "Käytä eri tilaa seuraaville käyttäjätileille"
 
 #. Save & Use
-#: ../finch/gntstatus.c:604
 msgid "Save & Use"
 msgstr "Tallenna ja käytä"
 
-#: ../finch/gntui.c:97
 msgid "Certificates"
 msgstr "Varmenteet"
 
-#: ../finch/gntui.c:102 ../pidgin/gtkprefs.c:2149
 msgid "Sounds"
 msgstr "Äänet"
 
-#: ../finch/gntui.c:104
 msgid "Statuses"
 msgstr "Tilat"
 
-#: ../finch/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121
-#: ../finch/plugins/gntclipboard.c:128
 msgid "Error loading the plugin."
 msgstr "Liitännäistä ladattaessa tapahtui virhe."
 
-#: ../finch/plugins/gntclipboard.c:116
 msgid "Couldn't find X display"
 msgstr "X-näyttöä ei löydetty"
 
-#: ../finch/plugins/gntclipboard.c:122
 msgid "Couldn't find window"
 msgstr "Ikkunaa ei löydetty"
 
-#: ../finch/plugins/gntclipboard.c:129
 msgid "This plugin cannot be loaded because it was not built with X11 support."
 msgstr "Liitännäistä ei voi ladata, koska sitä ei käännetty X11-tuella."
 
-#: ../finch/plugins/gntclipboard.c:158
 msgid "GntClipboard"
 msgstr "GntClipboard"
 
-#: ../finch/plugins/gntclipboard.c:160
 msgid "Clipboard plugin"
 msgstr "Leikepöytäliitännäinen"
 
-#: ../finch/plugins/gntclipboard.c:161
 msgid ""
 "When the gnt clipboard contents change, the contents are made available to "
 "X, if possible."
@@ -2082,77 +1406,60 @@
 "Kun gnt:n leikepöydän sisältö muuttuu, sisältö annetaan X:lle jos "
 "mahdollista."
 
-#: ../finch/plugins/gntgf.c:231
 #, c-format
 msgid "%s just signed on"
 msgstr "%s kirjautui sisään"
 
-#: ../finch/plugins/gntgf.c:238
 #, c-format
 msgid "%s just signed off"
 msgstr "%s kirjautui ulos"
 
-#: ../finch/plugins/gntgf.c:246
 #, c-format
 msgid "%s sent you a message"
 msgstr "%s lähetti sinulle viestin"
 
-#: ../finch/plugins/gntgf.c:265
 #, c-format
 msgid "%s said your nick in %s"
 msgstr "%s mainitsi kutsumanimesi keskustelussa %s"
 
-#: ../finch/plugins/gntgf.c:267
 #, c-format
 msgid "%s sent a message in %s"
 msgstr "%s lähetti viestin keskustelussa %s"
 
-#: ../finch/plugins/gntgf.c:305
 msgid "Buddy signs on/off"
 msgstr "Tuttava kirjautuu sisään/ulos"
 
-#: ../finch/plugins/gntgf.c:306
 msgid "You receive an IM"
 msgstr "Saat pikaviestin"
 
-#: ../finch/plugins/gntgf.c:307
 msgid "Someone speaks in a chat"
 msgstr "Joku sanoo jotain ryhmäkeskustelussa"
 
-#: ../finch/plugins/gntgf.c:308
 msgid "Someone says your name in a chat"
 msgstr "Joku sanoo nimesi ryhmäkeskustelussa"
 
-#: ../finch/plugins/gntgf.c:336
 msgid "Notify with a toaster when"
 msgstr "Huomauta leivänpaahtimella kun"
 
-#: ../finch/plugins/gntgf.c:351
 msgid "Beep too!"
 msgstr "Anna myös äänimerkki."
 
-#: ../finch/plugins/gntgf.c:357
 msgid "Set URGENT for the terminal window."
 msgstr "Aseta pääteikkuna tilaan \"kiireellinen\"."
 
-#: ../finch/plugins/gntgf.c:377
 msgid "GntGf"
 msgstr "GntGf"
 
-#: ../finch/plugins/gntgf.c:379 ../finch/plugins/gntgf.c:380
 msgid "Toaster plugin"
 msgstr "Leivänpaahdin-liitännäinen"
 
-#: ../finch/plugins/gnthistory.c:114 ../pidgin/plugins/history.c:125
 #, c-format
 msgid "<b>Conversation with %s on %s:</b><br>"
 msgstr "<b>Keskustelu käyttäjän %s kanssa %s:</b><br>"
 
-#: ../finch/plugins/gnthistory.c:172 ../pidgin/plugins/history.c:153
 msgid "History Plugin Requires Logging"
 msgstr "Historia-liitännäinen vaatii lokiinkirjauksen käyttöä"
 
-#: ../finch/plugins/gnthistory.c:173 ../pidgin/plugins/history.c:154
 msgid ""
 "Logging can be enabled from Tools -> Preferences -> Logging.\n"
 "\n"
@@ -2165,15 +1472,12 @@
 "Lokien käyttöönotto pikaviesteille ja/tai ryhmäkeskusteluille ottaa käyttöön "
 "historiatoiminnon vastaaville keskustelutyypeille."
 
-#: ../finch/plugins/gnthistory.c:217
 msgid "GntHistory"
 msgstr "GntHistory"
 
-#: ../finch/plugins/gnthistory.c:219 ../pidgin/plugins/history.c:197
 msgid "Shows recently logged conversations in new conversations."
 msgstr "Näyttää osan edellistä keskustelua uudessa keskustelussa."
 
-#: ../finch/plugins/gnthistory.c:220 ../pidgin/plugins/history.c:198
 msgid ""
 "When a new conversation is opened this plugin will insert the last "
 "conversation into the current conversation."
@@ -2181,169 +1485,113 @@
 "Kun uusi keskustelu aloitetaan, tämä liitännäinen näyttää edellisen "
 "keskustelun keskusteluikkunassa."
 
-#: ../finch/plugins/grouping.c:42 ../libpurple/protocols/oscar/oscar.c:740
 #, c-format
 msgid "Online"
 msgstr "Linjoilla"
 
-#: ../finch/plugins/grouping.c:44 ../finch/plugins/grouping.c:145
-#: ../libpurple/protocols/gg/gg.c:1010
-#: ../libpurple/protocols/jabber/buddy.c:2081
-#: ../libpurple/protocols/novell/novell.c:2846
-#: ../libpurple/protocols/oscar/oscar.c:829
-#: ../libpurple/protocols/oscar/oscar.c:5717
-#: ../libpurple/protocols/qq/qq.c:171 ../libpurple/protocols/qq/qq.c:178
-#: ../libpurple/protocols/qq/qq.c:293
-#: ../libpurple/protocols/yahoo/yahoo.c:3156 ../libpurple/status.c:155
-#: ../pidgin/gtkblist.c:3415 ../pidgin/gtkblist.c:3807
-#: ../pidgin/gtkdocklet.c:561 ../pidgin/gtkstatusbox.c:1090
 msgid "Offline"
 msgstr "Poissa linjoilta"
 
-#: ../finch/plugins/grouping.c:117 ../pidgin/gtkblist.c:3451
 msgid "Online Buddies"
 msgstr "Tuttavat linjoilla"
 
-#: ../finch/plugins/grouping.c:117
 msgid "Offline Buddies"
 msgstr "Tuttavat poissa linjoilta"
 
-#: ../finch/plugins/grouping.c:127
 msgid "Online/Offline"
 msgstr "Linjoilla/poissa linjoilta"
 
-#: ../finch/plugins/grouping.c:168
 msgid "Meebo"
 msgstr "Meebo"
 
-#: ../finch/plugins/grouping.c:217
 msgid "No Grouping"
 msgstr "Ei ryhmittelyä"
 
-#: ../finch/plugins/grouping.c:257 ../finch/plugins/grouping.c:258
 msgid "Provides alternate buddylist grouping options."
 msgstr "Mahdollistaa vaihtoehtoisia tuttavien ryhmittelyvalintoja."
 
-#: ../finch/plugins/lastlog.c:69
 msgid "Lastlog"
 msgstr "Lastlog"
 
 #. Translator Note: The "backlog" is the conversation buffer/history.
-#: ../finch/plugins/lastlog.c:100
 msgid "lastlog: Searches for a substring in the backlog."
 msgstr "lastlog: Etsii merkkijonoa muistissa olevasta lokista."
 
-#: ../finch/plugins/lastlog.c:122
 msgid "GntLastlog"
 msgstr "GntLastLog"
 
-#: ../finch/plugins/lastlog.c:124 ../finch/plugins/lastlog.c:125
 msgid "Lastlog plugin."
 msgstr "Lastlog-liitännäinen."
 
-#: ../libpurple/account.c:887
 msgid "accounts"
 msgstr "käyttäjätilit"
 
-#: ../libpurple/account.c:1063 ../libpurple/protocols/jabber/auth.c:204
-#: ../libpurple/protocols/silc/silc.c:473
 msgid "Password is required to sign on."
 msgstr "Salasana tarvitaan kirjautumiseen."
 
-#: ../libpurple/account.c:1097
 #, c-format
 msgid "Enter password for %s (%s)"
 msgstr "Anna salasana käyttäjätilille %s (%s)"
 
-#: ../libpurple/account.c:1104
 msgid "Enter Password"
 msgstr "Anna salasana"
 
-#: ../libpurple/account.c:1109
 msgid "Save password"
 msgstr "Tallenna salasana"
 
-#: ../libpurple/account.c:1144 ../libpurple/connection.c:118
-#: ../libpurple/connection.c:191
 #, c-format
 msgid "Missing protocol plugin for %s"
 msgstr "%s-yhteyskäytäntöliitännäinen puuttuu"
 
-#: ../libpurple/account.c:1146 ../libpurple/connection.c:121
 msgid "Connection Error"
 msgstr "Yhteysvirhe"
 
-#: ../libpurple/account.c:1357 ../libpurple/protocols/gg/gg.c:708
-#: ../libpurple/protocols/jabber/jabber.c:1739
 msgid "New passwords do not match."
 msgstr "Uudet salasanat eivät täsmää."
 
-#: ../libpurple/account.c:1370
 msgid "Fill out all fields completely."
 msgstr "Täytä kaikki kentät kokonaan."
 
-#: ../libpurple/account.c:1402
 msgid "Original password"
 msgstr "Vanha salasana"
 
-#: ../libpurple/account.c:1410
 msgid "New password"
 msgstr "Uusi salasana"
 
-#: ../libpurple/account.c:1418
 msgid "New password (again)"
 msgstr "Uusi salasana (uudelleen)"
 
-#: ../libpurple/account.c:1425
 #, c-format
 msgid "Change password for %s"
 msgstr "Vaihda %s:n salasana"
 
-#: ../libpurple/account.c:1433
 msgid "Please enter your current password and your new password."
 msgstr "Anna nykyinen sekä uusi salasana."
 
-#: ../libpurple/account.c:1464
 #, c-format
 msgid "Change user information for %s"
 msgstr "Vaihda käyttäjätietoja - %s"
 
-#: ../libpurple/account.c:1467 ../libpurple/protocols/toc/toc.c:1670
 msgid "Set User Info"
 msgstr "Aseta käyttäjätiedot"
 
-#: ../libpurple/account.c:1938 ../libpurple/protocols/gg/gg.c:1019
-#: ../libpurple/protocols/jabber/buddy.c:812
-#: ../libpurple/protocols/jabber/buddy.c:2077
-#: ../libpurple/protocols/jabber/buddy.c:2094
-#: ../libpurple/protocols/novell/novell.c:2849
-#: ../libpurple/protocols/qq/qq.c:233 ../pidgin/gtkft.c:166
 msgid "Unknown"
 msgstr "Tuntematon"
 
-#: ../libpurple/blist.c:521 ../libpurple/blist.c:1348
-#: ../libpurple/blist.c:1558 ../libpurple/protocols/jabber/roster.c:69
-#: ../libpurple/protocols/myspace/myspace.c:3442 ../pidgin/gtkblist.c:6317
-#: ../pidgin/plugins/gevolution/gevo-util.c:67
-#: ../pidgin/plugins/gevolution/gevolution.c:96
 msgid "Buddies"
 msgstr "Tuttavat"
 
-#: ../libpurple/blist.c:548
 msgid "buddy list"
 msgstr "tuttavat"
 
-#: ../libpurple/certificate.c:558
 msgid "(DOES NOT MATCH)"
 msgstr "(EI TÄSMÄÄ)"
 
 #. Make messages
-#: ../libpurple/certificate.c:562
 #, c-format
 msgid "%s has presented the following certificate for just-this-once use:"
 msgstr "%s on esittänyt seuraavan varmenteen vain tätä kertaa varten:"
 
-#: ../libpurple/certificate.c:563
 #, c-format
 msgid ""
 "Common name: %s %s\n"
@@ -2353,53 +1601,40 @@
 "Sormenjälki (SHA1): %s"
 
 #. TODO: Find what the handle ought to be
-#: ../libpurple/certificate.c:568
 msgid "Single-use Certificate Verification"
 msgstr "Kertakäyttöisen varmenteen tarkistus"
 
 #. Scheme name
 #. Pool name
-#: ../libpurple/certificate.c:894
 msgid "Certificate Authorities"
 msgstr "Varmentajat"
 
 #. Scheme name
 #. Pool name
-#: ../libpurple/certificate.c:1062
 msgid "SSL Peers Cache"
 msgstr "SSL Peers -välimuisti"
 
 #. Make messages
-#: ../libpurple/certificate.c:1193
 #, c-format
 msgid "Accept certificate for %s?"
 msgstr "Hyväksy varmenne kohteelle %s?"
 
 #. TODO: Find what the handle ought to be
-#: ../libpurple/certificate.c:1199
 msgid "SSL Certificate Verification"
 msgstr "SSL-varmenteen tarkistus"
 
 #. Number of actions
-#: ../libpurple/certificate.c:1208
 msgid "Accept"
 msgstr "Hyväksy"
 
-#: ../libpurple/certificate.c:1209 ../libpurple/protocols/qq/buddy_opt.c:214
-#: ../libpurple/protocols/qq/group_im.c:144
-#: ../libpurple/protocols/qq/group_opt.c:103
-#: ../libpurple/protocols/qq/sys_msg.c:91
-#: ../libpurple/protocols/qq/sys_msg.c:249
 msgid "Reject"
 msgstr "Kieltäydy"
 
-#: ../libpurple/certificate.c:1210
 msgid "_View Certificate..."
 msgstr "_Näytä varmenne..."
 
 #. Prompt the user to authenticate the certificate
 #. vrq will be completed by user_auth
-#: ../libpurple/certificate.c:1311
 #, c-format
 msgid ""
 "The certificate presented by \"%s\" is self-signed. It cannot be "
@@ -2408,7 +1643,6 @@
 "Kohteen \"%s\" esittämä varmenne on itseallekirjoitettu. Sitä ei voida "
 "automaattisesti tarkistaa."
 
-#: ../libpurple/certificate.c:1329
 #, c-format
 msgid "The certificate chain presented for %s is not valid."
 msgstr "Kohteelle %s esitetty varmenneketju ei ole kelvollinen."
@@ -2418,16 +1652,13 @@
 #. stifle it.
 #. TODO: Probably wrong.
 #. TODO: Probably wrong
-#: ../libpurple/certificate.c:1337 ../libpurple/certificate.c:1407
 msgid "SSL Certificate Error"
 msgstr "SSL-varmennevirhe"
 
-#: ../libpurple/certificate.c:1338
 msgid "Invalid certificate chain"
 msgstr "Epäkelpo varmenneketju"
 
 #. vrq will be completed by user_auth
-#: ../libpurple/certificate.c:1359
 msgid ""
 "You have no database of root certificates, so this certificate cannot be "
 "validated."
@@ -2435,12 +1666,10 @@
 "Juurivarmennetietokantaa ei ole, joten tätä varmennetta ei voi kelpuuttaa."
 
 #. vrq will be completed by user_auth
-#: ../libpurple/certificate.c:1382
 msgid ""
 "The root certificate this one claims to be issued by is unknown to Pidgin."
 msgstr "Tämän varmenteen myöntäjän juurivarmenne on tuntematon Pidginille."
 
-#: ../libpurple/certificate.c:1399
 #, c-format
 msgid ""
 "The certificate chain presented by %s does not have a valid digital "
@@ -2450,7 +1679,6 @@
 "Kohteen %s esittämällä varmenneketjulla ei ole kelvollista digitaalista "
 "allekirjoitusta varmentajalta jolta se väittää allekirjoituksen olevan."
 
-#: ../libpurple/certificate.c:1408
 msgid "Invalid certificate authority signature"
 msgstr "Epäkelpo varmentajan allekirjoitus"
 
@@ -2458,7 +1686,6 @@
 #. TODO: Provide the user with more guidance about why he is
 #. being prompted
 #. vrq will be completed by user_auth
-#: ../libpurple/certificate.c:1434
 #, c-format
 msgid ""
 "The certificate presented by \"%s\" claims to be from \"%s\" instead.  This "
@@ -2468,7 +1695,6 @@
 "saattaa tarkoittaa ettet ole yhdistämässä siihen palveluun johon luulet."
 
 #. Make messages
-#: ../libpurple/certificate.c:1896
 #, c-format
 msgid ""
 "Common name: %s\n"
@@ -2486,127 +1712,94 @@
 "Vanhenemispäivä: %s\n"
 
 #. TODO: Find what the handle ought to be
-#: ../libpurple/certificate.c:1905
 msgid "Certificate Information"
 msgstr "Varmennetiedot"
 
-#: ../libpurple/connection.c:120
 msgid "Registration Error"
 msgstr "Rekisteröintivirhe"
 
-#: ../libpurple/connection.c:193
 msgid "Unregistration Error"
 msgstr "Rekisteröinnin poistamisen virhe"
 
-#: ../libpurple/connection.c:347
 #, c-format
 msgid "+++ %s signed on"
 msgstr "+++ %s kirjautui sisään"
 
-#: ../libpurple/connection.c:377
 #, c-format
 msgid "+++ %s signed off"
 msgstr "+++ %s kirjautui ulos"
 
-#: ../libpurple/connection.c:530 ../libpurple/plugin.c:277
-#: ../libpurple/protocols/jabber/buddy.c:2397
-#: ../libpurple/protocols/msn/servconn.c:141
-#: ../libpurple/protocols/msn/session.c:377
-#: ../libpurple/protocols/msnp9/servconn.c:139
-#: ../libpurple/protocols/msnp9/session.c:329
-#: ../libpurple/protocols/oscar/family_chatnav.c:63
 msgid "Unknown error"
 msgstr "Tuntematon virhe"
 
-#: ../libpurple/conversation.c:170
 msgid "Unable to send message: The message is too large."
 msgstr "Viestiä ei voi lähettää: viesti on liian suuri."
 
-#: ../libpurple/conversation.c:173 ../libpurple/conversation.c:186
 #, c-format
 msgid "Unable to send message to %s."
 msgstr "Viestiä ei voi lähettää käyttäjälle %s."
 
-#: ../libpurple/conversation.c:174
 msgid "The message is too large."
 msgstr "Viesti on liian suuri."
 
-#: ../libpurple/conversation.c:183 ../libpurple/protocols/bonjour/jabber.c:294
-#: ../libpurple/protocols/bonjour/jabber.c:337
 msgid "Unable to send message."
 msgstr "Viestiä ei voi lähettää."
 
-#: ../libpurple/conversation.c:1231
 msgid "Send Message"
 msgstr "Lähetä viesti"
 
-#: ../libpurple/conversation.c:1234
 msgid "_Send Message"
 msgstr "_Lähetä viesti"
 
-#: ../libpurple/conversation.c:1640
 #, c-format
 msgid "%s entered the room."
 msgstr "%s saapui huoneeseen."
 
-#: ../libpurple/conversation.c:1643
 #, c-format
 msgid "%s [<I>%s</I>] entered the room."
 msgstr "%s [<I>%s</I>] saapui huoneeseen."
 
-#: ../libpurple/conversation.c:1753
 #, c-format
 msgid "You are now known as %s"
 msgstr "Olet nyt nimeltäsi %s"
 
-#: ../libpurple/conversation.c:1773
 #, c-format
 msgid "%s is now known as %s"
 msgstr "%s on nyt nimeltään %s"
 
-#: ../libpurple/conversation.c:1848
 #, c-format
 msgid "%s left the room."
 msgstr "%s poistui huoneesta."
 
-#: ../libpurple/conversation.c:1851
 #, c-format
 msgid "%s left the room (%s)."
 msgstr "%s poistui huoneesta (%s)."
 
-#: ../libpurple/dbus-server.c:586
 #, c-format
 msgid "Failed to get connection: %s"
 msgstr "Yhteyden saaminen epäonnistui: %s"
 
 # c-format
-#: ../libpurple/dbus-server.c:598
 #, c-format
 msgid "Failed to get name: %s"
 msgstr "Nimen saaminen epäonnistui: %s"
 
-#: ../libpurple/dbus-server.c:612
 #, c-format
 msgid "Failed to get serv name: %s"
 msgstr "Palvelinnimen saaminen epäonnistui: %s"
 
-#: ../libpurple/dbus-server.h:86
 msgid "Purple's D-BUS server is not running for the reason listed below"
 msgstr "Purplen D-BUS-palvelin ei ole käynnissä alla mainitusta syystä"
 
-#: ../libpurple/desktopitem.c:287 ../libpurple/desktopitem.c:878
 msgid "No name"
 msgstr "Ei nimeä"
 
-#: ../libpurple/dnsquery.c:532
 msgid "Unable to create new resolver process\n"
 msgstr "Selvitysprosessin luominen epäonnistui\n"
 
-#: ../libpurple/dnsquery.c:537
 msgid "Unable to send request to resolver process\n"
 msgstr "Pyyntöä ei voi lähettää selvitysprosessille\n"
 
-#: ../libpurple/dnsquery.c:570 ../libpurple/dnsquery.c:719
 #, c-format
 msgid ""
 "Error resolving %s:\n"
@@ -2615,13 +1808,10 @@
 "Virhe selvitettäessä %s:\n"
 "%s"
 
-#: ../libpurple/dnsquery.c:573 ../libpurple/dnsquery.c:733
-#: ../libpurple/dnsquery.c:851
 #, c-format
 msgid "Error resolving %s: %d"
 msgstr "Virhe selvitettäessä %s: %d"
 
-#: ../libpurple/dnsquery.c:595
 #, c-format
 msgid ""
 "Error reading from resolver process:\n"
@@ -2630,21 +1820,17 @@
 "Virhe luettaessa selvitysprosessista:\n"
 "%s"
 
-#: ../libpurple/dnsquery.c:599
 #, c-format
 msgid "EOF while reading from resolver process"
 msgstr "EOF luettaessa selvitysprosessista"
 
-#: ../libpurple/dnsquery.c:783
 #, c-format
 msgid "Thread creation failure: %s"
 msgstr "Säikeen luonti epäonnistui: %s"
 
-#: ../libpurple/dnsquery.c:784
 msgid "Unknown reason"
 msgstr "Tuntematon syy"
 
-#: ../libpurple/ft.c:210
 #, c-format
 msgid ""
 "Error reading %s: \n"
@@ -2653,7 +1839,6 @@
 "Virhe luettaessa %s:  \n"
 "%s.\n"
 
-#: ../libpurple/ft.c:214
 #, c-format
 msgid ""
 "Error writing %s: \n"
@@ -2662,7 +1847,6 @@
 "Virhe kirjoitettaessa %s: \n"
 "%s.\n"
 
-#: ../libpurple/ft.c:218
 #, c-format
 msgid ""
 "Error accessing %s: \n"
@@ -2671,39 +1855,31 @@
 "Virhe käytettäessä tiedostoa %s: \n"
 "%s.\n"
 
-#: ../libpurple/ft.c:254
 msgid "Directory is not writable."
 msgstr "Kansioon ei ole kirjoitusoikeuksia."
 
-#: ../libpurple/ft.c:269
 msgid "Cannot send a file of 0 bytes."
 msgstr "Ei voi lähettää tiedostoa, jonka koko on 0 tavua."
 
-#: ../libpurple/ft.c:279
 msgid "Cannot send a directory."
 msgstr "Kansiota ei voi lähettää."
 
-#: ../libpurple/ft.c:288
 #, c-format
 msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n"
 msgstr "%s ei ole tavallinen tiedosto. Ei suostuta ylikirjoittamaan sitä.\n"
 
-#: ../libpurple/ft.c:348
 #, c-format
 msgid "%s wants to send you %s (%s)"
 msgstr "%s on lähettämässä sinulle %s (%s)"
 
-#: ../libpurple/ft.c:355
 #, c-format
 msgid "%s wants to send you a file"
 msgstr "Käyttäjä %s tahtoo lähettää sinulle tiedoston"
 
-#: ../libpurple/ft.c:398
 #, c-format
 msgid "Accept file transfer request from %s?"
 msgstr "Hyväksytäänkö tiedostonsiirtopyyntö käyttäjältä %s?"
 
-#: ../libpurple/ft.c:402
 #, c-format
 msgid ""
 "A file is available for download from:\n"
@@ -2714,135 +1890,105 @@
 "Etäkone: %s\n"
 "Portti: %d"
 
-#: ../libpurple/ft.c:437
 #, c-format
 msgid "%s is offering to send file %s"
 msgstr "%s tarjoaa tiedostoa %s"
 
-#: ../libpurple/ft.c:490
 #, c-format
 msgid "%s is not a valid filename.\n"
 msgstr "%s ei ole kelvollinen tiedostonimi.\n"
 
-#: ../libpurple/ft.c:511
 #, c-format
 msgid "Offering to send %s to %s"
 msgstr "Tarjotaan tiedostoa %s lähetettäväksi käyttäjälle %s."
 
-#: ../libpurple/ft.c:523
 #, c-format
 msgid "Starting transfer of %s from %s"
 msgstr "Aloitetaan tiedoston %s siirto käyttäjältä %s"
 
-#: ../libpurple/ft.c:700
 #, c-format
 msgid "Transfer of file %s complete"
 msgstr "Tiedoston %s siirto valmis"
 
-#: ../libpurple/ft.c:703
 #, c-format
 msgid "File transfer complete"
 msgstr "Tiedostonsiirto valmis"
 
-#: ../libpurple/ft.c:1138
 #, c-format
 msgid "You canceled the transfer of %s"
 msgstr "Peruutit tiedoston %s siirron"
 
-#: ../libpurple/ft.c:1143
 #, c-format
 msgid "File transfer cancelled"
 msgstr "Tiedostonsiirto peruutettu"
 
-#: ../libpurple/ft.c:1201
 #, c-format
 msgid "%s canceled the transfer of %s"
 msgstr "%s peruutti tiedoston %s siirron"
 
-#: ../libpurple/ft.c:1206
 #, c-format
 msgid "%s canceled the file transfer"
 msgstr "Käyttäjä %s peruutti tiedostonsiirron"
 
-#: ../libpurple/ft.c:1263
 #, c-format
 msgid "File transfer to %s failed."
 msgstr "Tiedostonsiirto käyttäjälle %s epäonnistui."
 
-#: ../libpurple/ft.c:1265
 #, c-format
 msgid "File transfer from %s failed."
 msgstr "Tiedostonsiirto käyttäjältä %s epäonnistui."
 
-#: ../libpurple/gconf/purple.schemas.in.h:1
 msgid "Run the command in a terminal"
 msgstr "Suorita komento päätteessä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:2
 msgid "The command used to handle \"aim\" URLs, if enabled."
 msgstr "Komento jota käytetään \"aim\"-URLien käsittelyyn, jos käytössä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:3
 msgid "The command used to handle \"gg\" URLs, if enabled."
 msgstr "Komento jota käytetään \"gg\"-URLien käsittelyyn, jos käytössä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:4
 msgid "The command used to handle \"icq\" URLs, if enabled."
 msgstr "Komento jota käytetään \"icq\"-URLien käsittelyyn, jos käytössä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:5
 msgid "The command used to handle \"irc\" URLs, if enabled."
 msgstr "Komento jota käytetään \"irc\"-URLien käsittelyyn, jos käytössä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:6
 msgid "The command used to handle \"msnim\" URLs, if enabled."
 msgstr "Komento jota käytetään \"msnim\"-URLien käsittelyyn, jos käytössä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:7
 msgid "The command used to handle \"sip\" URLs, if enabled."
 msgstr "Komento jota käytetään \"sip\"-URLien käsittelyyn, jos käytössä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:8
 msgid "The command used to handle \"xmpp\" URLs, if enabled."
 msgstr "Komento jota käytetään \"xmpp\"-URLien käsittelyyn, jos käytössä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:9
 msgid "The command used to handle \"ymsgr\" URLs, if enabled."
 msgstr "Komento jota käytetään \"ymsgr\"-URLien käsittelyyn, jos käytössä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:10
 msgid "The handler for \"aim\" URLs"
 msgstr "\"aim\"-URLien käsittelijä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:11
 msgid "The handler for \"gg\" URLs"
 msgstr "\"gg\"-URLien käsittelijä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:12
 msgid "The handler for \"icq\" URLs"
 msgstr "\"icq\"-URLien käsittelijä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:13
 msgid "The handler for \"irc\" URLs"
 msgstr "\"irc\"-URLien käsittelijä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:14
 msgid "The handler for \"msnim\" URLs"
 msgstr "\"msnim\"-URLien käsittelijä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:15
 msgid "The handler for \"sip\" URLs"
 msgstr "\"sip\"-URLien käsittelijä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:16
 msgid "The handler for \"xmpp\" URLs"
 msgstr "\"xmpp\"-URLien käsittelijä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:17
 msgid "The handler for \"ymsgr\" URLs"
 msgstr "\"ymsgr\"-URLien käsittelijä"
 
-#: ../libpurple/gconf/purple.schemas.in.h:18
 msgid ""
 "True if the command specified in the \"command\" key should handle \"aim\" "
 "URLs."
@@ -2850,7 +1996,6 @@
 "Tosi, jos \"komento\"-avaimessa määriteltyä komentoa tulisi käyttää \"aim\"-"
 "URLien käsittelyyn."
 
-#: ../libpurple/gconf/purple.schemas.in.h:19
 msgid ""
 "True if the command specified in the \"command\" key should handle \"gg\" "
 "URLs."
@@ -2858,7 +2003,6 @@
 "Tosi, jos \"komento\"-avaimessa määriteltyä komentoa tulisi käyttää \"gg\"-"
 "URLien käsittelyyn."
 
-#: ../libpurple/gconf/purple.schemas.in.h:20
 msgid ""
 "True if the command specified in the \"command\" key should handle \"icq\" "
 "URLs."
@@ -2866,7 +2010,6 @@
 "Tosi, jos \"komento\"-avaimessa määriteltyä komentoa tulisi käyttää \"icq\"-"
 "URLien käsittelyyn."
 
-#: ../libpurple/gconf/purple.schemas.in.h:21
 msgid ""
 "True if the command specified in the \"command\" key should handle \"irc\" "
 "URLs."
@@ -2874,7 +2017,6 @@
 "Tosi, jos \"komento\"-avaimessa määriteltyä komentoa tulisi käyttää \"irc\"-"
 "URLien käsittelyyn."
 
-#: ../libpurple/gconf/purple.schemas.in.h:22
 msgid ""
 "True if the command specified in the \"command\" key should handle \"msnim\" "
 "URLs."
@@ -2882,7 +2024,6 @@
 "Tosi, jos \"komento\"-avaimessa määriteltyä komentoa tulisi käyttää \"msnim"
 "\"-URLien käsittelyyn."
 
-#: ../libpurple/gconf/purple.schemas.in.h:23
 msgid ""
 "True if the command specified in the \"command\" key should handle \"sip\" "
 "URLs."
@@ -2890,7 +2031,6 @@
 "Tosi, jos \"komento\"-avaimessa määriteltyä komentoa tulisi käyttää \"sip\"-"
 "URLien käsittelyyn."
 
-#: ../libpurple/gconf/purple.schemas.in.h:24
 msgid ""
 "True if the command specified in the \"command\" key should handle \"xmpp\" "
 "URLs."
@@ -2898,7 +2038,6 @@
 "Tosi, jos \"komento\"-avaimessa määriteltyä komentoa tulisi käyttää \"xmpp\"-"
 "URLien käsittelyyn."
 
-#: ../libpurple/gconf/purple.schemas.in.h:25
 msgid ""
 "True if the command specified in the \"command\" key should handle \"ymsgr\" "
 "URLs."
@@ -2906,7 +2045,6 @@
 "Tosi, jos \"komento\"-avaimessa määriteltyä komentoa tulisi käyttää \"ymsgr"
 "\"-URLien käsittelyyn."
 
-#: ../libpurple/gconf/purple.schemas.in.h:26
 msgid ""
 "True if the command used to handle this type of URL should be run in a "
 "terminal."
@@ -2914,63 +2052,48 @@
 "Tosi, jos tämäntyyppisen URL:n käsittelyyn käytettävä komento tulisi ajaa "
 "päätteessä."
 
-#: ../libpurple/gconf/purple.schemas.in.h:27
 msgid "Whether the specified command should handle \"aim\" URLs"
 msgstr "Määritellyn komennon tulee käsitellä \"aim\"-URLt"
 
-#: ../libpurple/gconf/purple.schemas.in.h:28
 msgid "Whether the specified command should handle \"gg\" URLs"
 msgstr "Määritellyn komennon tulee käsitellä \"gg\"-URLt"
 
-#: ../libpurple/gconf/purple.schemas.in.h:29
 msgid "Whether the specified command should handle \"icq\" URLs"
 msgstr "Määritellyn komennon tulee käsitellä \"icq\"-URLt"
 
-#: ../libpurple/gconf/purple.schemas.in.h:30
 msgid "Whether the specified command should handle \"irc\" URLs"
 msgstr "Määritellyn komennon tulee käsitellä \"irc\"-URLt"
 
-#: ../libpurple/gconf/purple.schemas.in.h:31
 msgid "Whether the specified command should handle \"msnim\" URLs"
 msgstr "Määritellyn komennon tulee käsitellä \"msnim\"-URLt"
 
-#: ../libpurple/gconf/purple.schemas.in.h:32
 msgid "Whether the specified command should handle \"sip\" URLs"
 msgstr "Määritellyn komennon tulee käsitellä \"sip\"-URLt"
 
-#: ../libpurple/gconf/purple.schemas.in.h:33
 msgid "Whether the specified command should handle \"xmpp\" URLs"
 msgstr "Määritellyn komennon tulee käsitellä \"xmpp\"-URLt"
 
-#: ../libpurple/gconf/purple.schemas.in.h:34
 msgid "Whether the specified command should handle \"ymsgr\" URLs"
 msgstr "Määritellyn komennon tulee käsitellä \"ymsgr\"-URLt"
 
-#: ../libpurple/log.c:183
 msgid "<b><font color=\"red\">The logger has no read function</font></b>"
 msgstr "<b><font color=\"red\">Lokilla ei ole read-funktiota</font></b>"
 
-#: ../libpurple/log.c:597
 msgid "HTML"
 msgstr "HTML"
 
-#: ../libpurple/log.c:611
 msgid "Plain text"
 msgstr "Teksti"
 
-#: ../libpurple/log.c:625
 msgid "Old flat format"
 msgstr "Vanha tasainen muoto"
 
-#: ../libpurple/log.c:850
 msgid "Logging of this conversation failed."
 msgstr "Tämän keskustelun kirjaaminen lokiin epäonnistui."
 
-#: ../libpurple/log.c:1293
 msgid "XML"
 msgstr "XML"
 
-#: ../libpurple/log.c:1377
 #, c-format
 msgid ""
 "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-"
@@ -2979,7 +2102,6 @@
 "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s &lt;"
 "AUTOMAATTIVASTAUS&gt;:</b></font> %s<br/>\n"
 
-#: ../libpurple/log.c:1379
 #, c-format
 msgid ""
 "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-"
@@ -2988,45 +2110,39 @@
 "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s &lt;"
 "AUTOMAATTIVASTAUS&gt;:</b></font> %s<br/>\n"
 
-#: ../libpurple/log.c:1437 ../libpurple/log.c:1570
 msgid "<font color=\"red\"><b>Unable to find log path!</b></font>"
 msgstr "<font color=\"red\"><b>Lokin hakemistopolkua ei löydy!</b></font>"
 
-#: ../libpurple/log.c:1449 ../libpurple/log.c:1579
 #, c-format
 msgid "<font color=\"red\"><b>Could not read file: %s</b></font>"
 msgstr "<font color=\"red\"><b>Ei voi lukea tiedostoa: %s</b></font>"
 
-#: ../libpurple/log.c:1511
 #, c-format
 msgid "(%s) %s <AUTO-REPLY>: %s\n"
 msgstr "(%s) %s <AUTOMAATTIVASTAUS>: %s\n"
 
-#: ../libpurple/plugin.c:360
 #, c-format
 msgid "You are using %s, but this plugin requires %s."
 msgstr "Käytät: %s, mutta tämä liitännäinen vaatii: %s."
 
-#: ../libpurple/plugin.c:375
 #, c-format
 msgid "This plugin has not defined an ID."
 msgstr "Tämä liitännäinen ei ole määritellyt tunnistetta (ID)."
 
-#: ../libpurple/plugin.c:443
 #, c-format
 msgid "Plugin magic mismatch %d (need %d)"
 msgstr "Liitännäistaikojen ristiriita %d (tarvitaan %d)"
 
-#: ../libpurple/plugin.c:460
 #, c-format
 msgid "ABI version mismatch %d.%d.x (need %d.%d.x)"
 msgstr "ABI-version ristiriita %d.%d.x (tarvitaan %d.%d.x)"
 
-#: ../libpurple/plugin.c:477
-msgid "Plugin does not implement all required functions"
-msgstr "Liitännäinen ei toteuta kaikkia tarvittavia toimintoja"
-
-#: ../libpurple/plugin.c:542
+msgid ""
+"Plugin does not implement all required functions (list_icon, login and close)"
+msgstr ""
+"Liitännäinen ei toteuta kaikkia tarvittavia toimintoja (list_icon, login ja "
+"close"
+
 #, c-format
 msgid ""
 "The required plugin %s was not found. Please install this plugin and try "
@@ -3034,88 +2150,62 @@
 msgstr ""
 "Vaadittu liitännäinen %s puuttuu. Ole hyvä ja asenna se ja yritä uudelleen."
 
-#: ../libpurple/plugin.c:547
 msgid "Unable to load the plugin"
 msgstr "Liitännäistä ei kyetty lataamaan"
 
-#: ../libpurple/plugin.c:569
 #, c-format
 msgid "The required plugin %s was unable to load."
 msgstr "Vaadittu liitännäinen %s ei latautunut."
 
-#: ../libpurple/plugin.c:573
 msgid "Unable to load your plugin."
 msgstr "Liitännäistä ei kyetty lataamaan"
 
-#: ../libpurple/plugin.c:663
 #, c-format
 msgid "%s requires %s, but it failed to unload."
 msgstr ""
 "%s vaatii liitännäisen %s, mutta sitä ei onnistuttu poistamaan käytöstä"
 
-#: ../libpurple/plugins/autoaccept.c:23
 msgid "Autoaccept"
 msgstr "Automaattihyväksyminen"
 
-#: ../libpurple/plugins/autoaccept.c:25 ../libpurple/plugins/autoaccept.c:26
 msgid "Auto-accept file transfer requests from selected users."
 msgstr ""
 "Hyväksytäänkö tiedostonsiirtopyynnöt valituilta käyttäjiltä automaattisesti."
 
-#: ../libpurple/plugins/autoaccept.c:80
 #, c-format
 msgid "Autoaccepted file transfer of \"%s\" from \"%s\" completed."
 msgstr ""
 "Automaattisesti hyväksytty tiedoston \"%s\" siirto käyttäjältä \"%s\" valmis."
 
-#: ../libpurple/plugins/autoaccept.c:82
 msgid "Autoaccept complete"
 msgstr "Valmis (automaattinen hyväksyntä)"
 
-#: ../libpurple/plugins/autoaccept.c:171
 #, c-format
 msgid "When a file-transfer request arrives from %s"
 msgstr "Kun tiedostonsiirtopyyntö saapuu käyttäjältä %s"
 
-#: ../libpurple/plugins/autoaccept.c:173
 msgid "Set Autoaccept Setting"
 msgstr "Aseta automaattihyväksynnän asetus"
 
-#: ../libpurple/plugins/autoaccept.c:175
 msgid "_Save"
 msgstr "_Tallenna"
 
-#: ../libpurple/plugins/autoaccept.c:176 ../libpurple/plugins/idle.c:170
-#: ../libpurple/plugins/idle.c:204 ../libpurple/plugins/idle.c:230
-#: ../libpurple/protocols/oscar/oscar.c:1496
-#: ../libpurple/protocols/oscar/oscar.c:2288
-#: ../libpurple/protocols/oscar/oscar.c:2336
-#: ../libpurple/protocols/oscar/oscar.c:5999
-#: ../libpurple/protocols/oscar/oscar.c:6054
-#: ../libpurple/protocols/oscar/oscar.c:6281
-#: ../libpurple/protocols/oscar/oscar.c:6351 ../libpurple/request.h:1401
-#: ../libpurple/request.h:1411
 msgid "_Cancel"
 msgstr "_Peru"
 
-#: ../libpurple/plugins/autoaccept.c:179
 msgid "Ask"
 msgstr "Kysy"
 
-#: ../libpurple/plugins/autoaccept.c:180
 msgid "Auto Accept"
 msgstr "Hyväksy automaattisesti"
 
-#: ../libpurple/plugins/autoaccept.c:181
 msgid "Auto Reject"
 msgstr "Hylkää automaattisesti"
 
-#: ../libpurple/plugins/autoaccept.c:196
 msgid "Autoaccept File Transfers..."
 msgstr "Tiedostonsiirtojen automaattihyväksyminen..."
 
 #. XXX: Is there a better way than this? There really should be.
-#: ../libpurple/plugins/autoaccept.c:226
 msgid ""
 "Path to save the files in\n"
 "(Please provide the full path)"
@@ -3123,11 +2213,9 @@
 "Polku johon tiedostot tallennetaan\n"
 "(Anna koko polku)"
 
-#: ../libpurple/plugins/autoaccept.c:231
 msgid "Automatically reject from users not in buddy list"
 msgstr "Hylkää automaattisesti käyttäjiltä jotka eivät ole tuttavia"
 
-#: ../libpurple/plugins/autoaccept.c:235
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
 "(only when there's no conversation with the sender)"
@@ -3136,18 +2224,15 @@
 "valmis\n"
 "(vain kun keskustelua lähettäjän kanssa ei avoinna)"
 
-#: ../libpurple/plugins/buddynote.c:46 ../libpurple/protocols/msn/msn.c:1830
-#: ../libpurple/protocols/msn/msn.c:1860
-#: ../libpurple/protocols/msnp9/msn.c:1671
-#: ../libpurple/protocols/msnp9/msn.c:1701
+msgid "Create a new directory for each user"
+msgstr "Luo uusi hakemisto jokaiselle käyttäjälle"
+
 msgid "Notes"
 msgstr "Merkinnät"
 
-#: ../libpurple/plugins/buddynote.c:47
 msgid "Enter your notes below..."
 msgstr "Kirjoita merkintäsi alle..."
 
-#: ../libpurple/plugins/buddynote.c:65
 msgid "Edit Notes..."
 msgstr "Muokkaa merkintöjä..."
 
@@ -3159,18 +2244,15 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/buddynote.c:90 ../pidgin/plugins/gtkbuddynote.c:74
 msgid "Buddy Notes"
 msgstr "Tuttavamerkinnät"
 
 #. *< name
 #. *< version
-#: ../libpurple/plugins/buddynote.c:92 ../pidgin/plugins/gtkbuddynote.c:76
 msgid "Store notes on particular buddies."
 msgstr "Tallenna merkintöjä tiettyjen tuttavien kohdalle."
 
 #. *< summary
-#: ../libpurple/plugins/buddynote.c:93 ../pidgin/plugins/gtkbuddynote.c:77
 msgid "Adds the option to store notes for buddies on your buddy list."
 msgstr "Lisää valinnan merkintöjen tallentamiseen tuttaviesi kohdalle."
 
@@ -3180,7 +2262,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ciphertest.c:264
 msgid "Cipher Test"
 msgstr "Salaustesti"
 
@@ -3188,7 +2269,6 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ciphertest.c:267 ../libpurple/plugins/ciphertest.c:269
 msgid "Tests the ciphers that ship with libpurple."
 msgstr "Testaa libpurplen mukana tulevat salausmenetelmät."
 
@@ -3198,7 +2278,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/dbus-example.c:155
 msgid "DBus Example"
 msgstr "DBus-esimerkki"
 
@@ -3206,8 +2285,6 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/dbus-example.c:158
-#: ../libpurple/plugins/dbus-example.c:160
 msgid "DBus Plugin Example"
 msgstr "DBus-esimerkkiliitännäinen"
 
@@ -3217,7 +2294,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/filectl.c:248
 msgid "File Control"
 msgstr "Komentotiedostohallinta"
 
@@ -3225,50 +2301,38 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/filectl.c:251 ../libpurple/plugins/filectl.c:253
 msgid "Allows control by entering commands in a file."
 msgstr "Mahdollistaa hallinnan komentotiedostolla."
 
-#: ../libpurple/plugins/idle.c:158 ../libpurple/plugins/idle.c:218
 msgid "Minutes"
 msgstr "Minuuttia"
 
 #. This is a cultural reference.  Dy'er Mak'er is a song by Led Zeppelin.
 #. If that doesn't translate well into your language, drop the 's before translating.
-#: ../libpurple/plugins/idle.c:165 ../libpurple/plugins/idle.c:199
-#: ../libpurple/plugins/idle.c:225 ../libpurple/plugins/idle.c:318
 msgid "I'dle Mak'er"
 msgstr "Joutenoloajan säätö"
 
-#: ../libpurple/plugins/idle.c:166 ../libpurple/plugins/idle.c:258
 msgid "Set Account Idle Time"
 msgstr "Aseta tilin joutenoloaika"
 
-#: ../libpurple/plugins/idle.c:169 ../libpurple/plugins/idle.c:229
 msgid "_Set"
 msgstr "_Aseta"
 
-#: ../libpurple/plugins/idle.c:184
 msgid "None of your accounts are idle."
 msgstr "Yksikään käyttäjätileistäsi ei ole jouten."
 
-#: ../libpurple/plugins/idle.c:200 ../libpurple/plugins/idle.c:262
 msgid "Unset Account Idle Time"
 msgstr "Poista tilin joutenoloajan asetus"
 
-#: ../libpurple/plugins/idle.c:203
 msgid "_Unset"
 msgstr "_Poista asetus"
 
-#: ../libpurple/plugins/idle.c:226 ../libpurple/plugins/idle.c:266
 msgid "Set Idle Time for All Accounts"
 msgstr "Aseta joutenoloaika kaikille käyttäjätileille"
 
-#: ../libpurple/plugins/idle.c:271
 msgid "Unset Idle Time for All Idled Accounts"
 msgstr "Ota pois joutenoloaika kaikilta jouten olevilta tileiltä"
 
-#: ../libpurple/plugins/idle.c:320 ../libpurple/plugins/idle.c:321
 msgid "Allows you to hand-configure how long you've been idle"
 msgstr "Antaa sinun säätää itse kuinka kauan olet ollut jouten"
 
@@ -3278,19 +2342,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ipc-test-client.c:87
 msgid "IPC Test Client"
 msgstr "IPC-testiasiakasohjelma"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../libpurple/plugins/ipc-test-client.c:90
 msgid "Test plugin IPC support, as a client."
 msgstr "Testiliitännäinen - IPC asiakasohjelmana"
 
 #. *  description
-#: ../libpurple/plugins/ipc-test-client.c:92
 msgid ""
 "Test plugin IPC support, as a client. This locates the server plugin and "
 "calls the commands registered."
@@ -3304,31 +2365,25 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ipc-test-server.c:74
 msgid "IPC Test Server"
 msgstr "IPC-testipalvelin"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../libpurple/plugins/ipc-test-server.c:77
 msgid "Test plugin IPC support, as a server."
 msgstr "Testiliitännäinen - IPC palvelimena"
 
 #. *  description
-#: ../libpurple/plugins/ipc-test-server.c:79
 msgid "Test plugin IPC support, as a server. This registers the IPC commands."
 msgstr "Testiliitännäinen - IPC palvelimena. Tämä rekisteröi IPC-komennot."
 
-#: ../libpurple/plugins/joinpart.c:228
 msgid "Join/Part Hiding Configuration"
 msgstr "Liittymisen/poistumisen piilotuksen asetukset"
 
-#: ../libpurple/plugins/joinpart.c:232
 msgid "Minimum Room Size"
 msgstr "Huoneen minimikoko"
 
-#: ../libpurple/plugins/joinpart.c:238
 msgid "User Inactivity Timeout (in minutes)"
 msgstr "Käyttäjän inaktiivisuuden aikakatkaisu (minuuteissa)"
 
@@ -3338,19 +2393,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/joinpart.c:269
 msgid "Join/Part Hiding"
 msgstr "Liity/poistu piilotus"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../libpurple/plugins/joinpart.c:272
 msgid "Hides extraneous join/part messages."
 msgstr "Piilottaa ylimääräiset liittymis/poistumisviestit."
 
 #. *  description
-#: ../libpurple/plugins/joinpart.c:274
 msgid ""
 "This plugin hides join/part messages in large rooms, except for those users "
 "actively taking part in a conversation."
@@ -3362,34 +2414,25 @@
 #. * offset is way off.  The user should never really see it, but
 #. * it's here just in case.  The parens are to make it clear it's
 #. * not a real timezone.
-#: ../libpurple/plugins/log_reader.c:499
 msgid "(UTC)"
 msgstr "(UTC)"
 
-#: ../libpurple/plugins/log_reader.c:1554
 msgid "User is offline."
 msgstr "Käyttäjä on poissa linjoilta."
 
-#: ../libpurple/plugins/log_reader.c:1560
 msgid "Auto-response sent:"
 msgstr "Automaattinen vastaus lähetetty:"
 
-#: ../libpurple/plugins/log_reader.c:1570
-#: ../libpurple/plugins/log_reader.c:1573
-#: ../libpurple/plugins/statenotify.c:84
 #, c-format
 msgid "%s has signed off."
 msgstr "%s on kirjautunut ulos."
 
-#: ../libpurple/plugins/log_reader.c:1587
 msgid "One or more messages may have been undeliverable."
 msgstr "Yksi tai useampi viesti on saattanut jäädä lähettämättä."
 
-#: ../libpurple/plugins/log_reader.c:1597
 msgid "You were disconnected from the server."
 msgstr "Yhteys palvelimeen on katkennut."
 
-#: ../libpurple/plugins/log_reader.c:1605
 msgid ""
 "You are currently disconnected. Messages will not be received unless you are "
 "logged in."
@@ -3397,85 +2440,65 @@
 "Yhteyttä ei tällä hetkellä ole. Viestejä ei vastaanoteta ellet olet "
 "kirjautuneena sisään."
 
-#: ../libpurple/plugins/log_reader.c:1620
 msgid "Message could not be sent because the maximum length was exceeded."
 msgstr "Viestiä ei voi lähettää koska suurin viestin koko ylitettiin."
 
-#: ../libpurple/plugins/log_reader.c:1625
 msgid "Message could not be sent."
 msgstr "Viestiäsi ei voi lähettää."
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2699
-#: ../libpurple/plugins/log_reader.c:2855
 msgid "Adium"
 msgstr "Adium"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2712
-#: ../libpurple/plugins/log_reader.c:2860
 msgid "Fire"
 msgstr "Fire"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2724
-#: ../libpurple/plugins/log_reader.c:2864
 msgid "Messenger Plus!"
 msgstr "Messenger Plus!"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2738
-#: ../libpurple/plugins/log_reader.c:2869
 msgid "QIP"
 msgstr "QIP"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2750
-#: ../libpurple/plugins/log_reader.c:2873
 msgid "MSN Messenger"
 msgstr "MSN Messenger"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2762
-#: ../libpurple/plugins/log_reader.c:2877
 msgid "Trillian"
 msgstr "Trillian"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
-#: ../libpurple/plugins/log_reader.c:2774
-#: ../libpurple/plugins/log_reader.c:2881
 msgid "aMSN"
 msgstr "aMSN"
 
 #. Add general preferences.
-#: ../libpurple/plugins/log_reader.c:2837
 msgid "General Log Reading Configuration"
 msgstr "Yleiset lokikatselimen asetukset"
 
-#: ../libpurple/plugins/log_reader.c:2841
 msgid "Fast size calculations"
 msgstr "Nopeat koon laskemiset"
 
-#: ../libpurple/plugins/log_reader.c:2845
 msgid "Use name heuristics"
 msgstr "Käytä nimiheuristiikkaa"
 
 #. Add Log Directory preferences.
-#: ../libpurple/plugins/log_reader.c:2851
 msgid "Log Directory"
 msgstr "Lokihakemisto"
 
@@ -3485,19 +2508,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/log_reader.c:2910
 msgid "Log Reader"
 msgstr "Lokikatselin"
 
 #. *< name
 #. *< version
 #. * summary
-#: ../libpurple/plugins/log_reader.c:2914
 msgid "Includes other IM clients' logs in the log viewer."
 msgstr "Sisällyttää muiden pikaviestinohjelmien lokit lokikatselimeen."
 
 #. * description
-#: ../libpurple/plugins/log_reader.c:2918
 msgid ""
 "When viewing logs, this plugin will include logs from other IM clients. "
 "Currently, this includes Adium, MSN Messenger, and Trillian.\n"
@@ -3511,20 +2531,15 @@
 "\n"
 "Varoitus: Tämä liitännäinen on vielä kehitysasteella ja voi kaatua usein."
 
-#: ../libpurple/plugins/mono/loader/mono.c:217
 msgid "Mono Plugin Loader"
 msgstr "Mono-liitännäisen lataaja"
 
-#: ../libpurple/plugins/mono/loader/mono.c:219
-#: ../libpurple/plugins/mono/loader/mono.c:220
 msgid "Loads .NET plugins with Mono."
 msgstr "Lataa .NET-liitännäisiä Monon avulla."
 
-#: ../libpurple/plugins/newline.c:57
 msgid "Add new line in IMs"
 msgstr "Lisää rivinvaihto pikaviesteihin"
 
-#: ../libpurple/plugins/newline.c:61
 msgid "Add new line in Chats"
 msgstr "Lisää rivinvaihto keskusteluihin"
 
@@ -3537,18 +2552,15 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/newline.c:104
 msgid "New Line"
 msgstr "Rivinvaihto"
 
 #. *< name
 #. *< version
-#: ../libpurple/plugins/newline.c:106
 msgid "Prepends a newline to displayed message."
 msgstr "Lisää näytettävän viestin eteen rivinvaihdon."
 
 #. *< summary
-#: ../libpurple/plugins/newline.c:107
 msgid ""
 "Prepends a newline to messages so that the rest of the message appears below "
 "the username in the conversation window."
@@ -3556,17 +2568,14 @@
 "Lisää viestien eteen rivinvaihdon niin, että viesti näkyy käyttäjänimen "
 "alapuolella keskusteluikkunassa."
 
-#: ../libpurple/plugins/offlinemsg.c:23
 msgid "Offline Message Emulation"
 msgstr "Yhteydettömien viestien emulointi"
 
-#: ../libpurple/plugins/offlinemsg.c:25 ../libpurple/plugins/offlinemsg.c:26
 msgid "Save messages sent to an offline user as pounce."
 msgstr ""
 "Tallenna lähetetyt viestit poissa linjoilta olevalle käyttäjälle "
 "tuttavailmoittimen avulla."
 
-#: ../libpurple/plugins/offlinemsg.c:95
 msgid ""
 "The rest of the messages will be saved as pounce. You can edit/delete the "
 "pounce from the `Buddy Pounce' dialog."
@@ -3574,7 +2583,6 @@
 "Loput viesteistä tallennetaan ilmoittimeen. Voit muokata/poistaa sen "
 "\"Tuttavailmoittimet\"-valintaikkunasta."
 
-#: ../libpurple/plugins/offlinemsg.c:156
 #, c-format
 msgid ""
 "\"%s\" is currently offline. Do you want to save the rest of the messages in "
@@ -3584,50 +2592,22 @@
 "viesteistä tuttavailmoittimeen, ja automaattisesti lähettää ne kun \"%s\" "
 "kirjautuu takaisin sisään?"
 
-#: ../libpurple/plugins/offlinemsg.c:160
 msgid "Offline Message"
 msgstr "Yhteydetön viesti"
 
-#: ../libpurple/plugins/offlinemsg.c:161
 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
 msgstr ""
 "Voit muokata/poistaa ilmoittimen \"Tuttavailmoittimet\"-valintaikkunassa"
 
-#: ../libpurple/plugins/offlinemsg.c:165
-#: ../libpurple/protocols/msn/dialog.c:141
-#: ../libpurple/protocols/msn/msn.c:675
-#: ../libpurple/protocols/msnp9/dialog.c:133
-#: ../libpurple/protocols/msnp9/msn.c:547
-#: ../libpurple/protocols/msnp9/msn.c:563
-#: ../libpurple/protocols/novell/novell.c:1929
-#: ../libpurple/protocols/silc/buddy.c:317
-#: ../libpurple/protocols/silc/pk.c:113 ../libpurple/protocols/silc/wb.c:308
-#: ../libpurple/protocols/silc10/buddy.c:314
-#: ../libpurple/protocols/silc10/pk.c:119
-#: ../libpurple/protocols/silc10/wb.c:307 ../pidgin/gtkrequest.c:270
 msgid "Yes"
 msgstr "Kyllä"
 
-#: ../libpurple/plugins/offlinemsg.c:166
-#: ../libpurple/protocols/msn/dialog.c:142
-#: ../libpurple/protocols/msn/msn.c:675
-#: ../libpurple/protocols/msnp9/dialog.c:134
-#: ../libpurple/protocols/msnp9/msn.c:547
-#: ../libpurple/protocols/msnp9/msn.c:563
-#: ../libpurple/protocols/novell/novell.c:1930
-#: ../libpurple/protocols/silc/buddy.c:318
-#: ../libpurple/protocols/silc/pk.c:114 ../libpurple/protocols/silc/wb.c:309
-#: ../libpurple/protocols/silc10/buddy.c:315
-#: ../libpurple/protocols/silc10/pk.c:120
-#: ../libpurple/protocols/silc10/wb.c:308 ../pidgin/gtkrequest.c:271
 msgid "No"
 msgstr "Ei"
 
-#: ../libpurple/plugins/offlinemsg.c:193
 msgid "Save offline messages in pounce"
 msgstr "Tallenna yhteydettömät viestit ilmoittimeen"
 
-#: ../libpurple/plugins/offlinemsg.c:197
 msgid "Do not ask. Always save in pounce."
 msgstr "Älä kysy. Tallenna aina ilmoittimeen."
 
@@ -3637,26 +2617,21 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/perl/perl.c:601
 msgid "Perl Plugin Loader"
 msgstr "Perl-liitännäisten lataaja"
 
 #. *< name
 #. *< version
 #. *< summary
-#: ../libpurple/plugins/perl/perl.c:603 ../libpurple/plugins/perl/perl.c:604
 msgid "Provides support for loading perl plugins."
 msgstr "Tuo mahdollisuuden ladata perl-liitännäisiä."
 
-#: ../libpurple/plugins/psychic.c:20
 msgid "Psychic Mode"
 msgstr "Meediotila"
 
-#: ../libpurple/plugins/psychic.c:21
 msgid "Psychic mode for incoming conversation"
 msgstr "Meediotila sisääntuleville keskusteluille"
 
-#: ../libpurple/plugins/psychic.c:22
 msgid ""
 "Causes conversation windows to appear as other users begin to message you.  "
 "This works for AIM, ICQ, XMPP, Sametime, and Yahoo!"
@@ -3665,23 +2640,18 @@
 "sinulle. Tämä toimii AIM-, ICQ-, XMPP-, Sametime- ja Yahoo!-"
 "yhteyskäytännöillä."
 
-#: ../libpurple/plugins/psychic.c:72
 msgid "You feel a disturbance in the force..."
 msgstr "Tunnet häiriön voimassa..."
 
-#: ../libpurple/plugins/psychic.c:91
 msgid "Only enable for users on the buddy list"
 msgstr "Salli vain tuttavaluettelossa oleville käyttäjille"
 
-#: ../libpurple/plugins/psychic.c:96
 msgid "Disable when away"
 msgstr "Pois käytöstä poissa ollessa"
 
-#: ../libpurple/plugins/psychic.c:100
 msgid "Display notification message in conversations"
 msgstr "Näytä ilmoitusviesti keskusteluissa"
 
-#: ../libpurple/plugins/psychic.c:105
 msgid "Raise psychic conversations"
 msgstr "Nosta meediotilan huomaamat keskustelut"
 
@@ -3691,7 +2661,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/signals-test.c:753
 msgid "Signals Test"
 msgstr "Signaalitesti"
 
@@ -3699,8 +2668,6 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/signals-test.c:756
-#: ../libpurple/plugins/signals-test.c:758
 msgid "Test to see that all signals are working properly."
 msgstr "Kokeile nähdäksesi että kaikki signaalit toimivat oikein."
 
@@ -3710,7 +2677,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/simple.c:37
 msgid "Simple Plugin"
 msgstr "\"Yksinkertainen\"-liitännäinen"
 
@@ -3718,13 +2684,10 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/simple.c:40 ../libpurple/plugins/simple.c:42
 msgid "Tests to see that most things are working."
 msgstr "Kokeilee että useimmat asiat toimivat."
 
 #. Scheme name
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:910
-#: ../libpurple/plugins/ssl/ssl-nss.c:731
 msgid "X.509 Certificates"
 msgstr "X.509-varmenteet"
 
@@ -3734,7 +2697,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:994
 msgid "GNUTLS"
 msgstr "GNUTLS"
 
@@ -3742,8 +2704,6 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:997
-#: ../libpurple/plugins/ssl/ssl-gnutls.c:999
 msgid "Provides SSL support through GNUTLS."
 msgstr "Tuo SSL-tuen GNUTLS:n kautta."
 
@@ -3753,7 +2713,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ssl/ssl-nss.c:816
 msgid "NSS"
 msgstr "NSS"
 
@@ -3761,8 +2720,6 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ssl/ssl-nss.c:819
-#: ../libpurple/plugins/ssl/ssl-nss.c:821
 msgid "Provides SSL support through Mozilla NSS."
 msgstr "Tuo SSL-tuen Mozilla-NSS:n kautta."
 
@@ -3772,7 +2729,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/ssl/ssl.c:94
 msgid "SSL"
 msgstr "SSL"
 
@@ -3780,48 +2736,38 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/ssl/ssl.c:97 ../libpurple/plugins/ssl/ssl.c:99
 msgid "Provides a wrapper around SSL support libraries."
 msgstr "Luo liittymän eri SSL-tukikirjastoille."
 
-#: ../libpurple/plugins/statenotify.c:54
 #, c-format
 msgid "%s is no longer away."
 msgstr "%s palasi."
 
-#: ../libpurple/plugins/statenotify.c:56
 #, c-format
 msgid "%s has gone away."
 msgstr "%s poistui."
 
-#: ../libpurple/plugins/statenotify.c:66
 #, c-format
 msgid "%s has become idle."
 msgstr "%s on jouten."
 
-#: ../libpurple/plugins/statenotify.c:68
 #, c-format
 msgid "%s is no longer idle."
 msgstr "%s ei enää ole jouten."
 
-#: ../libpurple/plugins/statenotify.c:77
 #, c-format
 msgid "%s has signed on."
 msgstr "%s on kirjautunut sisään."
 
-#: ../libpurple/plugins/statenotify.c:95
 msgid "Notify When"
 msgstr "Huomautus kun"
 
-#: ../libpurple/plugins/statenotify.c:98
 msgid "Buddy Goes _Away"
 msgstr "Tuttava poi_stuu"
 
-#: ../libpurple/plugins/statenotify.c:101
 msgid "Buddy Goes _Idle"
 msgstr "Tuttava on _jouten"
 
-#: ../libpurple/plugins/statenotify.c:104
 msgid "Buddy _Signs On/Off"
 msgstr "Tuttava _kirjautuu sisään/ulos"
 
@@ -3831,7 +2777,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../libpurple/plugins/statenotify.c:152
 msgid "Buddy State Notification"
 msgstr "Tuttavan tilan ilmoitus"
 
@@ -3839,8 +2784,6 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/plugins/statenotify.c:155
-#: ../libpurple/plugins/statenotify.c:158
 msgid ""
 "Notifies in a conversation window when a buddy goes or returns from away or "
 "idle."
@@ -3848,15 +2791,12 @@
 "Ilmoittaa keskusteluikkunassa kun tuttava on poissa tai jouten ja kun hän "
 "palaa."
 
-#: ../libpurple/plugins/tcl/tcl.c:423
 msgid "Tcl Plugin Loader"
 msgstr "Tcl-liitännäisten lataaja"
 
-#: ../libpurple/plugins/tcl/tcl.c:425 ../libpurple/plugins/tcl/tcl.c:426
 msgid "Provides support for loading Tcl plugins"
 msgstr "Mahdollistaa Tcl-liitännäisten latauksen."
 
-#: ../libpurple/plugins/tcl/tcl.c:509
 msgid ""
 "Unable to detect ActiveTCL installation. If you wish to use TCL plugins, "
 "install ActiveTCL from http://www.activestate.com\n"
@@ -3864,61 +2804,35 @@
 "ActiveTCL-asennusta ei havaittu. Jos haluat käyttää TCL-liitännäisiä, asenna "
 "ActiveTCL osoitteesta http://www.activestate.com\n"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:101
-msgid ""
-"The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://"
-"developer.pidgin.im/wiki/Using%20Pidgin#CanIusePidginforBonjourLink-"
-"LocalMessaging for more information."
+msgid ""
+"The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://d."
+"pidgin.im/BonjourWindows for more information."
 msgstr ""
 "Apple Bonjour for Windows -työkalupakettia ei löytynyt, tarkista usein "
 "kysytyt kysymykset osoitteessa http://developer.pidgin.im/wiki/Using%"
-"20Pidgin#CanIusePidginforBonjourLink-LocalMessaging."
-
-#: ../libpurple/protocols/bonjour/bonjour.c:120
+"20Pidgin#CanIusePidginforBonjourLink-LocalMessaging ."
+
 msgid "Unable to listen for incoming IM connections\n"
 msgstr "Sisääntulevia pikaviestintäyhteyksiä ei voi kuunnella\n"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:147
 msgid ""
 "Unable to establish connection with the local mDNS server.  Is it running?"
 msgstr ""
 "Paikalliseen mDNS-palvelimeen ei voi luoda yhteyttä. Onko se käynnissä?"
 
 #. Creating the options for the protocol
-#: ../libpurple/protocols/bonjour/bonjour.c:392
-#: ../libpurple/protocols/bonjour/bonjour.c:698
-#: ../libpurple/protocols/gg/gg.c:633
-#: ../libpurple/protocols/jabber/jabber.c:1006
 msgid "First name"
 msgstr "Etunimi"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:394
-#: ../libpurple/protocols/bonjour/bonjour.c:701
-#: ../libpurple/protocols/gg/gg.c:628
-#: ../libpurple/protocols/jabber/jabber.c:1010
 msgid "Last name"
 msgstr "Sukunimi"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:398
-#: ../libpurple/protocols/jabber/buddy.c:318
-#: ../libpurple/protocols/jabber/buddy.c:1362
-#: ../libpurple/protocols/jabber/buddy.c:1372
-#: ../libpurple/protocols/jabber/buddy.c:2266
-#: ../libpurple/protocols/silc/ops.c:1055
-#: ../libpurple/protocols/silc/util.c:561
-#: ../libpurple/protocols/silc10/ops.c:1075
-#: ../libpurple/protocols/silc10/util.c:555
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1068
 msgid "Email"
 msgstr "Sähköposti"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:401
-#: ../libpurple/protocols/bonjour/bonjour.c:707
 msgid "AIM Account"
 msgstr "AIM-tili"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:404
-#: ../libpurple/protocols/bonjour/bonjour.c:710
 msgid "XMPP Account"
 msgstr "XMPP-tili"
 
@@ -3932,396 +2846,253 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/bonjour/bonjour.c:508
-#: ../libpurple/protocols/bonjour/bonjour.c:510
 msgid "Bonjour Protocol Plugin"
 msgstr "Bonjour-yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/bonjour/bonjour.c:651
 msgid "Purple Person"
 msgstr "Purple-henkilö"
 
-#: ../libpurple/protocols/bonjour/bonjour.h:33
 msgid "Bonjour"
 msgstr "Bonjour"
 
-#: ../libpurple/protocols/bonjour/jabber.c:429
 #, c-format
 msgid "%s has closed the conversation."
 msgstr "%s on sulkenut keskustelun."
 
-#: ../libpurple/protocols/bonjour/jabber.c:479
-#: ../libpurple/protocols/bonjour/jabber.c:544
-#: ../libpurple/protocols/bonjour/jabber.c:589
-#: ../libpurple/protocols/bonjour/jabber.c:766
-#: ../libpurple/protocols/bonjour/jabber.c:784
 msgid "Unable to send the message, the conversation couldn't be started."
 msgstr "Viestiä ei voi lähettää, keskustelua ei voi aloittaa."
 
-#: ../libpurple/protocols/bonjour/jabber.c:683
 msgid "Cannot open socket"
 msgstr "Pistoketta ei voi avata"
 
-#: ../libpurple/protocols/bonjour/jabber.c:693
-msgid "Error setting socket options"
-msgstr "Virhe asetettaessa pistokevalintoja"
-
-#: ../libpurple/protocols/bonjour/jabber.c:719
 msgid "Could not bind socket to port"
 msgstr "Pistoketta ei voi liittää porttiin"
 
-#: ../libpurple/protocols/bonjour/jabber.c:729
 msgid "Could not listen on socket"
 msgstr "Pistoketta ei voi kuunnella"
 
-#: ../libpurple/protocols/bonjour/mdns_win32.c:110
 msgid "Error communicating with local mDNSResponder."
 msgstr "Virhe viestittäessä paikallisen mDNSResponderin kanssa."
 
-#: ../libpurple/protocols/gg/gg.c:76 ../libpurple/proxy.c:1908
 msgid "Invalid proxy settings"
 msgstr "Epäkelvot välipalvelinvalinnat"
 
-#: ../libpurple/protocols/gg/gg.c:77 ../libpurple/proxy.c:1908
 msgid ""
 "Either the host name or port number specified for your given proxy type is "
 "invalid."
 msgstr ""
 "Joko isäntä tai porttinumero on virheellinen annetulle proxy-asetukselle."
 
-#: ../libpurple/protocols/gg/gg.c:115 ../libpurple/protocols/gg/gg.c:137
-#: ../libpurple/protocols/gg/gg.c:180
 msgid "Token Error"
 msgstr "Vastamerkkivirhe"
 
-#: ../libpurple/protocols/gg/gg.c:116 ../libpurple/protocols/gg/gg.c:138
-#: ../libpurple/protocols/gg/gg.c:181
 msgid "Unable to fetch the token.\n"
 msgstr "Polettia ei voi hakea.\n"
 
-#: ../libpurple/protocols/gg/gg.c:267 ../libpurple/protocols/gg/gg.c:274
-#: ../libpurple/protocols/gg/gg.c:280
 msgid "Save Buddylist..."
 msgstr "Tallenna tuttavat..."
 
-#: ../libpurple/protocols/gg/gg.c:268
 msgid "Your buddylist is empty, nothing was written to the file."
 msgstr "Tuttavia ei ole, mitään ei kirjoitettu tiedostoon."
 
-#: ../libpurple/protocols/gg/gg.c:275
 msgid "Buddylist saved successfully!"
 msgstr "Tuttavat tallennettiin onnistuneesti!"
 
-#: ../libpurple/protocols/gg/gg.c:278
 #, c-format
 msgid "Couldn't write buddy list for %s to %s"
 msgstr "%s-tuttavia ei voi kirjoittaa kohteeseen %s"
 
-#: ../libpurple/protocols/gg/gg.c:303 ../libpurple/protocols/gg/gg.c:304
 msgid "Couldn't load buddylist"
 msgstr "Tuttavien lataus ei onnistunut"
 
-#: ../libpurple/protocols/gg/gg.c:320
 msgid "Load Buddylist..."
 msgstr "Lataa tuttavat..."
 
-#: ../libpurple/protocols/gg/gg.c:321
 msgid "Buddylist loaded successfully!"
 msgstr "Tuttavat ladattiin onnistuneesti."
 
-#: ../libpurple/protocols/gg/gg.c:332
 msgid "Save buddylist..."
 msgstr "Tallenna tuttavat..."
 
-#: ../libpurple/protocols/gg/gg.c:382
+msgid "Load buddylist from file..."
+msgstr "Tuo tuttavat tiedostosta..."
+
 msgid "Fill in the registration fields."
 msgstr "Täytä rekisteröitymiskentät."
 
-#: ../libpurple/protocols/gg/gg.c:389
 msgid "Passwords do not match."
 msgstr "Salasanat eivät täsmää."
 
-#: ../libpurple/protocols/gg/gg.c:399
 msgid "Unable to register new account. Error occurred.\n"
 msgstr "Uuden käyttäjätilin rekisteröinti epäonnistui virheen takia.\n"
 
-#: ../libpurple/protocols/gg/gg.c:412
 msgid "New Gadu-Gadu Account Registered"
 msgstr "Uusi Gadu-Gadu-käyttäjätili rekisteröity"
 
-#: ../libpurple/protocols/gg/gg.c:413
 msgid "Registration completed successfully!"
 msgstr "Rekisteröinti onnistui!"
 
-#: ../libpurple/protocols/gg/gg.c:483 ../libpurple/protocols/gg/gg.c:776
-#: ../libpurple/protocols/jabber/jabber.c:981
-#: ../libpurple/protocols/jabber/jabber.c:984
-#: ../libpurple/protocols/jabber/jabber.c:1772
 msgid "Password"
 msgstr "Salasana"
 
-#: ../libpurple/protocols/gg/gg.c:488 ../libpurple/protocols/gg/gg.c:781
 msgid "Password (retype)"
 msgstr "Salasana (uudelleen)"
 
-#: ../libpurple/protocols/gg/gg.c:493 ../libpurple/protocols/gg/gg.c:786
 msgid "Enter current token"
 msgstr "Syötä nykyinen poletti"
 
-#: ../libpurple/protocols/gg/gg.c:499 ../libpurple/protocols/gg/gg.c:792
 msgid "Current token"
 msgstr "Nykyinen poletti"
 
-#: ../libpurple/protocols/gg/gg.c:503 ../libpurple/protocols/gg/gg.c:504
 msgid "Register New Gadu-Gadu Account"
 msgstr "Rekisteröi uusi Gadu-Gadu-käyttäjätili"
 
-#: ../libpurple/protocols/gg/gg.c:505
 msgid "Please, fill in the following fields"
 msgstr "Täytä seuraavat kentät"
 
-#: ../libpurple/protocols/gg/gg.c:643 ../libpurple/protocols/gg/gg.c:1056
-#: ../libpurple/protocols/gg/gg.c:1128
-#: ../libpurple/protocols/jabber/jabber.c:1018
-#: ../libpurple/protocols/oscar/oscar.c:3826
-#: ../libpurple/protocols/oscar/oscar.c:3839
-#: ../libpurple/protocols/qq/buddy_info.c:49
 msgid "City"
 msgstr "Paikkakunta"
 
-#: ../libpurple/protocols/gg/gg.c:648
 msgid "Year of birth"
 msgstr "Syntymävuosi"
 
-#: ../libpurple/protocols/gg/gg.c:651 ../libpurple/protocols/msn/msn.c:1759
-#: ../libpurple/protocols/msnp9/msn.c:1600
-#: ../libpurple/protocols/myspace/user.c:129
-#: ../libpurple/protocols/oscar/oscar.c:3769
-#: ../libpurple/protocols/qq/buddy_info.c:46
-#: ../libpurple/protocols/qq/qq.c:227 ../libpurple/protocols/qq/qq.c:230
-#: ../libpurple/protocols/qq/qq.c:233 ../libpurple/protocols/qq/qq.c:237
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1098
 msgid "Gender"
 msgstr "Sukupuoli"
 
-#: ../libpurple/protocols/gg/gg.c:652
 msgid "Male or female"
 msgstr "Mies vai nainen"
 
-#: ../libpurple/protocols/gg/gg.c:653
-#: ../libpurple/protocols/oscar/oscar.c:3769
-#: ../libpurple/protocols/qq/buddy_info.c:83
-#: ../libpurple/protocols/qq/qq.c:227
 msgid "Male"
 msgstr "Mies"
 
-#: ../libpurple/protocols/gg/gg.c:654
-#: ../libpurple/protocols/oscar/oscar.c:3769
-#: ../libpurple/protocols/qq/buddy_info.c:84
-#: ../libpurple/protocols/qq/qq.c:230
 msgid "Female"
 msgstr "Nainen"
 
-#: ../libpurple/protocols/gg/gg.c:658
 msgid "Only online"
 msgstr "Vain linjoilla"
 
-#: ../libpurple/protocols/gg/gg.c:662 ../libpurple/protocols/gg/gg.c:663
 msgid "Find buddies"
 msgstr "Etsi tuttavia"
 
-#: ../libpurple/protocols/gg/gg.c:664
 msgid "Please, enter your search criteria below"
 msgstr "Anna hakukriteerisi alla"
 
-#: ../libpurple/protocols/gg/gg.c:702
 msgid "Fill in the fields."
 msgstr "Täytä kentät."
 
-#: ../libpurple/protocols/gg/gg.c:714
 msgid "Your current password is different from the one that you specified."
 msgstr "Nykyinen salasanasi ei ole se jonka kirjoitit."
 
-#: ../libpurple/protocols/gg/gg.c:728
 msgid "Unable to change password. Error occurred.\n"
 msgstr "Salasanaa ei voi muuttaa. Tapahtui virhe.\n"
 
-#: ../libpurple/protocols/gg/gg.c:737
 msgid "Change password for the Gadu-Gadu account"
 msgstr "Vaihda Gadu-Gadu-käyttäjätilin salasana"
 
-#: ../libpurple/protocols/gg/gg.c:738
 msgid "Password was changed successfully!"
 msgstr "Salasanan vaihto onnistui!"
 
-#: ../libpurple/protocols/gg/gg.c:771
 msgid "Current password"
 msgstr "Nykyinen salasana"
 
-#: ../libpurple/protocols/gg/gg.c:796
 msgid "Please, enter your current password and your new password for UIN: "
 msgstr "Syötä sekä nykyinen että uusi salasana tunnukselle: "
 
-#: ../libpurple/protocols/gg/gg.c:800 ../libpurple/protocols/gg/gg.c:801
 msgid "Change Gadu-Gadu Password"
 msgstr "Muuta Gadu-Gadu-salasana"
 
-#: ../libpurple/protocols/gg/gg.c:878
 #, c-format
 msgid "Select a chat for buddy: %s"
 msgstr "Valitse ryhmäkeskustelu tuttavalle: %s"
 
-#: ../libpurple/protocols/gg/gg.c:881 ../libpurple/protocols/gg/gg.c:882
 msgid "Add to chat..."
 msgstr "Lisää ryhmäkeskusteluun..."
 
-#: ../libpurple/protocols/gg/gg.c:1013
-#: ../libpurple/protocols/jabber/buddy.c:2083
-#: ../libpurple/protocols/msn/state.c:29 ../libpurple/protocols/msn/state.c:30
-#: ../libpurple/protocols/msn/state.c:37 ../libpurple/protocols/msn/state.c:38
-#: ../libpurple/protocols/msnp9/state.c:29
-#: ../libpurple/protocols/msnp9/state.c:30
-#: ../libpurple/protocols/msnp9/state.c:37
-#: ../libpurple/protocols/msnp9/state.c:38
-#: ../libpurple/protocols/novell/novell.c:2834
-#: ../libpurple/protocols/qq/qq.c:281
-#: ../libpurple/protocols/yahoo/yahoo.c:3158 ../libpurple/status.c:156
-#: ../pidgin/gtkdocklet.c:545 ../pidgin/gtkstatusbox.c:1086
 msgid "Available"
 msgstr "Tavoitettavissa"
 
 #. get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for
 #. * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message
 #. Away stuff
-#: ../libpurple/protocols/gg/gg.c:1016 ../libpurple/protocols/irc/irc.c:544
-#: ../libpurple/protocols/irc/msgs.c:358
-#: ../libpurple/protocols/jabber/buddy.c:2087
-#: ../libpurple/protocols/novell/novell.c:2837
-#: ../libpurple/protocols/oscar/oscar.c:734
-#: ../libpurple/protocols/oscar/oscar.c:5745
-#: ../libpurple/protocols/qq/qq.c:181 ../libpurple/protocols/qq/qq.c:285
-#: ../libpurple/protocols/silc/buddy.c:1479
-#: ../libpurple/protocols/silc10/buddy.c:1479
-#: ../libpurple/protocols/yahoo/yahoo.c:3719
-#: ../libpurple/protocols/yahoo/yahoo.c:3793 ../libpurple/status.c:159
-#: ../pidgin/gtkdocklet.c:549 ../pidgin/gtkprefs.c:2070
-#: ../pidgin/gtkstatusbox.c:1087
 #, c-format
 msgid "Away"
 msgstr "Poissa"
 
-#: ../libpurple/protocols/gg/gg.c:1045 ../libpurple/protocols/gg/gg.c:1119
-#: ../libpurple/protocols/oscar/oscar.c:2753
-#: ../libpurple/protocols/oscar/oscar.c:3736
 msgid "UIN"
 msgstr "UIN"
 
-#: ../libpurple/protocols/gg/gg.c:1048 ../libpurple/protocols/gg/gg.c:1122
-#: ../libpurple/protocols/jabber/buddy.c:2260
-#: ../libpurple/protocols/jabber/buddy.c:2446
-#: ../libpurple/protocols/oscar/oscar.c:3747
-#: ../libpurple/protocols/silc/ops.c:1004
-#: ../libpurple/protocols/silc10/ops.c:1024
 msgid "First Name"
 msgstr "Etunimi"
 
-#: ../libpurple/protocols/gg/gg.c:1061 ../libpurple/protocols/gg/gg.c:1131
 msgid "Birth Year"
 msgstr "Syntymävuosi"
 
-#: ../libpurple/protocols/gg/gg.c:1113 ../libpurple/protocols/gg/gg.c:1182
-#: ../libpurple/protocols/oscar/oscar.c:3948
 msgid "Unable to display the search results."
 msgstr "Hakutuloksia ei voi näyttää."
 
-#: ../libpurple/protocols/gg/gg.c:1173
 msgid "Gadu-Gadu Public Directory"
 msgstr "Gadu-Gadun julkinen hakemisto"
 
-#: ../libpurple/protocols/gg/gg.c:1174
 msgid "Search results"
 msgstr "Hakutulokset"
 
-#: ../libpurple/protocols/gg/gg.c:1217
 msgid "No matching users found"
 msgstr "Käyttäjistä ei löytynyt osumia"
 
-#: ../libpurple/protocols/gg/gg.c:1218
 msgid "There are no users matching your search criteria."
 msgstr "Hakuvalintojasi vastaavia käyttäjiä ei ole."
 
-#: ../libpurple/protocols/gg/gg.c:1314 ../libpurple/protocols/gg/gg.c:1469
 msgid "Unable to read socket"
 msgstr "Ei kyetty lukemaan pistoketta"
 
-#: ../libpurple/protocols/gg/gg.c:1399
 msgid "Buddy list downloaded"
 msgstr "Tuttavat ladattu"
 
-#: ../libpurple/protocols/gg/gg.c:1400
 msgid "Your buddy list was downloaded from the server."
 msgstr "Tuttavasi ladattiin palvelimelta."
 
-#: ../libpurple/protocols/gg/gg.c:1407
 msgid "Buddy list uploaded"
 msgstr "Tuttavat lähetettiin"
 
-#: ../libpurple/protocols/gg/gg.c:1408
 msgid "Your buddy list was stored on the server."
 msgstr "Tuttavasi tallennettiin palvelimelle."
 
-#: ../libpurple/protocols/gg/gg.c:1517 ../libpurple/protocols/gg/gg.c:1725
 msgid "Connection failed."
 msgstr "Yhteys epäonnistui."
 
-#: ../libpurple/protocols/gg/gg.c:1652
 msgid "Add to chat"
 msgstr "Lisää ryhmäkeskusteluun"
 
-#: ../libpurple/protocols/gg/gg.c:1682
 msgid "Chat _name:"
 msgstr "Keskustelunimi:"
 
-#: ../libpurple/protocols/gg/gg.c:1933
 msgid "Chat error"
 msgstr "Keskusteluvirhe"
 
-#: ../libpurple/protocols/gg/gg.c:1934
 msgid "This chat name is already in use"
 msgstr "Tämä keskustelunimi on jo käytössä"
 
-#: ../libpurple/protocols/gg/gg.c:2019
 msgid "Not connected to the server."
 msgstr "Ei yhdistettynä palvelimeen."
 
-#: ../libpurple/protocols/gg/gg.c:2042
 msgid "Find buddies..."
 msgstr "Etsi tuttavia..."
 
-#: ../libpurple/protocols/gg/gg.c:2048
 msgid "Change password..."
 msgstr "Vaihda salasana..."
 
-#: ../libpurple/protocols/gg/gg.c:2054
 msgid "Upload buddylist to Server"
 msgstr "Vie tuttavat palvelimelle"
 
-#: ../libpurple/protocols/gg/gg.c:2058
 msgid "Download buddylist from Server"
 msgstr "Tuo tuttavat palvelimelta"
 
-#: ../libpurple/protocols/gg/gg.c:2062
 msgid "Delete buddylist from Server"
 msgstr "Poista tuttavat palvelimelta"
 
-#: ../libpurple/protocols/gg/gg.c:2066
 msgid "Save buddylist to file..."
 msgstr "Vie tuttavat tiedostoon..."
 
-#: ../libpurple/protocols/gg/gg.c:2070
-msgid "Load buddylist from file..."
-msgstr "Tuo tuttavat tiedostosta..."
-
 #. magic
 #. major_version
 #. minor_version
@@ -4333,152 +3104,81 @@
 #. id
 #. name
 #. version
-#: ../libpurple/protocols/gg/gg.c:2174
 msgid "Gadu-Gadu Protocol Plugin"
 msgstr "Gadu-Gadu-yhteyskäytäntöliitännäinen"
 
 #. summary
-#: ../libpurple/protocols/gg/gg.c:2175
 msgid "Polish popular IM"
 msgstr "Puolalainen suosittu pikaviestin"
 
-#: ../libpurple/protocols/gg/gg.c:2229
 msgid "Gadu-Gadu User"
 msgstr "Gadu-Gadu-käyttäjä"
 
-#: ../libpurple/protocols/irc/cmds.c:43
-#: ../libpurple/protocols/silc/silc.c:1853
-#: ../libpurple/protocols/silc10/silc.c:1572
 #, c-format
 msgid "Unknown command: %s"
 msgstr "Tuntematon komento: %s"
 
-#: ../libpurple/protocols/irc/cmds.c:509
-#: ../libpurple/protocols/jabber/chat.c:596
-#: ../libpurple/protocols/silc/silc.c:1561
-#: ../libpurple/protocols/silc10/silc.c:1280
 #, c-format
 msgid "current topic is: %s"
 msgstr "nykyinen aihe on: %s"
 
-#: ../libpurple/protocols/irc/cmds.c:513
-#: ../libpurple/protocols/jabber/chat.c:600
-#: ../libpurple/protocols/silc/silc.c:1565
-#: ../libpurple/protocols/silc10/silc.c:1284
 msgid "No topic is set"
 msgstr "Aihetta ei ole asetettu"
 
-#: ../libpurple/protocols/irc/dcc_send.c:298
-#: ../libpurple/protocols/irc/dcc_send.c:339
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:318
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:327
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:336
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:1110
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:1514
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:1565
 msgid "File Transfer Failed"
 msgstr "Tiedostonsiirto epäonnistui"
 
-#: ../libpurple/protocols/irc/dcc_send.c:299
-#: ../libpurple/protocols/irc/dcc_send.c:340
 msgid "Could not open a listening port."
 msgstr "Kuuntelevaa porttia ei voi avata."
 
-#: ../libpurple/protocols/irc/irc.c:79
 msgid "Error displaying MOTD"
 msgstr "Virhe näytettäessä MOTD:tä"
 
-#: ../libpurple/protocols/irc/irc.c:79
 msgid "No MOTD available"
 msgstr "MOTD ei ole käytettävissä"
 
-#: ../libpurple/protocols/irc/irc.c:80
 msgid "There is no MOTD associated with this connection."
 msgstr "MOTD:tä ei ole assosioitu tälle yhteydelle."
 
-#: ../libpurple/protocols/irc/irc.c:83
 #, c-format
 msgid "MOTD for %s"
 msgstr "MOTD %s:lle"
 
-#: ../libpurple/protocols/irc/irc.c:129 ../libpurple/protocols/irc/irc.c:169
-#: ../libpurple/protocols/irc/irc.c:633 ../libpurple/protocols/irc/irc.c:662
-#: ../libpurple/protocols/myspace/myspace.c:2539
 msgid "Server has disconnected"
 msgstr "Palvelin on katkaissut yhteyden"
 
-#: ../libpurple/protocols/irc/irc.c:260
 msgid "View MOTD"
 msgstr "Näytä MOTD"
 
-#: ../libpurple/protocols/irc/irc.c:272 ../libpurple/protocols/silc/chat.c:33
-#: ../libpurple/protocols/silc10/chat.c:33
 msgid "_Channel:"
 msgstr "_Kanava:"
 
-#: ../libpurple/protocols/irc/irc.c:278
-#: ../libpurple/protocols/jabber/chat.c:59 ../pidgin/gtkaccount.c:496
 msgid "_Password:"
 msgstr "_Salasana:"
 
-#: ../libpurple/protocols/irc/irc.c:311
 msgid "IRC nicks may not contain whitespace"
 msgstr "IRC-kutsumanimissä ei tule olla välilyöntejä"
 
 #. 1. connect to server
 #. connect to the server
-#: ../libpurple/protocols/irc/irc.c:332
-#: ../libpurple/protocols/jabber/jabber.c:1346
-#: ../libpurple/protocols/msn/session.c:402
-#: ../libpurple/protocols/msnp9/session.c:354
-#: ../libpurple/protocols/myspace/myspace.c:295
-#: ../libpurple/protocols/novell/novell.c:2199
-#: ../libpurple/protocols/oscar/oscar.c:1335
-#: ../libpurple/protocols/qq/qq.c:136
-#: ../libpurple/protocols/sametime/sametime.c:3778
-#: ../libpurple/protocols/simple/simple.c:1915
-#: ../libpurple/protocols/yahoo/yahoo.c:2984
-#: ../libpurple/protocols/zephyr/zephyr.c:1585 ../pidgin/gtkstatusbox.c:686
 msgid "Connecting"
 msgstr "Yhdistetään"
 
-#: ../libpurple/protocols/irc/irc.c:342
-#: ../libpurple/protocols/jabber/jabber.c:674
-#: ../libpurple/protocols/jabber/jabber.c:1155
 msgid "SSL support unavailable"
 msgstr "SSL-tuki ei saatavilla"
 
-#: ../libpurple/protocols/irc/irc.c:355
-#: ../libpurple/protocols/myspace/myspace.c:313
-#: ../libpurple/protocols/simple/simple.c:469
-#: ../libpurple/protocols/simple/simple.c:1825
 msgid "Couldn't create socket"
 msgstr "Pistokkeen luominen epäonnistui"
 
-#: ../libpurple/protocols/irc/irc.c:437
-#: ../libpurple/protocols/oscar/oscar.c:1331
 msgid "Couldn't connect to host"
 msgstr "Yhteyttä isäntään ei voi muodostaa"
 
-#: ../libpurple/protocols/irc/irc.c:628 ../libpurple/protocols/irc/irc.c:657
-#: ../libpurple/protocols/myspace/myspace.c:2533
 msgid "Read error"
 msgstr "Virhe luettaessa"
 
-#: ../libpurple/protocols/irc/irc.c:798
-#: ../libpurple/protocols/silc/chat.c:1401
-#: ../libpurple/protocols/silc10/chat.c:1426
-#: ../libpurple/protocols/yahoo/yahoochat.c:1508
 msgid "Users"
 msgstr "Käyttäjät"
 
-#: ../libpurple/protocols/irc/irc.c:801
-#: ../libpurple/protocols/sametime/sametime.c:3426
-#: ../libpurple/protocols/silc/chat.c:1404
-#: ../libpurple/protocols/silc/ops.c:1406
-#: ../libpurple/protocols/silc10/chat.c:1429
-#: ../libpurple/protocols/silc10/ops.c:1382
-#: ../libpurple/protocols/yahoo/yahoochat.c:1517
 msgid "Topic"
 msgstr "Aihe"
 
@@ -4490,50 +3190,27 @@
 #. *< id
 #. *< name
 #. *< version
-#: ../libpurple/protocols/irc/irc.c:939
 msgid "IRC Protocol Plugin"
 msgstr "IRC-yhteyskäytäntöliitännäinen"
 
 #. *  summary
-#: ../libpurple/protocols/irc/irc.c:940
 msgid "The IRC Protocol Plugin that Sucks Less"
 msgstr "IRC-yhteyskäytäntöliitännäinen joka on vähemmän huono..."
 
 #. host to connect to
-#: ../libpurple/protocols/irc/irc.c:965 ../libpurple/protocols/irc/msgs.c:371
-#: ../libpurple/protocols/msn/msn.c:2357
-#: ../libpurple/protocols/msnp9/msn.c:2197
-#: ../libpurple/protocols/oscar/oscar.c:6747
-#: ../libpurple/protocols/qq/qq.c:756
-#: ../libpurple/protocols/sametime/sametime.c:5783
-#: ../libpurple/protocols/silc/ops.c:1262
-#: ../libpurple/protocols/silc/ops.c:1356
-#: ../libpurple/protocols/silc10/ops.c:1244
-#: ../libpurple/protocols/silc10/ops.c:1347
-#: ../libpurple/protocols/simple/simple.c:2099
-#: ../libpurple/protocols/toc/toc.c:2327
 msgid "Server"
 msgstr "Palvelin"
 
 #. port to connect to
-#: ../libpurple/protocols/irc/irc.c:968 ../libpurple/protocols/msn/msn.c:2362
-#: ../libpurple/protocols/msnp9/msn.c:2202
-#: ../libpurple/protocols/oscar/oscar.c:6750
-#: ../libpurple/protocols/qq/qq.c:759
-#: ../libpurple/protocols/sametime/sametime.c:5788
-#: ../libpurple/protocols/silc/silc.c:2143
-#: ../libpurple/protocols/silc10/silc.c:1867
-#: ../libpurple/protocols/toc/toc.c:2331
 msgid "Port"
 msgstr "Portti"
 
-#: ../libpurple/protocols/irc/irc.c:971
 msgid "Encodings"
 msgstr "Merkistöt"
 
-#: ../libpurple/protocols/irc/irc.c:977 ../libpurple/protocols/irc/msgs.c:365
-#: ../libpurple/protocols/silc/silc.c:1225
-#: ../libpurple/protocols/silc10/silc.c:926
+msgid "Auto-detect incoming UTF-8"
+msgstr "Tunnista sisääntuleva UTF-8 automaattisesti"
+
 msgid "Real name"
 msgstr "Oikea nimi"
 
@@ -4541,172 +3218,129 @@
 #. option = purple_account_option_string_new(_("Quit message"), "quitmsg", IRC_DEFAULT_QUIT);
 #. prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 #.
-#: ../libpurple/protocols/irc/irc.c:985
 msgid "Use SSL"
 msgstr "Käytä SSL:ää"
 
-#: ../libpurple/protocols/irc/msgs.c:192
 msgid "Bad mode"
 msgstr "Väärä tila"
 
-#: ../libpurple/protocols/irc/msgs.c:214
-#, c-format
-msgid "Ban on %s by %s, set %ld seconds ago"
-msgstr "Käyttäjän %s esto, asettanut %s %ld sekuntia sitten"
-
-#: ../libpurple/protocols/irc/msgs.c:217
+#, c-format
+msgid "Ban on %s by %s, set %s ago"
+msgstr "Käyttäjän %s esto, asettanut %s %s sitten"
+
 #, c-format
 msgid "Ban on %s"
 msgstr "Käyttäjän %s esto"
 
-#: ../libpurple/protocols/irc/msgs.c:232
 msgid "End of ban list"
 msgstr "Estolistan loppu"
 
-#: ../libpurple/protocols/irc/msgs.c:246
 #, c-format
 msgid "You are banned from %s."
 msgstr "Sinut on estetty kanavalta %s."
 
-#: ../libpurple/protocols/irc/msgs.c:247
 msgid "Banned"
 msgstr "Estetty"
 
-#: ../libpurple/protocols/irc/msgs.c:264
 #, c-format
 msgid "Cannot ban %s: banlist is full"
 msgstr "Käyttäjää %s ei voi estää: estolista on täynnä"
 
-#: ../libpurple/protocols/irc/msgs.c:349
 msgid " <i>(ircop)</i>"
 msgstr " <i>(ircop)</i>"
 
-#: ../libpurple/protocols/irc/msgs.c:350
 msgid " <i>(identified)</i>"
 msgstr "<i>(tunnistettu)</i>"
 
-#: ../libpurple/protocols/irc/msgs.c:351
-#: ../libpurple/protocols/oscar/oscar.c:3737
-#: ../libpurple/protocols/silc/ops.c:1435
-#: ../libpurple/protocols/silc10/ops.c:1414
 msgid "Nick"
 msgstr "Kutsumanimi"
 
-#: ../libpurple/protocols/irc/msgs.c:377
-#: ../libpurple/protocols/silc/ops.c:1281
-#: ../libpurple/protocols/silc10/ops.c:1272
 msgid "Currently on"
 msgstr "Tällä hetkellä"
 
-#: ../libpurple/protocols/irc/msgs.c:382
 msgid "Idle for"
 msgstr "Jouten "
 
-#: ../libpurple/protocols/irc/msgs.c:385
 msgid "Online since"
 msgstr "Linjoilla"
 
-#: ../libpurple/protocols/irc/msgs.c:389
 msgid "<b>Defining adjective:</b>"
 msgstr "<b>Kuvaava adjektiivi:</b>"
 
-#: ../libpurple/protocols/irc/msgs.c:389
 msgid "Glorious"
 msgstr "Loistokas"
 
-#: ../libpurple/protocols/irc/msgs.c:473
 #, c-format
 msgid "%s has changed the topic to: %s"
 msgstr "%s on vaihtanut aiheeksi: %s"
 
-#: ../libpurple/protocols/irc/msgs.c:475
 #, c-format
 msgid "%s has cleared the topic."
 msgstr "%s on poistanut aiheen."
 
-#: ../libpurple/protocols/irc/msgs.c:483
 #, c-format
 msgid "The topic for %s is: %s"
 msgstr "%s:n aihe on: %s"
 
-#: ../libpurple/protocols/irc/msgs.c:501
 #, c-format
 msgid "Unknown message '%s'"
 msgstr "Tuntematon viesti \"%s\""
 
-#: ../libpurple/protocols/irc/msgs.c:502
 msgid "Unknown message"
 msgstr "Tuntematon viesti"
 
-#: ../libpurple/protocols/irc/msgs.c:502
 msgid "The IRC server received a message it did not understand."
 msgstr "IRC-palvelin vastaanotti viestin jota se ei ymmärtänyt."
 
-#: ../libpurple/protocols/irc/msgs.c:523
 #, c-format
 msgid "Users on %s: %s"
 msgstr "Käyttäjät %s: %s"
 
-#: ../libpurple/protocols/irc/msgs.c:630
 msgid "Time Response"
 msgstr "Vastaus time-komentoon "
 
-#: ../libpurple/protocols/irc/msgs.c:631
 msgid "The IRC server's local time is:"
 msgstr "IRC palvelimen paikallinen aika:"
 
-#: ../libpurple/protocols/irc/msgs.c:642
 msgid "No such channel"
 msgstr "Kanavaa ei ole"
 
 #. does this happen?
-#: ../libpurple/protocols/irc/msgs.c:653
 msgid "no such channel"
 msgstr "kanavaa ei ole"
 
-#: ../libpurple/protocols/irc/msgs.c:656
 msgid "User is not logged in"
 msgstr "Käyttäjä ei ole kirjautuneena sisään"
 
-#: ../libpurple/protocols/irc/msgs.c:661
 msgid "No such nick or channel"
 msgstr "Kutsumanimeä/kanavaa ei ole olemassa"
 
-#: ../libpurple/protocols/irc/msgs.c:681
 msgid "Could not send"
 msgstr "Lähettäminen ei onnistu"
 
-#: ../libpurple/protocols/irc/msgs.c:737
 #, c-format
 msgid "Joining %s requires an invitation."
 msgstr "Liittyminen kanavalle %s vaatii kutsun."
 
-#: ../libpurple/protocols/irc/msgs.c:738
 msgid "Invitation only"
 msgstr "Vain kutsu"
 
-#: ../libpurple/protocols/irc/msgs.c:854
 #, c-format
 msgid "You have been kicked by %s: (%s)"
 msgstr "%s on poistanut sinut kanavalta: (%s)"
 
 #. Remove user from channel
-#: ../libpurple/protocols/irc/msgs.c:859 ../libpurple/protocols/silc/ops.c:714
-#: ../libpurple/protocols/silc10/ops.c:720
 #, c-format
 msgid "Kicked by %s (%s)"
 msgstr "%s potkaisi (%s)"
 
-#: ../libpurple/protocols/irc/msgs.c:882
 #, c-format
 msgid "mode (%s %s) by %s"
 msgstr "moodin (%s %s) asetti %s"
 
-#: ../libpurple/protocols/irc/msgs.c:970 ../libpurple/protocols/irc/msgs.c:971
 msgid "Invalid nickname"
 msgstr "Virheellinen lempinimi"
 
-#: ../libpurple/protocols/irc/msgs.c:972
 msgid ""
 "Your selected nickname was rejected by the server.  It probably contains "
 "invalid characters."
@@ -4714,7 +3348,6 @@
 "Palvelin hylkäsi valitsemasi kutsumanimen. Siinä on todennäköisesti "
 "kiellettyjä merkkejä."
 
-#: ../libpurple/protocols/irc/msgs.c:977
 msgid ""
 "Your selected account name was rejected by the server.  It probably contains "
 "invalid characters."
@@ -4722,53 +3355,40 @@
 "Palvelin hylkäsi valitsemasi tilinimen. Siinä on todennäköisesti kiellettyjä "
 "merkkejä."
 
-#: ../libpurple/protocols/irc/msgs.c:1016
 msgid "Cannot change nick"
 msgstr "Ei kyetty muuttamaan kutsumanimeä"
 
-#: ../libpurple/protocols/irc/msgs.c:1016
 msgid "Could not change nick"
 msgstr "Ei kyetty muuttamaan kutsumanimeä"
 
-#: ../libpurple/protocols/irc/msgs.c:1041
 #, c-format
 msgid "You have parted the channel%s%s"
 msgstr "Olet poistunut kanavalta %s%s"
 
-#: ../libpurple/protocols/irc/msgs.c:1085
 msgid "Error: invalid PONG from server"
 msgstr "Virhe: epäkelpo PONG palvelimelta"
 
-#: ../libpurple/protocols/irc/msgs.c:1087
 #, c-format
 msgid "PING reply -- Lag: %lu seconds"
 msgstr "PING vastaus -- Viive: %lu sekuntia"
 
-#: ../libpurple/protocols/irc/msgs.c:1178
 #, c-format
 msgid "Cannot join %s: Registration is required."
 msgstr "Kohteeseen %s ei voi liittyä: vaatii rekisteröinnin."
 
-#: ../libpurple/protocols/irc/msgs.c:1179
-#: ../libpurple/protocols/silc/ops.c:1106
-#: ../libpurple/protocols/silc10/ops.c:1128
 msgid "Cannot join channel"
 msgstr "Kanavalle ei voi liittyä"
 
-#: ../libpurple/protocols/irc/msgs.c:1213
 msgid "Nick or channel is temporarily unavailable."
 msgstr "Kutsumanimi tai kanava ei tilapäisesti ole käytössä."
 
-#: ../libpurple/protocols/irc/msgs.c:1225
 #, c-format
 msgid "Wallops from %s"
 msgstr "Wallops %s:ltä"
 
-#: ../libpurple/protocols/irc/parse.c:124
 msgid "action &lt;action to perform&gt;:  Perform an action."
 msgstr "action &lt;tehtävä toiminta&gt;: Tee toiminta."
 
-#: ../libpurple/protocols/irc/parse.c:125
 msgid ""
 "away [message]:  Set an away message, or use no message to return from being "
 "away."
@@ -4776,11 +3396,13 @@
 "away [viesti]: Aseta poissaoloviesti, tai jätä viesti tyhjäksi poistaaksesi "
 "poissaolotilan."
 
-#: ../libpurple/protocols/irc/parse.c:126
+msgid "ctcp <nick> <msg>: sends ctcp msg to nick."
+msgstr ""
+"ctcp <nimi> <viesti>: Lähettää CTCP-viestin nimetylle vastaanottajalle."
+
 msgid "chanserv: Send a command to chanserv"
 msgstr "chanserv: Lähetä komento chanserv:lle"
 
-#: ../libpurple/protocols/irc/parse.c:127
 msgid ""
 "deop &lt;nick1&gt; [nick2] ...:  Remove channel operator status from "
 "someone. You must be a channel operator to do this."
@@ -4788,7 +3410,6 @@
 "deop &lt;nimi1&gt; [nimi2] ...: Poista kanavaoperaattorin status joltakulta. "
 "Sinun tulee olla kanavaoperaattori tehdäksesi näin."
 
-#: ../libpurple/protocols/irc/parse.c:128
 msgid ""
 "devoice &lt;nick1&gt; [nick2] ...:  Remove channel voice status from "
 "someone, preventing them from speaking if the channel is moderated (+m). You "
@@ -4798,7 +3419,6 @@
 "puhumasta jos kanava on moderoitu (+m). Sinun tulee olla kanavaoperaattori "
 "tehdäksesi näin."
 
-#: ../libpurple/protocols/irc/parse.c:129
 msgid ""
 "invite &lt;nick&gt; [room]:  Invite someone to join you in the specified "
 "channel, or the current channel."
@@ -4806,7 +3426,6 @@
 "invite &lt;nimi&gt; [huone]: Kutsu joku liittymään kanssasi tietylle tai "
 "tämänhetkiselle kanavalle."
 
-#: ../libpurple/protocols/irc/parse.c:130
 msgid ""
 "j &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more "
 "channels, optionally providing a channel key for each if needed."
@@ -4814,7 +3433,6 @@
 "j &lt;huone1&gt;[,huone2][,...] [avain1[,avain2][,...]]: Liity yhdelle tai "
 "useammalle kanavalle, antaen myös kanava-avaimen mikäli tarpeen."
 
-#: ../libpurple/protocols/irc/parse.c:131
 msgid ""
 "join &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more "
 "channels, optionally providing a channel key for each if needed."
@@ -4822,7 +3440,6 @@
 "join &lt;huone1&gt;[,huone2][,...] [avain1[,avain2][,...]]: Liity yhdelle "
 "tai useammalle kanavalle antaen myös kanava-avaimen mikäli tarpeen."
 
-#: ../libpurple/protocols/irc/parse.c:132
 msgid ""
 "kick &lt;nick&gt; [message]:  Remove someone from a channel. You must be a "
 "channel operator to do this."
@@ -4830,7 +3447,6 @@
 "kick &lt;nimi&gt; [viesti]: Poista joku kanavalta. Sinun tulee olla "
 "kanavaoperaattori tehdäksesi näin."
 
-#: ../libpurple/protocols/irc/parse.c:133
 msgid ""
 "list:  Display a list of chat rooms on the network. <i>Warning, some servers "
 "may disconnect you upon doing this.</i>"
@@ -4838,15 +3454,12 @@
 "list: Näytä luettelo keskusteluhuoneista verkossa. <i>Varoitus, jotkut "
 "palvelimet saattavat katkaista yhteytesi jos teet näin.</i>"
 
-#: ../libpurple/protocols/irc/parse.c:134
 msgid "me &lt;action to perform&gt;:  Perform an action."
 msgstr "me &lt;tehtävä toiminto&gt;: Suorita toiminto."
 
-#: ../libpurple/protocols/irc/parse.c:135
 msgid "memoserv: Send a command to memoserv"
 msgstr "memoserv: Lähetä komento memoserv:lle"
 
-#: ../libpurple/protocols/irc/parse.c:136
 msgid ""
 "mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;:  Set or unset a channel "
 "or user mode."
@@ -4854,7 +3467,6 @@
 "mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nimi|kanava&gt;: Aseta tai poista kanavan "
 "tai käyttäjän tila."
 
-#: ../libpurple/protocols/irc/parse.c:137
 msgid ""
 "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
 "opposed to a channel)."
@@ -4862,24 +3474,18 @@
 "msg &lt;nimi&gt; &lt;viesti&gt;: Lähetä yksityisviesti käyttäjälle "
 "(ollessasi kanavalla)."
 
-#: ../libpurple/protocols/irc/parse.c:138
 msgid "names [channel]:  List the users currently in a channel."
 msgstr "names [kanava]: Listaa kanavalla olevat käyttäjät."
 
-#: ../libpurple/protocols/irc/parse.c:139
-#: ../libpurple/protocols/jabber/jabber.c:2358
 msgid "nick &lt;new nickname&gt;:  Change your nickname."
 msgstr "nick &lt;uusi nimi&gt;: Muuta nimesi."
 
-#: ../libpurple/protocols/irc/parse.c:140
 msgid "nickserv: Send a command to nickserv"
 msgstr "nickserv: Lähetä komento nickserv:lle"
 
-#: ../libpurple/protocols/irc/parse.c:141
 msgid "notice &lt;target&lt;:  Send a notice to a user or channel."
 msgstr "notice &lt;kohde&gt;: Lähetä ilmoitus käyttäjälle tai kanavalle."
 
-#: ../libpurple/protocols/irc/parse.c:142
 msgid ""
 "op &lt;nick1&gt; [nick2] ...:  Grant channel operator status to someone. You "
 "must be a channel operator to do this."
@@ -4887,7 +3493,6 @@
 "op &lt;nimi1&gt; [nimi2] ...: Anna kanavaoperaattorin status jollekulle. "
 "Sinun tulee olla kanavaoperaattori tehdäksesi näin."
 
-#: ../libpurple/protocols/irc/parse.c:143
 msgid ""
 "operwall &lt;message&gt;:  If you don't know what this is, you probably "
 "can't use it."
@@ -4895,11 +3500,9 @@
 "operwall &lt;viesti&gt;: Jos et tiedä mikä tämä on, sinun ei todennäköisesti "
 "tule käyttää tätä."
 
-#: ../libpurple/protocols/irc/parse.c:144
 msgid "operserv: Send a command to operserv"
 msgstr "operserv: Lähetä komento operserv:lle"
 
-#: ../libpurple/protocols/irc/parse.c:145
 msgid ""
 "part [room] [message]:  Leave the current channel, or a specified channel, "
 "with an optional message."
@@ -4907,7 +3510,6 @@
 "part [huone] [viesti]: Poistu tämänhetkiseltä kanavalta tai tietyltä "
 "kanavalta valinnaisen viestin kanssa."
 
-#: ../libpurple/protocols/irc/parse.c:146
 msgid ""
 "ping [nick]:  Asks how much lag a user (or the server if no user specified) "
 "has."
@@ -4915,7 +3517,6 @@
 "ping [nimi]: Kysyy kuinka paljon viivettä käyttäjällä(tai palvelimella jos "
 "ei käyttäjää annettu) on."
 
-#: ../libpurple/protocols/irc/parse.c:147
 msgid ""
 "query &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
 "opposed to a channel)."
@@ -4923,15 +3524,12 @@
 "query &lt;nimi&gt; &lt;viesti&gt;: Lähetä yksityisviesti käyttäjälle (kun "
 "olet kanavalla)."
 
-#: ../libpurple/protocols/irc/parse.c:148
 msgid "quit [message]:  Disconnect from the server, with an optional message."
 msgstr "quit [viesti]: Katkaise yhteys palvelimelle + valinnainen viesti."
 
-#: ../libpurple/protocols/irc/parse.c:149
 msgid "quote [...]:  Send a raw command to the server."
 msgstr "quote [...]: Lähetä \"raaka\" komento palvelimelle."
 
-#: ../libpurple/protocols/irc/parse.c:150
 msgid ""
 "remove &lt;nick&gt; [message]:  Remove someone from a room. You must be a "
 "channel operator to do this."
@@ -4939,23 +3537,18 @@
 "remove &lt;nimi&gt; [viesti]: Poista joku huoneesta. Sinun tulee olla "
 "kanavaoperaattori tehdäksesi näin."
 
-#: ../libpurple/protocols/irc/parse.c:151
 msgid "time: Displays the current local time at the IRC server."
 msgstr "time: Näyttää paikallisen ajan IRC palvelimella."
 
-#: ../libpurple/protocols/irc/parse.c:152
 msgid "topic [new topic]:  View or change the channel topic."
 msgstr "topic [uusi aihe]: Näytä tai vaihda kanavan aihetta."
 
-#: ../libpurple/protocols/irc/parse.c:153
 msgid "umode &lt;+|-&gt;&lt;A-Za-z&gt;:  Set or unset a user mode."
 msgstr "umode &lt;nimi1&gt; [nimi2] ...: Aseta tai poista käyttäjän tila."
 
-#: ../libpurple/protocols/irc/parse.c:154
 msgid "version [nick]: send CTCP VERSION request to a user"
 msgstr "version [nimi]: lähetä CTCP VERSION -pyyntö käyttäjälle"
 
-#: ../libpurple/protocols/irc/parse.c:155
 msgid ""
 "voice &lt;nick1&gt; [nick2] ...:  Grant channel voice status to someone. You "
 "must be a channel operator to do this."
@@ -4963,7 +3556,6 @@
 "voice &lt;nimi1&gt; [nimi2] ...: Aseta kanavan ääni-tila jollekulle. Sinun "
 "tulee olla kanavaoperaattori tehdäksesi näin."
 
-#: ../libpurple/protocols/irc/parse.c:156
 msgid ""
 "wallops &lt;message&gt;:  If you don't know what this is, you probably can't "
 "use it."
@@ -4971,66 +3563,44 @@
 "wallops &lt;viesti&gt;: Jos et tiedä mikä tämä on, sinun ei todennäköisesti "
 "tulee käyttää sitä."
 
-#: ../libpurple/protocols/irc/parse.c:157
 msgid "whois [server] &lt;nick&gt;:  Get information on a user."
 msgstr "whois [palvelin] &lt;nimi&gt;: Hae tietoja käyttäjästä."
 
-#: ../libpurple/protocols/irc/parse.c:158
 msgid "whowas &lt;nick&gt;: Get information on a user that has logged off."
 msgstr "whowas &lt;nimi&gt;: Hae tietoja käyttäjästä joka on kirjautunut ulos."
 
-#: ../libpurple/protocols/irc/parse.c:523
 #, c-format
 msgid "Reply time from %s: %lu seconds"
 msgstr "Vastausaika %s:ltä: %lu sekuntia"
 
-#: ../libpurple/protocols/irc/parse.c:524
 msgid "PONG"
 msgstr "PONG"
 
-#: ../libpurple/protocols/irc/parse.c:524
 msgid "CTCP PING reply"
 msgstr "CTCP PING:n vastaus"
 
-#: ../libpurple/protocols/irc/parse.c:636
-#: ../libpurple/protocols/irc/parse.c:643 ../libpurple/protocols/toc/toc.c:191
-#: ../libpurple/protocols/toc/toc.c:694 ../libpurple/protocols/toc/toc.c:710
-#: ../libpurple/protocols/toc/toc.c:786
 msgid "Disconnected."
 msgstr "Yhteys katkennut."
 
-#: ../libpurple/protocols/jabber/adhoccommands.c:143
-#: ../libpurple/protocols/jabber/jabber.c:735
-#: ../libpurple/protocols/jabber/jabber.c:765
-#: ../libpurple/protocols/jabber/jabber.c:1942
 msgid "Unknown Error"
 msgstr "Tuntematon virhe"
 
-#: ../libpurple/protocols/jabber/adhoccommands.c:145
-#: ../libpurple/protocols/jabber/adhoccommands.c:146
 msgid "Ad-Hoc Command Failed"
 msgstr "Ad-Hoc-komento epäonnistui"
 
-#: ../libpurple/protocols/jabber/adhoccommands.c:182
 msgid "execute"
 msgstr "suorita"
 
-#: ../libpurple/protocols/jabber/auth.c:55
 msgid "Server requires TLS/SSL for login.  No TLS/SSL support found."
 msgstr "Palvelin vaatii TSL/SSL-tuen kirjautumiseen. TLS/SSL-tukea ei löydy."
 
-#: ../libpurple/protocols/jabber/auth.c:60
 msgid "You require encryption, but no TLS/SSL support found."
 msgstr "Salausta vaadittu, mutta TLS/SSL-tukea ei löydy."
 
-#: ../libpurple/protocols/jabber/auth.c:125
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr ""
 "Palvelin vaatii salaamattoman tunnistautumisen salaamattoman yhteyden yli"
 
-#: ../libpurple/protocols/jabber/auth.c:328
-#: ../libpurple/protocols/jabber/auth.c:535
-#: ../libpurple/protocols/jabber/auth.c:729
 #, c-format
 msgid ""
 "%s requires plaintext authentication over an unencrypted connection.  Allow "
@@ -5039,139 +3609,74 @@
 "%s vaatii tekstipohjaisen tunnistautumisen salaamattoman yhteyden yli. "
 "Sallitaanko tämä ja jatketaan?"
 
-#: ../libpurple/protocols/jabber/auth.c:330
-#: ../libpurple/protocols/jabber/auth.c:331
-#: ../libpurple/protocols/jabber/auth.c:537
-#: ../libpurple/protocols/jabber/auth.c:538
-#: ../libpurple/protocols/jabber/auth.c:731
-#: ../libpurple/protocols/jabber/auth.c:732
 msgid "Plaintext Authentication"
 msgstr "Tekstipohjainen tunnistus"
 
-#: ../libpurple/protocols/jabber/auth.c:489
-#: ../libpurple/protocols/jabber/auth.c:662
-#: ../libpurple/protocols/jabber/auth.c:913
-#: ../libpurple/protocols/jabber/auth.c:1064
-#: ../libpurple/protocols/jabber/auth.c:1091
-#: ../libpurple/protocols/jabber/auth.c:1137
-#: ../libpurple/protocols/jabber/jabber.c:127
 msgid "Invalid response from server."
 msgstr "Kelvoton vastaus palvelimelta."
 
-#: ../libpurple/protocols/jabber/auth.c:551
-#: ../libpurple/protocols/jabber/auth.c:745
 msgid "Server does not use any supported authentication method"
 msgstr "Palvelin ei käytä mitään tuetuista tunnistautumismenetelmistä"
 
-#: ../libpurple/protocols/jabber/auth.c:936
-#: ../libpurple/protocols/jabber/auth.c:961
 msgid "Invalid challenge from server"
 msgstr "Virheellinen tunnistushaaste palvelimelta"
 
-#: ../libpurple/protocols/jabber/auth.c:1037
 msgid "SASL error"
 msgstr "SASL-virhe"
 
-#: ../libpurple/protocols/jabber/buddy.c:306
-#: ../libpurple/protocols/jabber/buddy.c:1256
-#: ../libpurple/protocols/sametime/sametime.c:4184
-#: ../libpurple/protocols/silc/ops.c:1000
-#: ../libpurple/protocols/silc10/ops.c:1020
 msgid "Full Name"
 msgstr "Koko nimi"
 
-#: ../libpurple/protocols/jabber/buddy.c:307
-#: ../libpurple/protocols/jabber/buddy.c:1268
-#: ../libpurple/protocols/silc/ops.c:1012
-#: ../libpurple/protocols/silc10/ops.c:1032
 msgid "Family Name"
 msgstr "Sukunimi"
 
-#: ../libpurple/protocols/jabber/buddy.c:308
-#: ../libpurple/protocols/jabber/buddy.c:1271
 msgid "Given Name"
 msgstr "Etunimi"
 
-#: ../libpurple/protocols/jabber/buddy.c:310
-#: ../libpurple/protocols/jabber/jabber.c:1034
 msgid "URL"
 msgstr "URL"
 
-#: ../libpurple/protocols/jabber/buddy.c:311
-#: ../libpurple/protocols/jabber/buddy.c:1319
 msgid "Street Address"
 msgstr "Katuosoite"
 
-#: ../libpurple/protocols/jabber/buddy.c:312
-#: ../libpurple/protocols/jabber/buddy.c:1316
 msgid "Extended Address"
 msgstr "Laajennettu osoite"
 
-#: ../libpurple/protocols/jabber/buddy.c:313
-#: ../libpurple/protocols/jabber/buddy.c:1322
 msgid "Locality"
 msgstr "Alue"
 
-#: ../libpurple/protocols/jabber/buddy.c:314
-#: ../libpurple/protocols/jabber/buddy.c:1325
 msgid "Region"
 msgstr "Seutu"
 
-#: ../libpurple/protocols/jabber/buddy.c:315
-#: ../libpurple/protocols/jabber/buddy.c:1328
 msgid "Postal Code"
 msgstr "Postinumero"
 
-#: ../libpurple/protocols/jabber/buddy.c:316
-#: ../libpurple/protocols/jabber/buddy.c:1332
-#: ../libpurple/protocols/silc/silc.c:1231
-#: ../libpurple/protocols/silc10/silc.c:932
 msgid "Country"
 msgstr "Maa"
 
-#: ../libpurple/protocols/jabber/buddy.c:317
-#: ../libpurple/protocols/jabber/buddy.c:1343
-#: ../libpurple/protocols/jabber/buddy.c:1350
+#. lots of clients (including purple) do this, but it's
+#. * out of spec
 msgid "Telephone"
 msgstr "Puhelin"
 
-#: ../libpurple/protocols/jabber/buddy.c:319
-#: ../libpurple/protocols/jabber/buddy.c:1387
 msgid "Organization Name"
 msgstr "Organisaation nimi"
 
-#: ../libpurple/protocols/jabber/buddy.c:320
-#: ../libpurple/protocols/jabber/buddy.c:1390
 msgid "Organization Unit"
 msgstr "Organisaatioyksikkö"
 
-#: ../libpurple/protocols/jabber/buddy.c:322
-#: ../libpurple/protocols/jabber/buddy.c:1399
 msgid "Role"
 msgstr "Asema"
 
-#: ../libpurple/protocols/jabber/buddy.c:323
-#: ../libpurple/protocols/jabber/buddy.c:1287
-#: ../libpurple/protocols/msn/msn.c:1828
-#: ../libpurple/protocols/msnp9/msn.c:1669
-#: ../libpurple/protocols/oscar/oscar.c:3786
 msgid "Birthday"
 msgstr "Syntymäpäivä"
 
-#: ../libpurple/protocols/jabber/buddy.c:324
-#: ../libpurple/protocols/jabber/buddy.c:1402
-#: ../libpurple/protocols/jabber/chat.c:780
-#: ../libpurple/protocols/jabber/usermood.c:190 ../pidgin/gtkblist.c:3427
-#: ../pidgin/gtkplugin.c:582 ../pidgin/gtkprefs.c:688
 msgid "Description"
 msgstr "Kuvaus"
 
-#: ../libpurple/protocols/jabber/buddy.c:752
-#: ../libpurple/protocols/jabber/buddy.c:753
 msgid "Edit XMPP vCard"
 msgstr "Muokkaa XMPP-vCardia"
 
-#: ../libpurple/protocols/jabber/buddy.c:754
 msgid ""
 "All items below are optional. Enter only the information with which you feel "
 "comfortable."
@@ -5179,386 +3684,231 @@
 "Kaikki alla olevat kentät ovat valinnaisia. Kirjoita vain tiedot, joiden "
 "luovuttamista pidät sopivana."
 
-#: ../libpurple/protocols/jabber/buddy.c:825
-#: ../libpurple/protocols/jabber/buddy.c:990
 msgid "Client"
 msgstr "Asiakasohjelma"
 
-#: ../libpurple/protocols/jabber/buddy.c:829
-#: ../libpurple/protocols/jabber/buddy.c:994
 msgid "Operating System"
 msgstr "Käyttöjärjestelmä"
 
-#: ../libpurple/protocols/jabber/buddy.c:845
-#: ../libpurple/protocols/jabber/buddy.c:1005
 msgid "Last Activity"
 msgstr "Viimeisin aktiivisena olo"
 
-#: ../libpurple/protocols/jabber/buddy.c:847
-#: ../libpurple/protocols/jabber/buddy.c:1007
 msgid "Service Discovery Info"
 msgstr "Palvelulöytötiedot"
 
-#: ../libpurple/protocols/jabber/buddy.c:849
-#: ../libpurple/protocols/jabber/buddy.c:1009
 msgid "Service Discovery Items"
 msgstr "Palvelulöytökohteet"
 
-#: ../libpurple/protocols/jabber/buddy.c:851
-#: ../libpurple/protocols/jabber/buddy.c:1011
 msgid "Extended Stanza Addressing"
 msgstr "Laajennettu raakalohko-osoitus"
 
-#: ../libpurple/protocols/jabber/buddy.c:853
-#: ../libpurple/protocols/jabber/buddy.c:1013
 msgid "Multi-User Chat"
 msgstr "Monen käyttäjän keskustelu"
 
-#: ../libpurple/protocols/jabber/buddy.c:855
-#: ../libpurple/protocols/jabber/buddy.c:1015
 msgid "Multi-User Chat Extended Presence Information"
 msgstr "Monen käyttäjän keskustelun laajennetut läsnäolotiedot"
 
-#: ../libpurple/protocols/jabber/buddy.c:857
-#: ../libpurple/protocols/jabber/buddy.c:1017
 msgid "In-Band Bytestreams"
 msgstr "In-band-tavujonot"
 
-#: ../libpurple/protocols/jabber/buddy.c:859
-#: ../libpurple/protocols/jabber/buddy.c:1019
 msgid "Ad-Hoc Commands"
 msgstr "Ad-Hoc-komennot"
 
-#: ../libpurple/protocols/jabber/buddy.c:861
-#: ../libpurple/protocols/jabber/buddy.c:1021
 msgid "PubSub Service"
 msgstr "PubSub-palvelu"
 
-#: ../libpurple/protocols/jabber/buddy.c:863
-#: ../libpurple/protocols/jabber/buddy.c:1023
 msgid "SOCKS5 Bytestreams"
 msgstr "SOCKS5-tavujonot"
 
-#: ../libpurple/protocols/jabber/buddy.c:865
-#: ../libpurple/protocols/jabber/buddy.c:1025
 msgid "Out of Band Data"
 msgstr "Out of band -tiedot"
 
-#: ../libpurple/protocols/jabber/buddy.c:867
-#: ../libpurple/protocols/jabber/buddy.c:1027
 msgid "XHTML-IM"
 msgstr "XHTML-IM"
 
-#: ../libpurple/protocols/jabber/buddy.c:869
-#: ../libpurple/protocols/jabber/buddy.c:1029
 msgid "In-Band Registration"
 msgstr "Rekisteröinti \"in-band\""
 
-#: ../libpurple/protocols/jabber/buddy.c:871
-#: ../libpurple/protocols/jabber/buddy.c:1031
 msgid "User Location"
 msgstr "Käyttäjän sijainti"
 
-#: ../libpurple/protocols/jabber/buddy.c:873
-#: ../libpurple/protocols/jabber/buddy.c:1033
 msgid "User Avatar"
 msgstr "Käyttäjän hahmo"
 
-#: ../libpurple/protocols/jabber/buddy.c:875
-#: ../libpurple/protocols/jabber/buddy.c:1035
 msgid "Chat State Notifications"
 msgstr "Keskustelun tilan ilmoitukset"
 
-#: ../libpurple/protocols/jabber/buddy.c:877
-#: ../libpurple/protocols/jabber/buddy.c:1037
 msgid "Software Version"
 msgstr "Ohjelmistoversio"
 
-#: ../libpurple/protocols/jabber/buddy.c:879
-#: ../libpurple/protocols/jabber/buddy.c:1039
 msgid "Stream Initiation"
 msgstr "Virtauksen alustus"
 
-#: ../libpurple/protocols/jabber/buddy.c:881
-#: ../libpurple/protocols/jabber/buddy.c:1041
-#: ../libpurple/protocols/sametime/sametime.c:3287
 msgid "File Transfer"
 msgstr "Tiedostonsiirto"
 
-#: ../libpurple/protocols/jabber/buddy.c:883
-#: ../libpurple/protocols/jabber/buddy.c:1043
 msgid "User Mood"
 msgstr "Käyttäjän mieliala"
 
-#: ../libpurple/protocols/jabber/buddy.c:885
-#: ../libpurple/protocols/jabber/buddy.c:1045
 msgid "User Activity"
 msgstr "Käyttäjän aktiivisuus"
 
-#: ../libpurple/protocols/jabber/buddy.c:887
-#: ../libpurple/protocols/jabber/buddy.c:1047
 msgid "Entity Capabilities"
 msgstr "Entiteetin ominaisuudet"
 
-#: ../libpurple/protocols/jabber/buddy.c:889
-#: ../libpurple/protocols/jabber/buddy.c:1049
 msgid "Encrypted Session Negotiations"
 msgstr "Salatut istuntojen neuvottelut"
 
-#: ../libpurple/protocols/jabber/buddy.c:891
-#: ../libpurple/protocols/jabber/buddy.c:1051
 msgid "User Tune"
 msgstr "Käyttäjänimi"
 
-#: ../libpurple/protocols/jabber/buddy.c:893
-#: ../libpurple/protocols/jabber/buddy.c:1053
 msgid "Roster Item Exchange"
 msgstr "Tuttavaluetteloiden vaihto"
 
-#: ../libpurple/protocols/jabber/buddy.c:895
-#: ../libpurple/protocols/jabber/buddy.c:1055
 msgid "Reachability Address"
 msgstr "Tavoitettavuusosoite"
 
-#: ../libpurple/protocols/jabber/buddy.c:897
-#: ../libpurple/protocols/jabber/buddy.c:1057
 msgid "User Profile"
 msgstr "Käyttäjän profiili"
 
-#: ../libpurple/protocols/jabber/buddy.c:899
-#: ../libpurple/protocols/jabber/buddy.c:1059
 msgid "Jingle"
 msgstr "Jingle"
 
-#: ../libpurple/protocols/jabber/buddy.c:901
-#: ../libpurple/protocols/jabber/buddy.c:1061
 msgid "Jingle Audio"
 msgstr "Jingle-ääni"
 
-#: ../libpurple/protocols/jabber/buddy.c:903
-#: ../libpurple/protocols/jabber/buddy.c:1063
 msgid "User Nickname"
 msgstr "Käyttäjän kutsumanimi"
 
-#: ../libpurple/protocols/jabber/buddy.c:905
-#: ../libpurple/protocols/jabber/buddy.c:1065
 msgid "Jingle ICE UDP"
 msgstr "Jingle ICE UDP"
 
-#: ../libpurple/protocols/jabber/buddy.c:907
-#: ../libpurple/protocols/jabber/buddy.c:1067
 msgid "Jingle ICE TCP"
 msgstr "Jingle ICE TCP"
 
-#: ../libpurple/protocols/jabber/buddy.c:909
-#: ../libpurple/protocols/jabber/buddy.c:1069
 msgid "Jingle Raw UDP"
 msgstr "Jingle raaka-UDP"
 
-#: ../libpurple/protocols/jabber/buddy.c:911
-#: ../libpurple/protocols/jabber/buddy.c:1071
 msgid "Jingle Video"
 msgstr "Jingle-video"
 
-#: ../libpurple/protocols/jabber/buddy.c:913
-#: ../libpurple/protocols/jabber/buddy.c:1073
 msgid "Jingle DTMF"
 msgstr "Jingle DTMF"
 
-#: ../libpurple/protocols/jabber/buddy.c:915
-#: ../libpurple/protocols/jabber/buddy.c:1075
 msgid "Message Receipts"
 msgstr "Viestikuittaukset"
 
-#: ../libpurple/protocols/jabber/buddy.c:917
-#: ../libpurple/protocols/jabber/buddy.c:1077
 msgid "Public Key Publishing"
 msgstr "Julkisen avaimen julkaiseminen"
 
-#: ../libpurple/protocols/jabber/buddy.c:919
-#: ../libpurple/protocols/jabber/buddy.c:1079
 msgid "User Chatting"
 msgstr "Käyttäjä keskustelee"
 
-#: ../libpurple/protocols/jabber/buddy.c:921
-#: ../libpurple/protocols/jabber/buddy.c:1081
 msgid "User Browsing"
 msgstr "Käyttäjä selaa"
 
-#: ../libpurple/protocols/jabber/buddy.c:923
-#: ../libpurple/protocols/jabber/buddy.c:1083
 msgid "User Gaming"
 msgstr "Käyttäjä pelaa"
 
-#: ../libpurple/protocols/jabber/buddy.c:925
-#: ../libpurple/protocols/jabber/buddy.c:1085
 msgid "User Viewing"
 msgstr "Käyttäjä katselee"
 
-#: ../libpurple/protocols/jabber/buddy.c:927
-#: ../libpurple/protocols/jabber/buddy.c:1087
-#: ../libpurple/protocols/silc/ops.c:1613
-#: ../libpurple/protocols/silc/ops.c:1618
-#: ../libpurple/protocols/silc10/ops.c:1612
-#: ../libpurple/protocols/silc10/ops.c:1617
 msgid "Ping"
 msgstr "Ping"
 
-#: ../libpurple/protocols/jabber/buddy.c:929
-#: ../libpurple/protocols/jabber/buddy.c:1089
 msgid "Stanza Encryption"
 msgstr "Raakalohkojen salaus"
 
-#: ../libpurple/protocols/jabber/buddy.c:931
-#: ../libpurple/protocols/jabber/buddy.c:1091
 msgid "Entity Time"
 msgstr "Entiteetin aika"
 
-#: ../libpurple/protocols/jabber/buddy.c:933
-#: ../libpurple/protocols/jabber/buddy.c:1093
 msgid "Delayed Delivery"
 msgstr "Viivästetty toimitus"
 
-#: ../libpurple/protocols/jabber/buddy.c:935
-#: ../libpurple/protocols/jabber/buddy.c:1095
 msgid "Collaborative Data Objects"
 msgstr "Yhteistyötä tekevät dataobjektit"
 
-#: ../libpurple/protocols/jabber/buddy.c:937
-#: ../libpurple/protocols/jabber/buddy.c:1097
 msgid "File Repository and Sharing"
 msgstr "Tiedostovarasto ja jakaminen"
 
-#: ../libpurple/protocols/jabber/buddy.c:939
-#: ../libpurple/protocols/jabber/buddy.c:1099
 msgid "STUN Service Discovery for Jingle"
 msgstr "STUN-palvelun löytäminen Jinglelle"
 
-#: ../libpurple/protocols/jabber/buddy.c:941
-#: ../libpurple/protocols/jabber/buddy.c:1101
 msgid "Simplified Encrypted Session Negotiation"
 msgstr "Yksinkertaistettu salatun istunnon neuvottelu"
 
-#: ../libpurple/protocols/jabber/buddy.c:943
-#: ../libpurple/protocols/jabber/buddy.c:1103
 msgid "Hop Check"
 msgstr "Hyppytarkistus"
 
-#: ../libpurple/protocols/jabber/buddy.c:951
-#: ../libpurple/protocols/jabber/buddy.c:1111
-#: ../libpurple/protocols/oscar/oscar.c:2960
 msgid "Capabilities"
 msgstr "Kyvyt"
 
-#: ../libpurple/protocols/jabber/buddy.c:963
-#: ../libpurple/protocols/jabber/libxmpp.c:209
-#: ../libpurple/protocols/jabber/si.c:1103
+msgid "Priority"
+msgstr "Tärkeys"
+
 msgid "Resource"
 msgstr "Sijainti"
 
-#: ../libpurple/protocols/jabber/buddy.c:965
-#: ../libpurple/protocols/jabber/jabber.c:1610
-#: ../libpurple/protocols/jabber/jabber.c:1624
-#: ../libpurple/protocols/jabber/jabber.c:1638
-#: ../libpurple/protocols/jabber/jabber.c:1652
-#: ../libpurple/protocols/jabber/jabber.c:1666
-msgid "Priority"
-msgstr "Tärkeys"
-
-#: ../libpurple/protocols/jabber/buddy.c:1274
-#: ../libpurple/protocols/silc/ops.c:1008
-#: ../libpurple/protocols/silc10/ops.c:1028
 msgid "Middle Name"
 msgstr "Muut etunimet"
 
-#: ../libpurple/protocols/jabber/buddy.c:1307
-#: ../libpurple/protocols/jabber/jabber.c:1014
-#: ../libpurple/protocols/oscar/oscar.c:3825
-#: ../libpurple/protocols/oscar/oscar.c:3838
-#: ../libpurple/protocols/qq/buddy_info.c:56
-#: ../libpurple/protocols/silc/ops.c:1044
-#: ../libpurple/protocols/silc10/ops.c:1064
 msgid "Address"
 msgstr "Osoite"
 
-#: ../libpurple/protocols/jabber/buddy.c:1313
 msgid "P.O. Box"
 msgstr "Postilokero"
 
-#: ../libpurple/protocols/jabber/buddy.c:1423
 msgid "Photo"
 msgstr "Valokuva"
 
-#: ../libpurple/protocols/jabber/buddy.c:1423
 msgid "Logo"
 msgstr "Logo"
 
-#: ../libpurple/protocols/jabber/buddy.c:1992
 msgid "Un-hide From"
 msgstr "\"Tule esiin\""
 
-#: ../libpurple/protocols/jabber/buddy.c:1996
 msgid "Temporarily Hide From"
 msgstr "Piiloudu väliaikaisesti tuttavalta"
 
 #. && NOT ME
-#: ../libpurple/protocols/jabber/buddy.c:2004
 msgid "Cancel Presence Notification"
 msgstr "Peru paikallaoloilmoitus"
 
-#: ../libpurple/protocols/jabber/buddy.c:2011
 msgid "(Re-)Request authorization"
 msgstr "Pyydä valtuutusta uudelleen"
 
 #. if(NOT ME)
 #. shouldn't this just happen automatically when the buddy is
 #. removed?
-#: ../libpurple/protocols/jabber/buddy.c:2020
 msgid "Unsubscribe"
 msgstr "Poista listalta"
 
-#: ../libpurple/protocols/jabber/buddy.c:2035
 msgid "Log In"
 msgstr "Kirjaudu sisään"
 
-#: ../libpurple/protocols/jabber/buddy.c:2039
 msgid "Log Out"
 msgstr "Kirjaudu ulos"
 
-#: ../libpurple/protocols/jabber/buddy.c:2085
-#: ../libpurple/protocols/jabber/jabber.c:1623
 msgid "Chatty"
 msgstr "Juttelutuulella"
 
-#: ../libpurple/protocols/jabber/buddy.c:2089
 msgid "Extended Away"
 msgstr "Pidennetty poissaolo"
 
-#: ../libpurple/protocols/jabber/buddy.c:2091
-#: ../libpurple/protocols/jabber/jabber.c:1665
-#: ../libpurple/protocols/oscar/oscar.c:728
-#: ../libpurple/protocols/oscar/oscar.c:5921
-#: ../libpurple/protocols/sametime/sametime.c:3349
 #, c-format
 msgid "Do Not Disturb"
 msgstr "Älä häiritse"
 
-#: ../libpurple/protocols/jabber/buddy.c:2258
 msgid "JID"
 msgstr "JID"
 
-#: ../libpurple/protocols/jabber/buddy.c:2262
-#: ../libpurple/protocols/jabber/buddy.c:2451
-#: ../libpurple/protocols/oscar/oscar.c:3748
 msgid "Last Name"
 msgstr "Sukunimi"
 
-#: ../libpurple/protocols/jabber/buddy.c:2294
 msgid "The following are the results of your search"
 msgstr "Hakutulokset"
 
 #. current comment from Jabber User Directory users.jabber.org
-#: ../libpurple/protocols/jabber/buddy.c:2379
 msgid ""
 "Find a contact by entering the search criteria in the given fields. Note: "
 "Each field supports wild card searches (%)"
@@ -5566,181 +3916,118 @@
 "Etsi henkilöä syöttämällä hakukriteerit kenttiin. Huom: jokainen kenttä "
 "tukee jokerimerkkejä (%)"
 
-#: ../libpurple/protocols/jabber/buddy.c:2399
 msgid "Directory Query Failed"
 msgstr "Hakemistohaku epäonnistui"
 
-#: ../libpurple/protocols/jabber/buddy.c:2400
 msgid "Could not query the directory server."
 msgstr "Hakemistopalvelimelta ei voi hakea."
 
 #. Try to translate the message (see static message
 #. list in jabber_user_dir_comments[])
-#: ../libpurple/protocols/jabber/buddy.c:2434
 #, c-format
 msgid "Server Instructions: %s"
 msgstr "Palvelimen ohjeet: %s"
 
-#: ../libpurple/protocols/jabber/buddy.c:2441
 msgid "Fill in one or more fields to search for any matching XMPP users."
 msgstr "Täytä yksi tai useampia kentistä etsiäksesi XMPP-käyttäjiä."
 
-#: ../libpurple/protocols/jabber/buddy.c:2461
-#: ../libpurple/protocols/novell/novell.c:1497
-#: ../libpurple/protocols/oscar/oscar.c:3751
-#: ../libpurple/protocols/oscar/oscar.c:3760
 msgid "Email Address"
 msgstr "Sähköpostiosoite"
 
-#: ../libpurple/protocols/jabber/buddy.c:2470
-#: ../libpurple/protocols/jabber/buddy.c:2471
 msgid "Search for XMPP users"
 msgstr "Etsi XMPP-käyttäjiä"
 
 #. "Search"
-#: ../libpurple/protocols/jabber/buddy.c:2472
-#: ../libpurple/protocols/qq/group.c:123
-#: ../libpurple/protocols/qq/group_im.c:147
-#: ../libpurple/protocols/qq/sys_msg.c:177
-#: ../libpurple/protocols/qq/sys_msg.c:253
-#: ../libpurple/protocols/qq/sys_msg.c:271
-#: ../libpurple/protocols/sametime/sametime.c:5667
-#: ../pidgin/plugins/gevolution/add_buddy_dialog.c:474
-#: ../pidgin/plugins/gevolution/assoc-buddy.c:356
 msgid "Search"
 msgstr "Etsi"
 
-#: ../libpurple/protocols/jabber/buddy.c:2487
 msgid "Invalid Directory"
 msgstr "Virheellinen kansio"
 
-#: ../libpurple/protocols/jabber/buddy.c:2504
 msgid "Enter a User Directory"
 msgstr "Syötä käyttäjähakemisto"
 
-#: ../libpurple/protocols/jabber/buddy.c:2505
 msgid "Select a user directory to search"
 msgstr "Valitse käyttäjähakemisto, josta haetaan"
 
-#: ../libpurple/protocols/jabber/buddy.c:2508
 msgid "Search Directory"
 msgstr "Etsi hakemistosta"
 
-#: ../libpurple/protocols/jabber/chat.c:41
-#: ../libpurple/protocols/oscar/oscar.c:5401
-#: ../libpurple/protocols/yahoo/yahoochat.c:1057
 msgid "_Room:"
 msgstr "_Huone:"
 
-#: ../libpurple/protocols/jabber/chat.c:47
 msgid "_Server:"
 msgstr "_Palvelin:"
 
-#: ../libpurple/protocols/jabber/chat.c:53
 msgid "_Handle:"
 msgstr "_Keskustelunimi:"
 
-#: ../libpurple/protocols/jabber/chat.c:226
 #, c-format
 msgid "%s is not a valid room name"
 msgstr "%s ei ole kelvollinen keskusteluhuoneen nimi"
 
-#: ../libpurple/protocols/jabber/chat.c:227
 msgid "Invalid Room Name"
 msgstr "Epäkelpo keskusteluhuoneen nimi"
 
-#: ../libpurple/protocols/jabber/chat.c:232
 #, c-format
 msgid "%s is not a valid server name"
 msgstr "%s ei ole kelvollinen palvelinnimi."
 
-#: ../libpurple/protocols/jabber/chat.c:233
-#: ../libpurple/protocols/jabber/chat.c:234
 msgid "Invalid Server Name"
 msgstr "Palvelimen nimi ei kelpaa"
 
-#: ../libpurple/protocols/jabber/chat.c:238
 #, c-format
 msgid "%s is not a valid room handle"
 msgstr "%s ei ole kelvollinen keskustelunimi (room handle)"
 
-#: ../libpurple/protocols/jabber/chat.c:239
-#: ../libpurple/protocols/jabber/chat.c:240
 msgid "Invalid Room Handle"
 msgstr "Keskustelunimi ei kelpaa"
 
-#: ../libpurple/protocols/jabber/chat.c:401
 msgid "Configuration error"
 msgstr "Konfigurointivirhe"
 
-#: ../libpurple/protocols/jabber/chat.c:410
-#: ../libpurple/protocols/jabber/chat.c:553
 msgid "Unable to configure"
 msgstr "Asetusten tekeminen ei onnistu"
 
-#: ../libpurple/protocols/jabber/chat.c:425
 msgid "Room Configuration Error"
 msgstr "Huoneen konfigurointivirhe"
 
-#: ../libpurple/protocols/jabber/chat.c:426
 msgid "This room is not capable of being configured"
 msgstr "Tätä huonetta ei voi konfiguroida"
 
-#: ../libpurple/protocols/jabber/chat.c:475
-#: ../libpurple/protocols/jabber/chat.c:544
 msgid "Registration error"
 msgstr "Rekisteröintivirhe"
 
-#: ../libpurple/protocols/jabber/chat.c:632
 msgid "Nick changing not supported in non-MUC chatrooms"
 msgstr "Kutsumanimeä ei voi muuttaa muissa kuin MUC-keskusteluhuoneissa"
 
-#: ../libpurple/protocols/jabber/chat.c:683
-#: ../libpurple/protocols/jabber/chat.c:694
-#: ../libpurple/protocols/silc/ops.c:1473
-#: ../libpurple/protocols/silc10/ops.c:1451
 msgid "Error retrieving room list"
 msgstr "Virhe haettaessa huoneluetteloa"
 
-#: ../libpurple/protocols/jabber/chat.c:742
 msgid "Invalid Server"
 msgstr "Palvelin ei kelpaa"
 
-#: ../libpurple/protocols/jabber/chat.c:786
 msgid "Enter a Conference Server"
 msgstr "Syötä konferenssipalvelin"
 
-#: ../libpurple/protocols/jabber/chat.c:787
 msgid "Select a conference server to query"
 msgstr "Valitse konferenssipalvelin"
 
-#: ../libpurple/protocols/jabber/chat.c:790
 msgid "Find Rooms"
 msgstr "Etsi huoneita"
 
-#: ../libpurple/protocols/jabber/jabber.c:151
 msgid "You require encryption, but it is not available on this server."
 msgstr "Salausta vaadittu, mutta sitä ei tueta tällä palvelimella."
 
-#: ../libpurple/protocols/jabber/jabber.c:269
-#: ../libpurple/protocols/jabber/jabber.c:324
-#: ../libpurple/protocols/jabber/jabber.c:354
 msgid "Write error"
 msgstr "Virhe kirjoituksessa"
 
-#: ../libpurple/protocols/jabber/jabber.c:401
 msgid "Ping timeout"
 msgstr "Pingin aikakatkaisu"
 
-#: ../libpurple/protocols/jabber/jabber.c:451
-#: ../libpurple/protocols/jabber/jabber.c:491
 msgid "Read Error"
 msgstr "Virhe luettaessa"
 
-#: ../libpurple/protocols/jabber/jabber.c:528
-#: ../libpurple/protocols/oscar/flap_connection.c:403
-#: ../libpurple/protocols/yahoo/yahoo.c:2594
-#: ../libpurple/protocols/yahoo/yahoo.c:2626
 #, c-format
 msgid ""
 "Could not establish a connection with the server:\n"
@@ -5749,601 +4036,410 @@
 "Yhteyttä palvelimeen ei voi muodostaa:\n"
 "%s"
 
-#: ../libpurple/protocols/jabber/jabber.c:585
 msgid "Unable to create socket"
 msgstr "Pistokkeen luonti epäonnistui"
 
-#: ../libpurple/protocols/jabber/jabber.c:635
-#: ../libpurple/protocols/jabber/jabber.c:1120
 msgid "Invalid XMPP ID"
 msgstr "Epäkelpo XMPP-ID"
 
-#: ../libpurple/protocols/jabber/jabber.c:642
 msgid "Invalid XMPP ID. Domain must be set."
 msgstr "Epäkelpo XMPP-ID. Verkkoalue pitää olla asetettu."
 
-#: ../libpurple/protocols/jabber/jabber.c:720
 #, c-format
 msgid "Registration of %s@%s successful"
 msgstr "%s@%s:n rekisteröinti onnistui"
 
-#: ../libpurple/protocols/jabber/jabber.c:726
 #, c-format
 msgid "Registration to %s successful"
 msgstr "Rekisteröinti kohteeseen %s onnistui"
 
-#: ../libpurple/protocols/jabber/jabber.c:728
-#: ../libpurple/protocols/jabber/jabber.c:729
 msgid "Registration Successful"
 msgstr "Rekisteröinti onnistui"
 
-#: ../libpurple/protocols/jabber/jabber.c:737
-#: ../libpurple/protocols/jabber/jabber.c:738
 msgid "Registration Failed"
 msgstr "Rekisteröinti epäonnistui"
 
-#: ../libpurple/protocols/jabber/jabber.c:756
 #, c-format
 msgid "Registration from %s successfully removed"
 msgstr "Rekisteröinti kohteesta %s onnistuneesti poistettu"
 
-#: ../libpurple/protocols/jabber/jabber.c:758
-#: ../libpurple/protocols/jabber/jabber.c:759
 msgid "Unregistration Successful"
 msgstr "Rekisteröinnin poisto onnistui"
 
-#: ../libpurple/protocols/jabber/jabber.c:767
-#: ../libpurple/protocols/jabber/jabber.c:768
 msgid "Unregistration Failed"
 msgstr "Rekisteröinnin poisto epäonnistui"
 
-#: ../libpurple/protocols/jabber/jabber.c:934
-#: ../libpurple/protocols/jabber/jabber.c:935
 msgid "Already Registered"
 msgstr "Valmiiksi rekisteröity"
 
-#: ../libpurple/protocols/jabber/jabber.c:1022
-#: ../libpurple/protocols/oscar/oscar.c:3827
-#: ../libpurple/protocols/oscar/oscar.c:3840
 msgid "State"
 msgstr "Lääni"
 
-#: ../libpurple/protocols/jabber/jabber.c:1026
 msgid "Postal code"
 msgstr "Postinumero"
 
-#: ../libpurple/protocols/jabber/jabber.c:1030
-#: ../libpurple/protocols/silc/ops.c:1049
-#: ../libpurple/protocols/silc/silc.c:988
-#: ../libpurple/protocols/silc/util.c:563
-#: ../libpurple/protocols/silc10/ops.c:1069
-#: ../libpurple/protocols/silc10/silc.c:689
-#: ../libpurple/protocols/silc10/util.c:557
 msgid "Phone"
 msgstr "Puhelin"
 
-#: ../libpurple/protocols/jabber/jabber.c:1038
 msgid "Date"
 msgstr "Päiväys"
 
-#: ../libpurple/protocols/jabber/jabber.c:1042
 msgid "Unregister"
 msgstr "Rekisteröinnin poisto"
 
-#: ../libpurple/protocols/jabber/jabber.c:1049
 msgid ""
 "Please fill out the information below to change your account registration."
 msgstr "Syötä alla olevat tiedot muuttaaksesi käyttäjätilin rekisteröimistä."
 
-#: ../libpurple/protocols/jabber/jabber.c:1052
 msgid "Please fill out the information below to register your new account."
 msgstr "Syötä alla olevat tiedot rekisteröidäksesi uuden tilin."
 
-#: ../libpurple/protocols/jabber/jabber.c:1060
-#: ../libpurple/protocols/jabber/jabber.c:1061
 msgid "Register New XMPP Account"
 msgstr "Rekisteröi uusi XMPP-tili"
 
-#: ../libpurple/protocols/jabber/jabber.c:1062
-#: ../libpurple/protocols/jabber/jabber.c:1071
 msgid "Register"
 msgstr "Rekisteröi"
 
-#: ../libpurple/protocols/jabber/jabber.c:1067
 #, c-format
 msgid "Change Account Registration at %s"
 msgstr "Vaihda tilin rekisteröitymistä kohteessa %s"
 
-#: ../libpurple/protocols/jabber/jabber.c:1068
 #, c-format
 msgid "Register New Account at %s"
 msgstr "Rekisteröi uusi tili kohteessa %s"
 
-#: ../libpurple/protocols/jabber/jabber.c:1071
 msgid "Change Registration"
 msgstr "Muuta rekisteröitymistä"
 
-#: ../libpurple/protocols/jabber/jabber.c:1180
-#: ../libpurple/protocols/jabber/jabber.c:1181
 msgid "Error unregistering account"
 msgstr "Virhe poistettaessa käyttäjätilin rekisteröitymistä"
 
-#: ../libpurple/protocols/jabber/jabber.c:1186
-#: ../libpurple/protocols/jabber/jabber.c:1187
 msgid "Account successfully unregistered"
 msgstr "Käyttäjätilin rekisteröinti poistettiin onnistuneesti"
 
-#: ../libpurple/protocols/jabber/jabber.c:1350
 msgid "Initializing Stream"
 msgstr "Alustetaan datavirtaa"
 
-#: ../libpurple/protocols/jabber/jabber.c:1355
 msgid "Initializing SSL/TLS"
 msgstr "Alustetaan SSL/TLS-salausta"
 
-#: ../libpurple/protocols/jabber/jabber.c:1359
-#: ../libpurple/protocols/msn/session.c:408
-#: ../libpurple/protocols/msnp9/session.c:360
 msgid "Authenticating"
 msgstr "Todennetaan"
 
-#: ../libpurple/protocols/jabber/jabber.c:1368
 msgid "Re-initializing Stream"
 msgstr "Uudelleenalustetaan datavirtaa"
 
-#: ../libpurple/protocols/jabber/jabber.c:1462
-#: ../libpurple/protocols/jabber/jabber.c:1920
-#: ../libpurple/protocols/jabber/jabber.c:1963
-#: ../libpurple/protocols/jabber/jabber.c:2001
-#: ../libpurple/protocols/oscar/oscar.c:827
-#: ../libpurple/protocols/oscar/oscar.c:5715
 msgid "Not Authorized"
 msgstr "Ei valtuuksia"
 
-#: ../libpurple/protocols/jabber/jabber.c:1510
 msgid "Both"
 msgstr "molemmille"
 
-#: ../libpurple/protocols/jabber/jabber.c:1512
 msgid "From (To pending)"
 msgstr "vain sinulle (odottaa lupaa)"
 
-#: ../libpurple/protocols/jabber/jabber.c:1514
 msgid "From"
 msgstr "Lähettäjä"
 
-#: ../libpurple/protocols/jabber/jabber.c:1517
 msgid "To"
 msgstr "vain sinulta"
 
-#: ../libpurple/protocols/jabber/jabber.c:1519
 msgid "None (To pending)"
 msgstr "Ei mitään (odottaa lupaa)"
 
-#: ../libpurple/protocols/jabber/jabber.c:1521
-#: ../pidgin/plugins/gevolution/eds-utils.c:73
-#: ../pidgin/plugins/gevolution/eds-utils.c:86
 msgid "None"
 msgstr "Ei mitään"
 
-#: ../libpurple/protocols/jabber/jabber.c:1524
 msgid "Subscription"
 msgstr "Tilailmoitus"
 
-#: ../libpurple/protocols/jabber/jabber.c:1534
-#: ../libpurple/protocols/jabber/jabber.c:1537
-#: ../libpurple/protocols/jabber/jabber.c:1612
-#: ../libpurple/protocols/jabber/jabber.c:1626
-#: ../libpurple/protocols/jabber/jabber.c:1640
-#: ../libpurple/protocols/jabber/jabber.c:1654
-#: ../libpurple/protocols/jabber/jabber.c:1668
-#: ../libpurple/protocols/jabber/usermood.c:181
-#: ../libpurple/protocols/silc/buddy.c:1560
-#: ../libpurple/protocols/silc/ops.c:1225
-#: ../libpurple/protocols/silc10/buddy.c:1560
-#: ../libpurple/protocols/silc10/ops.c:1207
 msgid "Mood"
 msgstr "Mieliala"
 
-#: ../libpurple/protocols/jabber/jabber.c:1546
-#: ../libpurple/protocols/msn/msn.c:656
 msgid "Now Listening"
 msgstr "Kuuntelee nyt"
 
-#: ../libpurple/protocols/jabber/jabber.c:1613
-#: ../libpurple/protocols/jabber/jabber.c:1627
-#: ../libpurple/protocols/jabber/jabber.c:1641
-#: ../libpurple/protocols/jabber/jabber.c:1655
-#: ../libpurple/protocols/jabber/jabber.c:1669
 msgid "Mood Text"
 msgstr "Mielialan teksti"
 
-#: ../libpurple/protocols/jabber/jabber.c:1615
-#: ../libpurple/protocols/jabber/jabber.c:1629
-#: ../libpurple/protocols/jabber/jabber.c:1643
-#: ../libpurple/protocols/jabber/jabber.c:1657
-#: ../libpurple/protocols/jabber/jabber.c:1671
 msgid "Allow Buzz"
 msgstr "Salli äänimerkki"
 
-#: ../libpurple/protocols/jabber/jabber.c:1689
 msgid "Tune Artist"
 msgstr "Kappaleen esittäjä"
 
-#: ../libpurple/protocols/jabber/jabber.c:1690
 msgid "Tune Title"
 msgstr "Kappaleen nimi"
 
-#: ../libpurple/protocols/jabber/jabber.c:1691
 msgid "Tune Album"
 msgstr "Kappaleen levy"
 
-#: ../libpurple/protocols/jabber/jabber.c:1692
 msgid "Tune Genre"
 msgstr "Kappaleen tyylilaji"
 
-#: ../libpurple/protocols/jabber/jabber.c:1693
 msgid "Tune Comment"
 msgstr "Kappaleen kommentti"
 
-#: ../libpurple/protocols/jabber/jabber.c:1694
 msgid "Tune Track"
 msgstr "Kappaleen numero"
 
-#: ../libpurple/protocols/jabber/jabber.c:1695
 msgid "Tune Time"
 msgstr "Kappaleen kesto"
 
-#: ../libpurple/protocols/jabber/jabber.c:1696
 msgid "Tune Year"
 msgstr "Kappaleen vuosi"
 
-#: ../libpurple/protocols/jabber/jabber.c:1697
 msgid "Tune URL"
 msgstr "Kappaleen URL"
 
-#: ../libpurple/protocols/jabber/jabber.c:1713
 msgid "Password Changed"
 msgstr "Salasana muutettu"
 
-#: ../libpurple/protocols/jabber/jabber.c:1714
 msgid "Your password has been changed."
 msgstr "Salasana vaihdettu"
 
-#: ../libpurple/protocols/jabber/jabber.c:1720
-#: ../libpurple/protocols/jabber/jabber.c:1721
 msgid "Error changing password"
 msgstr "Virhe vaihdettaessa salasanaa"
 
-#: ../libpurple/protocols/jabber/jabber.c:1778
 msgid "Password (again)"
 msgstr "Salasana (uudelleen)"
 
-#: ../libpurple/protocols/jabber/jabber.c:1784
-#: ../libpurple/protocols/jabber/jabber.c:1785
 msgid "Change XMPP Password"
 msgstr "Vaihda XMPP-salasana"
 
-#: ../libpurple/protocols/jabber/jabber.c:1785
 msgid "Please enter your new password"
 msgstr "Anna uusi salasanasi"
 
-#: ../libpurple/protocols/jabber/jabber.c:1799
-#: ../libpurple/protocols/oscar/oscar.c:6502
-#: ../libpurple/protocols/silc/silc.c:1309
-#: ../libpurple/protocols/silc10/silc.c:1010
 msgid "Set User Info..."
 msgstr "Aseta käyttäjätiedot..."
 
 #. if (js->protocol_options & CHANGE_PASSWORD) {
-#: ../libpurple/protocols/jabber/jabber.c:1804
-#: ../libpurple/protocols/oscar/oscar.c:6513
-#: ../libpurple/protocols/silc/silc.c:1305
-#: ../libpurple/protocols/silc10/silc.c:1006
 msgid "Change Password..."
 msgstr "Vaihda salasana..."
 
 #. }
-#: ../libpurple/protocols/jabber/jabber.c:1809
 msgid "Search for Users..."
 msgstr "Etsi käyttäjiä..."
 
-#: ../libpurple/protocols/jabber/jabber.c:1900
 msgid "Bad Request"
 msgstr "Virheellinen pyyntö"
 
-#: ../libpurple/protocols/jabber/jabber.c:1902
 msgid "Conflict"
 msgstr "Ristiriita"
 
-#: ../libpurple/protocols/jabber/jabber.c:1904
 msgid "Feature Not Implemented"
 msgstr "Ominaisuutta ei ole implementoitu."
 
-#: ../libpurple/protocols/jabber/jabber.c:1906
 msgid "Forbidden"
 msgstr "Estetty"
 
-#: ../libpurple/protocols/jabber/jabber.c:1908
 msgid "Gone"
 msgstr "Poistunut"
 
-#: ../libpurple/protocols/jabber/jabber.c:1910
-#: ../libpurple/protocols/jabber/jabber.c:1991
 msgid "Internal Server Error"
 msgstr "Sisäinen palvelinvirhe"
 
-#: ../libpurple/protocols/jabber/jabber.c:1912
 msgid "Item Not Found"
 msgstr "Kohdetta ei löytynyt"
 
-#: ../libpurple/protocols/jabber/jabber.c:1914
 msgid "Malformed XMPP ID"
 msgstr "Muodoltaan virheellinen XMPP-ID"
 
-#: ../libpurple/protocols/jabber/jabber.c:1916
 msgid "Not Acceptable"
 msgstr "Ei kelvollinen"
 
-#: ../libpurple/protocols/jabber/jabber.c:1918
 msgid "Not Allowed"
 msgstr "Ei sallittu"
 
-#: ../libpurple/protocols/jabber/jabber.c:1922
 msgid "Payment Required"
 msgstr "Vaatii maksun"
 
-#: ../libpurple/protocols/jabber/jabber.c:1924
 msgid "Recipient Unavailable"
 msgstr "Vastaanottaja ei saatavilla."
 
-#: ../libpurple/protocols/jabber/jabber.c:1928
 msgid "Registration Required"
 msgstr "Vaatii rekisteröinnin"
 
-#: ../libpurple/protocols/jabber/jabber.c:1930
 msgid "Remote Server Not Found"
 msgstr "Palvelinta ei löytynyt"
 
-#: ../libpurple/protocols/jabber/jabber.c:1932
 msgid "Remote Server Timeout"
 msgstr "Palvelin aikakatkaisi"
 
-#: ../libpurple/protocols/jabber/jabber.c:1934
 msgid "Server Overloaded"
 msgstr "Palvelin ylikuormitettu"
 
-#: ../libpurple/protocols/jabber/jabber.c:1936
 msgid "Service Unavailable"
 msgstr "Palvelu ei käytettävissä"
 
-#: ../libpurple/protocols/jabber/jabber.c:1938
 msgid "Subscription Required"
 msgstr "Vaatii tilailmoitukset"
 
-#: ../libpurple/protocols/jabber/jabber.c:1940
 msgid "Unexpected Request"
 msgstr "Odottamaton pyyntö"
 
-#: ../libpurple/protocols/jabber/jabber.c:1948
 msgid "Authorization Aborted"
 msgstr "Valtuutus keskeytetty"
 
-#: ../libpurple/protocols/jabber/jabber.c:1950
 msgid "Incorrect encoding in authorization"
 msgstr "Väärä merkistö valtuutusviestissä"
 
-#: ../libpurple/protocols/jabber/jabber.c:1952
 msgid "Invalid authzid"
 msgstr "Epäkelpo authzid"
 
-#: ../libpurple/protocols/jabber/jabber.c:1954
 msgid "Invalid Authorization Mechanism"
 msgstr "Epäkelpo tunnistautumismekanismi"
 
-#: ../libpurple/protocols/jabber/jabber.c:1957
 msgid "Authorization mechanism too weak"
 msgstr "Tunnistautumismekanismi liian heikko"
 
-#: ../libpurple/protocols/jabber/jabber.c:1965
 msgid "Temporary Authentication Failure"
 msgstr "Väliaikainen todennusvirhe"
 
-#: ../libpurple/protocols/jabber/jabber.c:1968
 msgid "Authentication Failure"
 msgstr "Todennus epäonnistui"
 
-#: ../libpurple/protocols/jabber/jabber.c:1976
 msgid "Bad Format"
 msgstr "Väärä muoto"
 
-#: ../libpurple/protocols/jabber/jabber.c:1978
 msgid "Bad Namespace Prefix"
 msgstr "Väärä nimiavaruuden etuliite"
 
-#: ../libpurple/protocols/jabber/jabber.c:1981
 msgid "Resource Conflict"
 msgstr "Sijaintikonflikti"
 
-#: ../libpurple/protocols/jabber/jabber.c:1983
-#: ../libpurple/protocols/silc/silc.c:350
-#: ../libpurple/protocols/silc10/ops.c:1725
 msgid "Connection Timeout"
 msgstr "Ei yhteyttä määräajassa"
 
-#: ../libpurple/protocols/jabber/jabber.c:1985
 msgid "Host Gone"
 msgstr "Verkkoisäntä kadonnut"
 
-#: ../libpurple/protocols/jabber/jabber.c:1987
 msgid "Host Unknown"
 msgstr "Tuntematon isäntä"
 
-#: ../libpurple/protocols/jabber/jabber.c:1989
 msgid "Improper Addressing"
 msgstr "Vääränlainen osoitus"
 
-#: ../libpurple/protocols/jabber/jabber.c:1993
 msgid "Invalid ID"
 msgstr "Epäkelpo ID"
 
-#: ../libpurple/protocols/jabber/jabber.c:1995
 msgid "Invalid Namespace"
 msgstr "Väärä nimiavaruus"
 
-#: ../libpurple/protocols/jabber/jabber.c:1997
 msgid "Invalid XML"
 msgstr "Epäkelpo XML"
 
-#: ../libpurple/protocols/jabber/jabber.c:1999
 msgid "Non-matching Hosts"
 msgstr "Verkkoisännät eivät täsmää"
 
-#: ../libpurple/protocols/jabber/jabber.c:2003
 msgid "Policy Violation"
 msgstr "Menettelykäytäntörikkomus"
 
-#: ../libpurple/protocols/jabber/jabber.c:2005
 msgid "Remote Connection Failed"
 msgstr "Etäyhteydessä yhteydessä virhe"
 
-#: ../libpurple/protocols/jabber/jabber.c:2007
 msgid "Resource Constraint"
 msgstr "Sijaintirajoite"
 
-#: ../libpurple/protocols/jabber/jabber.c:2009
 msgid "Restricted XML"
 msgstr "Rajoitettu XML"
 
-#: ../libpurple/protocols/jabber/jabber.c:2011
 msgid "See Other Host"
 msgstr "Etsi toinen isäntä"
 
-#: ../libpurple/protocols/jabber/jabber.c:2013
 msgid "System Shutdown"
 msgstr "Järjestelmän alasajo"
 
-#: ../libpurple/protocols/jabber/jabber.c:2015
 msgid "Undefined Condition"
 msgstr "Määrittelemätön tila"
 
-#: ../libpurple/protocols/jabber/jabber.c:2017
 msgid "Unsupported Encoding"
 msgstr "Merkistöä ei tueta"
 
-#: ../libpurple/protocols/jabber/jabber.c:2019
 msgid "Unsupported Stanza Type"
 msgstr "Säkeistötyyppiä (stanza type) ei tuettu"
 
-#: ../libpurple/protocols/jabber/jabber.c:2021
 msgid "Unsupported Version"
 msgstr "Versiota ei tueta"
 
-#: ../libpurple/protocols/jabber/jabber.c:2023
 msgid "XML Not Well Formed"
 msgstr "Huonosti muotoiltua XML:ää"
 
-#: ../libpurple/protocols/jabber/jabber.c:2025
 msgid "Stream Error"
 msgstr "Datavirtavirhe"
 
-#: ../libpurple/protocols/jabber/jabber.c:2110
 #, c-format
 msgid "Unable to ban user %s"
 msgstr "Käyttäjää %s ei voi estää"
 
-#: ../libpurple/protocols/jabber/jabber.c:2130
 #, c-format
 msgid "Unknown affiliation: \"%s\""
 msgstr "Tuntematon kytkös: \"%s\""
 
-#: ../libpurple/protocols/jabber/jabber.c:2135
 #, c-format
 msgid "Unable to affiliate user %s as \"%s\""
 msgstr "Käyttäjälle %s ei voi tehdä kytköstä \"%s\""
 
-#: ../libpurple/protocols/jabber/jabber.c:2154
 #, c-format
 msgid "Unknown role: \"%s\""
 msgstr "Tuntematon rooli: \"%s\""
 
-#: ../libpurple/protocols/jabber/jabber.c:2159
 #, c-format
 msgid "Unable to set role \"%s\" for user: %s"
 msgstr "Roolia \"%s\" ei voi asettaa käyttäjälle: %s"
 
-#: ../libpurple/protocols/jabber/jabber.c:2212
 #, c-format
 msgid "Unable to kick user %s"
 msgstr "Käyttäjää %s ei voi potkaista ulos."
 
-#: ../libpurple/protocols/jabber/jabber.c:2243
 #, c-format
 msgid "Unable to ping user %s"
 msgstr "Käyttäjää %s ei voi pingata."
 
-#: ../libpurple/protocols/jabber/jabber.c:2261
-#: ../libpurple/protocols/jabber/jabber.c:2272
 #, c-format
 msgid "Unable to buzz, because there is nothing known about user %s."
 msgstr "Äänimerkkiä ei voi lähettää, koska mitään ei tiedetä käyttäjästä %s."
 
-#: ../libpurple/protocols/jabber/jabber.c:2267
 #, c-format
 msgid "Unable to buzz, because user %s might be offline."
 msgstr ""
 "Äänimerkkiä ei voi lähettää, koska käyttäjä %s voi olla poissa linjoilta."
 
-#: ../libpurple/protocols/jabber/jabber.c:2298
 #, c-format
 msgid "Unable to buzz, because the user %s does not support it."
 msgstr "Äänimerkkiä ei voi lähettää, koska käyttäjä %s ei tue sitä."
 
 #. Yahoo only supports one attention command: the 'buzz'.
 #. This is index number YAHOO_BUZZ.
-#: ../libpurple/protocols/jabber/jabber.c:2318
-#: ../libpurple/protocols/yahoo/yahoo.c:4167
 msgid "Buzz"
 msgstr "Tööttää"
 
-#: ../libpurple/protocols/jabber/jabber.c:2319
-#: ../libpurple/protocols/jabber/message.c:308
-#: ../libpurple/protocols/yahoo/yahoo.c:4168
 #, c-format
 msgid "%s has buzzed you!"
 msgstr "%s on töötännyt sinulle."
 
-#: ../libpurple/protocols/jabber/jabber.c:2319
-#: ../libpurple/protocols/yahoo/yahoo.c:4168
 #, c-format
 msgid "Buzzing %s..."
 msgstr "Töötätään tuttavalle %s..."
 
-#: ../libpurple/protocols/jabber/jabber.c:2350
 msgid "config:  Configure a chat room."
 msgstr "config: Konfiguroi ryhmäkeskusteluhuone."
 
-#: ../libpurple/protocols/jabber/jabber.c:2354
 msgid "configure:  Configure a chat room."
 msgstr "configure: Konfiguroi ryhmäkeskusteluhuone."
 
-#: ../libpurple/protocols/jabber/jabber.c:2363
 msgid "part [room]:  Leave the room."
 msgstr "part [huone]: Poistu huoneesta."
 
-#: ../libpurple/protocols/jabber/jabber.c:2368
 msgid "register:  Register with a chat room."
 msgstr "register: Rekisteröidy ryhmäkeskusteluhuoneeseen."
 
-#: ../libpurple/protocols/jabber/jabber.c:2374
 msgid "topic [new topic]:  View or change the topic."
 msgstr "topic [uusi aihe]: Näytä tai vaihda aihe."
 
-#: ../libpurple/protocols/jabber/jabber.c:2380
 msgid "ban &lt;user&gt; [reason]:  Ban a user from the room."
 msgstr "ban &lt;käyttäjä&gt; [syy]: Estä käyttäjä huoneesta."
 
-#: ../libpurple/protocols/jabber/jabber.c:2386
 msgid ""
 "affiliate &lt;user&gt; &lt;owner|admin|member|outcast|none&gt;: Set a user's "
 "affiliation with the room."
@@ -6351,7 +4447,6 @@
 "affiliate &lt;user&gt; &lt;owner|admin|member|outcast|none&gt;: Aseta "
 "käyttäjän käyttäjäluokka tälle huoneelle."
 
-#: ../libpurple/protocols/jabber/jabber.c:2392
 msgid ""
 "role &lt;user&gt; &lt;moderator|participant|visitor|none&gt;: Set a user's "
 "role in the room."
@@ -6359,31 +4454,24 @@
 "role &lt;user&gt; &lt;moderator|participant|visitor|none&gt;: Aseta "
 "käyttäjän rooli huoneessa."
 
-#: ../libpurple/protocols/jabber/jabber.c:2398
 msgid "invite &lt;user&gt; [message]:  Invite a user to the room."
 msgstr "invite &lt;käyttäjä&gt; [viesti]: Kutsu käyttäjä huoneeseen."
 
-#: ../libpurple/protocols/jabber/jabber.c:2404
 msgid "join: &lt;room&gt; [password]:  Join a chat on this server."
 msgstr ""
 "join: &lt;huone&gt; [salasana]: Liity ryhmäkeskusteluun tällä palvelimella."
 
-#: ../libpurple/protocols/jabber/jabber.c:2410
 msgid "kick &lt;user&gt; [reason]:  Kick a user from the room."
 msgstr "kick &lt;käyttäjä&gt; [syy]: Potkaise käyttäjä ulos huoneesta."
 
-#: ../libpurple/protocols/jabber/jabber.c:2415
 msgid ""
 "msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
 msgstr ""
 "msh &lt;käyttäjä&gt; &lt;viesti&gt;: Lähetä yksityisviesti käyttäjälle."
 
-#: ../libpurple/protocols/jabber/jabber.c:2421
 msgid "ping &lt;jid&gt;:\tPing a user/component/server."
 msgstr "ping &lt;jid&gt;:\tPingaa käyttäjää/komponenttia/palvelinta."
 
-#: ../libpurple/protocols/jabber/jabber.c:2426
-#: ../libpurple/protocols/yahoo/yahoo.c:4191
 msgid "buzz: Buzz a user to get their attention"
 msgstr "buzz: Tööttää tuttavalle äänimerkki huomion saamiseksi"
 
@@ -6397,96 +4485,70 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/jabber/libxmpp.c:170
-#: ../libpurple/protocols/jabber/libxmpp.c:172
 msgid "XMPP Protocol Plugin"
 msgstr "XMPP-yhteyskäytäntöliitännäinen"
 
 #. Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im
-#: ../libpurple/protocols/jabber/libxmpp.c:205 ../pidgin/gtkaccount.c:478
 msgid "Domain"
 msgstr "Palvelin"
 
-#: ../libpurple/protocols/jabber/libxmpp.c:213
 msgid "Require SSL/TLS"
 msgstr "Vaadi SSL/TLS"
 
-#: ../libpurple/protocols/jabber/libxmpp.c:217
 msgid "Force old (port 5223) SSL"
 msgstr "Käytä vanhaa (portti 5223) SSL:ää"
 
-#: ../libpurple/protocols/jabber/libxmpp.c:222
 msgid "Allow plaintext auth over unencrypted streams"
 msgstr "Salli salaamaton tunnistautuminen salaamattoman yhteyden yli"
 
-#: ../libpurple/protocols/jabber/libxmpp.c:227
-#: ../libpurple/protocols/myspace/myspace.c:3475
-#: ../libpurple/protocols/simple/simple.c:2105
 msgid "Connect port"
 msgstr "Yhdistä porttiin"
 
 #. TODO: default to automatically try different ports. Make the user be
 #. * able to set the first port to try (like LastConnectedPort in Windows client).
 #. Account options
-#: ../libpurple/protocols/jabber/libxmpp.c:231
-#: ../libpurple/protocols/myspace/myspace.c:3472
-#: ../libpurple/protocols/silc/silc.c:2139
-#: ../libpurple/protocols/silc10/silc.c:1863 ../pidgin/gtkaccount.c:811
 msgid "Connect server"
 msgstr "Yhdistä palvelimeen"
 
-#: ../libpurple/protocols/jabber/libxmpp.c:236
 msgid "File transfer proxies"
 msgstr "Tiedostonsiirron välipalvelimet"
 
-#: ../libpurple/protocols/jabber/message.c:106
 #, c-format
 msgid "%s has left the conversation."
 msgstr "%s on lähtenyt keskustelusta."
 
-#: ../libpurple/protocols/jabber/message.c:162
 #, c-format
 msgid "Message from %s"
 msgstr "Viesti %s:lta"
 
-#: ../libpurple/protocols/jabber/message.c:226
 #, c-format
 msgid "%s has set the topic to: %s"
 msgstr "%s vaihtoi aiheeksi: %s"
 
-#: ../libpurple/protocols/jabber/message.c:228
 #, c-format
 msgid "The topic is: %s"
 msgstr "Aihe on: %s"
 
-#: ../libpurple/protocols/jabber/message.c:276
 #, c-format
 msgid "Message delivery to %s failed: %s"
 msgstr "Viestin toimitus %s:lle epäonnistui: %s"
 
-#: ../libpurple/protocols/jabber/message.c:279
 msgid "XMPP Message Error"
 msgstr "XMPP-viestivirhe"
 
-#: ../libpurple/protocols/jabber/message.c:408
-#, c-format
-msgid " (Code %s)"
-msgstr " (Koodi %s)"
-
-#: ../libpurple/protocols/jabber/parser.c:198
+#, c-format
+msgid "(Code %s)"
+msgstr "(Koodi %s)"
+
 msgid "XML Parse error"
 msgstr "Virhe XML-jäsennyksessä"
 
-#: ../libpurple/protocols/jabber/presence.c:453
 msgid "Unknown Error in presence"
 msgstr "Tuntematon virhe tavoitettavuudessa"
 
-#: ../libpurple/protocols/jabber/presence.c:534
-#: ../libpurple/protocols/jabber/presence.c:535
 msgid "Create New Room"
 msgstr "Luo uusi huone"
 
-#: ../libpurple/protocols/jabber/presence.c:536
 msgid ""
 "You are creating a new room.  Would you like to configure it, or accept the "
 "default settings?"
@@ -6494,88 +4556,66 @@
 "Olet luomassa uutta huonetta. Haluatko muuttaa asetuksia vai käytetäänkö "
 "oletusasetuksia?"
 
-#: ../libpurple/protocols/jabber/presence.c:542
 msgid "_Configure Room"
 msgstr "_Aseta huoneen asetuksia"
 
-#: ../libpurple/protocols/jabber/presence.c:543
 msgid "_Accept Defaults"
 msgstr "_Hyväksy oletusasetukset"
 
-#: ../libpurple/protocols/jabber/presence.c:585
+#, c-format
+msgid "Error joining chat %s"
+msgstr "Virhe liityttäessä ryhmäkeskusteluun %s"
+
 #, c-format
 msgid "Error in chat %s"
 msgstr "Virhe ryhmäkeskustelussa: %s"
 
-#: ../libpurple/protocols/jabber/presence.c:589
-#, c-format
-msgid "Error joining chat %s"
-msgstr "Virhe liityttäessä ryhmäkeskusteluun %s"
-
-#: ../libpurple/protocols/jabber/si.c:1018
 #, c-format
 msgid "Unable to send file to %s, user does not support file transfers"
 msgstr ""
 "Tiedostoa ei voi lähettää käyttäjälle %s, käyttäjä ei tue tiedostonsiirtoja"
 
-#: ../libpurple/protocols/jabber/si.c:1019
-#: ../libpurple/protocols/jabber/si.c:1020
-#: ../libpurple/protocols/jabber/si.c:1089
 msgid "File Send Failed"
 msgstr "Tiedoston lähetys epäonnistui"
 
-#: ../libpurple/protocols/jabber/si.c:1082
 #, c-format
 msgid "Unable to send file to %s, invalid JID"
 msgstr "Tiedostoa ei voi lähettää käyttäjälle %s, virheellinen JID."
 
-#: ../libpurple/protocols/jabber/si.c:1084
 #, c-format
 msgid "Unable to send file to %s, user is not online"
 msgstr "Tiedostoa ei voi lähettää käyttäjälle %s, käyttäjä ei ole linjoilla"
 
-#: ../libpurple/protocols/jabber/si.c:1086
 #, c-format
 msgid "Unable to send file to %s, not subscribed to user presence"
 msgstr ""
 "Tiedostoa ei voi lähettää käyttäjälle %s, käyttäjä ei tue tiedostonsiirtoja"
 
-#: ../libpurple/protocols/jabber/si.c:1101
 #, c-format
 msgid "Please select the resource of %s to which you would like to send a file"
 msgstr "Valitse käyttäjän %s sijainti johon haluat lähettää tiedoston"
 
-#: ../libpurple/protocols/jabber/si.c:1117
 msgid "Select a Resource"
 msgstr "Valitse sijainti"
 
-#: ../libpurple/protocols/jabber/usermood.c:194
-#: ../libpurple/protocols/jabber/usermood.c:195
 msgid "Edit User Mood"
 msgstr "Muuta käyttäjän mielialaa"
 
-#: ../libpurple/protocols/jabber/usermood.c:196
 msgid "Please select your mood from the list."
 msgstr "Valitse mielialasi luettelosta."
 
-#: ../libpurple/protocols/jabber/usermood.c:198
-#: ../libpurple/protocols/jabber/usernick.c:78
 msgid "Set"
 msgstr "Aseta"
 
-#: ../libpurple/protocols/jabber/usermood.c:206
 msgid "Set Mood..."
 msgstr "Aseta mieliala..."
 
-#: ../libpurple/protocols/jabber/usernick.c:76
 msgid "Set User Nickname"
 msgstr "Aseta käyttäjän kutsumanimi"
 
-#: ../libpurple/protocols/jabber/usernick.c:76
 msgid "Please specify a new nickname for you."
 msgstr "Syötä uusi kutsumanimesi."
 
-#: ../libpurple/protocols/jabber/usernick.c:77
 msgid ""
 "This information is visible to all contacts on your contact list, so choose "
 "something appropriate."
@@ -6583,30 +4623,22 @@
 "Tämä tieto on näkyvillä kaikille tuttavissa oleville kontakteille, joten "
 "valitse jotain soveliasta."
 
-#: ../libpurple/protocols/jabber/usernick.c:100
 msgid "Set Nickname..."
 msgstr "Aseta kutsumanimi..."
 
-#: ../libpurple/protocols/jabber/xdata.c:381
 msgid "Actions"
 msgstr "Toiminnot"
 
-#: ../libpurple/protocols/jabber/xdata.c:383
 msgid "Select an action"
 msgstr "Valitse toiminto"
 
-#: ../libpurple/protocols/msn/contact.c:782
 msgid "Unable to retrieve MSN Address Book"
 msgstr "MSN-osoitekirjaa ei onnistuttu noutamaan"
 
-#: ../libpurple/protocols/msn/dialog.c:118
-#: ../libpurple/protocols/msnp9/dialog.c:110
 #, c-format
 msgid "Buddy list synchronization issue in %s (%s)"
 msgstr "Tuttavien synkronointiongelma käyttäjätilillä %s (%s)"
 
-#: ../libpurple/protocols/msn/dialog.c:124
-#: ../libpurple/protocols/msnp9/dialog.c:116
 #, c-format
 msgid ""
 "%s on the local list is inside the group \"%s\" but not on the server list. "
@@ -6615,8 +4647,6 @@
 "%s paikallisissa tuttavissa on ryhmässä \"%s\" mutta ei ole palvelimen "
 "tuttavissa. Haluatko että tämä tuttava lisätään?"
 
-#: ../libpurple/protocols/msn/dialog.c:132
-#: ../libpurple/protocols/msnp9/dialog.c:124
 #, c-format
 msgid ""
 "%s is on the local list but not on the server list. Do you want this buddy "
@@ -6625,389 +4655,261 @@
 "%s paikallisella tuttavissa mutta ei palvelimen. Haluatko että tämä tuttava "
 "lisätään?"
 
-#: ../libpurple/protocols/msn/error.c:36
-#: ../libpurple/protocols/msnp9/error.c:36
 #, c-format
 msgid "Unable to parse message"
 msgstr "Viestin jäsennys epäonnistui"
 
-#: ../libpurple/protocols/msn/error.c:41
-#: ../libpurple/protocols/msnp9/error.c:41
 #, c-format
 msgid "Syntax Error (probably a client bug)"
 msgstr "Syntaksivirhe (todennäköisesti ohjelmistovirhe)"
 
-#: ../libpurple/protocols/msn/error.c:46
-#: ../libpurple/protocols/msnp9/error.c:46
 #, c-format
 msgid "Invalid email address"
 msgstr "Epäkelpo sähköpostiosoite"
 
-#: ../libpurple/protocols/msn/error.c:49
-#: ../libpurple/protocols/msnp9/error.c:49
 #, c-format
 msgid "User does not exist"
 msgstr "Käyttäjää ei ole"
 
-#: ../libpurple/protocols/msn/error.c:53
-#: ../libpurple/protocols/msnp9/error.c:53
 #, c-format
 msgid "Fully qualified domain name missing"
 msgstr "Täysin kelvollinen verkkoalueen nimi puuttuu"
 
-#: ../libpurple/protocols/msn/error.c:56
-#: ../libpurple/protocols/msnp9/error.c:56
 #, c-format
 msgid "Already logged in"
 msgstr "Olet jo kirjautuneena sisään"
 
-#: ../libpurple/protocols/msn/error.c:59
-#: ../libpurple/protocols/msnp9/error.c:59
 #, c-format
 msgid "Invalid username"
 msgstr "Epäkelpo käyttäjänimi."
 
-#: ../libpurple/protocols/msn/error.c:62
-#: ../libpurple/protocols/msnp9/error.c:62
 #, c-format
 msgid "Invalid friendly name"
 msgstr "Epäkelpo lempinimi"
 
-#: ../libpurple/protocols/msn/error.c:65
-#: ../libpurple/protocols/msnp9/error.c:65
 #, c-format
 msgid "List full"
 msgstr "Lista täynnä"
 
-#: ../libpurple/protocols/msn/error.c:68
-#: ../libpurple/protocols/msnp9/error.c:68
 #, c-format
 msgid "Already there"
 msgstr "On jo siellä"
 
-#: ../libpurple/protocols/msn/error.c:72
-#: ../libpurple/protocols/msnp9/error.c:72
 #, c-format
 msgid "Not on list"
 msgstr "Ei tuttavissa"
 
-#: ../libpurple/protocols/msn/error.c:75
-#: ../libpurple/protocols/msnp9/error.c:75
-#: ../libpurple/protocols/zephyr/zephyr.c:760
 #, c-format
 msgid "User is offline"
 msgstr "Käyttäjä on poissa linjoilta"
 
-#: ../libpurple/protocols/msn/error.c:78
-#: ../libpurple/protocols/msnp9/error.c:78
 #, c-format
 msgid "Already in the mode"
 msgstr "Olet jo kyseisessä tilassa"
 
-#: ../libpurple/protocols/msn/error.c:82
-#: ../libpurple/protocols/msnp9/error.c:82
 #, c-format
 msgid "Already in opposite list"
 msgstr "On jo vastakkaisessa listassa"
 
-#: ../libpurple/protocols/msn/error.c:86
-#: ../libpurple/protocols/msnp9/error.c:86
 #, c-format
 msgid "Too many groups"
 msgstr "Liian monta ryhmää"
 
-#: ../libpurple/protocols/msn/error.c:89
-#: ../libpurple/protocols/msnp9/error.c:89
 #, c-format
 msgid "Invalid group"
 msgstr "Epäkelpo ryhmä"
 
-#: ../libpurple/protocols/msn/error.c:92
-#: ../libpurple/protocols/msnp9/error.c:92
 #, c-format
 msgid "User not in group"
 msgstr "Käyttäjä ei ole ryhmässä"
 
-#: ../libpurple/protocols/msn/error.c:95
-#: ../libpurple/protocols/msnp9/error.c:95
 #, c-format
 msgid "Group name too long"
 msgstr "Ryhmän nimi liian pitkä"
 
-#: ../libpurple/protocols/msn/error.c:98
-#: ../libpurple/protocols/msnp9/error.c:98
 #, c-format
 msgid "Cannot remove group zero"
 msgstr "Ryhmää nolla ei voi poistaa"
 
-#: ../libpurple/protocols/msn/error.c:103
-#: ../libpurple/protocols/msnp9/error.c:103
 #, c-format
 msgid "Tried to add a user to a group that doesn't exist"
 msgstr "Yritettiin lisätä käyttäjää ryhmään jota ei ole"
 
-#: ../libpurple/protocols/msn/error.c:107
-#: ../libpurple/protocols/msnp9/error.c:107
 #, c-format
 msgid "Switchboard failed"
 msgstr "Kytkentä epäonnistui"
 
-#: ../libpurple/protocols/msn/error.c:111
-#: ../libpurple/protocols/msnp9/error.c:111
 #, c-format
 msgid "Notify transfer failed"
 msgstr "Siirrosta tiedottaminen epäonnistui"
 
-#: ../libpurple/protocols/msn/error.c:116
-#: ../libpurple/protocols/msnp9/error.c:116
 #, c-format
 msgid "Required fields missing"
 msgstr "Vaadittuja kenttiä puuttuu"
 
-#: ../libpurple/protocols/msn/error.c:120
-#: ../libpurple/protocols/msnp9/error.c:120
 #, c-format
 msgid "Too many hits to a FND"
 msgstr "Liian monta osumaa FND:hen"
 
-#: ../libpurple/protocols/msn/error.c:124
-#: ../libpurple/protocols/msnp9/error.c:124
-#: ../libpurple/protocols/oscar/oscar.c:121
 #, c-format
 msgid "Not logged in"
 msgstr "Et ole kirjautunut sisään."
 
-#: ../libpurple/protocols/msn/error.c:128
-#: ../libpurple/protocols/msnp9/error.c:128
 #, c-format
 msgid "Service temporarily unavailable"
 msgstr "Palvelu ei tilapäisesti ole käytettävissä"
 
-#: ../libpurple/protocols/msn/error.c:131
-#: ../libpurple/protocols/msnp9/error.c:131
 #, c-format
 msgid "Database server error"
 msgstr "Tietokantapalvelimen virhe"
 
-#: ../libpurple/protocols/msn/error.c:135
-#: ../libpurple/protocols/msnp9/error.c:135
 #, c-format
 msgid "Command disabled"
 msgstr "Komento poistettu käytöstä"
 
-#: ../libpurple/protocols/msn/error.c:139
-#: ../libpurple/protocols/msnp9/error.c:139
 #, c-format
 msgid "File operation error"
 msgstr "Tiedostotoiminnossa virhe"
 
-#: ../libpurple/protocols/msn/error.c:143
-#: ../libpurple/protocols/msnp9/error.c:143
 #, c-format
 msgid "Memory allocation error"
 msgstr "Muistin varaamisessa virhe"
 
-#: ../libpurple/protocols/msn/error.c:147
-#: ../libpurple/protocols/msnp9/error.c:147
 #, c-format
 msgid "Wrong CHL value sent to server"
 msgstr "Väärä CHL-arvo lähetetty palvelimelle"
 
-#: ../libpurple/protocols/msn/error.c:152
-#: ../libpurple/protocols/msnp9/error.c:152
 #, c-format
 msgid "Server busy"
 msgstr "Palvelimella ruuhkaa"
 
-#: ../libpurple/protocols/msn/error.c:155
-#: ../libpurple/protocols/msn/error.c:170
-#: ../libpurple/protocols/msn/error.c:230
-#: ../libpurple/protocols/msnp9/error.c:155
-#: ../libpurple/protocols/msnp9/error.c:170
-#: ../libpurple/protocols/msnp9/error.c:230
 #, c-format
 msgid "Server unavailable"
 msgstr "Palvelin on tavoittamattomissa"
 
-#: ../libpurple/protocols/msn/error.c:158
-#: ../libpurple/protocols/msnp9/error.c:158
 #, c-format
 msgid "Peer notification server down"
 msgstr "Vastapään ilmoituspalvelin ei toiminnassa"
 
-#: ../libpurple/protocols/msn/error.c:162
-#: ../libpurple/protocols/msnp9/error.c:162
 #, c-format
 msgid "Database connect error"
 msgstr "Tietokantayhteysvirhe"
 
-#: ../libpurple/protocols/msn/error.c:167
-#: ../libpurple/protocols/msnp9/error.c:167
 #, c-format
 msgid "Server is going down (abandon ship)"
 msgstr "Palvelin on poistumassa toiminnasta (jättäkää laiva)"
 
-#: ../libpurple/protocols/msn/error.c:174
-#: ../libpurple/protocols/msnp9/error.c:174
 #, c-format
 msgid "Error creating connection"
 msgstr "Virhe luotaessa yhteyttä"
 
-#: ../libpurple/protocols/msn/error.c:179
-#: ../libpurple/protocols/msnp9/error.c:179
 #, c-format
 msgid "CVR parameters are either unknown or not allowed"
 msgstr "CVR-parametrit ovat joko tuntemattomat tai ne eivät ole sallittuja"
 
-#: ../libpurple/protocols/msn/error.c:183
-#: ../libpurple/protocols/msnp9/error.c:183
 #, c-format
 msgid "Unable to write"
 msgstr "Ei kyetty kirjoittamaan"
 
-#: ../libpurple/protocols/msn/error.c:186
-#: ../libpurple/protocols/msnp9/error.c:186
 #, c-format
 msgid "Session overload"
 msgstr "Istunnon ylikuormitus"
 
-#: ../libpurple/protocols/msn/error.c:190
-#: ../libpurple/protocols/msnp9/error.c:190
 #, c-format
 msgid "User is too active"
 msgstr "Käyttäjä on liian aktiivinen"
 
-#: ../libpurple/protocols/msn/error.c:193
-#: ../libpurple/protocols/msnp9/error.c:193
 #, c-format
 msgid "Too many sessions"
 msgstr "Liian monta istuntoa"
 
-#: ../libpurple/protocols/msn/error.c:196
-#: ../libpurple/protocols/msnp9/error.c:196
 #, c-format
 msgid "Passport not verified"
 msgstr "Passport-tiliä ei ole varmistettu"
 
-#: ../libpurple/protocols/msn/error.c:199
-#: ../libpurple/protocols/msnp9/error.c:199
 #, c-format
 msgid "Bad friend file"
 msgstr "Virheellinen tuttavatiedosto"
 
-#: ../libpurple/protocols/msn/error.c:203
-#: ../libpurple/protocols/msnp9/error.c:203
 #, c-format
 msgid "Not expected"
 msgstr "Odottamaton"
 
-#: ../libpurple/protocols/msn/error.c:209
-#: ../libpurple/protocols/msnp9/error.c:209
 #, c-format
 msgid "Friendly name changes too rapidly"
 msgstr "Tuttavanimi vaihtuu liian usein"
 
-#: ../libpurple/protocols/msn/error.c:218
-#: ../libpurple/protocols/msnp9/error.c:218
 #, c-format
 msgid "Server too busy"
 msgstr "Palvelimella liikaa ruuhkaa "
 
-#: ../libpurple/protocols/msn/error.c:222
-#: ../libpurple/protocols/msnp9/error.c:222
-#: ../libpurple/protocols/oscar/oscar.c:1422
-#: ../libpurple/protocols/silc/silc.c:338
-#: ../libpurple/protocols/silc10/ops.c:1713
-#: ../libpurple/protocols/toc/toc.c:728 ../libpurple/proxy.c:1448
 #, c-format
 msgid "Authentication failed"
 msgstr "Todennus epäonnistui"
 
-#: ../libpurple/protocols/msn/error.c:225
-#: ../libpurple/protocols/msnp9/error.c:225
 #, c-format
 msgid "Not allowed when offline"
 msgstr "Ei sallittu kun poissa linjoilta"
 
-#: ../libpurple/protocols/msn/error.c:233
-#: ../libpurple/protocols/msnp9/error.c:233
 #, c-format
 msgid "Not accepting new users"
 msgstr "Ei ota vastaan uusia käyttäjiä"
 
-#: ../libpurple/protocols/msn/error.c:237
-#: ../libpurple/protocols/msnp9/error.c:237
 #, c-format
 msgid "Kids Passport without parental consent"
 msgstr "Kids Passport - ilman vanhempien hyväksyntää"
 
-#: ../libpurple/protocols/msn/error.c:241
-#: ../libpurple/protocols/msnp9/error.c:241
 #, c-format
 msgid "Passport account not yet verified"
 msgstr "Passport-tiliä ei ole verifioitu"
 
-#: ../libpurple/protocols/msn/error.c:244
-#: ../libpurple/protocols/msnp9/error.c:244
 #, c-format
 msgid "Bad ticket"
 msgstr "Bad ticket"
 
-#: ../libpurple/protocols/msn/error.c:249
-#: ../libpurple/protocols/msnp9/error.c:249
 #, c-format
 msgid "Unknown Error Code %d"
 msgstr "Tuntematon virhekoodi %d"
 
-#: ../libpurple/protocols/msn/error.c:263
-#: ../libpurple/protocols/msnp9/error.c:263
 #, c-format
 msgid "MSN Error: %s\n"
 msgstr "MSN-virhe: %s\n"
 
-#: ../libpurple/protocols/msn/msn.c:128 ../libpurple/protocols/msnp9/msn.c:129
 msgid "Nudge"
 msgstr "Tönäise"
 
-#: ../libpurple/protocols/msn/msn.c:129 ../libpurple/protocols/msnp9/msn.c:130
 #, c-format
 msgid "%s has nudged you!"
 msgstr "%s on tönäissyt sinua."
 
-#: ../libpurple/protocols/msn/msn.c:129 ../libpurple/protocols/msnp9/msn.c:130
 #, c-format
 msgid "Nudging %s..."
 msgstr "Tönäistään tuttavaa %s..."
 
-#: ../libpurple/protocols/msn/msn.c:170 ../libpurple/protocols/msnp9/msn.c:171
+msgid "Email Address..."
+msgstr "Sähköpostiosoite..."
+
 msgid "Your new MSN friendly name is too long."
 msgstr "Uusi MSN-tuttavanimesi on liian pitkä."
 
-#: ../libpurple/protocols/msn/msn.c:296 ../libpurple/protocols/msnp9/msn.c:279
 msgid "Set your friendly name."
 msgstr "Aseta tuttavanimesi."
 
-#: ../libpurple/protocols/msn/msn.c:297 ../libpurple/protocols/msnp9/msn.c:280
 msgid "This is the name that other MSN buddies will see you as."
 msgstr "Tämä on nimi jona MSN-tuttavasi sinut näkevät."
 
-#: ../libpurple/protocols/msn/msn.c:315 ../libpurple/protocols/msnp9/msn.c:298
 msgid "Set your home phone number."
 msgstr "Aseta kotipuhelinnumerosi"
 
-#: ../libpurple/protocols/msn/msn.c:332 ../libpurple/protocols/msnp9/msn.c:315
 msgid "Set your work phone number."
 msgstr "Aseta työpuhelinnumerosi"
 
-#: ../libpurple/protocols/msn/msn.c:349 ../libpurple/protocols/msnp9/msn.c:332
 msgid "Set your mobile phone number."
 msgstr "Aseta matkapuhelinnumerosi"
 
-#: ../libpurple/protocols/msn/msn.c:364 ../libpurple/protocols/msnp9/msn.c:347
 msgid "Allow MSN Mobile pages?"
 msgstr "Salli MSN-mobiilihaut"
 
-#: ../libpurple/protocols/msn/msn.c:365 ../libpurple/protocols/msnp9/msn.c:348
 msgid ""
 "Do you want to allow or disallow people on your buddy list to send you MSN "
 "Mobile pages to your cell phone or other mobile device?"
@@ -7015,69 +4917,53 @@
 "Haluatko sallia tai estää henkilöitä tuttavissasi lähettämästä MSN- "
 "mobiilihakuja matkapuhelimeesi tai muuhun mobiililaitteeseen?"
 
-#: ../libpurple/protocols/msn/msn.c:371 ../libpurple/protocols/msnp9/msn.c:354
 msgid "Allow"
 msgstr "Salli"
 
-#: ../libpurple/protocols/msn/msn.c:372 ../libpurple/protocols/msnp9/msn.c:355
 msgid "Disallow"
 msgstr "Kiellä"
 
-#: ../libpurple/protocols/msn/msn.c:388 ../libpurple/protocols/msnp9/msn.c:371
-msgid "This Hotmail account may not be active."
-msgstr "Tämä Hotmail-tili ei välttämättä ole aktiivinen."
-
-#: ../libpurple/protocols/msn/msn.c:414 ../libpurple/protocols/msnp9/msn.c:397
+#, c-format
+msgid "Blocked Text for %s"
+msgstr "Estetty teksti käyttäjätilille %s"
+
+msgid "No text is blocked for this account."
+msgstr "Ei estettyä tekstiä tälle käyttäjätilille."
+
+#, c-format
+msgid ""
+"MSN servers are currently blocking the following regular expressions:<br/>%s"
+msgstr ""
+"MSN-palvelimet estävät tällä hetkellä seuraavat säännölliset lausekkeet:<br/>"
+"%s"
+
+msgid "This account does not have email enabled."
+msgstr "Tällä käyttäjätilillä ei ole käyttöön otettua sähköpostia."
+
 msgid "Send a mobile message."
 msgstr "Lähetä mobiiliviestinä"
 
-#: ../libpurple/protocols/msn/msn.c:416 ../libpurple/protocols/msnp9/msn.c:399
 msgid "Page"
 msgstr "Lähetä"
 
-#: ../libpurple/protocols/msn/msn.c:679 ../libpurple/protocols/msnp9/msn.c:567
 msgid "Home Phone Number"
 msgstr "Kotipuhelinnumero"
 
-#: ../libpurple/protocols/msn/msn.c:683 ../libpurple/protocols/msnp9/msn.c:571
 msgid "Work Phone Number"
 msgstr "Työpuhelinnumero"
 
-#: ../libpurple/protocols/msn/msn.c:687 ../libpurple/protocols/msnp9/msn.c:575
 msgid "Mobile Phone Number"
 msgstr "Matkapuhelinnumero"
 
-#: ../libpurple/protocols/msn/msn.c:710 ../libpurple/protocols/msn/state.c:33
-#: ../libpurple/protocols/msnp9/msn.c:594
-#: ../libpurple/protocols/msnp9/state.c:33
-#: ../libpurple/protocols/yahoo/yahoo.c:3134
-#: ../libpurple/protocols/yahoo/yahoo.c:3827
 msgid "Be Right Back"
 msgstr "Tulen pian takaisin"
 
-#: ../libpurple/protocols/msn/msn.c:716 ../libpurple/protocols/msn/state.c:31
-#: ../libpurple/protocols/msnp9/msn.c:598
-#: ../libpurple/protocols/msnp9/state.c:31
-#: ../libpurple/protocols/novell/novell.c:2840
-#: ../libpurple/protocols/novell/novell.c:2970
-#: ../libpurple/protocols/silc/buddy.c:1483
-#: ../libpurple/protocols/silc/silc.c:56
-#: ../libpurple/protocols/silc10/buddy.c:1483
-#: ../libpurple/protocols/silc10/silc.c:47
-#: ../libpurple/protocols/yahoo/yahoo.c:3136
-#: ../libpurple/protocols/yahoo/yahoo.c:3830
 msgid "Busy"
 msgstr "Varattu"
 
-#: ../libpurple/protocols/msn/msn.c:721 ../libpurple/protocols/msnp9/msn.c:602
-#: ../libpurple/protocols/yahoo/yahoo.c:3144
-#: ../libpurple/protocols/yahoo/yahoo.c:3842
 msgid "On the Phone"
 msgstr "Puhelimessa"
 
-#: ../libpurple/protocols/msn/msn.c:726 ../libpurple/protocols/msnp9/msn.c:606
-#: ../libpurple/protocols/yahoo/yahoo.c:3148
-#: ../libpurple/protocols/yahoo/yahoo.c:3848
 msgid "Out to Lunch"
 msgstr "Lounaalla"
 
@@ -7087,337 +4973,187 @@
 #. savable
 #. should be user_settable some day
 #. independent
-#: ../libpurple/protocols/msn/msn.c:745
-#: ../libpurple/protocols/myspace/myspace.c:170
 msgid "Artist"
 msgstr "Esittäjä"
 
-#: ../libpurple/protocols/msn/msn.c:746
 msgid "Album"
 msgstr "Levy"
 
-#: ../libpurple/protocols/msn/msn.c:764 ../libpurple/protocols/msnp9/msn.c:634
 msgid "Set Friendly Name..."
 msgstr "Aseta tuttavanimi..."
 
-#: ../libpurple/protocols/msn/msn.c:769 ../libpurple/protocols/msnp9/msn.c:639
 msgid "Set Home Phone Number..."
 msgstr "Aseta kotipuhelinnumero..."
 
-#: ../libpurple/protocols/msn/msn.c:773 ../libpurple/protocols/msnp9/msn.c:643
 msgid "Set Work Phone Number..."
 msgstr "Aseta työpuhelinnumero..."
 
-#: ../libpurple/protocols/msn/msn.c:777 ../libpurple/protocols/msnp9/msn.c:647
 msgid "Set Mobile Phone Number..."
 msgstr "Aseta matkapuhelinnumero..."
 
-#: ../libpurple/protocols/msn/msn.c:783 ../libpurple/protocols/msnp9/msn.c:653
 msgid "Enable/Disable Mobile Devices..."
 msgstr "Aseta päälle/pois mobiililaitteet..."
 
-#: ../libpurple/protocols/msn/msn.c:788 ../libpurple/protocols/msnp9/msn.c:658
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Salli/estä mobiilihaut..."
 
-#: ../libpurple/protocols/msn/msn.c:799 ../libpurple/protocols/msnp9/msn.c:669
+msgid "View Blocked Text..."
+msgstr "Näytä estetyt tekstit..."
+
 msgid "Open Hotmail Inbox"
 msgstr "Avaa Hotmailin saapuneet-kansio"
 
-#: ../libpurple/protocols/msn/msn.c:823 ../libpurple/protocols/msnp9/msn.c:693
 msgid "Send to Mobile"
 msgstr "Lähetä mobiililaitteeseen"
 
-#: ../libpurple/protocols/msn/msn.c:833 ../libpurple/protocols/msnp9/msn.c:703
-#: ../libpurple/protocols/novell/novell.c:3426
 msgid "Initiate _Chat"
 msgstr "Aloita _ryhmäkeskustelu"
 
-#: ../libpurple/protocols/msn/msn.c:871 ../libpurple/protocols/msnp9/msn.c:742
 msgid "SSL support is needed for MSN. Please install a supported SSL library."
 msgstr "MSN vaatii SSL-tuen. Asenna tuettu SSL-kirjasto."
 
-#: ../libpurple/protocols/msn/msn.c:901 ../libpurple/protocols/msnp9/msn.c:772
 msgid "Failed to connect to server."
 msgstr "Palvelimeen ei saatu yhteyttä."
 
-#: ../libpurple/protocols/msn/msn.c:1685 ../libpurple/protocols/msn/msn.c:2028
-#: ../libpurple/protocols/msnp9/msn.c:1526
-#: ../libpurple/protocols/msnp9/msn.c:1869
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:808
 msgid "Error retrieving profile"
 msgstr "Virhe haettaessa profiilia"
 
-#: ../libpurple/protocols/msn/msn.c:1751
-#: ../libpurple/protocols/msnp9/msn.c:1592 ../pidgin/plugins/convcolors.c:371
-#: ../pidgin/plugins/pidginrc.c:372
 msgid "General"
 msgstr "Yleinen"
 
-#: ../libpurple/protocols/msn/msn.c:1758
-#: ../libpurple/protocols/msnp9/msn.c:1599
-#: ../libpurple/protocols/myspace/user.c:125
-#: ../libpurple/protocols/oscar/oscar.c:3792
-#: ../libpurple/protocols/qq/buddy_info.c:45
-#: ../libpurple/protocols/qq/qq.c:222
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1088
 msgid "Age"
 msgstr "Ikä"
 
-#: ../libpurple/protocols/msn/msn.c:1760
-#: ../libpurple/protocols/msnp9/msn.c:1601
-#: ../libpurple/protocols/qq/buddy_info.c:51
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1103
 msgid "Occupation"
 msgstr "Ammatti"
 
-#: ../libpurple/protocols/msn/msn.c:1761
-#: ../libpurple/protocols/msnp9/msn.c:1602
-#: ../libpurple/protocols/myspace/user.c:133
-#: ../libpurple/protocols/novell/novell.c:1487
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1083
-#: ../libpurple/protocols/zephyr/zephyr.c:802
-#: ../libpurple/protocols/zephyr/zephyr.c:1175
 msgid "Location"
 msgstr "Sijainti"
 
-#: ../libpurple/protocols/msn/msn.c:1766 ../libpurple/protocols/msn/msn.c:1958
-#: ../libpurple/protocols/msn/msn.c:1964 ../libpurple/protocols/msn/msn.c:1971
-#: ../libpurple/protocols/msnp9/msn.c:1607
-#: ../libpurple/protocols/msnp9/msn.c:1799
-#: ../libpurple/protocols/msnp9/msn.c:1805
-#: ../libpurple/protocols/msnp9/msn.c:1812
 msgid "Hobbies and Interests"
 msgstr "Harrastukset"
 
-#: ../libpurple/protocols/msn/msn.c:1772 ../libpurple/protocols/msn/msn.c:1892
-#: ../libpurple/protocols/msn/msn.c:1898 ../libpurple/protocols/msn/msn.c:1905
-#: ../libpurple/protocols/msn/msn.c:1913 ../libpurple/protocols/msn/msn.c:1920
-#: ../libpurple/protocols/msnp9/msn.c:1613
-#: ../libpurple/protocols/msnp9/msn.c:1733
-#: ../libpurple/protocols/msnp9/msn.c:1739
-#: ../libpurple/protocols/msnp9/msn.c:1746
-#: ../libpurple/protocols/msnp9/msn.c:1754
-#: ../libpurple/protocols/msnp9/msn.c:1761
 msgid "A Little About Me"
 msgstr "Oma kuvaus"
 
-#: ../libpurple/protocols/msn/msn.c:1789
-#: ../libpurple/protocols/msnp9/msn.c:1630
 msgid "Social"
 msgstr "Vapaa-aika"
 
-#: ../libpurple/protocols/msn/msn.c:1791
-#: ../libpurple/protocols/msnp9/msn.c:1632
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1093
 msgid "Marital Status"
 msgstr "Siviilisääty"
 
-#: ../libpurple/protocols/msn/msn.c:1792
-#: ../libpurple/protocols/msnp9/msn.c:1633
 msgid "Interests"
 msgstr "Kiinnostukset"
 
-#: ../libpurple/protocols/msn/msn.c:1793
-#: ../libpurple/protocols/msnp9/msn.c:1634
 msgid "Pets"
 msgstr "Lemmikit"
 
-#: ../libpurple/protocols/msn/msn.c:1794
-#: ../libpurple/protocols/msnp9/msn.c:1635
 msgid "Hometown"
 msgstr "Kotikunta"
 
-#: ../libpurple/protocols/msn/msn.c:1795
-#: ../libpurple/protocols/msnp9/msn.c:1636
 msgid "Places Lived"
 msgstr "Asumispaikat"
 
-#: ../libpurple/protocols/msn/msn.c:1796
-#: ../libpurple/protocols/msnp9/msn.c:1637
 msgid "Fashion"
 msgstr "Tyyli"
 
-#: ../libpurple/protocols/msn/msn.c:1797
-#: ../libpurple/protocols/msnp9/msn.c:1638
 msgid "Humor"
 msgstr "Huumorintaju"
 
-#: ../libpurple/protocols/msn/msn.c:1798
-#: ../libpurple/protocols/msnp9/msn.c:1639
 msgid "Music"
 msgstr "Musiikki"
 
-#: ../libpurple/protocols/msn/msn.c:1799 ../libpurple/protocols/msn/msn.c:1980
-#: ../libpurple/protocols/msn/msn.c:1986
-#: ../libpurple/protocols/msnp9/msn.c:1640
-#: ../libpurple/protocols/msnp9/msn.c:1821
-#: ../libpurple/protocols/msnp9/msn.c:1827
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1145
 msgid "Favorite Quote"
 msgstr "Lempisanonta"
 
-#: ../libpurple/protocols/msn/msn.c:1816
-#: ../libpurple/protocols/msnp9/msn.c:1657
 msgid "Contact Info"
 msgstr "Yhteystiedot"
 
-#: ../libpurple/protocols/msn/msn.c:1817
-#: ../libpurple/protocols/msnp9/msn.c:1658
 msgid "Personal"
 msgstr "Koti"
 
-#: ../libpurple/protocols/msn/msn.c:1820
-#: ../libpurple/protocols/msnp9/msn.c:1661
 msgid "Significant Other"
 msgstr "Elämänkumppani"
 
-#: ../libpurple/protocols/msn/msn.c:1821
-#: ../libpurple/protocols/msnp9/msn.c:1662
 msgid "Home Phone"
 msgstr "Kotipuhelin"
 
-#: ../libpurple/protocols/msn/msn.c:1822
-#: ../libpurple/protocols/msnp9/msn.c:1663
 msgid "Home Phone 2"
 msgstr "Kotipuhelin 2"
 
-#: ../libpurple/protocols/msn/msn.c:1823
-#: ../libpurple/protocols/msnp9/msn.c:1664
-#: ../libpurple/protocols/oscar/oscar.c:3830
 msgid "Home Address"
 msgstr "Kotiosoite"
 
-#: ../libpurple/protocols/msn/msn.c:1824
-#: ../libpurple/protocols/msnp9/msn.c:1665
 msgid "Personal Mobile"
 msgstr "Oma matkapuhelin"
 
-#: ../libpurple/protocols/msn/msn.c:1825
-#: ../libpurple/protocols/msnp9/msn.c:1666
 msgid "Home Fax"
 msgstr "Kotifaksi"
 
-#: ../libpurple/protocols/msn/msn.c:1826
-#: ../libpurple/protocols/msnp9/msn.c:1667
 msgid "Personal Email"
 msgstr "Oma sähköposti"
 
-#: ../libpurple/protocols/msn/msn.c:1827
-#: ../libpurple/protocols/msnp9/msn.c:1668
 msgid "Personal IM"
 msgstr "Oma pikaviestin"
 
-#: ../libpurple/protocols/msn/msn.c:1829
-#: ../libpurple/protocols/msnp9/msn.c:1670
 msgid "Anniversary"
 msgstr "Vuosipäivä"
 
 #. Business
-#: ../libpurple/protocols/msn/msn.c:1845
-#: ../libpurple/protocols/msnp9/msn.c:1686
 msgid "Work"
 msgstr "Työ"
 
-#: ../libpurple/protocols/msn/msn.c:1847
-#: ../libpurple/protocols/msnp9/msn.c:1688
-#: ../libpurple/protocols/silc/ops.c:1024
-#: ../libpurple/protocols/silc10/ops.c:1044
 msgid "Job Title"
 msgstr "Tehtävänimike"
 
-#: ../libpurple/protocols/msn/msn.c:1848
-#: ../libpurple/protocols/msnp9/msn.c:1689
-#: ../libpurple/protocols/oscar/oscar.c:3851
 msgid "Company"
 msgstr "Yritys"
 
-#: ../libpurple/protocols/msn/msn.c:1849
-#: ../libpurple/protocols/msnp9/msn.c:1690
-#: ../libpurple/protocols/novell/novell.c:1489
 msgid "Department"
 msgstr "Osasto"
 
-#: ../libpurple/protocols/msn/msn.c:1850
-#: ../libpurple/protocols/msnp9/msn.c:1691
 msgid "Profession"
 msgstr "Ammatti"
 
-#: ../libpurple/protocols/msn/msn.c:1851
-#: ../libpurple/protocols/msnp9/msn.c:1692
 msgid "Work Phone"
 msgstr "Työpuhelin"
 
-#: ../libpurple/protocols/msn/msn.c:1852
-#: ../libpurple/protocols/msnp9/msn.c:1693
 msgid "Work Phone 2"
 msgstr "Työpuhelin 2"
 
-#: ../libpurple/protocols/msn/msn.c:1853
-#: ../libpurple/protocols/msnp9/msn.c:1694
-#: ../libpurple/protocols/oscar/oscar.c:3843
 msgid "Work Address"
 msgstr "Työosoite"
 
-#: ../libpurple/protocols/msn/msn.c:1854
-#: ../libpurple/protocols/msnp9/msn.c:1695
 msgid "Work Mobile"
 msgstr "Työmatkapuhelin"
 
-#: ../libpurple/protocols/msn/msn.c:1855
-#: ../libpurple/protocols/msnp9/msn.c:1696
 msgid "Work Pager"
 msgstr "Työhakulaite"
 
-#: ../libpurple/protocols/msn/msn.c:1856
-#: ../libpurple/protocols/msnp9/msn.c:1697
 msgid "Work Fax"
 msgstr "Työfaksi"
 
-#: ../libpurple/protocols/msn/msn.c:1857
-#: ../libpurple/protocols/msnp9/msn.c:1698
 msgid "Work Email"
 msgstr "Työsähköposti"
 
-#: ../libpurple/protocols/msn/msn.c:1858
-#: ../libpurple/protocols/msnp9/msn.c:1699
 msgid "Work IM"
 msgstr "Työ pikaviestin"
 
-#: ../libpurple/protocols/msn/msn.c:1859
-#: ../libpurple/protocols/msnp9/msn.c:1700
 msgid "Start Date"
 msgstr "Aloituspäivä"
 
-#: ../libpurple/protocols/msn/msn.c:1929 ../libpurple/protocols/msn/msn.c:1935
-#: ../libpurple/protocols/msn/msn.c:1942 ../libpurple/protocols/msn/msn.c:1949
-#: ../libpurple/protocols/msnp9/msn.c:1770
-#: ../libpurple/protocols/msnp9/msn.c:1776
-#: ../libpurple/protocols/msnp9/msn.c:1783
-#: ../libpurple/protocols/msnp9/msn.c:1790
 msgid "Favorite Things"
 msgstr "Lempiasiat"
 
-#: ../libpurple/protocols/msn/msn.c:1994
-#: ../libpurple/protocols/msnp9/msn.c:1835
 msgid "Last Updated"
 msgstr "Edellinen päivitys"
 
-#: ../libpurple/protocols/msn/msn.c:2005
-#: ../libpurple/protocols/msnp9/msn.c:1846
-#: ../libpurple/protocols/qq/buddy_info.c:60
-#: ../libpurple/protocols/silc/ops.c:1040
-#: ../libpurple/protocols/silc10/ops.c:1060
 msgid "Homepage"
 msgstr "Kotisivu"
 
-#: ../libpurple/protocols/msn/msn.c:2029
-#: ../libpurple/protocols/msnp9/msn.c:1870
 msgid "The user has not created a public profile."
 msgstr "Käyttäjällä ei ole julkista profiilia."
 
-#: ../libpurple/protocols/msn/msn.c:2030
-#: ../libpurple/protocols/msnp9/msn.c:1871
 msgid ""
 "MSN reported not being able to find the user's profile. This either means "
 "that the user does not exist, or that the user exists but has not created a "
@@ -7426,8 +5162,6 @@
 "MSN ilmoitti ettei käyttäjän profiilia löydy. Tämä tarkoittaa joko sitä että "
 "käyttäjää ei ole tai käyttäjä ei ole luonut julkista profiilia."
 
-#: ../libpurple/protocols/msn/msn.c:2034
-#: ../libpurple/protocols/msnp9/msn.c:1875
 msgid ""
 "Could not find any information in the user's profile. The user most likely "
 "does not exist."
@@ -7435,9 +5169,6 @@
 "Käyttäjän profiilista ei löytynyt mitään tietoja. Käyttäjää ei "
 "todennäköisesti ole olemassa."
 
-#: ../libpurple/protocols/msn/msn.c:2042
-#: ../libpurple/protocols/msnp9/msn.c:1883
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1247
 msgid "Profile URL"
 msgstr "Profiilin URL"
 
@@ -7451,130 +5182,81 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/msn/msn.c:2329 ../libpurple/protocols/msn/msn.c:2331
 msgid "Windows Live Messenger Protocol Plugin"
 msgstr "Windows Live Messenger -yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/msn/msn.c:2366
-#: ../libpurple/protocols/msnp9/msn.c:2206
 msgid "Use HTTP Method"
 msgstr "Käytä HTTP-yhteystapaa"
 
-#: ../libpurple/protocols/msn/msn.c:2371
-#: ../libpurple/protocols/msnp9/msn.c:2211
 msgid "HTTP Method Server"
 msgstr "HTTP-yhteystavan palvelin"
 
-#: ../libpurple/protocols/msn/msn.c:2376
-#: ../libpurple/protocols/msnp9/msn.c:2216
 msgid "Show custom smileys"
 msgstr "Näytä itse tehdyt / lisätyt hymiöt"
 
-#: ../libpurple/protocols/msn/msn.c:2384
-#: ../libpurple/protocols/msnp9/msn.c:2224
 msgid "nudge: nudge a user to get their attention"
 msgstr "nudge: tönäise tuttavaa huomion saamiseksi"
 
-#: ../libpurple/protocols/msn/nexus.c:71
 msgid "Windows Live ID authentication:Unable to connect"
-msgstr "Windows Live ID -tunnistautuminen: Yhdistäminen ei onnistu"
-
-#. we must have failed!
-#: ../libpurple/protocols/msn/nexus.c:124
-msgid ""
-"Windows Live ID authentication: cannot find authenticate token in server "
-"response"
-msgstr ""
-"Windows Live ID -tunnistautuminen: palvelinvastauksesta ei löydy "
-"todentamispolettia"
-
-#: ../libpurple/protocols/msn/nexus.c:171
-msgid "Windows Live ID authentication Failed"
-msgstr "Windows Live ID -tunnistautuminen epäonnistui"
-
-#: ../libpurple/protocols/msn/notification.c:185
-#: ../libpurple/protocols/msnp9/notification.c:178
+msgstr "Windows Live ID -tunnistautuminen:Yhdistäminen ei onnistu"
+
+msgid "Windows Live ID authentication:Invalid response"
+msgstr "Windows Live ID -tunnistautuminen:Virheellinen vastaus"
+
 #, c-format
 msgid "%s is not a valid group."
 msgstr "%s ei ole kelvollinen ryhmä."
 
-#: ../libpurple/protocols/msn/notification.c:191
-#: ../libpurple/protocols/msn/notification.c:935
-#: ../libpurple/protocols/msn/session.c:387
-#: ../libpurple/protocols/msnp9/notification.c:184
-#: ../libpurple/protocols/msnp9/notification.c:534
-#: ../libpurple/protocols/msnp9/session.c:339
 msgid "Unknown error."
 msgstr "Tuntematon virhe."
 
-#: ../libpurple/protocols/msn/notification.c:194
-#: ../libpurple/protocols/msnp9/notification.c:187
 #, c-format
 msgid "%s on %s (%s)"
 msgstr "%s tilillä %s (%s)"
 
-#: ../libpurple/protocols/msn/notification.c:513
 #, c-format
 msgid "%s just sent you a Nudge!"
 msgstr "Käyttäjä %s lähetti sinulle juuri tönäisyn!"
 
-#: ../libpurple/protocols/msn/notification.c:840
 #, c-format
 msgid "Unknown error (%d)"
 msgstr "Tuntematon virhe (%d)"
 
-#: ../libpurple/protocols/msn/notification.c:841
-#: ../libpurple/protocols/sametime/sametime.c:4481
 msgid "Unable to add user"
 msgstr "Käyttäjää ei voi lisätä"
 
-#: ../libpurple/protocols/msn/notification.c:901
-#: ../libpurple/protocols/msnp9/notification.c:500
 #, c-format
 msgid "Unable to add user on %s (%s)"
 msgstr "Käyttäjää ei voi lisätä %s (%s)"
 
-#: ../libpurple/protocols/msn/notification.c:905
-#: ../libpurple/protocols/msnp9/notification.c:504
 #, c-format
 msgid "Unable to block user on %s (%s)"
 msgstr "Ei voi estää käyttäjää %s (%s)"
 
-#: ../libpurple/protocols/msn/notification.c:909
-#: ../libpurple/protocols/msnp9/notification.c:508
 #, c-format
 msgid "Unable to permit user on %s (%s)"
 msgstr "Käyttäjää ei voi sallia %s (%s)"
 
-#: ../libpurple/protocols/msn/notification.c:917
-#: ../libpurple/protocols/msnp9/notification.c:516
 #, c-format
 msgid "%s could not be added because your buddy list is full."
 msgstr "Käyttäjää %s ei voi lisätä koska tuttavia on liikaa."
 
-#: ../libpurple/protocols/msn/notification.c:926
-#: ../libpurple/protocols/msnp9/notification.c:525
 #, c-format
 msgid "%s is not a valid passport account."
 msgstr "%s ei ole kelvollinen passport-tili"
 
-#: ../libpurple/protocols/msn/notification.c:931
-#: ../libpurple/protocols/msnp9/notification.c:530
 msgid "Service Temporarily Unavailable."
 msgstr "Palvelu ei tilapäisesti ole käytettävissä."
 
-#: ../libpurple/protocols/msn/notification.c:1336
-#: ../libpurple/protocols/msnp9/notification.c:898
+msgid "Mobile message was not sent because it was too long."
+msgstr "Mobiiliviestiä ei lähetetty, koska se on liian pitkä."
+
 msgid "Unable to rename group"
 msgstr "Ryhmän uudelleen nimeäminen epäonnistui"
 
-#: ../libpurple/protocols/msn/notification.c:1391
-#: ../libpurple/protocols/msnp9/notification.c:953
 msgid "Unable to delete group"
 msgstr "Ryhmää ei voi poistaa"
 
-#: ../libpurple/protocols/msn/notification.c:2008
-#: ../libpurple/protocols/msnp9/notification.c:1372
 #, c-format
 msgid ""
 "The MSN server will shut down for maintenance in %d minute. You will "
@@ -7603,40 +5285,31 @@
 "\n"
 "Kun huolto on suoritettu voit taas kirjautua palveluun."
 
-#: ../libpurple/protocols/msn/servconn.c:135
-#: ../libpurple/protocols/msnp9/nexus.c:146
-#: ../libpurple/protocols/msnp9/servconn.c:133
-#: ../libpurple/protocols/qq/qq_proxy.c:242
-#: ../libpurple/protocols/qq/qq_proxy.c:324
-#: ../libpurple/protocols/qq/qq_proxy.c:369
-#: ../libpurple/protocols/qq/qq_proxy.c:402
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:64
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:167
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:191
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:204
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:233
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:247
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:272
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:307
-#: ../libpurple/protocols/qq/udp_proxy_s5.c:338
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:1565
-#: ../libpurple/protocols/yahoo/yahoochat.c:1425
-#: ../libpurple/protocols/yahoo/yahoochat.c:1451
+msgid ""
+"Message was not sent because the system is unavailable. This normally "
+"happens when the user is blocked or does not exist."
+msgstr ""
+"Viestiä ei voi lähettää koska järjestelmä ei ole saatavilla. Tämä tapahtuu "
+"yleensä jos käyttäjä on estetty tai ei olemassa."
+
+msgid "Message was not sent because messages are being sent too quickly."
+msgstr "Viestiä ei voi lähettää koska viestejä lähetetään liian nopeasti."
+
+msgid "Message was not sent because an unknown encoding error occurred."
+msgstr "Viestiä ei voi lähettää tuntemattoman koodausvirheen vuoksi."
+
+msgid "Message was not sent because an unknown error occurred."
+msgstr "Viestiä ei voi lähettää tuntemattoman virheen vuoksi."
+
 msgid "Unable to connect"
 msgstr "Yhteyden muodostaminen epäonnistui"
 
-#: ../libpurple/protocols/msn/servconn.c:137
-#: ../libpurple/protocols/msnp9/servconn.c:135
 msgid "Writing error"
 msgstr "Virhe kirjoitettaessa"
 
-#: ../libpurple/protocols/msn/servconn.c:139
-#: ../libpurple/protocols/msnp9/servconn.c:137
 msgid "Reading error"
 msgstr "Virhe luettaessa"
 
-#: ../libpurple/protocols/msn/servconn.c:146
-#: ../libpurple/protocols/msnp9/servconn.c:144
 #, c-format
 msgid ""
 "Connection error from %s server:\n"
@@ -7645,121 +5318,73 @@
 "Yhteysvirhe palvelimelta %s:\n"
 "%s"
 
-#: ../libpurple/protocols/msn/session.c:349
-#: ../libpurple/protocols/msnp9/session.c:301
 msgid "Our protocol is not supported by the server."
 msgstr "Palvelin ei tue yhteyskäytäntöä."
 
-#: ../libpurple/protocols/msn/session.c:354
-#: ../libpurple/protocols/msnp9/session.c:306
 msgid "Error parsing HTTP."
 msgstr "Virhe jäsennettäessä HTTP:tä."
 
-#: ../libpurple/protocols/msn/session.c:358
-#: ../libpurple/protocols/msnp9/session.c:310
-#: ../libpurple/protocols/oscar/flap_connection.c:392
-#: ../libpurple/protocols/yahoo/yahoo.c:155
 msgid "You have signed on from another location."
 msgstr "Olet kirjautunut sisään toisesta paikasta."
 
-#: ../libpurple/protocols/msn/session.c:364
-#: ../libpurple/protocols/msnp9/session.c:316
 msgid "The MSN servers are temporarily unavailable. Please wait and try again."
 msgstr ""
 "MSN-palvelimet ovat väliaikaisesti tavoittamattomissa. Odota ja yritä "
 "uudelleen."
 
-#: ../libpurple/protocols/msn/session.c:370
-#: ../libpurple/protocols/msnp9/session.c:322
 msgid "The MSN servers are going down temporarily."
 msgstr "MSN-palvelimet ajetaan alas väliaikaisesti."
 
-#: ../libpurple/protocols/msn/session.c:375
-#: ../libpurple/protocols/msnp9/session.c:327
 #, c-format
 msgid "Unable to authenticate: %s"
 msgstr "Tunnistautuminen ei onnistu: %s"
 
-#: ../libpurple/protocols/msn/session.c:381
-#: ../libpurple/protocols/msnp9/session.c:333
 msgid ""
 "Your MSN buddy list is temporarily unavailable. Please wait and try again."
 msgstr "MSN-tuttavia ei väliaikaisesti voi hakea. Yritä myöhemmin uudelleen."
 
-#: ../libpurple/protocols/msn/session.c:403
-#: ../libpurple/protocols/msn/session.c:405
-#: ../libpurple/protocols/msnp9/session.c:355
-#: ../libpurple/protocols/msnp9/session.c:357
 msgid "Handshaking"
 msgstr "Kättely"
 
-#: ../libpurple/protocols/msn/session.c:404
-#: ../libpurple/protocols/msnp9/session.c:356
 msgid "Transferring"
 msgstr "Siirtää"
 
-#: ../libpurple/protocols/msn/session.c:406
-#: ../libpurple/protocols/msnp9/session.c:358
 msgid "Starting authentication"
 msgstr "Aloitetaan tunnistautumista"
 
-#: ../libpurple/protocols/msn/session.c:407
-#: ../libpurple/protocols/msnp9/session.c:359
 msgid "Getting cookie"
 msgstr "Haetaan evästettä"
 
-#: ../libpurple/protocols/msn/session.c:409
-#: ../libpurple/protocols/msnp9/session.c:361
 msgid "Sending cookie"
 msgstr "Lähetetään evästettä"
 
-#: ../libpurple/protocols/msn/session.c:410
-#: ../libpurple/protocols/msnp9/session.c:362
 msgid "Retrieving buddy list"
 msgstr "Noudetaan tuttavia"
 
-#: ../libpurple/protocols/msn/state.c:34
-#: ../libpurple/protocols/msnp9/state.c:34
 msgid "Away From Computer"
 msgstr "Poissa tietokoneelta"
 
-#: ../libpurple/protocols/msn/state.c:35
-#: ../libpurple/protocols/msnp9/state.c:35
 msgid "On The Phone"
 msgstr "Puhelimessa"
 
-#: ../libpurple/protocols/msn/state.c:36
-#: ../libpurple/protocols/msnp9/state.c:36
 msgid "Out To Lunch"
 msgstr "Lounaalla"
 
-#: ../libpurple/protocols/msn/switchboard.c:406
-#: ../libpurple/protocols/msnp9/switchboard.c:411
 msgid "Message may have not been sent because a timeout occurred:"
 msgstr "Viestiä ei välttämättä lähetetty koska tapahtui aikakatkaisu:"
 
-#: ../libpurple/protocols/msn/switchboard.c:414
-#: ../libpurple/protocols/msnp9/switchboard.c:419
 msgid "Message could not be sent, not allowed while invisible:"
 msgstr "Viestien lähetys ei ole sallittu näkymättömänä:"
 
-#: ../libpurple/protocols/msn/switchboard.c:418
-#: ../libpurple/protocols/msnp9/switchboard.c:423
 msgid "Message could not be sent because the user is offline:"
 msgstr "Viestiä ei voi lähettää koska käyttäjä on poissa linjoilta:"
 
-#: ../libpurple/protocols/msn/switchboard.c:422
-#: ../libpurple/protocols/msnp9/switchboard.c:427
 msgid "Message could not be sent because a connection error occurred:"
 msgstr "Viestiä ei voi lähettää yhteysvirheen vuoksi:"
 
-#: ../libpurple/protocols/msn/switchboard.c:426
-#: ../libpurple/protocols/msnp9/switchboard.c:431
 msgid "Message could not be sent because we are sending too quickly:"
 msgstr "Viestiä ei voi lähettää koska viestejä lähetetään liian nopeasti:"
 
-#: ../libpurple/protocols/msn/switchboard.c:430
-#: ../libpurple/protocols/msnp9/switchboard.c:435
 msgid ""
 "Message could not be sent because we were unable to establish a session with "
 "the server. This is likely a server problem, try again in a few minutes:"
@@ -7768,26 +5393,18 @@
 "Tämä on luultavasti ongelma palvelimella, yritä uudelleen muutaman minuutin "
 "päästä:"
 
-#: ../libpurple/protocols/msn/switchboard.c:437
-#: ../libpurple/protocols/msnp9/switchboard.c:442
 msgid ""
 "Message could not be sent because an error with the switchboard occurred:"
 msgstr ""
 "Viestiä ei voi lähettää kytkentäpalvelimen kanssa tapahtuneen virheen vuoksi:"
 
-#: ../libpurple/protocols/msn/switchboard.c:445
-#: ../libpurple/protocols/msnp9/switchboard.c:450
 msgid "Message may have not been sent because an unknown error occurred:"
 msgstr "Viestiä ei voi lähettää tuntemattoman virheen vuoksi:"
 
-#: ../libpurple/protocols/msn/userlist.c:243
-#: ../libpurple/protocols/msnp9/userlist.c:262
 #, c-format
 msgid "%s has added you to his or her buddy list."
 msgstr "Käyttäjä %s on lisännyt sinut tuttaviinsa."
 
-#: ../libpurple/protocols/msn/userlist.c:312
-#: ../libpurple/protocols/msnp9/userlist.c:331
 #, c-format
 msgid "%s has removed you from his or her buddy list."
 msgstr "%s on poistanut sinut tuttavistaan."
@@ -7795,18 +5412,16 @@
 #. only notify the user about problems adding to the friends list
 #. * maybe we should do something else for other lists, but it probably
 #. * won't cause too many problems if we just ignore it
-#: ../libpurple/protocols/msn/userlist.c:713
-#: ../libpurple/protocols/msnp9/userlist.c:653
 #, c-format
 msgid "Unable to add \"%s\"."
 msgstr "Ei voi lisätä \"%s\"."
 
-#: ../libpurple/protocols/msn/userlist.c:716
-#: ../libpurple/protocols/msnp9/userlist.c:655
 msgid "The username specified is invalid."
 msgstr "Syötetty käyttäjänimi on virheellinen."
 
-#: ../libpurple/protocols/msnp9/msn.c:546
+msgid "This Hotmail account may not be active."
+msgstr "Tämä Hotmail-tili ei välttämättä ole aktiivinen."
+
 msgid "Has you"
 msgstr "Olet hänen listallaan"
 
@@ -7820,20 +5435,15 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/msnp9/msn.c:2170
-#: ../libpurple/protocols/msnp9/msn.c:2172
 msgid "MSN Protocol Plugin"
 msgstr "MSN-yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/myspace/myspace.c:111
 msgid "Missing Cipher"
 msgstr "Salaus puuttuu"
 
-#: ../libpurple/protocols/myspace/myspace.c:112
 msgid "The RC4 cipher could not be found"
 msgstr "RC4-salausta ei löydetty"
 
-#: ../libpurple/protocols/myspace/myspace.c:113
 msgid ""
 "Upgrade to a libpurple with RC4 support (>= 2.0.1). MySpaceIM plugin will "
 "not be loaded."
@@ -7841,74 +5451,59 @@
 "Päivitä libpurpleen jossa RC4-tuki (>= 2.0.1). MySpaceIM-liitännäistä ei "
 "ladattu."
 
-#: ../libpurple/protocols/myspace/myspace.c:345
 msgid "Reading challenge"
 msgstr "Luetaan tunnistushaastetta"
 
-#: ../libpurple/protocols/myspace/myspace.c:355
 msgid "Unexpected challenge length from server"
 msgstr "Odottamaton tunnistushaasteen pituus palvelimelta"
 
-#: ../libpurple/protocols/myspace/myspace.c:359
 msgid "Logging in"
 msgstr "Kirjaudutaan sisään"
 
-#: ../libpurple/protocols/myspace/myspace.c:1331
-#, c-format
-msgid "Connection to server lost (no data received within %d seconds)"
-msgstr "Yhteys palvelimelle katkesi (dataa ei vastaanotettu %d sekunnissa)"
+#, c-format
+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] "Yhteys palvelimelle katkesi (dataa ei vastaanotettu %d sekunnissa)"
+msgstr[1] "Yhteys palvelimelle katkesi (dataa ei vastaanotettu %d sekunnissa)"
 
 #. Can't write _()'d strings in array initializers. Workaround.
-#: ../libpurple/protocols/myspace/myspace.c:1374
 msgid "New mail messages"
 msgstr "Uusia viestejä postilaatikossa"
 
-#: ../libpurple/protocols/myspace/myspace.c:1375
 msgid "New blog comments"
 msgstr "Uusia blogikommentteja"
 
-#: ../libpurple/protocols/myspace/myspace.c:1376
 msgid "New profile comments"
 msgstr "Uusia profiilikommentteja"
 
-#: ../libpurple/protocols/myspace/myspace.c:1377
 msgid "New friend requests!"
 msgstr "Uusia kaveripyyntöjä."
 
-#: ../libpurple/protocols/myspace/myspace.c:1378
 msgid "New picture comments"
 msgstr "Uusia kuvakommentteja"
 
-#: ../libpurple/protocols/myspace/myspace.c:1408
 msgid "MySpace"
 msgstr "MySpace"
 
-#: ../libpurple/protocols/myspace/myspace.c:1594
 msgid "MySpaceIM - No Username Set"
 msgstr "MySpaceIM - Käyttäjänimeä ei asetettu"
 
-#: ../libpurple/protocols/myspace/myspace.c:1595
 msgid "You appear to have no MySpace username."
 msgstr "Sinulla ei näytä olevan MySpace-käyttäjänimeä."
 
-#: ../libpurple/protocols/myspace/myspace.c:1596
 msgid "Would you like to set one now? (Note: THIS CANNOT BE CHANGED!)"
 msgstr "Haluatko asettaa sen nyt? (Huom: TÄTÄ EI VOI MUUTTAA)"
 
 #. The session is now set up, ready to be connected. This emits the
 #. * signedOn signal, so clients can now do anything with msimprpl, and
 #. * we're ready for it (session key, userid, username all setup).
-#: ../libpurple/protocols/myspace/myspace.c:1620
-#: ../libpurple/protocols/sametime/sametime.c:1548
 msgid "Connected"
 msgstr "Yhdistetty"
 
-#: ../libpurple/protocols/myspace/myspace.c:1855
 #, c-format
 msgid "Protocol error, code %d: %s"
 msgstr "Yhteyskäytäntövirhe, virhekoodi %d: %s"
 
-#: ../libpurple/protocols/myspace/myspace.c:1877
 #, c-format
 msgid ""
 "%s Your password is %d characters, greater than the expected maximum length "
@@ -7921,189 +5516,144 @@
 "profileedit.myspace.com/index.cfm?fuseaction=accountSettings.changePassword "
 "ja yritä uudelleen."
 
-#: ../libpurple/protocols/myspace/myspace.c:1900
 msgid "MySpaceIM Error"
 msgstr "MySpaceIM-virhe"
 
-#: ../libpurple/protocols/myspace/myspace.c:2078
-#: ../libpurple/protocols/myspace/myspace.c:2112
 msgid "Failed to add buddy"
 msgstr "Tuttavan lisääminen epäonnistui"
 
-#: ../libpurple/protocols/myspace/myspace.c:2078
 msgid "'addbuddy' command failed."
 msgstr "\"addbuddy\"-komento epäonnistui."
 
-#: ../libpurple/protocols/myspace/myspace.c:2112
-#: ../libpurple/protocols/myspace/myspace.c:2357
 msgid "persist command failed"
 msgstr "persist-komento epäonnistui"
 
-#: ../libpurple/protocols/myspace/myspace.c:2217
 #, c-format
 msgid "No such user: %s"
 msgstr "Käyttäjää ei löydy: %s"
 
-#: ../libpurple/protocols/myspace/myspace.c:2219
 msgid "User lookup"
 msgstr "Käyttäjän haku"
 
-#: ../libpurple/protocols/myspace/myspace.c:2338
-#: ../libpurple/protocols/myspace/myspace.c:2357
-#: ../libpurple/protocols/myspace/myspace.c:2379
 msgid "Failed to remove buddy"
 msgstr "Tuttavaa poistaminen epäonnistui"
 
-#: ../libpurple/protocols/myspace/myspace.c:2338
 msgid "'delbuddy' command failed"
 msgstr "\"delbuddy\"-komento epäonnistui"
 
-#: ../libpurple/protocols/myspace/myspace.c:2379
 msgid "blocklist command failed"
 msgstr "blocklist-komento epäonnistui"
 
-#: ../libpurple/protocols/myspace/myspace.c:2493
 msgid "Invalid input condition"
 msgstr "Epäkelpo syötetila"
 
-#: ../libpurple/protocols/myspace/myspace.c:2548
 msgid "Read buffer full (2)"
 msgstr "Lukupuskuri täynnä (2)"
 
-#: ../libpurple/protocols/myspace/myspace.c:2591
 msgid "Unparseable message"
 msgstr "Viestin jäsennys epäonnistui"
 
-#: ../libpurple/protocols/myspace/myspace.c:2662
 #, c-format
 msgid "Couldn't connect to host: %s (%d)"
 msgstr "Yhteyttä isäntään ei voi muodostaa: %s (%d)"
 
-#: ../libpurple/protocols/myspace/myspace.c:2840
 msgid "IM Friends"
 msgstr "Pikaviestikaverit"
 
-#: ../libpurple/protocols/myspace/myspace.c:2940
-#, c-format
-msgid ""
+#, c-format
+msgid ""
+"%d buddy was added or updated from the server (including buddies already on "
+"the server-side list)"
+msgid_plural ""
 "%d buddies were added or updated from the server (including buddies already "
 "on the server-side list)"
-msgstr ""
+msgstr[0] ""
+"%d tuttava lisättiin tai päivitettiin palvelimelta (mukaan lukien jo "
+"palvelinpuolen luettelossa olevat)"
+msgstr[1] ""
 "%d tuttavaa lisättiin tai päivitettiin palvelimelta (mukaan lukien jo "
 "palvelinpuolen luettelossa olevat)"
 
-#: ../libpurple/protocols/myspace/myspace.c:2941
 msgid "Add contacts from server"
 msgstr "Lisää tuttavia palvelimelta"
 
-#: ../libpurple/protocols/myspace/myspace.c:2993
-#: ../libpurple/protocols/myspace/myspace.c:3057
 msgid "Add friends from MySpace.com"
 msgstr "Lisää kavereita MySpacesta"
 
-#: ../libpurple/protocols/myspace/myspace.c:2994
 msgid "Importing friends failed"
 msgstr "Kavereiden tuonti epäonnistui"
 
 #. TODO: find out how
-#: ../libpurple/protocols/myspace/myspace.c:3050
 msgid "Find people..."
 msgstr "Etsi ihmisiä..."
 
-#: ../libpurple/protocols/myspace/myspace.c:3053
 msgid "Change IM name..."
 msgstr "Vaihda pikaviestinnimeä..."
 
-#: ../libpurple/protocols/myspace/myspace.c:3354
 msgid "myim URL handler"
 msgstr "myim-URL-käsittelijä"
 
-#: ../libpurple/protocols/myspace/myspace.c:3355
 msgid "No suitable MySpaceIM account could be found to open this myim URL."
 msgstr "Tämän myim-osoitteen avaamiseen sopivaa MySpaceIM-tiliä ei löytynyt."
 
-#: ../libpurple/protocols/myspace/myspace.c:3356
 msgid "Enable the proper MySpaceIM account and try again."
 msgstr "Ota sopiva MySpaceIM-käyttäjätili käyttöön ja yritä uudelleen."
 
-#: ../libpurple/protocols/myspace/myspace.c:3479
 msgid "Show display name in status text"
 msgstr "Näytä näyttönimi tilatekstissä"
 
-#: ../libpurple/protocols/myspace/myspace.c:3482
 msgid "Show headline in status text"
 msgstr "Näytä otsikko tilatekstissä"
 
-#: ../libpurple/protocols/myspace/myspace.c:3487
 msgid "Send emoticons"
 msgstr "Lähetä hymiöitä"
 
-#: ../libpurple/protocols/myspace/myspace.c:3492
 msgid "Screen resolution (dots per inch)"
 msgstr "Näytön tarkkuus (pisteitä tuumalla)"
 
-#: ../libpurple/protocols/myspace/myspace.c:3495
 msgid "Base font size (points)"
 msgstr "Peruskirjasinkoko (pisteinä)"
 
-#: ../libpurple/protocols/myspace/user.c:105
-#: ../libpurple/protocols/zephyr/zephyr.c:790
-#: ../libpurple/protocols/zephyr/zephyr.c:1164
 msgid "User"
 msgstr "Käyttäjä"
 
-#: ../libpurple/protocols/myspace/user.c:115
-#: ../libpurple/protocols/oscar/oscar.c:3018
 msgid "Profile"
 msgstr "Profiili"
 
-#: ../libpurple/protocols/myspace/user.c:138
 msgid "Headline"
 msgstr "Otsikko"
 
-#: ../libpurple/protocols/myspace/user.c:153
 msgid "Song"
 msgstr "Kappale"
 
-#: ../libpurple/protocols/myspace/user.c:162
 msgid "Total Friends"
 msgstr "Kavereita yhteensä"
 
-#: ../libpurple/protocols/myspace/user.c:180
 msgid "Client Version"
 msgstr "Asiakasohjelman versio"
 
 #. Protocol won't log in now without a username set.. Disconnect
-#: ../libpurple/protocols/myspace/user.c:570
 msgid "No username set"
 msgstr "Käyttäjänimeä ei asetettu"
 
-#: ../libpurple/protocols/myspace/user.c:577
-#: ../libpurple/protocols/myspace/user.c:671
 msgid "MySpaceIM - Please Set a Username"
 msgstr "MySpaceIM - Aseta käyttäjänimi"
 
-#: ../libpurple/protocols/myspace/user.c:578
 msgid "Please enter a username to check its availability:"
 msgstr "Syötä käyttäjänimi tarkistaaksesi sen saatavuus:"
 
-#: ../libpurple/protocols/myspace/user.c:658
 msgid "MySpaceIM - Username Available"
 msgstr "MySpaceIM - Käyttäjänimi saatavilla"
 
-#: ../libpurple/protocols/myspace/user.c:659
 msgid "This username is available. Would you like to set it?"
 msgstr "Tämä käyttäjänimi on saatavilla. Haluatko ottaa sen käyttöön?"
 
-#: ../libpurple/protocols/myspace/user.c:660
 msgid "ONCE SET, THIS CANNOT BE CHANGED!"
 msgstr "KUN TÄMÄ ON KERRAN ASETETTU, SITÄ EI VOI MUUTTAA"
 
-#: ../libpurple/protocols/myspace/user.c:672
 msgid "This username is unavailable."
 msgstr "Tämä käyttäjänimi ei ole saatavilla."
 
-#: ../libpurple/protocols/myspace/user.c:673
 msgid "Please try another username:"
 msgstr "Yritä toista käyttäjänimeä:"
 
@@ -8113,32 +5663,25 @@
 #. * projectile or weapon."  This term often has an electrical
 #. * connotation, for example, "he was zapped by electricity when
 #. * he put a fork in the toaster."
-#: ../libpurple/protocols/myspace/zap.c:48
-#: ../libpurple/protocols/myspace/zap.c:221
 msgid "Zap"
 msgstr "Läimäise"
 
-#: ../libpurple/protocols/myspace/zap.c:48
 #, c-format
 msgid "%s has zapped you!"
 msgstr "%s läimäisi sinua."
 
-#: ../libpurple/protocols/myspace/zap.c:49
 #, c-format
 msgid "Zapping %s..."
 msgstr "Läimäise tuttavaa %s..."
 
 #. Whack means "to hit or strike someone with a sharp blow"
-#: ../libpurple/protocols/myspace/zap.c:52
 msgid "Whack"
 msgstr "Mätkäytä"
 
-#: ../libpurple/protocols/myspace/zap.c:53
 #, c-format
 msgid "%s has whacked you!"
 msgstr "%s mätkäisi sinua."
 
-#: ../libpurple/protocols/myspace/zap.c:53
 #, c-format
 msgid "Whacking %s..."
 msgstr "Mätkäistään tuttavaa %s..."
@@ -8146,76 +5689,61 @@
 #. Torch means "to set on fire."  Don't worry, this doesn't
 #. * make a whole lot of sense in English, either.  Feel free
 #. * to translate it literally.
-#: ../libpurple/protocols/myspace/zap.c:58
 msgid "Torch"
 msgstr "Liekitä"
 
-#: ../libpurple/protocols/myspace/zap.c:59
 #, c-format
 msgid "%s has torched you!"
 msgstr "%s liekitti sinua."
 
-#: ../libpurple/protocols/myspace/zap.c:59
 #, c-format
 msgid "Torching %s..."
 msgstr "Liekitetään tuttavaa %s..."
 
 #. Smooch means "to kiss someone, often enthusiastically"
-#: ../libpurple/protocols/myspace/zap.c:62
 msgid "Smooch"
 msgstr "Syleile"
 
-#: ../libpurple/protocols/myspace/zap.c:63
 #, c-format
 msgid "%s has smooched you!"
 msgstr "%s syleili sinua."
 
-#: ../libpurple/protocols/myspace/zap.c:63
 #, c-format
 msgid "Smooching %s..."
 msgstr "Syleillään tuttavaa %s..."
 
 #. A hug is a display of affection; wrapping your arms around someone
-#: ../libpurple/protocols/myspace/zap.c:66
 msgid "Hug"
 msgstr "Halaa"
 
-#: ../libpurple/protocols/myspace/zap.c:66
 #, c-format
 msgid "%s has hugged you!"
 msgstr "%s halasi sinua."
 
-#: ../libpurple/protocols/myspace/zap.c:67
 #, c-format
 msgid "Hugging %s..."
 msgstr "Halataan tuttavaa %s..."
 
 #. Slap means "to hit someone with an open/flat hand"
-#: ../libpurple/protocols/myspace/zap.c:70
 msgid "Slap"
 msgstr "Läpäytä"
 
-#: ../libpurple/protocols/myspace/zap.c:71
 #, c-format
 msgid "%s has slapped you!"
 msgstr "%s läpäytti sinua."
 
-#: ../libpurple/protocols/myspace/zap.c:71
 #, c-format
 msgid "Slapping %s..."
 msgstr "Läpäytetään tuttavaa %s..."
 
 #. Goose means "to pinch someone on their butt"
-#: ../libpurple/protocols/myspace/zap.c:74
 msgid "Goose"
 msgstr "Purista"
 
-#: ../libpurple/protocols/myspace/zap.c:75
 #, c-format
 msgid "%s has goosed you!"
 msgstr "%s puristi sinua."
 
-#: ../libpurple/protocols/myspace/zap.c:75
 #, c-format
 msgid "Goosing %s..."
 msgstr "Puristetaan tuttavaa %s..."
@@ -8223,16 +5751,13 @@
 #. A high-five is when two people's hands slap each other
 #. * in the air above their heads.  It is done to celebrate
 #. * something, often a victory, or to congratulate someone.
-#: ../libpurple/protocols/myspace/zap.c:80
 msgid "High-five"
 msgstr "Yläfemmaa"
 
-#: ../libpurple/protocols/myspace/zap.c:81
 #, c-format
 msgid "%s has high-fived you!"
 msgstr "%s yläfemmasi sinulle."
 
-#: ../libpurple/protocols/myspace/zap.c:81
 #, c-format
 msgid "High-fiving %s..."
 msgstr "Yläfemmataan tuttavalle %s..."
@@ -8240,16 +5765,13 @@
 #. We're not entirely sure what the MySpace people mean by
 #. * this... but we think it's the equivalent of "prank."  Or, for
 #. * someone to perform a mischievous trick or practical joke.
-#: ../libpurple/protocols/myspace/zap.c:86
 msgid "Punk"
 msgstr "Kujeile"
 
-#: ../libpurple/protocols/myspace/zap.c:87
 #, c-format
 msgid "%s has punk'd you!"
 msgstr "%s kujeili sinulle."
 
-#: ../libpurple/protocols/myspace/zap.c:87
 #, c-format
 msgid "Punking %s..."
 msgstr "Kujeillaan tuttavalle %s..."
@@ -8261,101 +5783,77 @@
 #. * gesture, so it does not carry a harsh negative
 #. * connotation.  It is generally used in a playful tone
 #. * with friends.
-#: ../libpurple/protocols/myspace/zap.c:96
 msgid "Raspberry"
 msgstr "Rutise"
 
-#: ../libpurple/protocols/myspace/zap.c:97
 #, c-format
 msgid "%s has raspberried you!"
 msgstr "%s rutisi nenäsi edessä."
 
-#: ../libpurple/protocols/myspace/zap.c:97
 #, c-format
 msgid "Raspberrying %s..."
 msgstr "Rutistaan tuttavalle %s..."
 
-#: ../libpurple/protocols/novell/nmuser.c:1864
 msgid "Required parameters not passed in"
 msgstr "Vaadittuja parametreja ei syötetty"
 
-#: ../libpurple/protocols/novell/nmuser.c:1867
 msgid "Unable to write to network"
 msgstr "Verkkoon ei voi kirjoittaa"
 
-#: ../libpurple/protocols/novell/nmuser.c:1870
 msgid "Unable to read from network"
 msgstr "Verkosta ei voi lukea"
 
-#: ../libpurple/protocols/novell/nmuser.c:1873
 msgid "Error communicating with server"
 msgstr "Virhe kommunikoitaessa palvelimelle"
 
-#: ../libpurple/protocols/novell/nmuser.c:1877
 msgid "Conference not found"
 msgstr "Konferenssia ei löydy"
 
-#: ../libpurple/protocols/novell/nmuser.c:1880
 msgid "Conference does not exist"
 msgstr "Konferenssia ei ole"
 
-#: ../libpurple/protocols/novell/nmuser.c:1884
 msgid "A folder with that name already exists"
 msgstr "Valitun niminen kansio on jo olemassa"
 
-#: ../libpurple/protocols/novell/nmuser.c:1887
 msgid "Not supported"
 msgstr "Ei tueta"
 
-#: ../libpurple/protocols/novell/nmuser.c:1891
 msgid "Password has expired"
 msgstr "Salasana vanhentunut"
 
-#: ../libpurple/protocols/novell/nmuser.c:1894
 msgid "Incorrect password"
 msgstr "Virheellinen salasana"
 
-#: ../libpurple/protocols/novell/nmuser.c:1897
 msgid "User not found"
 msgstr "Käyttäjää ei löydy"
 
-#: ../libpurple/protocols/novell/nmuser.c:1900
 msgid "Account has been disabled"
 msgstr "Käyttäjätili on poistettu käytöstä"
 
-#: ../libpurple/protocols/novell/nmuser.c:1903
 msgid "The server could not access the directory"
 msgstr "Palvelin ei pääse hakemistoon"
 
-#: ../libpurple/protocols/novell/nmuser.c:1906
 msgid "Your system administrator has disabled this operation"
 msgstr "Järjestelmänne ylläpitäjä on estänyt tämän toiminnon."
 
-#: ../libpurple/protocols/novell/nmuser.c:1909
 msgid "The server is unavailable; try again later"
 msgstr "Palvelin ei ole käytössä; yritä myöhemmin uudelleen"
 
-#: ../libpurple/protocols/novell/nmuser.c:1912
 msgid "Cannot add a contact to the same folder twice"
 msgstr "Tuttavaa ei voi lisätä samaan kansioon kahdesti"
 
-#: ../libpurple/protocols/novell/nmuser.c:1915
 msgid "Cannot add yourself"
 msgstr "Et voi lisätä itseäsi"
 
-#: ../libpurple/protocols/novell/nmuser.c:1918
 msgid "Master archive is misconfigured"
 msgstr "Pääarkisto on väärin konfiguroitu"
 
-#: ../libpurple/protocols/novell/nmuser.c:1922
 msgid "Incorrect username or password"
 msgstr "Virheellinen käyttäjänimi tai salasana"
 
-#: ../libpurple/protocols/novell/nmuser.c:1925
 msgid "Could not recognize the host of the username you entered"
 msgstr "Syötetyn käyttäjänimen isäntäpalvelinta ei voi tunnistaa"
 
-#: ../libpurple/protocols/novell/nmuser.c:1928
 msgid ""
 "Your account has been disabled because too many incorrect passwords were "
 "entered"
@@ -8363,31 +5861,24 @@
 "Käyttäjätilisi käyttö on estetty koska liian monta väärää salasanaa on "
 "syötetty"
 
-#: ../libpurple/protocols/novell/nmuser.c:1931
 msgid "You cannot add the same person twice to a conversation"
 msgstr "Et voi lisätä samaa henkilöä kahdesti keskusteluun"
 
-#: ../libpurple/protocols/novell/nmuser.c:1935
 msgid "You have reached your limit for the number of contacts allowed"
 msgstr "Olet saavuttanut rajasi sallittujen tuttavien määrässä"
 
-#: ../libpurple/protocols/novell/nmuser.c:1938
 msgid "You have entered an incorrect username"
 msgstr "Olet syöttänyt epäkelvon käyttäjänimen"
 
-#: ../libpurple/protocols/novell/nmuser.c:1941
 msgid "An error occurred while updating the directory"
 msgstr "Virhe tapahtui päivitettäessä hakemistoa"
 
-#: ../libpurple/protocols/novell/nmuser.c:1944
 msgid "Incompatible protocol version"
 msgstr "Epäyhteensopiva yhteyskäytäntöversio"
 
-#: ../libpurple/protocols/novell/nmuser.c:1947
 msgid "The user has blocked you"
 msgstr "Käyttäjä on estänyt sinut"
 
-#: ../libpurple/protocols/novell/nmuser.c:1950
 msgid ""
 "This evaluation version does not allow more than ten users to log in at one "
 "time"
@@ -8395,54 +5886,43 @@
 "Tämä kokeiluversio ei salli enempää kuin kymmenen käyttäjää kirjautuneena "
 "sisään samaan aikaan"
 
-#: ../libpurple/protocols/novell/nmuser.c:1953
 msgid "The user is either offline or you are blocked"
 msgstr "Käyttäjä on joko poissa linjoilta tai sinut on estetty"
 
-#: ../libpurple/protocols/novell/nmuser.c:1956
 #, c-format
 msgid "Unknown error: 0x%X"
 msgstr "Tuntematon virhe: 0x%X"
 
-#: ../libpurple/protocols/novell/novell.c:124
 #, c-format
 msgid "Login failed (%s)."
 msgstr "Kirjautuminen epäonnistui (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:255
 #, c-format
 msgid "Unable to send message. Could not get details for user (%s)."
 msgstr "Viestiä ei voi lähettää. Ei saatu yksityiskohtia käyttäjälle (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:404
 #, c-format
 msgid "Unable to add %s to your buddy list (%s)."
 msgstr "%s ei voi lisätä tuttaviin (%s)."
 
 #. TODO: Improve this! message to who or for what conference?
-#: ../libpurple/protocols/novell/novell.c:430
 #, c-format
 msgid "Unable to send message (%s)."
 msgstr "Viestiä ei voi lähettää (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:501
-#: ../libpurple/protocols/novell/novell.c:993
 #, c-format
 msgid "Unable to invite user (%s)."
 msgstr "Käyttäjää ei voi kutsua (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:540
 #, c-format
 msgid "Unable to send message to %s. Could not create the conference (%s)."
 msgstr ""
 "Viestiä ei voi lähettää käyttäjälle %s. Konferenssia ei voi luoda (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:545
 #, c-format
 msgid "Unable to send message. Could not create the conference (%s)."
 msgstr "Viestiä ei voi lähettää. Konferenssia ei voi luoda (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:592
 #, c-format
 msgid ""
 "Unable to move user %s to folder %s in the server side list. Error while "
@@ -8451,7 +5931,6 @@
 "Käyttäjää %s ei voi siirtää kansioon %s palvelinpuolen tuttavissa. Virhe "
 "luotaessa kansiota (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:640
 #, c-format
 msgid ""
 "Unable to add %s to your buddy list. Error creating folder in server side "
@@ -8460,62 +5939,46 @@
 "%s ei voi lisätä tuttaviin. Virhe luotaessa kansiota palvelinpuolen "
 "tuttaviin (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:713
 #, c-format
 msgid "Could not get details for user %s (%s)."
 msgstr "Ei saatu yksityiskohtia käyttäjälle %s (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:759
-#: ../libpurple/protocols/novell/novell.c:905
 #, c-format
 msgid "Unable to add user to privacy list (%s)."
 msgstr "Käyttäjää ei voi lisätä yksityisyys-listaan (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:806
 #, c-format
 msgid "Unable to add %s to deny list (%s)."
 msgstr "%s ei voi lisätä kieltolistalle (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:859
 #, c-format
 msgid "Unable to add %s to permit list (%s)."
 msgstr "Ei voi lisätä %s sallitut-listalle (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:927
 #, c-format
 msgid "Unable to remove %s from privacy list (%s)."
 msgstr "Ei voi poistaa %s yksityisyys-listalta (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:950
-#: ../libpurple/protocols/novell/novell.c:1656
 #, c-format
 msgid "Unable to change server side privacy settings (%s)."
 msgstr "Palvelinpuolen yksityisyys-asetuksia ei voi muuttaa (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:1020
 #, c-format
 msgid "Unable to create conference (%s)."
 msgstr "Konferenssia ei voi luoda (%s)."
 
-#: ../libpurple/protocols/novell/novell.c:1131
-#: ../libpurple/protocols/novell/novell.c:1702
 msgid "Error communicating with server. Closing connection."
 msgstr "Virhe kommunikoitaessa palvelimelle. Suljetaan yhteys."
 
-#: ../libpurple/protocols/novell/novell.c:1485
 msgid "Telephone Number"
 msgstr "Puhelinnumero"
 
-#: ../libpurple/protocols/novell/novell.c:1491
 msgid "Personal Title"
 msgstr "Titteli"
 
-#: ../libpurple/protocols/novell/novell.c:1495
 msgid "Mailstop"
 msgstr "Mailstop"
 
-#: ../libpurple/protocols/novell/novell.c:1511
-#: ../libpurple/protocols/sametime/sametime.c:4178
 msgid "User ID"
 msgstr "Käyttäjän ID"
 
@@ -8525,37 +5988,29 @@
 #. purple_notify_user_info_add_pair(user_info, tag, value);
 #. }
 #.
-#: ../libpurple/protocols/novell/novell.c:1524
 msgid "Full name"
 msgstr "Koko nimi"
 
-#: ../libpurple/protocols/novell/novell.c:1646
 #, c-format
 msgid "GroupWise Conference %d"
 msgstr "GroupWise-konferenssi %d"
 
-#: ../libpurple/protocols/novell/novell.c:1729
 msgid "Authenticating..."
 msgstr "Todennetaan..."
 
-#: ../libpurple/protocols/novell/novell.c:1743
 msgid "Unable to connect to server."
 msgstr "Palvelimeen ei kyetty muodostamaan yhteyttä."
 
-#: ../libpurple/protocols/novell/novell.c:1746
 msgid "Waiting for response..."
 msgstr "Odotetaan vastausta..."
 
-#: ../libpurple/protocols/novell/novell.c:1881
 #, c-format
 msgid "%s has been invited to this conversation."
 msgstr "%s on kutsuttu tähän keskusteluun."
 
-#: ../libpurple/protocols/novell/novell.c:1909
 msgid "Invitation to Conversation"
 msgstr "Keskustelukutsu"
 
-#: ../libpurple/protocols/novell/novell.c:1910
 #, c-format
 msgid ""
 "Invitation from: %s\n"
@@ -8566,23 +6021,19 @@
 "\n"
 "Lähetetty: %s"
 
-#: ../libpurple/protocols/novell/novell.c:1912
 msgid "Would you like to join the conversation?"
 msgstr "Haluatko liittyä keskusteluun?"
 
-#: ../libpurple/protocols/novell/novell.c:2028
 msgid "You have been logged out because you logged in at another workstation."
 msgstr ""
 "Sinut on kirjattu ulos koska olet kirjautunut sisään toiselta työasemalta."
 
-#: ../libpurple/protocols/novell/novell.c:2085
 #, c-format
 msgid ""
 "%s appears to be offline and did not receive the message that you just sent."
 msgstr ""
 "%s näyttää olevan poissa linjoilta eikä saanut viestiä jonka juuri lähetit."
 
-#: ../libpurple/protocols/novell/novell.c:2185
 msgid ""
 "Unable to connect to server. Please enter the address of the server you wish "
 "to connect to."
@@ -8590,11 +6041,9 @@
 "Palvelimeen ei voi yhdistää. Ole hyvä, syötä palvelimen osoite jolle haluat "
 "yhdistää."
 
-#: ../libpurple/protocols/novell/novell.c:2214
 msgid "Error. SSL support is not installed."
 msgstr "Virhe. SSL-tuki ei ole asennettu."
 
-#: ../libpurple/protocols/novell/novell.c:2522
 #, c-format
 msgid "This conference has been closed. No more messages can be sent."
 msgstr "Tämä konferenssi on suljettu. Uusia viestejä ei voi lähettää."
@@ -8609,41 +6058,24 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/novell/novell.c:3536
-#: ../libpurple/protocols/novell/novell.c:3538
 msgid "Novell GroupWise Messenger Protocol Plugin"
 msgstr "Novell GroupWise Messenger -yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/novell/novell.c:3563
 msgid "Server address"
 msgstr "Palvelimen osoite"
 
-#: ../libpurple/protocols/novell/novell.c:3567
 msgid "Server port"
 msgstr "Palvelimen portti"
 
-#: ../libpurple/protocols/oscar/family_chatnav.c:62
 msgid "Could not join chat room"
 msgstr "Keskusteluhuoneeseen ei voi liittyä"
 
-#: ../libpurple/protocols/oscar/family_chatnav.c:63
 msgid "Invalid chat room name"
 msgstr "Epäkelpo keskusteluhuoneen nimi"
 
-#: ../libpurple/protocols/oscar/flap_connection.c:396
-#: ../libpurple/protocols/yahoo/yahoo.c:2505
-#: ../libpurple/protocols/yahoo/yahoo.c:2673
-#: ../libpurple/protocols/yahoo/ycht.c:482 ../libpurple/proxy.c:609
-#: ../libpurple/proxy.c:1161 ../libpurple/proxy.c:1270
-#: ../libpurple/proxy.c:1376 ../libpurple/proxy.c:1529
 msgid "Server closed the connection."
 msgstr "Palvelin on katkaissut yhteyden."
 
-#: ../libpurple/protocols/oscar/flap_connection.c:398
-#: ../libpurple/protocols/yahoo/yahoo.c:2498
-#: ../libpurple/protocols/yahoo/yahoo.c:2666 ../libpurple/proxy.c:621
-#: ../libpurple/proxy.c:1173 ../libpurple/proxy.c:1282
-#: ../libpurple/proxy.c:1388 ../libpurple/proxy.c:1541
 #, c-format
 msgid ""
 "Lost connection with server:\n"
@@ -8652,10 +6084,6 @@
 "Yhteys palvelimeen katkesi:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/flap_connection.c:401
-#: ../libpurple/proxy.c:1190 ../libpurple/proxy.c:1295
-#: ../libpurple/proxy.c:1400 ../libpurple/proxy.c:1490
-#: ../libpurple/proxy.c:1554
 msgid "Received invalid data on connection with server."
 msgstr "Palvelimeen yhdistettäessä vastaanotettiin virheellisiä tietoja."
 
@@ -8669,8 +6097,6 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/oscar/libaim.c:118
-#: ../libpurple/protocols/oscar/libaim.c:120
 msgid "AIM Protocol Plugin"
 msgstr "AIM-yhteyskäytäntöliitännäinen"
 
@@ -8684,43 +6110,31 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/oscar/libicq.c:118
-#: ../libpurple/protocols/oscar/libicq.c:120
 msgid "ICQ Protocol Plugin"
 msgstr "ICQ-yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/oscar/libicq.c:147
-#: ../libpurple/protocols/yahoo/yahoo.c:4456
-#: ../libpurple/protocols/zephyr/zephyr.c:2982
 msgid "Encoding"
 msgstr "Merkistö"
 
-#: ../libpurple/protocols/oscar/odc.c:42
 msgid "The remote user has closed the connection."
 msgstr "Käyttäjä on katkaissut yhteyden."
 
-#: ../libpurple/protocols/oscar/odc.c:44
 msgid "The remote user has declined your request."
 msgstr "Käyttäjä on kieltäytynyt pyynnöstäsi."
 
-#: ../libpurple/protocols/oscar/odc.c:46
 #, c-format
 msgid "Lost connection with the remote user:<br>%s"
 msgstr "Yhteys käyttäjään katkesi:<br>%s"
 
-#: ../libpurple/protocols/oscar/odc.c:49
 msgid "Received invalid data on connection with remote user."
 msgstr "Vastaanotettiin virheellisiä tietoja luotaessa yhteyttä käyttäjään."
 
-#: ../libpurple/protocols/oscar/odc.c:51
 msgid "Could not establish a connection with the remote user."
 msgstr "Yhteyttä käyttäjän kanssa ei voi muodostaa."
 
-#: ../libpurple/protocols/oscar/odc.c:562
 msgid "Direct IM established"
 msgstr "Suora pikaviestiyhteys muodostettu"
 
-#: ../libpurple/protocols/oscar/odc.c:600
 #, c-format
 msgid ""
 "%s tried to send you a %s file, but we only allow files up to %s over Direct "
@@ -8729,109 +6143,83 @@
 "%s yritti lähettää sinulle %s-tiedoston, mutta vain tiedostot %s asti ovat "
 "sallittuja suorassa IM-yhteydessä. Yritä tiedostonsiirtoa sen sijaan.\n"
 
-#: ../libpurple/protocols/oscar/oft.c:656
 #, c-format
 msgid "File %s is %s, which is larger than the maximum size of %s."
 msgstr ""
 "Tiedosto %s on kooltaan %s, mikä on enemmän kuin suurin sallittu koko %s."
 
-#: ../libpurple/protocols/oscar/oscar.c:117
 msgid "Invalid error"
 msgstr "Epäkelpo virhe"
 
-#: ../libpurple/protocols/oscar/oscar.c:118
 msgid "Invalid SNAC"
 msgstr "Epäkelpo SNAC"
 
-#: ../libpurple/protocols/oscar/oscar.c:119
 msgid "Rate to host"
 msgstr "Nopeus isäntään"
 
-#: ../libpurple/protocols/oscar/oscar.c:120
 msgid "Rate to client"
 msgstr "Nopeus asiakasohjelmaan"
 
-#: ../libpurple/protocols/oscar/oscar.c:122
 msgid "Service unavailable"
 msgstr "Palvelu ei ole käytettävissä"
 
-#: ../libpurple/protocols/oscar/oscar.c:123
 msgid "Service not defined"
 msgstr "Palvelua ei määritelty"
 
-#: ../libpurple/protocols/oscar/oscar.c:124
 msgid "Obsolete SNAC"
 msgstr "Vanhentunut SNAC"
 
-#: ../libpurple/protocols/oscar/oscar.c:125
 msgid "Not supported by host"
 msgstr "Ei tuettu verkkoisännässä"
 
-#: ../libpurple/protocols/oscar/oscar.c:126
 msgid "Not supported by client"
 msgstr "Ei tuettu asiakasohjelmassa"
 
-#: ../libpurple/protocols/oscar/oscar.c:127
 msgid "Refused by client"
 msgstr "Asiakasohjelma torjui"
 
-#: ../libpurple/protocols/oscar/oscar.c:128
 msgid "Reply too big"
 msgstr "Vastaus liian suuri"
 
-#: ../libpurple/protocols/oscar/oscar.c:129
 msgid "Responses lost"
 msgstr "Vastaukset menetetty"
 
-#: ../libpurple/protocols/oscar/oscar.c:130
 msgid "Request denied"
 msgstr "Pyyntö evätty"
 
-#: ../libpurple/protocols/oscar/oscar.c:131
 msgid "Busted SNAC payload"
 msgstr "Rikkoutunut SNAC-data"
 
-#: ../libpurple/protocols/oscar/oscar.c:132
 msgid "Insufficient rights"
 msgstr "Liian vähän oikeuksia"
 
-#: ../libpurple/protocols/oscar/oscar.c:133
 msgid "In local permit/deny"
 msgstr "Paikallisessa sallittujen/estettyjen listassa"
 
-#: ../libpurple/protocols/oscar/oscar.c:134
-msgid "Too evil (sender)"
-msgstr "Lähettäjä liian paha(evil)"
-
-#: ../libpurple/protocols/oscar/oscar.c:135
-msgid "Too evil (receiver)"
-msgstr "Vastaanottaja liian paha(evil)"
-
-#: ../libpurple/protocols/oscar/oscar.c:136
+msgid "Warning level too high (sender)"
+msgstr "Varoitustaso liian korkea (lähettäjä)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Varoitustaso liian korkea (vastaanottaja)"
+
 msgid "User temporarily unavailable"
 msgstr "Käyttäjä ei tilapäisesti saatavilla."
 
-#: ../libpurple/protocols/oscar/oscar.c:137
 msgid "No match"
 msgstr "Ei tuloksia"
 
-#: ../libpurple/protocols/oscar/oscar.c:138
 msgid "List overflow"
 msgstr "Lista-ylivuoto"
 
-#: ../libpurple/protocols/oscar/oscar.c:139
 msgid "Request ambiguous"
 msgstr "Pyyntö ei ole yksiselitteinen"
 
-#: ../libpurple/protocols/oscar/oscar.c:140
 msgid "Queue full"
 msgstr "Jono täynnä"
 
-#: ../libpurple/protocols/oscar/oscar.c:141
 msgid "Not while on AOL"
 msgstr "Ei kun AOL on käytössä"
 
-#: ../libpurple/protocols/oscar/oscar.c:349
 msgid ""
 "(There was an error receiving this message.  The buddy you are speaking with "
 "is probably using a different encoding than expected.  If you know what "
@@ -8843,7 +6231,6 @@
 "merkistöä hän käyttää, voit määritellä sen AIM/ICQ-käyttäjätilisi "
 "lisäasetuksissa.)"
 
-#: ../libpurple/protocols/oscar/oscar.c:458
 #, c-format
 msgid ""
 "(There was an error receiving this message.  Either you and %s have "
@@ -8854,140 +6241,101 @@
 "asiakasohjelma.)"
 
 #. Label
-#: ../libpurple/protocols/oscar/oscar.c:640 ../pidgin/gtkutils.c:2444
-#: ../pidgin/gtkutils.c:2474
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:336
 msgid "Buddy Icon"
 msgstr "Tuttavakuvake"
 
-#: ../libpurple/protocols/oscar/oscar.c:643
 msgid "Voice"
 msgstr "Ääni"
 
-#: ../libpurple/protocols/oscar/oscar.c:646
 msgid "AIM Direct IM"
 msgstr "AIM:n suora pikaviesti"
 
-#: ../libpurple/protocols/oscar/oscar.c:652
-#: ../libpurple/protocols/oscar/oscar.c:6123
 msgid "Get File"
 msgstr "Vastaanota tiedosto"
 
-#: ../libpurple/protocols/oscar/oscar.c:659
 msgid "Games"
 msgstr "Pelit"
 
-#: ../libpurple/protocols/oscar/oscar.c:662
 msgid "Add-Ins"
 msgstr "Lisäykset"
 
-#: ../libpurple/protocols/oscar/oscar.c:665
 msgid "Send Buddy List"
 msgstr "Lähetä tuttavat"
 
-#: ../libpurple/protocols/oscar/oscar.c:668
 msgid "ICQ Direct Connect"
 msgstr "ICQ-suorayhteys"
 
-#: ../libpurple/protocols/oscar/oscar.c:671
 msgid "AP User"
 msgstr "AP-käyttäjä"
 
-#: ../libpurple/protocols/oscar/oscar.c:674
 msgid "ICQ RTF"
 msgstr "ICQ RTF"
 
-#: ../libpurple/protocols/oscar/oscar.c:677
 msgid "Nihilist"
 msgstr "Nihilistinen"
 
-#: ../libpurple/protocols/oscar/oscar.c:680
 msgid "ICQ Server Relay"
 msgstr "ICQ-palvelimen välitys"
 
-#: ../libpurple/protocols/oscar/oscar.c:683
 msgid "Old ICQ UTF8"
 msgstr "Vanha ICQ UTF8"
 
-#: ../libpurple/protocols/oscar/oscar.c:686
 msgid "Trillian Encryption"
 msgstr "Trillian-salaus"
 
-#: ../libpurple/protocols/oscar/oscar.c:689
 msgid "ICQ UTF8"
 msgstr "ICQ UTF8"
 
-#: ../libpurple/protocols/oscar/oscar.c:692
 msgid "Hiptop"
 msgstr "Hiptop"
 
-#: ../libpurple/protocols/oscar/oscar.c:695
 msgid "Security Enabled"
 msgstr "Turvatoimet käytössä"
 
-#: ../libpurple/protocols/oscar/oscar.c:698
 msgid "Video Chat"
 msgstr "Videokeskustelu"
 
-#: ../libpurple/protocols/oscar/oscar.c:702
 msgid "iChat AV"
 msgstr "iChat AV"
 
-#: ../libpurple/protocols/oscar/oscar.c:705
 msgid "Live Video"
 msgstr "Live-video"
 
-#: ../libpurple/protocols/oscar/oscar.c:708
 msgid "Camera"
 msgstr "Kamera"
 
-#: ../libpurple/protocols/oscar/oscar.c:726
-#: ../libpurple/protocols/oscar/oscar.c:5893
+msgid "Screen Sharing"
+msgstr "Näytön jakaminen"
+
 #, c-format
 msgid "Free For Chat"
 msgstr "Vapaana keskusteluun"
 
-#: ../libpurple/protocols/oscar/oscar.c:730
-#: ../libpurple/protocols/oscar/oscar.c:5928
 #, c-format
 msgid "Not Available"
 msgstr "Ei tavoitettavissa"
 
-#: ../libpurple/protocols/oscar/oscar.c:732
-#: ../libpurple/protocols/oscar/oscar.c:5914
 #, c-format
 msgid "Occupied"
 msgstr "Varattu"
 
-#: ../libpurple/protocols/oscar/oscar.c:736
 #, c-format
 msgid "Web Aware"
 msgstr "Net-tietoinen"
 
-#: ../libpurple/protocols/oscar/oscar.c:738 ../libpurple/protocols/qq/qq.c:184
-#: ../libpurple/protocols/qq/qq.c:289
-#: ../libpurple/protocols/yahoo/yahoo.c:3152 ../libpurple/status.c:158
-#: ../pidgin/gtkdocklet.c:557 ../pidgin/gtkstatusbox.c:1089
 #, c-format
 msgid "Invisible"
 msgstr "Näkymätön"
 
-#: ../libpurple/protocols/oscar/oscar.c:839
-#: ../libpurple/protocols/oscar/oscar.c:3744
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:721 ../pidgin/gtkprefs.c:1210
 msgid "IP Address"
 msgstr "IP-osoite"
 
-#: ../libpurple/protocols/oscar/oscar.c:846
-#: ../libpurple/protocols/oscar/oscar.c:2945
 msgid "Warning Level"
 msgstr "Varoitustaso"
 
-#: ../libpurple/protocols/oscar/oscar.c:856
 msgid "Buddy Comment"
 msgstr "Tuttavakommentti"
 
-#: ../libpurple/protocols/oscar/oscar.c:996
 #, c-format
 msgid ""
 "Could not connect to authentication server:\n"
@@ -8996,7 +6344,6 @@
 "Ei saatu yhteyttä todentamispalvelimeen:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:1004
 #, c-format
 msgid ""
 "Could not connect to BOS server:\n"
@@ -9005,20 +6352,16 @@
 "Ei saatu yhteyttä BOS-palvelimeen:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:1044
 msgid "Username sent"
 msgstr "Käyttäjänimi lähetetty"
 
-#: ../libpurple/protocols/oscar/oscar.c:1049
 msgid "Connection established, cookie sent"
 msgstr "Yhteys muodostettu, eväste lähetetty"
 
 #. TODO: Don't call this with ssi
-#: ../libpurple/protocols/oscar/oscar.c:1078
 msgid "Finalizing connection"
 msgstr "Viimeistellään yhteyttä"
 
-#: ../libpurple/protocols/oscar/oscar.c:1306
 #, c-format
 msgid ""
 "Unable to login: Could not sign on as %s because the username is invalid.  "
@@ -9031,32 +6374,22 @@
 "sisältää vain numeroita."
 
 #. Unregistered screen name
-#: ../libpurple/protocols/oscar/oscar.c:1392
-#: ../libpurple/protocols/yahoo/yahoo.c:2127
 msgid "Invalid username."
 msgstr "Epäkelpo käyttäjänimi."
 
-#: ../libpurple/protocols/oscar/oscar.c:1398
-#: ../libpurple/protocols/qq/login_logout.c:485
-#: ../libpurple/protocols/simple/simple.c:1112
-#: ../libpurple/protocols/yahoo/yahoo.c:2149
 msgid "Incorrect password."
 msgstr "Virheellinen salasana."
 
 #. Suspended account
-#: ../libpurple/protocols/oscar/oscar.c:1402
 msgid "Your account is currently suspended."
 msgstr "Käyttäjätilisi palvelu on parhaillaan keskeytetty."
 
 #. service temporarily unavailable
-#: ../libpurple/protocols/oscar/oscar.c:1406
 msgid "The AOL Instant Messenger service is temporarily unavailable."
 msgstr "AOL-pikaviestipalvelu ei tilapäisesti ole käytössä."
 
 #. screen name connecting too frequently
 #. IP address connecting too frequently
-#: ../libpurple/protocols/oscar/oscar.c:1410
-#: ../libpurple/protocols/oscar/oscar.c:1419
 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."
@@ -9065,44 +6398,31 @@
 "ja yritä uudelleen. Jos jatkat yrittämistä, joudut odottamaan vielä "
 "pidempään."
 
-#. client too old
-#: ../libpurple/protocols/oscar/oscar.c:1414
 #, c-format
 msgid "The client version you are using is too old. Please upgrade at %s"
 msgstr "Asiakasohjelmasi versio on liian vanha. Päivitä osoitteessa %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:1452
 msgid "Could Not Connect"
 msgstr "Yhteyttä ei voi muodostaa"
 
-#: ../libpurple/protocols/oscar/oscar.c:1456
 msgid "Received authorization"
 msgstr "Saatiin lupa"
 
-#: ../libpurple/protocols/oscar/oscar.c:1479
 msgid "The SecurID key entered is invalid."
 msgstr "Syötetty SecurID-avain on virheellinen."
 
-#: ../libpurple/protocols/oscar/oscar.c:1492
 msgid "Enter SecurID"
 msgstr "Syötä SecurID"
 
-#: ../libpurple/protocols/oscar/oscar.c:1493
 msgid "Enter the 6 digit number from the digital display."
 msgstr "Syötä 6 numeroinen luku digitaaliselta näytöltä."
 
 #. *
 #. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
 #.
-#: ../libpurple/protocols/oscar/oscar.c:1495
-#: ../libpurple/protocols/oscar/oscar.c:2287
-#: ../libpurple/protocols/oscar/oscar.c:2335
-#: ../libpurple/protocols/oscar/oscar.c:5998
-#: ../libpurple/protocols/oscar/oscar.c:6280 ../libpurple/request.h:1401
 msgid "_OK"
 msgstr "_OK"
 
-#: ../libpurple/protocols/oscar/oscar.c:1534
 #, c-format
 msgid ""
 "You may be disconnected shortly.  You may want to use TOC until this is "
@@ -9111,54 +6431,38 @@
 "Yhteytesi saatetaan katkaista kohta. Saatat haluta käyttää TOC-"
 "yhteyskäytäntöä kunnes tämä on korjattu. Tarkista päivitykset: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:1537
-#: ../libpurple/protocols/oscar/oscar.c:1581
 msgid "Unable to get a valid AIM login hash."
 msgstr "Kelvollista AIM-sisäänkirjautumistiivistettä ei saatu."
 
-#: ../libpurple/protocols/oscar/oscar.c:1578
-#: ../libpurple/protocols/oscar/oscar.c:1677
 #, c-format
 msgid "You may be disconnected shortly.  Check %s for updates."
 msgstr "Yhteytesi saatetaan katkaista kohta. Tarkista päivitykset: %s."
 
-#: ../libpurple/protocols/oscar/oscar.c:1680
 msgid "Unable to get a valid login hash."
 msgstr "Kelvollista sisäänkirjautumistiivistettä ei saatu."
 
-#: ../libpurple/protocols/oscar/oscar.c:1710
+#. allow multple logins?
 msgid "Password sent"
 msgstr "Salasana lähetetty"
 
-#: ../libpurple/protocols/oscar/oscar.c:1766
 msgid "Unable to initialize connection"
 msgstr "Yhteyden luominen epäonnistui"
 
-#: ../libpurple/protocols/oscar/oscar.c:2256
 msgid "Please authorize me so I can add you to my buddy list."
 msgstr "Valtuuttaisitko minut, jotta voin lisätä sinut tuttaviini?"
 
-#: ../libpurple/protocols/oscar/oscar.c:2285
 msgid "Authorization Request Message:"
 msgstr "Valtuutuksen pyyntöviesti:"
 
-#: ../libpurple/protocols/oscar/oscar.c:2286
 msgid "Please authorize me!"
 msgstr "Voisitko valtuuttaa minut?"
 
-#: ../libpurple/protocols/oscar/oscar.c:2326
-#: ../libpurple/protocols/oscar/oscar.c:2334
-#: ../libpurple/protocols/oscar/oscar.c:2461
-#: ../libpurple/protocols/oscar/oscar.c:5370
-#: ../libpurple/protocols/yahoo/yahoo.c:991
 msgid "No reason given."
 msgstr "Syytä ei annettu."
 
-#: ../libpurple/protocols/oscar/oscar.c:2333
 msgid "Authorization Denied Message:"
 msgstr "Valtuutuspyyntö evätty:"
 
-#: ../libpurple/protocols/oscar/oscar.c:2461
 #, c-format
 msgid ""
 "The user %u has denied your request to add them to your buddy list for the "
@@ -9168,17 +6472,14 @@
 "Käyttäjä %u on evännyt pyyntösi lisätä hänet tuttaviisi seuraavasta syystä:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2462
 msgid "ICQ authorization denied."
 msgstr "ICQ-valtuutus evätty."
 
 #. Someone has granted you authorization
-#: ../libpurple/protocols/oscar/oscar.c:2469
 #, c-format
 msgid "The user %u has granted your request to add them to your buddy list."
 msgstr "Käyttäjä %u on hyväksynyt pyyntösi lisätä hänet tuttaviisi."
 
-#: ../libpurple/protocols/oscar/oscar.c:2477
 #, c-format
 msgid ""
 "You have received a special message\n"
@@ -9191,7 +6492,6 @@
 "Lähettäjä: %s [%s]\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2485
 #, c-format
 msgid ""
 "You have received an ICQ page\n"
@@ -9204,7 +6504,6 @@
 "Lähettäjä: %s [%s]\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2493
 #, c-format
 msgid ""
 "You have received an ICQ email from %s [%s]\n"
@@ -9217,38 +6516,31 @@
 "Viesti on:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2514
 #, c-format
 msgid "ICQ user %u has sent you a buddy: %s (%s)"
 msgstr "ICQ-käyttäjä %u on lähettänyt sinulle tuttavan: %s (%s)"
 
-#: ../libpurple/protocols/oscar/oscar.c:2520
 msgid "Do you want to add this buddy to your buddy list?"
 msgstr "Haluatko lisätä hänet tuttaviisi?"
 
-#: ../libpurple/protocols/oscar/oscar.c:2525 ../pidgin/gtkroomlist.c:320
 msgid "_Add"
 msgstr "_Lisää"
 
-#: ../libpurple/protocols/oscar/oscar.c:2526
 msgid "_Decline"
 msgstr "_Kieltäydy"
 
-#: ../libpurple/protocols/oscar/oscar.c:2650
 #, c-format
 msgid "You missed %hu message from %s because it was invalid."
 msgid_plural "You missed %hu messages from %s because they were invalid."
 msgstr[0] "Et saanut %hu viestiä %s:lta koska se oli epäkelpo."
 msgstr[1] "Et saanut %hu viestiä %s:lta koska ne olivat epäkelpoja."
 
-#: ../libpurple/protocols/oscar/oscar.c:2659
 #, c-format
 msgid "You missed %hu message from %s because it was too large."
 msgid_plural "You missed %hu messages from %s because they were too large."
 msgstr[0] "Et saanut %hu viestiä %s:lta koska se oli liian suuri."
 msgstr[1] "Et saanut %hu viestiä %s:lta koska ne olivat liian suuria."
 
-#: ../libpurple/protocols/oscar/oscar.c:2668
 #, c-format
 msgid ""
 "You missed %hu message from %s because the rate limit has been exceeded."
@@ -9257,21 +6549,23 @@
 msgstr[0] "Et saanut %hu viestiä %s:lta koska taajuusraja ylittyi."
 msgstr[1] "Et saanut %hu viestiä %s:lta koska taajuusraja ylittyi."
 
-#: ../libpurple/protocols/oscar/oscar.c:2677
-#, c-format
-msgid "You missed %hu message from %s because he/she was too evil."
-msgid_plural "You missed %hu messages from %s because he/she was too evil."
-msgstr[0] "Et saanut %hu viestiä %s:lta koska hän on liian hirveä."
-msgstr[1] "Et saanut %hu viestiä %s:lta koska hän on liian hirveä."
-
-#: ../libpurple/protocols/oscar/oscar.c:2686
-#, c-format
-msgid "You missed %hu message from %s because you are too evil."
-msgid_plural "You missed %hu messages from %s because you are too evil."
-msgstr[0] "Et saanut %hu viestiä %s:lta koska olet liian hirveä."
-msgstr[1] "Et saanut %hu viestiä %s:lta koska olet liian hirveä."
-
-#: ../libpurple/protocols/oscar/oscar.c:2695
+#, c-format
+msgid ""
+"You missed %hu message from %s because his/her warning level is too high."
+msgid_plural ""
+"You missed %hu messages from %s because his/her warning level is too high."
+msgstr[0] ""
+"Et saanut %hu viestiä %s:lta koska hänen varoitustasonsa on liian korkea."
+msgstr[1] ""
+"Et saanut %hu viestiä %s:lta koska hänen varoitustasonsa on liian korkea."
+
+#, c-format
+msgid "You missed %hu message from %s because your warning level is too high."
+msgid_plural ""
+"You missed %hu messages from %s because your warning level is too high."
+msgstr[0] "Et saanut %hu viestiä %s:lta koska varoitustasosi on liian korkea."
+msgstr[1] "Et saanut %hu viestiä %s:lta koska varoitustasosi on liian korkea."
+
 #, c-format
 msgid "You missed %hu message from %s for an unknown reason."
 msgid_plural "You missed %hu messages from %s for an unknown reason."
@@ -9279,47 +6573,31 @@
 msgstr[1] "Et saanut %hu viestiä %s:lta tuntemattomasta syystä."
 
 #. Data is assumed to be the destination sn
-#: ../libpurple/protocols/oscar/oscar.c:2850
 #, c-format
 msgid "Unable to send message: %s"
 msgstr "Viestiä ei voi lähettää: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2850
-#: ../libpurple/protocols/oscar/oscar.c:2855
-#: ../libpurple/protocols/oscar/oscar.c:2919
 msgid "Unknown reason."
 msgstr "Tuntematon syy."
 
-#: ../libpurple/protocols/oscar/oscar.c:2853
-#: ../libpurple/protocols/sametime/sametime.c:2461
 #, c-format
 msgid "Unable to send message to %s:"
 msgstr "Viestiä ei voi lähettää käyttäjälle %s."
 
-#: ../libpurple/protocols/oscar/oscar.c:2919
 #, c-format
 msgid "User information not available: %s"
 msgstr "Käyttäjätiedot eivät ole saatavilla: %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:2950
 msgid "Online Since"
 msgstr "Kirjautunut"
 
-#: ../libpurple/protocols/oscar/oscar.c:2955
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1192
 msgid "Member Since"
 msgstr "Rekisteröitynyt"
 
-#: ../libpurple/protocols/oscar/oscar.c:2990
-msgid "Available Message"
-msgstr "Paikallaoloviesti"
-
-#: ../libpurple/protocols/oscar/oscar.c:3094
 msgid "Your AIM connection may be lost."
 msgstr "AIM-yhteytesi saattaa olla katkennut."
 
 #. The conversion failed!
-#: ../libpurple/protocols/oscar/oscar.c:3282
 msgid ""
 "[Unable to display a message from this user because it contained invalid "
 "characters.]"
@@ -9327,7 +6605,6 @@
 "[Viestiä tältä käyttäjältä ei voi näyttää koska se sisälsi epäkelpoja "
 "merkkejä.]"
 
-#: ../libpurple/protocols/oscar/oscar.c:3446
 msgid ""
 "The last action you attempted could not be performed because you are over "
 "the rate limit. Please wait 10 seconds and try again."
@@ -9335,74 +6612,56 @@
 "Viimeistä viestiä ei lähetetty koska olet ylittänyt taajuusrajan. Odota 10 "
 "sekuntia ja yritä uudelleen."
 
-#: ../libpurple/protocols/oscar/oscar.c:3531
-#: ../libpurple/protocols/toc/toc.c:977
 #, c-format
 msgid "You have been disconnected from chat room %s."
 msgstr "Yhteytesi keskusteluhuoneeseen %s on katkennut."
 
-#: ../libpurple/protocols/oscar/oscar.c:3766
-#: ../libpurple/protocols/silc/util.c:591
-#: ../libpurple/protocols/silc10/util.c:586
 msgid "Mobile Phone"
 msgstr "Matkapuhelin"
 
-#: ../libpurple/protocols/oscar/oscar.c:3796
 msgid "Personal Web Page"
 msgstr "Henkilökohtainen kotisivu"
 
-#: ../libpurple/protocols/oscar/oscar.c:3820
-#: ../libpurple/protocols/qq/buddy_info.c:40
+#. aim_userinfo_t
+#. strip_html_tags
 msgid "Additional Information"
 msgstr "Lisätiedot"
 
-#: ../libpurple/protocols/oscar/oscar.c:3828
-#: ../libpurple/protocols/oscar/oscar.c:3841
 msgid "Zip Code"
 msgstr "Postinumero"
 
-#: ../libpurple/protocols/oscar/oscar.c:3852
+msgid "Work Information"
+msgstr "Työtiedot"
+
 msgid "Division"
 msgstr "Osasto"
 
-#: ../libpurple/protocols/oscar/oscar.c:3853
 msgid "Position"
 msgstr "Asema"
 
-#: ../libpurple/protocols/oscar/oscar.c:3855
 msgid "Web Page"
 msgstr "Kotisivu"
 
-#: ../libpurple/protocols/oscar/oscar.c:3858
-msgid "Work Information"
-msgstr "Työtiedot"
-
-#: ../libpurple/protocols/oscar/oscar.c:3914
 msgid "Pop-Up Message"
 msgstr "Ponnahdusviesti"
 
-#: ../libpurple/protocols/oscar/oscar.c:3954
 #, c-format
 msgid "The following username is associated with %s"
 msgid_plural "The following usernames are associated with %s"
 msgstr[0] "Seuraava käyttäjänimi on assosioitu %s kanssa"
 msgstr[1] "Seuraavat käyttäjänimet on assosioitu %s kanssa"
 
-#: ../libpurple/protocols/oscar/oscar.c:3985
 #, c-format
 msgid "No results found for email address %s"
 msgstr "Ei hakutuloksia sähköpostiosoitteelle %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:4006
 #, c-format
 msgid "You should receive an email asking to confirm %s."
 msgstr "Sinun tulisi saada sähköpostiviesti %s:n varmistusta varten."
 
-#: ../libpurple/protocols/oscar/oscar.c:4008
 msgid "Account Confirmation Requested"
 msgstr "Tilin varmistusta pyydetty"
 
-#: ../libpurple/protocols/oscar/oscar.c:4041
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to format username because the requested name differs "
@@ -9411,14 +6670,12 @@
 "Virhe 0x%04x: Näyttönimeä ei voi muotoilla koska pyydetty käyttäjänimi eroaa "
 "alkuperäisestä."
 
-#: ../libpurple/protocols/oscar/oscar.c:4043
 #, c-format
 msgid "Error 0x%04x: Unable to format username because it is invalid."
 msgstr ""
 "Virhe 0x%04x: Käyttäjänimeä ei voi muotoilla koska pyydetty nimi on "
 "virheellinen."
 
-#: ../libpurple/protocols/oscar/oscar.c:4045
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to format username because the requested name is too "
@@ -9427,7 +6684,6 @@
 "Virhe 0x%04x: Käyttäjänimeä ei voi muotoilla koska pyydetty nimi on liian "
 "pitkä."
 
-#: ../libpurple/protocols/oscar/oscar.c:4047
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to change email address because there is already a "
@@ -9436,7 +6692,6 @@
 "Virhe 0x%04x: Sähköpostiosoitetta ei voi muuttaa koska tälle käyttäjänimelle "
 "on jo käsittelemätön muutospyyntö."
 
-#: ../libpurple/protocols/oscar/oscar.c:4049
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to change email address because the given address has "
@@ -9445,7 +6700,6 @@
 "Virhe 0x%04x: Sähköpostiosoitetta ei voi muuttaa koska annettu osoite on "
 "assosioitu liian moneen käyttäjänimeen."
 
-#: ../libpurple/protocols/oscar/oscar.c:4051
 #, c-format
 msgid ""
 "Error 0x%04x: Unable to change email address because the given address is "
@@ -9454,36 +6708,29 @@
 "Virhe 0x%04x: Sähköpostiosoitetta ei voi muuttaa koska annettu osoite on "
 "virheellinen."
 
-#: ../libpurple/protocols/oscar/oscar.c:4053
 #, c-format
 msgid "Error 0x%04x: Unknown error."
 msgstr "Virhe 0x%04x: Tuntematon virhe."
 
-#: ../libpurple/protocols/oscar/oscar.c:4055
 msgid "Error Changing Account Info"
 msgstr "Virhe muutettaessa käyttäjätilin tietoja"
 
-#: ../libpurple/protocols/oscar/oscar.c:4061
 #, c-format
 msgid "The email address for %s is %s"
 msgstr "%s:n sähköpostiosoite on %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:4063
 msgid "Account Info"
 msgstr "Tilin tiedot"
 
-#: ../libpurple/protocols/oscar/oscar.c:4249
 msgid ""
 "Your IM Image was not sent. You must be Direct Connected to send IM Images."
 msgstr ""
 "Pikaviesti kuvaasi ei lähetetty. Sinun tulee käyttää suorayhteyttä "
 "lähettääksesi pikaviestikuvia."
 
-#: ../libpurple/protocols/oscar/oscar.c:4520
 msgid "Unable to set AIM profile."
 msgstr "AIM-profiilia ei saatu asetettua."
 
-#: ../libpurple/protocols/oscar/oscar.c:4521
 msgid ""
 "You have probably requested to set your profile before the login procedure "
 "completed.  Your profile remains unset; try setting it again when you are "
@@ -9493,7 +6740,6 @@
 "suoritettua loppuun. Profiilia ei asetettu. Yritä asettaa se kun "
 "kirjautuminen on suoritettu."
 
-#: ../libpurple/protocols/oscar/oscar.c:4535
 #, c-format
 msgid ""
 "The maximum profile length of %d byte has been exceeded.  It has been "
@@ -9506,11 +6752,9 @@
 msgstr[1] ""
 "Maksimi profiilin koko %d tavua ylitetty.  Se on nyt lyhennetty puolestasi."
 
-#: ../libpurple/protocols/oscar/oscar.c:4540
 msgid "Profile too long."
 msgstr "Profiili on liian pitkä."
 
-#: ../libpurple/protocols/oscar/oscar.c:4584
 #, c-format
 msgid ""
 "The maximum away message length of %d byte has been exceeded.  It has been "
@@ -9525,11 +6769,9 @@
 "Maksimi poissaoloviestin koko %d tavua ylitetty. Viesti lyhennettiin "
 "puolestasi."
 
-#: ../libpurple/protocols/oscar/oscar.c:4589
 msgid "Away message too long."
 msgstr "Poissaoloviesti on liian pitkä."
 
-#: ../libpurple/protocols/oscar/oscar.c:4662
 #, c-format
 msgid ""
 "Could not add the buddy %s because the username is invalid.  Usernames must "
@@ -9540,17 +6782,12 @@
 "tulee olla oikea sähköpostiosoite, tai alkaa kirjaimella ja sisältää vain "
 "kirjaimia, numeroita ja välilyöntejä, tai sisältää vain numeroita."
 
-#: ../libpurple/protocols/oscar/oscar.c:4664
-#: ../libpurple/protocols/oscar/oscar.c:5139
-#: ../libpurple/protocols/oscar/oscar.c:5154
 msgid "Unable To Add"
 msgstr "Lisääminen epäonnistui"
 
-#: ../libpurple/protocols/oscar/oscar.c:4783
 msgid "Unable To Retrieve Buddy List"
 msgstr "Tuttavien nouto ei onnistunut"
 
-#: ../libpurple/protocols/oscar/oscar.c:4784
 msgid ""
 "The AIM servers were temporarily unable to send your buddy list.  Your buddy "
 "list is not lost, and will probably become available in a few minutes."
@@ -9559,15 +6796,9 @@
 "Tuttavasi eivät ole kadonneet, ne tulevat luultavasti näkyville muutamassa "
 "minuutissa."
 
-#: ../libpurple/protocols/oscar/oscar.c:4980
-#: ../libpurple/protocols/oscar/oscar.c:4982
-#: ../libpurple/protocols/oscar/oscar.c:5221
-#: ../libpurple/protocols/oscar/oscar.c:5222
-#: ../libpurple/protocols/oscar/oscar.c:5227
 msgid "Orphans"
 msgstr "Orvot"
 
-#: ../libpurple/protocols/oscar/oscar.c:5137
 #, c-format
 msgid ""
 "Could not add the buddy %s because you have too many buddies in your buddy "
@@ -9576,17 +6807,13 @@
 "Tuttavaa %s ei voi lisätä koska tuttaviasi on liian monta. Ole hyvä ja "
 "poista joku ja yritä uudelleen."
 
-#: ../libpurple/protocols/oscar/oscar.c:5137
-#: ../libpurple/protocols/oscar/oscar.c:5152
 msgid "(no name)"
 msgstr "(nimetön)"
 
-#: ../libpurple/protocols/oscar/oscar.c:5151
 #, c-format
 msgid "Could not add the buddy %s for an unknown reason."
 msgstr "Tuttavaa %s ei voi lisätä tuntemattomasta syystä."
 
-#: ../libpurple/protocols/oscar/oscar.c:5285
 #, c-format
 msgid ""
 "The user %s has given you permission to add him or her to your buddy list.  "
@@ -9595,22 +6822,18 @@
 "Käyttäjä %s on antanut sinulle luvan lisätä hänet tuttaviisi.  Haluatko "
 "lisätä tämän käyttäjän?"
 
-#: ../libpurple/protocols/oscar/oscar.c:5293
 msgid "Authorization Given"
 msgstr "Valtuutus annettu"
 
 #. Granted
-#: ../libpurple/protocols/oscar/oscar.c:5366
 #, c-format
 msgid "The user %s has granted your request to add them to your buddy list."
 msgstr "Käyttäjä %s on hyväksynyt pyyntösi lisätä hänet tuttaviisi."
 
-#: ../libpurple/protocols/oscar/oscar.c:5367
 msgid "Authorization Granted"
 msgstr "Valtuutus hyväksytty"
 
 #. Denied
-#: ../libpurple/protocols/oscar/oscar.c:5370
 #, c-format
 msgid ""
 "The user %s has denied your request to add them to your buddy list for the "
@@ -9620,49 +6843,31 @@
 "Käyttäjä %s on evännyt pyyntösi lisätä hänet tuttaviisi seuraavasta syystä:\n"
 "%s"
 
-#: ../libpurple/protocols/oscar/oscar.c:5371
 msgid "Authorization Denied"
 msgstr "Valtuutus evätty"
 
-#: ../libpurple/protocols/oscar/oscar.c:5407
-#: ../libpurple/protocols/toc/toc.c:1371
 msgid "_Exchange:"
 msgstr "_Vaihto:"
 
-#: ../libpurple/protocols/oscar/oscar.c:5520
 msgid "Your IM Image was not sent. You cannot send IM Images in AIM chats."
 msgstr ""
 "Pikaviestikuvaasi ei lähetetty. Et voi lähettää pikaviestikuvia AIM- "
 "ryhmäkeskustelussa."
 
-#: ../libpurple/protocols/oscar/oscar.c:5682
-#: ../libpurple/protocols/oscar/oscar.c:5687
-msgid "Away Message"
-msgstr "Poissaoloviesti"
-
-#: ../libpurple/protocols/oscar/oscar.c:5687
-msgid "<i>(retrieving)</i>"
-msgstr "<i>(vastaanotetaan)</i>"
-
-#: ../libpurple/protocols/oscar/oscar.c:5887
 msgid "iTunes Music Store Link"
 msgstr "iTunes-musiikkikauppalinkki"
 
-#: ../libpurple/protocols/oscar/oscar.c:5995
 #, c-format
 msgid "Buddy Comment for %s"
 msgstr "Tuttavakommentti käyttäjälle %s"
 
-#: ../libpurple/protocols/oscar/oscar.c:5996
 msgid "Buddy Comment:"
 msgstr "Kommentti"
 
-#: ../libpurple/protocols/oscar/oscar.c:6043
 #, c-format
 msgid "You have selected to open a Direct IM connection with %s."
 msgstr "Olet päättänyt avata suoran pikaviestiyhteyden %s:n kanssa."
 
-#: ../libpurple/protocols/oscar/oscar.c:6047
 msgid ""
 "Because this reveals your IP address, it may be considered a security risk.  "
 "Do you wish to continue?"
@@ -9670,66 +6875,50 @@
 "Koska tämä paljastaa IP-osoitteesi, sitä voidaan pitää turvallisuusriskinä.  "
 "Haluatko jatkaa?"
 
-#: ../libpurple/protocols/oscar/oscar.c:6053
-#: ../libpurple/protocols/oscar/peer.c:1047
 msgid "C_onnect"
 msgstr "Y_hdistä"
 
-#: ../libpurple/protocols/oscar/oscar.c:6088
 msgid "Get AIM Info"
 msgstr "Hae AIM-tiedot"
 
-#: ../libpurple/protocols/oscar/oscar.c:6094
 msgid "Edit Buddy Comment"
 msgstr "Muokkaa kommenttia"
 
-#: ../libpurple/protocols/oscar/oscar.c:6102
 msgid "Get Status Msg"
 msgstr "Hae tilaviesti"
 
-#: ../libpurple/protocols/oscar/oscar.c:6115
 msgid "Direct IM"
 msgstr "Suora pikaviesti"
 
-#: ../libpurple/protocols/oscar/oscar.c:6137
 msgid "Re-request Authorization"
 msgstr "Pyydä valtuutus uudelleen"
 
-#: ../libpurple/protocols/oscar/oscar.c:6196
 msgid "Require authorization"
 msgstr "Pyydä valtuutusta"
 
-#: ../libpurple/protocols/oscar/oscar.c:6199
 msgid "Web aware (enabling this will cause you to receive SPAM!)"
 msgstr "Web-tietoinen (tämän käyttö altistaa sinut roskaposteille)"
 
-#: ../libpurple/protocols/oscar/oscar.c:6204
 msgid "ICQ Privacy Options"
 msgstr "ICQ-yksityisyysvalinnat"
 
-#: ../libpurple/protocols/oscar/oscar.c:6224
 msgid "The new formatting is invalid."
 msgstr "Uusi muotoilu on virheellinen."
 
-#: ../libpurple/protocols/oscar/oscar.c:6225
 msgid "Username formatting can change only capitalization and whitespace."
 msgstr ""
 "Käyttäjänimen muotoilu voi vaikuttaa ainoastaan alkukirjaimeen sekä "
 "välilyönteihin."
 
-#: ../libpurple/protocols/oscar/oscar.c:6278
 msgid "Change Address To:"
 msgstr "Vaihda osoite:"
 
-#: ../libpurple/protocols/oscar/oscar.c:6324
 msgid "<i>you are not waiting for authorization</i>"
 msgstr "<i>Et odota valtuutusta</i>"
 
-#: ../libpurple/protocols/oscar/oscar.c:6327
 msgid "You are awaiting authorization from the following buddies"
 msgstr "Odotat valtuutusta seuraavilta tuttavilta"
 
-#: ../libpurple/protocols/oscar/oscar.c:6328
 msgid ""
 "You can re-request authorization from these buddies by right-clicking on "
 "them and selecting \"Re-request Authorization.\""
@@ -9737,65 +6926,50 @@
 "Voit pyytää valtuutuksen uudelleen näiltä tuttavilta napsauttamalla oikeaa "
 "nappia heihin ja valitsemalla \"Pyydä valtuutus uudelleen\"."
 
-#: ../libpurple/protocols/oscar/oscar.c:6345
 msgid "Find Buddy by Email"
 msgstr "Etsi tuttava sähköpostiosoitteen perusteella"
 
-#: ../libpurple/protocols/oscar/oscar.c:6346
 msgid "Search for a buddy by email address"
 msgstr "Etsi tuttava sähköpostiosoitteen perusteella"
 
-#: ../libpurple/protocols/oscar/oscar.c:6347
 msgid "Type the email address of the buddy you are searching for."
 msgstr "Syötä etsimäsi tuttavan sähköpostiosoite."
 
-#: ../libpurple/protocols/oscar/oscar.c:6350
 msgid "_Search"
 msgstr "_Etsi"
 
-#: ../libpurple/protocols/oscar/oscar.c:6508
 msgid "Set User Info (web)..."
 msgstr "Aseta käyttäjätiedot (WWW)..."
 
-#: ../libpurple/protocols/oscar/oscar.c:6519
 msgid "Change Password (web)"
 msgstr "Vaihda salasana (WWW)"
 
-#: ../libpurple/protocols/oscar/oscar.c:6523
 msgid "Configure IM Forwarding (web)"
 msgstr "Aseta pikaviestien edelleenlähetys (WWW)"
 
 #. ICQ actions
-#: ../libpurple/protocols/oscar/oscar.c:6533
 msgid "Set Privacy Options..."
 msgstr "Aseta yksityisyysvalinnat..."
 
 #. AIM actions
-#: ../libpurple/protocols/oscar/oscar.c:6540
 msgid "Confirm Account"
 msgstr "Vahvista tili"
 
-#: ../libpurple/protocols/oscar/oscar.c:6544
 msgid "Display Currently Registered Email Address"
 msgstr "Näytä tällä hetkellä rekisteröity sähköpostiosoite"
 
-#: ../libpurple/protocols/oscar/oscar.c:6548
 msgid "Change Currently Registered Email Address..."
 msgstr "Muuta tällä hetkellä rekisteröityä sähköpostiosoitetta..."
 
-#: ../libpurple/protocols/oscar/oscar.c:6555
 msgid "Show Buddies Awaiting Authorization"
 msgstr "Näytä tuttavat jotka odottavat valtuutusta"
 
-#: ../libpurple/protocols/oscar/oscar.c:6561
 msgid "Search for Buddy by Email Address..."
 msgstr "Etsi tuttavaa sähköpostiosoitteen perusteella..."
 
-#: ../libpurple/protocols/oscar/oscar.c:6566
 msgid "Search for Buddy by Information"
 msgstr "Etsi tuttavaa tietojen perusteella"
 
-#: ../libpurple/protocols/oscar/oscar.c:6754
 msgid ""
 "Always use AIM/ICQ proxy server for\n"
 "file transfers and direct IM (slower,\n"
@@ -9806,28 +6980,26 @@
 "viesteihin (hitaampi, mutta ei\n"
 "paljasta IP-osoitettasi)"
 
-#: ../libpurple/protocols/oscar/peer.c:699
+msgid "Allow multiple simultaneous logins"
+msgstr "Salli useat samanaikaiset kirjautumiset"
+
 #, c-format
 msgid "Asking %s to connect to us at %s:%hu for Direct IM."
 msgstr ""
 "Pyydetään %s yhdistämään meihin at %s:%hu suoraa pikaviestiyhteyttä varten."
 
-#: ../libpurple/protocols/oscar/peer.c:784
 #, c-format
 msgid "Attempting to connect to %s:%hu."
 msgstr "Yritetään yhdistää kohteeseen %s:%hu."
 
-#: ../libpurple/protocols/oscar/peer.c:858
 #, c-format
 msgid "Attempting to connect via proxy server."
 msgstr "Yritetään yhdistämistä välipalvelimen kautta."
 
-#: ../libpurple/protocols/oscar/peer.c:1035
 #, c-format
 msgid "%s has just asked to directly connect to %s"
 msgstr "%s on juuri pyytänyt suoraa yhteyttä %s:n"
 
-#: ../libpurple/protocols/oscar/peer.c:1039
 msgid ""
 "This requires a direct connection between the two computers and is necessary "
 "for IM Images.  Because your IP address will be revealed, this may be "
@@ -9837,168 +7009,126 @@
 "lähetettäessä kuvia. Koska IP-osoitteesi paljastuu, tätä voi pitää "
 "yksityisyysriskinä."
 
-#: ../libpurple/protocols/qq/buddy_info.c:39
 msgid "Primary Information"
 msgstr "Ensisijaiset tiedot"
 
-#: ../libpurple/protocols/qq/buddy_info.c:41
 msgid "Personal Introduction"
 msgstr "Henkilökohtainen esittely"
 
-#: ../libpurple/protocols/qq/buddy_info.c:42
 msgid "QQ Number"
 msgstr "QQ-numero"
 
-#: ../libpurple/protocols/qq/buddy_info.c:47
 msgid "Country/Region"
 msgstr "Maa/alue"
 
-#: ../libpurple/protocols/qq/buddy_info.c:48
 msgid "Province/State"
 msgstr "Lääni/osavaltio"
 
-#: ../libpurple/protocols/qq/buddy_info.c:50
 msgid "Horoscope Symbol"
 msgstr "Horoskooppimerkki"
 
-#: ../libpurple/protocols/qq/buddy_info.c:52
 msgid "Zodiac Sign"
 msgstr "Eläinradan merkki"
 
-#: ../libpurple/protocols/qq/buddy_info.c:53
 msgid "Blood Type"
 msgstr "Veriryhmä"
 
-#: ../libpurple/protocols/qq/buddy_info.c:54
 msgid "College"
 msgstr "Yliopisto"
 
-#: ../libpurple/protocols/qq/buddy_info.c:57
 msgid "Zipcode"
 msgstr "Postinumero"
 
-#: ../libpurple/protocols/qq/buddy_info.c:58
 msgid "Cellphone Number"
 msgstr "Matkapuhelinnumero"
 
-#: ../libpurple/protocols/qq/buddy_info.c:59
 msgid "Phone Number"
 msgstr "Puhelinnumero"
 
-#: ../libpurple/protocols/qq/buddy_info.c:64
 msgid "Aquarius"
 msgstr "vesimies"
 
-#: ../libpurple/protocols/qq/buddy_info.c:64
 msgid "Pisces"
 msgstr "kalat"
 
-#: ../libpurple/protocols/qq/buddy_info.c:64
 msgid "Aries"
 msgstr "oinas"
 
-#: ../libpurple/protocols/qq/buddy_info.c:64
 msgid "Taurus"
 msgstr "härkä"
 
-#: ../libpurple/protocols/qq/buddy_info.c:65
 msgid "Gemini"
 msgstr "kaksoset"
 
-#: ../libpurple/protocols/qq/buddy_info.c:65
 msgid "Cancer"
 msgstr "rapu"
 
-#: ../libpurple/protocols/qq/buddy_info.c:65
 msgid "Leo"
 msgstr "leijona"
 
-#: ../libpurple/protocols/qq/buddy_info.c:65
 msgid "Virgo"
 msgstr "neitsyt"
 
-#: ../libpurple/protocols/qq/buddy_info.c:65
 msgid "Libra"
 msgstr "vaaka"
 
-#: ../libpurple/protocols/qq/buddy_info.c:66
 msgid "Scorpio"
 msgstr "skorpioni"
 
-#: ../libpurple/protocols/qq/buddy_info.c:66
 msgid "Sagittarius"
 msgstr "jousimies"
 
-#: ../libpurple/protocols/qq/buddy_info.c:66
 msgid "Capricorn"
 msgstr "kauris"
 
-#: ../libpurple/protocols/qq/buddy_info.c:71
 msgid "Rat"
 msgstr "rotta"
 
-#: ../libpurple/protocols/qq/buddy_info.c:71
 msgid "Ox"
 msgstr "härkä"
 
-#: ../libpurple/protocols/qq/buddy_info.c:71
 msgid "Tiger"
 msgstr "tiikeri"
 
-#: ../libpurple/protocols/qq/buddy_info.c:71
 msgid "Rabbit"
 msgstr "jänis"
 
-#: ../libpurple/protocols/qq/buddy_info.c:72
 msgid "Dragon"
 msgstr "lohikäärme"
 
-#: ../libpurple/protocols/qq/buddy_info.c:72
 msgid "Snake"
 msgstr "käärme"
 
-#: ../libpurple/protocols/qq/buddy_info.c:72
 msgid "Horse"
 msgstr "hevonen"
 
-#: ../libpurple/protocols/qq/buddy_info.c:72
 msgid "Goat"
 msgstr "vuohi"
 
-#: ../libpurple/protocols/qq/buddy_info.c:72
 msgid "Monkey"
 msgstr "apina"
 
-#: ../libpurple/protocols/qq/buddy_info.c:73
 msgid "Rooster"
 msgstr "kukko"
 
-#: ../libpurple/protocols/qq/buddy_info.c:73
 msgid "Dog"
 msgstr "koira"
 
-#: ../libpurple/protocols/qq/buddy_info.c:73
 msgid "Pig"
 msgstr "sika"
 
-#: ../libpurple/protocols/qq/buddy_info.c:78
 msgid "Other"
 msgstr "Muu"
 
-#: ../libpurple/protocols/qq/buddy_info.c:522
-#: ../libpurple/protocols/qq/buddy_info.c:523
 msgid "Modify my information"
 msgstr "Muokkaa tietojani"
 
-#: ../libpurple/protocols/qq/buddy_info.c:524
 msgid "Update my information"
 msgstr "Päivitä tietoni"
 
-#: ../libpurple/protocols/qq/buddy_info.c:548
 msgid "Your information has been updated"
 msgstr "Tietosi on päivitetty"
 
-#: ../libpurple/protocols/qq/buddy_info.c:601
 #, c-format
 msgid ""
 "Setting custom faces is not currently supported. Please choose an image from "
@@ -10006,218 +7136,153 @@
 msgstr ""
 "Omien kuvien asettaminen ei ole tällä hetkellä tuettua. Valitse kuva: %s."
 
-#: ../libpurple/protocols/qq/buddy_info.c:618
-#: ../libpurple/protocols/qq/buddy_info.c:631
 msgid "Invalid QQ Face"
 msgstr "Epäkelpo QQ-kuva (face)"
 
-#: ../libpurple/protocols/qq/buddy_opt.c:208
-#: ../libpurple/protocols/qq/group_opt.c:112
 #, c-format
 msgid "You rejected %d's request"
 msgstr "Kieltäydyit %d:n pyynnöstä"
 
-#: ../libpurple/protocols/qq/buddy_opt.c:209
 msgid "Input your reason:"
 msgstr "Anna syy:"
 
-#: ../libpurple/protocols/qq/buddy_opt.c:212
 msgid "Reject request"
 msgstr "Kieltäydy pyynnöstä"
 
 #. title
-#: ../libpurple/protocols/qq/buddy_opt.c:213
-#: ../libpurple/protocols/qq/group_opt.c:117
 msgid "Sorry, you are not my type..."
 msgstr "Pahoittelut, en ole kiinnostunut..."
 
-#: ../libpurple/protocols/qq/buddy_opt.c:277
 msgid "Add buddy with auth request failed"
 msgstr "Lisää tuttava jolla on epäonnistunut valtuutuspyyntö"
 
 #. TODO: We don't really need to notify the user about this, do we?
-#: ../libpurple/protocols/qq/buddy_opt.c:309
 msgid "You have successfully removed a buddy"
 msgstr "Tuttava poistettu onnistuneesti"
 
 #. TODO: Does the user really need to be notified about this?
-#: ../libpurple/protocols/qq/buddy_opt.c:338
 msgid "You have successfully removed yourself from your friend's buddy list"
 msgstr "Sinut on onnistuneesti poistettu kaverisi tuttavista"
 
-#: ../libpurple/protocols/qq/buddy_opt.c:404
 #, c-format
 msgid "User %d needs authentication"
 msgstr "Käyttäjä %d tarvitsee valtuutuksen"
 
-#: ../libpurple/protocols/qq/buddy_opt.c:406
-#: ../libpurple/protocols/qq/group_join.c:136
 msgid "Input request here"
 msgstr "Anna syy tähän"
 
 #. TODO: Awkward string to fix post string freeze - standardize auth dialogues? -evands
-#: ../libpurple/protocols/qq/buddy_opt.c:407
-#: ../libpurple/protocols/qq/group_join.c:137
 msgid "Would you be my friend?"
 msgstr "Haluaisitko olla kaverini?"
 
 #. multiline
 #. masked
 #. hint
-#: ../libpurple/protocols/qq/buddy_opt.c:408
-#: ../libpurple/protocols/qq/group_join.c:138
-#: ../libpurple/protocols/qq/group_opt.c:119
 msgid "Send"
 msgstr "Lähetä"
 
-#: ../libpurple/protocols/qq/buddy_opt.c:418
 #, c-format
 msgid "You have added %d to buddy list"
 msgstr "Käyttäjä %d lisätty tuttaviisi"
 
-#: ../libpurple/protocols/qq/buddy_opt.c:515
 msgid "QQid Error"
 msgstr "QQid-virhe"
 
-#: ../libpurple/protocols/qq/buddy_opt.c:516
 msgid "Invalid QQid"
 msgstr "Epäkelpo QQid"
 
-#: ../libpurple/protocols/qq/group.c:65
 msgid "ID: "
 msgstr "Tunniste (ID): "
 
-#: ../libpurple/protocols/qq/group.c:98
 msgid "Group ID"
 msgstr "Ryhmätunniste (ID):"
 
-#: ../libpurple/protocols/qq/group.c:100
 msgid "Creator"
 msgstr "Luoja"
 
-#: ../libpurple/protocols/qq/group.c:103
 msgid "Group Description"
 msgstr "Ryhmän kuvaus"
 
-#: ../libpurple/protocols/qq/group.c:109
 msgid "Auth"
 msgstr "Valtuutus"
 
-#: ../libpurple/protocols/qq/group.c:119
 msgid "QQ Qun"
 msgstr "QQ Qun"
 
-#: ../libpurple/protocols/qq/group.c:120
 msgid "Please enter external group ID"
 msgstr "Syötä ulkopuolisen ryhmän tunniste (ID)"
 
-#: ../libpurple/protocols/qq/group.c:121
 msgid "You can only search for permanent QQ groups\n"
 msgstr "Voit etsiä vain pysyviä QQ-ryhmiä\n"
 
-#: ../libpurple/protocols/qq/group_im.c:126
 #, c-format
 msgid "User %d requested to join group %d"
 msgstr "Käyttäjä %d haki ryhmän %d jäsenyyttä"
 
-#: ../libpurple/protocols/qq/group_im.c:127
-#: ../libpurple/protocols/qq/group_im.c:181
-#: ../libpurple/protocols/qq/sys_msg.c:196
 #, c-format
 msgid "Reason: %s"
 msgstr "Syy: %s"
 
-#: ../libpurple/protocols/qq/group_im.c:136
-#: ../libpurple/protocols/qq/group_im.c:183
-#: ../libpurple/protocols/qq/group_im.c:223
-#: ../libpurple/protocols/qq/group_im.c:258
-#: ../libpurple/protocols/qq/group_im.c:292
-#: ../libpurple/protocols/qq/group_join.c:233
-#: ../libpurple/protocols/qq/group_join.c:359
-#: ../libpurple/protocols/qq/group_opt.c:211
-#: ../libpurple/protocols/qq/group_opt.c:281
-#: ../libpurple/protocols/qq/group_opt.c:367
 msgid "QQ Qun Operation"
 msgstr "QQ Qun -toiminta"
 
-#: ../libpurple/protocols/qq/group_im.c:141
-#: ../libpurple/protocols/qq/group_opt.c:104
-#: ../libpurple/protocols/qq/sys_msg.c:92
-#: ../libpurple/protocols/qq/sys_msg.c:251
 msgid "Approve"
 msgstr "Hyväksy"
 
-#: ../libpurple/protocols/qq/group_im.c:180
 #, c-format
 msgid "Your request to join group %d has been rejected by admin %d"
 msgstr "Pyyntösi liittyä ryhmään %d evättiin ylläpitäjän %d toimesta"
 
-#: ../libpurple/protocols/qq/group_im.c:221
 #, c-format
 msgid "Your request to join group %d has been approved by admin %d"
 msgstr "Pyyntösi liittyä ryhmään %d hyväksyttiin ylläpitäjän %d toimesta"
 
-#: ../libpurple/protocols/qq/group_im.c:257
 #, c-format
 msgid "You [%d] have left group \"%d\""
 msgstr "Sinä [%d] olet poistunut ryhmästä \"%d\""
 
-#: ../libpurple/protocols/qq/group_im.c:291
 #, c-format
 msgid "You [%d] have been added to group \"%d\""
 msgstr "Sinä [%d] olet lisätty ryhmään \"%d\""
 
-#: ../libpurple/protocols/qq/group_im.c:292
 msgid "This group has been added to your buddy list"
 msgstr "Tämä ryhmä on lisätty tuttaviisi"
 
-#: ../libpurple/protocols/qq/group_internal.c:41
 msgid "I am not a member"
 msgstr "En ole jäsen"
 
-#: ../libpurple/protocols/qq/group_internal.c:44
 msgid "I am a member"
 msgstr "Olen jäsen"
 
-#: ../libpurple/protocols/qq/group_internal.c:47
 msgid "I am applying to join"
 msgstr "Pyydän liittymistä"
 
-#: ../libpurple/protocols/qq/group_internal.c:50
 msgid "I am the admin"
 msgstr "Olen ylläpitäjä"
 
-#: ../libpurple/protocols/qq/group_internal.c:53
 msgid "Unknown status"
 msgstr "Tuntematon tila"
 
-#: ../libpurple/protocols/qq/group_join.c:82
 msgid "This group does not allow others to join"
 msgstr "Tämä ryhmä ei salli muiden liittyä"
 
-#: ../libpurple/protocols/qq/group_join.c:233
 msgid "You have successfully left the group"
 msgstr "Ryhmästä poistuminen onnistui"
 
-#: ../libpurple/protocols/qq/group_join.c:257
 msgid "QQ Group Auth"
 msgstr "QQ-ryhmän valtuutus"
 
-#: ../libpurple/protocols/qq/group_join.c:258
 msgid "Your authorization request has been accepted by the QQ server"
 msgstr "QQ-palvelin on hyväksynyt valtuutuspyyntösi"
 
-#: ../libpurple/protocols/qq/group_join.c:329
 msgid "You entered a group ID outside the acceptable range"
 msgstr ""
 "Olet syöttänyt ryhmätunnisteen (ID) joka ei ole hyväksyttävällä "
 "vaihteluvälillä"
 
-#: ../libpurple/protocols/qq/group_join.c:360
 msgid "Are you sure you want to leave this Qun?"
 msgstr "Haluatko varmasti poistua tästä Qunista?"
 
-#: ../libpurple/protocols/qq/group_join.c:362
 msgid ""
 "Note, if you are the creator, \n"
 "this operation will eventually remove this Qun."
@@ -10225,161 +7290,130 @@
 "Huomaa, että olet samalla Qunin luoja, \n"
 "Tämä toiminto poistaa lopulta tämän Qunin."
 
-#: ../libpurple/protocols/qq/group_network.c:92
 #, c-format
 msgid "Code [0x%02X]: %s"
 msgstr "Koodi [0x%02X]: %s"
 
-#: ../libpurple/protocols/qq/group_network.c:93
 msgid "Group Operation Error"
 msgstr "Ryhmätoimintovirhe"
 
 #. we want to see window
-#: ../libpurple/protocols/qq/group_opt.c:99
-#: ../libpurple/protocols/qq/sys_msg.c:87
 msgid "Do you want to approve the request?"
 msgstr "Haluatko hyväksyä pyynnön?"
 
-#: ../libpurple/protocols/qq/group_opt.c:113
 msgid "Enter your reason:"
 msgstr "Anna syy:"
 
-#: ../libpurple/protocols/qq/group_opt.c:211
 msgid "You have successfully modified Qun member"
 msgstr "Qun-jäsentä muokattu onnistuneesti"
 
-#: ../libpurple/protocols/qq/group_opt.c:281
 msgid "You have successfully modified Qun information"
 msgstr "Qun-tietojen muokkaus onnistui"
 
-#: ../libpurple/protocols/qq/group_opt.c:368
 msgid "You have successfully created a Qun"
 msgstr "Qun:n luonti onnistui"
 
-#: ../libpurple/protocols/qq/group_opt.c:370
 msgid "Would you like to set up the Qun details now?"
 msgstr "Haluatko asettaa Qun:n yksityiskohdat nyt?"
 
-#: ../libpurple/protocols/qq/group_opt.c:374
 msgid "Setup"
 msgstr "Asetukset"
 
-#: ../libpurple/protocols/qq/im.c:432
 msgid "System Message"
 msgstr "Järjestelmäviesti"
 
 # c-format
-#: ../libpurple/protocols/qq/im.c:576
 msgid "Failed to send IM."
 msgstr "Viestin lähettäminen epäonnistui."
 
-#: ../libpurple/protocols/qq/keep_alive.c:88
-msgid "Keep alive error"
-msgstr "Jatkuvan yhteydenpidon virhe"
-
-#: ../libpurple/protocols/qq/login_logout.c:408
-msgid "Error requesting login token"
-msgstr "Virhe pyydettäessä kirjautumispolettia"
-
-#: ../libpurple/protocols/qq/login_logout.c:490
-msgid "Unable to login. Check debug log."
-msgstr "Ei voi kirjautua. Tarkista virheenjäljitysloki."
-
-#: ../libpurple/protocols/qq/login_logout.c:493
-msgid "Unable to login"
-msgstr "Ei voi kirjautua"
-
-#. we didn't successfully connect. tdt->toc_fd is valid here
-#: ../libpurple/protocols/qq/qq.c:140 ../libpurple/protocols/toc/toc.c:173
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:158
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:238
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:1195
-#: ../libpurple/protocols/yahoo/ycht.c:550
-msgid "Unable to connect."
-msgstr "Yhteyden muodostaminen epäonnistui."
-
-#: ../libpurple/protocols/qq/qq.c:187
 #, c-format
 msgid "Unknown-%d"
 msgstr "Tuntematon-%d"
 
-#: ../libpurple/protocols/qq/qq.c:212
-msgid "TCP Address"
-msgstr "TCP-osoite"
-
-#: ../libpurple/protocols/qq/qq.c:214
-msgid "UDP Address"
-msgstr "UDP-osoite"
-
-#: ../libpurple/protocols/qq/qq.c:243
 msgid "Level"
 msgstr "Taso"
 
-#: ../libpurple/protocols/qq/qq.c:374
+msgid "Member"
+msgstr "Jäsen"
+
+msgid " VIP"
+msgstr " VIP"
+
+msgid " TCP"
+msgstr " TCP"
+
+msgid " FromMobile"
+msgstr " FromMobile"
+
+msgid " BindMobile"
+msgstr " BindMobile"
+
+msgid " Video"
+msgstr " Video"
+
+msgid " Space"
+msgstr " Space"
+
+msgid "Flag"
+msgstr "Lippu"
+
+msgid "Ver"
+msgstr "Ver"
+
 msgid "Invalid name"
 msgstr "Epäkelpo nimi"
 
-#: ../libpurple/protocols/qq/qq.c:440
 #, c-format
 msgid "<b>Current Online</b>: %d<br>\n"
 msgstr "<b>Parhaillaan kirjautuneena</b>: %d<br>\n"
 
-#: ../libpurple/protocols/qq/qq.c:441
 #, c-format
 msgid "<b>Last Refresh</b>: %s<br>\n"
 msgstr "<b>Viimeisin päivitys:</b> %s<br>\n"
 
-#: ../libpurple/protocols/qq/qq.c:445
+#, c-format
+msgid "<b>Server</b>: %s: %d<br>\n"
+msgstr "<b>Palvelin:</b>: %s: %d<br>\n"
+
 #, c-format
 msgid "<b>Connection Mode</b>: %s<br>\n"
 msgstr "<b>Yhteystila</b>: %s<br>\n"
 
-#: ../libpurple/protocols/qq/qq.c:446
-#, c-format
-msgid "<b>Server IP</b>: %s: %d<br>\n"
-msgstr "<b>Palvelimen IP:</b>: %s: %d<br>\n"
-
-#: ../libpurple/protocols/qq/qq.c:447
+#, c-format
+msgid "<b>Real hostname</b>: %s: %d<br>\n"
+msgstr "<b>Todellinen palvelinnimi:</b>: %s: %d<br>\n"
+
 #, c-format
 msgid "<b>My Public IP</b>: %s<br>\n"
 msgstr "<b>Oma julkinen IP</b>: %s<br>\n"
 
-#: ../libpurple/protocols/qq/qq.c:452
 #, c-format
 msgid "<b>Login Time</b>: %s<br>\n"
 msgstr "<b>Kirjautumisaika</b>: %s<br>\n"
 
-#: ../libpurple/protocols/qq/qq.c:453
 #, c-format
 msgid "<b>Last Login IP</b>: %s<br>\n"
 msgstr "<b>Viimeisimmän kirjautumisen IP</b>: %s<br>\n"
 
-#: ../libpurple/protocols/qq/qq.c:454
 #, c-format
 msgid "<b>Last Login Time</b>: %s\n"
 msgstr "<b>Viimeisin kirjautumisaika:</b>: %s\n"
 
-#: ../libpurple/protocols/qq/qq.c:458
 msgid "Login Information"
 msgstr "Kirjautumistietoja"
 
-#: ../libpurple/protocols/qq/qq.c:534
 msgid "Set My Information"
 msgstr "Aseta omat tiedot"
 
-#: ../libpurple/protocols/qq/qq.c:537 ../libpurple/protocols/toc/toc.c:1680
 msgid "Change Password"
 msgstr "Vaihda salasana"
 
-#: ../libpurple/protocols/qq/qq.c:540
 msgid "Show Login Information"
 msgstr "Näytä kirjautumistiedot"
 
-#: ../libpurple/protocols/qq/qq.c:561
 msgid "Leave this QQ Qun"
 msgstr "Poistu tästä QQ-Qunista"
 
-#: ../libpurple/protocols/qq/qq.c:585
 msgid "Block this buddy"
 msgstr "Estä tämä tuttava"
 
@@ -10393,223 +7427,231 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/qq/qq.c:726 ../libpurple/protocols/qq/qq.c:728
 msgid "QQ Protocol\tPlugin"
 msgstr "QQ-yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/qq/qq.c:753
 msgid "Connect using TCP"
 msgstr "Yhdistetään käyttäen TCP:tä"
 
-#: ../libpurple/protocols/qq/recv_core.c:310
+msgid "resend interval(s)"
+msgstr "uudelleenlähetyksen aikaväli (s)"
+
+msgid "Keep alive interval(s)"
+msgstr "Jatkuvan yhteydenpidon aikaväli (s)"
+
+msgid "Update interval(s)"
+msgstr "Päivitysten aikaväli (s)"
+
+#, c-format
+msgid "Invalid token len, %d"
+msgstr "Epäkelpo poletin pituus, %d"
+
+msgid "Keep alive error"
+msgstr "Jatkuvan yhteydenpidon virhe"
+
+msgid "Failed to connect server"
+msgstr "Palvelimeen ei saatu yhteyttä"
+
 msgid "Socket error"
 msgstr "Pistokevirhe"
 
-#: ../libpurple/protocols/qq/recv_core.c:321
+#, c-format
+msgid ""
+"Lost connection with server:\n"
+"%d, %s"
+msgstr ""
+"Yhteys palvelimeen katkesi:\n"
+"%d, %s"
+
 msgid "Unable to read from socket"
 msgstr "Ei kyetty lukemaan pistoketta"
 
-#: ../libpurple/protocols/qq/send_file.c:707
+msgid "Write Error"
+msgstr "Virhe kirjoituksessa"
+
+msgid "Connection lost"
+msgstr "Yhteys katkesi"
+
+msgid "Couldn't resolve host"
+msgstr "Yhteyttä isäntään ei voi löytää"
+
+msgid "hostname is NULL or port is 0"
+msgstr "isäntänimi on NULL tai portti on 0"
+
+#, c-format
+msgid "Connecting server %s, retries %d"
+msgstr "Yhdistetään palvelimelle %s, uudelleenyrityskerrat %d"
+
+#. we didn't successfully connect. tdt->toc_fd is valid here
+msgid "Unable to connect."
+msgstr "Yhteyden muodostaminen epäonnistui."
+
+msgid "Could not resolve hostname"
+msgstr "Isäntänimeä ei voi selvittää"
+
+msgid "Unable to login. Check debug log."
+msgstr "Ei voi kirjautua. Tarkista virheenjäljitysloki."
+
+msgid "Unable to login"
+msgstr "Ei voi kirjautua"
+
+#, c-format
+msgid "Invalid token reply code, 0x%02X"
+msgstr "Epäkelpo poletin vastauskoodi, 0x%02X"
+
 #, c-format
 msgid "%d has declined the file %s"
 msgstr "%d on kieltäytynyt tiedostosta %s"
 
-#: ../libpurple/protocols/qq/send_file.c:710
-#: ../libpurple/protocols/qq/send_file.c:739
 msgid "File Send"
 msgstr "Tiedoston lähetys"
 
-#: ../libpurple/protocols/qq/send_file.c:736
 #, c-format
 msgid "%d canceled the transfer of %s"
 msgstr "%d peruutti tiedoston %s siirron"
 
-#: ../libpurple/protocols/qq/sendqueue.c:124
-msgid "Connection lost"
-msgstr "Yhteys katkesi"
-
-#: ../libpurple/protocols/qq/sendqueue.c:133
-msgid "Login failed, no reply"
-msgstr "Kirjautuminen epäonnistui, ei vastausta"
-
-#: ../libpurple/protocols/qq/sys_msg.c:111
 msgid "Do you want to add this buddy?"
 msgstr "Haluatko lisätä tämän tuttavan?"
 
 #. only need to get value
-#: ../libpurple/protocols/qq/sys_msg.c:168
 #, c-format
 msgid "You have been added by %s"
 msgstr "Sinut on lisännyt %s"
 
-#: ../libpurple/protocols/qq/sys_msg.c:171
-#: ../libpurple/protocols/qq/sys_msg.c:266
 msgid "Would you like to add him?"
 msgstr "Haluatko lisätä hänet?"
 
-#: ../libpurple/protocols/qq/sys_msg.c:179
 #, c-format
 msgid "%s has added you [%s] to his or her buddy list"
 msgstr "Käyttäjä %s on lisännyt sinut [%s] tuttaviisi"
 
-#: ../libpurple/protocols/qq/sys_msg.c:195
 #, c-format
 msgid "User %s rejected your request"
 msgstr "Käyttäjä %s on kieltäytynyt pyynnöstäsi"
 
-#: ../libpurple/protocols/qq/sys_msg.c:215
 #, c-format
 msgid "User %s approved your request"
 msgstr "Käyttäjä %s on hyväksynyt pyyntösi"
 
 #. TODO: this should go through purple_account_request_authorization()
-#: ../libpurple/protocols/qq/sys_msg.c:241
 #, c-format
 msgid "%s wants to add you [%s] as a friend"
 msgstr "Käyttäjä %s tahtoo lisätä sinut [%s] kaverikseen"
 
-#: ../libpurple/protocols/qq/sys_msg.c:242
 #, c-format
 msgid "Message: %s"
 msgstr "Viesti: %s"
 
-#: ../libpurple/protocols/qq/sys_msg.c:264
 #, c-format
 msgid "%s is not in your buddy list"
 msgstr "%s ei ole tuttavissasi"
 
-#: ../libpurple/protocols/sametime/sametime.c:420
+#, c-format
+msgid "Notice from: %s"
+msgstr "Ilmoitus käyttäjältä: %s"
+
+#, c-format
+msgid "%s"
+msgstr "%s"
+
 msgid "Connection closed (writing)"
 msgstr "Yhteys suljettu (kirjoitus)"
 
-#: ../libpurple/protocols/sametime/sametime.c:1294
 #, c-format
 msgid "<b>Group Title:</b> %s<br>"
 msgstr "<b>Ryhmän nimi:</b> %s<br>"
 
-#: ../libpurple/protocols/sametime/sametime.c:1295
 #, c-format
 msgid "<b>Notes Group ID:</b> %s<br>"
 msgstr "<b>Notesin ryhmä-ID:</b> %s<br>"
 
-#: ../libpurple/protocols/sametime/sametime.c:1297
 #, c-format
 msgid "Info for Group %s"
 msgstr "Tietoja ryhmästä %s"
 
-#: ../libpurple/protocols/sametime/sametime.c:1299
 msgid "Notes Address Book Information"
 msgstr "Notesin osoitekirjatiedot"
 
-#: ../libpurple/protocols/sametime/sametime.c:1331
 msgid "Invite Group to Conference..."
 msgstr "Kutsu ryhmä neuvotteluun..."
 
-#: ../libpurple/protocols/sametime/sametime.c:1341
 msgid "Get Notes Address Book Info"
 msgstr "Hae Notesin osoitekirjatiedot"
 
-#: ../libpurple/protocols/sametime/sametime.c:1508
 msgid "Sending Handshake"
 msgstr "Lähetetään kättelyä"
 
-#: ../libpurple/protocols/sametime/sametime.c:1513
 msgid "Waiting for Handshake Acknowledgement"
 msgstr "Odotetaan kättelyn vahvistusta"
 
-#: ../libpurple/protocols/sametime/sametime.c:1518
 msgid "Handshake Acknowledged, Sending Login"
 msgstr "Kättely vahvistettu, kirjaudutaan"
 
-#: ../libpurple/protocols/sametime/sametime.c:1523
 msgid "Waiting for Login Acknowledgement"
 msgstr "Odotetaan kirjautumisen vahvistusta"
 
-#: ../libpurple/protocols/sametime/sametime.c:1528
 msgid "Login Redirected"
 msgstr "Sisäänkirjautuminen uudelleenohjattu"
 
-#: ../libpurple/protocols/sametime/sametime.c:1534
 msgid "Forcing Login"
 msgstr "Pakotetaan sisäänkirjautuminen"
 
-#: ../libpurple/protocols/sametime/sametime.c:1538
 msgid "Login Acknowledged"
 msgstr "Kirjautuminen vahvistettu"
 
-#: ../libpurple/protocols/sametime/sametime.c:1543
 msgid "Starting Services"
 msgstr "Käynnistetään palveluja"
 
-#: ../libpurple/protocols/sametime/sametime.c:1680
 #, c-format
 msgid ""
 "A Sametime administrator has issued the following announcement on server %s"
 msgstr "Sametime-ylläpitäjä on julkaissut seuraavan tiedotteen palvelimella %s"
 
-#: ../libpurple/protocols/sametime/sametime.c:1685
 msgid "Sametime Administrator Announcement"
 msgstr "Sametime-ylläpitäjän tiedote"
 
-#: ../libpurple/protocols/sametime/sametime.c:1738
 msgid "Connection reset"
 msgstr "Yhteys suljettu"
 
-#: ../libpurple/protocols/sametime/sametime.c:1750
 #, c-format
 msgid "Error reading from socket: %s"
 msgstr "Virhe luettaessa socketista: %s"
 
 #. this is a regular connect, error out
-#: ../libpurple/protocols/sametime/sametime.c:1775
-#: ../libpurple/protocols/sametime/sametime.c:3782
 msgid "Unable to connect to host"
 msgstr "Palvelimeen ei kyetty muodostamaan yhteyttä"
 
-#: ../libpurple/protocols/sametime/sametime.c:1816
 #, c-format
 msgid "Announcement from %s"
 msgstr "Ilmoitus käyttäjältä %s"
 
-#: ../libpurple/protocols/sametime/sametime.c:1990
 msgid "Conference Closed"
 msgstr "Neuvottelu suljettu"
 
-#: ../libpurple/protocols/sametime/sametime.c:2455
 msgid "Unable to send message: "
 msgstr "Viestiä ei voi lähettää: "
 
-#: ../libpurple/protocols/sametime/sametime.c:3011
 msgid "Place Closed"
 msgstr "Paikka suljettu"
 
-#: ../libpurple/protocols/sametime/sametime.c:3281
 msgid "Microphone"
 msgstr "Mikrofoni"
 
-#: ../libpurple/protocols/sametime/sametime.c:3282
 msgid "Speakers"
 msgstr "Kaiuttimet"
 
-#: ../libpurple/protocols/sametime/sametime.c:3283
 msgid "Video Camera"
 msgstr "Videokamera"
 
-#: ../libpurple/protocols/sametime/sametime.c:3321
-#: ../libpurple/protocols/sametime/sametime.c:4201
 msgid "Supports"
 msgstr "Tukee"
 
-#: ../libpurple/protocols/sametime/sametime.c:3326
-#: ../libpurple/protocols/sametime/sametime.c:4175
 msgid "External User"
 msgstr "Ulkoinen käyttäjä"
 
-#: ../libpurple/protocols/sametime/sametime.c:3432
 msgid "Create conference with user"
 msgstr "Aloita neuvottelu käyttäjän kanssa"
 
-#: ../libpurple/protocols/sametime/sametime.c:3433
 #, c-format
 msgid ""
 "Please enter a topic for the new conference, and an invitation message to be "
@@ -10618,27 +7660,21 @@
 "Kirjoita uuden neuvottelun puheenaihe sekä kutsuviesti joka lähetetään "
 "käyttäjälle %s"
 
-#: ../libpurple/protocols/sametime/sametime.c:3437
 msgid "New Conference"
 msgstr "Aloita neuvottelu"
 
-#: ../libpurple/protocols/sametime/sametime.c:3439
 msgid "Create"
 msgstr "Aloita"
 
-#: ../libpurple/protocols/sametime/sametime.c:3504
 msgid "Available Conferences"
 msgstr "Käynnissä olevat neuvottelut"
 
-#: ../libpurple/protocols/sametime/sametime.c:3510
 msgid "Create New Conference..."
 msgstr "Aloita uusi neuvottelu..."
 
-#: ../libpurple/protocols/sametime/sametime.c:3517
 msgid "Invite user to a conference"
 msgstr "Kutsu käyttäjä neuvotteluun"
 
-#: ../libpurple/protocols/sametime/sametime.c:3518
 #, c-format
 msgid ""
 "Select a conference from the list below to send an invite to user %s. Select "
@@ -10649,27 +7685,21 @@
 "Valitse \"Aloita uusi neuvottelu\" jos haluat aloittaa uuden neuvottelun ja "
 "kutsua tämän käyttäjän sinne."
 
-#: ../libpurple/protocols/sametime/sametime.c:3523
 msgid "Invite to Conference"
 msgstr "Kutsu neuvotteluun"
 
-#: ../libpurple/protocols/sametime/sametime.c:3614
 msgid "Invite to Conference..."
 msgstr "Kutsu neuvotteluun..."
 
-#: ../libpurple/protocols/sametime/sametime.c:3619
 msgid "Send TEST Announcement"
 msgstr "Lähetä TEST-ilmoitus"
 
-#: ../libpurple/protocols/sametime/sametime.c:3638 ../pidgin/gtkconv.c:4534
 msgid "Topic:"
 msgstr "Aihe:"
 
-#: ../libpurple/protocols/sametime/sametime.c:3666
 msgid "No Sametime Community Server specified"
 msgstr "Sametime-yhteisöpalvelinta ei ole määritelty"
 
-#: ../libpurple/protocols/sametime/sametime.c:3691
 #, c-format
 msgid ""
 "No host or IP address has been configured for the Meanwhile account %s. "
@@ -10678,42 +7708,31 @@
 "Isäntää tai IP-osoitetta ei ole asetettu Meanwhile-käyttäjätilille %s. Lisää "
 "sellainen alle ennen kirjautumista sisään."
 
-#: ../libpurple/protocols/sametime/sametime.c:3696
 msgid "Meanwhile Connection Setup"
 msgstr "Meanwhilen yhteysasetukset"
 
-#: ../libpurple/protocols/sametime/sametime.c:3697
 msgid "No Sametime Community Server Specified"
 msgstr "Sametime-yhteisöpalvelinta ei ole määritelty"
 
-#: ../libpurple/protocols/sametime/sametime.c:3699
 msgid "Connect"
 msgstr "Yhdistä"
 
-#: ../libpurple/protocols/sametime/sametime.c:4191
 #, c-format
 msgid "Unknown (0x%04x)<br>"
 msgstr "Tuntematon (0x%04x)<br>"
 
-#: ../libpurple/protocols/sametime/sametime.c:4193
 msgid "Last Known Client"
 msgstr "Viimeksi nähty asiakasohjelma"
 
-#: ../libpurple/protocols/sametime/sametime.c:4357
-#: ../libpurple/protocols/sametime/sametime.c:5562
 msgid "User Name"
 msgstr "Käyttäjänimi"
 
-#: ../libpurple/protocols/sametime/sametime.c:4360
-#: ../libpurple/protocols/sametime/sametime.c:5565
 msgid "Sametime ID"
 msgstr "Sametime-tunnus"
 
-#: ../libpurple/protocols/sametime/sametime.c:4384
 msgid "An ambiguous user ID was entered"
 msgstr "Epäselvä käyttäjätunnus syötetty"
 
-#: ../libpurple/protocols/sametime/sametime.c:4385
 #, c-format
 msgid ""
 "The identifier '%s' may possibly refer to any of the following users. Please "
@@ -10722,15 +7741,12 @@
 "Tunniste '%s' voi viitata keneen tahansa seuraavista käyttäjistä. Valitse "
 "oikea käyttäjä alla olevasta luettelosta lisätäksesi hänet tuttaviisi."
 
-#: ../libpurple/protocols/sametime/sametime.c:4390
 msgid "Select User"
 msgstr "Valitse käyttäjä"
 
-#: ../libpurple/protocols/sametime/sametime.c:4474
 msgid "Unable to add user: user not found"
 msgstr "Käyttäjää ei voi lisätä: käyttäjää ei löydy"
 
-#: ../libpurple/protocols/sametime/sametime.c:4476
 #, c-format
 msgid ""
 "The identifier '%s' did not match any users in your Sametime community. This "
@@ -10739,7 +7755,6 @@
 "Tunnisteella '%s' ei löytynyt osumia Sametime-yhteisöstäsi. Tämä hakusana on "
 "poistettu tuttavistasi."
 
-#: ../libpurple/protocols/sametime/sametime.c:5067
 #, c-format
 msgid ""
 "Error reading file %s: \n"
@@ -10748,64 +7763,49 @@
 "Virhe luettaessa tiedostoa %s:  \n"
 "%s.\n"
 
-#: ../libpurple/protocols/sametime/sametime.c:5202
 msgid "Remotely Stored Buddy List"
 msgstr "Etätallennetut tuttavat"
 
 # NOTE source: gftt glossary
-#: ../libpurple/protocols/sametime/sametime.c:5207
 msgid "Buddy List Storage Mode"
 msgstr "Tuttavien tallennustapa"
 
-#: ../libpurple/protocols/sametime/sametime.c:5210
 msgid "Local Buddy List Only"
 msgstr "Vain paikalliset tuttavat"
 
-#: ../libpurple/protocols/sametime/sametime.c:5212
 msgid "Merge List from Server"
 msgstr "Yhdistä tuttavat palvelimelta"
 
-#: ../libpurple/protocols/sametime/sametime.c:5214
 msgid "Merge and Save List to Server"
 msgstr "Yhdistä ja tallenna tuttavat palvelimelle"
 
-#: ../libpurple/protocols/sametime/sametime.c:5216
 msgid "Synchronize List with Server"
 msgstr "Täsmää tuttavat palvelimen kanssa"
 
-#: ../libpurple/protocols/sametime/sametime.c:5271
 #, c-format
 msgid "Import Sametime List for Account %s"
 msgstr "Tuo Sametime-tuttavat käyttäjätililtä %s"
 
-#: ../libpurple/protocols/sametime/sametime.c:5311
 #, c-format
 msgid "Export Sametime List for Account %s"
 msgstr "Vie Sametime-tuttavat käyttäjätilille %s"
 
-#: ../libpurple/protocols/sametime/sametime.c:5365
 msgid "Unable to add group: group exists"
 msgstr "Ryhmää ei voi lisätä: ryhmä on jo olemassa"
 
-#: ../libpurple/protocols/sametime/sametime.c:5366
 #, c-format
 msgid "A group named '%s' already exists in your buddy list."
 msgstr "Ryhmä '%s' on jo tuttavissasi."
 
-#: ../libpurple/protocols/sametime/sametime.c:5369
-#: ../libpurple/protocols/sametime/sametime.c:5499
 msgid "Unable to add group"
 msgstr "Ryhmää ei voi lisätä"
 
-#: ../libpurple/protocols/sametime/sametime.c:5428
 msgid "Possible Matches"
 msgstr "Mahdollisia osumia"
 
-#: ../libpurple/protocols/sametime/sametime.c:5444
 msgid "Notes Address Book group results"
 msgstr "Notesin osoitekirjan ryhmätulokset"
 
-#: ../libpurple/protocols/sametime/sametime.c:5445
 #, c-format
 msgid ""
 "The identifier '%s' may possibly refer to any of the following Notes Address "
@@ -10816,15 +7816,12 @@
 "ryhmistä. Valitse oikea ryhmä alla olevasta luettelosta lisätäksesi sen "
 "tuttaviisi."
 
-#: ../libpurple/protocols/sametime/sametime.c:5450
 msgid "Select Notes Address Book"
 msgstr "Valitse Notesin osoitekirja"
 
-#: ../libpurple/protocols/sametime/sametime.c:5493
 msgid "Unable to add group: group not found"
 msgstr "Ryhmää ei voi lisätä: ryhmää ei löytynyt"
 
-#: ../libpurple/protocols/sametime/sametime.c:5495
 #, c-format
 msgid ""
 "The identifier '%s' did not match any Notes Address Book groups in your "
@@ -10833,11 +7830,9 @@
 "Tunnisteella '%s' ei löytynyt osumia Sametime-yhteisösi Notesin osoitekirjan "
 "ryhmistä."
 
-#: ../libpurple/protocols/sametime/sametime.c:5536
 msgid "Notes Address Book Group"
 msgstr "Notesin osoitekirjan ryhmä"
 
-#: ../libpurple/protocols/sametime/sametime.c:5537
 msgid ""
 "Enter the name of a Notes Address Book group in the field below to add the "
 "group and its members to your buddy list."
@@ -10845,12 +7840,10 @@
 "Kirjoita Notesin osoitekirjan ryhmän nimi alla olevaan kenttään lisätäksesi "
 "ryhmän ja sen jäsenet tuttaviisi."
 
-#: ../libpurple/protocols/sametime/sametime.c:5586
 #, c-format
 msgid "Search results for '%s'"
 msgstr "Hakutulokset haulle '%s'"
 
-#: ../libpurple/protocols/sametime/sametime.c:5587
 #, c-format
 msgid ""
 "The identifier '%s' may possibly refer to any of the following users. You "
@@ -10861,28 +7854,22 @@
 "lisätä nämä käyttäjät tuttaviisi tai lähettää heille viestejä alla olevilla "
 "painikkeilla."
 
-#: ../libpurple/protocols/sametime/sametime.c:5594 ../pidgin/gtknotify.c:782
 msgid "Search Results"
 msgstr "Hakutulokset"
 
-#: ../libpurple/protocols/sametime/sametime.c:5619
 msgid "No matches"
 msgstr "Ei tuloksia"
 
-#: ../libpurple/protocols/sametime/sametime.c:5620
 #, c-format
 msgid "The identifier '%s' did not match any users in your Sametime community."
 msgstr "Tunnisteella '%s' ei löytynyt osumia Sametime-yhteisöstäsi."
 
-#: ../libpurple/protocols/sametime/sametime.c:5624
 msgid "No Matches"
 msgstr "Ei tuloksia"
 
-#: ../libpurple/protocols/sametime/sametime.c:5661
 msgid "Search for a user"
 msgstr "Etsi käyttäjiä"
 
-#: ../libpurple/protocols/sametime/sametime.c:5662
 msgid ""
 "Enter a name or partial ID in the field below to search for matching users "
 "in your Sametime community."
@@ -10890,115 +7877,59 @@
 "Kirjoita nimi tai osittainen käyttäjätunnus alla olevaan kenttään etsiäksesi "
 "käyttäjiä Sametime-yhteisöstäsi."
 
-#: ../libpurple/protocols/sametime/sametime.c:5665
 msgid "User Search"
 msgstr "Käyttäjähaku"
 
-#: ../libpurple/protocols/sametime/sametime.c:5678
 msgid "Import Sametime List..."
 msgstr "Tuo Sametime-tuttavat..."
 
-#: ../libpurple/protocols/sametime/sametime.c:5682
 msgid "Export Sametime List..."
 msgstr "Vie Sametime-tuttavat..."
 
-#: ../libpurple/protocols/sametime/sametime.c:5686
 msgid "Add Notes Address Book Group..."
 msgstr "Lisää Notesin osoitekirjan ryhmä..."
 
-#: ../libpurple/protocols/sametime/sametime.c:5690
 msgid "User Search..."
 msgstr "Käyttäjähaku..."
 
-#: ../libpurple/protocols/sametime/sametime.c:5796
 msgid "Force login (ignore server redirects)"
 msgstr "Pakota sisäänkirjautuminen (älä välitä palvelinuudelleenohjauksista)"
 
 #. pretend to be Sametime Connect
-#: ../libpurple/protocols/sametime/sametime.c:5806
 msgid "Hide client identity"
 msgstr "Piilota asiakasohjelman tunniste"
 
-#: ../libpurple/protocols/silc/buddy.c:52
-#: ../libpurple/protocols/silc/buddy.c:410
-#: ../libpurple/protocols/silc/buddy.c:538
-#: ../libpurple/protocols/silc/buddy.c:700
-#: ../libpurple/protocols/silc/ft.c:423
-#: ../libpurple/protocols/silc10/buddy.c:52
-#: ../libpurple/protocols/silc10/buddy.c:421
-#: ../libpurple/protocols/silc10/buddy.c:546
-#: ../libpurple/protocols/silc10/buddy.c:712
-#: ../libpurple/protocols/silc10/ft.c:338
 #, c-format
 msgid "User %s is not present in the network"
 msgstr "Käyttäjä %s ei ole läsnä verkossa"
 
-#: ../libpurple/protocols/silc/buddy.c:53
-#: ../libpurple/protocols/silc/buddy.c:110
-#: ../libpurple/protocols/silc/buddy.c:115
-#: ../libpurple/protocols/silc/buddy.c:119
-#: ../libpurple/protocols/silc/buddy.c:124
-#: ../libpurple/protocols/silc/buddy.c:129
-#: ../libpurple/protocols/silc/buddy.c:134
-#: ../libpurple/protocols/silc/buddy.c:254
-#: ../libpurple/protocols/silc10/buddy.c:53
-#: ../libpurple/protocols/silc10/buddy.c:115
-#: ../libpurple/protocols/silc10/buddy.c:120
-#: ../libpurple/protocols/silc10/buddy.c:124
-#: ../libpurple/protocols/silc10/buddy.c:129
-#: ../libpurple/protocols/silc10/buddy.c:134
-#: ../libpurple/protocols/silc10/buddy.c:139
-#: ../libpurple/protocols/silc10/buddy.c:257
 msgid "Key Agreement"
 msgstr "Avainsopimus"
 
-#: ../libpurple/protocols/silc/buddy.c:54
-#: ../libpurple/protocols/silc10/buddy.c:54
 msgid "Cannot perform the key agreement"
 msgstr "Avainsopimusta ei voi suorittaa"
 
-#: ../libpurple/protocols/silc/buddy.c:111
-#: ../libpurple/protocols/silc10/buddy.c:116
 msgid "Error occurred during key agreement"
 msgstr "Virhe tapahtui avainsopimuksen aikana"
 
-#: ../libpurple/protocols/silc/buddy.c:115
-#: ../libpurple/protocols/silc10/buddy.c:120
 msgid "Key Agreement failed"
 msgstr "Avainsopimus epäonnistui"
 
-#: ../libpurple/protocols/silc/buddy.c:120
-#: ../libpurple/protocols/silc10/buddy.c:125
 msgid "Timeout during key agreement"
 msgstr "Aikakatkaisu avainsopimuksen aikana"
 
-#: ../libpurple/protocols/silc/buddy.c:125
-#: ../libpurple/protocols/silc10/buddy.c:130
 msgid "Key agreement was aborted"
 msgstr "Avainsopimus peruutettiin"
 
-#: ../libpurple/protocols/silc/buddy.c:130
-#: ../libpurple/protocols/silc10/buddy.c:135
 msgid "Key agreement is already started"
 msgstr "Avainsopimus on jo aloitettu"
 
-#: ../libpurple/protocols/silc/buddy.c:135
-#: ../libpurple/protocols/silc10/buddy.c:140
 msgid "Key agreement cannot be started with yourself"
 msgstr "Avainsopimusta et voi tehdä itsesi kanssa"
 
-#: ../libpurple/protocols/silc/buddy.c:255
-#: ../libpurple/protocols/silc/buddy.c:383
-#: ../libpurple/protocols/silc/buddy.c:497
-#: ../libpurple/protocols/silc/buddy.c:508
-#: ../libpurple/protocols/silc10/buddy.c:258
-#: ../libpurple/protocols/silc10/buddy.c:389
-#: ../libpurple/protocols/silc10/buddy.c:514
 msgid "The remote user is not present in the network any more"
 msgstr "Etäkäyttäjä ei enää ole paikalla verkossa"
 
-#: ../libpurple/protocols/silc/buddy.c:298
-#: ../libpurple/protocols/silc10/buddy.c:295
 #, c-format
 msgid ""
 "Key agreement request received from %s. Would you like to perform the key "
@@ -11007,8 +7938,6 @@
 "Avainsopimuspyyntö vastaanotettu käyttäjältä %s. Haluatko suorittaa "
 "avainsopimuksen?"
 
-#: ../libpurple/protocols/silc/buddy.c:302
-#: ../libpurple/protocols/silc10/buddy.c:299
 #, c-format
 msgid ""
 "The remote user is waiting key agreement on:\n"
@@ -11019,99 +7948,40 @@
 "Etäkone: %s\n"
 "Portti: %d"
 
-#: ../libpurple/protocols/silc/buddy.c:315
-#: ../libpurple/protocols/silc10/buddy.c:312
 msgid "Key Agreement Request"
 msgstr "Avainsopimuspyyntö"
 
-#: ../libpurple/protocols/silc/buddy.c:382
-#: ../libpurple/protocols/silc/buddy.c:412
-#: ../libpurple/protocols/silc/buddy.c:452
-#: ../libpurple/protocols/silc10/buddy.c:388
-#: ../libpurple/protocols/silc10/buddy.c:423
-#: ../libpurple/protocols/silc10/buddy.c:465
 msgid "IM With Password"
 msgstr "Pikaviesti salasanalla"
 
-#: ../libpurple/protocols/silc/buddy.c:413
-#: ../libpurple/protocols/silc10/buddy.c:424
 msgid "Cannot set IM key"
 msgstr "Pikaviestiavainta ei voi asettaa"
 
-#: ../libpurple/protocols/silc/buddy.c:453
-#: ../libpurple/protocols/silc10/buddy.c:466
 msgid "Set IM Password"
 msgstr "Aseta pikaviestin salasana"
 
-#: ../libpurple/protocols/silc/buddy.c:496
-#: ../libpurple/protocols/silc/buddy.c:507
-#: ../libpurple/protocols/silc/buddy.c:540
-#: ../libpurple/protocols/silc/ops.c:1516
-#: ../libpurple/protocols/silc/ops.c:1527
-#: ../libpurple/protocols/silc10/buddy.c:513
-#: ../libpurple/protocols/silc10/buddy.c:548
-#: ../libpurple/protocols/silc10/ops.c:1494
-#: ../libpurple/protocols/silc10/ops.c:1505
 msgid "Get Public Key"
 msgstr "Hae julkinen avain"
 
-#: ../libpurple/protocols/silc/buddy.c:541
-#: ../libpurple/protocols/silc/ops.c:1517
-#: ../libpurple/protocols/silc/ops.c:1528
-#: ../libpurple/protocols/silc10/buddy.c:549
-#: ../libpurple/protocols/silc10/ops.c:1495
-#: ../libpurple/protocols/silc10/ops.c:1506
 msgid "Cannot fetch the public key"
 msgstr "Julkista avainta ei voi hakea"
 
-#: ../libpurple/protocols/silc/buddy.c:622
-#: ../libpurple/protocols/silc/buddy.c:1658
-#: ../libpurple/protocols/silc10/buddy.c:635
-#: ../libpurple/protocols/silc10/buddy.c:1657
 msgid "Show Public Key"
 msgstr "Näytä julkinen avain"
 
-#: ../libpurple/protocols/silc/buddy.c:623
-#: ../libpurple/protocols/silc/buddy.c:1030
-#: ../libpurple/protocols/silc/chat.c:238
-#: ../libpurple/protocols/silc10/buddy.c:636
-#: ../libpurple/protocols/silc10/buddy.c:1036
-#: ../libpurple/protocols/silc10/chat.c:237
 msgid "Could not load public key"
 msgstr "Julkista avainta ei voi ladata"
 
-#: ../libpurple/protocols/silc/buddy.c:701
-#: ../libpurple/protocols/silc/ops.c:1066
-#: ../libpurple/protocols/silc/ops.c:1181
-#: ../libpurple/protocols/silc/ops.c:1303
-#: ../libpurple/protocols/silc/ops.c:1304
-#: ../libpurple/protocols/silc/ops.c:1322
-#: ../libpurple/protocols/silc10/buddy.c:713
-#: ../libpurple/protocols/silc10/ops.c:1087
-#: ../libpurple/protocols/silc10/ops.c:1159
-#: ../libpurple/protocols/silc10/ops.c:1294
-#: ../libpurple/protocols/silc10/ops.c:1295
-#: ../libpurple/protocols/silc10/ops.c:1313
 msgid "User Information"
 msgstr "Käyttäjätiedot"
 
-#: ../libpurple/protocols/silc/buddy.c:702
-#: ../libpurple/protocols/silc/ops.c:1182
-#: ../libpurple/protocols/silc/ops.c:1323
-#: ../libpurple/protocols/silc10/buddy.c:714
-#: ../libpurple/protocols/silc10/ops.c:1160
-#: ../libpurple/protocols/silc10/ops.c:1314
 msgid "Cannot get user information"
 msgstr "Käyttäjätietoja ei voi hakea"
 
-#: ../libpurple/protocols/silc/buddy.c:723
-#: ../libpurple/protocols/silc10/buddy.c:735
 #, c-format
 msgid "The %s buddy is not trusted"
 msgstr "Käyttäjä %s ei ole luotettu"
 
-#: ../libpurple/protocols/silc/buddy.c:726
-#: ../libpurple/protocols/silc10/buddy.c:738
 msgid ""
 "You cannot receive buddy notifications until you import his/her public key.  "
 "You can use the Get Public Key command to get the public key."
@@ -11120,19 +7990,13 @@
 "Voit käyttää Hae julkinen avain -komentoa saadaksesi julkisen avaimen."
 
 #. Open file selector to select the public key.
-#: ../libpurple/protocols/silc/buddy.c:1062
-#: ../libpurple/protocols/silc10/buddy.c:1070
 msgid "Open..."
 msgstr "Avaa..."
 
-#: ../libpurple/protocols/silc/buddy.c:1073
-#: ../libpurple/protocols/silc10/buddy.c:1081
 #, c-format
 msgid "The %s buddy is not present in the network"
 msgstr "Tuttava %s ei ole kirjautuneena verkossa"
 
-#: ../libpurple/protocols/silc/buddy.c:1076
-#: ../libpurple/protocols/silc10/buddy.c:1084
 msgid ""
 "To add the buddy you must import his/her public key. Press Import to import "
 "a public key."
@@ -11140,18 +8004,12 @@
 "Lisätäksesi tuttavan tarvitsen hänen julkisen avaimensa. Paina Tuo "
 "tuodaksesi julkisen avaimen."
 
-#: ../libpurple/protocols/silc/buddy.c:1080
-#: ../libpurple/protocols/silc10/buddy.c:1088
 msgid "_Import..."
 msgstr "_Tuo..."
 
-#: ../libpurple/protocols/silc/buddy.c:1186
-#: ../libpurple/protocols/silc10/buddy.c:1184
 msgid "Select correct user"
 msgstr "Valitse oikea käyttäjä"
 
-#: ../libpurple/protocols/silc/buddy.c:1188
-#: ../libpurple/protocols/silc10/buddy.c:1186
 msgid ""
 "More than one user was found with the same public key. Select the correct "
 "user from the list to add to the buddy list."
@@ -11159,8 +8017,6 @@
 "Useammalla kuin yhdellä käyttäjällä on sama julkinen avain. Valitse oikea "
 "käyttäjä luettelosta."
 
-#: ../libpurple/protocols/silc/buddy.c:1190
-#: ../libpurple/protocols/silc10/buddy.c:1188
 msgid ""
 "More than one user was found with the same name. Select the correct user "
 "from the list to add to the buddy list."
@@ -11168,313 +8024,153 @@
 "Useammalla kuin yhdellä käyttäjällä on sama nimi. Valitse oikea käyttäjä "
 "luettelosta."
 
-#: ../libpurple/protocols/silc/buddy.c:1477
-#: ../libpurple/protocols/silc10/buddy.c:1477
 msgid "Detached"
 msgstr "Irrotettu"
 
-#: ../libpurple/protocols/silc/buddy.c:1481
-#: ../libpurple/protocols/silc/silc.c:58
-#: ../libpurple/protocols/silc10/buddy.c:1481
-#: ../libpurple/protocols/silc10/silc.c:49
 msgid "Indisposed"
 msgstr "Vastahakoinen"
 
-#: ../libpurple/protocols/silc/buddy.c:1485
-#: ../libpurple/protocols/silc/silc.c:60
-#: ../libpurple/protocols/silc10/buddy.c:1485
-#: ../libpurple/protocols/silc10/silc.c:51
 msgid "Wake Me Up"
 msgstr "Herätä minut"
 
-#: ../libpurple/protocols/silc/buddy.c:1487
-#: ../libpurple/protocols/silc/silc.c:52
-#: ../libpurple/protocols/silc10/buddy.c:1487
-#: ../libpurple/protocols/silc10/silc.c:43
 msgid "Hyper Active"
 msgstr "Hyperaktiivinen"
 
-#: ../libpurple/protocols/silc/buddy.c:1489
-#: ../libpurple/protocols/silc10/buddy.c:1489
 msgid "Robot"
 msgstr "Robotti"
 
-#: ../libpurple/protocols/silc/buddy.c:1496
-#: ../libpurple/protocols/silc/silc.c:959
-#: ../libpurple/protocols/silc/util.c:522
-#: ../libpurple/protocols/silc10/buddy.c:1496
-#: ../libpurple/protocols/silc10/silc.c:660
-#: ../libpurple/protocols/silc10/util.c:515
 msgid "Happy"
 msgstr "Onnellinen"
 
-#: ../libpurple/protocols/silc/buddy.c:1498
-#: ../libpurple/protocols/silc/silc.c:961
-#: ../libpurple/protocols/silc/util.c:524
-#: ../libpurple/protocols/silc10/buddy.c:1498
-#: ../libpurple/protocols/silc10/silc.c:662
-#: ../libpurple/protocols/silc10/util.c:517
 msgid "Sad"
 msgstr "Surullinen"
 
-#: ../libpurple/protocols/silc/buddy.c:1500
-#: ../libpurple/protocols/silc/silc.c:963
-#: ../libpurple/protocols/silc/util.c:526
-#: ../libpurple/protocols/silc10/buddy.c:1500
-#: ../libpurple/protocols/silc10/silc.c:664
-#: ../libpurple/protocols/silc10/util.c:519
 msgid "Angry"
 msgstr "Vihainen"
 
-#: ../libpurple/protocols/silc/buddy.c:1502
-#: ../libpurple/protocols/silc/silc.c:965
-#: ../libpurple/protocols/silc/util.c:528
-#: ../libpurple/protocols/silc10/buddy.c:1502
-#: ../libpurple/protocols/silc10/silc.c:666
-#: ../libpurple/protocols/silc10/util.c:521
 msgid "Jealous"
 msgstr "Mustasukkainen"
 
-#: ../libpurple/protocols/silc/buddy.c:1504
-#: ../libpurple/protocols/silc/silc.c:967
-#: ../libpurple/protocols/silc/util.c:530
-#: ../libpurple/protocols/silc10/buddy.c:1504
-#: ../libpurple/protocols/silc10/silc.c:668
-#: ../libpurple/protocols/silc10/util.c:523
 msgid "Ashamed"
 msgstr "Häpeää"
 
-#: ../libpurple/protocols/silc/buddy.c:1506
-#: ../libpurple/protocols/silc/silc.c:969
-#: ../libpurple/protocols/silc/util.c:532
-#: ../libpurple/protocols/silc10/buddy.c:1506
-#: ../libpurple/protocols/silc10/silc.c:670
-#: ../libpurple/protocols/silc10/util.c:525
 msgid "Invincible"
 msgstr "Haavoittumaton"
 
-#: ../libpurple/protocols/silc/buddy.c:1508
-#: ../libpurple/protocols/silc/util.c:534
-#: ../libpurple/protocols/silc10/buddy.c:1508
-#: ../libpurple/protocols/silc10/util.c:527
 msgid "In Love"
 msgstr "Rakastunut"
 
-#: ../libpurple/protocols/silc/buddy.c:1510
-#: ../libpurple/protocols/silc/silc.c:973
-#: ../libpurple/protocols/silc/util.c:536
-#: ../libpurple/protocols/silc10/buddy.c:1510
-#: ../libpurple/protocols/silc10/silc.c:674
-#: ../libpurple/protocols/silc10/util.c:529
 msgid "Sleepy"
 msgstr "Unelias"
 
-#: ../libpurple/protocols/silc/buddy.c:1512
-#: ../libpurple/protocols/silc/silc.c:975
-#: ../libpurple/protocols/silc/util.c:538
-#: ../libpurple/protocols/silc10/buddy.c:1512
-#: ../libpurple/protocols/silc10/silc.c:676
-#: ../libpurple/protocols/silc10/util.c:531
 msgid "Bored"
 msgstr "Tylsistynyt"
 
-#: ../libpurple/protocols/silc/buddy.c:1514
-#: ../libpurple/protocols/silc/silc.c:977
-#: ../libpurple/protocols/silc/util.c:540
-#: ../libpurple/protocols/silc10/buddy.c:1514
-#: ../libpurple/protocols/silc10/silc.c:678
-#: ../libpurple/protocols/silc10/util.c:533
 msgid "Excited"
 msgstr "Innostunut"
 
-#: ../libpurple/protocols/silc/buddy.c:1516
-#: ../libpurple/protocols/silc/silc.c:979
-#: ../libpurple/protocols/silc/util.c:542
-#: ../libpurple/protocols/silc10/buddy.c:1516
-#: ../libpurple/protocols/silc10/silc.c:680
-#: ../libpurple/protocols/silc10/util.c:535
 msgid "Anxious"
 msgstr "Levoton"
 
-#: ../libpurple/protocols/silc/buddy.c:1548
-#: ../libpurple/protocols/silc/ops.c:1220
-#: ../libpurple/protocols/silc10/buddy.c:1548
-#: ../libpurple/protocols/silc10/ops.c:1202
 msgid "User Modes"
 msgstr "Käyttäjätilat"
 
-#: ../libpurple/protocols/silc/buddy.c:1565
-#: ../libpurple/protocols/silc/ops.c:1237
-#: ../libpurple/protocols/silc10/buddy.c:1565
-#: ../libpurple/protocols/silc10/ops.c:1219
 msgid "Preferred Contact"
 msgstr "Suosikkituttava"
 
-#: ../libpurple/protocols/silc/buddy.c:1570
-#: ../libpurple/protocols/silc/ops.c:1242
-#: ../libpurple/protocols/silc10/buddy.c:1570
-#: ../libpurple/protocols/silc10/ops.c:1224
 msgid "Preferred Language"
 msgstr "Ensisijainen kieli"
 
-#: ../libpurple/protocols/silc/buddy.c:1575
-#: ../libpurple/protocols/silc/ops.c:1247
-#: ../libpurple/protocols/silc10/buddy.c:1575
-#: ../libpurple/protocols/silc10/ops.c:1229
 msgid "Device"
 msgstr "Laite"
 
-#: ../libpurple/protocols/silc/buddy.c:1580
-#: ../libpurple/protocols/silc/ops.c:1252
-#: ../libpurple/protocols/silc10/buddy.c:1580
-#: ../libpurple/protocols/silc10/ops.c:1234
-#: ../libpurple/protocols/silc10/silc.c:728
-#: ../libpurple/protocols/silc10/silc.c:730
 msgid "Timezone"
 msgstr "Aikavyöhyke"
 
-#: ../libpurple/protocols/silc/buddy.c:1585
-#: ../libpurple/protocols/silc/ops.c:1257
-#: ../libpurple/protocols/silc10/buddy.c:1585
-#: ../libpurple/protocols/silc10/ops.c:1239
 msgid "Geolocation"
 msgstr "Maantieteellinen paikka"
 
-#: ../libpurple/protocols/silc/buddy.c:1641
-#: ../libpurple/protocols/silc10/buddy.c:1639
 msgid "Reset IM Key"
 msgstr "Tyhjennä pikaviestiavain"
 
-#: ../libpurple/protocols/silc/buddy.c:1646
-#: ../libpurple/protocols/silc10/buddy.c:1645
 msgid "IM with Key Exchange"
 msgstr "Pikaviesti avaimienvaihdolla"
 
-#: ../libpurple/protocols/silc/buddy.c:1651
-#: ../libpurple/protocols/silc10/buddy.c:1650
 msgid "IM with Password"
 msgstr "Pikaviesti salasanalla"
 
-#: ../libpurple/protocols/silc/buddy.c:1664
-#: ../libpurple/protocols/silc10/buddy.c:1663
 msgid "Get Public Key..."
 msgstr "Hae julkinen avain..."
 
-#: ../libpurple/protocols/silc/buddy.c:1671
-#: ../libpurple/protocols/silc/ops.c:1625
-#: ../libpurple/protocols/silc10/buddy.c:1670
-#: ../libpurple/protocols/silc10/ops.c:1624
 msgid "Kill User"
 msgstr "Poista käyttäjä"
 
-#: ../libpurple/protocols/silc/buddy.c:1681
-#: ../libpurple/protocols/silc/chat.c:1000
-#: ../libpurple/protocols/silc10/buddy.c:1680
-#: ../libpurple/protocols/silc10/chat.c:977
 msgid "Draw On Whiteboard"
 msgstr "Piirrä kirjoitustaululle"
 
-#: ../libpurple/protocols/silc/chat.c:39
-#: ../libpurple/protocols/silc10/chat.c:39
 msgid "_Passphrase:"
 msgstr "_Salasana:"
 
-#: ../libpurple/protocols/silc/chat.c:80
-#: ../libpurple/protocols/silc10/chat.c:80
 #, c-format
 msgid "Channel %s does not exist in the network"
 msgstr "Kanavaa %s ei ole verkossa"
 
-#: ../libpurple/protocols/silc/chat.c:81
-#: ../libpurple/protocols/silc/chat.c:176
-#: ../libpurple/protocols/silc10/chat.c:81
-#: ../libpurple/protocols/silc10/chat.c:174
 msgid "Channel Information"
 msgstr "Kanavatiedot"
 
-#: ../libpurple/protocols/silc/chat.c:82
-#: ../libpurple/protocols/silc10/chat.c:82
 msgid "Cannot get channel information"
 msgstr "Ei saada kanavatietoja"
 
-#: ../libpurple/protocols/silc/chat.c:119
-#: ../libpurple/protocols/silc10/chat.c:119
 #, c-format
 msgid "<b>Channel Name:</b> %s"
 msgstr "<b>Kanavan nimi:</b> %s"
 
-#: ../libpurple/protocols/silc/chat.c:122
-#: ../libpurple/protocols/silc10/chat.c:122
 #, c-format
 msgid "<br><b>User Count:</b> %d"
 msgstr "<br><b>Käyttäjämäärä:</b> %d"
 
-#: ../libpurple/protocols/silc/chat.c:129
-#: ../libpurple/protocols/silc10/chat.c:129
 #, c-format
 msgid "<br><b>Channel Founder:</b> %s"
 msgstr "<br><b>Kanavan perustaja:</b> %s"
 
-#: ../libpurple/protocols/silc/chat.c:138
-#: ../libpurple/protocols/silc10/chat.c:138
 #, c-format
 msgid "<br><b>Channel Cipher:</b> %s"
 msgstr "<br><b>Kanavan salausalgoritmi:<b> %s"
 
 #. Definition of HMAC: http://en.wikipedia.org/wiki/HMAC
-#: ../libpurple/protocols/silc/chat.c:143
-#: ../libpurple/protocols/silc10/chat.c:142
 #, c-format
 msgid "<br><b>Channel HMAC:</b> %s"
 msgstr "<br><b>Kanavan HMAC:</b> %s"
 
-#: ../libpurple/protocols/silc/chat.c:148
-#: ../libpurple/protocols/silc10/chat.c:147
 #, c-format
 msgid "<br><b>Channel Topic:</b><br>%s"
 msgstr "<br><b>Kanavan aihe:</b><br>%s"
 
-#: ../libpurple/protocols/silc/chat.c:153
-#: ../libpurple/protocols/silc10/chat.c:152
 #, c-format
 msgid "<br><b>Channel Modes:</b> "
 msgstr "<br><b>Kanavan tilat:</b> "
 
-#: ../libpurple/protocols/silc/chat.c:167
-#: ../libpurple/protocols/silc10/chat.c:165
 #, c-format
 msgid "<br><b>Founder Key Fingerprint:</b><br>%s"
 msgstr "<br><b>Perustajan avain Fingerprint</b><br>%s"
 
-#: ../libpurple/protocols/silc/chat.c:168
-#: ../libpurple/protocols/silc10/chat.c:166
 #, c-format
 msgid "<br><b>Founder Key Babbleprint:</b><br>%s"
 msgstr "<br><b>Perustajan avain Babbleprint:</b><br>%s"
 
-#: ../libpurple/protocols/silc/chat.c:237
-#: ../libpurple/protocols/silc10/chat.c:236
 msgid "Add Channel Public Key"
 msgstr "Lisää kanavan julkinen avain"
 
 #. Add new public key
-#: ../libpurple/protocols/silc/chat.c:305
-#: ../libpurple/protocols/silc10/chat.c:291
 msgid "Open Public Key..."
 msgstr "Avaa julkinen avain..."
 
-#: ../libpurple/protocols/silc/chat.c:424
-#: ../libpurple/protocols/silc10/chat.c:401
 msgid "Channel Passphrase"
 msgstr "Kanavan salasana"
 
-#: ../libpurple/protocols/silc/chat.c:431
-#: ../libpurple/protocols/silc10/chat.c:408
 msgid "Channel Public Keys List"
 msgstr "Kanavan julkisten avainten luettelo"
 
-#: ../libpurple/protocols/silc/chat.c:436
-#: ../libpurple/protocols/silc10/chat.c:413
 #, c-format
 msgid ""
 "Channel authentication is used to secure the channel from unauthorized "
@@ -11489,446 +8185,246 @@
 "pääsemiseksi. Jos käytetään kanavan julkisia avaimia niin silloin pääsevät "
 "vain käyttäjät joiden julkinen avain on luettelossa."
 
-#: ../libpurple/protocols/silc/chat.c:445
-#: ../libpurple/protocols/silc/chat.c:446
-#: ../libpurple/protocols/silc/chat.c:482
-#: ../libpurple/protocols/silc/chat.c:483
-#: ../libpurple/protocols/silc/chat.c:934
-#: ../libpurple/protocols/silc10/chat.c:422
-#: ../libpurple/protocols/silc10/chat.c:423
-#: ../libpurple/protocols/silc10/chat.c:461
-#: ../libpurple/protocols/silc10/chat.c:462
-#: ../libpurple/protocols/silc10/chat.c:911
 msgid "Channel Authentication"
 msgstr "Kanavalle tunnistautuminen"
 
-#: ../libpurple/protocols/silc/chat.c:447
-#: ../libpurple/protocols/silc/chat.c:484
-#: ../libpurple/protocols/silc10/chat.c:424
-#: ../libpurple/protocols/silc10/chat.c:463
 msgid "Add / Remove"
 msgstr "Lisää / poista"
 
-#: ../libpurple/protocols/silc/chat.c:600
-#: ../libpurple/protocols/silc10/chat.c:581
 msgid "Group Name"
 msgstr "Ryhmän nimi"
 
-#: ../libpurple/protocols/silc/chat.c:604
-#: ../libpurple/protocols/silc/ops.c:1830
-#: ../libpurple/protocols/silc/silc.c:1236
-#: ../libpurple/protocols/silc10/chat.c:585
-#: ../libpurple/protocols/silc10/ops.c:1907
-#: ../libpurple/protocols/silc10/silc.c:937
 msgid "Passphrase"
 msgstr "Salasana"
 
-#: ../libpurple/protocols/silc/chat.c:615
-#: ../libpurple/protocols/silc10/chat.c:596
 #, c-format
 msgid "Please enter the %s channel private group name and passphrase."
 msgstr "Syötä kanavan %s yksityinen ryhmänimi ja salasana."
 
-#: ../libpurple/protocols/silc/chat.c:617
-#: ../libpurple/protocols/silc10/chat.c:598
 msgid "Add Channel Private Group"
 msgstr "Lisää kanavaan yksityinen ryhmä"
 
-#: ../libpurple/protocols/silc/chat.c:749
-#: ../libpurple/protocols/silc10/chat.c:726
 msgid "User Limit"
 msgstr "Käyttäjäraja"
 
-#: ../libpurple/protocols/silc/chat.c:750
-#: ../libpurple/protocols/silc10/chat.c:727
 msgid "Set user limit on channel. Set to zero to reset user limit."
 msgstr ""
 "Aseta käyttäjärajoitus kanavalle. Aseta nollaksi poistaaksesi rajoituksen."
 
-#: ../libpurple/protocols/silc/chat.c:914
-#: ../libpurple/protocols/silc10/chat.c:891
 msgid "Invite List"
 msgstr "Kutsulista"
 
-#: ../libpurple/protocols/silc/chat.c:919
-#: ../libpurple/protocols/silc10/chat.c:896
 msgid "Ban List"
 msgstr "Kieltolista"
 
-#: ../libpurple/protocols/silc/chat.c:927
-#: ../libpurple/protocols/silc10/chat.c:904
 msgid "Add Private Group"
 msgstr "Lisää yksityinen ryhmä"
 
-#: ../libpurple/protocols/silc/chat.c:940
-#: ../libpurple/protocols/silc10/chat.c:917
 msgid "Reset Permanent"
 msgstr "Nollaa pysyvä"
 
-#: ../libpurple/protocols/silc/chat.c:945
-#: ../libpurple/protocols/silc10/chat.c:922
 msgid "Set Permanent"
 msgstr "Aseta pysyvä"
 
-#: ../libpurple/protocols/silc/chat.c:953
-#: ../libpurple/protocols/silc10/chat.c:930
 msgid "Set User Limit"
 msgstr "Aseta käyttäjärajoitus"
 
-#: ../libpurple/protocols/silc/chat.c:959
-#: ../libpurple/protocols/silc10/chat.c:936
 msgid "Reset Topic Restriction"
 msgstr "Poista aiherajoitus"
 
-#: ../libpurple/protocols/silc/chat.c:964
-#: ../libpurple/protocols/silc10/chat.c:941
 msgid "Set Topic Restriction"
 msgstr "Aseta aiherajoitus"
 
-#: ../libpurple/protocols/silc/chat.c:971
-#: ../libpurple/protocols/silc10/chat.c:948
 msgid "Reset Private Channel"
 msgstr "Poista yksityinen kanava"
 
-#: ../libpurple/protocols/silc/chat.c:976
-#: ../libpurple/protocols/silc10/chat.c:953
 msgid "Set Private Channel"
 msgstr "Aseta yksityinen kanava"
 
-#: ../libpurple/protocols/silc/chat.c:983
-#: ../libpurple/protocols/silc10/chat.c:960
 msgid "Reset Secret Channel"
 msgstr "Poista salainen kanava"
 
-#: ../libpurple/protocols/silc/chat.c:988
-#: ../libpurple/protocols/silc10/chat.c:965
 msgid "Set Secret Channel"
 msgstr "Aseta salainen kanava"
 
-#: ../libpurple/protocols/silc/chat.c:1049
-#: ../libpurple/protocols/silc10/chat.c:1102
 #, c-format
 msgid ""
 "You have to join the %s channel before you are able to join the private group"
 msgstr ""
 "Sinun tulee liittyä kanavalle %s ennen kuin voit liittyä yksityiseen ryhmään"
 
-#: ../libpurple/protocols/silc/chat.c:1051
-#: ../libpurple/protocols/silc10/chat.c:1104
 msgid "Join Private Group"
 msgstr "Liity yksityiseen ryhmään"
 
-#: ../libpurple/protocols/silc/chat.c:1052
-#: ../libpurple/protocols/silc10/chat.c:1105
 msgid "Cannot join private group"
 msgstr "Yksityiseen ryhmään ei voi liittyä"
 
-#: ../libpurple/protocols/silc/chat.c:1248
-#: ../libpurple/protocols/silc/silc.c:1433
-#: ../libpurple/protocols/silc10/chat.c:1299
-#: ../libpurple/protocols/silc10/silc.c:1143
 msgid "Call Command"
 msgstr "Kutsu komentoa"
 
-#: ../libpurple/protocols/silc/chat.c:1248
-#: ../libpurple/protocols/silc/silc.c:1434
-#: ../libpurple/protocols/silc10/chat.c:1299
-#: ../libpurple/protocols/silc10/silc.c:1143
 msgid "Cannot call command"
 msgstr "Komentoa ei voi kutsua"
 
-#: ../libpurple/protocols/silc/chat.c:1249
-#: ../libpurple/protocols/silc/silc.c:1435
-#: ../libpurple/protocols/silc10/chat.c:1300
-#: ../libpurple/protocols/silc10/silc.c:1144
 msgid "Unknown command"
 msgstr "Tuntematon komento"
 
-#: ../libpurple/protocols/silc/ft.c:85 ../libpurple/protocols/silc/ft.c:101
-#: ../libpurple/protocols/silc/ft.c:104 ../libpurple/protocols/silc/ft.c:108
-#: ../libpurple/protocols/silc/ft.c:112 ../libpurple/protocols/silc/ft.c:116
-#: ../libpurple/protocols/silc/ft.c:120 ../libpurple/protocols/silc/ft.c:272
-#: ../libpurple/protocols/silc/ft.c:277 ../libpurple/protocols/silc/ft.c:282
-#: ../libpurple/protocols/silc/ft.c:288 ../libpurple/protocols/silc/ft.c:425
-#: ../libpurple/protocols/silc10/ft.c:89 ../libpurple/protocols/silc10/ft.c:92
-#: ../libpurple/protocols/silc10/ft.c:96
-#: ../libpurple/protocols/silc10/ft.c:100
-#: ../libpurple/protocols/silc10/ft.c:104
-#: ../libpurple/protocols/silc10/ft.c:205
-#: ../libpurple/protocols/silc10/ft.c:210
-#: ../libpurple/protocols/silc10/ft.c:215
-#: ../libpurple/protocols/silc10/ft.c:221
-#: ../libpurple/protocols/silc10/ft.c:340
 msgid "Secure File Transfer"
 msgstr "Turvallinen tiedostonsiirto"
 
-#: ../libpurple/protocols/silc/ft.c:86 ../libpurple/protocols/silc/ft.c:102
-#: ../libpurple/protocols/silc/ft.c:105 ../libpurple/protocols/silc/ft.c:109
-#: ../libpurple/protocols/silc/ft.c:113 ../libpurple/protocols/silc/ft.c:117
-#: ../libpurple/protocols/silc/ft.c:121 ../libpurple/protocols/silc10/ft.c:90
-#: ../libpurple/protocols/silc10/ft.c:93 ../libpurple/protocols/silc10/ft.c:97
-#: ../libpurple/protocols/silc10/ft.c:101
-#: ../libpurple/protocols/silc10/ft.c:105
 msgid "Error during file transfer"
 msgstr "Virhe tiedostonsiirrossa"
 
-#: ../libpurple/protocols/silc/ft.c:87
 msgid "Remote disconnected"
 msgstr "Etäpää katkaisi yhteyden"
 
-#: ../libpurple/protocols/silc/ft.c:106 ../libpurple/protocols/silc10/ft.c:94
 msgid "Permission denied"
 msgstr "Pääsy evätty"
 
-#: ../libpurple/protocols/silc/ft.c:110 ../libpurple/protocols/silc10/ft.c:98
 msgid "Key agreement failed"
 msgstr "Avain sopimus epäonnistui"
 
-#: ../libpurple/protocols/silc/ft.c:114
 msgid "Connection timed out"
 msgstr "Ei yhteyttä määräajassa"
 
-#: ../libpurple/protocols/silc/ft.c:118
 msgid "Creating connection failed"
 msgstr "Yhteyden muodostus epäonnistui"
 
-#: ../libpurple/protocols/silc/ft.c:122 ../libpurple/protocols/silc10/ft.c:102
 msgid "File transfer session does not exist"
 msgstr "Tiedostonsiirtoistuntoa ei ole"
 
-#: ../libpurple/protocols/silc/ft.c:273 ../libpurple/protocols/silc10/ft.c:206
 msgid "No file transfer session active"
 msgstr "Ei aktiivista tiedostonsiirtoistuntoa"
 
-#: ../libpurple/protocols/silc/ft.c:278 ../libpurple/protocols/silc10/ft.c:211
 msgid "File transfer already started"
 msgstr "Tiedostonsiirto on jo aloitettu"
 
-#: ../libpurple/protocols/silc/ft.c:283 ../libpurple/protocols/silc10/ft.c:216
 msgid "Could not perform key agreement for file transfer"
 msgstr "Avainsopimusta ei onnistuttu suorittamaan tiedostonsiirtoa varten"
 
-#: ../libpurple/protocols/silc/ft.c:289 ../libpurple/protocols/silc10/ft.c:222
 msgid "Could not start the file transfer"
 msgstr "Tiedostonsiirtoa ei voi aloittaa"
 
-#: ../libpurple/protocols/silc/ft.c:426 ../libpurple/protocols/silc10/ft.c:341
 msgid "Cannot send file"
 msgstr "Tiedoston lähetys ei onnistu"
 
-#: ../libpurple/protocols/silc/ops.c:76
 msgid "Error occurred"
 msgstr "Tapahtui virhe"
 
-#: ../libpurple/protocols/silc/ops.c:548 ../libpurple/protocols/silc/ops.c:557
-#: ../libpurple/protocols/silc/ops.c:566
-#: ../libpurple/protocols/silc10/ops.c:554
-#: ../libpurple/protocols/silc10/ops.c:563
-#: ../libpurple/protocols/silc10/ops.c:572
 #, c-format
 msgid "%s has changed the topic of <I>%s</I> to: %s"
 msgstr "%s on vaihtanut <I>%s</I> aiheeksi: %s"
 
-#: ../libpurple/protocols/silc/ops.c:632
-#: ../libpurple/protocols/silc10/ops.c:638
 #, c-format
 msgid "<I>%s</I> set channel <I>%s</I> modes to: %s"
 msgstr "<I>%s</I> muutti kanavan <I>%s</I> tilaa: %s"
 
-#: ../libpurple/protocols/silc/ops.c:636
-#: ../libpurple/protocols/silc10/ops.c:642
 #, c-format
 msgid "<I>%s</I> removed all channel <I>%s</I> modes"
 msgstr "<I>%s</I> muutti kaikki kanavan <I>%s</I> tilat"
 
-#: ../libpurple/protocols/silc/ops.c:669
-#: ../libpurple/protocols/silc10/ops.c:675
 #, c-format
 msgid "<I>%s</I> set <I>%s's</I> modes to: %s"
 msgstr "<I>%s</I> asetti <I>%s</I> tilan: %s"
 
-#: ../libpurple/protocols/silc/ops.c:677
-#: ../libpurple/protocols/silc10/ops.c:683
 #, c-format
 msgid "<I>%s</I> removed all <I>%s's</I> modes"
 msgstr "<I>%s</I> poisti kaikki <I>%s</I> tilat"
 
-#: ../libpurple/protocols/silc/ops.c:706
-#: ../libpurple/protocols/silc10/ops.c:712
 #, c-format
 msgid "You have been kicked off <I>%s</I> by <I>%s</I> (%s)"
 msgstr "Sinut on poistettu <I>%s</I> käyttäjä <I>%s</I> (%s)"
 
-#: ../libpurple/protocols/silc/ops.c:733 ../libpurple/protocols/silc/ops.c:738
-#: ../libpurple/protocols/silc/ops.c:743
-#: ../libpurple/protocols/silc10/ops.c:742
-#: ../libpurple/protocols/silc10/ops.c:747
-#: ../libpurple/protocols/silc10/ops.c:752
 #, c-format
 msgid "You have been killed by %s (%s)"
 msgstr "Sinut on poistanut %s (%s)"
 
-#: ../libpurple/protocols/silc/ops.c:764 ../libpurple/protocols/silc/ops.c:769
-#: ../libpurple/protocols/silc/ops.c:774
-#: ../libpurple/protocols/silc10/ops.c:773
-#: ../libpurple/protocols/silc10/ops.c:778
-#: ../libpurple/protocols/silc10/ops.c:783
 #, c-format
 msgid "Killed by %s (%s)"
 msgstr "Poistettu käyttäjän %s toimesta (%s)"
 
-#: ../libpurple/protocols/silc/ops.c:811
-#: ../libpurple/protocols/silc10/ops.c:829
 msgid "Server signoff"
 msgstr "Kirjaudu ulos palvelimelta"
 
-#: ../libpurple/protocols/silc/ops.c:997
-#: ../libpurple/protocols/silc10/ops.c:1017
 msgid "Personal Information"
 msgstr "Henkilökohtaiset tiedot"
 
-#: ../libpurple/protocols/silc/ops.c:1020
-#: ../libpurple/protocols/silc10/ops.c:1040
 msgid "Birth Day"
 msgstr "Syntymäpäivä"
 
-#: ../libpurple/protocols/silc/ops.c:1028
-#: ../libpurple/protocols/silc10/ops.c:1048
 msgid "Job Role"
 msgstr "Asema työssä"
 
-#: ../libpurple/protocols/silc/ops.c:1032
-#: ../libpurple/protocols/silc/silc.c:1229
-#: ../libpurple/protocols/silc10/ops.c:1052
-#: ../libpurple/protocols/silc10/silc.c:930
 msgid "Organization"
 msgstr "Organisaatio"
 
-#: ../libpurple/protocols/silc/ops.c:1036
-#: ../libpurple/protocols/silc10/ops.c:1056
 msgid "Unit"
 msgstr "Yksikkö"
 
-#: ../libpurple/protocols/silc/ops.c:1060
-#: ../libpurple/protocols/silc10/ops.c:1080
 msgid "Note"
 msgstr "Huomautus"
 
-#: ../libpurple/protocols/silc/ops.c:1106
-#: ../libpurple/protocols/silc10/ops.c:1128
 msgid "Join Chat"
 msgstr "Liity ryhmäkeskusteluun"
 
-#: ../libpurple/protocols/silc/ops.c:1140
-#: ../libpurple/protocols/silc10/chat.c:1039
 #, c-format
 msgid "You are channel founder on <I>%s</I>"
 msgstr "Olet kanavan perustaja kanavalla <I>%s</I>"
 
-#: ../libpurple/protocols/silc/ops.c:1144
-#: ../libpurple/protocols/silc10/chat.c:1043
 #, c-format
 msgid "Channel founder on <I>%s</I> is <I>%s</I>"
 msgstr "Kanavan perustaja kanavalla <I>%s</I> on <I>%s</I>"
 
-#: ../libpurple/protocols/silc/ops.c:1203
-#: ../libpurple/protocols/silc/ops.c:1341
-#: ../libpurple/protocols/silc10/ops.c:1183
-#: ../libpurple/protocols/silc10/ops.c:1332
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1078
 msgid "Real Name"
 msgstr "Oikea nimi"
 
-#: ../libpurple/protocols/silc/ops.c:1231
-#: ../libpurple/protocols/silc10/ops.c:1213
 msgid "Status Text"
 msgstr "Tilateksti"
 
-#: ../libpurple/protocols/silc/ops.c:1293
-#: ../libpurple/protocols/silc/ops.c:1367
-#: ../libpurple/protocols/silc10/ops.c:1285
-#: ../libpurple/protocols/silc10/ops.c:1357
 msgid "Public Key Fingerprint"
 msgstr "Julkisen avaimen sormenjälki"
 
-#: ../libpurple/protocols/silc/ops.c:1294
-#: ../libpurple/protocols/silc/ops.c:1368
-#: ../libpurple/protocols/silc10/ops.c:1286
-#: ../libpurple/protocols/silc10/ops.c:1358
 msgid "Public Key Babbleprint"
 msgstr "Julkisen avaimen \"babbleprint\""
 
-#: ../libpurple/protocols/silc/ops.c:1307
-#: ../libpurple/protocols/silc10/ops.c:1298
 msgid "_More..."
 msgstr "_Lisää..."
 
-#: ../libpurple/protocols/silc/ops.c:1386
-#: ../libpurple/protocols/silc/silc.c:1293
-#: ../libpurple/protocols/silc10/ops.c:1371
-#: ../libpurple/protocols/silc10/silc.c:994
 msgid "Detach From Server"
 msgstr "Irrota palvelimelta"
 
-#: ../libpurple/protocols/silc/ops.c:1386
-#: ../libpurple/protocols/silc10/ops.c:1371
 msgid "Cannot detach"
 msgstr "Irrottaminen ei onnistu"
 
-#: ../libpurple/protocols/silc/ops.c:1406
-#: ../libpurple/protocols/silc10/ops.c:1382
 msgid "Cannot set topic"
 msgstr "Aihetta ei voi asettaa"
 
-#: ../libpurple/protocols/silc/ops.c:1435
-#: ../libpurple/protocols/silc10/ops.c:1414
 msgid "Failed to change nickname"
 msgstr "Kutsumanimeä ei onnistuttu muuttamaan"
 
-#: ../libpurple/protocols/silc/ops.c:1484
-#: ../libpurple/protocols/silc10/ops.c:1462
 msgid "Roomlist"
 msgstr "Huoneluettelo"
 
-#: ../libpurple/protocols/silc/ops.c:1484
-#: ../libpurple/protocols/silc10/ops.c:1462
 msgid "Cannot get room list"
 msgstr "Huoneluetteloa ei saatu"
 
-#: ../libpurple/protocols/silc/ops.c:1485
 msgid "Network is empty"
 msgstr "Verkko on tyhjä"
 
-#: ../libpurple/protocols/silc/ops.c:1529
-#: ../libpurple/protocols/silc10/ops.c:1507
 msgid "No public key was received"
 msgstr "Ei saatu julkista avainta"
 
-#: ../libpurple/protocols/silc/ops.c:1541
-#: ../libpurple/protocols/silc/ops.c:1554
-#: ../libpurple/protocols/silc10/ops.c:1519
-#: ../libpurple/protocols/silc10/ops.c:1532
 msgid "Server Information"
 msgstr "Palvelimen tiedot"
 
-#: ../libpurple/protocols/silc/ops.c:1542
-#: ../libpurple/protocols/silc10/ops.c:1520
 msgid "Cannot get server information"
 msgstr "Ei saada palvelimen tietoja"
 
-#: ../libpurple/protocols/silc/ops.c:1565
-#: ../libpurple/protocols/silc10/ops.c:1549
-#: ../libpurple/protocols/silc10/ops.c:1558
 msgid "Server Statistics"
 msgstr "Palvelimen tilastoja"
 
-#: ../libpurple/protocols/silc/ops.c:1566
-#: ../libpurple/protocols/silc10/ops.c:1550
 msgid "Cannot get server statistics"
 msgstr "Ei saatu palvelimen tilastoja"
 
-#: ../libpurple/protocols/silc/ops.c:1573
-#: ../libpurple/protocols/silc10/ops.c:1581
 #, c-format
 msgid ""
 "Local server start time: %s\n"
@@ -11963,59 +8459,36 @@
 "Palvelinoperaattorit yhteensä: %d\n"
 "Reititinoperaattorit yhteensä: %d\n"
 
-#: ../libpurple/protocols/silc/ops.c:1605
-#: ../libpurple/protocols/silc10/ops.c:1604
 msgid "Network Statistics"
 msgstr "Verkkotilastoja"
 
-#: ../libpurple/protocols/silc/ops.c:1613
-#: ../libpurple/protocols/silc10/ops.c:1612
 msgid "Ping failed"
 msgstr "Ping epäonnistui"
 
-#: ../libpurple/protocols/silc/ops.c:1618
-#: ../libpurple/protocols/silc10/ops.c:1617
 msgid "Ping reply received from server"
 msgstr "Ping-vastaus saatu palvelimelta"
 
-#: ../libpurple/protocols/silc/ops.c:1626
-#: ../libpurple/protocols/silc10/ops.c:1625
 msgid "Could not kill user"
 msgstr "Käyttäjää ei voi poistaa"
 
-#: ../libpurple/protocols/silc/ops.c:1665
 msgid "WATCH"
 msgstr "TARKKAILE"
 
-#: ../libpurple/protocols/silc/ops.c:1665
 msgid "Cannot watch user"
 msgstr "Et voi tarkkailla käyttäjää"
 
-#: ../libpurple/protocols/silc/ops.c:1741
-#: ../libpurple/protocols/silc/ops.c:1792
-#: ../libpurple/protocols/silc/silc.c:394
-#: ../libpurple/protocols/silc10/ops.c:1817
-#: ../libpurple/protocols/silc10/ops.c:1864
-#: ../libpurple/protocols/silc10/silc.c:193
 msgid "Resuming session"
 msgstr "Palautetaan istunto"
 
-#: ../libpurple/protocols/silc/ops.c:1743
-#: ../libpurple/protocols/silc10/ops.c:1819
 msgid "Authenticating connection"
 msgstr "Todennetaan yhteys"
 
-#: ../libpurple/protocols/silc/ops.c:1794
-#: ../libpurple/protocols/silc10/ops.c:1866
 msgid "Verifying server public key"
 msgstr "Tarkistetaan palvelimen julkinen avain"
 
-#: ../libpurple/protocols/silc/ops.c:1831
-#: ../libpurple/protocols/silc10/ops.c:1908
 msgid "Passphrase required"
 msgstr "Vaatii salasanan"
 
-#: ../libpurple/protocols/silc/pk.c:98 ../libpurple/protocols/silc10/pk.c:104
 #, c-format
 msgid ""
 "Received %s's public key. Your local copy does not match this key. Would you "
@@ -12024,12 +8497,10 @@
 "Vastaanotettiin käyttäjän %s julkinen avain. Paikallinen kopiosi ei täsmää. "
 "Haluatko silti hyväksyä tämän julkisen avaimen?"
 
-#: ../libpurple/protocols/silc/pk.c:103 ../libpurple/protocols/silc10/pk.c:109
 #, c-format
 msgid "Received %s's public key. Would you like to accept this public key?"
 msgstr "Vastaanotettiin julkinen avain käyttäjältä %s. Hyväksytäänkö se?"
 
-#: ../libpurple/protocols/silc/pk.c:107 ../libpurple/protocols/silc10/pk.c:113
 #, c-format
 msgid ""
 "Fingerprint and babbleprint for the %s key are:\n"
@@ -12042,105 +8513,69 @@
 "%s\n"
 "%s\n"
 
-#: ../libpurple/protocols/silc/pk.c:110 ../libpurple/protocols/silc/pk.c:139
-#: ../libpurple/protocols/silc10/pk.c:116
-#: ../libpurple/protocols/silc10/pk.c:142
 msgid "Verify Public Key"
 msgstr "Tarkista julkinen avain"
 
-#: ../libpurple/protocols/silc/pk.c:115 ../libpurple/protocols/silc10/pk.c:121
 msgid "_View..."
 msgstr "_Näytä..."
 
-#: ../libpurple/protocols/silc/pk.c:140 ../libpurple/protocols/silc10/pk.c:143
 msgid "Unsupported public key type"
 msgstr "Julkisen avaimen tyyppiä ei tuettu"
 
-#: ../libpurple/protocols/silc/silc.c:319
-#: ../libpurple/protocols/silc10/ops.c:1755
 msgid "Disconnected by server"
 msgstr "Palvelin katkaisi yhteyden"
 
-#: ../libpurple/protocols/silc/silc.c:327
-#: ../libpurple/protocols/silc10/ops.c:1701
 msgid "Error during connecting to SILC Server"
 msgstr "Virhe luotaessa yhteyttä SILC-palvelimelle"
 
-#: ../libpurple/protocols/silc/silc.c:333
-#: ../libpurple/protocols/silc10/ops.c:1707
 msgid "Key Exchange failed"
 msgstr "Avaintenvaihto epäonnistui"
 
-#: ../libpurple/protocols/silc/silc.c:343
-#: ../libpurple/protocols/silc10/ops.c:1718
 msgid ""
 "Resuming detached session failed. Press Reconnect to create new connection."
 msgstr ""
 "Irrotetun yhteyden palauttaminen epäonnistui. Paina Uudelleenyhdistä "
 "luodaksesi uuden yhteyden."
 
-#: ../libpurple/protocols/silc/silc.c:373
-#: ../libpurple/protocols/silc/silc.c:420
-#: ../libpurple/protocols/silc10/silc.c:163
 msgid "Connection failed"
 msgstr "Yhteys epäonnistui"
 
-#: ../libpurple/protocols/silc/silc.c:397
-#: ../libpurple/protocols/silc10/silc.c:196
 msgid "Performing key exchange"
 msgstr "Suoritetaan avaintenvaihto"
 
-#: ../libpurple/protocols/silc/silc.c:449
-#: ../libpurple/protocols/silc10/silc.c:361
 msgid "Unable to create connection"
 msgstr "Yhteyden luominen epäonnistui"
 
-#: ../libpurple/protocols/silc/silc.c:492
-#: ../libpurple/protocols/silc/silc.c:508
-#: ../libpurple/protocols/silc/silc.c:537
-#: ../libpurple/protocols/silc10/silc.c:340
 msgid "Could not load SILC key pair"
 msgstr "SILC-avainparia ei voi ladata"
 
 #. Progress
-#: ../libpurple/protocols/silc/silc.c:522
-#: ../libpurple/protocols/silc10/silc.c:329
 msgid "Connecting to SILC Server"
 msgstr "Yhdistetään SILC-palvelimelle"
 
-#: ../libpurple/protocols/silc/silc.c:568
-#: ../libpurple/protocols/silc10/silc.c:271
 msgid "Out of memory"
 msgstr "Muisti loppu"
 
-#: ../libpurple/protocols/silc/silc.c:619
-#: ../libpurple/protocols/silc10/silc.c:317
 msgid "Cannot initialize SILC protocol"
 msgstr "SILC-yhteyskäytäntöä ei voi alustaa"
 
-#: ../libpurple/protocols/silc/silc.c:632
-#: ../libpurple/protocols/silc10/silc.c:324
 msgid "Error loading SILC key pair"
 msgstr "Virhe ladattaessa SILC-avainparia"
 
-#: ../libpurple/protocols/silc/silc.c:955
-#: ../libpurple/protocols/silc10/silc.c:656
+#, c-format
+msgid "Download %s: %s"
+msgstr "Lataa %s: %s"
+
 msgid "Your Current Mood"
 msgstr "Tämänhetkinen mielialasi"
 
-#: ../libpurple/protocols/silc/silc.c:957
-#: ../libpurple/protocols/silc10/silc.c:658 ../pidgin/gtkprefs.c:1795
 #, c-format
 msgid "Normal"
 msgstr "Normaali"
 
-#: ../libpurple/protocols/silc/silc.c:971
-#: ../libpurple/protocols/silc10/silc.c:672
 msgid "In love"
 msgstr "Rakastunut"
 
-#: ../libpurple/protocols/silc/silc.c:982
-#: ../libpurple/protocols/silc10/silc.c:683
 msgid ""
 "\n"
 "Your Preferred Contact Methods"
@@ -12148,63 +8583,36 @@
 "\n"
 "Suosimasi yhteystavat"
 
-#: ../libpurple/protocols/silc/silc.c:990
-#: ../libpurple/protocols/silc/util.c:567
-#: ../libpurple/protocols/silc10/silc.c:691
-#: ../libpurple/protocols/silc10/util.c:561
 msgid "SMS"
 msgstr "SMS"
 
-#: ../libpurple/protocols/silc/silc.c:992
-#: ../libpurple/protocols/silc/util.c:569
-#: ../libpurple/protocols/silc10/silc.c:693
-#: ../libpurple/protocols/silc10/util.c:563
 msgid "MMS"
 msgstr "MMS"
 
-#: ../libpurple/protocols/silc/silc.c:994
-#: ../libpurple/protocols/silc10/silc.c:695
 msgid "Video conferencing"
 msgstr "Videoneuvottelu"
 
-#: ../libpurple/protocols/silc/silc.c:999
-#: ../libpurple/protocols/silc10/silc.c:700
 msgid "Your Current Status"
 msgstr "Tämänhetkinen tilasi"
 
-#: ../libpurple/protocols/silc/silc.c:1006
-#: ../libpurple/protocols/silc10/silc.c:707
 msgid "Online Services"
 msgstr "Online-palvelut"
 
-#: ../libpurple/protocols/silc/silc.c:1009
-#: ../libpurple/protocols/silc10/silc.c:710
 msgid "Let others see what services you are using"
 msgstr "Anna muiden nähdä mitä palveluja käytät"
 
-#: ../libpurple/protocols/silc/silc.c:1015
-#: ../libpurple/protocols/silc10/silc.c:716
 msgid "Let others see what computer you are using"
 msgstr "Anna muiden nähdä mitä tietokonetta käytät"
 
-#: ../libpurple/protocols/silc/silc.c:1022
-#: ../libpurple/protocols/silc10/silc.c:723
 msgid "Your VCard File"
 msgstr "VCard-tiedostosi"
 
-#: ../libpurple/protocols/silc/silc.c:1028
 msgid "Timezone (UTC)"
 msgstr "Aikavyöhyke (UTC)"
 
-#: ../libpurple/protocols/silc/silc.c:1032
-#: ../libpurple/protocols/silc/silc.c:1033
-#: ../libpurple/protocols/silc10/silc.c:735
-#: ../libpurple/protocols/silc10/silc.c:736
 msgid "User Online Status Attributes"
 msgstr "Käyttäjän paikallaolo-ominaisuudet"
 
-#: ../libpurple/protocols/silc/silc.c:1034
-#: ../libpurple/protocols/silc10/silc.c:737
 msgid ""
 "You can let other users see your online status information and your personal "
 "information. Please fill the information you would like other users to see "
@@ -12214,212 +8622,123 @@
 "henkilökohtaiset tietosi. Syötä tiedot jotka haluat toisten näkevän "
 "itsestäsi."
 
-#: ../libpurple/protocols/silc/silc.c:1075
-#: ../libpurple/protocols/silc/silc.c:1081
-#: ../libpurple/protocols/silc/silc.c:1702
-#: ../libpurple/protocols/silc10/silc.c:778
-#: ../libpurple/protocols/silc10/silc.c:784
-#: ../libpurple/protocols/silc10/silc.c:1421
 msgid "Message of the Day"
 msgstr "Päivän viesti"
 
-#: ../libpurple/protocols/silc/silc.c:1075
-#: ../libpurple/protocols/silc10/silc.c:778
 msgid "No Message of the Day available"
 msgstr "Päivän viestiä ei ole"
 
-#: ../libpurple/protocols/silc/silc.c:1076
-#: ../libpurple/protocols/silc/silc.c:1697
-#: ../libpurple/protocols/silc10/silc.c:779
-#: ../libpurple/protocols/silc10/silc.c:1416
 msgid "There is no Message of the Day associated with this connection"
 msgstr "Ei ole Päivän viestiä joka olisi assosioitu tälle yhteydelle."
 
-#: ../libpurple/protocols/silc/silc.c:1127
-#: ../libpurple/protocols/silc/silc.c:1173
-#: ../libpurple/protocols/silc/silc.c:1244
-#: ../libpurple/protocols/silc/silc.c:1245
-#: ../libpurple/protocols/silc10/silc.c:830
-#: ../libpurple/protocols/silc10/silc.c:874
-#: ../libpurple/protocols/silc10/silc.c:945
-#: ../libpurple/protocols/silc10/silc.c:946
 msgid "Create New SILC Key Pair"
 msgstr "Luo uusi SILC-avainpari"
 
-#: ../libpurple/protocols/silc/silc.c:1127
-#: ../libpurple/protocols/silc10/silc.c:830
 msgid "Passphrases do not match"
 msgstr "Salasanat eivät täsmää"
 
-#: ../libpurple/protocols/silc/silc.c:1173
-#: ../libpurple/protocols/silc10/silc.c:874
 msgid "Key Pair Generation failed"
 msgstr "Avainparin luonti epäonnistui"
 
-#: ../libpurple/protocols/silc/silc.c:1212
-#: ../libpurple/protocols/silc10/silc.c:913
 msgid "Key length"
 msgstr "Avaimen pituus"
 
-#: ../libpurple/protocols/silc/silc.c:1214
-#: ../libpurple/protocols/silc10/silc.c:915
 msgid "Public key file"
 msgstr "Julkinen avaintiedosto"
 
-#: ../libpurple/protocols/silc/silc.c:1216
-#: ../libpurple/protocols/silc10/silc.c:917
 msgid "Private key file"
 msgstr "Yksityinen avaintiedosto"
 
-#: ../libpurple/protocols/silc/silc.c:1239
-#: ../libpurple/protocols/silc10/silc.c:940
 msgid "Passphrase (retype)"
 msgstr "Salasana (uudelleen)"
 
-#: ../libpurple/protocols/silc/silc.c:1246
-#: ../libpurple/protocols/silc10/silc.c:947
 msgid "Generate Key Pair"
 msgstr "Luo avainpari"
 
-#: ../libpurple/protocols/silc/silc.c:1289
-#: ../libpurple/protocols/silc10/silc.c:990
 msgid "Online Status"
 msgstr "Tila"
 
-#: ../libpurple/protocols/silc/silc.c:1297
-#: ../libpurple/protocols/silc10/silc.c:998
 msgid "View Message of the Day"
 msgstr "Näytä päivän viesti"
 
-#: ../libpurple/protocols/silc/silc.c:1301
-#: ../libpurple/protocols/silc10/silc.c:1002
 msgid "Create SILC Key Pair..."
 msgstr "Luo SILC-avainpari..."
 
-#: ../libpurple/protocols/silc/silc.c:1393
-#: ../libpurple/protocols/silc10/silc.c:1101
 #, c-format
 msgid "User <I>%s</I> is not present in the network"
 msgstr "Käyttäjä <I>%s</I> ei ole verkossa"
 
-#: ../libpurple/protocols/silc/silc.c:1573
-#: ../libpurple/protocols/silc10/silc.c:1292
 msgid "Topic too long"
 msgstr "Aihe liian pitkä"
 
-#: ../libpurple/protocols/silc/silc.c:1654
-#: ../libpurple/protocols/silc10/silc.c:1373
 msgid "You must specify a nick"
 msgstr "Sinun täytyy syöttää lempinimi"
 
-#: ../libpurple/protocols/silc/silc.c:1756
-#: ../libpurple/protocols/silc10/silc.c:1475
 #, c-format
 msgid "channel %s not found"
 msgstr "Kanavaa %s ei löydy"
 
-#: ../libpurple/protocols/silc/silc.c:1761
-#: ../libpurple/protocols/silc10/silc.c:1480
 #, c-format
 msgid "channel modes for %s: %s"
 msgstr "kanavan tilat kanavalle %s: %s"
 
-#: ../libpurple/protocols/silc/silc.c:1763
-#: ../libpurple/protocols/silc10/silc.c:1482
 #, c-format
 msgid "no channel modes are set on %s"
 msgstr "ei kanavan tiloja asetettu kanavalle %s"
 
-#: ../libpurple/protocols/silc/silc.c:1776
-#: ../libpurple/protocols/silc10/silc.c:1495
 #, c-format
 msgid "Failed to set cmodes for %s"
 msgstr "cmodes asetus epäonnistui, %s"
 
-#: ../libpurple/protocols/silc/silc.c:1806
-#: ../libpurple/protocols/silc10/silc.c:1525
 #, c-format
 msgid "Unknown command: %s, (may be a client bug)"
 msgstr "Tuntematon komento: %s, (mahdollisesti asiakasohjelman virhe)"
 
-#: ../libpurple/protocols/silc/silc.c:1869
-#: ../libpurple/protocols/silc10/silc.c:1588
 msgid "part [channel]:  Leave the chat"
 msgstr "part [kanava]:  Poistu keskustelusta"
 
-#: ../libpurple/protocols/silc/silc.c:1873
-#: ../libpurple/protocols/silc10/silc.c:1592
 msgid "leave [channel]:  Leave the chat"
 msgstr "leave [kanava]:  Poistu keskustelusta"
 
-#: ../libpurple/protocols/silc/silc.c:1877
-#: ../libpurple/protocols/silc10/silc.c:1596
 msgid "topic [&lt;new topic&gt;]:  View or change the topic"
 msgstr "topic [&lt;uusi aihe&gt;]: Näytä tai aseta aihe"
 
-#: ../libpurple/protocols/silc/silc.c:1882
-#: ../libpurple/protocols/silc10/silc.c:1601
 msgid "join &lt;channel&gt; [&lt;password&gt;]:  Join a chat on this network"
 msgstr "join &lt;kanava&gt; [&lt;salasana&gt;]: Liity kanavalle tässä verkossa"
 
-#: ../libpurple/protocols/silc/silc.c:1886
-#: ../libpurple/protocols/silc10/silc.c:1605
 msgid "list:  List channels on this network"
 msgstr "list: Listaa kanavat tässä verkossa"
 
-#: ../libpurple/protocols/silc/silc.c:1890
-#: ../libpurple/protocols/silc10/silc.c:1609
 msgid "whois &lt;nick&gt;:  View nick's information"
 msgstr "whois &lt;nimi&gt;: Näytä nimen tiedot"
 
-#: ../libpurple/protocols/silc/silc.c:1894
-#: ../libpurple/protocols/silc10/silc.c:1613
-#: ../libpurple/protocols/zephyr/zephyr.c:2700
 msgid "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user"
 msgstr "msg &lt;nimi&gt; &lt;viesti&gt;: Lähetä yksityisviesti käyttäjälle"
 
-#: ../libpurple/protocols/silc/silc.c:1898
-#: ../libpurple/protocols/silc10/silc.c:1617
 msgid "query &lt;nick&gt; [&lt;message&gt;]:  Send a private message to a user"
 msgstr "query &lt;nimi&gt; [&lt;viesti&gt;]: Lähetä yksityisviesti käyttäjälle"
 
-#: ../libpurple/protocols/silc/silc.c:1902
-#: ../libpurple/protocols/silc10/silc.c:1621
 msgid "motd:  View the server's Message Of The Day"
 msgstr "motd: Näytä palvelimen päivän viesti"
 
-#: ../libpurple/protocols/silc/silc.c:1906
-#: ../libpurple/protocols/silc10/silc.c:1625
 msgid "detach:  Detach this session"
 msgstr "detach: Irrota tämä istunto"
 
-#: ../libpurple/protocols/silc/silc.c:1910
-#: ../libpurple/protocols/silc10/silc.c:1629
 msgid "quit [message]:  Disconnect from the server, with an optional message"
 msgstr "quit [viesti]: Katkaise yhteys palvelimelle, valinnainen viesti"
 
-#: ../libpurple/protocols/silc/silc.c:1914
-#: ../libpurple/protocols/silc10/silc.c:1633
 msgid "call &lt;command&gt;:  Call any silc client command"
 msgstr "call &lt;komento&gt;: Kutsu mitä vain silc:n asiakaskomentoa."
 
-#: ../libpurple/protocols/silc/silc.c:1920
-#: ../libpurple/protocols/silc10/silc.c:1639
 msgid "kill &lt;nick&gt; [-pubkey|&lt;reason&gt;]:  Kill nick"
 msgstr "kill &lt;nimi&gt; [-pubkey|&lt;syy&gt;]: Tuhoa nimi"
 
-#: ../libpurple/protocols/silc/silc.c:1924
-#: ../libpurple/protocols/silc10/silc.c:1643
 msgid "nick &lt;newnick&gt;:  Change your nickname"
 msgstr "nick &lt;uusi nimi&gt;: Muuta (lempi)nimesi."
 
-#: ../libpurple/protocols/silc/silc.c:1928
-#: ../libpurple/protocols/silc10/silc.c:1647
 msgid "whowas &lt;nick&gt;:  View nick's information"
 msgstr "whowas &lt;nimi&gt;: Näytä nimen tiedot"
 
-#: ../libpurple/protocols/silc/silc.c:1932
-#: ../libpurple/protocols/silc10/silc.c:1651
 msgid ""
 "cmode &lt;channel&gt; [+|-&lt;modes&gt;] [arguments]:  Change or display "
 "channel modes"
@@ -12427,8 +8746,6 @@
 "cmode &lt;kanava&gt; [+|-&lt;tila&gt;] [argumentit]: Aseta tai näytä kanavan "
 "tilat."
 
-#: ../libpurple/protocols/silc/silc.c:1936
-#: ../libpurple/protocols/silc10/silc.c:1655
 msgid ""
 "cumode &lt;channel&gt; +|-&lt;modes&gt; &lt;nick&gt;:  Change nick's modes "
 "on channel"
@@ -12436,18 +8753,12 @@
 "cumode &lt;kanava&gt; +|-&lt;tila&gt; &lt;nimi&gt;: Muuta nimen tilaa "
 "kanavalla."
 
-#: ../libpurple/protocols/silc/silc.c:1940
-#: ../libpurple/protocols/silc10/silc.c:1659
 msgid "umode &lt;usermodes&gt;:  Set your modes in the network"
 msgstr "umode &lt;käyttäjätilat&gt;: Aseta omat tilasi verkossa"
 
-#: ../libpurple/protocols/silc/silc.c:1944
-#: ../libpurple/protocols/silc10/silc.c:1663
 msgid "oper &lt;nick&gt; [-pubkey]:  Get server operator privileges"
 msgstr "oper &lt;nimi&gt; [-pubkey]: Palvelinoperaattorin oikeudet"
 
-#: ../libpurple/protocols/silc/silc.c:1948
-#: ../libpurple/protocols/silc10/silc.c:1667
 msgid ""
 "invite &lt;channel&gt; [-|+]&lt;nick&gt;:  invite nick or add/remove from "
 "channel invite list"
@@ -12455,45 +8766,29 @@
 "invite &lt;kanava&gt; [-|+]&lt;nimi&gt;: Kutsu käyttäjä tai lisää/poista "
 "kanavan kutsulistalta"
 
-#: ../libpurple/protocols/silc/silc.c:1952
-#: ../libpurple/protocols/silc10/silc.c:1671
 msgid "kick &lt;channel&gt; &lt;nick&gt; [comment]:  Kick client from channel"
 msgstr ""
 "kick &lt;kanava&gt; &lt;nimi&gt; [kommentti]: Poista käyttäjä kanavalta"
 
-#: ../libpurple/protocols/silc/silc.c:1956
-#: ../libpurple/protocols/silc10/silc.c:1675
 msgid "info [server]:  View server administrative details"
 msgstr "info [palvelin]: Näytä palvelimen ylläpidolliset yksityiskohdat"
 
-#: ../libpurple/protocols/silc/silc.c:1960
-#: ../libpurple/protocols/silc10/silc.c:1679
 msgid "ban [&lt;channel&gt; +|-&lt;nick&gt;]:  Ban client from channel"
 msgstr "ban [%lt;kanava%gt; +|-&lt;nimi&gt;]: Kiellä käyttäjä kanavalta"
 
-#: ../libpurple/protocols/silc/silc.c:1964
-#: ../libpurple/protocols/silc10/silc.c:1683
 msgid "getkey &lt;nick|server&gt;:  Retrieve client's or server's public key"
 msgstr ""
 "getkey &lt;nimi|palvelin&gt;: Hae käyttäjän tai palvelimen julkinen avain"
 
-#: ../libpurple/protocols/silc/silc.c:1968
-#: ../libpurple/protocols/silc10/silc.c:1687
 msgid "stats:  View server and network statistics"
 msgstr "stats:  Näytä palvelimen ja verkon tilastot"
 
-#: ../libpurple/protocols/silc/silc.c:1972
-#: ../libpurple/protocols/silc10/silc.c:1691
 msgid "ping:  Send PING to the connected server"
 msgstr "ping:  Lähetä PING palvelimelle, johon ollaan yhteydessä"
 
-#: ../libpurple/protocols/silc/silc.c:1977
-#: ../libpurple/protocols/silc10/silc.c:1696
 msgid "users &lt;channel&gt;:  List users in channel"
 msgstr "users &lt;kanava&gt;: Näytä käyttäjät kanavalla"
 
-#: ../libpurple/protocols/silc/silc.c:1981
-#: ../libpurple/protocols/silc10/silc.c:1700
 msgid ""
 "names [-count|-ops|-halfops|-voices|-normal] &lt;channel(s)&gt;:  List "
 "specific users in channel(s)"
@@ -12510,141 +8805,91 @@
 #. *< name
 #. *< version
 #. *  summary
-#: ../libpurple/protocols/silc/silc.c:2092
-#: ../libpurple/protocols/silc10/silc.c:1825
 msgid "SILC Protocol Plugin"
 msgstr "SILC-yhteyskäytäntöliitännäinen"
 
 #. *  description
-#: ../libpurple/protocols/silc/silc.c:2094
-#: ../libpurple/protocols/silc10/silc.c:1827
 msgid "Secure Internet Live Conferencing (SILC) Protocol"
 msgstr "Secure Internet Live Conferencing (SILC) -yhteyskäytäntö"
 
-#: ../libpurple/protocols/silc/silc.c:2135
-#: ../libpurple/protocols/silc10/silc.c:1859 ../pidgin/gtkprefs.c:2150
 msgid "Network"
 msgstr "Verkko"
 
-#: ../libpurple/protocols/silc/silc.c:2146
-#: ../libpurple/protocols/silc10/silc.c:1870
 msgid "Public Key file"
 msgstr "Julkinen avaintiedosto"
 
-#: ../libpurple/protocols/silc/silc.c:2150
-#: ../libpurple/protocols/silc10/silc.c:1874
 msgid "Private Key file"
 msgstr "Yksityinen avaintiedosto"
 
-#: ../libpurple/protocols/silc/silc.c:2160
-#: ../libpurple/protocols/silc10/silc.c:1884
 msgid "Cipher"
 msgstr "Salaus"
 
-#: ../libpurple/protocols/silc/silc.c:2170
-#: ../libpurple/protocols/silc10/silc.c:1894
 msgid "HMAC"
 msgstr "HMAC"
 
-#: ../libpurple/protocols/silc/silc.c:2173
 msgid "Use Perfect Forward Secrecy"
 msgstr "Käytä täydellistä jatkosalaisuutta (PFS)"
 
-#: ../libpurple/protocols/silc/silc.c:2177
-#: ../libpurple/protocols/silc10/silc.c:1897
 msgid "Public key authentication"
 msgstr "Julkisella avaimella todentaminen"
 
-#: ../libpurple/protocols/silc/silc.c:2180
-#: ../libpurple/protocols/silc10/silc.c:1900
 msgid "Block IMs without Key Exchange"
 msgstr "Estä pikaviestit ilman avaintenvaihtoa"
 
-#: ../libpurple/protocols/silc/silc.c:2183
-#: ../libpurple/protocols/silc10/silc.c:1903
 msgid "Block messages to whiteboard"
 msgstr "Estä viestit kirjoitustaululle"
 
-#: ../libpurple/protocols/silc/silc.c:2186
-#: ../libpurple/protocols/silc10/silc.c:1906
 msgid "Automatically open whiteboard"
 msgstr "Avaa kirjoitustaulu automaattisesti"
 
-#: ../libpurple/protocols/silc/silc.c:2189
-#: ../libpurple/protocols/silc10/silc.c:1909
 msgid "Digitally sign and verify all messages"
 msgstr "Allekirjoita ja tarkista kaikki viestit digitaalisesti"
 
-#: ../libpurple/protocols/silc/util.c:207
-#: ../libpurple/protocols/silc/util.c:250
-#: ../libpurple/protocols/silc10/util.c:207
-#: ../libpurple/protocols/silc10/util.c:247
 msgid "Creating SILC key pair..."
 msgstr "Luodaan SILC-avainpari..."
 
-#: ../libpurple/protocols/silc/util.c:216
-#: ../libpurple/protocols/silc/util.c:259
 msgid "Cannot create SILC key pair\n"
 msgstr "SILC-avainparia ei voi luoda\n"
 
 #. Hint for translators: Please check the tabulator width here and in
 #. the next strings (short strings: 2 tabs, longer strings 1 tab,
 #. sum: 3 tabs or 24 characters)
-#: ../libpurple/protocols/silc/util.c:363
-#: ../libpurple/protocols/silc10/util.c:355
 #, c-format
 msgid "Real Name: \t%s\n"
 msgstr "Oikea nimi: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:365
-#: ../libpurple/protocols/silc10/util.c:357
 #, c-format
 msgid "User Name: \t%s\n"
 msgstr "Käyttäjänimi: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:367
-#: ../libpurple/protocols/silc10/util.c:359
 #, c-format
 msgid "Email: \t\t%s\n"
 msgstr "Sähköposti: \t\t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:369
-#: ../libpurple/protocols/silc10/util.c:361
 #, c-format
 msgid "Host Name: \t%s\n"
 msgstr "Palvelin: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:371
-#: ../libpurple/protocols/silc10/util.c:363
 #, c-format
 msgid "Organization: \t%s\n"
 msgstr "Organisaatio: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:373
-#: ../libpurple/protocols/silc10/util.c:365
 #, c-format
 msgid "Country: \t%s\n"
 msgstr "Maa: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:374
-#: ../libpurple/protocols/silc10/util.c:366
 #, c-format
 msgid "Algorithm: \t%s\n"
 msgstr "Algoritmi: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:375
-#: ../libpurple/protocols/silc10/util.c:367
 #, c-format
 msgid "Key Length: \t%d bits\n"
 msgstr "Avaimen pituus: \t%d bittiä\n"
 
-#: ../libpurple/protocols/silc/util.c:377
 #, c-format
 msgid "Version: \t%s\n"
 msgstr "Versio: \t%s\n"
 
-#: ../libpurple/protocols/silc/util.c:379
-#: ../libpurple/protocols/silc10/util.c:369
 #, c-format
 msgid ""
 "Public Key Fingerprint:\n"
@@ -12655,8 +8900,6 @@
 "%s\n"
 "\n"
 
-#: ../libpurple/protocols/silc/util.c:380
-#: ../libpurple/protocols/silc10/util.c:370
 #, c-format
 msgid ""
 "Public Key Babbleprint:\n"
@@ -12665,45 +8908,29 @@
 "Julkisen avaimen babbleprint\n"
 "%s"
 
-#: ../libpurple/protocols/silc/util.c:382
-#: ../libpurple/protocols/silc/util.c:383
-#: ../libpurple/protocols/silc10/util.c:374
-#: ../libpurple/protocols/silc10/util.c:375
 msgid "Public Key Information"
 msgstr "Julkisen avaimen tiedot"
 
-#: ../libpurple/protocols/silc/util.c:565
-#: ../libpurple/protocols/silc10/util.c:559
 msgid "Paging"
 msgstr "Kaukohaku"
 
-#: ../libpurple/protocols/silc/util.c:571
-#: ../libpurple/protocols/silc10/util.c:565
 msgid "Video Conferencing"
 msgstr "Videoneuvottelu"
 
-#: ../libpurple/protocols/silc/util.c:589
-#: ../libpurple/protocols/silc10/util.c:584
 msgid "Computer"
 msgstr "Tietokone"
 
-#: ../libpurple/protocols/silc/util.c:593
-#: ../libpurple/protocols/silc10/util.c:588
 msgid "PDA"
 msgstr "PDA"
 
-#: ../libpurple/protocols/silc/util.c:595
-#: ../libpurple/protocols/silc10/util.c:590
 msgid "Terminal"
 msgstr "Pääte"
 
-#: ../libpurple/protocols/silc/wb.c:288 ../libpurple/protocols/silc10/wb.c:287
 #, c-format
 msgid "%s sent message to whiteboard. Would you like to open the whiteboard?"
 msgstr ""
 "%s lähetti viestin kirjoitustaululle. Haluatko aukaista kirjoitustaulun?"
 
-#: ../libpurple/protocols/silc/wb.c:292 ../libpurple/protocols/silc10/wb.c:291
 #, c-format
 msgid ""
 "%s sent message to whiteboard on %s channel. Would you like to open the "
@@ -12712,106 +8939,74 @@
 "%s lähetti viestin kirjoitustaululle kanavalla %s. Haluatko aukaista "
 "kirjoitustaulun?"
 
-#: ../libpurple/protocols/silc/wb.c:306 ../libpurple/protocols/silc10/wb.c:305
 msgid "Whiteboard"
 msgstr "Kirjoitustaulu"
 
-#: ../libpurple/protocols/silc10/ops.c:1559
 msgid "No server statistics available"
 msgstr "Palvelimen tilastoja ei saatavilla."
 
-#: ../libpurple/protocols/silc10/ops.c:1937
 #, c-format
 msgid "Failure: Version mismatch, upgrade your client"
 msgstr "Virhe: Versioepäyhteensopivuus, päivitä ohjelmasi"
 
-#: ../libpurple/protocols/silc10/ops.c:1940
 #, c-format
 msgid "Failure: Remote does not trust/support your public key"
 msgstr "Virhe: Etäkone ei luota/tue julkista avaintasi"
 
-#: ../libpurple/protocols/silc10/ops.c:1943
 #, c-format
 msgid "Failure: Remote does not support proposed KE group"
 msgstr "Virhe: Etäkone ei tue ehdotettua KE-ryhmää"
 
-#: ../libpurple/protocols/silc10/ops.c:1946
 #, c-format
 msgid "Failure: Remote does not support proposed cipher"
 msgstr "Virhe: Etäkone ei tue ehdotettua salausta"
 
-#: ../libpurple/protocols/silc10/ops.c:1949
 #, c-format
 msgid "Failure: Remote does not support proposed PKCS"
 msgstr "Virhe: Etäkone ei tuo ehdotettua PKCS:aa"
 
-#: ../libpurple/protocols/silc10/ops.c:1952
 #, c-format
 msgid "Failure: Remote does not support proposed hash function"
 msgstr "Virhe: Etäkone ei tue ehdotettua tiivistysfunktiota"
 
-#: ../libpurple/protocols/silc10/ops.c:1955
 #, c-format
 msgid "Failure: Remote does not support proposed HMAC"
 msgstr "Virhe: Etäkone ei tue ehdotettua HMAC:ia"
 
-#: ../libpurple/protocols/silc10/ops.c:1957
 #, c-format
 msgid "Failure: Incorrect signature"
 msgstr "Virhe: Virheellinen allekirjoitus"
 
-#: ../libpurple/protocols/silc10/ops.c:1959
 #, c-format
 msgid "Failure: Invalid cookie"
 msgstr "Virhe: Virheellinen eväste"
 
-#: ../libpurple/protocols/silc10/ops.c:1970
 #, c-format
 msgid "Failure: Authentication failed"
 msgstr "Virhe: Todennus epäonnistui"
 
-#: ../libpurple/protocols/silc10/silc.c:185
 msgid "Cannot initialize SILC Client connection"
 msgstr "SILC-asiakasyhteyttä ei voi alustaa"
 
-#: ../libpurple/protocols/silc10/silc.c:294
 msgid "John Noname"
 msgstr "Pertti Perusnimi"
 
-#: ../libpurple/protocols/silc10/silc.c:338
 #, c-format
 msgid "Could not load SILC key pair: %s"
 msgstr "SILC-avainparia ei voi ladata: %s"
 
-#: ../libpurple/protocols/simple/simple.c:419
 msgid "Could not write"
 msgstr "Kirjoittaminen ei onnistu"
 
-#: ../libpurple/protocols/simple/simple.c:443
-#: ../libpurple/protocols/simple/simple.c:1713
 msgid "Could not connect"
 msgstr "Yhdistäminen ei onnistu"
 
-#: ../libpurple/protocols/simple/simple.c:1127
 msgid "Unknown server response."
 msgstr "Tuntematon palvelinvastaus."
 
-#: ../libpurple/protocols/simple/simple.c:1749
-#: ../libpurple/protocols/simple/simple.c:1795
-#: ../libpurple/protocols/simple/simple.c:1810
-#: ../libpurple/protocols/simple/simple.c:1865
 msgid "Could not create listen socket"
 msgstr "Kuuntelupistokkeen luominen epäonnistui"
 
-#: ../libpurple/protocols/simple/simple.c:1774
-msgid "Couldn't resolve host"
-msgstr "Yhteyttä isäntään ei voi löytää"
-
-#: ../libpurple/protocols/simple/simple.c:1875
-msgid "Could not resolve hostname"
-msgstr "Isäntänimeä ei voi selvittää"
-
-#: ../libpurple/protocols/simple/simple.c:1893
 msgid "SIP usernames may not contain whitespaces or @ symbols"
 msgstr "SIP-käyttäjänimissä ei tule olla välilyöntejä tai @-merkkejä"
 
@@ -12823,170 +9018,135 @@
 #. *< id
 #. *< name
 #. *< version
-#: ../libpurple/protocols/simple/simple.c:2073
 msgid "SIP/SIMPLE Protocol Plugin"
 msgstr "SIP/SIMPLE-yhteyskäytäntöliitännäinen"
 
 #. *  summary
-#: ../libpurple/protocols/simple/simple.c:2074
 msgid "The SIP/SIMPLE Protocol Plugin"
 msgstr "SIP/SIMPLE-yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/simple/simple.c:2102
 msgid "Publish status (note: everyone may watch you)"
 msgstr "Julkaise tilasi (huom: kuka tahansa voi seurata tilaasi)"
 
-#: ../libpurple/protocols/simple/simple.c:2108
 msgid "Use UDP"
 msgstr "Käytä UDP:tä"
 
-#: ../libpurple/protocols/simple/simple.c:2110
 msgid "Use proxy"
 msgstr "Käytä välipalvelinta"
 
-#: ../libpurple/protocols/simple/simple.c:2112
 msgid "Proxy"
 msgstr "Välipalvelin"
 
-#: ../libpurple/protocols/simple/simple.c:2114
 msgid "Auth User"
 msgstr "Todennus/käyttäjä"
 
-#: ../libpurple/protocols/simple/simple.c:2116
 msgid "Auth Domain"
 msgstr "Todennus/verkkoalue"
 
-#: ../libpurple/protocols/toc/toc.c:139
 #, c-format
 msgid "Looking up %s"
 msgstr "Etsitään %s"
 
-#: ../libpurple/protocols/toc/toc.c:148
 #, c-format
 msgid "Connect to %s failed"
 msgstr "%s: yhteyden muodostaminen epäonnistui"
 
-#: ../libpurple/protocols/toc/toc.c:201
 #, c-format
 msgid "Signon: %s"
 msgstr "Kirjautuminen: %s"
 
-#: ../libpurple/protocols/toc/toc.c:488
 #, c-format
 msgid "Unable to write file %s."
 msgstr "Ei kyetty kirjoittamaan tiedostoa %s."
 
-#: ../libpurple/protocols/toc/toc.c:491
 #, c-format
 msgid "Unable to read file %s."
 msgstr "Ei kyetty lukemaan tiedostoa %s."
 
-#: ../libpurple/protocols/toc/toc.c:494
 #, c-format
 msgid "Message too long, last %s bytes truncated."
 msgstr "Viesti on liian pitkä, viimeiset %s tavua katkaistu."
 
-#: ../libpurple/protocols/toc/toc.c:497
 #, c-format
 msgid "%s not currently logged in."
 msgstr "%s ei ole parhaillaan kirjautuneena sisään."
 
-#: ../libpurple/protocols/toc/toc.c:500
 #, c-format
 msgid "Warning of %s not allowed."
 msgstr "%s:n varoittaminen ei ole sallittua."
 
-#: ../libpurple/protocols/toc/toc.c:503
 #, c-format
 msgid "A message has been dropped, you are exceeding the server speed limit."
 msgstr "Viesti on hylätty, ylität palvelimen nopeusrajan."
 
-#: ../libpurple/protocols/toc/toc.c:506
 #, c-format
 msgid "Chat in %s is not available."
 msgstr "Ryhmäkeskustelu %s ei ole käytettävissä."
 
-#: ../libpurple/protocols/toc/toc.c:509
 #, c-format
 msgid "You are sending messages too fast to %s."
 msgstr "Lähetät viestejä %s:lle liian nopeasti."
 
-#: ../libpurple/protocols/toc/toc.c:512
 #, c-format
 msgid "You missed an IM from %s because it was too big."
 msgstr "Et saanut %s:n pikaviestiä koska se oli liian suuri."
 
-#: ../libpurple/protocols/toc/toc.c:515
 #, c-format
 msgid "You missed an IM from %s because it was sent too fast."
 msgstr "Et saanut %s:n pikaviestiä koska se lähetettiin liian nopeasti."
 
-#: ../libpurple/protocols/toc/toc.c:518
 #, c-format
 msgid "Failure."
 msgstr "Epäonnistuminen."
 
-#: ../libpurple/protocols/toc/toc.c:521
 #, c-format
 msgid "Too many matches."
 msgstr "Liian monta tulosta."
 
-#: ../libpurple/protocols/toc/toc.c:524
 #, c-format
 msgid "Need more qualifiers."
 msgstr "Tarvitaan lisää määritteitä."
 
-#: ../libpurple/protocols/toc/toc.c:527
 #, c-format
 msgid "Dir service temporarily unavailable."
 msgstr "Hakemistopalvelu ei tilapäisesti ole käytettävissä."
 
-#: ../libpurple/protocols/toc/toc.c:530
 #, c-format
 msgid "Email lookup restricted."
 msgstr "Sähköpostin katsominen rajoitettu."
 
-#: ../libpurple/protocols/toc/toc.c:533
 #, c-format
 msgid "Keyword ignored."
 msgstr "Avainsanasta ei välitetty."
 
-#: ../libpurple/protocols/toc/toc.c:536
 #, c-format
 msgid "No keywords."
 msgstr "Ei avainsanoja."
 
-#: ../libpurple/protocols/toc/toc.c:539
 #, c-format
 msgid "User has no directory information."
 msgstr "Käyttäjällä ei ole hakemistotietoja."
 
-#: ../libpurple/protocols/toc/toc.c:543
 #, c-format
 msgid "Country not supported."
 msgstr "Maa ei tuettu."
 
-#: ../libpurple/protocols/toc/toc.c:546
 #, c-format
 msgid "Failure unknown: %s."
 msgstr "Tunnistamaton epäonnistuminen: %s."
 
-#: ../libpurple/protocols/toc/toc.c:549
 #, c-format
 msgid "Incorrect username or password."
 msgstr "Virheellinen käyttäjänimi tai salasana."
 
-#: ../libpurple/protocols/toc/toc.c:552
 #, c-format
 msgid "The service is temporarily unavailable."
 msgstr "Palvelu ei tilapäisesti ole käytössä."
 
-#: ../libpurple/protocols/toc/toc.c:555
 #, c-format
 msgid "Your warning level is currently too high to log in."
 msgstr "Varoitustasosi on parhaillaan liian korkea kirjautuaksesi sisään."
 
-#: ../libpurple/protocols/toc/toc.c:558
 #, c-format
 msgid ""
 "You have been connecting and disconnecting too frequently.  Wait ten minutes "
@@ -12996,79 +9156,61 @@
 "ja yritä uudestaan. Jos jatkat yrittämistä, joudut odottamaan vielä "
 "pidempään."
 
-#: ../libpurple/protocols/toc/toc.c:560
 #, c-format
 msgid "An unknown signon error has occurred: %s."
 msgstr "Tuntematon sisäänkirjautumisvirhe esiintyi: %s."
 
-#: ../libpurple/protocols/toc/toc.c:563
 #, c-format
 msgid "An unknown error, %d, has occurred.  Info: %s"
 msgstr "Tuntematon virhe, %d, esiintyi. Tiedot: %s"
 
-#: ../libpurple/protocols/toc/toc.c:590
 msgid "Invalid Groupname"
 msgstr "Epäkelpo ryhmän nimi"
 
-#: ../libpurple/protocols/toc/toc.c:674
 msgid "Connection Closed"
 msgstr "Yhteys suljettu"
 
-#: ../libpurple/protocols/toc/toc.c:714
 msgid "Waiting for reply..."
 msgstr "Odotetaan vastausta..."
 
-#: ../libpurple/protocols/toc/toc.c:792
 msgid "TOC has come back from its pause. You may now send messages again."
 msgstr "TOC on palannut tauoltaan. Voit lähettää viestejä jälleen."
 
-#: ../libpurple/protocols/toc/toc.c:995
 msgid "Password Change Successful"
 msgstr "Salasanan vaihto onnistui"
 
-#: ../libpurple/protocols/toc/toc.c:1366 ../pidgin/gtkblist.c:6847
 msgid "_Group:"
 msgstr "_Ryhmä:"
 
-#: ../libpurple/protocols/toc/toc.c:1535
 msgid "Get Dir Info"
 msgstr "Hae hakemistotiedot"
 
-#: ../libpurple/protocols/toc/toc.c:1675
 msgid "Set Dir Info"
 msgstr "Aseta hakemistotiedot"
 
-#: ../libpurple/protocols/toc/toc.c:1797
 #, c-format
 msgid "Could not open %s for writing!"
 msgstr "%s:n avaaminen kirjoitusta varten epäonnistui!"
 
-#: ../libpurple/protocols/toc/toc.c:1833
 msgid "File transfer failed; other side probably canceled."
 msgstr ""
 "Tiedostonsiirto epäonnistui. Toinen osapuoli luultavasti katkaisi siirron."
 
-#: ../libpurple/protocols/toc/toc.c:1878 ../libpurple/protocols/toc/toc.c:1918
-#: ../libpurple/protocols/toc/toc.c:2042 ../libpurple/protocols/toc/toc.c:2130
 msgid "Could not connect for transfer."
 msgstr "Yhteyttä siirtoa varten ei voi muodostaa."
 
-#: ../libpurple/protocols/toc/toc.c:2075
 msgid "Could not write file header.  The file will not be transferred."
 msgstr "Tiedosto-otsikkoa ei voi kirjoittaa. Tiedostoa ei siirretä."
 
-#: ../libpurple/protocols/toc/toc.c:2175
 msgid "Save As..."
 msgstr "Tallenna nimellä..."
 
-#: ../libpurple/protocols/toc/toc.c:2209
 #, c-format
 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 pyytää %s hyväksymään %d tiedoston: %s (%.2f %s)%s%s"
 msgstr[1] "%s pyytää %s hyväksymään %d tiedostot: %s (%.2f %s)%s%s"
 
-#: ../libpurple/protocols/toc/toc.c:2216
 #, c-format
 msgid "%s requests you to send them a file"
 msgstr "%s pyytää sinua lähettämään hänelle tiedoston"
@@ -13083,29 +9225,23 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/toc/toc.c:2306 ../libpurple/protocols/toc/toc.c:2308
 msgid "TOC Protocol Plugin"
 msgstr "TOC-yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:745
 #, c-format
 msgid "%s has sent you a webcam invite, which is not yet supported."
 msgstr "%s on lähettänyt webkamera-kutsun, mikä ei ole vielä tuettuna."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:803
 msgid "Your Yahoo! message did not get sent."
 msgstr "Yahoo!-viestiäsi ei lähetetty."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:916
 #, c-format
 msgid "Yahoo! system message for %s:"
 msgstr "Yahoo!-järjestelmäviesti käyttäjälle %s:"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:990
 msgid "Authorization denied message:"
 msgstr "Valtuutuksen eväysviesti:"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1008
 #, c-format
 msgid ""
 "%s has (retroactively) denied your request to add them to your list for the "
@@ -13114,17 +9250,14 @@
 "Käyttäjä %s on (taannehtivasti) evännyt pyyntösi lisätä hänet tuttaviisi "
 "seuraavasta syystä: %s."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1011
 #, c-format
 msgid "%s has (retroactively) denied your request to add them to your list."
 msgstr ""
 "Käyttäjä %s on (taannehtivasti) evännyt pyyntösi lisätä hänet tuttaviisi."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1013
 msgid "Add buddy rejected"
 msgstr "Tuttavan lisääminen estetty"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:1997
 #, c-format
 msgid ""
 "The Yahoo server has requested the use of an unrecognized authentication "
@@ -13135,11 +9268,9 @@
 "luultavasti mahdollista kirjautua Yahoo-palveluun tällä asiakasohjelmalla. "
 "Tarkista päivitykset osoitteesta: %s."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2000
 msgid "Failed Yahoo! Authentication"
 msgstr "Yahoo!:n todennus epäonnistui"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2078
 #, c-format
 msgid ""
 "You have tried to ignore %s, but the user is on your buddy list.  Clicking "
@@ -13149,51 +9280,36 @@
 "Painaessasi \"Kyllä\" poistat hänet tuttavistasi eikä häneltä saapuneista "
 "viesteistä enää välitetä."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2081
 msgid "Ignore buddy?"
 msgstr "Jätä tuttava huomiotta?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2152
 msgid "Your account is locked, please log in to the Yahoo! website."
 msgstr "Käyttäjätilisi on lukittu, kirjaudu sisään yahoo-websivustolta."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2155
 #, c-format
 msgid "Unknown error number %d. Logging into the Yahoo! website may fix this."
 msgstr ""
 "Tuntematon viesti numero %d. Kirjautumalla Yahoo! verkkosivuille saattaa "
 "korjata tämän."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2208
 #, c-format
 msgid "Could not add buddy %s to group %s to the server list on account %s."
 msgstr ""
 "Tuttavaa %s ei voi lisätä ryhmään %s palvelimen tuttavissa, tilillä %s."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2211
 msgid "Could not add buddy to server list"
 msgstr "Tuttavaa ei voi lisätä palvelimen tuttaviin"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2333
 #, c-format
 msgid "[ Audible %s/%s/%s.swf ] %s"
 msgstr "[ Ääniäinen %s/%s/%s.swf ] %s"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2689
 msgid "Received unexpected HTTP response from server."
 msgstr "Odottamaton HTTP-vastaus palvelimelta."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2718
-#: ../libpurple/protocols/yahoo/yahoo.c:2906
-#: ../libpurple/protocols/yahoo/yahoo.c:3011
-#: ../libpurple/protocols/yahoo/yahoo.c:3022
-#: ../libpurple/protocols/yahoo/yahoochat.c:1525
-#: ../libpurple/protocols/yahoo/yahoochat.c:1595
-#: ../libpurple/protocols/yahoo/ycht.c:586
 msgid "Connection problem"
 msgstr "Yhteysvirhe"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2744
 #, c-format
 msgid ""
 "Lost connection with %s:\n"
@@ -13202,7 +9318,6 @@
 "Yhteys palvelimeen %s katkesi:\n"
 "%s"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:2769
 #, c-format
 msgid ""
 "Could not establish a connection with %s:\n"
@@ -13211,103 +9326,72 @@
 "Yhteyttä ei voi muodostaa palvelimeen %s:\n"
 "%s"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3138
-#: ../libpurple/protocols/yahoo/yahoo.c:3833
 msgid "Not at Home"
 msgstr "Poissa kotoa"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3140
-#: ../libpurple/protocols/yahoo/yahoo.c:3836
 msgid "Not at Desk"
 msgstr "Poissa työpöydältä"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3142
-#: ../libpurple/protocols/yahoo/yahoo.c:3839
 msgid "Not in Office"
 msgstr "Poissa toimistolta"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3146
-#: ../libpurple/protocols/yahoo/yahoo.c:3845
 msgid "On Vacation"
 msgstr "Lomalla"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3150
-#: ../libpurple/protocols/yahoo/yahoo.c:3851
 msgid "Stepped Out"
 msgstr "Piipahdan ulkona"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3243
-#: ../libpurple/protocols/yahoo/yahoo.c:3273
 msgid "Not on server list"
 msgstr "Ei palvelimen tuttavissa"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3290
-#: ../libpurple/protocols/yahoo/yahoo.c:3348
 msgid "Appear Online"
 msgstr "Näytä linjoilla olevalta"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3293
-#: ../libpurple/protocols/yahoo/yahoo.c:3369
 msgid "Appear Permanently Offline"
 msgstr "Näytä pysyvästi poissa linjoilta olevalta"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3311
 msgid "Presence"
 msgstr "Läsnäolo"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3354
 msgid "Appear Offline"
 msgstr "Näytä poissa linjoilta olevalta"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3363
 msgid "Don't Appear Permanently Offline"
 msgstr "Älä näytä pysyvästi poissa linjoilta olevalta"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3411
 msgid "Join in Chat"
 msgstr "Liity ryhmäkeskusteluun"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3417
 msgid "Initiate Conference"
 msgstr "Aloita neuvottelu"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3445
 msgid "Presence Settings"
 msgstr "Läsnäoloasetukset"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3451
 msgid "Start Doodling"
 msgstr "Aloita piirtely"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3561
 msgid "Activate which ID?"
 msgstr "Mikä tunnus (ID) aktivoidaan?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3572
 msgid "Join whom in chat?"
 msgstr "Kenen seuraan liitytään ryhmäkeskustelussa?"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3584
 msgid "Activate ID..."
 msgstr "Aktivoi tunnus (ID)..."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3588
 msgid "Join User in Chat..."
 msgstr "Liity käyttäjän seuraan ryhmäkeskustelussa..."
 
-#: ../libpurple/protocols/yahoo/yahoo.c:3593
 msgid "Open Inbox"
 msgstr "Avaa saapuneet-kansio"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4182
 msgid "join &lt;room&gt;:  Join a chat room on the Yahoo network"
 msgstr "join: &lt;huone&gt;: Liity keskusteluhuoneeseen Yahoo-verkossa"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4187
 msgid "list: List rooms on the Yahoo network"
 msgstr "list: Listaa kanavat Yahoo-verkossa"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4195
 msgid "doodle: Request user to start a Doodle session"
 msgstr "doodle: Pyydä käyttäjää aloittamaan piirtelyistunto"
 
@@ -13321,92 +9405,64 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/yahoo/yahoo.c:4404
-#: ../libpurple/protocols/yahoo/yahoo.c:4406
 msgid "Yahoo Protocol Plugin"
 msgstr "Yahoo-yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4429
 msgid "Yahoo Japan"
 msgstr "Yahoo Japani"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4432
 msgid "Pager server"
 msgstr "Hakulaitepalvelin"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4435
 msgid "Japan Pager server"
 msgstr "Hakulaitepalvelin (Japani)"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4438
 msgid "Pager port"
 msgstr "Hakulaiteportti"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4441
 msgid "File transfer server"
 msgstr "Tiedostonsiirtopalvelin"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4444
 msgid "Japan file transfer server"
 msgstr "Tiedostonsiirtopalvelin (Japani)"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4447
 msgid "File transfer port"
 msgstr "Tiedostonsiirtoportti"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4450
 msgid "Chat room locale"
 msgstr "Keskusteluhuoneen paikallisasetus"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4453
 msgid "Ignore conference and chatroom invitations"
 msgstr "Jätä konferenssi- ja keskusteluhuonekutsut huomiotta"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4461
 msgid "Chat room list URL"
 msgstr "Keskusteluhuoneluettelon URL"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4464
 msgid "Yahoo Chat server"
 msgstr "Yahoo-ryhmäkeskustelupalvelin"
 
-#: ../libpurple/protocols/yahoo/yahoo.c:4467
 msgid "Yahoo Chat port"
 msgstr "Yahoo-ryhmäkeskustelupalvelimen portti"
 
 #. Write a local message to this conversation showing that a request for a
 #. * Doodle session has been made
 #.
-#: ../libpurple/protocols/yahoo/yahoo_doodle.c:98
 msgid "Sent Doodle request."
 msgstr "Lähetä piirtelypyyntö (doodle)."
 
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:319
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:328
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:337
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:1111
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:1515
 msgid "Unable to establish file descriptor."
 msgstr "Ei kyetty muodostamaan tiedostokahvaa."
 
-#: ../libpurple/protocols/yahoo/yahoo_filexfer.c:1410
 #, c-format
 msgid "%s is trying to send you a group of %d files.\n"
 msgstr "%s tarjoaa %d tiedoston tiedostoryhmää.\n"
 
-#: ../libpurple/protocols/yahoo/yahoo_packet.c:307
-msgid "Write Error"
-msgstr "Virhe kirjoituksessa"
-
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:797
 msgid "Yahoo! Japan Profile"
 msgstr "Yahoo! Japan -profiili"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:798
 msgid "Yahoo! Profile"
 msgstr "Yahoo!-profiili"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:838
 msgid ""
 "Sorry, profiles marked as containing adult content are not supported at this "
 "time."
@@ -13414,7 +9470,6 @@
 "Tällä hetkellä profiileja jotka on merkitty sisältämään aikuisviihdettä, ei "
 "tueta."
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:840
 msgid ""
 "If you wish to view this profile, you will need to visit this link in your "
 "web browser:"
@@ -13422,47 +9477,34 @@
 "Jos haluat katsoa tätä profiilia, sinun tulee seurata tätä linkkiä "
 "selaimessasi:"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1040
 msgid "Yahoo! ID"
 msgstr "Yahoo! ID"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1116
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1120
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1124
 msgid "Hobbies"
 msgstr "Harrastukset"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1134
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1138
 msgid "Latest News"
 msgstr "Uutiset"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1159
 msgid "Home Page"
 msgstr "Kotisivu"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1174
 msgid "Cool Link 1"
 msgstr "Linkki 1"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1179
 msgid "Cool Link 2"
 msgstr "Linkki 2"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1183
 msgid "Cool Link 3"
 msgstr "Linkki 3"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1197
 msgid "Last Update"
 msgstr "Edellinen päivitys"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1206
 #, c-format
 msgid "User information for %s unavailable"
 msgstr "%s:n käyttäjätiedot eivät ole saatavilla"
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1212
 msgid ""
 "Sorry, this profile seems to be in a language or format that is not "
 "supported at this time."
@@ -13470,7 +9512,6 @@
 "Tämä profiili näyttää käyttävän kieltä tai muotoa jota ei tueta tällä "
 "hetkellä."
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1228
 msgid ""
 "Could not retrieve the user's profile. This most likely is a temporary "
 "server-side problem. Please try again later."
@@ -13478,7 +9519,6 @@
 "Käyttäjän profiilia ei voi hakea. Tämä on todennäköisesti väliaikainen "
 "palvelimen ongelma. Ole hyvä ja yritä myöhemmin uudestaan."
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1231
 msgid ""
 "Could not retrieve the user's profile. This most likely means that the user "
 "does not exist; however, Yahoo! sometimes does fail to find a user's "
@@ -13489,39 +9529,31 @@
 "profiilin. Jos olet varma että käyttäjä on olemassa, yritä myöhemmin "
 "uudelleen."
 
-#: ../libpurple/protocols/yahoo/yahoo_profile.c:1238
 msgid "The user's profile is empty."
 msgstr "Käyttäjän profiili on tyhjä."
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:222
 #, c-format
 msgid "%s declined your conference invitation to room \"%s\" because \"%s\"."
 msgstr "%s kieltäytyi kutsustasi huoneeseen \"%s\" koska \"%s\"."
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:224
 msgid "Invitation Rejected"
 msgstr "Kutsusta kieltäydytty"
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:443
 msgid "Failed to join chat"
 msgstr "Ryhmäkeskusteluun liittyminen epäonnistui"
 
 #. -6
-#: ../libpurple/protocols/yahoo/yahoochat.c:446
 msgid "Unknown room"
 msgstr "Tuntematon huone"
 
 #. -15
-#: ../libpurple/protocols/yahoo/yahoochat.c:449
 msgid "Maybe the room is full"
 msgstr "Ehkä huone on täynnä"
 
 #. -35
-#: ../libpurple/protocols/yahoo/yahoochat.c:452
 msgid "Not available"
 msgstr "Ei olemassa"
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:456
 msgid ""
 "Unknown error. You may need to logout and wait five minutes before being "
 "able to rejoin a chatroom"
@@ -13529,46 +9561,34 @@
 "Tuntematon virhe. Voi olla että sinun pitää kirjautua ulos ja odottaa viisi "
 "minuuttia ennen uudelleenliittymistä keskusteluhuoneeseen"
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:539
 #, c-format
 msgid "You are now chatting in %s."
 msgstr "Olet nyt keskustelemassa huoneessa %s"
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:728
 msgid "Failed to join buddy in chat"
 msgstr "Liittyminen tuttavan seuraan keskusteluhuoneeseen epäonnistui"
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:729
 msgid "Maybe they're not in a chat?"
 msgstr "Ehkä he eivät ole ryhmäkeskustelussa?"
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:1425
-#: ../libpurple/protocols/yahoo/yahoochat.c:1451
 msgid "Fetching the room list failed."
 msgstr "Huoneluettelon haku epäonnistui."
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:1511
 msgid "Voices"
 msgstr "Äänet"
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:1514
 msgid "Webcams"
 msgstr "Web-kamerat"
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:1525
-#: ../libpurple/protocols/yahoo/yahoochat.c:1595
 msgid "Unable to fetch room list."
 msgstr "Huoneluetteloa ei voi hakea."
 
-#: ../libpurple/protocols/yahoo/yahoochat.c:1588
 msgid "User Rooms"
 msgstr "Käyttäjän huoneet"
 
-#: ../libpurple/protocols/yahoo/ycht.c:457
 msgid "Connection problem with the YCHT server."
 msgstr "Yhteysvirhe YCHT-palvelimen kanssa"
 
-#: ../libpurple/protocols/yahoo/ycht.c:476
 #, c-format
 msgid ""
 "Lost connection with server\n"
@@ -13577,7 +9597,6 @@
 "Yhteys palvelimeen katkesi\n"
 "%s"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:358
 msgid ""
 "(There was an error converting this message.\t Check the 'Encoding' option "
 "in the Account Editor)"
@@ -13585,77 +9604,58 @@
 "(Tämän viestin muunnoksessa oli virhe.\t Tarkista \"Merkistö\"-valinta tilin "
 "muokkausikkunasta)"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:756
 #, c-format
 msgid "Unable to send to chat %s,%s,%s"
 msgstr "Ryhmäkeskusteluun ei voi lähettää %s,%s,%s"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:795
-#: ../libpurple/protocols/zephyr/zephyr.c:1170
 msgid "Hidden or not logged-in"
 msgstr "Näkymättömänä tai poissa linjoilta"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:801
-#: ../libpurple/protocols/zephyr/zephyr.c:1172
 #, c-format
 msgid "<br>At %s since %s"
 msgstr "<br>Paikassa: %s saapunut: %s"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:1510
-#: ../libpurple/protocols/zephyr/zephyr.c:1511
 msgid "Anyone"
 msgstr "Kuka tahansa"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2369
 msgid "_Class:"
 msgstr "_Luokka:"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2375
 msgid "_Instance:"
 msgstr "_Ilmentymä:"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2381
 msgid "_Recipient:"
 msgstr "_Vastaanottaja:"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2392
 #, c-format
 msgid "Attempt to subscribe to %s,%s,%s failed"
 msgstr "Yritys tilata %s,%s,%s epäonnistui"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2705
 msgid "zlocate &lt;nick&gt;: Locate user"
 msgstr "zlocate &lt;nimi&gt;: Paikanna käyttäjä"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2710
 msgid "zl &lt;nick&gt;: Locate user"
 msgstr "zl &lt;nimi&gt;: Paikanna käyttäjä"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2715
 msgid "instance &lt;instance&gt;: Set the instance to be used on this class"
 msgstr ""
 "instance &lt;ilmentymä&gt;: Aseta ilmentymä jota käytetään tässä luokassa"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2720
 msgid "inst &lt;instance&gt;: Set the instance to be used on this class"
 msgstr "inst &lt;ilmentymä&gt;: Aseta ilmentymä jota käytetään tässä luokassa"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2725
 msgid "topic &lt;instance&gt;: Set the instance to be used on this class"
 msgstr "topic &lt;ilmentymä&gt;: Aseta ilmentymä jota käytetään tässä luokassa"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2731
 msgid "sub &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Join a new chat"
 msgstr ""
 "sub &lt;luokka&gt; &lt;ilmentymä&gt; &lt;vastaanottaja&gt;: Liity uuteen "
 "ryhmäkeskusteluun"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2736
 msgid ""
 "zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
 msgstr "zi &lt;ilmentymä&gt;: Lähetä viesti &lt;viesti,<i>ilmentymä</i>,*&gt;"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2742
 msgid ""
 "zci &lt;class&gt; &lt;instance&gt;: Send a message to &lt;<i>class</i>,"
 "<i>instance</i>,*&gt;"
@@ -13663,7 +9663,6 @@
 "zci &lt;luokka&gt; &lt;ilmentymä&gt;: Lähetä viesti &lt;<i>luokka</i>,"
 "<i>ilmentymä</i>,*&gt;"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2748
 msgid ""
 "zcir &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;"
 "<i>class</i>,<i>instance</i>,<i>recipient</i>&gt;"
@@ -13671,7 +9670,6 @@
 "zcir &lt;luokka&gt; &lt;ilmentymä&gt; &lt;vastaanottaja&gt;: Lähetä viesti "
 "&lt;<i>luokka</i>,<i>ilmentymä</i>,<i>vastaanottaja</i>&gt;"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2754
 msgid ""
 "zir &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;MESSAGE,"
 "<i>instance</i>,<i>recipient</i>&gt;"
@@ -13679,15 +9677,12 @@
 "zir &lt;ilmentymä&gt; &lt;vastaanottaja&gt;: Lähetä viesti &lt;VIESTI,"
 "<i>ilmentymä</i>,<i>vastaanottaja</i>&gt;"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2759
 msgid "zc &lt;class&gt;: Send a message to &lt;<i>class</i>,PERSONAL,*&gt;"
 msgstr "zc &lt;luokka&gt;: Lähetä viesti &lt;<i>luokka</i>,YKSITYINEN,*&gt;"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2835
 msgid "Resubscribe"
 msgstr "Tilaa uudelleen"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2838
 msgid "Retrieve subscriptions from server"
 msgstr "Hae tilaukset palvelimelta"
 
@@ -13701,45 +9696,33 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../libpurple/protocols/zephyr/zephyr.c:2931
-#: ../libpurple/protocols/zephyr/zephyr.c:2933
 msgid "Zephyr Protocol Plugin"
 msgstr "Zephyr-yhteyskäytäntöliitännäinen"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2958
 msgid "Use tzc"
 msgstr "Käytä tzc"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2961
 msgid "tzc command"
 msgstr "tzc-komento"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2964
 msgid "Export to .anyone"
 msgstr "Vie tiedostoon .anyone"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2967
 msgid "Export to .zephyr.subs"
 msgstr "Vie tiedostoon .zephyr.subs"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2970
 msgid "Import from .anyone"
 msgstr "Tuo tiedostosta .anyone"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2973
 msgid "Import from .zephyr.subs"
 msgstr "Tuo tiedostosta .zephyr.subs"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2976
 msgid "Realm"
 msgstr "Alue (realm)"
 
-#: ../libpurple/protocols/zephyr/zephyr.c:2979
 msgid "Exposure"
 msgstr "Altistus"
 
-#: ../libpurple/proxy.c:486 ../libpurple/proxy.c:933 ../libpurple/proxy.c:1092
-#: ../libpurple/proxy.c:1695
 #, c-format
 msgid ""
 "Unable to create socket:\n"
@@ -13748,76 +9731,61 @@
 "Pistokkeen luonti epäonnistui:\n"
 "%s"
 
-#: ../libpurple/proxy.c:687
 #, c-format
 msgid "Unable to parse response from HTTP proxy: %s\n"
 msgstr "Vastausta HTTP-välipalvelimelta ei voi jäsentää: %s\n"
 
-#: ../libpurple/proxy.c:727 ../libpurple/proxy.c:776 ../libpurple/proxy.c:814
-#: ../libpurple/proxy.c:826
 #, c-format
 msgid "HTTP proxy connection error %d"
 msgstr "HTTP-välipalvelimen yhteysvirhe %d"
 
-#: ../libpurple/proxy.c:822
 #, c-format
 msgid "Access denied: HTTP proxy server forbids port %d tunneling."
 msgstr "Pääsy evätty: HTTP-välipalvelin estää portin %d tunneloinnin."
 
-#: ../libpurple/proxy.c:1053
 #, c-format
 msgid "Error resolving %s"
 msgstr "Virhe selvitettäessä %s"
 
-#: ../libpurple/proxy.c:1793
 msgid "Could not resolve host name"
 msgstr "Isäntänimeä ei voi selvittää"
 
+#, c-format
+msgid "Requesting %s's attention..."
+msgstr "Pyydetään käyttäjän %s huomiota..."
+
+#, c-format
+msgid "%s has requested your attention!"
+msgstr "%s pyysi huomiotasi"
+
 #. *
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
 #.
-#: ../libpurple/request.h:1391 ../pidgin/gtkblist.c:552
 msgid "_Yes"
 msgstr "_Kyllä"
 
-#: ../libpurple/request.h:1391 ../pidgin/gtkblist.c:552
 msgid "_No"
 msgstr "_Ei"
 
 #. *
 #. * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
 #.
-#: ../libpurple/request.h:1411
 msgid "_Accept"
 msgstr "_Hyväksy"
 
 #. *
 #. * The default message to use when the user becomes auto-away.
 #.
-#: ../libpurple/savedstatuses.c:48
 msgid "I'm not here right now"
 msgstr "En ole täällä juuri nyt"
 
-#: ../libpurple/savedstatuses.c:537
 msgid "saved statuses"
 msgstr "tallennetut tilat"
 
-#: ../libpurple/server.c:265
 #, c-format
 msgid "%s is now known as %s.\n"
 msgstr "%s on nyt nimeltään %s.\n"
 
-#: ../libpurple/server.c:356
-#, c-format
-msgid "Requesting %s's attention..."
-msgstr "Pyydetään käyttäjän %s huomiota..."
-
-#: ../libpurple/server.c:401
-#, c-format
-msgid "%s has requested your attention!"
-msgstr "%s pyysi huomiotasi"
-
-#: ../libpurple/server.c:898
 #, c-format
 msgid ""
 "%s has invited %s to the chat room %s:\n"
@@ -13826,98 +9794,90 @@
 "Käyttäjä %s on kutsunut käyttäjän %s keskusteluhuoneeseen %s:\n"
 "%s"
 
-#: ../libpurple/server.c:903
 #, c-format
 msgid "%s has invited %s to the chat room %s\n"
 msgstr "Käyttäjä %s on kutsunut käyttäjän %s keskusteluhuoneeseen %s\n"
 
-#: ../libpurple/server.c:907
 msgid "Accept chat invitation?"
 msgstr "Hyväksy ryhmäkeskustelukutsu?"
 
-#: ../libpurple/sslconn.c:164
+#. Shortcut
+msgid "Shortcut"
+msgstr "Oikotie"
+
+msgid "The text-shortcut for the smiley"
+msgstr "Teksti-oikotie hymiölle"
+
+#. Stored Image
+msgid "Stored Image"
+msgstr "Tallennettu kuva"
+
+msgid "Stored Image. (that'll have to do for now)"
+msgstr "Tallennettu kuva. (niillä tulee pärjätä toistaiseksi)"
+
 msgid "SSL Connection Failed"
 msgstr "SSL-yhteys epäonnistui"
 
-#: ../libpurple/sslconn.c:166
 msgid "SSL Handshake Failed"
 msgstr "SSL-kättely epäonnistui"
 
-#: ../libpurple/sslconn.c:168
 msgid "SSL peer presented an invalid certificate"
 msgstr "SSL-vertainen esitti epäkelvon varmenteen"
 
-#: ../libpurple/sslconn.c:171
 msgid "Unknown SSL error"
 msgstr "Tuntematon SSL-virhe"
 
-#: ../libpurple/status.c:154
 msgid "Unset"
 msgstr "Poista asetus"
 
-#: ../libpurple/status.c:157 ../pidgin/gtkdocklet.c:553
-#: ../pidgin/gtkstatusbox.c:1088
 msgid "Do not disturb"
 msgstr "Älä häiritse"
 
-#: ../libpurple/status.c:160
 msgid "Extended away"
 msgstr "Pidennetty poissaolo"
 
-#: ../libpurple/status.c:161
 msgid "Mobile"
 msgstr "Liikkeellä"
 
-#: ../libpurple/status.c:162
 msgid "Listening to music"
 msgstr "Kuuntelee musiikkia"
 
-#: ../libpurple/status.c:611
 #, c-format
 msgid "%s (%s) changed status from %s to %s"
 msgstr "%s (%s) on vaihtanut tilasta %s tilaan %s"
 
-#: ../libpurple/status.c:622
 #, c-format
 msgid "%s (%s) is now %s"
 msgstr "%s (%s) on nyt %s"
 
-#: ../libpurple/status.c:628
 #, c-format
 msgid "%s (%s) is no longer %s"
 msgstr "%s (%s) ei ole enää %s"
 
-#: ../libpurple/status.c:1243
 #, c-format
 msgid "%s became idle"
 msgstr "%s on jouten"
 
-#: ../libpurple/status.c:1263
 #, c-format
 msgid "%s became unidle"
 msgstr "%s on aktiivinen"
 
-#: ../libpurple/status.c:1329
 #, c-format
 msgid "+++ %s became idle"
 msgstr "+++ %s on jouten"
 
-#: ../libpurple/status.c:1331
 #, c-format
 msgid "+++ %s became unidle"
 msgstr "+++ %s on aktiivinen"
 
-#: ../libpurple/util.c:721
 #, c-format
 msgid "%x %X"
 msgstr "%x %X"
 
-#: ../libpurple/util.c:2804
 #, c-format
 msgid "Error Reading %s"
 msgstr "Virhe luettaessa %s"
 
-#: ../libpurple/util.c:2805
 #, c-format
 msgid ""
 "An error was encountered reading your %s.  They have not been loaded, and "
@@ -13926,67 +9886,56 @@
 "%s:n lukemisessa tapahtui virhe. Niitä ei ladattu ja vanha tiedosto on "
 "nimetty uudelleen nimellä %s~."
 
-#: ../libpurple/util.c:3304
 msgid "Calculating..."
 msgstr "Lasketaan..."
 
-#: ../libpurple/util.c:3307
 msgid "Unknown."
 msgstr "Tuntematon."
 
-#: ../libpurple/util.c:3333
 #, c-format
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d sekunti"
 msgstr[1] "%d sekuntia"
 
-#: ../libpurple/util.c:3345
 #, c-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d päivä"
 msgstr[1] "%d päivää"
 
-#: ../libpurple/util.c:3353
 #, c-format
 msgid "%s, %d hour"
 msgid_plural "%s, %d hours"
 msgstr[0] "%s, %d tunti"
 msgstr[1] "%s, %d tuntia"
 
-#: ../libpurple/util.c:3359
 #, c-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d tunti"
 msgstr[1] "%d tuntia"
 
-#: ../libpurple/util.c:3367
 #, c-format
 msgid "%s, %d minute"
 msgid_plural "%s, %d minutes"
 msgstr[0] "%s, %d minuutti"
 msgstr[1] "%s, %d minuuttia"
 
-#: ../libpurple/util.c:3373
 #, c-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d minuutti"
 msgstr[1] "%d minuuttia"
 
-#: ../libpurple/util.c:3633
 #, c-format
 msgid "Could not open %s: Redirected too many times"
 msgstr "%s:n avaaminen epäonnistui: uudelleenohjattu liian monta kertaa"
 
-#: ../libpurple/util.c:3670 ../libpurple/util.c:3966
 #, c-format
 msgid "Unable to connect to %s"
 msgstr "Kohteeseen %s ei kyetty muodostamaan yhteyttä"
 
-#: ../libpurple/util.c:3793
 #, c-format
 msgid ""
 "Unable to allocate enough memory to hold the contents from %s.  The web "
@@ -13995,141 +9944,116 @@
 "Riittävästi muistia ei voi varata säilyttämään kohteen %s sisältö. "
 "Verkkopalvelin voi olla yrittämässä tehdä jotain pahantahtoista."
 
-#: ../libpurple/util.c:3828
 #, c-format
 msgid "Error reading from %s: %s"
 msgstr "Virhe luettaessa kohteesta %s: %s"
 
-#: ../libpurple/util.c:3859
 #, c-format
 msgid "Error writing to %s: %s"
 msgstr "Virhe kirjoitettaessa kohteeseen %s: %s"
 
-#: ../libpurple/util.c:3884
 #, c-format
 msgid "Unable to connect to %s: %s"
 msgstr "Kohteeseen %s ei voi yhdistää: %s"
 
-#: ../libpurple/util.c:4697
 #, c-format
 msgid " - %s"
 msgstr " - %s"
 
-#: ../libpurple/util.c:4703
 #, c-format
 msgid " (%s)"
 msgstr " (%s)"
 
 #. 10053
-#: ../libpurple/win32/libc_interface.c:322
 #, c-format
 msgid "Connection interrupted by other software on your computer."
 msgstr "Yhteys keskeytyi tietokoneella olevan toisen ohjelman takia."
 
 #. 10054
-#: ../libpurple/win32/libc_interface.c:325
 #, c-format
 msgid "Remote host closed connection."
 msgstr "Etäkone on katkaissut yhteyden."
 
 #. 10060
-#: ../libpurple/win32/libc_interface.c:328
 #, c-format
 msgid "Connection timed out."
 msgstr "Ei yhteyttä määräajassa."
 
 #. 10061
-#: ../libpurple/win32/libc_interface.c:331
 #, c-format
 msgid "Connection refused."
 msgstr "Yhteys torjuttu."
 
-#: ../pidgin.desktop.in.h:1
+#. 10048
+#, c-format
+msgid "Address already in use."
+msgstr "Osoite on jo käytössä."
+
 msgid "Internet Messenger"
 msgstr "Pikaviestin"
 
-#: ../pidgin.desktop.in.h:2
 msgid "Pidgin Internet Messenger"
 msgstr "Pidgin-pikaviestin"
 
-#: ../pidgin.desktop.in.h:3
 msgid "Send instant messages over multiple protocols"
 msgstr "Lähetä pikaviestejä monilla eri yhteyskäytännöillä"
 
-#: ../pidgin/eggtrayicon.c:128
 msgid "Orientation"
 msgstr "Asento"
 
-#: ../pidgin/eggtrayicon.c:129
 msgid "The orientation of the tray."
 msgstr "Ilmoitusalueen asento."
 
 #. Build the login options frame.
-#: ../pidgin/gtkaccount.c:379
 msgid "Login Options"
 msgstr "Sisäänkirjautumisvalinnat"
 
-#: ../pidgin/gtkaccount.c:400
 msgid "Pro_tocol:"
 msgstr "Yhteyskäy_täntö:"
 
-#: ../pidgin/gtkaccount.c:411 ../pidgin/gtkaccount.c:1039
 msgid "_Username:"
 msgstr "_Käyttäjänimi:"
 
-#: ../pidgin/gtkaccount.c:501
 msgid "Remember pass_word"
 msgstr "Muista _salasana"
 
 #. Build the user options frame.
-#: ../pidgin/gtkaccount.c:555
 msgid "User Options"
 msgstr "Käyttäjän valinnat"
 
-#: ../pidgin/gtkaccount.c:568
 msgid "_Local alias:"
 msgstr "Paika_llinen lempinimi:"
 
-#: ../pidgin/gtkaccount.c:572
 msgid "New _mail notifications"
 msgstr "Il_moita uudesta sähköpostista"
 
 #. Buddy icon
-#: ../pidgin/gtkaccount.c:577
 msgid "Use this buddy _icon for this account:"
 msgstr "Käytä tätä tuttavakuvaketta tälle käyttäjät_ilille:"
 
 #. Build the protocol options frame.
-#: ../pidgin/gtkaccount.c:705
 #, c-format
 msgid "%s Options"
 msgstr "%s-valinnat"
 
-#: ../pidgin/gtkaccount.c:910
 msgid "Use GNOME Proxy Settings"
 msgstr "Käytä Gnomen välipalvelinasetuksia"
 
-#: ../pidgin/gtkaccount.c:911
 msgid "Use Global Proxy Settings"
 msgstr "Käytä yleisiä välipalvelinasetuksia"
 
-#: ../pidgin/gtkaccount.c:917
 msgid "No Proxy"
 msgstr "Ei välipalvelinta"
 
-#: ../pidgin/gtkaccount.c:923
 msgid "HTTP"
 msgstr "HTTP"
 
-#: ../pidgin/gtkaccount.c:929
 msgid "SOCKS 4"
 msgstr "SOCKS 4"
 
-#: ../pidgin/gtkaccount.c:935
 msgid "SOCKS 5"
 msgstr "SOCKS 5"
 
-#: ../pidgin/gtkaccount.c:941 ../pidgin/gtkprefs.c:1340
 msgid "Use Environmental Settings"
 msgstr "Käytä ympäristöasetuksia"
 
@@ -14138,69 +10062,52 @@
 #. A) your network is really slow and you have nothing better to do than
 #. look at butterflies.
 #. B)You are looking really closely at something that shouldn't matter.
-#: ../pidgin/gtkaccount.c:980
 msgid "If you look real closely"
 msgstr "Jos katsot todella tarkkaan"
 
 #. This is an easter egg. See the comment on the previous line in the source.
-#: ../pidgin/gtkaccount.c:983
 msgid "you can see the butterflies mating"
 msgstr "voit nähdä perhosten parittelevan"
 
-#: ../pidgin/gtkaccount.c:1004
 msgid "Proxy Options"
 msgstr "Välipalvelinvalinnat"
 
-#: ../pidgin/gtkaccount.c:1018 ../pidgin/gtkprefs.c:1334
 msgid "Proxy _type:"
 msgstr "Välipalvelimen _tyyppi:"
 
-#: ../pidgin/gtkaccount.c:1027 ../pidgin/gtkprefs.c:1355
 msgid "_Host:"
 msgstr "P_alvelin:"
 
-#: ../pidgin/gtkaccount.c:1031 ../pidgin/gtkprefs.c:1373
 msgid "_Port:"
 msgstr "_Portti:"
 
-#: ../pidgin/gtkaccount.c:1046 ../pidgin/gtkprefs.c:1410
 msgid "Pa_ssword:"
 msgstr "_Salasana:"
 
-#: ../pidgin/gtkaccount.c:1171
 msgid "Unable to save new account"
 msgstr "Uuden käyttäjätilin tallentaminen ei onnistu."
 
-#: ../pidgin/gtkaccount.c:1172
 msgid "An account already exists with the specified criteria."
 msgstr "Määritelty käyttäjätili on jo olemassa."
 
-#: ../pidgin/gtkaccount.c:1449
 msgid "Add Account"
 msgstr "Lisää tili"
 
-#: ../pidgin/gtkaccount.c:1466
 msgid "_Basic"
 msgstr "_Perus"
 
-#: ../pidgin/gtkaccount.c:1473
-msgid "Create this new account on the server"
-msgstr "Luo tämä uusi käyttäjätili palvelimelle"
-
-#: ../pidgin/gtkaccount.c:1487
+msgid "Create _this new account on the server"
+msgstr "Luo _tämä uusi käyttäjätili palvelimelle"
+
 msgid "_Advanced"
 msgstr "_Lisäasetukset"
 
-#: ../pidgin/gtkaccount.c:1908 ../pidgin/gtkplugin.c:753
-#: ../pidgin/plugins/convcolors.c:327
 msgid "Enabled"
 msgstr "Käytössä"
 
-#: ../pidgin/gtkaccount.c:1936
 msgid "Protocol"
 msgstr "Yhteyskäytäntö"
 
-#: ../pidgin/gtkaccount.c:2139
 #, c-format
 msgid ""
 "<span size='larger' weight='bold'>Welcome to %s!</span>\n"
@@ -14223,7 +10130,6 @@
 "Voit palata tähän ikkunaan lisäämään, muokkaamaan tai poistamaan tilejä "
 "valitsemalla <b>Käyttäjätilit->Lisää/muokkaa</b> Tuttavat-ikkunassa."
 
-#: ../pidgin/gtkblist.c:549
 #, c-format
 msgid "You have %d contact named %s. Would you like to merge them?"
 msgid_plural ""
@@ -14231,7 +10137,6 @@
 msgstr[0] "Sinulla on %d kontakti jonka nimi on %s. Haluatko yhdistää ne?"
 msgstr[1] "Sinulla on %d kontaktia joiden nimi on %s. Haluatko yhdistää ne?"
 
-#: ../pidgin/gtkblist.c:550
 msgid ""
 "Merging these contacts will cause them to share a single entry on the buddy "
 "list and use a single conversation window. You can separate them again by "
@@ -14241,126 +10146,96 @@
 "ja kontakteille käytetään jatkossa vain yhtä keskusteluikkunaa. Ne voidaan "
 "erottaa valitsemalla \"Laajenna\" kontaktin oikean napin valikosta"
 
-#: ../pidgin/gtkblist.c:683
 msgid "Please update the necessary fields."
 msgstr "Päivitä tarvittavat kentät."
 
-#: ../pidgin/gtkblist.c:1038 ../pidgin/gtkblist.c:6794
 msgid "Room _List"
 msgstr "Huone_luettelo"
 
-#: ../pidgin/gtkblist.c:1058
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
 "join.\n"
 msgstr "Syötä tiedot ryhmäkeskustelusta, johon haluaisit liittyä.\n"
 
-#: ../pidgin/gtkblist.c:1070 ../pidgin/gtkblist.c:6829
-#: ../pidgin/gtkpounce.c:546 ../pidgin/gtkroomlist.c:547
 msgid "_Account:"
 msgstr "_Käyttäjätili:"
 
-#: ../pidgin/gtkblist.c:1349 ../pidgin/gtkprivacy.c:549
-#: ../pidgin/gtkprivacy.c:563
 msgid "_Block"
 msgstr "_Estä"
 
-#: ../pidgin/gtkblist.c:1349
 msgid "Un_block"
 msgstr "_Poista esto"
 
-#: ../pidgin/gtkblist.c:1392
 msgid "Move to"
 msgstr "Siirrä"
 
-#: ../pidgin/gtkblist.c:1432
 msgid "Get _Info"
 msgstr "Hae _tiedot"
 
-#: ../pidgin/gtkblist.c:1435 ../pidgin/pidginstock.c:90
 msgid "I_M"
 msgstr "_Pikaviesti"
 
-#: ../pidgin/gtkblist.c:1441
 msgid "_Send File..."
 msgstr "_Lähetä tiedosto..."
 
-#: ../pidgin/gtkblist.c:1448
 msgid "Add Buddy _Pounce..."
 msgstr "Lisää tuttava_ilmoitin..."
 
-#: ../pidgin/gtkblist.c:1453 ../pidgin/gtkblist.c:1457
-#: ../pidgin/gtkblist.c:1577 ../pidgin/gtkblist.c:1602
 msgid "View _Log"
 msgstr "Näytä _loki"
 
-#: ../pidgin/gtkblist.c:1463 ../pidgin/gtkblist.c:1550
 msgid "Hide when offline"
 msgstr "Piilota kun poissa linjoilta"
 
-#: ../pidgin/gtkblist.c:1463 ../pidgin/gtkblist.c:1550
 msgid "Show when offline"
 msgstr "Näytä kun poissa linjoilta"
 
-#: ../pidgin/gtkblist.c:1477 ../pidgin/gtkblist.c:1486
-#: ../pidgin/gtkblist.c:1587 ../pidgin/gtkblist.c:1608
 msgid "_Alias..."
 msgstr "_Lempinimi..."
 
-#: ../pidgin/gtkblist.c:1480 ../pidgin/gtkblist.c:1488
-#: ../pidgin/gtkblist.c:1589 ../pidgin/gtkblist.c:1610
 msgid "_Remove"
 msgstr "_Poista"
 
-#: ../pidgin/gtkblist.c:1538
+msgid "Set Custom Icon"
+msgstr "Aseta oma kuvake"
+
+msgid "Remove Custom Icon"
+msgstr "Poista oma kuvake"
+
 msgid "Add _Buddy..."
 msgstr "Lisää _tuttava..."
 
-#: ../pidgin/gtkblist.c:1541
 msgid "Add C_hat..."
 msgstr "Lisää ry_hmäkeskustelu..."
 
-#: ../pidgin/gtkblist.c:1544
 msgid "_Delete Group"
 msgstr "_Poista ryhmä"
 
-#: ../pidgin/gtkblist.c:1546
 msgid "_Rename"
 msgstr "Nimeä _uudelleen"
 
 #. join button
-#: ../pidgin/gtkblist.c:1571 ../pidgin/gtkroomlist.c:318
-#: ../pidgin/gtkroomlist.c:594 ../pidgin/pidginstock.c:88
 msgid "_Join"
 msgstr "_Liity"
 
-#: ../pidgin/gtkblist.c:1573
 msgid "Auto-Join"
 msgstr "Liity automaattisesti"
 
-#: ../pidgin/gtkblist.c:1575
 msgid "Persistent"
 msgstr "Pysyvä"
 
-#: ../pidgin/gtkblist.c:1585
 msgid "_Edit Settings..."
 msgstr "_Muokkaa asetuksia..."
 
-#: ../pidgin/gtkblist.c:1615 ../pidgin/gtkblist.c:1638
 msgid "_Collapse"
 msgstr "_Pienennä"
 
-#: ../pidgin/gtkblist.c:1643
 msgid "_Expand"
 msgstr "_Laajenna"
 
-#: ../pidgin/gtkblist.c:1894 ../pidgin/gtkblist.c:1906
-#: ../pidgin/gtkblist.c:5493 ../pidgin/gtkblist.c:5506
 msgid "/Tools/Mute Sounds"
 msgstr "/Työkalut/Vaimenna äänet"
 
-#: ../pidgin/gtkblist.c:2366 ../pidgin/gtkconv.c:4936
-#: ../pidgin/gtkpounce.c:437
 msgid ""
 "You are not currently signed on with an account that can add that buddy."
 msgstr ""
@@ -14370,148 +10245,116 @@
 #. I don't believe this can happen currently, I think
 #. * everything that calls this function checks for one of the
 #. * above node types first.
-#: ../pidgin/gtkblist.c:2717
 msgid "Unknown node type"
 msgstr "Tuntematon solmutyyppi"
 
 #. Buddies menu
-#: ../pidgin/gtkblist.c:3153
 msgid "/_Buddies"
 msgstr "/_Tuttavat"
 
-#: ../pidgin/gtkblist.c:3154
 msgid "/Buddies/New Instant _Message..."
 msgstr "/Tuttavat/Uusi _pikaviesti..."
 
-#: ../pidgin/gtkblist.c:3155
 msgid "/Buddies/Join a _Chat..."
 msgstr "/Tuttavat/Liity _ryhmäkeskusteluun..."
 
-#: ../pidgin/gtkblist.c:3156
 msgid "/Buddies/Get User _Info..."
 msgstr "/Tuttavat/Hae _käyttäjätiedot..."
 
-#: ../pidgin/gtkblist.c:3157
 msgid "/Buddies/View User _Log..."
 msgstr "/Tuttavat/Näytä käyttäjä_loki..."
 
-#: ../pidgin/gtkblist.c:3159
 msgid "/Buddies/Sh_ow"
 msgstr "/Tuttavat/Nä_ytä"
 
-#: ../pidgin/gtkblist.c:3160
 msgid "/Buddies/Show/_Offline Buddies"
 msgstr "/Tuttavat/Näytä/_Poissaolevat tuttavat"
 
-#: ../pidgin/gtkblist.c:3161
 msgid "/Buddies/Show/_Empty Groups"
 msgstr "/Tuttavat/Näytä/_Tyhjät ryhmät"
 
-#: ../pidgin/gtkblist.c:3162
 msgid "/Buddies/Show/Buddy _Details"
 msgstr "/Tuttavat/Näytä/Tuttavien tie_dot"
 
-#: ../pidgin/gtkblist.c:3163
 msgid "/Buddies/Show/Idle _Times"
 msgstr "/Tuttavat/Näytä/_Joutenoloajat"
 
-#: ../pidgin/gtkblist.c:3164
 msgid "/Buddies/Show/_Protocol Icons"
 msgstr "/Tuttavat/Näytä/_Yhteyskäytäntökuvakkeet"
 
-#: ../pidgin/gtkblist.c:3165
 msgid "/Buddies/_Sort Buddies"
 msgstr "/Tuttavat/L_ajittele tuttavat"
 
-#: ../pidgin/gtkblist.c:3167
 msgid "/Buddies/_Add Buddy..."
 msgstr "/Tuttavat/_Lisää tuttava..."
 
-#: ../pidgin/gtkblist.c:3168
 msgid "/Buddies/Add C_hat..."
 msgstr "/Tuttavat/Lisää ryhmäkeskustelu..."
 
-#: ../pidgin/gtkblist.c:3169
 msgid "/Buddies/Add _Group..."
 msgstr "/Tuttavat/Lisää _ryhmä..."
 
-#: ../pidgin/gtkblist.c:3171
 msgid "/Buddies/_Quit"
 msgstr "/Tuttavat/_Lopeta"
 
 #. Accounts menu
-#: ../pidgin/gtkblist.c:3174
 msgid "/_Accounts"
 msgstr "/_Käyttäjätilit"
 
-#: ../pidgin/gtkblist.c:3175 ../pidgin/gtkblist.c:7514
-msgid "/Accounts/Manage"
-msgstr "/Käyttäjätilit/Hallinta"
+msgid "/Accounts/Manage Accounts"
+msgstr "/Käyttäjätilit/Tilien hallinta"
 
 #. Tools
-#: ../pidgin/gtkblist.c:3178
 msgid "/_Tools"
 msgstr "/T_yökalut"
 
-#: ../pidgin/gtkblist.c:3179
 msgid "/Tools/Buddy _Pounces"
 msgstr "/Työkalut/Tuttava_ilmoittimet"
 
-#: ../pidgin/gtkblist.c:3180
 msgid "/Tools/_Certificates"
 msgstr "/Työkalut/_Varmenteet"
 
-#: ../pidgin/gtkblist.c:3181
 msgid "/Tools/Plu_gins"
 msgstr "/Työkalut/_Liitännäiset"
 
-#: ../pidgin/gtkblist.c:3182
 msgid "/Tools/Pr_eferences"
 msgstr "/Työkalut/A_setukset"
 
-#: ../pidgin/gtkblist.c:3183
 msgid "/Tools/Pr_ivacy"
 msgstr "/Työkalut/Yks_ityisyys"
 
-#: ../pidgin/gtkblist.c:3185
+msgid "/Tools/Smile_y"
+msgstr "/Työkalut/H_ymiö"
+
 msgid "/Tools/_File Transfers"
 msgstr "/Työkalut/_Tiedostonsiirrot..."
 
-#: ../pidgin/gtkblist.c:3186
 msgid "/Tools/R_oom List"
 msgstr "/Työkalut/Huone_luettelo"
 
-#: ../pidgin/gtkblist.c:3187
 msgid "/Tools/System _Log"
 msgstr "/Työkalut/Järjestelmä_loki"
 
-#: ../pidgin/gtkblist.c:3189
 msgid "/Tools/Mute _Sounds"
 msgstr "/Työkalut/Vaimenna _äänet"
 
 #. Help
-#: ../pidgin/gtkblist.c:3191
 msgid "/_Help"
 msgstr "/O_hje"
 
-#: ../pidgin/gtkblist.c:3192
 msgid "/Help/Online _Help"
 msgstr "/Ohje/O_hjeita verkossa"
 
-#: ../pidgin/gtkblist.c:3193
 msgid "/Help/_Debug Window"
 msgstr "/Ohje/_Virheenjäljitysikkuna"
 
-#: ../pidgin/gtkblist.c:3195 ../pidgin/gtkblist.c:3197
 msgid "/Help/_About"
 msgstr "/Ohje/Tietoj_a"
 
-#: ../pidgin/gtkblist.c:3228
 #, c-format
 msgid "<b>Account:</b> %s"
 msgstr "<b>Käyttäjätili:</b> %s"
 
-#: ../pidgin/gtkblist.c:3247
 #, c-format
 msgid ""
 "\n"
@@ -14520,7 +10363,6 @@
 "\n"
 "<b>Osallistujat:</b> %d"
 
-#: ../pidgin/gtkblist.c:3252
 #, c-format
 msgid ""
 "\n"
@@ -14529,128 +10371,98 @@
 "\n"
 "<b>Aihe:</b> %s"
 
-#: ../pidgin/gtkblist.c:3252
 msgid "(no topic set)"
 msgstr "(aihetta ei ole asetettu)"
 
-#: ../pidgin/gtkblist.c:3331
 msgid "Buddy Alias"
 msgstr "Tuttavan lempinimi"
 
-#: ../pidgin/gtkblist.c:3360
 msgid "Logged In"
 msgstr "Kirjautumisesta aikaa"
 
-#: ../pidgin/gtkblist.c:3406
 msgid "Last Seen"
 msgstr "Näkemisestä aikaa"
 
-#: ../pidgin/gtkblist.c:3427
 msgid "Spooky"
 msgstr "Aavemainen"
 
-#: ../pidgin/gtkblist.c:3429
 msgid "Awesome"
 msgstr "Mahtava"
 
-#: ../pidgin/gtkblist.c:3431
 msgid "Rockin'"
 msgstr "Rokkaava"
 
-#: ../pidgin/gtkblist.c:3462
 msgid "Total Buddies"
 msgstr "Tuttavia yhteensä"
 
-#: ../pidgin/gtkblist.c:3824
 #, c-format
 msgid "Idle %dd %dh %02dm"
 msgstr "Jouten %dd %dh %02dm"
 
-#: ../pidgin/gtkblist.c:3826
 #, c-format
 msgid "Idle %dh %02dm"
 msgstr "Jouten %dh %02dm"
 
-#: ../pidgin/gtkblist.c:3828
 #, c-format
 msgid "Idle %dm"
 msgstr "Jouten %dm"
 
-#: ../pidgin/gtkblist.c:3982
 msgid "/Buddies/New Instant Message..."
 msgstr "/Tuttavat/Uusi pikaviesti..."
 
-#: ../pidgin/gtkblist.c:3983 ../pidgin/gtkblist.c:4016
 msgid "/Buddies/Join a Chat..."
 msgstr "/Tuttavat/Liity ryhmäkeskusteluun..."
 
-#: ../pidgin/gtkblist.c:3984
 msgid "/Buddies/Get User Info..."
 msgstr "/Tuttavat/Hae käyttäjätiedot..."
 
-#: ../pidgin/gtkblist.c:3985
 msgid "/Buddies/Add Buddy..."
 msgstr "/Tuttavat/Lisää tuttava..."
 
-#: ../pidgin/gtkblist.c:3986 ../pidgin/gtkblist.c:4019
 msgid "/Buddies/Add Chat..."
 msgstr "/Tuttavat/Lisää ryhmäkeskustelu..."
 
-#: ../pidgin/gtkblist.c:3987
 msgid "/Buddies/Add Group..."
 msgstr "/Tuttavat/Lisää ryhmä..."
 
-#: ../pidgin/gtkblist.c:4022
 msgid "/Tools/Privacy"
 msgstr "/Työkalut/Yksityisyys"
 
-#: ../pidgin/gtkblist.c:4025
 msgid "/Tools/Room List"
 msgstr "/Työkalut/Huoneluettelo"
 
-#: ../pidgin/gtkblist.c:4157 ../pidgin/gtkdocklet.c:155
-#: ../pidgin/gtkdocklet.c:160
 #, c-format
 msgid "%d unread message from %s\n"
 msgid_plural "%d unread messages from %s\n"
 msgstr[0] "%d lukematon viesti käyttäjältä %s\n"
 msgstr[1] "%d lukematonta viestiä käyttäjältä %s\n"
 
-#: ../pidgin/gtkblist.c:4320
 msgid "Manually"
 msgstr "Käsin"
 
-#: ../pidgin/gtkblist.c:4323
 msgid "By status"
 msgstr "Tilan mukaan"
 
-#: ../pidgin/gtkblist.c:4324
 msgid "By log size"
 msgstr "Lokin koon mukaan"
 
-#: ../pidgin/gtkblist.c:4662
 #, c-format
 msgid "%s disconnected"
 msgstr "Yhteys katkennut kohteeseen %s"
 
-#: ../pidgin/gtkblist.c:4664
 #, c-format
 msgid "%s disabled"
 msgstr "%s pois käytöstä"
 
-#: ../pidgin/gtkblist.c:4668
 msgid "Reconnect"
 msgstr "Yhdistä uudelleen"
 
-#: ../pidgin/gtkblist.c:4668 ../pidgin/gtkblist.c:4787
 msgid "Re-enable"
 msgstr "Ota uudelleen käyttöön"
 
-#: ../pidgin/gtkblist.c:4785
 msgid "Welcome back!"
 msgstr "Tervetuloa takaisin."
 
-#: ../pidgin/gtkblist.c:4821
 #, c-format
 msgid "%d account was disabled because you signed on from another location:"
 msgid_plural ""
@@ -14660,83 +10472,67 @@
 msgstr[1] ""
 "%d tiliä poistettiin käytöstä koska toisesta paikasta kirjauduttiin sisään:"
 
-#: ../pidgin/gtkblist.c:5100
 msgid "<b>Username:</b>"
 msgstr "<b>Käyttäjänimi:</b>"
 
-#: ../pidgin/gtkblist.c:5107
 msgid "<b>Password:</b>"
 msgstr "<b>Salasana:</b>"
 
-#: ../pidgin/gtkblist.c:5118
 msgid "_Login"
 msgstr "_Sisäänkirjautuminen"
 
-#: ../pidgin/gtkblist.c:5202
 msgid "/Accounts"
 msgstr "/Käyttäjätilit"
 
 #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy
-#: ../pidgin/gtkblist.c:5216
 #, c-format
 msgid ""
 "<span weight='bold' size='larger'>Welcome to %s!</span>\n"
 "\n"
 "You have no accounts enabled. Enable your IM accounts from the <b>Accounts</"
-"b> window at <b>Accounts->Manage</b>. Once you enable accounts, you'll be "
-"able to sign on, set your status, and talk to your friends."
+"b> window at <b>Accounts->Manage Accounts</b>. Once you enable accounts, "
+"you'll be able to sign on, set your status, and talk to your friends."
 msgstr ""
 "<span weight='bold' size='larger'>Tervetuloa %siin!</span>\n"
 "\n"
 "Yksikään käyttäjätili ei ole käytössä. Ota pikaviestintilit käyttöön "
-"<b>Käyttäjätilit</b>-ikkunassa (<b>Käyttäjätilit->Hallinta</b>). Kun "
+"<b>Käyttäjätilit</b>-ikkunassa (<b>Käyttäjätilit->Tilien hallinta</b>). Kun "
 "käyttäjätilit on otettu käyttöön, voit kirjautua sisään, asettaa esim. "
 "paikallaolotilasi ja jutella tuttavillesi."
 
 #. set the Show Offline Buddies option. must be done
 #. * after the treeview or faceprint gets mad. -Robot101
 #.
-#: ../pidgin/gtkblist.c:5487
 msgid "/Buddies/Show/Offline Buddies"
 msgstr "/Tuttavat/Näytä/Poissaolevat tuttavat"
 
-#: ../pidgin/gtkblist.c:5490
 msgid "/Buddies/Show/Empty Groups"
 msgstr "/Tuttavat/Näytä/Tyhjät ryhmät"
 
-#: ../pidgin/gtkblist.c:5496
 msgid "/Buddies/Show/Buddy Details"
 msgstr "/Tuttavat/Näytä/Tuttavien tiedot"
 
-#: ../pidgin/gtkblist.c:5499
 msgid "/Buddies/Show/Idle Times"
 msgstr "/Tuttavat/Näytä/Joutenoloajat"
 
-#: ../pidgin/gtkblist.c:5502
 msgid "/Buddies/Show/Protocol Icons"
 msgstr "/Tuttavat/Näytä/Yhteyskäytäntökuvakkeet"
 
-#: ../pidgin/gtkblist.c:6455
 msgid "Add a buddy.\n"
 msgstr "Lisää tuttava.\n"
 
-#: ../pidgin/gtkblist.c:6470
 msgid "Buddy's _username:"
 msgstr "T_uttavan käyttäjänimi:"
 
-#: ../pidgin/gtkblist.c:6492
 msgid "(Optional) A_lias:"
 msgstr "(Valinnainen) _Lempinimi:"
 
-#: ../pidgin/gtkblist.c:6510
 msgid "Add buddy to _group:"
 msgstr "Lisää tuttava _ryhmään:"
 
-#: ../pidgin/gtkblist.c:6759
 msgid "This protocol does not support chat rooms."
 msgstr "Tämä yhteyskäytäntö ei tue keskusteluhuoneita."
 
-#: ../pidgin/gtkblist.c:6775
 msgid ""
 "You are not currently signed on with any protocols that have the ability to "
 "chat."
@@ -14744,7 +10540,6 @@
 "Et ole kirjautuneena millään yhteyskäytännöllä jolla voisi käyttää "
 "ryhmäkeskustelua."
 
-#: ../pidgin/gtkblist.c:6819
 msgid ""
 "Please enter an alias, and the appropriate information about the chat you "
 "would like to add to your buddy list.\n"
@@ -14752,266 +10547,199 @@
 "Anna lempinimi, ja tiedot ryhmäkeskustelusta jonka haluat lisätä "
 "tuttaviisi.\n"
 
-#: ../pidgin/gtkblist.c:6842
 msgid "A_lias:"
 msgstr "_Lempinimi:"
 
-#: ../pidgin/gtkblist.c:6849
 msgid "Auto_join when account becomes online."
 msgstr "Liity automaattisesti kun käyttä_jätili pääsee linjoille."
 
-#: ../pidgin/gtkblist.c:6850
 msgid "_Hide chat when the window is closed."
 msgstr "Piilota ry_hmäkeskustelu kun ikkuna on suljettu."
 
-#: ../pidgin/gtkblist.c:6876
 msgid "Please enter the name of the group to be added."
 msgstr "Anna lisättävän ryhmän nimi."
 
-#: ../pidgin/gtkblist.c:7534
+msgid "Enable Account"
+msgstr "Ota tili käyttöön"
+
+msgid "<PurpleMain>/Accounts/Enable Account"
+msgstr "<PurpleMain>/Käyttäjätilit/Ota tili käyttöön"
+
 msgid "<PurpleMain>/Accounts/"
 msgstr "<PurpleMain>/Käyttäjätilit/"
 
-#: ../pidgin/gtkblist.c:7558
 msgid "_Edit Account"
 msgstr "_Muokkaa käyttäjätiliä"
 
-#: ../pidgin/gtkblist.c:7571 ../pidgin/gtkconv.c:3194
 msgid "No actions available"
 msgstr "Ei toimintoja saatavilla."
 
-#: ../pidgin/gtkblist.c:7579
 msgid "_Disable"
 msgstr "_Poista käytöstä"
 
-#: ../pidgin/gtkblist.c:7591
-msgid "Enable Account"
-msgstr "Ota tili käyttöön"
-
-#: ../pidgin/gtkblist.c:7597
-msgid "<PurpleMain>/Accounts/Enable Account"
-msgstr "<PurpleMain>/Käyttäjätilit/Ota tili käyttöön"
-
-#: ../pidgin/gtkblist.c:7646
 msgid "/Tools"
 msgstr "/Työkalut"
 
-#: ../pidgin/gtkblist.c:7716
 msgid "/Buddies/Sort Buddies"
 msgstr "/Tuttavat/Lajittele tuttavat"
 
 #. Widget creation function
-#: ../pidgin/gtkcertmgr.c:541
 msgid "SSL Servers"
 msgstr "SSL-palvelimet"
 
-#: ../pidgin/gtkconv.c:488
 msgid "Unknown command."
 msgstr "Tuntematon komento."
 
-#: ../pidgin/gtkconv.c:752 ../pidgin/gtkconv.c:778
 msgid "That buddy is not on the same protocol as this chat."
 msgstr "Tuttava ei käytä samaa yhteyskäytäntöä kuin tämä ryhmäkeskustelu."
 
-#: ../pidgin/gtkconv.c:772
 msgid ""
 "You are not currently signed on with an account that can invite that buddy."
 msgstr ""
 "Et ole kirjautuneena millään käyttäjätilillä jolla voisi kutsua tämän "
 "tuttavan."
 
-#: ../pidgin/gtkconv.c:825
 msgid "Invite Buddy Into Chat Room"
 msgstr "Kutsu tuttava keskusteluhuoneeseen"
 
 #. Put our happy label in it.
-#: ../pidgin/gtkconv.c:855
 msgid ""
 "Please enter the name of the user you wish to invite, along with an optional "
 "invite message."
 msgstr "Anna kutsuttavan käyttäjän nimi sekä vapaaehtoinen viesti."
 
-#: ../pidgin/gtkconv.c:876
 msgid "_Buddy:"
 msgstr "_Tuttava:"
 
-#: ../pidgin/gtkconv.c:887 ../pidgin/gtksavedstatuses.c:1166
-#: ../pidgin/gtksavedstatuses.c:1484
 msgid "_Message:"
 msgstr "_Viesti:"
 
-#: ../pidgin/gtkconv.c:951
 #, c-format
 msgid "<h1>Conversation with %s</h1>\n"
 msgstr "<h1>Keskustelu käyttäjän %s kanssa</h1>\n"
 
-#: ../pidgin/gtkconv.c:989
 msgid "Save Conversation"
 msgstr "Tallenna keskustelu"
 
-#: ../pidgin/gtkconv.c:1135 ../pidgin/gtkdebug.c:167 ../pidgin/gtkdebug.c:740
 msgid "Find"
 msgstr "Etsi"
 
-#: ../pidgin/gtkconv.c:1161 ../pidgin/gtkdebug.c:195
 msgid "_Search for:"
 msgstr "_Haettava termi:"
 
-#: ../pidgin/gtkconv.c:1662
 msgid "Un-Ignore"
 msgstr "Huomioi"
 
-#: ../pidgin/gtkconv.c:1665
 msgid "Ignore"
 msgstr "Jätä huomiotta"
 
-#: ../pidgin/gtkconv.c:1685
 msgid "Get Away Message"
 msgstr "Hae poissaoloviesti"
 
-#: ../pidgin/gtkconv.c:1708
 msgid "Last said"
 msgstr "Viimeksi sanottu"
 
-#: ../pidgin/gtkconv.c:2689
 msgid "Unable to save icon file to disk."
 msgstr "Kuvaketiedostoa ei voi tallentaa levylle."
 
-#: ../pidgin/gtkconv.c:2767
 msgid "Save Icon"
 msgstr "Tallenna kuvake"
 
-#: ../pidgin/gtkconv.c:2825
 msgid "Animate"
 msgstr "Animoi"
 
-#: ../pidgin/gtkconv.c:2830
 msgid "Hide Icon"
 msgstr "Piilota kuvake"
 
-#: ../pidgin/gtkconv.c:2833
 msgid "Save Icon As..."
 msgstr "Tallenna kuvake nimellä..."
 
-#: ../pidgin/gtkconv.c:2837
 msgid "Set Custom Icon..."
 msgstr "Aseta oma kuvake..."
 
-#: ../pidgin/gtkconv.c:2841
 msgid "Change Size"
 msgstr "Muuta kokoa"
 
-#: ../pidgin/gtkconv.c:2854
-msgid "Remove Custom Icon"
-msgstr "Poista oma kuvake"
-
-#: ../pidgin/gtkconv.c:2979
 msgid "Show All"
 msgstr "Näytä kaikki"
 
 #. Conversation menu
-#: ../pidgin/gtkconv.c:2998
 msgid "/_Conversation"
 msgstr "/_Keskustelu"
 
-#: ../pidgin/gtkconv.c:3000
 msgid "/Conversation/New Instant _Message..."
 msgstr "/Keskustelu/Uusi _pikaviesti..."
 
-#: ../pidgin/gtkconv.c:3005
 msgid "/Conversation/_Find..."
 msgstr "/Keskustelu/_Etsi..."
 
-#: ../pidgin/gtkconv.c:3007
 msgid "/Conversation/View _Log"
 msgstr "/Keskustelu/Näytä l_oki..."
 
-#: ../pidgin/gtkconv.c:3008
 msgid "/Conversation/_Save As..."
 msgstr "/Keskustelu/_Tallenna nimellä..."
 
-#: ../pidgin/gtkconv.c:3010
 msgid "/Conversation/Clea_r Scrollback"
 msgstr "/Keskustelu/T_yhjennä takaisinvieritys"
 
-#: ../pidgin/gtkconv.c:3014
 msgid "/Conversation/Se_nd File..."
 msgstr "/Keskustelu/_Lähetä tiedosto..."
 
-#: ../pidgin/gtkconv.c:3015
 msgid "/Conversation/Add Buddy _Pounce..."
 msgstr "/Keskustelu/Lisää tuttava_ilmoitin..."
 
-#: ../pidgin/gtkconv.c:3017
 msgid "/Conversation/_Get Info"
 msgstr "/Keskustelu/_Hae tiedot..."
 
-#: ../pidgin/gtkconv.c:3019
 msgid "/Conversation/In_vite..."
 msgstr "/Keskustelu/Kut_su..."
 
-#: ../pidgin/gtkconv.c:3021
 msgid "/Conversation/M_ore"
 msgstr "/Keskustelu/Lis_ää"
 
-#: ../pidgin/gtkconv.c:3025
 msgid "/Conversation/Al_ias..."
 msgstr "/Keskustelu/Lemp_inimi..."
 
-#: ../pidgin/gtkconv.c:3027
 msgid "/Conversation/_Block..."
 msgstr "/Keskustelu/E_stä..."
 
-#: ../pidgin/gtkconv.c:3029
 msgid "/Conversation/_Unblock..."
 msgstr "/Keskustelu/Poista est_o..."
 
-#: ../pidgin/gtkconv.c:3031
 msgid "/Conversation/_Add..."
 msgstr "/Keskustelu/_Lisää..."
 
-#: ../pidgin/gtkconv.c:3033
 msgid "/Conversation/_Remove..."
 msgstr "/Keskustelu/_Poista..."
 
-#: ../pidgin/gtkconv.c:3038
 msgid "/Conversation/Insert Lin_k..."
 msgstr "/Keskustelu/Lisää lin_kki..."
 
-#: ../pidgin/gtkconv.c:3040
 msgid "/Conversation/Insert Imag_e..."
 msgstr "/Keskustelu/Liitä _kuva..."
 
-#: ../pidgin/gtkconv.c:3046
 msgid "/Conversation/_Close"
 msgstr "/Keskustelu/_Sulje"
 
 #. Options
-#: ../pidgin/gtkconv.c:3050
 msgid "/_Options"
 msgstr "/_Valinnat"
 
-#: ../pidgin/gtkconv.c:3051
 msgid "/Options/Enable _Logging"
 msgstr "/Valinnat/_Lokiinkirjaus"
 
-#: ../pidgin/gtkconv.c:3052
 msgid "/Options/Enable _Sounds"
 msgstr "/Valinnat/S_oita merkkiäänet"
 
-#: ../pidgin/gtkconv.c:3054
 msgid "/Options/Show Formatting _Toolbars"
 msgstr "/Valinnat/Näytä muokkaus-_työkalurivit"
 
-#: ../pidgin/gtkconv.c:3055
 msgid "/Options/Show Ti_mestamps"
 msgstr "/Valinnat/Näytä aika_leima"
 
-#: ../pidgin/gtkconv.c:3182
 msgid "/Conversation/More"
 msgstr "/Keskustelu/Lisää"
 
-#: ../pidgin/gtkconv.c:3238
 msgid "/Options"
 msgstr "/Valinnat"
 
@@ -15020,79 +10748,60 @@
 #. Make sure the 'Conversation -> More' menuitems are regenerated whenever
 #. * the 'Conversation' menu pops up because the entries can change after the
 #. * conversation is created.
-#: ../pidgin/gtkconv.c:3273 ../pidgin/gtkconv.c:3305
 msgid "/Conversation"
 msgstr "/Keskustelu"
 
-#: ../pidgin/gtkconv.c:3313
 msgid "/Conversation/View Log"
 msgstr "/Keskustelu/Näytä loki..."
 
-#: ../pidgin/gtkconv.c:3319
 msgid "/Conversation/Send File..."
 msgstr "/Keskustelu/Lähetä tiedosto..."
 
-#: ../pidgin/gtkconv.c:3323
 msgid "/Conversation/Add Buddy Pounce..."
 msgstr "/Keskustelu/Lisää tuttavailmoitin..."
 
-#: ../pidgin/gtkconv.c:3329
 msgid "/Conversation/Get Info"
 msgstr "/Keskustelu/Hae tiedot..."
 
-#: ../pidgin/gtkconv.c:3333
 msgid "/Conversation/Invite..."
 msgstr "/Keskustelu/Kutsu..."
 
-#: ../pidgin/gtkconv.c:3339
 msgid "/Conversation/Alias..."
 msgstr "/Keskustelu/Lempinimi..."
 
-#: ../pidgin/gtkconv.c:3343
 msgid "/Conversation/Block..."
 msgstr "/Keskustelu/Estä..."
 
-#: ../pidgin/gtkconv.c:3347
 msgid "/Conversation/Unblock..."
 msgstr "/Keskustelu/Poista esto..."
 
-#: ../pidgin/gtkconv.c:3351
 msgid "/Conversation/Add..."
 msgstr "/Keskustelu/Lisää..."
 
-#: ../pidgin/gtkconv.c:3355
 msgid "/Conversation/Remove..."
 msgstr "/Keskustelu/Poista..."
 
-#: ../pidgin/gtkconv.c:3361
 msgid "/Conversation/Insert Link..."
 msgstr "/Keskustelu/Lisää linkki..."
 
-#: ../pidgin/gtkconv.c:3365
 msgid "/Conversation/Insert Image..."
 msgstr "/Keskustelu/Lisää kuva..."
 
-#: ../pidgin/gtkconv.c:3371
 msgid "/Options/Enable Logging"
 msgstr "/Valinnat/Lokiinkirjaus"
 
-#: ../pidgin/gtkconv.c:3374
 msgid "/Options/Enable Sounds"
 msgstr "/Valinnat/Soita merkkiäänet"
 
-#: ../pidgin/gtkconv.c:3387
 msgid "/Options/Show Formatting Toolbars"
 msgstr "/Valinnat/Näytä muokkaustyökalurivit"
 
-#: ../pidgin/gtkconv.c:3390
 msgid "/Options/Show Timestamps"
 msgstr "/Valinnat/Näytä aikaleima"
 
-#: ../pidgin/gtkconv.c:3468
 msgid "User is typing..."
 msgstr "Käyttäjä kirjoittaa..."
 
-#: ../pidgin/gtkconv.c:3542
 #, c-format
 msgid ""
 "\n"
@@ -15102,526 +10811,377 @@
 "%s on lopettanut kirjoittamisen"
 
 #. Build the Send To menu
-#: ../pidgin/gtkconv.c:3722 ../pidgin/gtkconv.c:8482
 msgid "S_end To"
 msgstr "Läh_etä henkilölle"
 
-#: ../pidgin/gtkconv.c:4441 ../pidgin/plugins/sendbutton.c:44
 msgid "_Send"
 msgstr "_Lähetä"
 
 #. Setup the label telling how many people are in the room.
-#: ../pidgin/gtkconv.c:4600
 msgid "0 people in room"
 msgstr "0 ihmistä huoneessa"
 
-#: ../pidgin/gtkconv.c:5942 ../pidgin/gtkconv.c:6063
 #, c-format
 msgid "%d person in room"
 msgid_plural "%d people in room"
 msgstr[0] "%d ihminen huoneessa"
 msgstr[1] "%d ihmistä huoneessa"
 
-#: ../pidgin/gtkconv.c:6697 ../pidgin/gtkstatusbox.c:684
 msgid "Typing"
 msgstr "Kirjoittaa"
 
-#: ../pidgin/gtkconv.c:6701
 msgid "Stopped Typing"
 msgstr "Lopetti kirjoittamisen"
 
-#: ../pidgin/gtkconv.c:6704
 msgid "Nick Said"
 msgstr "Sanoi"
 
-#: ../pidgin/gtkconv.c:6707 ../pidgin/gtkdocklet.c:686
 msgid "Unread Messages"
 msgstr "Lukemattomat viestit"
 
-#: ../pidgin/gtkconv.c:6713
 msgid "New Event"
 msgstr "Uusi tapahtuma"
 
-#: ../pidgin/gtkconv.c:7954
 msgid "clear: Clears all conversation scrollbacks."
 msgstr "clear: Tyhjentää kaikki keskustelut"
 
-#: ../pidgin/gtkconv.c:8158
 msgid "Confirm close"
 msgstr "Vahvista sulkeminen"
 
-#: ../pidgin/gtkconv.c:8190
 msgid "You have unread messages. Are you sure you want to close the window?"
 msgstr ""
 "Sinulla on lukemattomia viestejä. Haluatko varmasti sulkea tämän ikkunan?"
 
-#: ../pidgin/gtkconv.c:8823
 msgid "Close other tabs"
 msgstr "Sulje muut välilehdet"
 
-#: ../pidgin/gtkconv.c:8829
 msgid "Close all tabs"
 msgstr "Sulje kaikki välilehdet"
 
-#: ../pidgin/gtkconv.c:8837
 msgid "Detach this tab"
 msgstr "Irrota tämä välilehti"
 
-#: ../pidgin/gtkconv.c:8843
 msgid "Close this tab"
 msgstr "Sulje tämä välilehti"
 
-#: ../pidgin/gtkconv.c:9365
 msgid "Close conversation"
 msgstr "Sulje keskustelu"
 
-#: ../pidgin/gtkconv.c:9969
 msgid "Last created window"
 msgstr "Viimeksi luotu ikkuna"
 
-#: ../pidgin/gtkconv.c:9971
 msgid "Separate IM and Chat windows"
 msgstr "Näytä pikaviestit ja ryhmäkeskustelut eri ikkunoissa"
 
-#: ../pidgin/gtkconv.c:9973 ../pidgin/gtkprefs.c:1576
 msgid "New window"
 msgstr "Uusi ikkuna"
 
-#: ../pidgin/gtkconv.c:9975
 msgid "By group"
 msgstr "Ryhmän mukaan"
 
-#: ../pidgin/gtkconv.c:9977
 msgid "By account"
 msgstr "Tilin mukaan"
 
-#: ../pidgin/gtkdebug.c:234
 msgid "Save Debug Log"
 msgstr "Tallenna virheenjäljitysloki"
 
-#: ../pidgin/gtkdebug.c:582
 msgid "Invert"
 msgstr "Käännä"
 
-#: ../pidgin/gtkdebug.c:585
 msgid "Highlight matches"
 msgstr "Korosta osumat"
 
-#: ../pidgin/gtkdebug.c:652
 msgid "_Icon Only"
 msgstr "Vain _kuvake"
 
-#: ../pidgin/gtkdebug.c:653
 msgid "_Text Only"
 msgstr "Vain _teksti"
 
-#: ../pidgin/gtkdebug.c:654
 msgid "_Both Icon & Text"
 msgstr "_Sekä kuvake että teksti"
 
-#: ../pidgin/gtkdebug.c:772
 msgid "Filter"
 msgstr "Suodin"
 
-#: ../pidgin/gtkdebug.c:791
 msgid "Right click for more options."
 msgstr "Näytä lisää valintoja oikealla hiiren painikkeella."
 
-#: ../pidgin/gtkdebug.c:821
 msgid "Level "
 msgstr "Taso "
 
-#: ../pidgin/gtkdebug.c:822 ../pidgin/gtkdebug.c:828
 msgid "Select the debug filter level."
 msgstr "Valitse virheenjäljityssuodattimen taso."
 
-#: ../pidgin/gtkdebug.c:830
 msgid "All"
 msgstr "Kaikki"
 
-#: ../pidgin/gtkdebug.c:831
 msgid "Misc"
 msgstr "Muut"
 
-#: ../pidgin/gtkdebug.c:833
 msgid "Warning"
 msgstr "Varoitukset"
 
-#: ../pidgin/gtkdebug.c:834
 msgid "Error "
 msgstr "Virheet "
 
-#: ../pidgin/gtkdebug.c:835
 msgid "Fatal Error"
 msgstr "Vakavat virheet"
 
-#: ../pidgin/gtkdialogs.c:72 ../pidgin/gtkdialogs.c:119
-msgid "lead developer"
-msgstr "pääkehittäjä"
-
-#: ../pidgin/gtkdialogs.c:73 ../pidgin/gtkdialogs.c:74
-#: ../pidgin/gtkdialogs.c:75 ../pidgin/gtkdialogs.c:76
-#: ../pidgin/gtkdialogs.c:77 ../pidgin/gtkdialogs.c:78
-#: ../pidgin/gtkdialogs.c:79 ../pidgin/gtkdialogs.c:80
-#: ../pidgin/gtkdialogs.c:81 ../pidgin/gtkdialogs.c:82
-#: ../pidgin/gtkdialogs.c:83 ../pidgin/gtkdialogs.c:84
-#: ../pidgin/gtkdialogs.c:85 ../pidgin/gtkdialogs.c:86
-#: ../pidgin/gtkdialogs.c:87 ../pidgin/gtkdialogs.c:90
-#: ../pidgin/gtkdialogs.c:92 ../pidgin/gtkdialogs.c:93
-#: ../pidgin/gtkdialogs.c:94
 msgid "developer"
 msgstr "kehittäjä"
 
-#: ../pidgin/gtkdialogs.c:88
+#. feel free to not translate this
+msgid "Ka-Hing Cheung"
+msgstr "Ka-Hing Cheung"
+
 msgid "support"
 msgstr "tuki"
 
-#: ../pidgin/gtkdialogs.c:89
 msgid "support/QA"
 msgstr "tuki/laadunvarmistus"
 
-#: ../pidgin/gtkdialogs.c:91 ../pidgin/gtkdialogs.c:114
 msgid "developer & webmaster"
 msgstr "kehittäjä & verkkosivujen ylläpitäjä"
 
-#: ../pidgin/gtkdialogs.c:101
 msgid "Senior Contributor/QA"
 msgstr "Vanhempi osallistuja/laadunvarmistus"
 
-#: ../pidgin/gtkdialogs.c:110
 msgid "win32 port"
 msgstr "win32-käännös"
 
-#: ../pidgin/gtkdialogs.c:111 ../pidgin/gtkdialogs.c:112
 msgid "maintainer"
 msgstr "ylläpitäjä"
 
-#: ../pidgin/gtkdialogs.c:113
 msgid "libfaim maintainer"
 msgstr "libfaim-ylläpitäjä"
 
 #. If "lazy bum" translates literally into a serious insult, use something else or omit it.
-#: ../pidgin/gtkdialogs.c:116
 msgid "hacker and designated driver [lazy bum]"
 msgstr "hakkeri ja kuski [laiska pummi]"
 
-#: ../pidgin/gtkdialogs.c:117
 msgid "XMPP developer"
 msgstr "XMPP-kehittäjä"
 
-#: ../pidgin/gtkdialogs.c:118
 msgid "original author"
 msgstr "alkuperäinen tekijä"
 
-#: ../pidgin/gtkdialogs.c:134
+msgid "lead developer"
+msgstr "pääkehittäjä"
+
 msgid "Afrikaans"
 msgstr "afrikaans"
 
-#: ../pidgin/gtkdialogs.c:135 ../pidgin/gtkdialogs.c:230
 msgid "Arabic"
 msgstr "arabia"
 
-#: ../pidgin/gtkdialogs.c:136
 msgid "Belarusian Latin"
 msgstr "valkovenäjä latinalainen"
 
-#: ../pidgin/gtkdialogs.c:137 ../pidgin/gtkdialogs.c:138
-#: ../pidgin/gtkdialogs.c:231
 msgid "Bulgarian"
 msgstr "bulgaria"
 
-#: ../pidgin/gtkdialogs.c:139 ../pidgin/gtkdialogs.c:140
-#: ../pidgin/gtkdialogs.c:141 ../pidgin/gtkdialogs.c:142
 msgid "Bengali"
 msgstr "bengali"
 
-#: ../pidgin/gtkdialogs.c:143
 msgid "Bosnian"
 msgstr "bosnia"
 
-#: ../pidgin/gtkdialogs.c:144 ../pidgin/gtkdialogs.c:232
-#: ../pidgin/gtkdialogs.c:233
 msgid "Catalan"
 msgstr "katalaani"
 
-#: ../pidgin/gtkdialogs.c:145 ../pidgin/gtkdialogs.c:146
 msgid "Valencian-Catalan"
 msgstr "valencian katalaani"
 
-#: ../pidgin/gtkdialogs.c:147 ../pidgin/gtkdialogs.c:234
-#: ../pidgin/gtkdialogs.c:235
 msgid "Czech"
 msgstr "tšekki"
 
-#: ../pidgin/gtkdialogs.c:148 ../pidgin/gtkdialogs.c:149
 msgid "Danish"
 msgstr "tanska"
 
-#: ../pidgin/gtkdialogs.c:150 ../pidgin/gtkdialogs.c:151
-#: ../pidgin/gtkdialogs.c:236
 msgid "German"
 msgstr "saksa"
 
-#: ../pidgin/gtkdialogs.c:152 ../pidgin/gtkdialogs.c:153
-#: ../pidgin/gtkdialogs.c:154
 msgid "Dzongkha"
 msgstr "dzongkha"
 
-#: ../pidgin/gtkdialogs.c:155 ../pidgin/gtkdialogs.c:156
 msgid "Greek"
 msgstr "kreikka"
 
-#: ../pidgin/gtkdialogs.c:157
 msgid "Australian English"
 msgstr "australian englanti"
 
-#: ../pidgin/gtkdialogs.c:158
 msgid "Canadian English"
 msgstr "kanadan englanti"
 
-#: ../pidgin/gtkdialogs.c:159
 msgid "British English"
 msgstr "brittienglanti"
 
-#: ../pidgin/gtkdialogs.c:160
 msgid "Esperanto"
 msgstr "esperanto"
 
-#: ../pidgin/gtkdialogs.c:161 ../pidgin/gtkdialogs.c:237
-#: ../pidgin/gtkdialogs.c:238 ../pidgin/gtkdialogs.c:239
-#: ../pidgin/gtkdialogs.c:240
 msgid "Spanish"
 msgstr "espanja"
 
-#: ../pidgin/gtkdialogs.c:162
 msgid "Estonian"
 msgstr "viro"
 
-#: ../pidgin/gtkdialogs.c:163 ../pidgin/gtkdialogs.c:164
 msgid "Euskera(Basque)"
 msgstr "euskara (baski)"
 
-#: ../pidgin/gtkdialogs.c:165 ../pidgin/gtkdialogs.c:166
-#: ../pidgin/gtkdialogs.c:167
 msgid "Persian"
 msgstr "persia"
 
-#: ../pidgin/gtkdialogs.c:168 ../pidgin/gtkdialogs.c:241
-#: ../pidgin/gtkdialogs.c:242
 msgid "Finnish"
 msgstr "suomi"
 
-#: ../pidgin/gtkdialogs.c:169 ../pidgin/gtkdialogs.c:243
-#: ../pidgin/gtkdialogs.c:244 ../pidgin/gtkdialogs.c:245
-#: ../pidgin/gtkdialogs.c:246
 msgid "French"
 msgstr "ranska"
 
-#: ../pidgin/gtkdialogs.c:170 ../pidgin/gtkdialogs.c:171
-#: ../pidgin/gtkdialogs.c:247
 msgid "Galician"
 msgstr "galego"
 
-#: ../pidgin/gtkdialogs.c:172 ../pidgin/gtkdialogs.c:173
 msgid "Gujarati"
 msgstr "gudžarati"
 
-#: ../pidgin/gtkdialogs.c:173
 msgid "Gujarati Language Team"
 msgstr "Gujaratin kääntäjäryhmä"
 
-#: ../pidgin/gtkdialogs.c:174 ../pidgin/gtkdialogs.c:248
 msgid "Hebrew"
 msgstr "heprea"
 
-#: ../pidgin/gtkdialogs.c:175
 msgid "Hindi"
 msgstr "hindi"
 
-#: ../pidgin/gtkdialogs.c:176 ../pidgin/gtkdialogs.c:249
 msgid "Hungarian"
 msgstr "unkari"
 
-#: ../pidgin/gtkdialogs.c:177
 msgid "Indonesian"
 msgstr "indonesia"
 
-#: ../pidgin/gtkdialogs.c:178 ../pidgin/gtkdialogs.c:250
 msgid "Italian"
 msgstr "italia"
 
-#: ../pidgin/gtkdialogs.c:179 ../pidgin/gtkdialogs.c:251
-#: ../pidgin/gtkdialogs.c:252 ../pidgin/gtkdialogs.c:253
 msgid "Japanese"
 msgstr "japani"
 
-#: ../pidgin/gtkdialogs.c:180 ../pidgin/gtkdialogs.c:254
 msgid "Georgian"
 msgstr "georgia"
 
-#: ../pidgin/gtkdialogs.c:180
 msgid "Ubuntu Georgian Translators"
 msgstr "Ubuntun georgian kääntäjät"
 
-#: ../pidgin/gtkdialogs.c:181
 msgid "Kannada"
 msgstr "kannada"
 
-#: ../pidgin/gtkdialogs.c:181
 msgid "Kannada Translation team"
 msgstr "Kannadan kääntäjäryhmä"
 
-#: ../pidgin/gtkdialogs.c:182 ../pidgin/gtkdialogs.c:255
-#: ../pidgin/gtkdialogs.c:256
 msgid "Korean"
 msgstr "korea"
 
-#: ../pidgin/gtkdialogs.c:183 ../pidgin/gtkdialogs.c:184
-#: ../pidgin/gtkdialogs.c:185
 msgid "Kurdish"
 msgstr "kurdi"
 
-#: ../pidgin/gtkdialogs.c:186
 msgid "Lao"
 msgstr "lao"
 
-#: ../pidgin/gtkdialogs.c:187 ../pidgin/gtkdialogs.c:257
-#: ../pidgin/gtkdialogs.c:258
 msgid "Lithuanian"
 msgstr "liettua"
 
-#: ../pidgin/gtkdialogs.c:188 ../pidgin/gtkdialogs.c:189
-#: ../pidgin/gtkdialogs.c:190 ../pidgin/gtkdialogs.c:259
 msgid "Macedonian"
 msgstr "makedonia"
 
-#: ../pidgin/gtkdialogs.c:191 ../pidgin/gtkdialogs.c:260
-#: ../pidgin/gtkdialogs.c:261
 msgid "Bokmål Norwegian"
 msgstr "kirjanorja"
 
-#: ../pidgin/gtkdialogs.c:192
 msgid "Nepali"
 msgstr "nepal"
 
-#: ../pidgin/gtkdialogs.c:193
 msgid "Dutch, Flemish"
 msgstr "hollanti, flaami"
 
-#: ../pidgin/gtkdialogs.c:194
 msgid "Norwegian Nynorsk"
 msgstr "norja (uusnorja)"
 
-#: ../pidgin/gtkdialogs.c:195
+msgid "Occitan"
+msgstr "oksitaani"
+
 msgid "Punjabi"
 msgstr "punjabi"
 
-#: ../pidgin/gtkdialogs.c:196 ../pidgin/gtkdialogs.c:197
-#: ../pidgin/gtkdialogs.c:198 ../pidgin/gtkdialogs.c:262
 msgid "Polish"
 msgstr "puola"
 
-#: ../pidgin/gtkdialogs.c:199
 msgid "Portuguese"
 msgstr "portugali"
 
-#: ../pidgin/gtkdialogs.c:200
 msgid "Portuguese-Brazil"
 msgstr "portugali (brasilialainen)"
 
-#: ../pidgin/gtkdialogs.c:201
 msgid "Pashto"
 msgstr "paštu"
 
-#: ../pidgin/gtkdialogs.c:202
 msgid "Romanian"
 msgstr "romania"
 
-#: ../pidgin/gtkdialogs.c:203 ../pidgin/gtkdialogs.c:263
-#: ../pidgin/gtkdialogs.c:264
 msgid "Russian"
 msgstr "venäjä"
 
-#: ../pidgin/gtkdialogs.c:204 ../pidgin/gtkdialogs.c:205
-#: ../pidgin/gtkdialogs.c:265 ../pidgin/gtkdialogs.c:266
-#: ../pidgin/gtkdialogs.c:267
 msgid "Slovak"
 msgstr "slovakki"
 
-#: ../pidgin/gtkdialogs.c:206 ../pidgin/gtkdialogs.c:268
 msgid "Slovenian"
 msgstr "sloveeni"
 
-#: ../pidgin/gtkdialogs.c:207
 msgid "Albanian"
 msgstr "albania"
 
-#: ../pidgin/gtkdialogs.c:208 ../pidgin/gtkdialogs.c:209
-#: ../pidgin/gtkdialogs.c:269 ../pidgin/gtkdialogs.c:270
 msgid "Serbian"
 msgstr "serbia"
 
-#: ../pidgin/gtkdialogs.c:210
 msgid "Sinhala"
 msgstr "sinhali"
 
-#: ../pidgin/gtkdialogs.c:211 ../pidgin/gtkdialogs.c:271
-#: ../pidgin/gtkdialogs.c:272
 msgid "Swedish"
 msgstr "ruotsi"
 
-#: ../pidgin/gtkdialogs.c:212
 msgid "Tamil"
 msgstr "tamil"
 
-#: ../pidgin/gtkdialogs.c:213
 msgid "Telugu"
 msgstr "telugu"
 
-#: ../pidgin/gtkdialogs.c:214
 msgid "Thai"
 msgstr "thai"
 
-#: ../pidgin/gtkdialogs.c:215 ../pidgin/gtkdialogs.c:273
 msgid "Turkish"
 msgstr "turkki"
 
-#: ../pidgin/gtkdialogs.c:216
 msgid "Urdu"
 msgstr "urdu"
 
-#: ../pidgin/gtkdialogs.c:217
 msgid "Vietnamese"
 msgstr "vietnam"
 
-#: ../pidgin/gtkdialogs.c:217
 msgid "T.M.Thanh and the Gnome-Vi Team"
 msgstr "T.M Thanh ja Gnomen Vi-työryhmä"
 
-#: ../pidgin/gtkdialogs.c:218 ../pidgin/gtkdialogs.c:274
 msgid "Simplified Chinese"
 msgstr "kiina (yksinkertaistettu)"
 
-#: ../pidgin/gtkdialogs.c:219 ../pidgin/gtkdialogs.c:220
-#: ../pidgin/gtkdialogs.c:221
 msgid "Hong Kong Chinese"
 msgstr "Hong Kongin kiina"
 
-#: ../pidgin/gtkdialogs.c:222 ../pidgin/gtkdialogs.c:223
-#: ../pidgin/gtkdialogs.c:275
 msgid "Traditional Chinese"
 msgstr "kiina (perinteinen)"
 
-#: ../pidgin/gtkdialogs.c:229
 msgid "Amharic"
 msgstr "amhara"
 
-#: ../pidgin/gtkdialogs.c:360
 #, c-format
 msgid "About %s"
 msgstr "Tietoja %sistä"
 
-#: ../pidgin/gtkdialogs.c:396
 #, c-format
 msgid ""
 "%s is a graphical modular messaging client based on libpurple which is "
@@ -15645,95 +11205,72 @@
 "luettelo osallistuneista löytyy \"COPYRIGHT\"-tiedostosta. Tekijät eivät "
 "anna ohjelmalle minkäänlaista takuuta.<BR><BR>"
 
-#: ../pidgin/gtkdialogs.c:414
 #, c-format
 msgid "<FONT SIZE=\"4\">IRC:</FONT> #pidgin on irc.freenode.net<BR><BR>"
 msgstr ""
 "<FONT SIZE=\"4\">IRC:</FONT> #pidgin palvelimella irc.freenode.net<BR><BR>"
 
-#: ../pidgin/gtkdialogs.c:419
 msgid "Current Developers"
 msgstr "Nykyiset kehittäjät"
 
-#: ../pidgin/gtkdialogs.c:434
 msgid "Crazy Patch Writers"
 msgstr "Villit korjauspäivitysten kirjoittajat"
 
-#: ../pidgin/gtkdialogs.c:449
 msgid "Retired Developers"
 msgstr "Lopettaneet kehittäjät"
 
-#: ../pidgin/gtkdialogs.c:464
 msgid "Retired Crazy Patch Writers"
 msgstr "Lopettaneet korjauspäivitysten kirjoittajat"
 
-#: ../pidgin/gtkdialogs.c:479
 msgid "Artists"
 msgstr "Graafikot"
 
-#: ../pidgin/gtkdialogs.c:494
 msgid "Current Translators"
 msgstr "Nykyiset kielenkääntäjät"
 
-#: ../pidgin/gtkdialogs.c:514
 msgid "Past Translators"
 msgstr "Aikaisemmat kielenkääntäjät"
 
-#: ../pidgin/gtkdialogs.c:532
 msgid "Debugging Information"
 msgstr "Virheenjäljitystietoja"
 
-#: ../pidgin/gtkdialogs.c:748 ../pidgin/gtkdialogs.c:887
-#: ../pidgin/gtkdialogs.c:968
 msgid "_Name"
 msgstr "_Nimi"
 
-#: ../pidgin/gtkdialogs.c:753 ../pidgin/gtkdialogs.c:892
-#: ../pidgin/gtkdialogs.c:973
 msgid "_Account"
 msgstr "_Käyttäjätili"
 
-#: ../pidgin/gtkdialogs.c:900
 msgid "Get User Info"
 msgstr "Hae käyttäjätiedot"
 
-#: ../pidgin/gtkdialogs.c:902
 msgid ""
 "Please enter the username or alias of the person whose info you would like "
 "to view."
 msgstr ""
 "Syötä sen henkilön käyttäjänimi tai lempinimi, jonka tiedot haluat nähdä."
 
-#: ../pidgin/gtkdialogs.c:992
 msgid "View User Log"
 msgstr "Näytä käyttäjäloki"
 
-#: ../pidgin/gtkdialogs.c:1014
 msgid "Alias Contact"
 msgstr "Anna kontaktiryhmälle lempinimi"
 
-#: ../pidgin/gtkdialogs.c:1015
 msgid "Enter an alias for this contact."
 msgstr "Anna lempinimi tälle kontaktiryhmälle."
 
-#: ../pidgin/gtkdialogs.c:1037
 #, c-format
 msgid "Enter an alias for %s."
 msgstr "Anna %s:n lempinimi."
 
-#: ../pidgin/gtkdialogs.c:1039
 msgid "Alias Buddy"
 msgstr "Anna tuttavalle lempinimi"
 
-#: ../pidgin/gtkdialogs.c:1060
 msgid "Alias Chat"
 msgstr "Anna ryhmäkeskustelulle lempinimi"
 
-#: ../pidgin/gtkdialogs.c:1061
 msgid "Enter an alias for this chat."
 msgstr "Syötä lempinimi tälle ryhmäkeskustelulle."
 
-#: ../pidgin/gtkdialogs.c:1100
 #, c-format
 msgid ""
 "You are about to remove the contact containing %s and %d other buddy from "
@@ -15748,59 +11285,47 @@
 "Olet poistamassa kontaktin, jossa on %s sekä %d muuta tuttavaa tuttavistasi. "
 "Haluatko jatkaa?"
 
-#: ../pidgin/gtkdialogs.c:1108
 msgid "Remove Contact"
 msgstr "Poista kontakti"
 
-#: ../pidgin/gtkdialogs.c:1111
 msgid "_Remove Contact"
 msgstr "_Poista kontakti"
 
-#: ../pidgin/gtkdialogs.c:1142
 #, c-format
 msgid ""
 "You are about to merge the group called %s into the group called %s. Do you "
 "want to continue?"
 msgstr "Olet yhdistämässä ryhmää \"%s\" ryhmään \"%s\".  Haluatko jatkaa?"
 
-#: ../pidgin/gtkdialogs.c:1149
 msgid "Merge Groups"
 msgstr "Yhdistä ryhmät"
 
-#: ../pidgin/gtkdialogs.c:1152
 msgid "_Merge Groups"
 msgstr "_Yhdistä ryhmät"
 
-#: ../pidgin/gtkdialogs.c:1202
 #, c-format
 msgid ""
 "You are about to remove the group %s and all its members from your buddy "
 "list.  Do you want to continue?"
 msgstr "Olet poistamassa ryhmää nimeltä \"%s\" tuttavistasi.  Haluatko jatkaa?"
 
-#: ../pidgin/gtkdialogs.c:1205
 msgid "Remove Group"
 msgstr "Poista ryhmä"
 
-#: ../pidgin/gtkdialogs.c:1208
 msgid "_Remove Group"
 msgstr "_Poista ryhmä"
 
-#: ../pidgin/gtkdialogs.c:1241
 #, c-format
 msgid ""
 "You are about to remove %s from your buddy list.  Do you want to continue?"
 msgstr "Olet poistamassa \"%s\":n tuttavistasi.  Haluatko jatkaa?"
 
-#: ../pidgin/gtkdialogs.c:1244
 msgid "Remove Buddy"
 msgstr "Poista tuttava"
 
-#: ../pidgin/gtkdialogs.c:1247
 msgid "_Remove Buddy"
 msgstr "_Poista tuttava"
 
-#: ../pidgin/gtkdialogs.c:1268
 #, c-format
 msgid ""
 "You are about to remove the chat %s from your buddy list.  Do you want to "
@@ -15809,221 +11334,186 @@
 "Olet poistamassa ryhmäkeskustelun nimeltä \"%s\" tuttavistasi. Haluatko "
 "jatkaa?"
 
-#: ../pidgin/gtkdialogs.c:1271
 msgid "Remove Chat"
 msgstr "Poista ryhmäkeskustelu"
 
-#: ../pidgin/gtkdialogs.c:1274
 msgid "_Remove Chat"
 msgstr "_Poista ryhmäkeskustelu"
 
-#: ../pidgin/gtkdocklet.c:152
 msgid "Right-click for more unread messages...\n"
 msgstr "Näytä lisää viestejä hiiren oikealla painikkeella...\n"
 
-#: ../pidgin/gtkdocklet.c:533
-msgid "Change Status"
-msgstr "Vaihda tila"
-
-#: ../pidgin/gtkdocklet.c:681
-msgid "Show Buddy List"
-msgstr "Näytä tuttavat"
-
-#: ../pidgin/gtkdocklet.c:707
-msgid "New Message..."
-msgstr "Uusi viesti..."
-
-#: ../pidgin/gtkdocklet.c:722
-msgid "Mute Sounds"
-msgstr "Vaimenna äänet"
-
-#: ../pidgin/gtkdocklet.c:729
-msgid "Blink on New Message"
-msgstr "Vilkuta uuden viestin saapuessa"
-
-#: ../pidgin/gtkdocklet.c:739
-msgid "Quit"
-msgstr "Lopeta"
-
-#: ../pidgin/gtkft.c:154
+msgid "_Change Status"
+msgstr "_Vaihda tila"
+
+msgid "Show Buddy _List"
+msgstr "Näytä _tuttavat"
+
+msgid "_Unread Messages"
+msgstr "L_ukemattomat viestit"
+
+msgid "New _Message..."
+msgstr "Uusi _viesti..."
+
+msgid "_Accounts"
+msgstr "_Käyttäjätilit"
+
+msgid "Plu_gins"
+msgstr "Liitä_nnäiset"
+
+msgid "Pr_eferences"
+msgstr "As_etukset"
+
+msgid "Mute _Sounds"
+msgstr "Vaimenn_a äänet"
+
+msgid "_Blink on New Message"
+msgstr "Vilkuta uuden viestin _saapuessa"
+
+msgid "_Quit"
+msgstr "_Lopeta"
+
 msgid "Not started"
 msgstr "Ei aloitettu"
 
-#: ../pidgin/gtkft.c:274
 msgid "<b>Receiving As:</b>"
 msgstr "<b>Otetaan vastaan käyttäjänä:</b>"
 
-#: ../pidgin/gtkft.c:276
 msgid "<b>Receiving From:</b>"
 msgstr "<b>Otetaan vastaan käyttäjältä:</b>"
 
-#: ../pidgin/gtkft.c:280
 msgid "<b>Sending To:</b>"
 msgstr "<b>Lähetetään:</b>"
 
-#: ../pidgin/gtkft.c:282
 msgid "<b>Sending As:</b>"
 msgstr "<b>Lähetetään käyttäjänä:</b>"
 
-#: ../pidgin/gtkft.c:498
 msgid "There is no application configured to open this type of file."
 msgstr "Ohjelmaa tämän tiedostotyypin avaamiseen ei ole asetettu."
 
-#: ../pidgin/gtkft.c:503
 msgid "An error occurred while opening the file."
 msgstr "Virhe tapahtui avattaessa tiedostoa."
 
-#: ../pidgin/gtkft.c:540
 #, c-format
 msgid "Error launching %s: %s"
 msgstr "Virhe käynnistettäessä %s: %s"
 
-#: ../pidgin/gtkft.c:549
 #, c-format
 msgid "Error running %s"
 msgstr "Virhe ajettaessa %s"
 
-#: ../pidgin/gtkft.c:550
 #, c-format
 msgid "Process returned error code %d"
 msgstr "Käsittele palautettu virhekoodi %d"
 
-#: ../pidgin/gtkft.c:697
 msgid "Filename:"
 msgstr "Tiedostonimi:"
 
-#: ../pidgin/gtkft.c:698
 msgid "Local File:"
 msgstr "Paikallinen tiedosto:"
 
-#: ../pidgin/gtkft.c:700
 msgid "Speed:"
 msgstr "Nopeus:"
 
-#: ../pidgin/gtkft.c:701
 msgid "Time Elapsed:"
 msgstr "Aikaa kulunut:"
 
-#: ../pidgin/gtkft.c:702
 msgid "Time Remaining:"
 msgstr "Aikaa jäljellä:"
 
-#: ../pidgin/gtkft.c:781
 msgid "Close this window when all transfers _finish"
 msgstr "Sulje tämä ikkuna kun kaikki siirrot ovat _valmiita"
 
-#: ../pidgin/gtkft.c:791
 msgid "C_lear finished transfers"
 msgstr "_Poista valmiit siirrot"
 
 #. "Download Details" arrow
-#: ../pidgin/gtkft.c:800
 msgid "File transfer _details"
 msgstr "Tiedostonsiirron yksityiskohdat"
 
 #. Pause button
-#: ../pidgin/gtkft.c:818 ../pidgin/pidginstock.c:95
 msgid "_Pause"
 msgstr "_Tauko"
 
 #. Resume button
-#: ../pidgin/gtkft.c:823
 msgid "_Resume"
 msgstr "_Jatka"
 
-#: ../pidgin/gtkimhtml.c:842
 msgid "Paste as Plain _Text"
 msgstr "Liimaa pelkkänä _tekstinä"
 
-#: ../pidgin/gtkimhtml.c:859 ../pidgin/gtkimhtmltoolbar.c:1196
 msgid "_Reset formatting"
 msgstr "_Poista muotoilu"
 
-#: ../pidgin/gtkimhtml.c:867
 msgid "Disable _smileys in selected text"
 msgstr "Ota hymiöt poi_s käytöstä valitussa tekstissä"
 
-#: ../pidgin/gtkimhtml.c:1430
 msgid "Hyperlink color"
 msgstr "Hyperlinkin väri"
 
-#: ../pidgin/gtkimhtml.c:1431
 msgid "Color to draw hyperlinks."
 msgstr "Väri jolla piirretään hyperlinkit"
 
-#: ../pidgin/gtkimhtml.c:1434
 msgid "Hyperlink prelight color"
 msgstr "Hyperlinkin ensiväri"
 
-#: ../pidgin/gtkimhtml.c:1435
 msgid "Color to draw hyperlinks when mouse is over them."
 msgstr "Väri jolla piirretään hyperlinkit kun hiiren kursori on niiden päällä."
 
-#: ../pidgin/gtkimhtml.c:1438 ../pidgin/plugins/pidginrc.c:52
 msgid "Sent Message Name Color"
 msgstr "Lähetetyn viestin nimen väri"
 
-#: ../pidgin/gtkimhtml.c:1439
 msgid "Color to draw the name of a message you sent."
 msgstr "Väri jolla näytetään lähetetyn viestin nimi."
 
-#: ../pidgin/gtkimhtml.c:1442 ../pidgin/plugins/pidginrc.c:53
 msgid "Received Message Name Color"
 msgstr "Vastaanotetun viestin nimen väri"
 
-#: ../pidgin/gtkimhtml.c:1443
 msgid "Color to draw the name of a message you received."
 msgstr "Väri jolla näytetään vastaanotetun viestin nimi."
 
-#: ../pidgin/gtkimhtml.c:1446
 msgid "\"Attention\" Name Color"
 msgstr "\"Huomio\"-ilmoituksen nimen väri"
 
-#: ../pidgin/gtkimhtml.c:1447
 msgid "Color to draw the name of a message you received containing your name."
 msgstr "Väri jolla näytetään nimesi sisältävän vastaanotetun viestin nimi."
 
-#: ../pidgin/gtkimhtml.c:1450 ../pidgin/plugins/pidginrc.c:55
 msgid "Action Message Name Color"
 msgstr "Toimintoviestin nimen väri"
 
-#: ../pidgin/gtkimhtml.c:1451
 msgid "Color to draw the name of an action message."
 msgstr "Väri jolla näytetään toimintoviestin nimi."
 
-#: ../pidgin/gtkimhtml.c:1460
+msgid "Action Message Name Color for Whispered Message"
+msgstr "Toimintoviestin nimen väri kuiskatulle viestille"
+
+msgid "Whisper Message Name Color"
+msgstr "Kuiskatun viestin nimen väri"
+
 msgid "Typing notification color"
 msgstr "Kirjoittamishuomautuksen väri"
 
-#: ../pidgin/gtkimhtml.c:1461
 msgid "The color to use for the typing notification font"
 msgstr "Väri jota käytetään kirjoittamishuomautuksen kirjasimessa"
 
-#: ../pidgin/gtkimhtml.c:1464
 msgid "Typing notification font"
 msgstr "Kirjoittamishuomautuksen kirjasin"
 
-#: ../pidgin/gtkimhtml.c:1465
 msgid "The font to use for the typing notification"
 msgstr "Kirjoittamishuomautukseen käytettävä kirjasin"
 
-#: ../pidgin/gtkimhtml.c:1468 ../pidgin/gtkimhtml.c:1469
 msgid "Enable typing notification"
 msgstr "Ota kirjoittamishuomautus käyttöön"
 
-#: ../pidgin/gtkimhtml.c:1688
 msgid "_Copy Email Address"
 msgstr "_Kopioi sähköpostiosoite"
 
-#: ../pidgin/gtkimhtml.c:1700
 msgid "_Open Link in Browser"
 msgstr "_Avaa linkki selaimessa"
 
-#: ../pidgin/gtkimhtml.c:1710
 msgid "_Copy Link Location"
 msgstr "_Kopioi linkin osoite"
 
-#: ../pidgin/gtkimhtml.c:3482
 msgid ""
 "<span size='larger' weight='bold'>Unrecognized file type</span>\n"
 "\n"
@@ -16033,7 +11523,6 @@
 "\n"
 "Oletetaan PNG-kuvaksi."
 
-#: ../pidgin/gtkimhtml.c:3485
 msgid ""
 "Unrecognized file type\n"
 "\n"
@@ -16043,7 +11532,6 @@
 "\n"
 "Oletetaan PNG-kuvaksi."
 
-#: ../pidgin/gtkimhtml.c:3514
 #, c-format
 msgid ""
 "<span size='larger' weight='bold'>Error saving image</span>\n"
@@ -16054,7 +11542,6 @@
 "\n"
 "%s"
 
-#: ../pidgin/gtkimhtml.c:3517
 #, c-format
 msgid ""
 "Error saving image\n"
@@ -16065,36 +11552,32 @@
 "\n"
 "%s"
 
-#: ../pidgin/gtkimhtml.c:3598 ../pidgin/gtkimhtml.c:3610
 msgid "Save Image"
 msgstr "Tallenna kuva"
 
-#: ../pidgin/gtkimhtml.c:3638
 #, c-format
 msgid "_Save Image..."
 msgstr "_Tallenna kuva nimellä..."
 
-#: ../pidgin/gtkimhtmltoolbar.c:164
+#, c-format
+msgid "_Add Custom Smiley..."
+msgstr "_Lisää oma hymiö..."
+
 msgid "Select Font"
 msgstr "Valitse kirjasin"
 
-#: ../pidgin/gtkimhtmltoolbar.c:244
 msgid "Select Text Color"
 msgstr "Valitse tekstin väri"
 
-#: ../pidgin/gtkimhtmltoolbar.c:324
 msgid "Select Background Color"
 msgstr "Valitse taustaväri"
 
-#: ../pidgin/gtkimhtmltoolbar.c:413
 msgid "_URL"
 msgstr "_URL"
 
-#: ../pidgin/gtkimhtmltoolbar.c:421
 msgid "_Description"
 msgstr "_Kuvaus"
 
-#: ../pidgin/gtkimhtmltoolbar.c:424
 msgid ""
 "Please enter the URL and description of the link that you want to insert. "
 "The description is optional."
@@ -16102,163 +11585,135 @@
 "Syötä URL, jonka haluat liittää, sekä sen kuvaus. \n"
 "Kuvaus on valinnainen."
 
-#: ../pidgin/gtkimhtmltoolbar.c:428
 msgid "Please enter the URL of the link that you want to insert."
 msgstr "Syötä URL jonka haluat liittää."
 
-#: ../pidgin/gtkimhtmltoolbar.c:433 ../pidgin/gtkimhtmltoolbar.c:1103
 msgid "Insert Link"
 msgstr "Lisää linkki"
 
-#: ../pidgin/gtkimhtmltoolbar.c:437 ../pidgin/gtkimhtmltoolbar.c:1264
 msgid "_Insert"
 msgstr "_Lisää"
 
-#: ../pidgin/gtkimhtmltoolbar.c:518
 #, c-format
 msgid "Failed to store image: %s\n"
 msgstr "Kuvan tallennus epäonnistui: %s\n"
 
-#: ../pidgin/gtkimhtmltoolbar.c:544 ../pidgin/gtkimhtmltoolbar.c:554
 msgid "Insert Image"
 msgstr "Liitä kuva"
 
-#: ../pidgin/gtkimhtmltoolbar.c:712
+#, c-format
+msgid ""
+"This smiley is disabled because a custom smiley exists for this shortcut:\n"
+" %s"
+msgstr ""
+"Tämä hymiö on pois käytöstä, koska tälle oikotielle on olemassa oma hymiö:\n"
+" %s"
+
 msgid "Smile!"
 msgstr "Hymyile!"
 
-#: ../pidgin/gtkimhtmltoolbar.c:763
+msgid "_Manage custom smileys"
+msgstr "_Hallitse omia hymiöitä"
+
 msgid "This theme has no available smileys."
 msgstr "Tälle teemalle ei ole saatavissa hymiöitä."
 
-#: ../pidgin/gtkimhtmltoolbar.c:847 ../pidgin/gtkimhtmltoolbar.c:1221
 msgid "_Font"
 msgstr "Ki_rjasin"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1055
 msgid "Group Items"
 msgstr "Ryhmittele kohteet"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1055
 msgid "Ungroup Items"
 msgstr "Pura kohteiden ryhmitys"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1089 ../pidgin/plugins/convcolors.c:342
 msgid "Bold"
 msgstr "Lihavoi"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1090 ../pidgin/plugins/convcolors.c:351
 msgid "Italic"
 msgstr "Kursivoi"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1091 ../pidgin/plugins/convcolors.c:360
 msgid "Underline"
 msgstr "Alleviivaa"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1092
 msgid "Strikethrough"
 msgstr "Yliviivaa"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1094
 msgid "Increase Font Size"
 msgstr "Suurenna kirjasimen kokoa"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1095
 msgid "Decrease Font Size"
 msgstr "Pienennä kirjasimen kokoa"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1097
 msgid "Font Face"
 msgstr "Kirjasintyyppi"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1098
 msgid "Background Color"
 msgstr "Taustaväri"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1099
 msgid "Foreground Color"
 msgstr "Etualaväri"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1101
 msgid "Reset Formatting"
 msgstr "Poista muotoilu"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1104
 msgid "Insert IM Image"
 msgstr "Lisää IM-kuva"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1105
 msgid "Insert Smiley"
 msgstr "Lisää hymiö"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1181
 msgid "<b>_Bold</b>"
 msgstr "<b>_Lihavoi</b>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1182
 msgid "<i>_Italic</i>"
 msgstr "<i>_Kursivoi</i>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1183
 msgid "<u>_Underline</u>"
 msgstr "<u>_Alleviivaa</u>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1184
 msgid "<span strikethrough='true'>Strikethrough</span>"
 msgstr "<span strikethrough='true'>Yliviivaa</span>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1185
 msgid "<span size='larger'>_Larger</span>"
 msgstr "<span size='larger'>_Suurempi</span>"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1187
 msgid "_Normal"
 msgstr "_Normaali"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1189
 msgid "<span size='smaller'>_Smaller</span>"
 msgstr "<span size='smaller'>_Pienempi</span>"
 
 #. If we want to show the formatting for the following items, we would
 #. * need to update them when formatting changes. The above items don't need
 #. * no updating nor nothin'
-#: ../pidgin/gtkimhtmltoolbar.c:1193
 msgid "_Font face"
 msgstr "Ki_rjasintyyppi"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1194
 msgid "Foreground _color"
 msgstr "Etuala_väri"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1195
 msgid "Bac_kground color"
 msgstr "_Taustaväri"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1272
 msgid "_Image"
 msgstr "Ku_va"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1278
 msgid "_Link"
 msgstr "_Linkki"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1284
 msgid "_Horizontal rule"
 msgstr "_Vaakaviiva"
 
-#: ../pidgin/gtkimhtmltoolbar.c:1306
 msgid "_Smile!"
 msgstr "_Hymyile!"
 
-#: ../pidgin/gtklog.c:245
 msgid "Log Deletion Failed"
 msgstr "Lokin poistaminen epäonnistui"
 
-#: ../pidgin/gtklog.c:246
 msgid "Check permissions and try again."
 msgstr "Tarkista oikeudet ja yritä uudelleen."
 
-#: ../pidgin/gtklog.c:292
 #, c-format
 msgid ""
 "Are you sure you want to permanently delete the log of the conversation with "
@@ -16267,7 +11722,6 @@
 "Haluatko varmasti poistaa käyttäjän %s kanssa käydyn viestilokin joka alkoi %"
 "s?"
 
-#: ../pidgin/gtklog.c:303
 #, c-format
 msgid ""
 "Are you sure you want to permanently delete the log of the conversation in %"
@@ -16275,43 +11729,35 @@
 msgstr ""
 "Haluatko varmasti poistaa kohteessa %s käydyn viestilokin joka alkoi %s?"
 
-#: ../pidgin/gtklog.c:308
 #, c-format
 msgid ""
 "Are you sure you want to permanently delete the system log which started at %"
 "s?"
 msgstr "Haluatko varmasti poistaa järjestelmälokin joka alkoi %s?"
 
-#: ../pidgin/gtklog.c:323
 msgid "Delete Log?"
 msgstr "Poista loki?"
 
-#: ../pidgin/gtklog.c:334
 msgid "Delete Log..."
 msgstr "Poista loki..."
 
-#: ../pidgin/gtklog.c:453
 #, c-format
 msgid "<span size='larger' weight='bold'>Conversation in %s on %s</span>"
 msgstr "<span size='larger' weight='bold'>Keskustelu huoneessa %s: %s</span>"
 
-#: ../pidgin/gtklog.c:456
 #, c-format
 msgid "<span size='larger' weight='bold'>Conversation with %s on %s</span>"
 msgstr ""
 "<span size='larger' weight='bold'>Keskustelu käyttäjän %s kanssa %s</span>"
 
 #. Steal the "HELP" response and use it to trigger browsing to the logs folder
-#: ../pidgin/gtklog.c:581
 msgid "_Browse logs folder"
 msgstr "_Selaa lokikansiota"
 
-#: ../pidgin/gtkmain.c:386
 #, c-format
 msgid "%s %s. Try `%s -h' for more information.\n"
 msgstr "%s %s. Kirjoita \"%s -h\" saadaksesi lisää tietoja.\n"
 
-#: ../pidgin/gtkmain.c:389
 #, c-format
 msgid ""
 "%s %s\n"
@@ -16342,7 +11788,6 @@
 "  --display=NÄYTTÖ    käytettävä X-näyttö\n"
 "  -v, --version       näytä nykyinen versionumero ja poistu\n"
 
-#: ../pidgin/gtkmain.c:402
 #, c-format
 msgid ""
 "%s %s\n"
@@ -16371,7 +11816,6 @@
 "                      Ilman tätä vain ensimmäinen tili otetaan käyttöön).\n"
 "  -v, --version       näytä nykyinen versionumero ja poistu\n"
 
-#: ../pidgin/gtkmain.c:532
 #, c-format
 msgid ""
 "%s %s has segfaulted and attempted to dump a core file.\n"
@@ -16412,69 +11856,54 @@
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
-#: ../pidgin/gtkmain.c:726 ../pidgin/pidgin.h:51
 msgid "Pidgin"
 msgstr "Pidgin"
 
-#: ../pidgin/gtknotify.c:360
 msgid "Open All Messages"
 msgstr "Avaa kaikki viestit"
 
-#: ../pidgin/gtknotify.c:414
 msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
 msgstr "<span weight=\"bold\" size=\"larger\">Sinulle on postia!</span>"
 
-#: ../pidgin/gtknotify.c:563
 #, c-format
 msgid "%s has %d new message."
 msgid_plural "%s has %d new messages."
 msgstr[0] "%s:lla on %d uusi viesti."
 msgstr[1] "%s:lla on %d uutta viestiä."
 
-#: ../pidgin/gtknotify.c:587
 #, c-format
 msgid "<b>%d new email.</b>"
 msgid_plural "<b>%d new emails.</b>"
 msgstr[0] "<b>%d uusi sähköposti.</b>"
 msgstr[1] "<b>%d uutta sähköpostia.</b>"
 
-#: ../pidgin/gtknotify.c:1021
 #, c-format
 msgid "The browser command \"%s\" is invalid."
 msgstr "Selainkomento \"%s\" on virheellinen."
 
-#: ../pidgin/gtknotify.c:1023 ../pidgin/gtknotify.c:1035
-#: ../pidgin/gtknotify.c:1048 ../pidgin/gtknotify.c:1185
 msgid "Unable to open URL"
 msgstr "URL:n avaaminen epäonnistui"
 
-#: ../pidgin/gtknotify.c:1033 ../pidgin/gtknotify.c:1046
 #, c-format
 msgid "Error launching \"%s\": %s"
 msgstr "Virhe käynnistettäessä \"%s\": %s"
 
-#: ../pidgin/gtknotify.c:1186
 msgid ""
 "The 'Manual' browser command has been chosen, but no command has been set."
 msgstr "Oma selainkomento -asetus valittu, mutta komentoa ei ole asetettu."
 
-#: ../pidgin/gtkplugin.c:278
 msgid "The following plugins will be unloaded."
 msgstr "Seuraavat liitännäiset otetaan pois käytöstä."
 
-#: ../pidgin/gtkplugin.c:297
 msgid "Multiple plugins will be unloaded."
 msgstr "Useita liitännäisiä otetaan pois käytöstä."
 
-#: ../pidgin/gtkplugin.c:301
 msgid "Unload Plugins"
 msgstr "Poista liitännäiset käytöstä"
 
-#: ../pidgin/gtkplugin.c:318
 msgid "Could not unload plugin"
 msgstr "Liitännäistä ei voi poistaa käytöstä"
 
-#: ../pidgin/gtkplugin.c:319
 msgid ""
 "The plugin could not be unloaded now, but will be disabled at the next "
 "startup."
@@ -16482,7 +11911,6 @@
 "Liitännäistä ei voi poistaa käytöstä nyt, mutta se poistetaan käytöstä "
 "seuraavalla käynnistymiskerralla."
 
-#: ../pidgin/gtkplugin.c:454
 #, c-format
 msgid ""
 "<span foreground=\"red\" weight=\"bold\">Error: %s\n"
@@ -16491,136 +11919,103 @@
 "<span foreground=\"red\" weight=\"bold\">Virhe: %s\n"
 "Tarkista onko liitännäisen WWW-sivustolla päivitystä.</span>"
 
-#: ../pidgin/gtkplugin.c:583
 msgid "Author"
 msgstr "Tekijä"
 
-#: ../pidgin/gtkplugin.c:661
 msgid "<b>Written by:</b>"
 msgstr "<b>Tekijät:</b>"
 
-#: ../pidgin/gtkplugin.c:685
 msgid "<b>Web site:</b>"
 msgstr "<b>WWW-sivut:</b> "
 
-#: ../pidgin/gtkplugin.c:694
 msgid "<b>Filename:</b>"
 msgstr "<b>Tiedostonimi:</b>"
 
-#: ../pidgin/gtkplugin.c:720
 msgid "Configure Pl_ugin"
 msgstr "Liitännäisen _asetukset"
 
-#: ../pidgin/gtkplugin.c:788
 msgid "<b>Plugin Details</b>"
 msgstr "<b>Liitännäisen yksityiskohdat</b>"
 
-#: ../pidgin/gtkpounce.c:157
 msgid "Select a file"
 msgstr "Valitse tiedosto"
 
 #. Create the "Pounce on Whom" frame.
-#: ../pidgin/gtkpounce.c:539
 msgid "Pounce on Whom"
 msgstr "Kenestä ilmoitetaan"
 
-#: ../pidgin/gtkpounce.c:566
 msgid "_Buddy name:"
 msgstr "_Tuttavan nimi:"
 
-#: ../pidgin/gtkpounce.c:600
 msgid "Si_gns on"
 msgstr "_kirjautuu sisään"
 
-#: ../pidgin/gtkpounce.c:602
 msgid "Signs o_ff"
 msgstr "kirjautuu _ulos"
 
-#: ../pidgin/gtkpounce.c:604
 msgid "Goes a_way"
 msgstr "poi_stuu"
 
-#: ../pidgin/gtkpounce.c:606
 msgid "Ret_urns from away"
 msgstr "_palaa"
 
-#: ../pidgin/gtkpounce.c:608
 msgid "Becomes _idle"
 msgstr "on _jouten"
 
-#: ../pidgin/gtkpounce.c:610
 msgid "Is no longer i_dle"
 msgstr "ei enää ole j_outen"
 
-#: ../pidgin/gtkpounce.c:612
 msgid "Starts _typing"
 msgstr "_alkaa kirjoittaa"
 
-#: ../pidgin/gtkpounce.c:614
 msgid "P_auses while typing"
 msgstr "_keskeyttää kirjoittamisen"
 
-#: ../pidgin/gtkpounce.c:616
 msgid "Stops t_yping"
 msgstr "lope_ttaa kirjoittamisen"
 
-#: ../pidgin/gtkpounce.c:618
 msgid "Sends a _message"
 msgstr "lähettää _viestin"
 
-#: ../pidgin/gtkpounce.c:661
 msgid "Ope_n an IM window"
 msgstr "Avaa pikav_iesti-ikkuna"
 
-#: ../pidgin/gtkpounce.c:663
 msgid "_Pop up a notification"
 msgstr "_Ponnahdusilmoitus"
 
-#: ../pidgin/gtkpounce.c:665
 msgid "Send a _message"
 msgstr "Lähetä _viesti"
 
-#: ../pidgin/gtkpounce.c:667
 msgid "E_xecute a command"
 msgstr "Suorita _komento"
 
-#: ../pidgin/gtkpounce.c:669
 msgid "P_lay a sound"
 msgstr "S_oita ääni"
 
-#: ../pidgin/gtkpounce.c:675
 msgid "Brows_e..."
 msgstr "_Selaa"
 
-#: ../pidgin/gtkpounce.c:677
 msgid "Br_owse..."
 msgstr "S_elaa"
 
-#: ../pidgin/gtkpounce.c:678
 msgid "Pre_view"
 msgstr "_Esikatselu"
 
-#: ../pidgin/gtkpounce.c:810
 msgid "P_ounce only when my status is not Available"
 msgstr "I_lmoita vain kun tilani ei ole Tavoitettavissa"
 
-#: ../pidgin/gtkpounce.c:815
 msgid "_Recurring"
 msgstr "_Toistuva"
 
-#: ../pidgin/gtkpounce.c:1259
 msgid "Pounce Target"
 msgstr "Ilmoituksen kohde"
 
-#: ../pidgin/gtkprefs.c:458
 msgid "Smiley theme failed to unpack."
 msgstr "Hymiöteeman purkaminen epäonnistui."
 
-#: ../pidgin/gtkprefs.c:593
 msgid "Install Theme"
 msgstr "Asenna teema"
 
-#: ../pidgin/gtkprefs.c:646
 msgid ""
 "Select a smiley theme that you would like to use from the list below. New "
 "themes can be installed by dragging and dropping them onto the theme list."
@@ -16628,148 +12023,112 @@
 "Valitse haluamasi hymiöteema alla olevasta listasta. Uudet teemat voi "
 "asentaa vedä&pudota-menetelmällä pudottamalla ne teemalistaan."
 
-#: ../pidgin/gtkprefs.c:681
 msgid "Icon"
 msgstr "Kuvake"
 
-#: ../pidgin/gtkprefs.c:894
 msgid "Keyboard Shortcuts"
 msgstr "Pikanäppäimet"
 
-#: ../pidgin/gtkprefs.c:914
 msgid "Cl_ose conversations with the Escape key"
 msgstr "S_ulje keskustelut Escape-näppäimellä"
 
-#: ../pidgin/gtkprefs.c:943
 msgid "System Tray Icon"
 msgstr "Ilmoitusalueen kuvake"
 
-#: ../pidgin/gtkprefs.c:944
 msgid "_Show system tray icon:"
 msgstr "_Näytä ilmoitusalueen kuvake:"
 
-#: ../pidgin/gtkprefs.c:947
 msgid "On unread messages"
 msgstr "Kun lukemattomia viestejä"
 
-#: ../pidgin/gtkprefs.c:953
 msgid "Conversation Window Hiding"
 msgstr "Keskusteluikkunan piilottaminen"
 
-#: ../pidgin/gtkprefs.c:954
 msgid "_Hide new IM conversations:"
 msgstr "_Piilota uudet pikaviestikeskustelut:"
 
-#: ../pidgin/gtkprefs.c:957 ../pidgin/gtkprefs.c:2075
 msgid "When away"
 msgstr "Poissaollessa"
 
 #. All the tab options!
-#: ../pidgin/gtkprefs.c:965
 msgid "Tabs"
 msgstr "Välilehdet"
 
-#: ../pidgin/gtkprefs.c:967
 msgid "Show IMs and chats in _tabbed windows"
 msgstr "Näytä pikaviestit ja ryhmäkeskustelut _jaetuissa ikkunoissa"
 
-#: ../pidgin/gtkprefs.c:981
 msgid "Show close b_utton on tabs"
 msgstr "Näytä _sulkemispainikkeet välilehdissä"
 
-#: ../pidgin/gtkprefs.c:984
 msgid "_Placement:"
 msgstr "_Asettelu:"
 
-#: ../pidgin/gtkprefs.c:986
 msgid "Top"
 msgstr "Ylhäällä"
 
-#: ../pidgin/gtkprefs.c:987
 msgid "Bottom"
 msgstr "Alhaalla"
 
-#: ../pidgin/gtkprefs.c:988
 msgid "Left"
 msgstr "Vasemmalla"
 
-#: ../pidgin/gtkprefs.c:989
 msgid "Right"
 msgstr "Oikealla"
 
-#: ../pidgin/gtkprefs.c:991
 msgid "Left Vertical"
 msgstr "Vasemmalla pystysuuntaisesti"
 
-#: ../pidgin/gtkprefs.c:992
 msgid "Right Vertical"
 msgstr "Oikealla pystysuuntaisesti"
 
-#: ../pidgin/gtkprefs.c:999
 msgid "N_ew conversations:"
 msgstr "_Uudet keskustelut:"
 
-#: ../pidgin/gtkprefs.c:1048
 msgid "Show _formatting on incoming messages"
 msgstr "Näytä _muotoilu tulevissa viesteissä"
 
-#: ../pidgin/gtkprefs.c:1050
 msgid "Close IMs immediately when the tab is closed"
 msgstr "Sulje pikaviestit heti kun välilehti on suljettu"
 
-#: ../pidgin/gtkprefs.c:1053
 msgid "Show _detailed information"
 msgstr "Näytä _yksityiskohtaiset tiedot"
 
-#: ../pidgin/gtkprefs.c:1055
 msgid "Enable buddy ic_on animation"
 msgstr "Näytä tuttavakuvakkeen a_nimaatio"
 
-#: ../pidgin/gtkprefs.c:1062
 msgid "_Notify buddies that you are typing to them"
 msgstr "Ilmoita tuttaville kun _kirjoitat heille"
 
-#: ../pidgin/gtkprefs.c:1065
 msgid "Highlight _misspelled words"
 msgstr "Korosta _väärinkirjoitetut sanat"
 
-#: ../pidgin/gtkprefs.c:1069
 msgid "Use smooth-scrolling"
 msgstr "Käytä portaatonta tekstinvieritystä"
 
-#: ../pidgin/gtkprefs.c:1072
 msgid "F_lash window when IMs are received"
 msgstr "_Vilkuta ikkunaa pikaviestien saapuessa"
 
-#: ../pidgin/gtkprefs.c:1074
 msgid "Minimi_ze new conversation windows"
 msgstr "Piene_nnä uudet keskusteluikkunat"
 
-#: ../pidgin/gtkprefs.c:1078
 msgid "Minimum input area height in lines:"
 msgstr "Kirjoitusalueen pienin korkeus riveissä:"
 
-#: ../pidgin/gtkprefs.c:1084
 msgid "Font"
 msgstr "Kirjasin"
 
-#: ../pidgin/gtkprefs.c:1086
 msgid "Use document font from _theme"
 msgstr "Käytä asiakirjojen kirjasinta _teemasta"
 
-#: ../pidgin/gtkprefs.c:1088
 msgid "Use font from _theme"
 msgstr "Käytä kirjasinta _teemasta"
 
-#: ../pidgin/gtkprefs.c:1094
 msgid "Conversation _font:"
 msgstr "Keskustelujen _kirjasin:"
 
-#: ../pidgin/gtkprefs.c:1101
 msgid "Default Formatting"
 msgstr "Oletusmuotoilu"
 
-#: ../pidgin/gtkprefs.c:1120
 msgid ""
 "This is how your outgoing message text will appear when you use protocols "
 "that support formatting."
@@ -16777,63 +12136,48 @@
 "Tältä ulosmenevä viesti näyttää kun käytät yhteyskäytäntöä joka tukee "
 "muotoiluja."
 
-#: ../pidgin/gtkprefs.c:1180
 msgid "Cannot start proxy configuration program."
 msgstr "Välipalvelimen asetusohjelmaa ei voi käynnistää."
 
-#: ../pidgin/gtkprefs.c:1192
 msgid "Cannot start browser configuration program."
 msgstr "Selaimen asetusohjelmaa ei voi käynnistää."
 
-#: ../pidgin/gtkprefs.c:1212
 msgid "ST_UN server:"
 msgstr "ST_UN-palvelin:"
 
-#: ../pidgin/gtkprefs.c:1224
 msgid "<span style=\"italic\">Example: stunserver.org</span>"
 msgstr "<span style=\"italic\">Esimerkki: stunserver.org</span>"
 
-#: ../pidgin/gtkprefs.c:1228
 msgid "_Autodetect IP address"
 msgstr "_Hae IP-osoite automaattisesti"
 
-#: ../pidgin/gtkprefs.c:1237
 msgid "Public _IP:"
 msgstr "Julkinen _IP:"
 
-#: ../pidgin/gtkprefs.c:1268
 msgid "Ports"
 msgstr "Portit"
 
-#: ../pidgin/gtkprefs.c:1271
 msgid "_Enable automatic router port forwarding"
 msgstr "_Ota käyttöön automaattinen reitittimen porttien uudelleenohjaus"
 
-#: ../pidgin/gtkprefs.c:1274
 msgid "_Manually specify range of ports to listen on"
 msgstr "_Aseta kuunneltava porttialue"
 
-#: ../pidgin/gtkprefs.c:1277
 msgid "_Start port:"
 msgstr "_Ensimmäinen portti:"
 
-#: ../pidgin/gtkprefs.c:1284
 msgid "_End port:"
 msgstr "Viimeinen _portti:"
 
-#: ../pidgin/gtkprefs.c:1292
 msgid "Proxy Server &amp; Browser"
 msgstr "Välipalvelin &amp; selain"
 
-#: ../pidgin/gtkprefs.c:1300
 msgid "<b>Proxy configuration program was not found.</b>"
 msgstr "<b>Välipalvelimen asetusohjelmaa ei löydy.</b>"
 
-#: ../pidgin/gtkprefs.c:1308
 msgid "<b>Browser configuration program was not found.</b>"
 msgstr "<b>Selaimen asetusohjelmaa ei löydy.</b>"
 
-#: ../pidgin/gtkprefs.c:1313
 msgid ""
 "Proxy & Browser preferences are configured\n"
 "in GNOME Preferences"
@@ -16841,99 +12185,75 @@
 "Välipalvelimen & selaimen asetukset määritetään \n"
 "Gnomen asetuksissa"
 
-#: ../pidgin/gtkprefs.c:1320
 msgid "Configure _Proxy"
 msgstr "Aseta _välipalvelin"
 
-#: ../pidgin/gtkprefs.c:1325
 msgid "Configure _Browser"
 msgstr "Aseta _selain"
 
-#: ../pidgin/gtkprefs.c:1331
 msgid "Proxy Server"
 msgstr "Välipalvelin"
 
-#: ../pidgin/gtkprefs.c:1336
 msgid "No proxy"
 msgstr "Ei välipalvelinta"
 
-#: ../pidgin/gtkprefs.c:1392
 msgid "_User:"
 msgstr "_Käyttäjä:"
 
-#: ../pidgin/gtkprefs.c:1480
 msgid "Seamonkey"
 msgstr "Seamonkey"
 
-#: ../pidgin/gtkprefs.c:1481
 msgid "Opera"
 msgstr "Opera"
 
-#: ../pidgin/gtkprefs.c:1482
 msgid "Netscape"
 msgstr "Netscape"
 
-#: ../pidgin/gtkprefs.c:1483
 msgid "Mozilla"
 msgstr "Mozilla"
 
-#: ../pidgin/gtkprefs.c:1484
 msgid "Konqueror"
 msgstr "Konqueror"
 
-#: ../pidgin/gtkprefs.c:1485
 msgid "Desktop Default"
 msgstr "Työpöydän oletus"
 
-#: ../pidgin/gtkprefs.c:1486
 msgid "GNOME Default"
 msgstr "Gnomen oletus"
 
-#: ../pidgin/gtkprefs.c:1487
 msgid "Galeon"
 msgstr "Galeon"
 
-#: ../pidgin/gtkprefs.c:1488
 msgid "Firefox"
 msgstr "Firefox"
 
-#: ../pidgin/gtkprefs.c:1489
 msgid "Firebird"
 msgstr "Firebird"
 
-#: ../pidgin/gtkprefs.c:1490
 msgid "Epiphany"
 msgstr "Epiphany"
 
-#: ../pidgin/gtkprefs.c:1499
 msgid "Manual"
 msgstr "Oma komento"
 
-#: ../pidgin/gtkprefs.c:1560
 msgid "Browser Selection"
 msgstr "Selaimen valinta"
 
-#: ../pidgin/gtkprefs.c:1564
 msgid "_Browser:"
 msgstr "_Selain:"
 
-#: ../pidgin/gtkprefs.c:1572
 msgid "_Open link in:"
 msgstr "_Avaa linkki:"
 
-#: ../pidgin/gtkprefs.c:1574
 msgid "Browser default"
 msgstr "Selaimen oletus"
 
-#: ../pidgin/gtkprefs.c:1575
 msgid "Existing window"
 msgstr "Olemassaolevaan ikkunaan"
 
-#: ../pidgin/gtkprefs.c:1577
 msgid "New tab"
 msgstr "Uuteen välilehteen"
 
-#: ../pidgin/gtkprefs.c:1594
 #, c-format
 msgid ""
 "_Manual:\n"
@@ -16942,69 +12262,54 @@
 "_Komento:\n"
 "(URL:ksi %s)"
 
-#: ../pidgin/gtkprefs.c:1620
 msgid "Log _format:"
 msgstr "Lokin _muoto:"
 
-#: ../pidgin/gtkprefs.c:1625
 msgid "Log all _instant messages"
 msgstr "Kirjaa kaikki pikaviestit _lokiin"
 
-#: ../pidgin/gtkprefs.c:1627
 msgid "Log all c_hats"
 msgstr "Kirjaa kaikki ryhmä_keskustelut lokiin"
 
-#: ../pidgin/gtkprefs.c:1629
 msgid "Log all _status changes to system log"
 msgstr "Kirjaa kaikki _tilamuutokset järjestelmälokiin"
 
-#: ../pidgin/gtkprefs.c:1779
 msgid "Sound Selection"
 msgstr "Äänivalinta"
 
-#: ../pidgin/gtkprefs.c:1789
 #, c-format
 msgid "Quietest"
 msgstr "Hiljaisin"
 
-#: ../pidgin/gtkprefs.c:1791
 #, c-format
 msgid "Quieter"
 msgstr "Hiljaisempi"
 
-#: ../pidgin/gtkprefs.c:1793
 #, c-format
 msgid "Quiet"
 msgstr "Hiljainen"
 
-#: ../pidgin/gtkprefs.c:1797
 #, c-format
 msgid "Loud"
 msgstr "Äänekäs"
 
-#: ../pidgin/gtkprefs.c:1799
 #, c-format
 msgid "Louder"
 msgstr "Äänekkäämpi"
 
-#: ../pidgin/gtkprefs.c:1801
 #, c-format
 msgid "Loudest"
 msgstr "Äänekkäin"
 
-#: ../pidgin/gtkprefs.c:1864
 msgid "_Method:"
 msgstr "_Menetelmä:"
 
-#: ../pidgin/gtkprefs.c:1866
 msgid "Console beep"
 msgstr "Konsoliäänimerkki"
 
-#: ../pidgin/gtkprefs.c:1873
 msgid "No sounds"
 msgstr "Ei ääniä"
 
-#: ../pidgin/gtkprefs.c:1886
 #, c-format
 msgid ""
 "Sound c_ommand:\n"
@@ -17013,278 +12318,258 @@
 "Äänik_omento:\n"
 "(%s tiedostonimeksi)"
 
-#: ../pidgin/gtkprefs.c:1895
 msgid "Sounds when conversation has _focus"
 msgstr "Äänet kun keskusteluikkuna on _aktiivinen"
 
-#: ../pidgin/gtkprefs.c:1897
 msgid "Enable sounds:"
 msgstr "Ota äänet käyttöön:"
 
-#: ../pidgin/gtkprefs.c:1914
 msgid "Volume:"
 msgstr "Äänenvoimakkuus:"
 
-#: ../pidgin/gtkprefs.c:1981
 msgid "Play"
 msgstr "Soita"
 
-#: ../pidgin/gtkprefs.c:2058
+msgid "_Browse..."
+msgstr "_Selaa..."
+
+msgid "_Reset"
+msgstr "_Nollaa"
+
 msgid "_Report idle time:"
 msgstr "_Ilmoita joutenoloaika:"
 
-#: ../pidgin/gtkprefs.c:2063
 msgid "Based on keyboard or mouse use"
 msgstr "Perustuen näppäimistön tai hiiren käyttöön"
 
-#: ../pidgin/gtkprefs.c:2072
 msgid "_Auto-reply:"
 msgstr "_Automaattivastaus:"
 
-#: ../pidgin/gtkprefs.c:2076
 msgid "When both away and idle"
 msgstr "Poissa ja jouten ollessa"
 
 #. Auto-away stuff
-#: ../pidgin/gtkprefs.c:2082
 msgid "Auto-away"
 msgstr "Automaattinen poissaoloasetus"
 
-#: ../pidgin/gtkprefs.c:2084
 msgid "Change status when _idle"
 msgstr "Vaihda tila, kun ollaan _jouten"
 
-#: ../pidgin/gtkprefs.c:2088
 msgid "_Minutes before becoming idle:"
 msgstr "_Minuutteja ennen jouten olevaksi asettamista:"
 
-#: ../pidgin/gtkprefs.c:2095
 msgid "Change _status to:"
 msgstr "Vaihda tila seuraavaksi:"
 
 #. Signon status stuff
-#: ../pidgin/gtkprefs.c:2108
 msgid "Status at Startup"
 msgstr "Tila käynnistettäessä"
 
-#: ../pidgin/gtkprefs.c:2110
 msgid "Use status from last _exit at startup"
 msgstr "Käytä viimeksi poistuttaessa ollutta tilaa"
 
-#: ../pidgin/gtkprefs.c:2117
 msgid "Status to a_pply at startup:"
 msgstr "Tila jota _käytetään käynnistettäessä:"
 
-#: ../pidgin/gtkprefs.c:2146
 msgid "Interface"
 msgstr "Käyttöliittymä"
 
-#: ../pidgin/gtkprefs.c:2148
 msgid "Smiley Themes"
 msgstr "Hymiöteemat"
 
-#: ../pidgin/gtkprefs.c:2155
 msgid "Browser"
 msgstr "Selain"
 
-#: ../pidgin/gtkprefs.c:2159
 msgid "Status / Idle"
 msgstr "Tila / jouten"
 
-#: ../pidgin/gtkprivacy.c:81
 msgid "Allow all users to contact me"
 msgstr "Salli kaikkien käyttäjien ottaa minuun yhteyttä"
 
-#: ../pidgin/gtkprivacy.c:82
 msgid "Allow only the users on my buddy list"
 msgstr "Salli vain käyttäjät tuttavissa"
 
-#: ../pidgin/gtkprivacy.c:83
 msgid "Allow only the users below"
 msgstr "Salli vain alla olevat käyttäjät"
 
-#: ../pidgin/gtkprivacy.c:84
 msgid "Block all users"
 msgstr "Estä kaikki käyttäjät"
 
-#: ../pidgin/gtkprivacy.c:85
 msgid "Block only the users below"
 msgstr "Estä vain alla olevat käyttäjät"
 
-#: ../pidgin/gtkprivacy.c:352
 msgid "Privacy"
 msgstr "Yksityisyys"
 
-#: ../pidgin/gtkprivacy.c:362
 msgid "Changes to privacy settings take effect immediately."
 msgstr "Muutokset yksityisyysasetuksiin tulevat voimaan heti."
 
-#: ../pidgin/gtkprivacy.c:371
 msgid "Set privacy for:"
 msgstr "Yksityisyysasetukset tilille:"
 
 #. Remove All button
-#: ../pidgin/gtkprivacy.c:417
 msgid "Remove Al_l"
 msgstr "Poista kaik_ki"
 
-#: ../pidgin/gtkprivacy.c:503 ../pidgin/gtkprivacy.c:520
 msgid "Permit User"
 msgstr "Salli käyttäjä"
 
-#: ../pidgin/gtkprivacy.c:504
 msgid "Type a user you permit to contact you."
 msgstr "Kirjoita tuttavan nimi jonka valtuutat ottamaan yhteyttä sinuun."
 
-#: ../pidgin/gtkprivacy.c:505
 msgid "Please enter the name of the user you wish to be able to contact you."
 msgstr "Syötä käyttäjän nimi, jonka tahdot voivan ottaa sinuun yhteyttä."
 
-#: ../pidgin/gtkprivacy.c:508 ../pidgin/gtkprivacy.c:524
 msgid "_Permit"
 msgstr "_Salli"
 
-#: ../pidgin/gtkprivacy.c:514
 #, c-format
 msgid "Allow %s to contact you?"
 msgstr "Sallitaanko %s:n yhteydenotot?"
 
-#: ../pidgin/gtkprivacy.c:516
 #, c-format
 msgid "Are you sure you wish to allow %s to contact you?"
 msgstr "Sallitaanko varmasti %s:n yhteydenotot?"
 
-#: ../pidgin/gtkprivacy.c:545 ../pidgin/gtkprivacy.c:559
 msgid "Block User"
 msgstr "Estä käyttäjää"
 
-#: ../pidgin/gtkprivacy.c:546
 msgid "Type a user to block."
 msgstr "Kirjoita estettävä käyttäjä."
 
-#: ../pidgin/gtkprivacy.c:547
 msgid "Please enter the name of the user you wish to block."
 msgstr "Kirjoita käyttäjän nimi jonka tahdot estää ottamasta yhteyttä."
 
-#: ../pidgin/gtkprivacy.c:555
 #, c-format
 msgid "Block %s?"
 msgstr "Estetäänkö %s?"
 
-#: ../pidgin/gtkprivacy.c:557
 #, c-format
 msgid "Are you sure you want to block %s?"
 msgstr "Haluatko varmasti estää %s?"
 
-#: ../pidgin/gtkrequest.c:274
 msgid "Apply"
 msgstr "Toteuta"
 
-#: ../pidgin/gtkrequest.c:1504
 msgid "That file already exists"
 msgstr "Tiedosto on jo olemassa"
 
-#: ../pidgin/gtkrequest.c:1505
 msgid "Would you like to overwrite it?"
 msgstr "Haluatko korvata sen?"
 
-#: ../pidgin/gtkrequest.c:1508
 msgid "Overwrite"
 msgstr "Korvaa"
 
-#: ../pidgin/gtkrequest.c:1509
 msgid "Choose New Name"
 msgstr "Valitse uusi nimi"
 
-#: ../pidgin/gtkrequest.c:1650 ../pidgin/gtkrequest.c:1664
 msgid "Select Folder..."
 msgstr "Valitse kansio..."
 
 #. list button
-#: ../pidgin/gtkroomlist.c:577
 msgid "_Get List"
 msgstr "_Hae luettelo"
 
 #. add button
-#: ../pidgin/gtkroomlist.c:585
 msgid "_Add Chat"
 msgstr "_Lisää ryhmäkeskustelu"
 
-#: ../pidgin/gtksavedstatuses.c:337
 msgid "Are you sure you want to delete the selected saved statuses?"
 msgstr "Haluatko varmasti poistaa valitut tallennetut tilat?"
 
 #. Use button
-#: ../pidgin/gtksavedstatuses.c:616 ../pidgin/gtksavedstatuses.c:1229
 msgid "_Use"
 msgstr "_Käytä"
 
-#: ../pidgin/gtksavedstatuses.c:765
 msgid "Title already in use.  You must choose a unique title."
 msgstr "Otsikko on käytössä. Sinun täytyy valita yksilöllinen otsikko."
 
-#: ../pidgin/gtksavedstatuses.c:961
 msgid "Different"
 msgstr "Eriävyys"
 
-#: ../pidgin/gtksavedstatuses.c:1153
 msgid "_Title:"
 msgstr "_Otsikko"
 
-#: ../pidgin/gtksavedstatuses.c:1161 ../pidgin/gtksavedstatuses.c:1453
 msgid "_Status:"
 msgstr "_Tila:"
 
 #. Different status message expander
-#: ../pidgin/gtksavedstatuses.c:1177
 msgid "Use a _different status for some accounts"
 msgstr "Käytä eri tilaa joillekin käyttäjätileille"
 
 #. Save & Use button
-#: ../pidgin/gtksavedstatuses.c:1236
 msgid "Sa_ve & Use"
 msgstr "Tallenna ja _käytä"
 
-#: ../pidgin/gtksavedstatuses.c:1437
 #, c-format
 msgid "Status for %s"
 msgstr "%s:n tila"
 
-#: ../pidgin/gtkstatusbox.c:688
+msgid "Custom Smiley"
+msgstr "Oma hymiö"
+
+msgid "Duplicate Shortcut"
+msgstr "Monista oikotie"
+
+msgid ""
+"A custom smiley for the selected shortcut already exists. Please specify a "
+"different shortcut."
+msgstr "Valitulle oikotielle on jo oma hymiö. Valitse toisenlainen oikotie."
+
+msgid "More Data needed"
+msgstr "Lisää tietoja tarvitaan"
+
+msgid "Please provide a shortcut to associate with the smiley."
+msgstr "Syötä hymiöön liitettävä oikotie."
+
+msgid "Please select an image for the smiley."
+msgstr "Valitse hymiölle kuva."
+
+msgid "Edit Smiley"
+msgstr "Muokkaa hymiötä"
+
+msgid "Add Smiley"
+msgstr "Lisää hymiö"
+
+msgid "Smiley _Image"
+msgstr "Hymiön kuva"
+
+#. Smiley shortcut
+msgid "Smiley S_hortcut"
+msgstr "Hymiön _oikotie"
+
+msgid "Smiley"
+msgstr "Hymiö"
+
+msgid "Custom Smiley Manager"
+msgstr "Omien hymiöiden hallinta"
+
 msgid "Waiting for network connection"
 msgstr "Odotetaan verkkoyhteyttä"
 
-#: ../pidgin/gtkstatusbox.c:1101
 msgid "New status..."
 msgstr "Uusi tila..."
 
-#: ../pidgin/gtkstatusbox.c:1102
 msgid "Saved statuses..."
 msgstr "Tallennetut tilat..."
 
-#: ../pidgin/gtkstatusbox.c:1737
 msgid "Status Selector"
 msgstr "Tilan valinta"
 
-#: ../pidgin/gtkutils.c:683
 msgid "Google Talk"
 msgstr "Google Talk"
 
-#: ../pidgin/gtkutils.c:1450 ../pidgin/gtkutils.c:1473
 #, c-format
 msgid "The following error has occurred loading %s: %s"
 msgstr "Seuraava virhe esiintyi ladattaessa komponenttia %s: %s"
 
-#: ../pidgin/gtkutils.c:1453 ../pidgin/gtkutils.c:1475
 msgid "Failed to load image"
 msgstr "Kuvan avaus epäonnistui"
 
-#: ../pidgin/gtkutils.c:1549
 #, c-format
 msgid "Cannot send folder %s."
 msgstr "Kansiota %s ei voi lähettää."
 
-#: ../pidgin/gtkutils.c:1550
 #, c-format
 msgid ""
 "%s cannot transfer a folder. You will need to send the files within "
@@ -17293,12 +12578,9 @@
 "%s ei voi siirtää kansiota. Kansion sisältämät tiedostot täytyy lähettää "
 "erikseen."
 
-#: ../pidgin/gtkutils.c:1584 ../pidgin/gtkutils.c:1596
-#: ../pidgin/gtkutils.c:1603
 msgid "You have dragged an image"
 msgstr "Olet raahannut kuvan"
 
-#: ../pidgin/gtkutils.c:1585
 msgid ""
 "You can send this image as a file transfer, embed it into this message, or "
 "use it as the buddy icon for this user."
@@ -17306,23 +12588,18 @@
 "Voit lähettää tämän kuvan tiedostonsiirtona, sisällyttää sen tähän viestiin "
 "tai käyttää sitä tuttavakuvakkeena tälle käyttäjälle."
 
-#: ../pidgin/gtkutils.c:1591 ../pidgin/gtkutils.c:1611
 msgid "Set as buddy icon"
 msgstr "Aseta tuttavakuvakkeeksi"
 
-#: ../pidgin/gtkutils.c:1592 ../pidgin/gtkutils.c:1612
 msgid "Send image file"
 msgstr "Lähetä kuvatiedosto"
 
-#: ../pidgin/gtkutils.c:1593 ../pidgin/gtkutils.c:1612
 msgid "Insert in message"
 msgstr "Liitä viestiin"
 
-#: ../pidgin/gtkutils.c:1597
 msgid "Would you like to set it as the buddy icon for this user?"
 msgstr "Haluatko asettaa sen tuttavakuvakkeeksi tälle käyttäjälle?"
 
-#: ../pidgin/gtkutils.c:1604
 msgid ""
 "You can send this image as a file transfer, or use it as the buddy icon for "
 "this user."
@@ -17330,7 +12607,6 @@
 "Voit lähettää tämän kuvan tiedostonsiirtona tai käyttää sitä "
 "tuttavakuvakkeena tälle käyttäjälle."
 
-#: ../pidgin/gtkutils.c:1605
 msgid ""
 "You can insert this image into this message, or use it as the buddy icon for "
 "this user"
@@ -17343,11 +12619,9 @@
 #. * send.  The only logical one is "Application," but do we really want to send a binary and nothing else?
 #. * Probably not.  I'll just give an error and return.
 #. The original patch sent the icon used by the launcher.  That's probably wrong
-#: ../pidgin/gtkutils.c:1664
 msgid "Cannot send launcher"
 msgstr "Käynnistintä ei voi lähettää"
 
-#: ../pidgin/gtkutils.c:1664
 msgid ""
 "You dragged a desktop launcher. Most likely you wanted to send whatever this "
 "launcher points to instead of this launcher itself."
@@ -17355,7 +12629,6 @@
 "Raahasit työpöytäkäynnistimen. Luultavasti halusit lähettää tiedoston johon "
 "käynnistin osoittaa, käynnistimen itsensä sijaan."
 
-#: ../pidgin/gtkutils.c:2402
 #, c-format
 msgid ""
 "<b>File:</b> %s\n"
@@ -17366,25 +12639,20 @@
 "<b>Tiedoston koko:</b> %s\n"
 "<b>Kuvan koko:</b> %d × %d"
 
-#: ../pidgin/gtkutils.c:2704
 #, c-format
 msgid "The file '%s' is too large for %s.  Please try a smaller image.\n"
 msgstr "Tiedosto \"%s\" on liian suuri \"%s\":lle. Kokeile pienempää kuvaa.\n"
 
-#: ../pidgin/gtkutils.c:2706
 msgid "Icon Error"
 msgstr "Kuvakevirhe"
 
-#: ../pidgin/gtkutils.c:2707
 msgid "Could not set icon"
 msgstr "Kuvaketta ei voi asettaa"
 
-#: ../pidgin/gtkutils.c:2807
 #, c-format
 msgid "Failed to open file '%s': %s"
 msgstr "Tiedostoa \"%s\" ei voi avata: %s"
 
-#: ../pidgin/gtkutils.c:2856
 #, c-format
 msgid ""
 "Failed to load image '%s': reason not known, probably a corrupt image file"
@@ -17392,83 +12660,63 @@
 "Kuvaa \"%s\" ei voi ladata: syy ei ole tiedossa, mahdollisesti vioittunut "
 "kuvatiedosto"
 
-#: ../pidgin/gtkwhiteboard.c:754 ../pidgin/gtkwhiteboard.c:773
 msgid "Save File"
 msgstr "Tallenna tiedosto"
 
-#: ../pidgin/gtkwhiteboard.c:861
 msgid "Select color"
 msgstr "Valitse väri"
 
-#: ../pidgin/pidginstock.c:87
 msgid "_Alias"
 msgstr "_Lempinimi"
 
-#: ../pidgin/pidginstock.c:89
 msgid "Close _tabs"
 msgstr "Sulje _välilehdet"
 
-#: ../pidgin/pidginstock.c:91
 msgid "_Get Info"
 msgstr "_Hae tiedot"
 
-#: ../pidgin/pidginstock.c:92
 msgid "_Invite"
 msgstr "_Kutsu"
 
-#: ../pidgin/pidginstock.c:93
 msgid "_Modify"
 msgstr "_Muokkaa"
 
-#: ../pidgin/pidginstock.c:94
 msgid "_Open Mail"
 msgstr "_Avaa sähköposti"
 
-#: ../pidgin/pidgintooltip.c:100
 msgid "Pidgin Tooltip"
 msgstr "Pidgin-työkaluvihje"
 
-#: ../pidgin/pixmaps/emotes/default/24/default.theme.in.h:2
 msgid "Pidgin smileys"
 msgstr "Pidgin-hymiöt"
 
-#: ../pidgin/pixmaps/emotes/none/none.theme.in.h:1
 msgid "Penguin Pimps"
 msgstr "Penguin Pimps"
 
-#: ../pidgin/pixmaps/emotes/none/none.theme.in.h:2
 msgid "Selecting this disables graphical emoticons."
 msgstr "Tämän valitseminen ottaa graafiset hymiöt pois käytöstä"
 
-#: ../pidgin/pixmaps/emotes/none/none.theme.in.h:3
 msgid "none"
 msgstr "ei mitään"
 
-#: ../pidgin/plugins/cap/cap.c:441 ../pidgin/plugins/cap/cap.c:444
 msgid "Response Probability:"
 msgstr "Vastaustodennäköisyys:"
 
-#: ../pidgin/plugins/cap/cap.c:769
 msgid "Statistics Configuration"
 msgstr "Tilastoinnin asetukset"
 
 #. msg_difference spinner
-#: ../pidgin/plugins/cap/cap.c:772
 msgid "Maximum response timeout:"
 msgstr "Suurin vastauksen aikakatkaisu:"
 
-#: ../pidgin/plugins/cap/cap.c:775 ../pidgin/plugins/cap/cap.c:782
-#: ../pidgin/plugins/cap/cap.c:789 ../pidgin/plugins/timestamp.c:148
 msgid "minutes"
 msgstr "minuuttia"
 
 #. last_seen spinner
-#: ../pidgin/plugins/cap/cap.c:779
 msgid "Maximum last-seen difference:"
 msgstr "Suurin viimeksi-nähty -arvon ero:"
 
 #. threshold spinner
-#: ../pidgin/plugins/cap/cap.c:786
 msgid "Threshold:"
 msgstr "Kynnys:"
 
@@ -17478,58 +12726,46 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/cap/cap.c:894
 msgid "Contact Availability Prediction"
 msgstr "Tuttavan paikallaolon ennustus"
 
 #. *< name
 #. *< version
-#: ../pidgin/plugins/cap/cap.c:896
 msgid "Contact Availability Prediction plugin."
 msgstr "Tuttavan paikallaolon ennustava liitännäinen."
 
 #. *  summary
-#: ../pidgin/plugins/cap/cap.c:897
 msgid "Displays statistical information about your buddies' availability"
 msgstr "Näyttää tilastotietoja tuttavien läsnäolosta"
 
-#: ../pidgin/plugins/contact_priority.c:61
 msgid "Buddy is idle"
 msgstr "Tuttava on jouten"
 
-#: ../pidgin/plugins/contact_priority.c:62
 msgid "Buddy is away"
 msgstr "Tuttava on poissa"
 
-#: ../pidgin/plugins/contact_priority.c:63
 msgid "Buddy is \"extended\" away"
 msgstr "Tuttava on \"pidennetysti\" poissa"
 
 #. Not used yet.
-#: ../pidgin/plugins/contact_priority.c:66
 msgid "Buddy is mobile"
 msgstr "Tuttava on liikkeellä"
 
-#: ../pidgin/plugins/contact_priority.c:68
 msgid "Buddy is offline"
 msgstr "Tuttava on poissa linjoilta"
 
-#: ../pidgin/plugins/contact_priority.c:90
 msgid "Point values to use when..."
 msgstr "Pistearvoja käytetään kun..."
 
-#: ../pidgin/plugins/contact_priority.c:118
 msgid ""
 "The buddy with the <i>largest score</i> is the buddy who will have priority "
 "in the contact.\n"
 msgstr ""
 "Tuttava, jolla on <i>suurin pistemäärä</i>, on tärkein kontaktiryhmässä.\n"
 
-#: ../pidgin/plugins/contact_priority.c:125
 msgid "Use last buddy when scores are equal"
 msgstr "Käytä viimeisintä tuttavaa, kun pisteet ovat samat"
 
-#: ../pidgin/plugins/contact_priority.c:130
 msgid "Point values to use for account..."
 msgstr "Käytettävät pistearvot käyttäjätilille..."
 
@@ -17539,20 +12775,17 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/contact_priority.c:188
 msgid "Contact Priority"
 msgstr "Kontaktin tärkeys"
 
 #. *< name
 #. *< version
 #. *< summary
-#: ../pidgin/plugins/contact_priority.c:191
 msgid ""
 "Allows for controlling the values associated with different buddy states."
 msgstr "Mahdollistaa tuttavan tila-arvojen hallinnan"
 
 #. *< description
-#: ../pidgin/plugins/contact_priority.c:193
 msgid ""
 "Allows for changing the point values of idle/away/offline states for buddies "
 "in contact priority computations."
@@ -17560,61 +12793,47 @@
 "Mahdollistaa pistearvojen muuttamisen jouten/poissa/poissa linjoilta -"
 "tiloille kontaktiryhmän prioriteettilaskelmia varten."
 
-#: ../pidgin/plugins/convcolors.c:23
 msgid "Conversation Colors"
 msgstr "Keskustelun värit"
 
-#: ../pidgin/plugins/convcolors.c:25 ../pidgin/plugins/convcolors.c:26
 msgid "Customize colors in the conversation window"
 msgstr "Aseta keskusteluikkunan värit"
 
-#: ../pidgin/plugins/convcolors.c:87
 msgid "Error Messages"
 msgstr "Virheilmoitukset"
 
-#: ../pidgin/plugins/convcolors.c:88
 msgid "Highlighted Messages"
 msgstr "Korostetut"
 
-#: ../pidgin/plugins/convcolors.c:89
 msgid "System Messages"
 msgstr "Järjestelmäviestit"
 
-#: ../pidgin/plugins/convcolors.c:90
 msgid "Sent Messages"
 msgstr "Lähetetyt viestit"
 
-#: ../pidgin/plugins/convcolors.c:91
 msgid "Received Messages"
 msgstr "Vastaanotetut viestit"
 
-#: ../pidgin/plugins/convcolors.c:223 ../pidgin/plugins/pidginrc.c:257
 #, c-format
 msgid "Select Color for %s"
 msgstr "Valitse %s:n väri"
 
-#: ../pidgin/plugins/convcolors.c:372
 msgid "Ignore incoming format"
 msgstr "Älä välitä sisääntulevien viestien muotoiluista"
 
-#: ../pidgin/plugins/convcolors.c:373
 msgid "Apply in Chats"
 msgstr "Käytä asetuksia ryhmäkeskusteluissa"
 
-#: ../pidgin/plugins/convcolors.c:374
 msgid "Apply in IMs"
 msgstr "Käytä asetuksia pikaviesteissä"
 
-#: ../pidgin/plugins/extplacement.c:80
 msgid "By conversation count"
 msgstr "Keskustelujen määrän mukaan"
 
-#: ../pidgin/plugins/extplacement.c:101
 msgid "Conversation Placement"
 msgstr "Keskustelun asettelu"
 
 #. Translators: "New conversations" should match the text in the preferences dialog and "By conversation count" should be the same text used above
-#: ../pidgin/plugins/extplacement.c:105
 msgid ""
 "Note: The preference for \"New conversations\" must be set to \"By "
 "conversation count\"."
@@ -17622,11 +12841,9 @@
 "Huom: \"Uudet keskustelut\" -asetuksen tulisi olla asetettu seuraavaksi: "
 "\"Keskustelujen määrän mukaan\"."
 
-#: ../pidgin/plugins/extplacement.c:111
 msgid "Number of conversations per window"
 msgstr "Keskustelujen määrä per ikkuna"
 
-#: ../pidgin/plugins/extplacement.c:117
 msgid "Separate IM and Chat windows when placing by number"
 msgstr "Erota pikaviesti- ja ryhmäkeskusteluikkunat aseteltaessa määrän mukaan"
 
@@ -17636,19 +12853,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/extplacement.c:146
 msgid "ExtPlacement"
 msgstr "Lisäasettelu"
 
 #. *< name
 #. *< version
-#: ../pidgin/plugins/extplacement.c:148
 msgid "Extra conversation placement options."
 msgstr "Keskustelun lisäasetteluvalinnat."
 
 #. *< summary
 #. *  description
-#: ../pidgin/plugins/extplacement.c:150
 msgid ""
 "Restrict the number of conversations per windows, optionally separating IMs "
 "and Chats"
@@ -17657,20 +12871,16 @@
 "pikaviesti- ja ryhmäkeskustelut"
 
 #. Configuration frame
-#: ../pidgin/plugins/gestures/gestures.c:235
 msgid "Mouse Gestures Configuration"
 msgstr "Hiirieleasetukset"
 
-#: ../pidgin/plugins/gestures/gestures.c:242
 msgid "Middle mouse button"
 msgstr "Keskimmäinen hiiren painike"
 
-#: ../pidgin/plugins/gestures/gestures.c:247
 msgid "Right mouse button"
 msgstr "Oikea hiiren painike"
 
 #. "Visual gesture display" checkbox
-#: ../pidgin/plugins/gestures/gestures.c:259
 msgid "_Visual gesture display"
 msgstr "_Visuaalinen ele -näyttö"
 
@@ -17680,19 +12890,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/gestures/gestures.c:295
 msgid "Mouse Gestures"
 msgstr "Hiirieleet"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../pidgin/plugins/gestures/gestures.c:298
 msgid "Provides support for mouse gestures"
 msgstr "Lisää tuen hiirieleille"
 
 #. *  description
-#: ../pidgin/plugins/gestures/gestures.c:300
 msgid ""
 "Allows support for mouse gestures in conversation windows. Drag the middle "
 "mouse button to perform certain actions:\n"
@@ -17707,34 +12914,25 @@
 "Liikuta ylös ja sitten vasemmalle vaihtaaksesi edelliseen keskusteluun.\n"
 "Liikuta ylös ja sitten oikealle vaihtaaksesi seuraavaan keskusteluun."
 
-#: ../pidgin/plugins/gevolution/add_buddy_dialog.c:143
 msgid "Instant Messaging"
 msgstr "Pikaviestintä"
 
 #. Add the label.
-#: ../pidgin/plugins/gevolution/add_buddy_dialog.c:461
 msgid "Select a person from your address book below, or add a new person."
 msgstr "Valitse henkilö alla olevasta osoitekirjasta, tai lisää uusi henkilö."
 
-#: ../pidgin/plugins/gevolution/add_buddy_dialog.c:555
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:305
 msgid "Group:"
 msgstr "Ryhmä:"
 
 #. "New Person" button
-#: ../pidgin/plugins/gevolution/add_buddy_dialog.c:580
-#: ../pidgin/plugins/gevolution/assoc-buddy.c:467
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:252
 msgid "New Person"
 msgstr "Uusi henkilö"
 
 #. "Select Buddy" button
-#: ../pidgin/plugins/gevolution/add_buddy_dialog.c:597
 msgid "Select Buddy"
 msgstr "Valitse tuttava"
 
 #. Add the label.
-#: ../pidgin/plugins/gevolution/assoc-buddy.c:343
 msgid ""
 "Select a person from your address book to add this buddy to, or create a new "
 "person."
@@ -17743,43 +12941,33 @@
 "henkilö."
 
 #. Add the expander
-#: ../pidgin/plugins/gevolution/assoc-buddy.c:431
 msgid "User _details"
 msgstr "Käyttäjän tiedot"
 
 #. "Associate Buddy" button
-#: ../pidgin/plugins/gevolution/assoc-buddy.c:484
 msgid "_Associate Buddy"
 msgstr "_Yhdistä tuttava"
 
-#: ../pidgin/plugins/gevolution/gevolution.c:242
-#: ../pidgin/plugins/gevolution/gevolution.c:248
 msgid "Unable to send email"
 msgstr "Sähköpostia ei voi lähettää."
 
-#: ../pidgin/plugins/gevolution/gevolution.c:243
 msgid "The evolution executable was not found in the PATH."
 msgstr "Suoritettava evolution-tiedosto ei löytynyt PATH-muuttujasta."
 
-#: ../pidgin/plugins/gevolution/gevolution.c:249
 msgid "An email address was not found for this buddy."
 msgstr "Tälle tuttavalle ei löytynyt sähköpostiosoitetta."
 
-#: ../pidgin/plugins/gevolution/gevolution.c:275
 msgid "Add to Address Book"
 msgstr "Lisää osoitekirjaan"
 
-#: ../pidgin/plugins/gevolution/gevolution.c:287
 msgid "Send Email"
 msgstr "Lähetä sähköposti"
 
 #. Configuration frame
-#: ../pidgin/plugins/gevolution/gevolution.c:414
 msgid "Evolution Integration Configuration"
 msgstr "Evolution-integraatioasetukset"
 
 #. Label
-#: ../pidgin/plugins/gevolution/gevolution.c:417
 msgid "Select all accounts that buddies should be auto-added to."
 msgstr "Valitse kaikki tilit, joihin tuttavat lisätään automaattisesti."
 
@@ -17789,7 +12977,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/gevolution/gevolution.c:529
 msgid "Evolution Integration"
 msgstr "Evolution-integrointi"
 
@@ -17797,37 +12984,28 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/gevolution/gevolution.c:532
-#: ../pidgin/plugins/gevolution/gevolution.c:534
 msgid "Provides integration with Evolution."
 msgstr "Mahdollistaa integroinnin Evolutionin kanssa."
 
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:266
 msgid "Please enter the person's information below."
 msgstr "Syötä henkilön tiedot alle."
 
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:270
 msgid "Please enter the buddy's username and account type below."
 msgstr "Syötä tuttavan käyttäjänimi ja käyttäjätilin tyyppi alla."
 
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:290
 msgid "Account type:"
 msgstr "Käyttäjätilin tyyppi:"
 
 #. Optional Information section
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:313
 msgid "Optional information:"
 msgstr "Valinnaisia tietoja:"
 
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:348
 msgid "First name:"
 msgstr "Etunimi:"
 
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:360
 msgid "Last name:"
 msgstr "Sukunimi:"
 
-#: ../pidgin/plugins/gevolution/new_person_dialog.c:380
 msgid "Email:"
 msgstr "Sähköposti:"
 
@@ -17837,7 +13015,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/gtk-signals-test.c:160
 msgid "GTK Signals Test"
 msgstr "GTK-signaalitesti"
 
@@ -17845,13 +13022,10 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/gtk-signals-test.c:163
-#: ../pidgin/plugins/gtk-signals-test.c:165
 msgid "Test to see that all ui signals are working properly."
 msgstr ""
 "Kokeile nähdäksesi, että kaikki käyttöliittymäsignaalit toimivat oikein."
 
-#: ../pidgin/plugins/gtkbuddynote.c:36
 #, c-format
 msgid ""
 "\n"
@@ -17860,7 +13034,6 @@
 "\n"
 "<b>Tuttavakommentti:</b> %s"
 
-#: ../pidgin/plugins/history.c:195
 msgid "History"
 msgstr "Historia"
 
@@ -17870,7 +13043,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/iconaway.c:82
 msgid "Iconify on Away"
 msgstr "Pienennä poissa ollessa"
 
@@ -17878,47 +13050,36 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/iconaway.c:85 ../pidgin/plugins/iconaway.c:87
 msgid "Iconifies the buddy list and your conversations when you go away."
 msgstr "Pienentää tuttavat- ja keskusteluikkunan poissaolon ajaksi."
 
-#: ../pidgin/plugins/mailchk.c:160
 msgid "Mail Checker"
 msgstr "Sähköpostitarkistin"
 
-#: ../pidgin/plugins/mailchk.c:162
 msgid "Checks for new local mail."
 msgstr "Tarkistaa paikallisen koneen sähköpostin."
 
-#: ../pidgin/plugins/mailchk.c:163
 msgid "Adds a small box to the buddy list that shows if you have new mail."
 msgstr "Lisää pienen neliön tuttaviin, joka ilmoittaa uudesta sähköpostista."
 
-#: ../pidgin/plugins/markerline.c:23
 msgid "Markerline"
 msgstr "Merkintäviiva"
 
-#: ../pidgin/plugins/markerline.c:25 ../pidgin/plugins/markerline.c:26
 msgid "Draw a line to indicate new messages in a conversation."
 msgstr "Piirrä viiva merkitsemään uusia viestejä keskustelussa."
 
-#: ../pidgin/plugins/markerline.c:240
 msgid "Jump to markerline"
 msgstr "Siirry merkintäviivaan"
 
-#: ../pidgin/plugins/markerline.c:274
 msgid "Draw Markerline in "
 msgstr "Piirrä merkintäviiva "
 
-#: ../pidgin/plugins/markerline.c:278 ../pidgin/plugins/notify.c:693
 msgid "_IM windows"
 msgstr "_Pikaviesti-ikkunoille"
 
-#: ../pidgin/plugins/markerline.c:282 ../pidgin/plugins/notify.c:700
 msgid "C_hat windows"
 msgstr "_Ryhmäkeskusteluikkunoille"
 
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:44
 msgid ""
 "A music messaging session has been requested. Please click the MM icon to "
 "accept."
@@ -17926,36 +13087,28 @@
 "Musiikkiviestintäistunto pyydetty aloitettavaksi. Napsauta MM-kuvaketta "
 "hyväksyäksesi pyynnön."
 
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:45
 msgid "Music messaging session confirmed."
 msgstr "Musiikkiviestintäistunto varmistettu."
 
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:430
 msgid "Music Messaging"
 msgstr "Musiikkiviestintä"
 
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:431
 msgid "There was a conflict in running the command:"
 msgstr "Tapahtui virhe suoritettaessa komentoa:"
 
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:539
 msgid "Error Running Editor"
 msgstr "Virhe ajettaessa muokkainta"
 
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:540
 msgid "The following error has occurred:"
 msgstr "Seuraava virhe tapahtui:"
 
 #. Configuration frame
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:639
 msgid "Music Messaging Configuration"
 msgstr "Musiikkiviestinnän asetukset"
 
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:643
 msgid "Score Editor Path"
 msgstr "Sävellysmuokkaimen polku"
 
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:644
 msgid "_Apply"
 msgstr "_Toteuta"
 
@@ -17967,12 +13120,10 @@
 #. *< id
 #. *< name
 #. *< version
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:685
 msgid "Music Messaging Plugin for collaborative composition."
 msgstr "Musiikkiviestintäliitännäinen yhdessä säveltämistä varten."
 
 #. *  summary
-#: ../pidgin/plugins/musicmessaging/musicmessaging.c:687
 msgid ""
 "The Music Messaging Plugin allows a number of users to simultaneously work "
 "on a piece of music by editting a common score in real-time."
@@ -17982,79 +13133,63 @@
 "reaaliaikaisesti."
 
 #. ---------- "Notify For" ----------
-#: ../pidgin/plugins/notify.c:689
 msgid "Notify For"
 msgstr "Huomautus"
 
-#: ../pidgin/plugins/notify.c:708
 msgid "\t_Only when someone says your username"
 msgstr "\t_Vain kun joku sanoo käyttäjänimesi"
 
-#: ../pidgin/plugins/notify.c:718
 msgid "_Focused windows"
 msgstr "_Kohdistetuille ikkunoille"
 
 #. ---------- "Notification Methods" ----------
-#: ../pidgin/plugins/notify.c:726
 msgid "Notification Methods"
 msgstr "Ilmoitustavat"
 
-#: ../pidgin/plugins/notify.c:733
 msgid "Prepend _string into window title:"
 msgstr "Lisää _merkkijono ikkunaotsikon eteen:"
 
 #. Count method button
-#: ../pidgin/plugins/notify.c:752
 msgid "Insert c_ount of new messages into window title"
 msgstr "Lisää uusien _viestien määrä ikkunaotsikkoon"
 
 #. Count xprop method button
-#: ../pidgin/plugins/notify.c:761
 msgid "Insert count of new message into _X property"
 msgstr "Lisää uusien viestien määrä _X-ominaisuuteen (xprop)"
 
 #. Urgent method button
-#: ../pidgin/plugins/notify.c:769
 msgid "Set window manager \"_URGENT\" hint"
 msgstr "Aseta ikkunointiohjelman \"_URGENT\"(kiireellinen)-lippu"
 
 #. Raise window method button
-#: ../pidgin/plugins/notify.c:778
 msgid "R_aise conversation window"
 msgstr "N_osta keskusteluikkuna"
 
 #. Present conversation method button
-#: ../pidgin/plugins/notify.c:786
 msgid "_Present conversation window"
 msgstr "E_sitä keskusteluikkuna"
 
 #. ---------- "Notification Removals" ----------
-#: ../pidgin/plugins/notify.c:794
 msgid "Notification Removal"
 msgstr "Huomautuksen poisto"
 
 #. Remove on focus button
-#: ../pidgin/plugins/notify.c:799
 msgid "Remove when conversation window _gains focus"
 msgstr "Poista kun keskusteluikkuna on _aktiivinen"
 
 #. Remove on click button
-#: ../pidgin/plugins/notify.c:806
 msgid "Remove when conversation window _receives click"
 msgstr "Poista kun keskusteluikkunaa _napsautetaan"
 
 #. Remove on type button
-#: ../pidgin/plugins/notify.c:814
 msgid "Remove when _typing in conversation window"
 msgstr "Poista kun keskusteluikkunaan _kirjoitetaan"
 
 #. Remove on message send button
-#: ../pidgin/plugins/notify.c:822
 msgid "Remove when a _message gets sent"
 msgstr "Poista kun viesti _lähetetään"
 
 #. Remove on conversation switch button
-#: ../pidgin/plugins/notify.c:831
 msgid "Remove on switch to conversation ta_b"
 msgstr "Poista kun _välilehti vaihtuu"
 
@@ -18064,7 +13199,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/notify.c:924
 msgid "Message Notification"
 msgstr "Viestihuomautus"
 
@@ -18072,7 +13206,6 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/notify.c:927 ../pidgin/plugins/notify.c:929
 msgid "Provides a variety of ways of notifying you of unread messages."
 msgstr "Ilmoittaa lukemattomista viesteistä monilla tavoilla."
 
@@ -18082,19 +13215,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/pidgininc.c:91
 msgid "Pidgin Demonstration Plugin"
 msgstr "Pidgin-esittelyliitännäinen"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../pidgin/plugins/pidgininc.c:94
 msgid "An example plugin that does stuff - see the description."
 msgstr "Esimerkkiliitännäinen joka tekee jotain - katso kuvaus."
 
 #. *  description
-#: ../pidgin/plugins/pidgininc.c:96
 msgid ""
 "This is a really cool plugin that does a lot of stuff:\n"
 "- It tells you who wrote the program when you log in\n"
@@ -18107,57 +13237,44 @@
 "- Lähettää viestin listalla oleville tuttavillesi aina kun he kirjautuvat "
 "sisään"
 
-#: ../pidgin/plugins/pidginrc.c:49
 msgid "Cursor Color"
 msgstr "Kohdistimen väri"
 
-#: ../pidgin/plugins/pidginrc.c:50
 msgid "Secondary Cursor Color"
 msgstr "Toissijainen kohdistimen väri"
 
-#: ../pidgin/plugins/pidginrc.c:51
 msgid "Hyperlink Color"
 msgstr "Hyperlinkin väri"
 
-#: ../pidgin/plugins/pidginrc.c:54
 msgid "Highlighted Message Name Color"
 msgstr "Korostetun viestin nimen väri"
 
-#: ../pidgin/plugins/pidginrc.c:66
 msgid "GtkTreeView Horizontal Separation"
 msgstr "GtkTreeView - leveyssuuntainen erotus"
 
-#: ../pidgin/plugins/pidginrc.c:81
 msgid "Conversation Entry"
 msgstr "Keskustelumerkintä"
 
-#: ../pidgin/plugins/pidginrc.c:82
 msgid "Request Dialog"
 msgstr "Pyyntövalintaikkuna"
 
-#: ../pidgin/plugins/pidginrc.c:83
 msgid "Notify Dialog"
 msgstr "Huomautusvalintaikunna"
 
-#: ../pidgin/plugins/pidginrc.c:259
 msgid "Select Color"
 msgstr "Valitse väri"
 
-#: ../pidgin/plugins/pidginrc.c:306
 #, c-format
 msgid "Select Interface Font"
 msgstr "Valitse käyttöliittymän kirjasin"
 
-#: ../pidgin/plugins/pidginrc.c:309
 #, c-format
 msgid "Select Font for %s"
 msgstr "Valitse %s:n kirjasin"
 
-#: ../pidgin/plugins/pidginrc.c:377
 msgid "GTK+ Interface Font"
 msgstr "GTK+-käyttöliittymän kirjasin"
 
-#: ../pidgin/plugins/pidginrc.c:397
 msgid "GTK+ Text Shortcut Theme"
 msgstr "GTK+-tekstioikopolkuteema"
 
@@ -18181,50 +13298,39 @@
 #. widget_bool_widgets[i]);
 #. }
 #.
-#: ../pidgin/plugins/pidginrc.c:434
 msgid "Interface colors"
 msgstr "Käyttöliittymän värit"
 
-#: ../pidgin/plugins/pidginrc.c:458
 msgid "Widget Sizes"
 msgstr "Säädinkoot"
 
-#: ../pidgin/plugins/pidginrc.c:479
 msgid "Fonts"
 msgstr "Kirjasimet"
 
-#: ../pidgin/plugins/pidginrc.c:503
 msgid "Gtkrc File Tools"
 msgstr "Gtkrc-tiedostotyökalut"
 
-#: ../pidgin/plugins/pidginrc.c:508
 #, c-format
 msgid "Write settings to %s%sgtkrc-2.0"
 msgstr "Kirjoita asetukset tiedostoon %s%sgtkrc-2.0"
 
-#: ../pidgin/plugins/pidginrc.c:517
 msgid "Re-read gtkrc files"
 msgstr "Lue uudelleen gtkrc-tiedostot"
 
-#: ../pidgin/plugins/pidginrc.c:555
 msgid "Pidgin GTK+ Theme Control"
 msgstr "Pidgin GTK+-teemanhallinta"
 
-#: ../pidgin/plugins/pidginrc.c:557 ../pidgin/plugins/pidginrc.c:558
 msgid "Provides access to commonly used gtkrc settings."
 msgstr "Antaa pääsyn usein käytettyihin gtkrc-asetuksiin."
 
-#: ../pidgin/plugins/raw.c:175
 msgid "Raw"
 msgstr "Raakasyöttö"
 
-#: ../pidgin/plugins/raw.c:177
 msgid "Lets you send raw input to text-based protocols."
 msgstr ""
 "Mahdollistaa raakamuotoisen syötteen antamisen tekstipohjaisille "
 "yhteyskäytännöille."
 
-#: ../pidgin/plugins/raw.c:178
 msgid ""
 "Lets you send raw input to text-based protocols (XMPP, MSN, IRC, TOC). Hit "
 "'Enter' in the entry box to send. Watch the debug window."
@@ -18233,7 +13339,6 @@
 "yhteyskäytännöillä (XMPP, MSN, IRC, TOC). Paina \"Enter\" "
 "viestinsyöttölaatikossa lähettääksesi. Tarkkaile virheenjäljitysikkunaa."
 
-#: ../pidgin/plugins/relnot.c:71
 #, c-format
 msgid ""
 "You are using %s version %s.  The current version is %s.  You can get it "
@@ -18242,12 +13347,10 @@
 "Käyttämäsi %s-versio on %s. Nykyinen versio on %s. Se löytyy osoitteesta <a "
 "href=\"%s\">%s</a><hr>"
 
-#: ../pidgin/plugins/relnot.c:79
 #, c-format
 msgid "<b>ChangeLog:</b><br>%s"
 msgstr "<b>Muutosloki:</b><br>%s"
 
-#: ../pidgin/plugins/relnot.c:84 ../pidgin/plugins/relnot.c:85
 msgid "New Version Available"
 msgstr "Uusi versio saatavilla"
 
@@ -18257,19 +13360,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/relnot.c:143
 msgid "Release Notification"
 msgstr "Julkaisuilmoitus"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../pidgin/plugins/relnot.c:146
 msgid "Checks periodically for new releases."
 msgstr "Tarkistaa määräajoin onko uusi Pidgin-versio julkaistu."
 
 #. *  description
-#: ../pidgin/plugins/relnot.c:148
 msgid ""
 "Checks periodically for new releases and notifies the user with the "
 "ChangeLog."
@@ -18285,18 +13385,15 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/sendbutton.c:138
 msgid "Send Button"
 msgstr "Lähetä-painike"
 
 #. *< name
 #. *< version
-#: ../pidgin/plugins/sendbutton.c:140
 msgid "Conversation Window Send Button."
 msgstr "Keskusteluikkunan Läheta-painike."
 
 #. *< summary
-#: ../pidgin/plugins/sendbutton.c:141
 msgid ""
 "Adds a Send button to the entry area of the conversation window. Intended "
 "for when no physical keyboard is present."
@@ -18304,70 +13401,54 @@
 "Lisää keskusteluikkunan kirjoitusalueelle Lähetä-painikkeen. Tarkoitettu "
 "käytettäväksi, kun fyysistä näppäimistöä ei ole käytettävissä."
 
-#: ../pidgin/plugins/spellchk.c:1970
 msgid "Duplicate Correction"
 msgstr "Korjauksen toisinto"
 
-#: ../pidgin/plugins/spellchk.c:1971
 msgid "The specified word already exists in the correction list."
 msgstr "Määritetty sana on jo korjauslistassa."
 
-#: ../pidgin/plugins/spellchk.c:2184
 msgid "Text Replacements"
 msgstr "Tekstin korvaus"
 
-#: ../pidgin/plugins/spellchk.c:2207
 msgid "You type"
 msgstr "Kirjoitettu"
 
-#: ../pidgin/plugins/spellchk.c:2221
 msgid "You send"
 msgstr "Lähetetty"
 
-#: ../pidgin/plugins/spellchk.c:2235
 msgid "Whole words only"
 msgstr "Vain kokonaiset sanat"
 
-#: ../pidgin/plugins/spellchk.c:2247
 msgid "Case sensitive"
 msgstr "Sama kirjainkoko"
 
-#: ../pidgin/plugins/spellchk.c:2273
 msgid "Add a new text replacement"
 msgstr "Lisää uusi korvausehto"
 
-#: ../pidgin/plugins/spellchk.c:2289
 msgid "You _type:"
 msgstr "_Kirjoitettu:"
 
-#: ../pidgin/plugins/spellchk.c:2293
 msgid "You _send:"
 msgstr "_Lähetetty:"
 
 #. Created here so it can be passed to whole_words_button_toggled.
-#: ../pidgin/plugins/spellchk.c:2296
 msgid "_Exact case match (uncheck for automatic case handling)"
 msgstr ""
 "_Ehdoton kirjainkoon täsmäys (poista valinta jos haluat automaattisen "
 "kirjainkoon hallinnan)"
 
-#: ../pidgin/plugins/spellchk.c:2298
 msgid "Only replace _whole words"
 msgstr "Korvaa vain _kokonaiset sanat"
 
-#: ../pidgin/plugins/spellchk.c:2323
 msgid "General Text Replacement Options"
 msgstr "Tekstin korvauksen yleiset valinnat"
 
-#: ../pidgin/plugins/spellchk.c:2324
 msgid "Enable replacement of last word on send"
 msgstr "Salli viimeisen sanan korvaus lähetettäessä"
 
-#: ../pidgin/plugins/spellchk.c:2357
 msgid "Text replacement"
 msgstr "Tekstin korvaus"
 
-#: ../pidgin/plugins/spellchk.c:2359 ../pidgin/plugins/spellchk.c:2360
 msgid "Replaces text in outgoing messages according to user-defined rules."
 msgstr "Korvaa lähetettävän tekstin käyttäjän määritelmän mukaan."
 
@@ -18377,7 +13458,6 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/ticker/ticker.c:74 ../pidgin/plugins/ticker/ticker.c:356
 msgid "Buddy Ticker"
 msgstr "Rullaava tuttavataulu"
 
@@ -18385,11 +13465,9 @@
 #. *< version
 #. *  summary
 #. *  description
-#: ../pidgin/plugins/ticker/ticker.c:359 ../pidgin/plugins/ticker/ticker.c:361
 msgid "A horizontal scrolling version of the buddy list."
 msgstr "Vaakatasossa rullaava versio tuttavista."
 
-#: ../pidgin/plugins/timestamp.c:135
 msgid "Display Timestamps Every"
 msgstr "Näytä aikaleimat joka"
 
@@ -18399,50 +13477,38 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/timestamp.c:200
 msgid "Timestamp"
 msgstr "Aikaleima"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../pidgin/plugins/timestamp.c:203
 msgid "Display iChat-style timestamps"
 msgstr "Näytä iChat-tyyliset aikaleimat"
 
 #. *  description
-#: ../pidgin/plugins/timestamp.c:205
 msgid "Display iChat-style timestamps every N minutes."
 msgstr "Näytä iChat-tyyliset aikaleimat N minuutin välein."
 
-#: ../pidgin/plugins/timestamp_format.c:23
 msgid "Timestamp Format Options"
 msgstr "Aikaleiman muotoiluasetukset"
 
-#: ../pidgin/plugins/timestamp_format.c:26
 #, c-format
 msgid "_Force 24-hour time format"
 msgstr "_Pakota 24 tunnin aikamuoto"
 
-#: ../pidgin/plugins/timestamp_format.c:33
 msgid "Show dates in..."
 msgstr "Näytä päivämäärät..."
 
-#: ../pidgin/plugins/timestamp_format.c:38
 msgid "Co_nversations:"
 msgstr "Ke_skustelut:"
 
-#: ../pidgin/plugins/timestamp_format.c:40
-#: ../pidgin/plugins/timestamp_format.c:49
 msgid "For delayed messages"
 msgstr "Viivästetyille viesteille"
 
-#: ../pidgin/plugins/timestamp_format.c:41
-#: ../pidgin/plugins/timestamp_format.c:50
 msgid "For delayed messages and in chats"
 msgstr "Viivästetyille viesteille, ja ryhmäkeskusteluissa"
 
-#: ../pidgin/plugins/timestamp_format.c:47
 msgid "_Message Logs:"
 msgstr "_Viestilokit:"
 
@@ -18452,19 +13518,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/timestamp_format.c:151
 msgid "Message Timestamp Formats"
 msgstr "Viestin aikaleimamuodot"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../pidgin/plugins/timestamp_format.c:154
 msgid "Customizes the message timestamp formats."
 msgstr "Muokkaa viestin aikaleimamuotoja."
 
 #. *  description
-#: ../pidgin/plugins/timestamp_format.c:156
 msgid ""
 "This plugin allows the user to customize conversation and logging message "
 "timestamp formats."
@@ -18472,48 +13535,36 @@
 "Tämä liitännäinen mahdollistaa keskustelu- ja lokiviestien aikaleimamuotojen "
 "muokkaamisen."
 
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:175
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:598
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:645
 msgid "Opacity:"
 msgstr "Peitto:"
 
 #. IM Convo trans options
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:562
 msgid "IM Conversation Windows"
 msgstr "Pikaviesti-ikkunat"
 
 # NOTE source: gimp + google
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:563
 msgid "_IM window transparency"
 msgstr "_Pikaviesti-ikkunan läpinäkyvyys"
 
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:577
 msgid "_Show slider bar in IM window"
 msgstr "_Näytä vierityspalkki pikaviesti-ikkunassa"
 
 # NOTE source: gimp + google
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:584
 msgid "Remove IM window transparency on focus"
 msgstr "Poista pikaviesti-ikkunan läpinäkyvyys sen ollessa kohdistettuna"
 
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:587
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:635
 msgid "Always on top"
 msgstr "Aina päällimmäisenä"
 
 #. Buddy List trans options
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:619
 msgid "Buddy List Window"
 msgstr "Tuttavat-ikkuna"
 
 # NOTE source: gimp + google
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:620
 msgid "_Buddy List window transparency"
 msgstr "_Tuttavat-ikkunan läpinäkyvyys"
 
 # NOTE source: gimp + google
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:633
 msgid "Remove Buddy List window transparency on focus"
 msgstr "Poista tuttavat-ikkunan läpinäkyvyys sen ollessa kohdistettuna"
 
@@ -18524,19 +13575,16 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:693
 msgid "Transparency"
 msgstr "Läpinäkyvyys"
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:696
 msgid "Variable Transparency for the buddy list and conversations."
 msgstr "Vaihteleva läpinäkyvyys tuttavat-ikkunalle ja keskusteluille."
 
 #. *  description
-#: ../pidgin/plugins/win32/transparency/win2ktrans.c:698
 msgid ""
 "This plugin enables variable alpha transparency on conversation windows and "
 "the buddy list.\n"
@@ -18548,54 +13596,43 @@
 "\n"
 "Huomaa: Tämä liitännäinen vaatii Win2000 tai uudemman."
 
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:303
 msgid "GTK+ Runtime Version"
 msgstr "GTK+ Runtime -versio"
 
 #. Autostart
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:311
 msgid "Startup"
 msgstr "Käynnistys"
 
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:312
 #, c-format
 msgid "_Start %s on Windows startup"
 msgstr "_Käynnistä %s Windowsin käynnistyessä"
 
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:327
 msgid "_Dockable Buddy List"
 msgstr "_Telakoi tuttavat-ikkuna ruudun reunaan"
 
 #. Blist On Top
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:331
 msgid "_Keep Buddy List window on top:"
 msgstr "_Pidä tuttavat-ikkuna päällimmäisenä:"
 
 #. XXX: Did this ever work?
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:336
 msgid "Only when docked"
 msgstr "Vain telakoituna"
 
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:341
 msgid "_Flash window when chat messages are received"
 msgstr "_Vilkuta ikkunaa ryhmäkeskusteluviestien saapuessa"
 
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:371
 msgid "Windows Pidgin Options"
 msgstr "Windows Pidgin -valinnat"
 
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:373
 msgid "Options specific to Pidgin for Windows."
 msgstr "Asetukset jotka liittyvät erityisesti Pidginin Windows-versioon "
 
-#: ../pidgin/plugins/win32/winprefs/winprefs.c:374
 msgid ""
 "Provides options specific to Pidgin for Windows , such as buddy list docking."
 msgstr ""
 "Tarjoaa Windows Pidgin -sidonnaisia valintoja, kuten tuttavat-ikkunan "
 "telakoinnin."
 
-#: ../pidgin/plugins/xmppconsole.c:670
 msgid "<font color='#777777'>Logged out.</font>"
 msgstr "<font color='#777777'>Kirjauduttu ulos.</font>"
 
@@ -18605,51 +13642,79 @@
 #. *< dependencies
 #. *< priority
 #. *< id
-#: ../pidgin/plugins/xmppconsole.c:749 ../pidgin/plugins/xmppconsole.c:844
-#: ../pidgin/plugins/xmppconsole.c:863
 msgid "XMPP Console"
 msgstr "XMPP-pääte"
 
-#: ../pidgin/plugins/xmppconsole.c:756
 msgid "Account: "
 msgstr "Käyttäjätili: "
 
-#: ../pidgin/plugins/xmppconsole.c:783
 msgid "<font color='#777777'>Not connected to XMPP</font>"
 msgstr "<font color='#777777'>Ei yhdistetty XMPP:hen</font>"
 
-#: ../pidgin/plugins/xmppconsole.c:793
 msgid "Insert an <iq/> stanza."
 msgstr "Lisää <iq/>-lohko."
 
-#: ../pidgin/plugins/xmppconsole.c:802
 msgid "Insert a <presence/> stanza."
 msgstr "Lisää <presence/>-lohko."
 
-#: ../pidgin/plugins/xmppconsole.c:811
 msgid "Insert a <message/> stanza."
 msgstr "Lisää <message/>-lohko."
 
 #. *< name
 #. *< version
 #. *  summary
-#: ../pidgin/plugins/xmppconsole.c:866
 msgid "Send and receive raw XMPP stanzas."
 msgstr "Lähetä ja vastaanota XMPP-raakalohkoja."
 
 #. *  description
-#: ../pidgin/plugins/xmppconsole.c:868
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr ""
 "Tätä liitännäistä voidaan käyttää XMPP-palvelimien tai -asiakasohjelmien "
 "virheenjäljitykseen."
 
+#~ msgid "Error setting socket options"
+#~ msgstr "Virhe asetettaessa pistokevalintoja"
+
+#~ msgid ""
+#~ "Windows Live ID authentication: cannot find authenticate token in server "
+#~ "response"
+#~ msgstr ""
+#~ "Windows Live ID -tunnistautuminen: palvelinvastauksesta ei löydy "
+#~ "todentamispolettia"
+
+#~ msgid "Windows Live ID authentication Failed"
+#~ msgstr "Windows Live ID -tunnistautuminen epäonnistui"
+
+#~ msgid "Too evil (sender)"
+#~ msgstr "Lähettäjä liian paha(evil)"
+
+#~ msgid "Too evil (receiver)"
+#~ msgstr "Vastaanottaja liian paha(evil)"
+
+#~ msgid "Available Message"
+#~ msgstr "Paikallaoloviesti"
+
+#~ msgid "Away Message"
+#~ msgstr "Poissaoloviesti"
+
+#~ msgid "<i>(retrieving)</i>"
+#~ msgstr "<i>(vastaanotetaan)</i>"
+
+#~ msgid "Error requesting login token"
+#~ msgstr "Virhe pyydettäessä kirjautumispolettia"
+
+#~ msgid "TCP Address"
+#~ msgstr "TCP-osoite"
+
+#~ msgid "UDP Address"
+#~ msgstr "UDP-osoite"
+
+#~ msgid "Login failed, no reply"
+#~ msgstr "Kirjautuminen epäonnistui, ei vastausta"
+
 #~ msgid "Screen name:"
 #~ msgstr "Näyttönimi:"
 
-#~ msgid "Screen Name"
-#~ msgstr "Näyttönimi"
-
 #~ msgid "Someone says your screen name in chat"
 #~ msgstr "Joku sanoo kutsumanimesi ryhmäkeskustelussa"
 
@@ -18828,9 +13893,6 @@
 #~ msgid "_Send To"
 #~ msgstr "_Lähetä käyttäjälle"
 
-#~ msgid "_Smiley"
-#~ msgstr "_Hymiö"
-
 #~ msgid "Conversation History"
 #~ msgstr "Keskusteluhistoria"
 
@@ -19149,13 +14211,6 @@
 #~ msgid "<span weight='bold' size='larger'>Welcome to "
 #~ msgstr "<span weight='bold' size='larger'>Tervetuloa "
 
-#~ msgid ""
-#~ "%s\n"
-#~ "\n"
-#~ msgstr ""
-#~ "%s\n"
-#~ "\n"
-
 #~ msgid "You are using "
 #~ msgstr "Käytät ohjelmaa: "
 
@@ -20205,9 +15260,6 @@
 #~ msgid "IRC"
 #~ msgstr "IRC"
 
-#~ msgid "Quit message"
-#~ msgstr "Poistumisviesti"
-
 #~ msgid "Basic Profile"
 #~ msgstr "Perusprofiili"
 
--- a/po/fr.po	Thu Jul 31 06:23:55 2008 +0000
+++ b/po/fr.po	Thu Aug 07 16:00:16 2008 +0000
@@ -21,8 +21,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-05-11 13:15+0200\n"
-"PO-Revision-Date: 2008-05-11 13:10+0200\n"
+"POT-Creation-Date: 2008-08-07 14:57+0200\n"
+"PO-Revision-Date: 2008-08-07 14:56+0200\n"
 "Last-Translator: Éric Boumaour <zongo_fr@users.sourceforge.net>\n"
 "Language-Team: fr <fr@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -109,6 +109,10 @@
 msgid "Alias:"
 msgstr "Alias :"
 
+#. Register checkbox
+msgid "Create this account on the server"
+msgstr "Créer ce compte sur le serveur"
+
 #. Cancel button
 #. Cancel
 msgid "Cancel"
@@ -416,6 +420,9 @@
 msgid "View Log..."
 msgstr "Voir les archives..."
 
+msgid "View All Logs"
+msgstr "Voir toutes les archives"
+
 msgid "Show"
 msgstr "Afficher"
 
@@ -615,6 +622,19 @@
 msgid "Send To"
 msgstr "Envoyer vers"
 
+msgid "Invite message"
+msgstr "Message d'invitation"
+
+msgid "Invite"
+msgstr "Inviter"
+
+msgid ""
+"Please enter the name of the user you wish to invite,\n"
+"along with an optional invite message."
+msgstr ""
+"Saisissez le nom de l'utilisateur que vous voulez inviter,\n"
+"ainsi qu'un message d'invitation facultatif."
+
 msgid "Conversation"
 msgstr "Conversation"
 
@@ -627,6 +647,9 @@
 msgid "Add Buddy Pounce..."
 msgstr "Ajouter une alerte..."
 
+msgid "Invite..."
+msgstr "Inviter..."
+
 msgid "Enable Logging"
 msgstr "Activer l'archivage"
 
@@ -636,9 +659,11 @@
 msgid "<AUTO-REPLY> "
 msgstr "<Réponse automatique> "
 
-#. Print the list of users in the room
-msgid "List of users:\n"
-msgstr "Liste des utilisateurs :\n"
+#, c-format
+msgid "List of %d user:\n"
+msgid_plural "List of %d users:\n"
+msgstr[0] "Liste de %d utilisateur :\n"
+msgstr[1] "Liste de %d utilisateurs :\n"
 
 msgid "Supported debug options are:  version"
 msgstr "Les options de débuggage supportées sont : version"
@@ -654,6 +679,20 @@
 "spécifique.\n"
 "Les commandes disponibles dans le contexte actuel sont :\n"
 
+#, c-format
+msgid ""
+"%s is not a valid message class. See '/help msgcolor' for valid message "
+"classes."
+msgstr ""
+"%s n'est pas une catégorie de messages. Consultez /help msgcolor pour "
+"connaître les catégories de messages utilisables."
+
+#, c-format
+msgid "%s is not a valid color. See '/help msgcolor' for valid colors."
+msgstr ""
+"%s n'est pas une couleur valide. Consultez /help msgcolor pour connaître les "
+"couleurs utilisables."
+
 msgid ""
 "say &lt;message&gt;:  Send a message normally as if you weren't using a "
 "command."
@@ -701,6 +740,19 @@
 msgid "statuses: Show the savedstatuses window."
 msgstr "statuses : Afficher la fenêtre des états enregistrés."
 
+msgid ""
+"msgcolor &lt;class&gt; &lt;foreground&gt; &lt;background&gt;: Set the color "
+"for different classes of messages in the conversation window.<br>    &lt;"
+"class&gt;: receive, send, highlight, action, timestamp<br>    &lt;foreground/"
+"background&gt;: black, red, green, blue, white, gray, darkgray, magenta, "
+"cyan, default<br><br>EXAMPLE:<br>    msgcolor send cyan default"
+msgstr ""
+"msgcolor &lt;catégorie&gt; &lt;texte&gt; &lt;fond&gt; : Change la couleur "
+"pour les différentes catégories de messages dans la fenêtre de conversation. "
+"<br>    &lt;catégorie&gt; : receive, send, highlight, action, timestamp."
+"<br>    &lt;texte/fond&gt; : black, red, green, blue, white, gray, darkgray, "
+"magenta, cyan, default.<br><br>Exemple :<br>    msgcolor send cyan default"
+
 msgid "Unable to open file."
 msgstr "Impossible d'ouvrir le fichier."
 
@@ -721,8 +773,10 @@
 msgstr "Pause"
 
 #, c-format
-msgid "File Transfers - %d%% of %d files"
-msgstr "Transfert - %d%% de %d fichiers."
+msgid "File Transfers - %d%% of %d file"
+msgid_plural "File Transfers - %d%% of %d files"
+msgstr[0] "Transferts - %d%% de %d fichier."
+msgstr[1] "Transferts - %d%% de %d fichiers."
 
 #. Create the window.
 msgid "File Transfers"
@@ -837,6 +891,9 @@
 msgid "Conversations with %s"
 msgstr "Conversations avec %s"
 
+msgid "All Conversations"
+msgstr "Toutes les conversations"
+
 msgid "System Log"
 msgstr "Archives des messages système"
 
@@ -874,9 +931,6 @@
 msgid "IM"
 msgstr "Message"
 
-msgid "Invite"
-msgstr "Inviter"
-
 msgid "(none)"
 msgstr "(aucun)"
 
@@ -2107,8 +2161,11 @@
 msgid "ABI version mismatch %d.%d.x (need %d.%d.x)"
 msgstr "La version de l'ABI diffère : %d.%d.x (%d.%d.x attendue)."
 
-msgid "Plugin does not implement all required functions"
-msgstr "Le plugin ne possède pas toutes les fonctions attendues."
+msgid ""
+"Plugin does not implement all required functions (list_icon, login and close)"
+msgstr ""
+"Le plugin ne possède pas toutes les fonctions attendues (list_icon, login et "
+"close)."
 
 #, c-format
 msgid ""
@@ -2192,6 +2249,9 @@
 "terminé\n"
 "(seulement quand aucune conversation n'est ouverte avec l'expéditeur)"
 
+msgid "Create a new directory for each user"
+msgstr "Créer un nouveau dossier pour chaque contact"
+
 msgid "Notes"
 msgstr "Notes"
 
@@ -2777,13 +2837,12 @@
 "activestate.com\n"
 
 msgid ""
-"The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://"
-"developer.pidgin.im/wiki/Using%20Pidgin#CanIusePidginforBonjourLink-"
-"LocalMessaging for more information."
+"The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://d."
+"pidgin.im/BonjourWindows for more information."
 msgstr ""
 "Le kit Apple Bonjour pour Windows n'a pas été trouvé. Veuillez consulter la "
-"FAQ disponible sur : http://developer.pidgin.im/wiki/Using%"
-"20Pidgin#CanIusePidginforBonjourLink-LocalMessaging pour plus d'informations."
+"FAQ disponible sur : http://d.pidgin.im/wiki/BonjourWindows pour plus "
+"d'informations."
 
 msgid "Unable to listen for incoming IM connections\n"
 msgstr "Impossible d'attendre des connexions rentrantes de messages.\n"
@@ -2840,9 +2899,6 @@
 msgid "Cannot open socket"
 msgstr "Impossible d'ouvrir la connexion."
 
-msgid "Error setting socket options"
-msgstr "Erreur à la mise en place des paramètres de la connexion."
-
 msgid "Could not bind socket to port"
 msgstr "Impossible d'affecter un port à la connexion."
 
@@ -2891,6 +2947,9 @@
 msgid "Save buddylist..."
 msgstr "Sauver la liste de contacts..."
 
+msgid "Load buddylist from file..."
+msgstr "Charger la liste de contacts depuis un fichier..."
+
 msgid "Fill in the registration fields."
 msgstr "Renseignez les rubriques d'inscription."
 
@@ -3068,9 +3127,6 @@
 msgid "Save buddylist to file..."
 msgstr "Sauver la liste de contacts dans un fichier..."
 
-msgid "Load buddylist from file..."
-msgstr "Charger la liste de contacts depuis un fichier..."
-
 #. magic
 #. major_version
 #. minor_version
@@ -3186,6 +3242,9 @@
 msgid "Encodings"
 msgstr "Codages"
 
+msgid "Auto-detect incoming UTF-8"
+msgstr "Détecter automatiquement UTF-8"
+
 msgid "Real name"
 msgstr "Nom réel"
 
@@ -3200,8 +3259,8 @@
 msgstr "Mauvais mode"
 
 #, c-format
-msgid "Ban on %s by %s, set %ld seconds ago"
-msgstr "Banni sur %s par %s, il y a %ld secondes"
+msgid "Ban on %s by %s, set %s ago"
+msgstr "Banni sur %s par %s, il y a %s"
 
 #, c-format
 msgid "Ban on %s"
@@ -3371,6 +3430,10 @@
 "away [message] : Mettre un message d'absence. Sans message, cela enlève "
 "l'état d'absence."
 
+msgid "ctcp <nick> <msg>: sends ctcp msg to nick."
+msgstr ""
+"ctcp &lt;pseudo&gt; &lt;msg&gt; : Envoyer le message msg en CTCP à pseudo."
+
 msgid "chanserv: Send a command to chanserv"
 msgstr "chanserv : Envoyer une commande au service des salons."
 
@@ -3636,6 +3699,8 @@
 msgid "Country"
 msgstr "Pays"
 
+#. lots of clients (including purple) do this, but it's
+#. * out of spec
 msgid "Telephone"
 msgstr "Téléphone"
 
@@ -3823,12 +3888,12 @@
 msgid "Capabilities"
 msgstr "Possibilités"
 
+msgid "Priority"
+msgstr "Priorité"
+
 msgid "Resource"
 msgstr "Ressource"
 
-msgid "Priority"
-msgstr "Priorité"
-
 msgid "Middle Name"
 msgstr "Deuxième prénom"
 
@@ -4525,8 +4590,8 @@
 msgstr "Erreur message XMPP"
 
 #, c-format
-msgid " (Code %s)"
-msgstr " (Code %s)"
+msgid "(Code %s)"
+msgstr "(Code %s)"
 
 msgid "XML Parse error"
 msgstr "Erreur de lecture du XML"
@@ -4551,14 +4616,14 @@
 msgstr "_Accepter les paramètres par défaut"
 
 #, c-format
+msgid "Error joining chat %s"
+msgstr "Erreur lors de l'arrivée dans la discussion %s"
+
+#, c-format
 msgid "Error in chat %s"
 msgstr "Erreur dans la discussion %s"
 
 #, c-format
-msgid "Error joining chat %s"
-msgstr "Erreur lors de l'arrivée dans la discussion %s"
-
-#, c-format
 msgid "Unable to send file to %s, user does not support file transfers"
 msgstr ""
 "Impossible d'envoyer le fichier à %s, cet utilisateur ne supporte pas le "
@@ -4878,6 +4943,9 @@
 msgid "Nudging %s..."
 msgstr "Nudge %s..."
 
+msgid "Email Address..."
+msgstr "Adresse électronique..."
+
 msgid "Your new MSN friendly name is too long."
 msgstr "Le nouvel alias MSN est trop long"
 
@@ -4912,8 +4980,22 @@
 msgid "Disallow"
 msgstr "Interdire"
 
-msgid "This Hotmail account may not be active."
-msgstr "Ce compte Hotmail ne semble pas être actif."
+#, c-format
+msgid "Blocked Text for %s"
+msgstr "Contenu bloqué pour %s"
+
+msgid "No text is blocked for this account."
+msgstr "Aucun contenu n'est bloqué pour ce compte."
+
+#, c-format
+msgid ""
+"MSN servers are currently blocking the following regular expressions:<br/>%s"
+msgstr ""
+"Les serveurs MSN censurent en ce moment les expressions "
+"rationnellessuivantes :<br/>%s"
+
+msgid "This account does not have email enabled."
+msgstr "Ce compte ne possède pas de courrier électronique actif."
 
 msgid "Send a mobile message."
 msgstr "Envoyer un message vers un téléphone portable."
@@ -4972,6 +5054,9 @@
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Autoriser les messages sur téléphones portables..."
 
+msgid "View Blocked Text..."
+msgstr "Voir le contenu bloqué..."
+
 msgid "Open Hotmail Inbox"
 msgstr "Ouvrir la boîte à lettres Hotmail"
 
@@ -5172,18 +5257,10 @@
 msgstr "nudge : donner un « Nudge » à un contact pour attirer son attention."
 
 msgid "Windows Live ID authentication:Unable to connect"
-msgstr "Authentification Windows Live ID : impossible de se connecter"
-
-#. we must have failed!
-msgid ""
-"Windows Live ID authentication: cannot find authenticate token in server "
-"response"
-msgstr ""
-"Authentification Windows Live ID : impossible de trouver le jeton "
-"d'authentification dans la réponse du serveur."
-
-msgid "Windows Live ID authentication Failed"
-msgstr "Échec de l'authentification Windows Live ID"
+msgstr "Authentification Windows Live ID : impossible de se connecter."
+
+msgid "Windows Live ID authentication:Invalid response"
+msgstr "Authentification Windows Live ID : réponse non valide."
 
 #, c-format
 msgid "%s is not a valid group."
@@ -5230,6 +5307,9 @@
 msgid "Service Temporarily Unavailable."
 msgstr "Service temporairement indisponible."
 
+msgid "Mobile message was not sent because it was too long."
+msgstr "Le message mobile n'a pas été envoyé parce qu'il est trop long."
+
 msgid "Unable to rename group"
 msgstr "Impossible de renommer le groupe"
 
@@ -5264,6 +5344,24 @@
 "\n"
 "Une fois la maintenance effectuée, vous pourrez vous reconnecter."
 
+msgid ""
+"Message was not sent because the system is unavailable. This normally "
+"happens when the user is blocked or does not exist."
+msgstr ""
+"Le message n'a pas été envoyé parce que le système n'est pas disponible. La "
+"cause probable est que l'utilisateur est bloqué ou n'existe pas."
+
+msgid "Message was not sent because messages are being sent too quickly."
+msgstr ""
+"Le message n'a pas été envoyé parce que les précédents messages ont été "
+"envoyés trop vite."
+
+msgid "Message was not sent because an unknown encoding error occurred."
+msgstr "Le message n'a pas été envoyé à cause d'une erreur de codage inconnu."
+
+msgid "Message was not sent because an unknown error occurred."
+msgstr "Le message n'a pas été envoyé à cause d'une erreur inconnue."
+
 msgid "Unable to connect"
 msgstr "Impossible de se connecter"
 
@@ -5386,6 +5484,9 @@
 msgid "The username specified is invalid."
 msgstr "Le nom d'utilisateur fourni est non valide."
 
+msgid "This Hotmail account may not be active."
+msgstr "Ce compte Hotmail ne semble pas être actif."
+
 msgid "Has you"
 msgstr "Vous êtes dans sa liste"
 
@@ -5425,8 +5526,11 @@
 msgstr "Connexion"
 
 #, c-format
-msgid "Connection to server lost (no data received within %d seconds)"
-msgstr "Connexion avec le serveur perdue (aucune donnée depuis %d secondes)."
+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] "Connexion avec le serveur perdue (aucune donnée depuis %d seconde)."
+msgstr[1] ""
+"Connexion avec le serveur perdue (aucune donnée depuis %d secondes)."
 
 #. Can't write _()'d strings in array initializers. Workaround.
 msgid "New mail messages"
@@ -5526,10 +5630,16 @@
 
 #, c-format
 msgid ""
+"%d buddy was added or updated from the server (including buddies already on "
+"the server-side list)"
+msgid_plural ""
 "%d buddies were added or updated from the server (including buddies already "
 "on the server-side list)"
-msgstr ""
-"%d contacts ont été ajouté ou mis à jour depuis le serveur (y compris les "
+msgstr[0] ""
+"%d contact a été ajouté ou mis à jour depuis le serveur (y compris les "
+"contacts déjà sur la liste du serveur)."
+msgstr[1] ""
+"%d contacts ont été ajoutés ou mis à jour depuis le serveur (y compris les "
 "contacts déjà sur la liste du serveur)."
 
 msgid "Add contacts from server"
@@ -6158,11 +6268,11 @@
 msgid "In local permit/deny"
 msgstr "Dans l'autorisation/interdiction locale"
 
-msgid "Too evil (sender)"
-msgstr "Trop méchant (envoyeur)"
-
-msgid "Too evil (receiver)"
-msgstr "Trop méchant (destinataire)"
+msgid "Warning level too high (sender)"
+msgstr "Niveau d'avertissement trop élevé (émission)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Niveau d'avertissement trop élevé (réception)"
 
 msgid "User temporarily unavailable"
 msgstr "L'utilisateur est temporairement indisponible."
@@ -6265,6 +6375,9 @@
 msgid "Camera"
 msgstr "Caméra"
 
+msgid "Screen Sharing"
+msgstr "Partage d'écran"
+
 #, c-format
 msgid "Free For Chat"
 msgstr "Libre pour discuter"
@@ -6356,7 +6469,6 @@
 "réessayez. Si vous persistez maintenant, il vous faudra attendre encore plus "
 "longtemps."
 
-#. client too old
 #, c-format
 msgid "The client version you are using is too old. Please upgrade at %s"
 msgstr ""
@@ -6403,6 +6515,7 @@
 msgid "Unable to get a valid login hash."
 msgstr "Impossible de récupérer un code de connexion valide."
 
+#. allow multple logins?
 msgid "Password sent"
 msgstr "Mot de passe envoyé"
 
@@ -6517,16 +6630,27 @@
 "Vous avez raté %hu messages de %s car le quota limite a été dépassé."
 
 #, c-format
-msgid "You missed %hu message from %s because he/she was too evil."
-msgid_plural "You missed %hu messages from %s because he/she was too evil."
-msgstr[0] "Vous avez raté %hu message de %s car l'envoyeur est trop méchant."
-msgstr[1] "Vous avez raté %hu messages de %s car l'envoyeur est trop méchant."
-
-#, c-format
-msgid "You missed %hu message from %s because you are too evil."
-msgid_plural "You missed %hu messages from %s because you are too evil."
-msgstr[0] "Vous avez raté %hu message de %s car vous êtes trop méchant."
-msgstr[1] "Vous avez raté %hu messages de %s car vous êtes trop méchant."
+msgid ""
+"You missed %hu message from %s because his/her warning level is too high."
+msgid_plural ""
+"You missed %hu messages from %s because his/her warning level is too high."
+msgstr[0] ""
+"Vous avez raté %hu message de %s car son niveau d'avertissement est trop "
+"élevé."
+msgstr[1] ""
+"Vous avez raté %hu messages de %s car son niveau d'avertissement est trop "
+"élevé."
+
+#, c-format
+msgid "You missed %hu message from %s because your warning level is too high."
+msgid_plural ""
+"You missed %hu messages from %s because your warning level is too high."
+msgstr[0] ""
+"Vous avez raté %hu message de %s car votre niveau d'avertissement est trop "
+"élevé."
+msgstr[1] ""
+"Vous avez raté %hu messages de %s car votre niveau d'avertissement est trop "
+"élevé."
 
 #, c-format
 msgid "You missed %hu message from %s for an unknown reason."
@@ -6556,9 +6680,6 @@
 msgid "Member Since"
 msgstr "Inscrit depuis"
 
-msgid "Available Message"
-msgstr "Message de disponibilité"
-
 msgid "Your AIM connection may be lost."
 msgstr "Votre connexion AIM risque d'être coupée"
 
@@ -6587,12 +6708,17 @@
 msgid "Personal Web Page"
 msgstr "Page web perso"
 
+#. aim_userinfo_t
+#. strip_html_tags
 msgid "Additional Information"
 msgstr "Informations supplémentaires"
 
 msgid "Zip Code"
 msgstr "Code postal"
 
+msgid "Work Information"
+msgstr "Informations professionnelles"
+
 msgid "Division"
 msgstr "Division"
 
@@ -6602,9 +6728,6 @@
 msgid "Web Page"
 msgstr "Page web"
 
-msgid "Work Information"
-msgstr "Informations professionnelles"
-
 msgid "Pop-Up Message"
 msgstr "Message en fenêtre"
 
@@ -6823,12 +6946,6 @@
 "Votre image instantanée n'a pas été envoyée. Vous ne pouvez pas envoyer "
 "d'images dans les discussions AIM."
 
-msgid "Away Message"
-msgstr "Message d'absence"
-
-msgid "<i>(retrieving)</i>"
-msgstr " <i>(en cours de récupération)</i>"
-
 msgid "iTunes Music Store Link"
 msgstr "Lien de l'iTunes Music Store"
 
@@ -6954,6 +7071,9 @@
 "pour le transfert de fichiers\n"
 "(plus lent, mais ne révèle pas votre adresse IP)"
 
+msgid "Allow multiple simultaneous logins"
+msgstr "Autoriser plusieurs connexions simultanées"
+
 #, c-format
 msgid "Asking %s to connect to us at %s:%hu for Direct IM."
 msgstr "Demande à %s de se connecter directement à %s:%hu pour le message"
@@ -7298,36 +7418,40 @@
 msgid "Failed to send IM."
 msgstr "Impossible d'envoyer le message."
 
-msgid "Keep alive error"
-msgstr "Erreur de Keep alive"
-
-msgid "Error requesting login token"
-msgstr "Erreur à la demande d'un token de connexion"
-
-msgid "Unable to login. Check debug log."
-msgstr ""
-"Impossible de se connecter, veuillez vérifier les messages de débuggage."
-
-msgid "Unable to login"
-msgstr "Impossible de se connecter."
-
-#. we didn't successfully connect. tdt->toc_fd is valid here
-msgid "Unable to connect."
-msgstr "Impossible de se connecter"
-
 #, c-format
 msgid "Unknown-%d"
 msgstr "Inconnu-%d"
 
-msgid "TCP Address"
-msgstr "Adresse TCP"
-
-msgid "UDP Address"
-msgstr "Adresse UDP"
-
 msgid "Level"
 msgstr "Niveau"
 
+msgid "Member"
+msgstr "Membre"
+
+msgid " VIP"
+msgstr " VIP"
+
+msgid " TCP"
+msgstr " TCP"
+
+msgid " FromMobile"
+msgstr " FromMobile"
+
+msgid " BindMobile"
+msgstr " BindMobile"
+
+msgid " Video"
+msgstr " Vidéo"
+
+msgid " Space"
+msgstr "Espace"
+
+msgid "Flag"
+msgstr "Drapeau"
+
+msgid "Ver"
+msgstr "Ver"
+
 msgid "Invalid name"
 msgstr "Nom d'utilisateur non valide"
 
@@ -7340,12 +7464,16 @@
 msgstr "<b>Dernière mise à jour :</b> %s<br>\n"
 
 #, c-format
+msgid "<b>Server</b>: %s: %d<br>\n"
+msgstr "<b>Serveur :</b> %s: %d<br>\n"
+
+#, c-format
 msgid "<b>Connection Mode</b>: %s<br>\n"
 msgstr "<b>Type de connexion :</b> %s<br>\n"
 
 #, c-format
-msgid "<b>Server IP</b>: %s: %d<br>\n"
-msgstr "<b>Adresse IP du serveur :</b> %s: %d<br>\n"
+msgid "<b>Real hostname</b>: %s: %d<br>\n"
+msgstr "<b>Hôte réel :</b> %s: %d<br>\n"
 
 #, c-format
 msgid "<b>My Public IP</b>: %s<br>\n"
@@ -7397,12 +7525,73 @@
 msgid "Connect using TCP"
 msgstr "Connexion par TCP"
 
+msgid "resend interval(s)"
+msgstr "Délai(s) de réenvoi"
+
+msgid "Keep alive interval(s)"
+msgstr "Délai(s) de Keep alive"
+
+msgid "Update interval(s)"
+msgstr "Délai(s) de mise à jour"
+
+#, c-format
+msgid "Invalid token len, %d"
+msgstr "Taille de token non valide : %d"
+
+msgid "Keep alive error"
+msgstr "Erreur de Keep alive"
+
+msgid "Failed to connect server"
+msgstr "Impossible de se connecter au serveur."
+
 msgid "Socket error"
 msgstr "Erreur de socket."
 
+#, c-format
+msgid ""
+"Lost connection with server:\n"
+"%d, %s"
+msgstr ""
+"Connexion perdue avec le serveur :\n"
+"%d, %s"
+
 msgid "Unable to read from socket"
 msgstr "Impossible de lire le socket."
 
+msgid "Write Error"
+msgstr "Erreur d'écriture"
+
+msgid "Connection lost"
+msgstr "Connexion perdue."
+
+msgid "Couldn't resolve host"
+msgstr "Impossible de trouver l'adresse de l'hôte."
+
+msgid "hostname is NULL or port is 0"
+msgstr ""
+
+#, c-format
+msgid "Connecting server %s, retries %d"
+msgstr "Connexion au serveur %s, tentatives %d"
+
+#. we didn't successfully connect. tdt->toc_fd is valid here
+msgid "Unable to connect."
+msgstr "Impossible de se connecter"
+
+msgid "Could not resolve hostname"
+msgstr "Impossible de résoudre le nom de l'hôte."
+
+msgid "Unable to login. Check debug log."
+msgstr ""
+"Impossible de se connecter, veuillez vérifier les messages de débuggage."
+
+msgid "Unable to login"
+msgstr "Impossible de se connecter."
+
+#, c-format
+msgid "Invalid token reply code, 0x%02X"
+msgstr "Code du token de réponse non valide : 0x%02X"
+
 #, c-format
 msgid "%d has declined the file %s"
 msgstr "%d a refusé le fichier %s"
@@ -7414,12 +7603,6 @@
 msgid "%d canceled the transfer of %s"
 msgstr "%d a annulé le transfert de %s"
 
-msgid "Connection lost"
-msgstr "Connexion perdue."
-
-msgid "Login failed, no reply"
-msgstr "Échec à la connexion, aucune réponse."
-
 msgid "Do you want to add this buddy?"
 msgstr "Voulez-vous ajouter ce contact à votre liste ?"
 
@@ -7456,6 +7639,14 @@
 msgid "%s is not in your buddy list"
 msgstr "L'utilisateur %s n'est pas dans votre liste de contacts."
 
+#, c-format
+msgid "Notice from: %s"
+msgstr "Annonce de : %s"
+
+#, c-format
+msgid "%s"
+msgstr "%s"
+
 msgid "Connection closed (writing)"
 msgstr "Connexion terminée (en écriture)"
 
@@ -8465,6 +8656,10 @@
 msgid "Error loading SILC key pair"
 msgstr "Erreur de chargement de la paire de clés SILC"
 
+#, c-format
+msgid "Download %s: %s"
+msgstr "Téléchargement de %s : %s"
+
 msgid "Your Current Mood"
 msgstr "Votre humeur actuelle"
 
@@ -8917,12 +9112,6 @@
 msgid "Could not create listen socket"
 msgstr "Impossible de créer le socket d'écoute."
 
-msgid "Couldn't resolve host"
-msgstr "Impossible de trouver l'adresse de l'hôte."
-
-msgid "Could not resolve hostname"
-msgstr "Impossible de résoudre le nom de l'hôte."
-
 msgid "SIP usernames may not contain whitespaces or @ symbols"
 msgstr ""
 "Les noms d'utilisateur SIP ne peuvent pas avoir d'espace ou de symbole @."
@@ -9382,9 +9571,6 @@
 msgid "%s is trying to send you a group of %d files.\n"
 msgstr "%s essaie de vous envoyer un groupe de %d fichiers.\n"
 
-msgid "Write Error"
-msgstr "Erreur d'écriture"
-
 msgid "Yahoo! Japan Profile"
 msgstr "Profil Yahoo! Japon"
 
@@ -9686,6 +9872,14 @@
 msgid "Could not resolve host name"
 msgstr "Impossible de résoudre le nom de l'hôte."
 
+#, c-format
+msgid "Requesting %s's attention..."
+msgstr "Attire l'attention de %s..."
+
+#, c-format
+msgid "%s has requested your attention!"
+msgstr "%s essaie d'attirer votre attention !"
+
 #. *
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
 #.
@@ -9715,14 +9909,6 @@
 msgstr "%s est désormais connu sous le nom de %s\n"
 
 #, c-format
-msgid "Requesting %s's attention..."
-msgstr "Attire l'attention de %s..."
-
-#, c-format
-msgid "%s has requested your attention!"
-msgstr "%s essaie d'attirer votre attention !"
-
-#, c-format
 msgid ""
 "%s has invited %s to the chat room %s:\n"
 "%s"
@@ -9737,6 +9923,20 @@
 msgid "Accept chat invitation?"
 msgstr "Accepter l'invitation à la discussion ?"
 
+#. Shortcut
+msgid "Shortcut"
+msgstr "Raccourci"
+
+msgid "The text-shortcut for the smiley"
+msgstr "Le texte-accourci pour la frimousse"
+
+#. Stored Image
+msgid "Stored Image"
+msgstr "Image stockée"
+
+msgid "Stored Image. (that'll have to do for now)"
+msgstr "Image stockée. (ça sera bien suffisant pour l'instant)"
+
 msgid "SSL Connection Failed"
 msgstr "Échec de la connexion SSL"
 
@@ -9906,6 +10106,11 @@
 msgid "Connection refused."
 msgstr "Connexion refusée."
 
+#. 10048
+#, c-format
+msgid "Address already in use."
+msgstr "Cette adresse est déjà utilisée."
+
 msgid "Internet Messenger"
 msgstr "Messagerie internet"
 
@@ -10013,8 +10218,8 @@
 msgid "_Basic"
 msgstr "_Essentiel"
 
-msgid "Create this new account on the server"
-msgstr "Créer ce nouveau compte sur le serveur"
+msgid "Create _this new account on the server"
+msgstr "Créer ce _nouveau compte sur le serveur"
 
 msgid "_Advanced"
 msgstr "_Avancé"
@@ -10117,6 +10322,12 @@
 msgid "_Remove"
 msgstr "_Supprimer"
 
+msgid "Set Custom Icon"
+msgstr "Changer l'icône"
+
+msgid "Remove Custom Icon"
+msgstr "Supprimer l'icône"
+
 msgid "Add _Buddy..."
 msgstr "Ajouter un _contact..."
 
@@ -10214,8 +10425,8 @@
 msgid "/_Accounts"
 msgstr "/C_omptes"
 
-msgid "/Accounts/Manage"
-msgstr "/Comptes/Gérer"
+msgid "/Accounts/Manage Accounts"
+msgstr "/Comptes/Gérer les comptes"
 
 #. Tools
 msgid "/_Tools"
@@ -10236,6 +10447,9 @@
 msgid "/Tools/Pr_ivacy"
 msgstr "/Outils/_Filtres"
 
+msgid "/Tools/Smile_y"
+msgstr "/Outils/Frim_ousses"
+
 msgid "/Tools/_File Transfers"
 msgstr "/Outils/_Transferts de fichier"
 
@@ -10402,15 +10616,15 @@
 "<span weight='bold' size='larger'>Welcome to %s!</span>\n"
 "\n"
 "You have no accounts enabled. Enable your IM accounts from the <b>Accounts</"
-"b> window at <b>Accounts->Manage</b>. Once you enable accounts, you'll be "
-"able to sign on, set your status, and talk to your friends."
+"b> window at <b>Accounts->Manage Accounts</b>. Once you enable accounts, "
+"you'll be able to sign on, set your status, and talk to your friends."
 msgstr ""
 "<span weight='bold' size='larger'>Bienvenue dans %s !</span>\n"
 "\n"
 "Vous n'avez aucun compte actif. Activez vos comptes de messagerie depuis la "
-"fenêtre <b>Comptes</b> dans le menu <b>Comptes->Gérer</b>. Une fois les "
-"comptes activés, vous pourrez vous connecter, changer votre état et discuter "
-"avec vos contacts."
+"fenêtre <b>Comptes</b> dans le menu <b>Comptes->Gérer les comptes</b>. Une "
+"fois les comptes activés, vous pourrez vous connecter, changer votre état et "
+"discuter avec vos contacts."
 
 #. set the Show Offline Buddies option. must be done
 #. * after the treeview or faceprint gets mad. -Robot101
@@ -10471,6 +10685,12 @@
 msgid "Please enter the name of the group to be added."
 msgstr "Saisissez le nom du groupe à ajouter"
 
+msgid "Enable Account"
+msgstr "Activer un compte"
+
+msgid "<PurpleMain>/Accounts/Enable Account"
+msgstr "<PurpleMain>/Comptes/Activer un compte"
+
 msgid "<PurpleMain>/Accounts/"
 msgstr "<PurpleMain>/Comptes/"
 
@@ -10483,12 +10703,6 @@
 msgid "_Disable"
 msgstr "_Désactiver"
 
-msgid "Enable Account"
-msgstr "Activer un compte"
-
-msgid "<PurpleMain>/Accounts/Enable Account"
-msgstr "<PurpleMain>/Comptes/Activer un compte"
-
 msgid "/Tools"
 msgstr "/Outils"
 
@@ -10573,9 +10787,6 @@
 msgid "Change Size"
 msgstr "Changer la taille"
 
-msgid "Remove Custom Icon"
-msgstr "Supprimer l'icône"
-
 msgid "Show All"
 msgstr "Tout afficher"
 
@@ -10844,12 +11055,13 @@
 msgid "Fatal Error"
 msgstr "Erreur critique"
 
-msgid "lead developer"
-msgstr "codeur principal"
-
 msgid "developer"
 msgstr "codeur"
 
+#. feel free to not translate this
+msgid "Ka-Hing Cheung"
+msgstr ""
+
 msgid "support"
 msgstr "support"
 
@@ -10881,6 +11093,9 @@
 msgid "original author"
 msgstr "auteur original"
 
+msgid "lead developer"
+msgstr "codeur principal"
+
 msgid "Afrikaans"
 msgstr "Afrikaans"
 
@@ -11016,6 +11231,9 @@
 msgid "Norwegian Nynorsk"
 msgstr "Norvégien (nynorsk)"
 
+msgid "Occitan"
+msgstr "Occitan"
+
 msgid "Punjabi"
 msgstr "Panjâbî"
 
@@ -11256,23 +11474,35 @@
 msgid "Right-click for more unread messages...\n"
 msgstr "Clic droit pour plus de messages non lus...\n"
 
-msgid "Change Status"
-msgstr "Changer d'état"
-
-msgid "Show Buddy List"
-msgstr "Afficher la liste de contacts"
-
-msgid "New Message..."
-msgstr "Nouveau message..."
-
-msgid "Mute Sounds"
-msgstr "Silencieux"
-
-msgid "Blink on New Message"
-msgstr "Clignoter sur un nouveau message"
-
-msgid "Quit"
-msgstr "Quitter"
+msgid "_Change Status"
+msgstr "_Changer d'état"
+
+msgid "Show Buddy _List"
+msgstr "Afficher la _liste de contacts"
+
+msgid "_Unread Messages"
+msgstr "Messages _non lus"
+
+msgid "New _Message..."
+msgstr "Nouveau _message..."
+
+msgid "_Accounts"
+msgstr "C_omptes"
+
+msgid "Plu_gins"
+msgstr "Plug_ins"
+
+msgid "Pr_eferences"
+msgstr "_Préférences"
+
+msgid "Mute _Sounds"
+msgstr "_Silencieux"
+
+msgid "_Blink on New Message"
+msgstr "Cli_gnoter sur un nouveau message"
+
+msgid "_Quit"
+msgstr "_Quitter"
 
 msgid "Not started"
 msgstr "Pas commencé"
@@ -11363,29 +11593,35 @@
 "Couleur pour afficher les liens hypertextes quand la souris les survole."
 
 msgid "Sent Message Name Color"
-msgstr "Couleur du nom pour les messages envoyés"
+msgstr "Nom de la couleur pour les messages envoyés"
 
 msgid "Color to draw the name of a message you sent."
 msgstr "Couleur pour afficher le nom dans les messages que vous envoyez."
 
 msgid "Received Message Name Color"
-msgstr "Couleur du nom pour les messages reçus"
+msgstr "Nom de la couleur pour les messages reçus"
 
 msgid "Color to draw the name of a message you received."
 msgstr "Couleur pour afficher le nom de votre interlocuteur."
 
 msgid "\"Attention\" Name Color"
-msgstr "Couleur du nom en surbrillance"
+msgstr "Nom de la couleur des messages en surbrillance"
 
 msgid "Color to draw the name of a message you received containing your name."
 msgstr "Couleur pour afficher les messages reçus qui contiennent votre nom."
 
 msgid "Action Message Name Color"
-msgstr "Couleur du nom des message d'action"
+msgstr "Nom de la couleur des messages d'action"
 
 msgid "Color to draw the name of an action message."
 msgstr "Couleur pour afficher le nom pour les messages d'action."
 
+msgid "Action Message Name Color for Whispered Message"
+msgstr "Nom de la couleur des messages chuchotés."
+
+msgid "Whisper Message Name Color"
+msgstr "Nom de la couleur pour les messages envoyés"
+
 msgid "Typing notification color"
 msgstr "Couleur de la notification de saisie"
 
@@ -11458,6 +11694,10 @@
 msgid "_Save Image..."
 msgstr "Enregi_strer l'image..."
 
+#, c-format
+msgid "_Add Custom Smiley..."
+msgstr "_Ajouter une frimousse personnalisée..."
+
 msgid "Select Font"
 msgstr "Changer la police"
 
@@ -11496,9 +11736,21 @@
 msgid "Insert Image"
 msgstr "Insérer une image"
 
+#, c-format
+msgid ""
+"This smiley is disabled because a custom smiley exists for this shortcut:\n"
+" %s"
+msgstr ""
+"Cette frimousse est désactivée parce qu'une frimousse personnalisée existe "
+"pour ce raccourci :\n"
+" %s"
+
 msgid "Smile!"
 msgstr "Souriez !"
 
+msgid "_Manage custom smileys"
+msgstr "_Gérer les frimousses personnalisées"
+
 msgid "This theme has no available smileys."
 msgstr "Ce thème n'a pas de frimousses."
 
@@ -12227,6 +12479,12 @@
 msgid "Play"
 msgstr "Jouer"
 
+msgid "_Browse..."
+msgstr "_Naviguer..."
+
+msgid "_Reset"
+msgstr "Remise à _zéro"
+
 msgid "_Report idle time:"
 msgstr "_Rapporter le temps d'inactivité :"
 
@@ -12396,6 +12654,47 @@
 msgid "Status for %s"
 msgstr "État pour %s"
 
+msgid "Custom Smiley"
+msgstr "Frimousse personnalisée"
+
+msgid "Duplicate Shortcut"
+msgstr "Raccourci en double"
+
+msgid ""
+"A custom smiley for the selected shortcut already exists. Please specify a "
+"different shortcut."
+msgstr ""
+"Une frimousse spécialisée pour ce raccourci existe déjà. Veuillez choisir un "
+"autre raccourci."
+
+msgid "More Data needed"
+msgstr "Données insuffisantes"
+
+msgid "Please provide a shortcut to associate with the smiley."
+msgstr "Veuillez fournir un raccourci correspondant à cette frimousse."
+
+msgid "Please select an image for the smiley."
+msgstr "Veuillez choisir une image pour cette frimousse."
+
+msgid "Edit Smiley"
+msgstr "Modifier la frimousse"
+
+msgid "Add Smiley"
+msgstr "Ajouter la frimousse"
+
+msgid "Smiley _Image"
+msgstr "_Image de la frimousse"
+
+#. Smiley shortcut
+msgid "Smiley S_hortcut"
+msgstr "_Raccourci de la frimousse"
+
+msgid "Smiley"
+msgstr "Frimousse"
+
+msgid "Custom Smiley Manager"
+msgstr "Gestionnaire de frimousses personnalisée"
+
 msgid "Waiting for network connection"
 msgstr "En attente de connexion réseau."
 
@@ -13118,7 +13417,7 @@
 msgstr "Couleur des liens hypertextes"
 
 msgid "Highlighted Message Name Color"
-msgstr "Couleur du nom des messages en surbrillance"
+msgstr "Nom de la couleur des messages en surbrillance"
 
 msgid "GtkTreeView Horizontal Separation"
 msgstr "Séparation horizontale GtkTreeView"
@@ -13534,12 +13833,49 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr "Ce plugin est utile pour débugger les clients ou serveurs XMPP."
 
+#~ msgid "Error setting socket options"
+#~ msgstr "Erreur à la mise en place des paramètres de la connexion."
+
+#~ msgid ""
+#~ "Windows Live ID authentication: cannot find authenticate token in server "
+#~ "response"
+#~ msgstr ""
+#~ "Authentification Windows Live ID : impossible de trouver le jeton "
+#~ "d'authentification dans la réponse du serveur."
+
+#~ msgid "Windows Live ID authentication Failed"
+#~ msgstr "Échec de l'authentification Windows Live ID"
+
+#~ msgid "Too evil (sender)"
+#~ msgstr "Trop méchant (envoyeur)"
+
+#~ msgid "Too evil (receiver)"
+#~ msgstr "Trop méchant (destinataire)"
+
+#~ msgid "Available Message"
+#~ msgstr "Message de disponibilité"
+
+#~ msgid "Away Message"
+#~ msgstr "Message d'absence"
+
+#~ msgid "<i>(retrieving)</i>"
+#~ msgstr " <i>(en cours de récupération)</i>"
+
+#~ msgid "Error requesting login token"
+#~ msgstr "Erreur à la demande d'un token de connexion"
+
+#~ msgid "TCP Address"
+#~ msgstr "Adresse TCP"
+
+#~ msgid "UDP Address"
+#~ msgstr "Adresse UDP"
+
+#~ msgid "Login failed, no reply"
+#~ msgstr "Échec à la connexion, aucune réponse."
+
 #~ msgid "Screen name:"
 #~ msgstr "Nom d'utilisateur :"
 
-#~ msgid "Screen Name"
-#~ msgstr "Nom d'utilisateur"
-
 #~ msgid "Someone says your screen name in chat"
 #~ msgstr "Quelqu'un dit votre nom d'utilisateur dans la discussion"