]> git.0d.be Git - empathy.git/commitdiff
Merge remote-tracking branch 'glassrose/save-chatrooms.xml-only-when-needed'
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Mon, 9 May 2011 14:21:38 +0000 (16:21 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Mon, 9 May 2011 14:21:38 +0000 (16:21 +0200)
52 files changed:
configure.ac
data/Template.html
data/org.gnome.Empathy.gschema.xml.in
libempathy-gtk/empathy-account-widget.c
libempathy-gtk/empathy-chat.c
libempathy-gtk/empathy-chat.h
libempathy-gtk/empathy-contact-blocking-dialog.c
libempathy-gtk/empathy-contact-search-dialog.c
libempathy-gtk/empathy-contact-selector-dialog.c
libempathy-gtk/empathy-contact-selector.c
libempathy-gtk/empathy-contact-widget.c
libempathy-gtk/empathy-images.h
libempathy-gtk/empathy-individual-menu.c
libempathy-gtk/empathy-individual-menu.h
libempathy-gtk/empathy-individual-store.c
libempathy-gtk/empathy-individual-view.c
libempathy-gtk/empathy-location-manager.c
libempathy-gtk/empathy-new-message-dialog.c
libempathy-gtk/empathy-theme-adium.c
libempathy-gtk/empathy-theme-adium.h
libempathy-gtk/empathy-theme-manager.c
libempathy/empathy-contact.c
libempathy/empathy-contact.h
libempathy/empathy-request-util.c
libempathy/empathy-request-util.h
libempathy/empathy-tp-chat.c
libempathy/empathy-tp-chat.h
libempathy/empathy-utils.c
libempathy/empathy-utils.h
po/POTFILES.in
po/es.po
po/gl.po
po/he.po
po/nb.po
po/tr.po
src/empathy-accounts-dialog.c
src/empathy-auth-client.c
src/empathy-chat-manager.c
src/empathy-chat-manager.h
src/empathy-chat-window.c
src/empathy-chat-window.h
src/empathy-chat.c
src/empathy-event-manager.c
src/empathy-ft-manager.c
src/empathy-main-window.c
src/empathy-main-window.ui
src/empathy-new-chatroom-dialog.c
src/empathy-notifications-approver.c
src/empathy-preferences.c
src/empathy-preferences.ui
src/ev-sidebar.c
tests/interactive/contact-manager.c

index 91bd284eb9a37e145a50e963d41dd46d620aa5f4..122af941b6b4c56e819e37627e2e99fedc47c447 100644 (file)
@@ -32,7 +32,7 @@ AC_COPYRIGHT([
 
 # Hardp deps
 FOLKS_REQUIRED=0.4.0
-GLIB_REQUIRED=2.27.2
+GLIB_REQUIRED=2.28.0
 GNUTLS_REQUIRED=2.8.5
 GTK_REQUIRED=3.0.2
 KEYRING_REQUIRED=2.26.0
@@ -40,7 +40,7 @@ GCR_REQUIRED=2.91.4
 LIBCANBERRA_GTK_REQUIRED=0.25
 LIBNOTIFY_REQUIRED=0.7.0
 TELEPATHY_FARSIGHT_REQUIRED=0.0.14
-TELEPATHY_GLIB_REQUIRED=0.14.1
+TELEPATHY_GLIB_REQUIRED=0.14.3
 TELEPATHY_LOGGER=0.2.0
 
 # Optional deps
index 708e85bdb75e527b2358b5539aa0a7898175e29d..79224b8de5b41c36c7815ce70faa86e07ce96d01 100644 (file)
 <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <base href="%@">
-       <script type="text/ecmascript" defer="defer">
-       
-               //Appending new content to the message view
-               function appendMessage(html) {
-                       shouldScroll = nearBottom();
+       <script type="text/javascript" defer="defer">
+               // NOTE:
+               // Any percent signs in this file must be escaped!
+               // Use two escape signs (%%) to display it, this is passed through a format call!
                
-                       //Remove any existing insertion point
-                       insert = document.getElementById("insert");
-                       if(insert) insert.parentNode.removeChild(insert);
+               function appendHTML(html) {
+                       var node = document.getElementById("Chat");
+                       var range = document.createRange();
+                       range.selectNode(node);
+                       var documentFragment = range.createContextualFragment(html);
+                       node.appendChild(documentFragment);
+               }
+               
+               // a coalesced HTML object buffers and outputs DOM objects en masse.
+               // saves A LOT of CSS recalculation time when loading many messages.
+               // (ex. a long twitter timeline)
+               function CoalescedHTML() {
+                       var self = this;
+                       this.fragment = document.createDocumentFragment();
+                       this.timeoutID = 0;
+                       this.coalesceRounds = 0;
+                       this.isCoalescing = false;
+                       this.isConsecutive = undefined;
+                       this.shouldScroll = undefined;
+                       
+                       var appendElement = function (elem) {
+                               document.getElementById("Chat").appendChild(elem);
+                       };
+                       
+                       function outputHTML() {
+                               var insert = document.getElementById("insert");
+                               if(!!insert && self.isConsecutive) {
+                                       insert.parentNode.replaceChild(self.fragment, insert);
+                               } else {
+                                       if(insert)
+                                               insert.parentNode.removeChild(insert);
+                                       // insert the documentFragment into the live DOM
+                                       appendElement(self.fragment);
+                               }
+                               alignChat(self.shouldScroll);
+                               
+                               // reset state to empty/non-coalescing
+                               self.shouldScroll = undefined;
+                               self.isConsecutive = undefined;
+                               self.isCoalescing = false;
+                               self.coalesceRounds = 0;
+                       }
+                       
+                       // creates and returns a new documentFragment, containing all content nodes
+                       // which can be inserted as a single node.
+                       function createHTMLNode(html) {
+                               var range = document.createRange();
+                               range.selectNode(document.getElementById("Chat"));
+                               return range.createContextualFragment(html);
+                       }
+                       
+                       // removes first insert node from the internal fragment.
+                       function rmInsertNode() {
+                               var insert = self.fragment.querySelector("#insert");
+                               if(insert)
+                                       insert.parentNode.removeChild(insert);
+                       }
+                       
+                       function setShouldScroll(flag) {
+                               if(flag && undefined === self.shouldScroll)
+                                       self.shouldScroll = flag;
+                       }
+                       
+                       // hook in a custom method to append new data
+                       // to the chat.
+                       this.setAppendElementMethod = function (func) {
+                               if(typeof func === 'function')
+                                       appendElement = func;
+                       }
+                                               
+                       // (re)start the coalescing timer.
+                       //   we wait 25ms for a new message to come in.
+                       //   If we get one, restart the timer and wait another 10ms.
+                       //   If not, run outputHTML()
+                       //  We do this a maximum of 400 times, for 10s max that can be spent
+                       //  coalescing input, since this will block display.
+                       this.coalesce = function() {
+                               window.clearTimeout(self.timeoutID);
+                               self.timeoutID = window.setTimeout(outputHTML, 25);
+                               self.isCoalescing = true;
+                               self.coalesceRounds += 1;
+                               if(400 < self.coalesceRounds)
+                                       self.cancel();
+                       }
+                       
+                       // if we need to append content into an insertion div,
+                       // we need to clear the buffer and cancel the timeout.
+                       this.cancel = function() {
+                               if(self.isCoalescing) {
+                                       window.clearTimeout(self.timeoutID);
+                                       outputHTML();
+                               }
+                       }
+                       
+                       
+                       // coalased analogs to the global functions
+                       
+                       this.append = function(html, shouldScroll) {
+                               // if we started this fragment with a consecuative message,
+                               // cancel and output before we continue
+                               if(self.isConsecutive) {
+                                       self.cancel();
+                               }
+                               self.isConsecutive = false;
+                               rmInsertNode();
+                               var node = createHTMLNode(html);
+                               self.fragment.appendChild(node);
+                               
+                               node = null;
 
-                       //Append the new message to the bottom of our chat block
-                       chat = document.getElementById("Chat");
-                       range = document.createRange();
-                       range.selectNode(chat);
-                       documentFragment = range.createContextualFragment(html);
-                       chat.appendChild(documentFragment);
+                               setShouldScroll(shouldScroll);
+                               self.coalesce();
+                       }
                        
-                       alignChat(shouldScroll);
+                       this.appendNext = function(html, shouldScroll) {
+                               if(undefined === self.isConsecutive)
+                                       self.isConsecutive = true;
+                               var node = createHTMLNode(html);
+                               var insert = self.fragment.querySelector("#insert");
+                               if(insert) {
+                                       insert.parentNode.replaceChild(node, insert);
+                               } else {
+                                       self.fragment.appendChild(node);
+                               }
+                               node = null;
+                               setShouldScroll(shouldScroll);
+                               self.coalesce();
+                       }
+                       
+                       this.replaceLast = function (html, shouldScroll) {
+                               rmInsertNode();
+                               var node = createHTMLNode(html);
+                               var lastMessage = self.fragment.lastChild;
+                               lastMessage.parentNode.replaceChild(node, lastMessage);
+                               node = null;
+                               setShouldScroll(shouldScroll);
+                       }
                }
-               function appendMessageNoScroll(html) {
-                       //Remove any existing insertion point
-                       insert = document.getElementById("insert");
-                       if(insert) insert.parentNode.removeChild(insert);
+               var coalescedHTML;
 
-                       //Append the new message to the bottom of our chat block
-                       chat = document.getElementById("Chat");
-                       range = document.createRange();
-                       range.selectNode(chat);
-                       documentFragment = range.createContextualFragment(html);
-                       chat.appendChild(documentFragment);
+               //Appending new content to the message view
+               function appendMessage(html) {
+                       var shouldScroll;
+                       
+                       // Only call nearBottom() if should scroll is undefined.
+                       if(undefined === coalescedHTML.shouldScroll) {
+                               shouldScroll = nearBottom();
+                       } else {
+                               shouldScroll = coalescedHTML.shouldScroll;
+                       }
+                       appendMessageNoScroll(html, shouldScroll);
                }
-               function appendNextMessage(html){
-                       shouldScroll = nearBottom();
-
-                       //Locate the insertion point
-                       insert = document.getElementById("insert");
                
-                       //make new node
-                       range = document.createRange();
-                       range.selectNode(insert.parentNode);
-                       newNode = range.createContextualFragment(html);
-
-                       //swap
-                       insert.parentNode.replaceChild(newNode,insert);
-                       
-                       alignChat(shouldScroll);
+               function appendMessageNoScroll(html, shouldScroll) {                    
+                       shouldScroll = shouldScroll || false;
+                       // always try to coalesce new, non-griuped, messages
+                       coalescedHTML.append(html, shouldScroll)
                }
-               function appendNextMessageNoScroll(html){
-                       //Locate the insertion point
-                       insert = document.getElementById("insert");
                
-                       //make new node
-                       range = document.createRange();
-                       range.selectNode(insert.parentNode);
-                       newNode = range.createContextualFragment(html);
-
-                       //swap
-                       insert.parentNode.replaceChild(newNode,insert);
+               function appendNextMessage(html){
+                       var shouldScroll;
+                       if(undefined === coalescedHTML.shouldScroll) {
+                               shouldScroll = nearBottom();
+                       } else {
+                               shouldScroll = coalescedHTML.shouldScroll;
+                       }
+                       appendNextMessageNoScroll(html, shouldScroll);
                }
                
+               function appendNextMessageNoScroll(html, shouldScroll){
+                       shouldScroll = shouldScroll || false;
+                       // only group next messages if we're already coalescing input
+                       coalescedHTML.appendNext(html, shouldScroll);
+               }
+
+               function replaceLastMessage(html){
+                       var shouldScroll;
+                       // only replace messages if we're already coalescing
+                       if(coalescedHTML.isCoalescing){
+                               if(undefined === coalescedHTML.shouldScroll) {
+                                       shouldScroll = nearBottom();
+                               } else {
+                                       shouldScroll = coalescedHTML.shouldScroll;
+                               }
+                               coalescedHTML.replaceLast(html, shouldScroll);
+                       } else {
+                               shouldScroll = nearBottom();
+                               //Retrieve the current insertion point, then remove it
+                               //This requires that there have been an insertion point... is there a better way to retrieve the last element? -evands
+                               var insert = document.getElementById("insert");
+                               if(insert){
+                                       var parentNode = insert.parentNode;
+                                       parentNode.removeChild(insert);
+                                       var lastMessage = document.getElementById("Chat").lastChild;
+                                       document.getElementById("Chat").removeChild(lastMessage);
+                               }
+
+                               //Now append the message itself
+                               appendHTML(html);
+
+                               alignChat(shouldScroll);
+                       }
+               }
+
                //Auto-scroll to bottom.  Use nearBottom to determine if a scrollToBottom is desired.
                function nearBottom() {
                        return ( document.body.scrollTop >= ( document.body.offsetHeight - ( window.innerHeight * 1.2 ) ) );
 
                //Dynamically exchange the active stylesheet
                function setStylesheet( id, url ) {
-                       code = "<style id=\"" + id + "\" type=\"text/css\" media=\"screen,print\">";
-                       if( url.length ) code += "@import url( \"" + url + "\" );";
+                       var code = "<style id=\"" + id + "\" type=\"text/css\" media=\"screen,print\">";
+                       if( url.length ) 
+                               code += "@import url( \"" + url + "\" );";
                        code += "</style>";
-                       range = document.createRange();
-                       head = document.getElementsByTagName( "head" ).item(0);
+                       var range = document.createRange();
+                       var head = document.getElementsByTagName( "head" ).item(0);
                        range.selectNode( head );
-                       documentFragment = range.createContextualFragment( code );
+                       var documentFragment = range.createContextualFragment( code );
                        head.removeChild( document.getElementById( id ) );
                        head.appendChild( documentFragment );
                }
+
+               /* Converts emoticon images to textual emoticons; all emoticons in message if alt is held */
+               document.onclick = function imageCheck() {
+                       var node = event.target;
+                       if (node.tagName.toLowerCase() != 'img')
+                               return;
+                               
+                       imageSwap(node, false);
+               }
                
-               //Swap an image with its alt-tag text on click, or expand/unexpand an attached image
-               document.onclick = imageCheck;
-               function imageCheck() {         
-                       node = event.target;
-                       if(node.tagName == 'IMG' && !client.zoomImage(node) && node.alt) {
-                               a = document.createElement('a');
-                               a.setAttribute('onclick', 'imageSwap(this)');
-                               a.setAttribute('src', node.getAttribute('src'));
-                               a.className = node.className;
-                               text = document.createTextNode(node.alt);
-                               a.appendChild(text);
-                               node.parentNode.replaceChild(a, node);
+               /* Converts textual emoticons to images if textToImagesFlag is true, otherwise vice versa */
+               function imageSwap(node, textToImagesFlag) {
+                       var shouldScroll = nearBottom();
+                       
+                       var images = [node];
+                       if (event.altKey) {
+                               while (node.id != "Chat" && node.parentNode.id != "Chat")
+                                       node = node.parentNode;
+                               images = node.querySelectorAll(textToImagesFlag ? "a" : "img");
+                       }
+                       
+                       for (var i = 0; i < images.length; i++) {
+                               textToImagesFlag ? textToImage(images[i]) : imageToText(images[i]);
                        }
+                       
+                       alignChat(shouldScroll);
                }
 
-               function imageSwap(node) {
-                       shouldScroll = nearBottom();
-
+               function textToImage(node) {
+                       if (!node.getAttribute("isEmoticon"))
+                               return;
                        //Swap the image/text
-                       img = document.createElement('img');
+                       var img = document.createElement('img');
                        img.setAttribute('src', node.getAttribute('src'));
                        img.setAttribute('alt', node.firstChild.nodeValue);
                        img.className = node.className;
                        node.parentNode.replaceChild(img, node);
-                       
-                       alignChat(shouldScroll);
+               }
+               
+               function imageToText(node)
+               {
+                       if (client.zoomImage(node) || !node.alt)
+                               return;
+                       var a = document.createElement('a');
+                       a.setAttribute('onclick', 'imageSwap(this, true)');
+                       a.setAttribute('src', node.getAttribute('src'));
+                       a.setAttribute('isEmoticon', true);
+                       a.className = node.className;
+                       var text = document.createTextNode(node.alt);
+                       a.appendChild(text);
+                       node.parentNode.replaceChild(a, node);
                }
                
                //Align our chat to the bottom of the window.  If true is passed, view will also be scrolled down
                function alignChat(shouldScroll) {
                        var windowHeight = window.innerHeight;
-                       
+
                        if (windowHeight > 0) {
                                var contentElement = document.getElementById('Chat');
                                var contentHeight = contentElement.offsetHeight;
                                        contentElement.style.position = 'static';
                                }
                        }
-                       
+
                        if (shouldScroll) scrollToBottom();
                }
-               
-               function windowDidResize(){
+
+               window.onresize = function windowDidResize(){
                        alignChat(true/*nearBottom()*/); //nearBottom buggy with inactive tabs
                }
                
-               window.onresize = windowDidResize;
+               function initStyle() {
+                       alignChat(true);
+                       if(!coalescedHTML)
+                               coalescedHTML = new CoalescedHTML();
+               }
        </script>
-       
+
+       <style type="text/css">
+               .actionMessageUserName { display:none; }
+               .actionMessageBody:before { content:"*"; }
+               .actionMessageBody:after { content:"*"; }
+               * { word-wrap:break-word; text-rendering: optimizelegibility; }
+               img.scaledToFitImage { height: auto; max-width: 100%%; }
+       </style>
+
        <!-- This style is shared by all variants. !-->
-       <style id="baseStyle" type="text/css" media="screen,print">     
-               %@  
-               *{ word-wrap:break-word; }
-               img.scaledToFitImage { height:auto; width:100%; }
+       <style id="baseStyle" type="text/css" media="screen,print">
+               %@
        </style>
-       
+
        <!-- Although we call this mainStyle for legacy reasons, it's actually the variant style !-->
-       <style id="mainStyle" type="text/css" media="screen,print">     
+       <style id="mainStyle" type="text/css" media="screen,print">
                @import url( "%@" );
        </style>
 
 </head>
-<body onload="alignChat(true);" style="==bodyBackground==">
+<body onload="initStyle();" style="==bodyBackground==">
 %@
 <div id="Chat">
 </div>
index 1c833ffcb5f63e93323120d78f21b233cc79ce85..799cc7294f1f99ae150433f2b5066b8363740c54 100644 (file)
       <_summary>Show protocols</_summary>
       <_description>Whether to show protocols for contacts in the contact list.</_description>
     </key>
+    <key name="show-balance-in-roster" type="b">
+      <default>false</default>
+      <_summary>Show Balance in contact list</_summary>
+      <_description>Whether to show account balances in the contact list.</_description>
+    </key>
     <key name="compact-contact-list" type="b">
       <default>false</default>
       <_summary>Compact contact list</_summary>
index 6bbfc9a466d7a00a9913c72dba263b64025ccd7f..dfa9ecd359f97b2da8972d15ca2e8c4a29d7b960 100644 (file)
@@ -2210,9 +2210,6 @@ do_dispose (GObject *obj)
 
   if (priv->settings != NULL)
     {
-      TpAccount *account;
-      account = empathy_account_settings_get_account (priv->settings);
-
       g_object_unref (priv->settings);
       priv->settings = NULL;
     }
index c146941b3b9157f7bc3a23d5929363f194f085fe..b580812accfb14910af8ec9bae3fbce0646503cb 100644 (file)
@@ -146,6 +146,7 @@ struct _EmpathyChatPriv {
         * notified again about the already notified pending messages when the
         * messages in tab will be properly shown */
        gboolean           retrieving_backlogs;
+       gboolean           sms_channel;
 };
 
 typedef struct {
@@ -170,6 +171,8 @@ enum {
        PROP_SUBJECT,
        PROP_REMOTE_CONTACT,
        PROP_SHOW_CONTACTS,
+       PROP_SMS_CHANNEL,
+       PROP_N_MESSAGES_SENDING,
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
@@ -195,7 +198,7 @@ chat_get_property (GObject    *object,
                g_value_set_object (value, priv->account);
                break;
        case PROP_NAME:
-               g_value_set_string (value, empathy_chat_get_name (chat));
+               g_value_take_string (value, empathy_chat_dup_name (chat));
                break;
        case PROP_ID:
                g_value_set_string (value, priv->id);
@@ -209,6 +212,13 @@ chat_get_property (GObject    *object,
        case PROP_SHOW_CONTACTS:
                g_value_set_boolean (value, priv->show_contacts);
                break;
+       case PROP_SMS_CHANNEL:
+               g_value_set_boolean (value, priv->sms_channel);
+               break;
+       case PROP_N_MESSAGES_SENDING:
+               g_value_set_uint (value,
+                       empathy_chat_get_n_messages_sending (chat));
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                break;
@@ -249,8 +259,14 @@ account_reconnected (EmpathyChat *chat,
        * https://bugs.freedesktop.org/show_bug.cgi?id=13422 */
        switch (priv->handle_type) {
                case TP_HANDLE_TYPE_CONTACT:
-                       empathy_chat_with_contact_id (
-                               account, priv->id, TP_USER_ACTION_TIME_NOT_USER_ACTION);
+                       if (priv->sms_channel)
+                               empathy_sms_contact_id (
+                                       account, priv->id,
+                                       TP_USER_ACTION_TIME_NOT_USER_ACTION);
+                       else
+                               empathy_chat_with_contact_id (
+                                       account, priv->id,
+                                       TP_USER_ACTION_TIME_NOT_USER_ACTION);
                        break;
                case TP_HANDLE_TYPE_ROOM:
                        empathy_join_muc (account, priv->id,
@@ -1271,31 +1287,43 @@ static void
 chat_send_error_cb (EmpathyTpChat          *tp_chat,
                    const gchar            *message_body,
                    TpChannelTextSendError  error_code,
+                   const gchar            *dbus_error,
                    EmpathyChat            *chat)
 {
-       const gchar *error;
+       const gchar *error = NULL;
        gchar       *str;
 
-       switch (error_code) {
-       case TP_CHANNEL_TEXT_SEND_ERROR_OFFLINE:
-               error = _("offline");
-               break;
-       case TP_CHANNEL_TEXT_SEND_ERROR_INVALID_CONTACT:
-               error = _("invalid contact");
-               break;
-       case TP_CHANNEL_TEXT_SEND_ERROR_PERMISSION_DENIED:
-               error = _("permission denied");
-               break;
-       case TP_CHANNEL_TEXT_SEND_ERROR_TOO_LONG:
-               error = _("too long message");
-               break;
-       case TP_CHANNEL_TEXT_SEND_ERROR_NOT_IMPLEMENTED:
-               error = _("not implemented");
-               break;
-       case TP_CHANNEL_TEXT_SEND_ERROR_UNKNOWN:
-       default:
-               error = _("unknown");
-               break;
+       if (!tp_strdiff (dbus_error, TP_ERROR_STR_INSUFFICIENT_BALANCE)) {
+               /* translators: error used when user doesn't have enough credit on his
+                * account to send the message. */
+               error = _("insufficient balance to send message");
+       } else if (!tp_strdiff (dbus_error, TP_ERROR_STR_NOT_CAPABLE)) {
+               error = _("not capable");
+       }
+
+       if (error == NULL) {
+               /* if we didn't find a dbus-error, try the old error */
+               switch (error_code) {
+               case TP_CHANNEL_TEXT_SEND_ERROR_OFFLINE:
+                       error = _("offline");
+                       break;
+               case TP_CHANNEL_TEXT_SEND_ERROR_INVALID_CONTACT:
+                       error = _("invalid contact");
+                       break;
+               case TP_CHANNEL_TEXT_SEND_ERROR_PERMISSION_DENIED:
+                       error = _("permission denied");
+                       break;
+               case TP_CHANNEL_TEXT_SEND_ERROR_TOO_LONG:
+                       error = _("too long message");
+                       break;
+               case TP_CHANNEL_TEXT_SEND_ERROR_NOT_IMPLEMENTED:
+                       error = _("not implemented");
+                       break;
+               case TP_CHANNEL_TEXT_SEND_ERROR_UNKNOWN:
+               default:
+                       error = _("unknown");
+                       break;
+               }
        }
 
        if (message_body != NULL) {
@@ -2963,6 +2991,22 @@ empathy_chat_class_init (EmpathyChatClass *klass)
                                                               G_PARAM_READWRITE |
                                                               G_PARAM_STATIC_STRINGS));
 
+       g_object_class_install_property (object_class,
+                                        PROP_SMS_CHANNEL,
+                                        g_param_spec_boolean ("sms-channel",
+                                                              "SMS Channel",
+                                                              "TRUE if this channel is for sending SMSes",
+                                                              FALSE,
+                                                              G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (object_class,
+                                        PROP_N_MESSAGES_SENDING,
+                                        g_param_spec_uint ("n-messages-sending",
+                                                           "Num Messages Sending",
+                                                           "The number of messages being sent",
+                                                           0, G_MAXUINT, 0,
+                                                           G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
        signals[COMPOSING] =
                g_signal_new ("composing",
                              G_OBJECT_CLASS_TYPE (object_class),
@@ -3459,6 +3503,21 @@ chat_password_needed_changed_cb (EmpathyChat *self)
        }
 }
 
+static void
+chat_sms_channel_changed_cb (EmpathyChat *self)
+{
+       EmpathyChatPriv *priv = GET_PRIV (self);
+
+       priv->sms_channel = empathy_tp_chat_is_sms_channel (priv->tp_chat);
+       g_object_notify (G_OBJECT (self), "sms-channel");
+}
+
+static void
+chat_n_messages_sending_changed_cb (EmpathyChat *self)
+{
+       g_object_notify (G_OBJECT (self), "n-messages-sending");
+}
+
 void
 empathy_chat_set_tp_chat (EmpathyChat   *chat,
                          EmpathyTpChat *tp_chat)
@@ -3508,6 +3567,12 @@ empathy_chat_set_tp_chat (EmpathyChat   *chat,
        g_signal_connect_swapped (tp_chat, "notify::password-needed",
                                  G_CALLBACK (chat_password_needed_changed_cb),
                                  chat);
+       g_signal_connect_swapped (tp_chat, "notify::sms-channel",
+                                 G_CALLBACK (chat_sms_channel_changed_cb),
+                                 chat);
+       g_signal_connect_swapped (tp_chat, "notify::n-messages-sending",
+                                 G_CALLBACK (chat_n_messages_sending_changed_cb),
+                                 chat);
 
        /* Get initial value of properties */
        properties = empathy_tp_chat_get_properties (priv->tp_chat);
@@ -3528,6 +3593,7 @@ empathy_chat_set_tp_chat (EmpathyChat   *chat,
                }
        }
 
+       chat_sms_channel_changed_cb (chat);
        chat_remote_contact_changed_cb (chat);
 
        if (chat->input_text_view) {
@@ -3570,8 +3636,8 @@ empathy_chat_get_id (EmpathyChat *chat)
        return priv->id;
 }
 
-const gchar *
-empathy_chat_get_name (EmpathyChat *chat)
+gchar *
+empathy_chat_dup_name (EmpathyChat *chat)
 {
        EmpathyChatPriv *priv = GET_PRIV (chat);
        const gchar *ret;
@@ -3579,6 +3645,7 @@ empathy_chat_get_name (EmpathyChat *chat)
        g_return_val_if_fail (EMPATHY_IS_CHAT (chat), NULL);
 
        ret = priv->name;
+
        if (!ret && priv->remote_contact) {
                ret = empathy_contact_get_alias (priv->remote_contact);
        }
@@ -3586,7 +3653,15 @@ empathy_chat_get_name (EmpathyChat *chat)
        if (!ret)
                ret = priv->id;
 
-       return ret ? ret : _("Conversation");
+       if (!ret)
+               ret = _("Conversation");
+
+       if (priv->sms_channel)
+               /* Translators: this string is a something like
+                * "Escher Cat (SMS)" */
+               return g_strdup_printf (_("%s (SMS)"), ret);
+       else
+               return g_strdup (ret);
 }
 
 const gchar *
@@ -3812,3 +3887,35 @@ empathy_chat_is_composing (EmpathyChat *chat)
 {
   return chat->priv->compositors != NULL;
 }
+
+gboolean
+empathy_chat_is_sms_channel (EmpathyChat *self)
+{
+       EmpathyChatPriv *priv = GET_PRIV (self);
+
+       g_return_val_if_fail (EMPATHY_IS_CHAT (self), 0);
+
+       return priv->sms_channel;
+}
+
+guint
+empathy_chat_get_n_messages_sending (EmpathyChat *self)
+{
+       EmpathyChatPriv *priv;
+
+       g_return_val_if_fail (EMPATHY_IS_CHAT (self), 0);
+
+       priv = GET_PRIV (self);
+
+       if (priv->tp_chat == NULL) {
+               return 0;
+       } else {
+               guint n_messages;
+
+               g_object_get (priv->tp_chat,
+                       "n-messages-sending", &n_messages,
+                       NULL);
+
+               return n_messages;
+       }
+}
index 77122f7c873dc7343047a854aea4ecb0c0037d8d..a5c0148a1511a597bbc3f508ded61f066857e785 100644 (file)
@@ -69,7 +69,7 @@ void               empathy_chat_set_tp_chat          (EmpathyChat   *chat,
                                                      EmpathyTpChat *tp_chat);
 TpAccount *        empathy_chat_get_account          (EmpathyChat   *chat);
 const gchar *      empathy_chat_get_id               (EmpathyChat   *chat);
-const gchar *      empathy_chat_get_name             (EmpathyChat   *chat);
+gchar *            empathy_chat_dup_name             (EmpathyChat   *chat);
 const gchar *      empathy_chat_get_subject          (EmpathyChat   *chat);
 EmpathyContact *   empathy_chat_get_remote_contact   (EmpathyChat   *chat);
 GtkWidget *        empathy_chat_get_contact_menu     (EmpathyChat   *chat);
@@ -94,6 +94,10 @@ guint              empathy_chat_get_nb_unread_messages (EmpathyChat   *chat);
 void               empathy_chat_messages_read        (EmpathyChat *self);
 
 gboolean           empathy_chat_is_composing (EmpathyChat *chat);
+
+gboolean           empathy_chat_is_sms_channel       (EmpathyChat *self);
+guint              empathy_chat_get_n_messages_sending (EmpathyChat *self);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_CHAT_H__ */
index a46820c5d8f1f015d328e8bc0a5da03fb8023d00..08757545fb7b97de14c9c61b0ede8eb2760d3b88 100644 (file)
@@ -21,8 +21,9 @@
  *
  * Authors: Danielle Madeley <danielle.madeley@collabora.co.uk>
  */
+#include "config.h"
 
-#include <glib/gi18n.h>
+#include <glib/gi18n-lib.h>
 
 #include <libempathy/empathy-utils.h>
 
index aeb0767d377a30809d692eab07463ceb6507f341..a265fa6b2aa89ba6e95d782bdf487872abf82a8a 100644 (file)
@@ -22,8 +22,9 @@
  *     Danielle Madeley <danielle.madeley@collabora.co.uk>
  *     Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
  */
+#include "config.h"
 
-#include <glib/gi18n.h>
+#include <glib/gi18n-lib.h>
 
 #include <telepathy-glib/telepathy-glib.h>
 
index d5e533aeb21cc9580305e0743dcf1cd83a6ef6a5..a4747b488bcbab72872c910a218d26aa1f28b2d8 100644 (file)
@@ -66,7 +66,8 @@ struct _EmpathyContactSelectorDialogPriv {
 enum {
   PROP_0,
   PROP_SHOW_ACCOUNT_CHOOSER,
-  PROP_FILTER_ACCOUNT
+  PROP_FILTER_ACCOUNT,
+  PROP_SELECTED_ACCOUNT
 };
 
 enum {
@@ -151,6 +152,8 @@ contact_selector_dialog_account_changed_cb (GtkWidget *widget,
       g_object_unref (contact);
       members = g_list_delete_link (members, members);
   }
+
+  g_object_notify (G_OBJECT (dialog), "selected-account");
 }
 
 static gboolean
@@ -375,6 +378,7 @@ empathy_contact_selector_dialog_get_property (GObject *self,
     GParamSpec *pspec)
 {
   EmpathyContactSelectorDialog *dialog = EMPATHY_CONTACT_SELECTOR_DIALOG (self);
+  EmpathyContactSelectorDialogPriv *priv = GET_PRIV (dialog);
 
   switch (prop_id)
     {
@@ -388,6 +392,11 @@ empathy_contact_selector_dialog_get_property (GObject *self,
             empathy_contact_selector_dialog_get_filter_account (dialog));
         break;
 
+      case PROP_SELECTED_ACCOUNT:
+        g_value_set_object (value, empathy_account_chooser_get_account (
+              EMPATHY_ACCOUNT_CHOOSER (priv->account_chooser)));
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec);
         break;
@@ -401,6 +410,7 @@ empathy_contact_selector_dialog_set_property (GObject *self,
     GParamSpec *pspec)
 {
   EmpathyContactSelectorDialog *dialog = EMPATHY_CONTACT_SELECTOR_DIALOG (self);
+  EmpathyContactSelectorDialogPriv *priv = GET_PRIV (dialog);
 
   switch (prop_id)
     {
@@ -414,6 +424,12 @@ empathy_contact_selector_dialog_set_property (GObject *self,
             g_value_get_object (value));
         break;
 
+      case PROP_SELECTED_ACCOUNT:
+        empathy_account_chooser_set_account (
+            EMPATHY_ACCOUNT_CHOOSER (priv->account_chooser),
+            g_value_get_object (value));
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (self, prop_id, pspec);
         break;
@@ -490,6 +506,13 @@ empathy_contact_selector_dialog_class_init (
         "account are displayed",
         TP_TYPE_ACCOUNT,
         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (object_class, PROP_SELECTED_ACCOUNT,
+      g_param_spec_object ("selected-account",
+        "Selected Account",
+        "Current account selected in the account-chooser",
+        TP_TYPE_ACCOUNT,
+        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 const gchar *
index c70d2575acc66b991dd88a0d7e77eb7ac8783dd2..a77ed43e24ab1cfbf2570a2d846c94f1bc9a92d5 100644 (file)
@@ -22,7 +22,7 @@
 
 #include "config.h"
 
-#include <glib/gi18n.h>
+#include <glib/gi18n-lib.h>
 #include <gtk/gtk.h>
 
 #include <libempathy/empathy-contact.h>
index acf206ad38252427f86eed2a6c45f72be31c4ef8..c4e3748b47e92a78782d45906e7d1c9dd89e17b6 100644 (file)
@@ -818,8 +818,10 @@ contact_widget_location_update (EmpathyContactWidget *information)
 {
   GHashTable *location;
   GValue *value;
+#ifdef HAVE_LIBCHAMPLAIN
   gdouble lat = 0.0, lon = 0.0;
   gboolean has_position = TRUE;
+#endif
   GtkWidget *label;
   guint row = 0;
   static const gchar* ordered_geolocation_keys[] = {
@@ -853,18 +855,6 @@ contact_widget_location_update (EmpathyContactWidget *information)
       return;
     }
 
-  value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
-  if (value == NULL)
-      has_position = FALSE;
-  else
-      lat = g_value_get_double (value);
-
-  value = g_hash_table_lookup (location, EMPATHY_LOCATION_LON);
-  if (value == NULL)
-      has_position = FALSE;
-  else
-      lon = g_value_get_double (value);
-
   value = g_hash_table_lookup (location, EMPATHY_LOCATION_TIMESTAMP);
   if (value == NULL)
     {
index 2c40b2ae79bac5ce46d28d9174a26d6226fc41cf..86f1db641b379c64b85c9f053c63d110785a473c 100644 (file)
@@ -40,6 +40,7 @@ G_BEGIN_DECLS
 #define EMPATHY_IMAGE_TYPING              "user-typing"
 #define EMPATHY_IMAGE_CONTACT_INFORMATION "gtk-info"
 #define EMPATHY_IMAGE_GROUP_MESSAGE       "system-users"
+#define EMPATHY_IMAGE_SMS                 "stock_cell-phone"
 #define EMPATHY_IMAGE_VOIP                "audio-input-microphone"
 #define EMPATHY_IMAGE_VIDEO_CALL          "camera-web"
 #define EMPATHY_IMAGE_LOG                 "document-open-recent"
index 3e404c39fddc8be7d1cac3d1f11ba6e583ce7220..576d3b9fac12b115d0e729a3b6ddbde0d0ea70de 100644 (file)
@@ -149,6 +149,14 @@ individual_menu_add_personas (GtkMenuShell *menu,
           gtk_widget_show (action);
         }
 
+      /* SMS */
+      if (features & EMPATHY_INDIVIDUAL_FEATURE_SMS)
+        {
+          action = empathy_individual_sms_menu_item_new (NULL, contact);
+          gtk_menu_shell_append (GTK_MENU_SHELL (contact_submenu), action);
+          gtk_widget_show (action);
+        }
+
       if (features & EMPATHY_INDIVIDUAL_FEATURE_CALL)
         {
           /* Audio Call */
@@ -238,6 +246,17 @@ constructed (GObject *object)
         }
     }
 
+  /* SMS */
+  if (features & EMPATHY_INDIVIDUAL_FEATURE_SMS)
+    {
+      item = empathy_individual_sms_menu_item_new (individual, NULL);
+      if (item != NULL)
+        {
+          gtk_menu_shell_append (shell, item);
+          gtk_widget_show (item);
+        }
+    }
+
   if (features & EMPATHY_INDIVIDUAL_FEATURE_CALL)
     {
       /* Audio Call */
@@ -536,6 +555,52 @@ empathy_individual_chat_menu_item_new (FolksIndividual *individual,
   return item;
 }
 
+static void
+empathy_individual_sms_menu_item_activated (GtkMenuItem *item,
+  EmpathyContact *contact)
+{
+  g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+
+  empathy_sms_contact_id (
+      empathy_contact_get_account (contact),
+      empathy_contact_get_id (contact),
+      gtk_get_current_event_time ());
+}
+
+GtkWidget *
+empathy_individual_sms_menu_item_new (FolksIndividual *individual,
+    EmpathyContact *contact)
+{
+  GtkWidget *item;
+  GtkWidget *image;
+
+  g_return_val_if_fail ((FOLKS_IS_INDIVIDUAL (individual) &&
+      empathy_folks_individual_contains_contact (individual)) ||
+      EMPATHY_IS_CONTACT (contact),
+      NULL);
+
+  item = gtk_image_menu_item_new_with_mnemonic (_("_SMS"));
+  image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_SMS,
+      GTK_ICON_SIZE_MENU);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+  gtk_widget_show (image);
+
+  if (contact != NULL)
+    {
+      menu_item_set_contact (item, contact,
+          G_CALLBACK (empathy_individual_sms_menu_item_activated),
+          EMPATHY_ACTION_SMS);
+    }
+  else
+    {
+      menu_item_set_first_contact (item, individual,
+          G_CALLBACK (empathy_individual_sms_menu_item_activated),
+          EMPATHY_ACTION_SMS);
+    }
+
+  return item;
+}
+
 static void
 empathy_individual_audio_call_menu_item_activated (GtkMenuItem *item,
   EmpathyContact *contact)
index 5b3d220df00c22d865a6e2c3a39aaae64aa224d2..c2841ad6de7075045453cd7dc5312496a0a283e6 100644 (file)
@@ -36,7 +36,8 @@ typedef enum {
        EMPATHY_INDIVIDUAL_FEATURE_INFO = 1 << 4,
        EMPATHY_INDIVIDUAL_FEATURE_FAVOURITE = 1 << 5,
        EMPATHY_INDIVIDUAL_FEATURE_LINK = 1 << 6,
-       EMPATHY_INDIVIDUAL_FEATURE_ALL = (1 << 7) - 1,
+       EMPATHY_INDIVIDUAL_FEATURE_SMS = 1 << 7,
+       EMPATHY_INDIVIDUAL_FEATURE_ALL = (1 << 8) - 1,
 } EmpathyIndividualFeatureFlags;
 
 #define EMPATHY_TYPE_INDIVIDUAL_MENU (empathy_individual_menu_get_type ())
@@ -69,6 +70,8 @@ GtkWidget * empathy_individual_menu_new (FolksIndividual *individual,
     EmpathyIndividualFeatureFlags features);
 GtkWidget * empathy_individual_chat_menu_item_new (FolksIndividual *individual,
     EmpathyContact *contact);
+GtkWidget * empathy_individual_sms_menu_item_new (FolksIndividual *individual,
+    EmpathyContact *contact);
 GtkWidget * empathy_individual_audio_call_menu_item_new (
     FolksIndividual *individual,
     EmpathyContact *contact);
index 735e2db9d700690db916503e8397f7a895033a0d..b550245dcb5539763f37f0ed7679dd65d4a547ba 100644 (file)
@@ -1921,7 +1921,7 @@ individual_store_get_individual_status_icon_with_icon_name (
     FolksIndividual *individual,
     const gchar *status_icon_name)
 {
-  GdkPixbuf *pixbuf_status = NULL;
+  GdkPixbuf *pixbuf_status;
   EmpathyIndividualStorePriv *priv;
   const gchar *protocol_name = NULL;
   gchar *icon_name = NULL;
@@ -1953,13 +1953,18 @@ individual_store_get_individual_status_icon_with_icon_name (
     {
       icon_name = g_strdup_printf ("%s", status_icon_name);
     }
+
+  pixbuf_status = g_hash_table_lookup (priv->status_icons, icon_name);
+
   if (pixbuf_status == NULL)
     {
       pixbuf_status =
           empathy_pixbuf_contact_status_icon_with_icon_name (contact,
           status_icon_name, show_protocols_here);
+
       if (pixbuf_status != NULL)
         {
+          /* pass the reference to the hash table */
           g_hash_table_insert (priv->status_icons,
               g_strdup (icon_name), pixbuf_status);
         }
index cc9d49e86349807ed1fd257898327f456c32a41a..fcbc93fa47ab69221f7f7030ac27ac84217ecb91 100644 (file)
@@ -1689,7 +1689,9 @@ static gboolean
 individual_view_is_visible_individual (EmpathyIndividualView *self,
     FolksIndividual *individual,
     gboolean is_online,
-    gboolean is_searching)
+    gboolean is_searching,
+    const gchar *group,
+    gboolean is_fake_group)
 {
   EmpathyIndividualViewPriv *priv = GET_PRIV (self);
   EmpathyLiveSearch *live = EMPATHY_LIVE_SEARCH (priv->search_widget);
@@ -1721,8 +1723,14 @@ individual_view_is_visible_individual (EmpathyIndividualView *self,
 
   is_favorite = folks_favourite_details_get_is_favourite (
       FOLKS_FAVOURITE_DETAILS (individual));
-  if (is_searching == FALSE)
-    return (priv->show_offline || is_online || is_favorite);
+  if (is_searching == FALSE) {
+    if (is_favorite && is_fake_group &&
+        !tp_strdiff (group, EMPATHY_INDIVIDUAL_STORE_FAVORITE))
+        /* Always display favorite contacts in the favorite group */
+        return TRUE;
+
+    return (priv->show_offline || is_online);
+  }
 
   /* check alias name */
   str = folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (individual));
@@ -1757,6 +1765,28 @@ individual_view_is_visible_individual (EmpathyIndividualView *self,
   return FALSE;
 }
 
+static gchar *
+get_group (GtkTreeModel *model,
+    GtkTreeIter *iter,
+    gboolean *is_fake)
+{
+  GtkTreeIter parent_iter;
+  gchar *name = NULL;
+
+  *is_fake = FALSE;
+
+  if (!gtk_tree_model_iter_parent (model, &parent_iter, iter))
+    return NULL;
+
+  gtk_tree_model_get (model, &parent_iter,
+      EMPATHY_INDIVIDUAL_STORE_COL_NAME, &name,
+      EMPATHY_INDIVIDUAL_STORE_COL_IS_FAKE_GROUP, is_fake,
+      -1);
+
+  return name;
+}
+
+
 static gboolean
 individual_view_filter_visible_func (GtkTreeModel *model,
     GtkTreeIter *iter,
@@ -1783,10 +1813,16 @@ individual_view_filter_visible_func (GtkTreeModel *model,
 
   if (individual != NULL)
     {
+      gchar *group;
+      gboolean is_fake_group;
+
+      group = get_group (model, iter, &is_fake_group);
+
       visible = individual_view_is_visible_individual (self, individual,
-          is_online, is_searching);
+          is_online, is_searching, group, is_fake_group);
 
       g_object_unref (individual);
+      g_free (group);
 
       /* FIXME: Work around bgo#626552/bgo#621076 */
       if (visible == TRUE)
@@ -1809,6 +1845,9 @@ individual_view_filter_visible_func (GtkTreeModel *model,
   for (valid = gtk_tree_model_iter_children (model, &child_iter, iter);
        valid; valid = gtk_tree_model_iter_next (model, &child_iter))
     {
+      gchar *group;
+      gboolean is_fake_group;
+
       gtk_tree_model_get (model, &child_iter,
         EMPATHY_INDIVIDUAL_STORE_COL_INDIVIDUAL, &individual,
         EMPATHY_INDIVIDUAL_STORE_COL_IS_ONLINE, &is_online,
@@ -1817,9 +1856,13 @@ individual_view_filter_visible_func (GtkTreeModel *model,
       if (individual == NULL)
         continue;
 
+      group = get_group (model, &child_iter, &is_fake_group);
+
       visible = individual_view_is_visible_individual (self, individual,
-          is_online, is_searching);
+          is_online, is_searching, group, is_fake_group);
+
       g_object_unref (individual);
+      g_free (group);
 
       /* show group if it has at least one visible contact in it */
       if (visible == TRUE)
index 8184bc04330361a90001f3ab8c09f7a57f4f260b..03b97d03dfea011c684f248504dec7a4f6c0e3e1 100644 (file)
@@ -24,7 +24,7 @@
 #include <string.h>
 #include <time.h>
 
-#include <glib/gi18n.h>
+#include <glib/gi18n-lib.h>
 
 #include <telepathy-glib/account-manager.h>
 #include <telepathy-glib/util.h>
index b9edb93e7b949344bc4e6c32ead373ad82f26b36..3d811abbbc61caf98bdceb2803bd2f08f21b797e 100644 (file)
@@ -62,21 +62,40 @@ G_DEFINE_TYPE(EmpathyNewMessageDialog, empathy_new_message_dialog,
  * to be started with any contact on any enabled account.
  */
 
+enum
+{
+  EMP_NEW_MESSAGE_TEXT,
+  EMP_NEW_MESSAGE_SMS,
+};
+
 static void
 empathy_new_message_dialog_response (GtkDialog *dialog, int response_id)
 {
   TpAccount *account;
   const gchar *contact_id;
 
-  if (response_id != GTK_RESPONSE_ACCEPT) goto out;
+  if (response_id < EMP_NEW_MESSAGE_TEXT) goto out;
 
   contact_id = empathy_contact_selector_dialog_get_selected (
       EMPATHY_CONTACT_SELECTOR_DIALOG (dialog), NULL, &account);
 
   if (EMP_STR_EMPTY (contact_id) || account == NULL) goto out;
 
-  empathy_chat_with_contact_id (account, contact_id,
-      gtk_get_current_event_time ());
+  switch (response_id)
+    {
+      case EMP_NEW_MESSAGE_TEXT:
+        empathy_chat_with_contact_id (account, contact_id,
+            gtk_get_current_event_time ());
+        break;
+
+      case EMP_NEW_MESSAGE_SMS:
+        empathy_sms_contact_id (account, contact_id,
+            gtk_get_current_event_time ());
+        break;
+
+      default:
+        g_warn_if_reached ();
+    }
 
 out:
   gtk_widget_destroy (GTK_WIDGET (dialog));
@@ -135,6 +154,63 @@ empathy_new_message_account_filter (EmpathyContactSelectorDialog *dialog,
   tp_proxy_prepare_async (connection, features, conn_prepared_cb, cb_data);
 }
 
+static void
+empathy_new_message_dialog_update_sms_button_sensitivity (GtkWidget *widget,
+    GParamSpec *pspec,
+    GtkWidget *button)
+{
+  GtkWidget *self = gtk_widget_get_toplevel (widget);
+  EmpathyContactSelectorDialog *dialog;
+  TpConnection *conn;
+  GPtrArray *rccs;
+  gboolean sensitive = FALSE;
+  guint i;
+
+  g_return_if_fail (EMPATHY_IS_NEW_MESSAGE_DIALOG (self));
+
+  dialog = EMPATHY_CONTACT_SELECTOR_DIALOG (self);
+
+  /* if the Text widget isn't sensitive, don't bother checking the caps */
+  if (!gtk_widget_get_sensitive (dialog->button_action))
+    goto finally;
+
+  empathy_contact_selector_dialog_get_selected (dialog, &conn, NULL);
+
+  if (conn == NULL)
+    goto finally;
+
+  /* iterate the rccs to find if SMS channels are supported, this should
+   * be in tp-glib */
+  rccs = tp_capabilities_get_channel_classes (
+      tp_connection_get_capabilities (conn));
+
+  for (i = 0; i < rccs->len; i++)
+    {
+      GHashTable *fixed;
+      GStrv allowed;
+      const char *type;
+      gboolean sms_channel;
+
+      tp_value_array_unpack (g_ptr_array_index (rccs, i), 2,
+          &fixed,
+          &allowed);
+
+      /* SMS channels are type:Text and sms-channel:True */
+      type = tp_asv_get_string (fixed, TP_PROP_CHANNEL_CHANNEL_TYPE);
+      sms_channel = tp_asv_get_boolean (fixed,
+          TP_PROP_CHANNEL_INTERFACE_SMS_SMS_CHANNEL, NULL);
+
+      sensitive = sms_channel &&
+        !tp_strdiff (type, TP_IFACE_CHANNEL_TYPE_TEXT);
+
+      if (sensitive)
+        break;
+    }
+
+finally:
+  gtk_widget_set_sensitive (button, sensitive);
+}
+
 static GObject *
 empathy_new_message_dialog_constructor (GType type,
     guint n_props,
@@ -165,8 +241,19 @@ empathy_new_message_dialog_init (EmpathyNewMessageDialog *dialog)
 {
   EmpathyContactSelectorDialog *parent = EMPATHY_CONTACT_SELECTOR_DIALOG (
         dialog);
+  GtkWidget *button;
   GtkWidget *image;
 
+  /* add an SMS button */
+  button = gtk_button_new_with_mnemonic (_("_SMS"));
+  image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_SMS,
+      GTK_ICON_SIZE_BUTTON);
+  gtk_button_set_image (GTK_BUTTON (button), image);
+
+  gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
+      EMP_NEW_MESSAGE_SMS);
+  gtk_widget_show (button);
+
   /* add chat button */
   parent->button_action = gtk_button_new_with_mnemonic (_("C_hat"));
   image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_NEW_MESSAGE,
@@ -174,9 +261,18 @@ empathy_new_message_dialog_init (EmpathyNewMessageDialog *dialog)
   gtk_button_set_image (GTK_BUTTON (parent->button_action), image);
 
   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), parent->button_action,
-      GTK_RESPONSE_ACCEPT);
+      EMP_NEW_MESSAGE_TEXT);
   gtk_widget_show (parent->button_action);
 
+  /* the parent class will update the sensitivity of button_action, propagate
+   * it */
+  g_signal_connect (parent->button_action, "notify::sensitive",
+      G_CALLBACK (empathy_new_message_dialog_update_sms_button_sensitivity),
+      button);
+  g_signal_connect (dialog, "notify::selected-account",
+      G_CALLBACK (empathy_new_message_dialog_update_sms_button_sensitivity),
+      button);
+
   /* Tweak the dialog */
   gtk_window_set_title (GTK_WINDOW (dialog), _("New Conversation"));
   gtk_window_set_role (GTK_WINDOW (dialog), "new_message");
index 2ab3383b3842d4c0e1dbab632f1d8eac7f37bd78..0d3f9a71860d32c296c78df2ebe8f52d0a6c246c 100644 (file)
@@ -22,7 +22,7 @@
 #include "config.h"
 
 #include <string.h>
-#include <glib/gi18n.h>
+#include <glib/gi18n-lib.h>
 
 #include <webkit/webkit.h>
 #include <telepathy-glib/dbus.h>
@@ -59,11 +59,13 @@ typedef struct {
        gint64                last_timestamp;
        gboolean              last_is_backlog;
        guint                 pages_loading;
-       GList                *message_queue;
+       /* Queue of GValue* containing an EmpathyMessage or string */
+       GQueue                message_queue;
        GtkWidget            *inspector_window;
        GSettings            *gsettings_chat;
        gboolean              has_focus;
        gboolean              has_unread_message;
+       gboolean              allow_scrolling;
 } EmpathyThemeAdiumPriv;
 
 struct _EmpathyAdiumData {
@@ -73,26 +75,27 @@ struct _EmpathyAdiumData {
        gchar *default_avatar_filename;
        gchar *default_incoming_avatar_filename;
        gchar *default_outgoing_avatar_filename;
-       gchar *template_html;
-       gchar *in_content_html;
-       gsize  in_content_len;
-       gchar *in_context_html;
-       gsize  in_context_len;
-       gchar *in_nextcontent_html;
-       gsize  in_nextcontent_len;
-       gchar *in_nextcontext_html;
-       gsize  in_nextcontext_len;
-       gchar *out_content_html;
-       gsize  out_content_len;
-       gchar *out_context_html;
-       gsize  out_context_len;
-       gchar *out_nextcontent_html;
-       gsize  out_nextcontent_len;
-       gchar *out_nextcontext_html;
-       gsize  out_nextcontext_len;
-       gchar *status_html;
-       gsize  status_len;
        GHashTable *info;
+       guint version;
+       gboolean custom_template;
+
+       /* HTML bits */
+       const gchar *template_html;
+       const gchar *content_html;
+       const gchar *in_content_html;
+       const gchar *in_context_html;
+       const gchar *in_nextcontent_html;
+       const gchar *in_nextcontext_html;
+       const gchar *out_content_html;
+       const gchar *out_context_html;
+       const gchar *out_nextcontent_html;
+       const gchar *out_nextcontext_html;
+       const gchar *status_html;
+
+       /* Above html strings are pointers to strings stored in this array.
+        * We do this because of fallbacks, some htmls could be pointing the
+        * same string. */
+       GPtrArray *strings_to_free;
 };
 
 static void theme_adium_iface_init (EmpathyChatViewIface *iface);
@@ -191,6 +194,36 @@ theme_adium_open_address_cb (GtkMenuItem *menuitem,
        g_free (uri);
 }
 
+/* Replace each %@ in format with string passed in args */
+static gchar *
+string_with_format (const gchar *format,
+                   const gchar *first_string,
+                   ...)
+{
+       va_list args;
+       const gchar *str;
+       GString *result;
+
+       va_start (args, first_string);
+       result = g_string_sized_new (strlen (format));
+       for (str = first_string; str != NULL; str = va_arg (args, const gchar *)) {
+               const gchar *next;
+
+               next = strstr (format, "%@");
+               if (next == NULL) {
+                       break;
+               }
+
+               g_string_append_len (result, format, next - format);
+               g_string_append (result, str);
+               format = next + 2;
+       }
+       g_string_append (result, format);
+       va_end (args);
+
+       return g_string_free (result, FALSE);
+}
+
 static void
 theme_adium_match_newline (const gchar *text,
                           gssize len,
@@ -283,7 +316,7 @@ theme_adium_parse_body (EmpathyThemeAdium *self,
 static void
 escape_and_append_len (GString *string, const gchar *str, gint len)
 {
-       while (*str != '\0' && len != 0) {
+       while (str != NULL && *str != '\0' && len != 0) {
                switch (*str) {
                case '\\':
                        /* \ becomes \\ */
@@ -345,10 +378,36 @@ theme_adium_match_with_format (const gchar **str,
        return TRUE;
 }
 
+/* List of colors used by %senderColor%. Copied from
+ * adium/Frameworks/AIUtilities\ Framework/Source/AIColorAdditions.m
+ */
+static gchar *colors[] = {
+       "aqua", "aquamarine", "blue", "blueviolet", "brown", "burlywood", "cadetblue",
+       "chartreuse", "chocolate", "coral", "cornflowerblue", "crimson", "cyan",
+       "darkblue", "darkcyan", "darkgoldenrod", "darkgreen", "darkgrey", "darkkhaki",
+       "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred",
+       "darksalmon", "darkseagreen", "darkslateblue", "darkslategrey",
+       "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgrey",
+       "dodgerblue", "firebrick", "forestgreen", "fuchsia", "gold", "goldenrod",
+       "green", "greenyellow", "grey", "hotpink", "indianred", "indigo", "lawngreen",
+       "lightblue", "lightcoral",
+       "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen",
+       "lightskyblue", "lightslategrey", "lightsteelblue", "lime", "limegreen",
+       "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid",
+       "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen",
+       "mediumturquoise", "mediumvioletred", "midnightblue", "navy", "olive",
+       "olivedrab", "orange", "orangered", "orchid", "palegreen", "paleturquoise",
+       "palevioletred", "peru", "pink", "plum", "powderblue", "purple", "red",
+       "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen",
+       "sienna", "silver", "skyblue", "slateblue", "slategrey", "springgreen",
+       "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet",
+       "yellowgreen",
+};
+
 static void
 theme_adium_append_html (EmpathyThemeAdium *theme,
                         const gchar       *func,
-                        const gchar       *html, gsize len,
+                        const gchar       *html,
                         const gchar       *message,
                         const gchar       *avatar_filename,
                         const gchar       *name,
@@ -363,10 +422,10 @@ theme_adium_append_html (EmpathyThemeAdium *theme,
        gchar       *script;
 
        /* Make some search-and-replace in the html code */
-       string = g_string_sized_new (len + strlen (message));
+       string = g_string_sized_new (strlen (html) + strlen (message));
        g_string_append_printf (string, "%s(\"", func);
        for (cur = html; *cur != '\0'; cur++) {
-               const gchar *replace = "";
+               const gchar *replace = NULL;
                gchar       *dup_replace = NULL;
                gchar       *format = NULL;
 
@@ -380,11 +439,15 @@ theme_adium_append_html (EmpathyThemeAdium *theme,
                } else if (theme_adium_match (&cur, "%sender%")) {
                        replace = name;
                } else if (theme_adium_match (&cur, "%senderColor%")) {
-                       /* FIXME: A color derived from the user's name. If a
-                        * colon separated list of HTML colors is at
+                       /* A color derived from the user's name.
+                        * FIXME: If a colon separated list of HTML colors is at
                         * Incoming/SenderColors.txt it will be used instead of
                         * the default colors.
                         */
+                       if (contact_id != NULL) {
+                               guint hash = g_str_hash (contact_id);
+                               replace = colors[hash % G_N_ELEMENTS (colors)];
+                       }
                } else if (theme_adium_match (&cur, "%senderStatusIcon%")) {
                        /* FIXME: The path to the status icon of the sender
                         * (available, away, etc...)
@@ -493,13 +556,10 @@ theme_adium_append_event_escaped (EmpathyChatView *view,
        EmpathyThemeAdium     *theme = EMPATHY_THEME_ADIUM (view);
        EmpathyThemeAdiumPriv *priv = GET_PRIV (theme);
 
-       if (priv->data->status_html) {
-               theme_adium_append_html (theme, "appendMessage",
-                                        priv->data->status_html,
-                                        priv->data->status_len,
-                                        escaped, NULL, NULL, NULL, NULL,
-                                        "event", empathy_time_get_current (), FALSE);
-       }
+       theme_adium_append_html (theme, "appendMessage",
+                                priv->data->status_html, escaped, NULL, NULL, NULL,
+                                NULL, "event",
+                                empathy_time_get_current (), FALSE);
 
        /* There is no last contact */
        if (priv->last_contact) {
@@ -580,17 +640,18 @@ theme_adium_append_message (EmpathyChatView *view,
        EmpathyAvatar         *avatar;
        const gchar           *avatar_filename = NULL;
        gint64                 timestamp;
-       gchar                 *html = NULL;
-       gsize                  len = 0;
+       const gchar           *html = NULL;
        const gchar           *func;
        const gchar           *service_name;
        GString               *message_classes = NULL;
        gboolean               is_backlog;
        gboolean               consecutive;
+       gboolean               action;
 
        if (priv->pages_loading != 0) {
-               priv->message_queue = g_list_prepend (priv->message_queue,
-                                                     g_object_ref (msg));
+               GValue *value = tp_g_value_slice_new (EMPATHY_TYPE_MESSAGE);
+               g_value_set_object (value, msg);
+               g_queue_push_tail (&priv->message_queue, value);
                return;
        }
 
@@ -606,17 +667,21 @@ theme_adium_append_message (EmpathyChatView *view,
        body_escaped = theme_adium_parse_body (theme, body);
        name = empathy_contact_get_alias (sender);
        contact_id = empathy_contact_get_id (sender);
+       action = (empathy_message_get_tptype (msg) == TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION);
 
-       /* If this is a /me, append an event */
-       if (empathy_message_get_tptype (msg) == TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION) {
+       /* If this is a /me probably */
+       if (action) {
                gchar *str;
 
-               str = g_strdup_printf ("%s %s", name, body_escaped);
-               theme_adium_append_event_escaped (view, str);
-
-               g_free (str);
+               if (priv->data->version >= 4 || !priv->data->custom_template) {
+                       str = g_strdup_printf ("<span class='actionMessageUserName'>%s</span>"
+                                              "<span class='actionMessageBody'>%s</span>",
+                                              name, body_escaped);
+               } else {
+                       str = g_strdup_printf ("*%s*", body_escaped);
+               }
                g_free (body_escaped);
-               return;
+               body_escaped = str;
        }
 
        /* Get the avatar filename, or a fallback */
@@ -676,95 +741,53 @@ theme_adium_append_message (EmpathyChatView *view,
        } else {
                g_string_append (message_classes, " incoming");
        }
+       if (empathy_message_should_highlight (msg)) {
+               g_string_append (message_classes, " mention");
+       }
+       if (empathy_message_get_tptype (msg) == TP_CHANNEL_TEXT_MESSAGE_TYPE_AUTO_REPLY) {
+               g_string_append (message_classes, " autoreply");
+       }
+       if (action) {
+               g_string_append (message_classes, " action");
+       }
        /* FIXME: other classes:
-        * autoreply - the message is an automatic response, generally due to an
-        *             away status
-        * mention - the incoming message (in groupchat) matches your username
-        *           or one of the mention keywords specified in Adium's
-        *           advanced prefs.
         * status - the message is a status change
         * event - the message is a notification of something happening
         *         (for example, encryption being turned on)
-        * %status% - See %status% in theme_adium_append_html()
+        * %status% - See %status% in theme_adium_append_html ()
         */
 
        /* Define javascript function to use */
        if (consecutive) {
-               func = "appendNextMessage";
+               func = priv->allow_scrolling ? "appendNextMessage" : "appendNextMessageNoScroll";
        } else {
-               func = "appendMessage";
+               func = priv->allow_scrolling ? "appendMessage" : "appendMessageNoScroll";
        }
 
-       /* Outgoing */
        if (empathy_contact_is_user (sender)) {
-               if (consecutive) {
-                       if (is_backlog) {
-                               html = priv->data->out_nextcontext_html;
-                               len = priv->data->out_nextcontext_len;
-                       }
-
-                       /* Not backlog, or fallback if NextContext.html
-                        * is missing */
-                       if (html == NULL) {
-                               html = priv->data->out_nextcontent_html;
-                               len = priv->data->out_nextcontent_len;
-                       }
-               }
-
-               /* Not consecutive, or fallback if NextContext.html and/or
-                * NextContent.html are missing */
-               if (html == NULL) {
-                       if (is_backlog) {
-                               html = priv->data->out_context_html;
-                               len = priv->data->out_context_len;
-                       }
-
-                       if (html == NULL) {
-                               html = priv->data->out_content_html;
-                               len = priv->data->out_content_len;
-                       }
-               }
-       }
-
-       /* Incoming, or fallback if outgoing files are missing */
-       if (html == NULL) {
-               if (consecutive) {
-                       if (is_backlog) {
-                               html = priv->data->in_nextcontext_html;
-                               len = priv->data->in_nextcontext_len;
-                       }
-
-                       /* Note backlog, or fallback if NextContext.html
-                        * is missing */
-                       if (html == NULL) {
-                               html = priv->data->in_nextcontent_html;
-                               len = priv->data->in_nextcontent_len;
-                       }
+               /* out */
+               if (is_backlog) {
+                       /* context */
+                       html = consecutive ? priv->data->out_nextcontext_html : priv->data->out_context_html;
+               } else {
+                       /* content */
+                       html = consecutive ? priv->data->out_nextcontent_html : priv->data->out_content_html;
                }
-
-               /* Not consecutive, or fallback if NextContext.html and/or
-                * NextContent.html are missing */
-               if (html == NULL) {
-                       if (is_backlog) {
-                               html = priv->data->in_context_html;
-                               len = priv->data->in_context_len;
-                       }
-
-                       if (html == NULL) {
-                               html = priv->data->in_content_html;
-                               len = priv->data->in_content_len;
-                       }
+       } else {
+               /* in */
+               if (is_backlog) {
+                       /* context */
+                       html = consecutive ? priv->data->in_nextcontext_html : priv->data->in_context_html;
+               } else {
+                       /* content */
+                       html = consecutive ? priv->data->in_nextcontent_html : priv->data->in_content_html;
                }
        }
 
-       if (html != NULL) {
-               theme_adium_append_html (theme, func, html, len, body_escaped,
-                                        avatar_filename, name, contact_id,
-                                        service_name, message_classes->str,
-                                        timestamp, is_backlog);
-       } else {
-               DEBUG ("Couldn't find HTML file for this message");
-       }
+       theme_adium_append_html (theme, func, html, body_escaped,
+                                avatar_filename, name, contact_id,
+                                service_name, message_classes->str,
+                                timestamp, is_backlog);
 
        /* Keep the sender of the last displayed message */
        if (priv->last_contact) {
@@ -782,8 +805,15 @@ static void
 theme_adium_append_event (EmpathyChatView *view,
                          const gchar     *str)
 {
+       EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
        gchar *str_escaped;
 
+       if (priv->pages_loading != 0) {
+               g_queue_push_tail (&priv->message_queue,
+                       tp_g_value_slice_new_string (str));
+               return;
+       }
+
        str_escaped = g_markup_escape_text (str, -1);
        theme_adium_append_event_escaped (view, str_escaped);
        g_free (str_escaped);
@@ -793,14 +823,18 @@ static void
 theme_adium_scroll (EmpathyChatView *view,
                    gboolean         allow_scrolling)
 {
-       /* FIXME: Is it possible? I guess we need a js function, but I don't
-        * see any... */
+       EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
+
+       priv->allow_scrolling = allow_scrolling;
+       if (allow_scrolling) {
+               empathy_chat_view_scroll_down (view);
+       }
 }
 
 static void
 theme_adium_scroll_down (EmpathyChatView *view)
 {
-       webkit_web_view_execute_script (WEBKIT_WEB_VIEW (view), "scrollToBottom()");
+       webkit_web_view_execute_script (WEBKIT_WEB_VIEW (view), "alignChat(true);");
 }
 
 static gboolean
@@ -1028,6 +1062,7 @@ theme_adium_load_finished_cb (WebKitWebView  *view,
 {
        EmpathyThemeAdiumPriv *priv = GET_PRIV (view);
        EmpathyChatView       *chat_view = EMPATHY_CHAT_VIEW (view);
+       GList                 *l;
 
        DEBUG ("Page loaded");
        priv->pages_loading--;
@@ -1036,14 +1071,20 @@ theme_adium_load_finished_cb (WebKitWebView  *view,
                return;
 
        /* Display queued messages */
-       priv->message_queue = g_list_reverse (priv->message_queue);
-       while (priv->message_queue) {
-               EmpathyMessage *message = priv->message_queue->data;
+       for (l = priv->message_queue.head; l != NULL; l = l->next) {
+               GValue *value = l->data;
 
-               theme_adium_append_message (chat_view, message);
-               priv->message_queue = g_list_remove (priv->message_queue, message);
-               g_object_unref (message);
+               if (G_VALUE_HOLDS_OBJECT (value)) {
+                       theme_adium_append_message (chat_view,
+                               g_value_get_object (value));
+               } else {
+                       theme_adium_append_event (chat_view,
+                               g_value_get_string (value));
+               }
+
+               tp_g_value_slice_free (value);
        }
+       g_queue_clear (&priv->message_queue);
 }
 
 static void
@@ -1319,6 +1360,8 @@ empathy_theme_adium_init (EmpathyThemeAdium *theme)
 
        theme->priv = priv;
 
+       g_queue_init (&priv->message_queue);
+       priv->allow_scrolling = TRUE;
        priv->smiley_manager = empathy_smiley_manager_dup_singleton ();
 
        g_signal_connect (theme, "load-finished",
@@ -1359,18 +1402,24 @@ empathy_adium_path_is_valid (const gchar *path)
        ret = g_file_test (file, G_FILE_TEST_EXISTS);
        g_free (file);
 
-       if (ret == FALSE)
-               return ret;
+       if (!ret)
+               return FALSE;
 
        /* We ship a default Template.html as fallback if there is any problem
         * with the one inside the theme. The only other required file is
-        * Content.html for incoming messages (outgoing fallback to use
-        * incoming). */
-       file = g_build_filename (path, "Contents", "Resources", "Incoming",
-                                "Content.html", NULL);
+        * Content.html OR Incoming/Content.html*/
+       file = g_build_filename (path, "Contents", "Resources", "Content.html",
+                                NULL);
        ret = g_file_test (file, G_FILE_TEST_EXISTS);
        g_free (file);
 
+       if (!ret) {
+               file = g_build_filename (path, "Contents", "Resources", "Incoming",
+                                        "Content.html", NULL);
+               ret = g_file_test (file, G_FILE_TEST_EXISTS);
+               g_free (file);
+       }
+
        return ret;
 }
 
@@ -1400,6 +1449,108 @@ empathy_adium_info_new (const gchar *path)
        return info;
 }
 
+static guint
+adium_info_get_version (GHashTable *info)
+{
+       return tp_asv_get_int32 (info, "MessageViewVersion", NULL);
+}
+
+static const gchar *
+adium_info_get_no_variant_name (GHashTable *info)
+{
+       const gchar *name = tp_asv_get_string (info, "DisplayNameForNoVariant");
+       return name ? name : _("Normal");
+}
+
+static const gchar *
+adium_info_get_default_or_first_variant (GHashTable *info)
+{
+       const gchar *name;
+       GPtrArray *variants;
+
+       name = empathy_adium_info_get_default_variant (info);
+       if (name != NULL) {
+               return name;
+       }
+
+       variants = empathy_adium_info_get_available_variants (info);
+       g_assert (variants->len > 0);
+       return g_ptr_array_index (variants, 0);
+}
+
+static gchar *
+adium_info_dup_path_for_variant (GHashTable *info,
+                                const gchar *variant)
+{
+       guint version = adium_info_get_version (info);
+       const gchar *no_variant = adium_info_get_no_variant_name (info);
+
+       if (version <= 2 && !tp_strdiff (variant, no_variant)) {
+               return g_strdup ("main.css");
+       }
+
+       return g_strdup_printf ("Variants/%s.css", variant);
+
+}
+
+const gchar *
+empathy_adium_info_get_default_variant (GHashTable *info)
+{
+       if (adium_info_get_version (info) <= 2) {
+               return adium_info_get_no_variant_name (info);
+       }
+
+       return tp_asv_get_string (info, "DefaultVariant");
+}
+
+GPtrArray *
+empathy_adium_info_get_available_variants (GHashTable *info)
+{
+       GPtrArray *variants;
+       const gchar *path;
+       gchar *dirpath;
+       GDir *dir;
+
+       variants = tp_asv_get_boxed (info, "AvailableVariants", G_TYPE_PTR_ARRAY);
+       if (variants != NULL) {
+               return variants;
+       }
+
+       variants = g_ptr_array_new_with_free_func (g_free);
+       tp_asv_take_boxed (info, g_strdup ("AvailableVariants"),
+               G_TYPE_PTR_ARRAY, variants);
+
+       path = tp_asv_get_string (info, "path");
+       dirpath = g_build_filename (path, "Contents", "Resources", "Variants", NULL);
+       dir = g_dir_open (dirpath, 0, NULL);
+       if (dir != NULL) {
+               const gchar *name;
+
+               for (name = g_dir_read_name (dir);
+                    name != NULL;
+                    name = g_dir_read_name (dir)) {
+                       gchar *display_name;
+
+                       if (!g_str_has_suffix (name, ".css")) {
+                               continue;
+                       }
+
+                       display_name = g_strdup (name);
+                       strstr (display_name, ".css")[0] = '\0';
+                       g_ptr_array_add (variants, display_name);
+               }
+               g_dir_close (dir);
+       }
+       g_free (dirpath);
+
+       if (adium_info_get_version (info) <= 2) {
+               g_ptr_array_add (variants,
+                       g_strdup (adium_info_get_no_variant_name (info)));
+       }
+
+       return variants;
+}
+
 GType
 empathy_adium_data_get_type (void)
 {
@@ -1419,16 +1570,10 @@ EmpathyAdiumData  *
 empathy_adium_data_new_with_info (const gchar *path, GHashTable *info)
 {
        EmpathyAdiumData *data;
-       gchar            *file;
        gchar            *template_html = NULL;
-       gsize             template_len;
        gchar            *footer_html = NULL;
-       gsize             footer_len;
-       GString          *string;
-       gchar           **strv = NULL;
-       gchar            *css_path;
-       guint             len = 0;
-       guint             i = 0;
+       gchar            *variant_path;
+       gchar            *tmp;
 
        g_return_val_if_fail (empathy_adium_path_is_valid (path), NULL);
 
@@ -1438,121 +1583,121 @@ empathy_adium_data_new_with_info (const gchar *path, GHashTable *info)
        data->basedir = g_strconcat (path, G_DIR_SEPARATOR_S "Contents"
                G_DIR_SEPARATOR_S "Resources" G_DIR_SEPARATOR_S, NULL);
        data->info = g_hash_table_ref (info);
+       data->version = adium_info_get_version (info);
+       data->strings_to_free = g_ptr_array_new_with_free_func (g_free);
+
+       DEBUG ("Loading theme at %s", path);
+
+#define LOAD(path, var) \
+               tmp = g_build_filename (data->basedir, path, NULL); \
+               g_file_get_contents (tmp, &var, NULL, NULL); \
+               g_free (tmp); \
+
+#define LOAD_CONST(path, var) \
+       { \
+               gchar *content; \
+               LOAD (path, content); \
+               if (content != NULL) { \
+                       g_ptr_array_add (data->strings_to_free, content); \
+               } \
+               var = content; \
+       }
 
        /* Load html files */
-       file = g_build_filename (data->basedir, "Incoming", "Content.html", NULL);
-       g_file_get_contents (file, &data->in_content_html, &data->in_content_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Incoming", "NextContent.html", NULL);
-       g_file_get_contents (file, &data->in_nextcontent_html, &data->in_nextcontent_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Incoming", "Context.html", NULL);
-       g_file_get_contents (file, &data->in_context_html, &data->in_context_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Incoming", "NextContext.html", NULL);
-       g_file_get_contents (file, &data->in_nextcontext_html, &data->in_nextcontext_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Outgoing", "Content.html", NULL);
-       g_file_get_contents (file, &data->out_content_html, &data->out_content_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Outgoing", "NextContent.html", NULL);
-       g_file_get_contents (file, &data->out_nextcontent_html, &data->out_nextcontent_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Outgoing", "Context.html", NULL);
-       g_file_get_contents (file, &data->out_context_html, &data->out_context_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Outgoing", "NextContext.html", NULL);
-       g_file_get_contents (file, &data->out_nextcontext_html, &data->out_nextcontext_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Status.html", NULL);
-       g_file_get_contents (file, &data->status_html, &data->status_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Footer.html", NULL);
-       g_file_get_contents (file, &footer_html, &footer_len, NULL);
-       g_free (file);
-
-       file = g_build_filename (data->basedir, "Incoming", "buddy_icon.png", NULL);
-       if (g_file_test (file, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
-               data->default_incoming_avatar_filename = file;
-       } else {
-               g_free (file);
+       LOAD_CONST ("Content.html", data->content_html);
+       LOAD_CONST ("Incoming/Content.html", data->in_content_html);
+       LOAD_CONST ("Incoming/NextContent.html", data->in_nextcontent_html);
+       LOAD_CONST ("Incoming/Context.html", data->in_context_html);
+       LOAD_CONST ("Incoming/NextContext.html", data->in_nextcontext_html);
+       LOAD_CONST ("Outgoing/Content.html", data->out_content_html);
+       LOAD_CONST ("Outgoing/NextContent.html", data->out_nextcontent_html);
+       LOAD_CONST ("Outgoing/Context.html", data->out_context_html);
+       LOAD_CONST ("Outgoing/NextContext.html", data->out_nextcontext_html);
+       LOAD_CONST ("Status.html", data->status_html);
+       LOAD ("Template.html", template_html);
+       LOAD ("Footer.html", footer_html);
+
+#undef LOAD_CONST
+#undef LOAD
+
+       /* HTML fallbacks: If we have at least content OR in_content, then
+        * everything else gets a fallback */
+
+#define FALLBACK(html, fallback) \
+       if (html == NULL) { \
+               html = fallback; \
        }
 
-       file = g_build_filename (data->basedir, "Outgoing", "buddy_icon.png", NULL);
-       if (g_file_test (file, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
-               data->default_outgoing_avatar_filename = file;
-       } else {
-               g_free (file);
+       /* in_nextcontent -> in_content -> content */
+       FALLBACK (data->in_content_html,      data->content_html);
+       FALLBACK (data->in_nextcontent_html,  data->in_content_html);
+
+       /* context -> content */
+       FALLBACK (data->in_context_html,      data->in_content_html);
+       FALLBACK (data->in_nextcontext_html,  data->in_nextcontent_html);
+       FALLBACK (data->out_context_html,     data->out_content_html);
+       FALLBACK (data->out_nextcontext_html, data->out_nextcontent_html);
+
+       /* out -> in */
+       FALLBACK (data->out_content_html,     data->in_content_html);
+       FALLBACK (data->out_nextcontent_html, data->in_nextcontent_html);
+       FALLBACK (data->out_context_html,     data->in_context_html);
+       FALLBACK (data->out_nextcontext_html, data->in_nextcontext_html);
+
+       /* status -> in_content */
+       FALLBACK (data->status_html,          data->in_content_html);
+
+#undef FALLBACK
+
+       /* template -> empathy's template */
+       data->custom_template = (template_html != NULL);
+       if (template_html == NULL) {
+               tmp = empathy_file_lookup ("Template.html", "data");
+               g_file_get_contents (tmp, &template_html, NULL, NULL);
+               g_free (tmp);
        }
 
-       css_path = g_build_filename (data->basedir, "main.css", NULL);
-
-       /* There is 2 formats for Template.html: The old one has 4 parameters,
-        * the new one has 5 parameters. */
-       file = g_build_filename (data->basedir, "Template.html", NULL);
-       if (g_file_get_contents (file, &template_html, &template_len, NULL)) {
-               strv = g_strsplit (template_html, "%@", -1);
-               len = g_strv_length (strv);
+       /* Default avatar */
+       tmp = g_build_filename (data->basedir, "Incoming", "buddy_icon.png", NULL);
+       if (g_file_test (tmp, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
+               data->default_incoming_avatar_filename = tmp;
+       } else {
+               g_free (tmp);
        }
-       g_free (file);
-
-       if (len != 5 && len != 6) {
-               /* Either the theme has no template or it don't have the good
-                * number of parameters. Fallback to use our own template. */
-               g_free (template_html);
-               g_strfreev (strv);
-
-               file = empathy_file_lookup ("Template.html", "data");
-               g_file_get_contents (file, &template_html, &template_len, NULL);
-               g_free (file);
-               strv = g_strsplit (template_html, "%@", -1);
-               len = g_strv_length (strv);
+       tmp = g_build_filename (data->basedir, "Outgoing", "buddy_icon.png", NULL);
+       if (g_file_test (tmp, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
+               data->default_outgoing_avatar_filename = tmp;
+       } else {
+               g_free (tmp);
        }
 
-       /* Replace %@ with the needed information in the template html. */
-       string = g_string_sized_new (template_len);
-       g_string_append (string, strv[i++]);
-       g_string_append (string, data->basedir);
-       g_string_append (string, strv[i++]);
-       if (len == 6) {
-               const gchar *variant;
-
-               /* We include main.css by default */
-               g_string_append_printf (string, "@import url(\"%s\");", css_path);
-               g_string_append (string, strv[i++]);
-               variant = tp_asv_get_string (data->info, "DefaultVariant");
-               if (variant) {
-                       g_string_append (string, "Variants/");
-                       g_string_append (string, variant);
-                       g_string_append (string, ".css");
-               }
+       variant_path = adium_info_dup_path_for_variant (info,
+               adium_info_get_default_or_first_variant (info));
+
+       /* Old custom templates had only 4 parameters.
+        * New templates have 5 parameters */
+       if (data->version <= 2 && data->custom_template) {
+               tmp = string_with_format (template_html,
+                       data->basedir,
+                       variant_path,
+                       "", /* The header */
+                       footer_html ? footer_html : "",
+                       NULL);
        } else {
-               /* FIXME: We should set main.css OR the variant css */
-               g_string_append (string, css_path);
+               tmp = string_with_format (template_html,
+                       data->basedir,
+                       data->version <= 2 ? "" : "@import url( \"main.css\" );",
+                       variant_path,
+                       "", /* The header */
+                       footer_html ? footer_html : "",
+                       NULL);
        }
-       g_string_append (string, strv[i++]);
-       g_string_append (string, ""); /* We don't want header */
-       g_string_append (string, strv[i++]);
-       /* FIXME: We should replace adium %macros% in footer */
-       if (footer_html) {
-               g_string_append (string, footer_html);
-       }
-       g_string_append (string, strv[i++]);
-       data->template_html = g_string_free (string, FALSE);
+       g_ptr_array_add (data->strings_to_free, tmp);
+       data->template_html = tmp;
 
-       g_free (footer_html);
        g_free (template_html);
-       g_free (css_path);
-       g_strfreev (strv);
+       g_free (footer_html);
+       g_free (variant_path);
 
        return data;
 }
@@ -1588,20 +1733,12 @@ empathy_adium_data_unref (EmpathyAdiumData *data)
        if (g_atomic_int_dec_and_test (&data->ref_count)) {
                g_free (data->path);
                g_free (data->basedir);
-               g_free (data->template_html);
-               g_free (data->in_content_html);
-               g_free (data->in_nextcontent_html);
-               g_free (data->in_context_html);
-               g_free (data->in_nextcontext_html);
-               g_free (data->out_content_html);
-               g_free (data->out_nextcontent_html);
-               g_free (data->out_context_html);
-               g_free (data->out_nextcontext_html);
                g_free (data->default_avatar_filename);
                g_free (data->default_incoming_avatar_filename);
                g_free (data->default_outgoing_avatar_filename);
-               g_free (data->status_html);
                g_hash_table_unref (data->info);
+               g_ptr_array_unref (data->strings_to_free);
+
                g_slice_free (EmpathyAdiumData, data);
        }
 }
index a8ed19de40bd7f762f7d20a1f582fb02a945bc97..d0ad0170d9ba7b9fcbf525088938c194cefc7b03 100644 (file)
@@ -52,7 +52,10 @@ GType              empathy_theme_adium_get_type (void) G_GNUC_CONST;
 EmpathyThemeAdium *empathy_theme_adium_new      (EmpathyAdiumData *data);
 
 gboolean           empathy_adium_path_is_valid (const gchar *path);
+
 GHashTable        *empathy_adium_info_new (const gchar *path);
+const gchar *      empathy_adium_info_get_default_variant (GHashTable *info);
+GPtrArray *        empathy_adium_info_get_available_variants (GHashTable *info);
 
 #define EMPATHY_TYPE_ADIUM_DATA (empathy_adium_data_get_type ())
 GType              empathy_adium_data_get_type (void) G_GNUC_CONST;
index 1a4f5ae471908a504ccc21f958b88f9fdd7bf899..0dcb40a705af588ca89322cd80ae2d3f25e68143 100644 (file)
@@ -54,6 +54,7 @@ typedef struct {
        gchar       *adium_path;
        GtkSettings *settings;
        GList       *boxes_views;
+       guint        emit_changed_idle;
 } EmpathyThemeManagerPriv;
 
 enum {
@@ -392,6 +393,51 @@ theme_manager_ensure_theme_exists (const gchar *name)
        return FALSE;
 }
 
+typedef enum {
+       THEME_TYPE_UNSET,
+       THEME_TYPE_IRC,
+       THEME_TYPE_BOXED,
+       THEME_TYPE_ADIUM,
+} ThemeType;
+
+static ThemeType
+theme_type (const gchar *name)
+{
+       if (name == NULL) {
+               return THEME_TYPE_UNSET;
+       } else if (!tp_strdiff (name, "classic")) {
+               return THEME_TYPE_IRC;
+       } else if (!tp_strdiff (name, "adium")) {
+               return THEME_TYPE_ADIUM;
+       } else {
+               return THEME_TYPE_BOXED;
+       }
+}
+
+static gboolean
+theme_manager_emit_changed_idle_cb (gpointer manager)
+{
+       EmpathyThemeManagerPriv *priv = GET_PRIV (manager);
+
+       g_signal_emit (manager, signals[THEME_CHANGED], 0, NULL);
+       priv->emit_changed_idle = 0;
+
+       return FALSE;
+}
+
+static void
+theme_manager_emit_changed (EmpathyThemeManager *manager)
+{
+       EmpathyThemeManagerPriv *priv = GET_PRIV (manager);
+
+       /* We emit the signal in idle callback to be sure we emit it only once
+        * in the case both the name and adium_path changed */
+       if (priv->emit_changed_idle == 0) {
+               priv->emit_changed_idle = g_idle_add (
+                       theme_manager_emit_changed_idle_cb, manager);
+       }
+}
+
 static void
 theme_manager_notify_name_cb (GSettings   *gsettings_chat,
                              const gchar *key,
@@ -400,25 +446,29 @@ theme_manager_notify_name_cb (GSettings   *gsettings_chat,
        EmpathyThemeManager     *manager = EMPATHY_THEME_MANAGER (user_data);
        EmpathyThemeManagerPriv *priv = GET_PRIV (manager);
        gchar                   *name;
+       ThemeType                old_type;
+       ThemeType                new_type;
 
        name = g_settings_get_string (gsettings_chat, key);
 
-       if (!theme_manager_ensure_theme_exists (name) ||
-           !tp_strdiff (priv->name, name)) {
-               if (!priv->name) {
-                       priv->name = g_strdup ("classic");
-               }
+       /* Fallback to classic theme if current setting does not exist */
+       if (!theme_manager_ensure_theme_exists (name)) {
+               g_free (name);
+               name = g_strdup ("classic");
+       }
 
+       /* If theme did not change, nothing to do */
+       if (!tp_strdiff (priv->name, name)) {
                g_free (name);
                return;
        }
 
+       old_type = theme_type (priv->name);
        g_free (priv->name);
        priv->name = name;
+       new_type = theme_type (priv->name);
 
-       if (!tp_strdiff (priv->name, "simple") ||
-           !tp_strdiff (priv->name, "clean") ||
-           !tp_strdiff (priv->name, "blue")) {
+       if (new_type == THEME_TYPE_BOXED) {
                GList *l;
 
                /* The theme changes to a boxed one, we can update boxed views */
@@ -428,7 +478,15 @@ theme_manager_notify_name_cb (GSettings   *gsettings_chat,
                }
        }
 
-       g_signal_emit (manager, signals[THEME_CHANGED], 0, NULL);
+       /* Do not emit theme-changed if theme type didn't change, or if it was
+        * unset (the manager is under construction). If theme changed from a
+        * boxed to another boxed, all view are updated in place. If theme
+        * changed from an adium to another adium, the signal will be emited
+        * from theme_manager_notify_adium_path_cb ()
+        */
+       if (old_type != new_type && old_type != THEME_TYPE_UNSET) {
+               theme_manager_emit_changed (manager);
+       }
 }
 
 static void
@@ -439,6 +497,7 @@ theme_manager_notify_adium_path_cb (GSettings   *gsettings_chat,
        EmpathyThemeManager     *manager = EMPATHY_THEME_MANAGER (user_data);
        EmpathyThemeManagerPriv *priv = GET_PRIV (manager);
        gchar                   *adium_path = NULL;
+       gboolean                 was_set;
 
        adium_path = g_settings_get_string (gsettings_chat, key);
 
@@ -447,10 +506,16 @@ theme_manager_notify_adium_path_cb (GSettings   *gsettings_chat,
                return;
        }
 
+       was_set = (priv->adium_path != NULL);
+
        g_free (priv->adium_path);
        priv->adium_path = adium_path;
 
-       g_signal_emit (manager, signals[THEME_CHANGED], 0, NULL);
+       /* Do not emit the signal if path was not set yet (the manager is under
+        * construction) */
+       if (was_set) {
+               theme_manager_emit_changed (manager);
+       }
 }
 
 static void
@@ -470,6 +535,10 @@ theme_manager_finalize (GObject *object)
        }
        g_list_free (priv->boxes_views);
 
+       if (priv->emit_changed_idle != 0) {
+               g_source_remove (priv->emit_changed_idle);
+       }
+
        G_OBJECT_CLASS (empathy_theme_manager_parent_class)->finalize (object);
 }
 
index 680094a547d19e3869c17d934601b1b1b5eaa6e0..620c479e2724a05a65ab304b824a40c80a52f2f6 100644 (file)
@@ -1097,6 +1097,18 @@ empathy_contact_get_status (EmpathyContact *contact)
       empathy_contact_get_presence (contact));
 }
 
+gboolean
+empathy_contact_can_sms (EmpathyContact *contact)
+{
+  EmpathyContactPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
+
+  priv = GET_PRIV (contact);
+
+  return priv->capabilities & EMPATHY_CAPABILITIES_SMS;
+}
+
 gboolean
 empathy_contact_can_voip (EmpathyContact *contact)
 {
@@ -1189,6 +1201,9 @@ empathy_contact_can_do_action (EmpathyContact *self,
       case EMPATHY_ACTION_CHAT:
         sensitivity = TRUE;
         break;
+      case EMPATHY_ACTION_SMS:
+        sensitivity = empathy_contact_can_sms (self);
+        break;
       case EMPATHY_ACTION_AUDIO_CALL:
         sensitivity = empathy_contact_can_voip_audio (self);
         break;
@@ -1729,6 +1744,12 @@ tp_caps_to_capabilities (TpCapabilities *caps)
                     TP_PROP_CHANNEL_TYPE_STREAMED_MEDIA_INITIAL_VIDEO, NULL))
             capabilities |= EMPATHY_CAPABILITIES_VIDEO;
         }
+      else if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_TEXT))
+        {
+          if (tp_asv_get_boolean (fixed_prop,
+                TP_PROP_CHANNEL_INTERFACE_SMS_SMS_CHANNEL, NULL))
+            capabilities |= EMPATHY_CAPABILITIES_SMS;
+        }
     }
 
   return capabilities;
index f9217c108c4780379dcfafc26a82ce3f71a35bb5..16b50e500c4907472cb114b5dcde189e26413129 100644 (file)
@@ -67,6 +67,7 @@ typedef enum {
   EMPATHY_CAPABILITIES_VIDEO = 1 << 1,
   EMPATHY_CAPABILITIES_FT = 1 << 2,
   EMPATHY_CAPABILITIES_RFB_STREAM_TUBE = 1 << 3,
+  EMPATHY_CAPABILITIES_SMS = 1 << 4,
   EMPATHY_CAPABILITIES_UNKNOWN = 1 << 7
 } EmpathyCapabilities;
 
@@ -94,6 +95,7 @@ void empathy_contact_set_is_user (EmpathyContact *contact,
     gboolean is_user);
 gboolean empathy_contact_is_online (EmpathyContact *contact);
 const gchar * empathy_contact_get_status (EmpathyContact *contact);
+gboolean empathy_contact_can_sms (EmpathyContact *contact);
 gboolean empathy_contact_can_voip (EmpathyContact *contact);
 gboolean empathy_contact_can_voip_audio (EmpathyContact *contact);
 gboolean empathy_contact_can_voip_video (EmpathyContact *contact);
@@ -102,6 +104,7 @@ gboolean empathy_contact_can_use_rfb_stream_tube (EmpathyContact *contact);
 
 typedef enum {
   EMPATHY_ACTION_CHAT,
+  EMPATHY_ACTION_SMS,
   EMPATHY_ACTION_AUDIO_CALL,
   EMPATHY_ACTION_VIDEO_CALL,
   EMPATHY_ACTION_VIEW_LOGS,
index ea885dacc273f9d1a9c61fe3b506b17fcbdc8e25..6472230ab30604f4fdeeade433c8de344ecde395 100644 (file)
@@ -58,9 +58,11 @@ ensure_text_channel_cb (GObject *source,
     }
 }
 
-void
-empathy_chat_with_contact_id (TpAccount *account,
-    const gchar *contact_id,
+static void
+create_text_channel (TpAccount *account,
+    TpHandleType target_handle_type,
+    const gchar *target_id,
+    gboolean sms_channel,
     gint64 timestamp)
 {
   GHashTable *request;
@@ -69,39 +71,46 @@ empathy_chat_with_contact_id (TpAccount *account,
   request = tp_asv_new (
       TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
         TP_IFACE_CHANNEL_TYPE_TEXT,
-      TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT, TP_HANDLE_TYPE_CONTACT,
-      TP_PROP_CHANNEL_TARGET_ID, G_TYPE_STRING, contact_id,
+      TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT, target_handle_type,
+      TP_PROP_CHANNEL_TARGET_ID, G_TYPE_STRING, target_id,
       NULL);
 
+  if (sms_channel)
+    tp_asv_set_boolean (request,
+        TP_PROP_CHANNEL_INTERFACE_SMS_SMS_CHANNEL, TRUE);
+
   req = tp_account_channel_request_new (account, request, timestamp);
 
-  tp_account_channel_request_ensure_channel_async (req, EMPATHY_CHAT_BUS_NAME,
-      NULL, ensure_text_channel_cb, NULL);
+  tp_account_channel_request_ensure_channel_async (req, NULL, NULL,
+      ensure_text_channel_cb, NULL);
 
   g_hash_table_unref (request);
   g_object_unref (req);
 }
 
+void
+empathy_chat_with_contact_id (TpAccount *account,
+    const gchar *contact_id,
+    gint64 timestamp)
+{
+       create_text_channel (account, TP_HANDLE_TYPE_CONTACT,
+        contact_id, FALSE, timestamp);
+}
+
 void
 empathy_join_muc (TpAccount *account,
     const gchar *room_name,
     gint64 timestamp)
 {
-  GHashTable *request;
-  TpAccountChannelRequest *req;
-
-  request = tp_asv_new (
-      TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
-        TP_IFACE_CHANNEL_TYPE_TEXT,
-      TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT, TP_HANDLE_TYPE_ROOM,
-      TP_PROP_CHANNEL_TARGET_ID, G_TYPE_STRING, room_name,
-      NULL);
-
-  req = tp_account_channel_request_new (account, request, timestamp);
-
-  tp_account_channel_request_ensure_channel_async (req, EMPATHY_CHAT_BUS_NAME,
-      NULL, ensure_text_channel_cb, NULL);
+       create_text_channel (account, TP_HANDLE_TYPE_ROOM,
+        room_name, FALSE, timestamp);
+}
 
-  g_hash_table_unref (request);
-  g_object_unref (req);
+void
+empathy_sms_contact_id (TpAccount *account,
+    const gchar *contact_id,
+    gint64 timestamp)
+{
+  create_text_channel (account, TP_HANDLE_TYPE_CONTACT,
+      contact_id, TRUE, timestamp);
 }
index afb8013cbe67806e4ed6a0a837db7ddf85866a24..49b98a43364e8e910a1eb605159f08434b35a589 100644 (file)
@@ -52,6 +52,11 @@ void empathy_join_muc (TpAccount *account,
   const gchar *roomname,
   gint64 timestamp);
 
+/* Request a sms channel */
+void empathy_sms_contact_id (TpAccount *account,
+  const gchar *contact_id,
+  gint64 timestamp);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_DISPATCHER_H__ */
index a56c08a3286dd4426d1fea176eb8c444c4645fb2..72c6bebf06271433d45f72798b3e6b5c0ee67284 100644 (file)
@@ -59,6 +59,10 @@ typedef struct {
        gboolean               got_password_flags;
        gboolean               ready;
        gboolean               can_upgrade_to_muc;
+       gboolean               got_sms_channel;
+       gboolean               sms_channel;
+
+       GHashTable            *messages_being_sent;
 } EmpathyTpChatPriv;
 
 static void tp_chat_iface_init         (EmpathyContactListIface *iface);
@@ -70,6 +74,8 @@ enum {
        PROP_REMOTE_CONTACT,
        PROP_PASSWORD_NEEDED,
        PROP_READY,
+       PROP_SMS_CHANNEL,
+       PROP_N_MESSAGES_SENDING,
 };
 
 enum {
@@ -89,6 +95,40 @@ G_DEFINE_TYPE_WITH_CODE (EmpathyTpChat, empathy_tp_chat, G_TYPE_OBJECT,
 
 static void acknowledge_messages (EmpathyTpChat *chat, GArray *ids);
 
+static void
+tp_chat_set_delivery_status (EmpathyTpChat         *self,
+                            const gchar           *token,
+                            EmpathyDeliveryStatus  delivery_status)
+{
+       EmpathyTpChatPriv *priv = GET_PRIV (self);
+       TpDeliveryReportingSupportFlags flags =
+               tp_text_channel_get_delivery_reporting_support (
+                       TP_TEXT_CHANNEL (priv->channel));
+
+       /* channel must support receiving failures and successes */
+       if (!tp_str_empty (token) &&
+           flags & TP_DELIVERY_REPORTING_SUPPORT_FLAG_RECEIVE_FAILURES &&
+           flags & TP_DELIVERY_REPORTING_SUPPORT_FLAG_RECEIVE_SUCCESSES) {
+
+               DEBUG ("Delivery status (%s) = %u", token, delivery_status);
+
+               switch (delivery_status) {
+                       case EMPATHY_DELIVERY_STATUS_NONE:
+                               g_hash_table_remove (priv->messages_being_sent,
+                                       token);
+                               break;
+
+                       default:
+                               g_hash_table_insert (priv->messages_being_sent,
+                                       g_strdup (token),
+                                       GUINT_TO_POINTER (delivery_status));
+                               break;
+               }
+
+               g_object_notify (G_OBJECT (self), "n-messages-sending");
+       }
+}
+
 static void
 tp_chat_invalidated_cb (TpProxy       *proxy,
                        guint          domain,
@@ -319,19 +359,38 @@ handle_delivery_report (EmpathyTpChat *self,
        gboolean valid;
        GPtrArray *echo;
        const gchar *message_body = NULL;
+       const gchar *delivery_dbus_error;
+       const gchar *delivery_token = NULL;
 
        header = tp_message_peek (message, 0);
        if (header == NULL)
                goto out;
 
+       delivery_token = tp_asv_get_string (header, "delivery-token");
        delivery_status = tp_asv_get_uint32 (header, "delivery-status", &valid);
-       if (!valid || delivery_status != TP_DELIVERY_STATUS_PERMANENTLY_FAILED)
+
+       if (!valid) {
+               goto out;
+       } else if (delivery_status == TP_DELIVERY_STATUS_ACCEPTED) {
+               DEBUG ("Accepted %s", delivery_token);
+               tp_chat_set_delivery_status (self, delivery_token,
+                       EMPATHY_DELIVERY_STATUS_ACCEPTED);
                goto out;
+       } else if (delivery_status == TP_DELIVERY_STATUS_DELIVERED) {
+               DEBUG ("Delivered %s", delivery_token);
+               tp_chat_set_delivery_status (self, delivery_token,
+                       EMPATHY_DELIVERY_STATUS_NONE);
+               goto out;
+       } else if (delivery_status != TP_DELIVERY_STATUS_PERMANENTLY_FAILED) {
+               goto out;
+       }
 
        delivery_error = tp_asv_get_uint32 (header, "delivery-error", &valid);
        if (!valid)
                delivery_error = TP_CHANNEL_TEXT_SEND_ERROR_UNKNOWN;
 
+       delivery_dbus_error = tp_asv_get_string (header, "delivery-dbus-error");
+
        /* TODO: ideally we should use tp-glib API giving us the echoed message as a
         * TpMessage. (fdo #35884) */
        echo = tp_asv_get_boxed (header, "delivery-echo",
@@ -344,7 +403,10 @@ handle_delivery_report (EmpathyTpChat *self,
                        message_body = tp_asv_get_string (echo_body, "content");
        }
 
-       g_signal_emit (self, signals[SEND_ERROR], 0, message_body, delivery_error);
+       tp_chat_set_delivery_status (self, delivery_token,
+                       EMPATHY_DELIVERY_STATUS_NONE);
+       g_signal_emit (self, signals[SEND_ERROR], 0, message_body,
+                       delivery_error, delivery_dbus_error);
 
 out:
        tp_text_channel_ack_message_async (TP_TEXT_CHANNEL (priv->channel),
@@ -436,9 +498,10 @@ message_send_cb (GObject *source,
 {
        EmpathyTpChat *chat = user_data;
        TpTextChannel *channel = (TpTextChannel *) source;
+       gchar *token = NULL;
        GError *error = NULL;
 
-       if (!tp_text_channel_send_message_finish (channel, result, NULL, &error)) {
+       if (!tp_text_channel_send_message_finish (channel, result, &token, &error)) {
                DEBUG ("Error: %s", error->message);
 
                /* FIXME: we should use the body of the message as first argument of the
@@ -446,10 +509,14 @@ message_send_cb (GObject *source,
                 * we'll have rebased EmpathyTpChat on top of TpTextChannel we'll be able
                 * to use the user_data pointer to pass the message and fix this. */
                g_signal_emit (chat, signals[SEND_ERROR], 0,
-                              NULL, error_to_text_send_error (error));
+                              NULL, error_to_text_send_error (error), NULL);
 
                g_error_free (error);
        }
+
+       tp_chat_set_delivery_status (chat, token,
+               EMPATHY_DELIVERY_STATUS_SENDING);
+       g_free (token);
 }
 
 typedef struct {
@@ -809,6 +876,7 @@ tp_chat_finalize (GObject *object)
 
        g_queue_free (priv->messages_queue);
        g_queue_free (priv->pending_messages_queue);
+       g_hash_table_destroy (priv->messages_being_sent);
 
        G_OBJECT_CLASS (empathy_tp_chat_parent_class)->finalize (object);
 }
@@ -827,6 +895,9 @@ check_almost_ready (EmpathyTpChat *chat)
        if (!priv->got_password_flags)
                return;
 
+       if (!priv->got_sms_channel)
+               return;
+
        /* We need either the members (room) or the remote contact (private chat).
         * If the chat is protected by a password we can't get these information so
         * consider the chat as ready so it can be presented to the user. */
@@ -1218,6 +1289,41 @@ got_password_flags_cb (TpChannel *proxy,
        check_almost_ready (EMPATHY_TP_CHAT (self));
 }
 
+static void
+sms_channel_changed_cb (TpChannel *channel,
+                       gboolean   sms_channel,
+                       gpointer   user_data,
+                       GObject   *chat)
+{
+       EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+       priv->sms_channel = sms_channel;
+
+       g_object_notify (G_OBJECT (chat), "sms-channel");
+}
+
+static void
+get_sms_channel_cb (TpProxy      *channel,
+                   const GValue *value,
+                   const GError *in_error,
+                   gpointer      user_data,
+                   GObject      *chat)
+{
+       EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+       if (in_error != NULL) {
+               DEBUG ("Failed to get SMSChannel: %s", in_error->message);
+               return;
+       }
+
+       g_return_if_fail (G_VALUE_HOLDS_BOOLEAN (value));
+
+       priv->sms_channel = g_value_get_boolean (value);
+       priv->got_sms_channel = TRUE;
+
+       check_almost_ready (EMPATHY_TP_CHAT (chat));
+}
+
 static GObject *
 tp_chat_constructor (GType                  type,
                     guint                  n_props,
@@ -1327,6 +1433,22 @@ tp_chat_constructor (GType                  type,
                priv->got_password_flags = TRUE;
        }
 
+       /* Check if the chat is for SMS */
+       if (tp_proxy_has_interface_by_id (priv->channel,
+                                         TP_IFACE_QUARK_CHANNEL_INTERFACE_SMS)) {
+               tp_cli_channel_interface_sms_connect_to_sms_channel_changed (
+                       priv->channel,
+                       sms_channel_changed_cb, chat, NULL, G_OBJECT (chat),
+                       NULL);
+
+               tp_cli_dbus_properties_call_get (priv->channel, -1,
+                       TP_IFACE_CHANNEL_INTERFACE_SMS, "SMSChannel",
+                       get_sms_channel_cb, chat, NULL, G_OBJECT (chat));
+       } else {
+               /* if there's no SMS support, then we're not waiting for it */
+               priv->got_sms_channel = TRUE;
+       }
+
        return chat;
 }
 
@@ -1355,6 +1477,13 @@ tp_chat_get_property (GObject    *object,
        case PROP_PASSWORD_NEEDED:
                g_value_set_boolean (value, empathy_tp_chat_password_needed (self));
                break;
+       case PROP_SMS_CHANNEL:
+               g_value_set_boolean (value, priv->sms_channel);
+               break;
+       case PROP_N_MESSAGES_SENDING:
+               g_value_set_uint (value,
+                       g_hash_table_size (priv->messages_being_sent));
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                break;
@@ -1436,6 +1565,22 @@ empathy_tp_chat_class_init (EmpathyTpChatClass *klass)
                                                               FALSE,
                                                               G_PARAM_READABLE));
 
+       g_object_class_install_property (object_class,
+                                        PROP_SMS_CHANNEL,
+                                        g_param_spec_boolean ("sms-channel",
+                                                              "SMS Channel",
+                                                              "TRUE if channel is for sending SMSes",
+                                                              FALSE,
+                                                              G_PARAM_READABLE));
+
+       g_object_class_install_property (object_class,
+                                        PROP_N_MESSAGES_SENDING,
+                                        g_param_spec_uint ("n-messages-sending",
+                                                           "Num Messages Sending",
+                                                           "The number of messages being sent",
+                                                           0, G_MAXUINT, 0,
+                                                           G_PARAM_READABLE));
+
        /* Signals */
        signals[MESSAGE_RECEIVED] =
                g_signal_new ("message-received",
@@ -1453,9 +1598,9 @@ empathy_tp_chat_class_init (EmpathyTpChatClass *klass)
                              G_SIGNAL_RUN_LAST,
                              0,
                              NULL, NULL,
-                             _empathy_marshal_VOID__STRING_UINT,
+                             _empathy_marshal_VOID__STRING_UINT_STRING,
                              G_TYPE_NONE,
-                             2, G_TYPE_STRING, G_TYPE_UINT);
+                             3, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING);
 
        signals[CHAT_STATE_CHANGED] =
                g_signal_new ("chat-state-changed",
@@ -1499,6 +1644,8 @@ empathy_tp_chat_init (EmpathyTpChat *chat)
        chat->priv = priv;
        priv->messages_queue = g_queue_new ();
        priv->pending_messages_queue = g_queue_new ();
+       priv->messages_being_sent = g_hash_table_new_full (
+               g_str_hash, g_str_equal, g_free, NULL);
 }
 
 static void
@@ -1607,7 +1754,8 @@ empathy_tp_chat_send (EmpathyTpChat *chat,
        DEBUG ("Sending message: %s", message_body);
 
        tp_text_channel_send_message_async (TP_TEXT_CHANNEL (priv->channel),
-               message, 0, message_send_cb, chat);
+               message, TP_MESSAGE_SENDING_FLAG_REPORT_DELIVERY,
+               message_send_cb, chat);
 
        g_free (message_body);
 }
@@ -1909,3 +2057,15 @@ empathy_tp_chat_get_self_contact (EmpathyTpChat *self)
 
        return priv->user;
 }
+
+gboolean
+empathy_tp_chat_is_sms_channel (EmpathyTpChat *self)
+{
+       EmpathyTpChatPriv *priv;
+
+       g_return_val_if_fail (EMPATHY_IS_TP_CHAT (self), FALSE);
+
+       priv = GET_PRIV (self);
+
+       return priv->sms_channel;
+}
index 7c998a3fad82e2dd2fc85925ab3f17e151d8f318..83c7fe7d1dc86826b2bdfce1cb048ced591fa86f 100644 (file)
@@ -59,6 +59,12 @@ typedef struct {
        GValue         *value;
 } EmpathyTpChatProperty;
 
+typedef enum {
+       EMPATHY_DELIVERY_STATUS_NONE,
+       EMPATHY_DELIVERY_STATUS_SENDING,
+       EMPATHY_DELIVERY_STATUS_ACCEPTED
+} EmpathyDeliveryStatus;
+
 GType          empathy_tp_chat_get_type             (void) G_GNUC_CONST;
 EmpathyTpChat *empathy_tp_chat_new                  (TpAccount *account,
                                                     TpChannel *channel);
@@ -112,6 +118,8 @@ TpChannelChatState
 
 EmpathyContact * empathy_tp_chat_get_self_contact   (EmpathyTpChat      *self);
 
+gboolean       empathy_tp_chat_is_sms_channel       (EmpathyTpChat      *chat);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_TP_CHAT_H__ */
index f8220ac310b83147856b502fcc28dee72c06c84d..8173f781dffcbeddeaea6db249691612f57fc4ce 100644 (file)
@@ -29,6 +29,7 @@
 #include "config.h"
 
 #include <string.h>
+#include <math.h>
 #include <time.h>
 #include <sys/types.h>
 
@@ -957,3 +958,77 @@ empathy_get_x509_certificate_hostname (gnutls_x509_crt_t cert)
 
   return NULL;
 }
+
+gchar *
+empathy_format_currency (gint         amount,
+                        guint        scale,
+                        const gchar *currency)
+{
+#define MINUS "\342\210\222"
+#define EURO "\342\202\254"
+#define YEN "\302\245"
+#define POUND "\302\243"
+
+       /* localised representations of currency */
+       /* FIXME: check these, especially negatives and decimals */
+       static const struct {
+               const char *currency;
+               const char *positive;
+               const char *negative;
+               const char *decimal;
+       } currencies[] = {
+               /* sym   positive    negative          decimal */
+               { "EUR", EURO "%s",  MINUS EURO "%s",  "." },
+               { "USD", "$%s",      MINUS "$%s",      "." },
+               { "JPY", YEN "%s"    MINUS YEN "%s",   "." },
+               { "GBP", POUND "%s", MINUS POUND "%s", "." },
+               { "PLN", "%s zl",    MINUS "%s zl",    "." },
+               { "BRL", "R$%s",     MINUS "R$%s",     "." },
+               { "SEK", "%s kr",    MINUS "%s kr",    "." },
+               { "DKK", "kr %s",    "kr " MINUS "%s", "." },
+               { "HKD", "$%s",      MINUS "$%s",      "." },
+               { "CHF", "%s Fr.",   MINUS "%s Fr.",   "." },
+               { "NOK", "kr %s",    "kr" MINUS "%s",  "," },
+               { "CAD", "$%s",      MINUS "$%s",      "." },
+               { "TWD", "$%s",      MINUS "$%s",      "." },
+               { "AUD", "$%s",      MINUS "$%s",      "." },
+       };
+
+       const char *positive = "%s";
+       const char *negative = MINUS "%s";
+       const char *decimal = ".";
+       char *fmt_amount, *money;
+       guint i;
+
+       /* get the localised currency format */
+       for (i = 0; i < G_N_ELEMENTS (currencies); i++) {
+               if (!tp_strdiff (currency, currencies[i].currency)) {
+                       positive = currencies[i].positive;
+                       negative = currencies[i].negative;
+                       decimal = currencies[i].decimal;
+                       break;
+               }
+       }
+
+       /* format the amount using the scale */
+       if (scale == 0) {
+               /* no decimal point required */
+               fmt_amount = g_strdup_printf ("%d", amount);
+       } else {
+               /* don't use floating point arithmatic, it's noisy;
+                * we take the absolute values, because we want the minus
+                * sign to appear before the $ */
+               int divisor = pow (10, scale);
+               int dollars = abs (amount / divisor);
+               int cents = abs (amount % divisor);
+
+               fmt_amount = g_strdup_printf ("%d%s%0*d",
+                       dollars, decimal, scale, cents);
+       }
+
+       money = g_strdup_printf (amount < 0 ? negative : positive, fmt_amount);
+       g_free (fmt_amount);
+
+       return money;
+}
+
index de879021e7bf397228472c4b5cb837d9960905bc..ac44535b80384d1c2c55021dbd8a160cb267ac8b 100644 (file)
@@ -117,6 +117,8 @@ gboolean empathy_folks_persona_is_interesting (FolksPersona *persona);
 
 gchar * empathy_get_x509_certificate_hostname (gnutls_x509_crt_t cert);
 
+gchar *empathy_format_currency (gint amount, guint scale, const gchar *currency);
+
 /* Copied from wocky/wocky-utils.h */
 
 #define empathy_implement_finish_void(source, tag) \
index 12bec08981fa2a1d255a3df255c9af38bccbd078..7a78f2558c885b195451c0aec5f5692a7ea89a40 100644 (file)
@@ -116,3 +116,4 @@ src/empathy-debugger.c
 src/empathy-chat.c
 src/empathy-notifications-approver.c
 src/empathy-call-observer.c
+libempathy-gtk/empathy-search-bar.c
index cacaa6341c957b52c13a12d32bdd61ea9d24ef91..a213e62340c2bd52e0be67c3012dc5cd386f02ec 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -1,23 +1,23 @@
 # translation of empathy.master.po to Español
 # Copyright (C) 2003 Free Software Foundation
 # This file is distributed under the same license as the Gossip package.
-# Jorge González <jorgegonz@svn.gnome.org>, 2007, 2008, 2009, 2010.
 # Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011.
+# Jorge González <jorgegonz@svn.gnome.org>, 2007, 2008, 2009, 2010, 2011.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: empathy.master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
-"product=empathy&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2011-04-26 12:21+0000\n"
-"PO-Revision-Date: 2011-04-27 12:36+0200\n"
-"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
+"product=empathy&keywords=I18N+L10N&component=General\n"
+"POT-Creation-Date: 2011-05-05 17:44+0000\n"
+"PO-Revision-Date: 2011-05-08 15:25+0200\n"
+"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
 "Language-Team: Español <gnome-es-list@gnome.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
 #: ../data/empathy.desktop.in.in.h:1
 msgid "Chat on Google Talk, Facebook, MSN and many other chat services"
@@ -72,7 +72,7 @@ msgstr "Criterio de ordenación de la lista de contactos"
 
 #: ../data/org.gnome.Empathy.gschema.xml.in.h:8
 msgid "Default directory to select an avatar image from"
-msgstr "Directorio predeterminado para seleccionar un avatar"
+msgstr "Carpeta predeterminada para seleccionar un avatar"
 
 #: ../data/org.gnome.Empathy.gschema.xml.in.h:9
 msgid "Disable popup notifications when away"
@@ -213,122 +213,126 @@ msgid "Pop up notifications when a contact logs out"
 msgstr "Mostrar notificaciones emergentes cuando un contacto se desconecta"
 
 #: ../data/org.gnome.Empathy.gschema.xml.in.h:42
+msgid "Show Balance in roster"
+msgstr "Mostrar crédito en la lista de contactos"
+
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:43
 msgid "Show avatars"
 msgstr "Mostrar avatares"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:43
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:44
 msgid "Show contact list in rooms"
 msgstr "Mostrar lista de contactos en salas"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:44
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:45
 msgid "Show hint about closing the main window"
 msgstr "Mostrar consejo sobre cómo cerrar la ventana principal"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:45
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:46
 msgid "Show offline contacts"
 msgstr "Mostrar contactos no conectados"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:46
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:47
 msgid "Show protocols"
 msgstr "Mostrar protocolos"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:47
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:48
 msgid "Spell checking languages"
 msgstr "Idiomas para revisión ortográfica"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:48
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:49
 msgid "The default folder to save file transfers in."
 msgstr "La carpeta predeterminada donde guardar los archivos transferidos."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:49
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:50
 msgid "The last directory that an avatar image was chosen from."
-msgstr "Último directorio del que fue elegido un avatar."
+msgstr "Última carpeta de la que se eligió un avatar."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:50
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:51
 msgid "The position for the chat window side pane"
 msgstr "La posición para el panel lateral de la ventana de charla"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:51
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:52
 msgid "The stored position (in pixels) of the chat window side pane."
 msgstr ""
 "La posición almacenada (en píxeles) del panel lateral de la ventana de "
 "charla."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:52
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:53
 msgid "The theme that is used to display the conversation in chat windows."
 msgstr ""
 "El tema que se usará para mostrar la conversación en las ventanas de chat."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:53
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:54
 msgid "Use graphical smileys"
 msgstr "Usar emoticonos gráficos"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:54
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:55
 msgid "Use notification sounds"
 msgstr "Usar sonidos de notificación"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:55
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:56
 msgid "Use theme for chat rooms"
 msgstr "Usar tema para salas de chat"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:56
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:57
 msgid "Whether Empathy can publish the user's location to their contacts."
 msgstr ""
 "Indica si Empathy puede publicar la ubicación del usuario a sus contactos."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:57
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:58
 msgid "Whether Empathy can use the GPS to guess the location."
 msgstr "Indica si Empathy puede usar el GPS para deducir la ubicación."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:58
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:59
 msgid "Whether Empathy can use the cellular network to guess the location."
 msgstr ""
 "Indica si Empathy puede usar la red telefónica móvil para deducir la "
 "ubicación."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:59
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:60
 msgid "Whether Empathy can use the network to guess the location."
 msgstr "Indica si Empathy puede usar la red para deducir la ubicación."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:60
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:61
 msgid "Whether Empathy has migrated butterfly logs."
 msgstr "Indica si Empathy ha migrado los registros de butterfly."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:61
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:62
 msgid "Whether Empathy should automatically log into your accounts on startup."
 msgstr ""
 "Indica si Empathy debe iniciar sesión en sus cuentas automáticamente al "
 "inicio."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:62
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:63
 msgid ""
 "Whether Empathy should go into away mode automatically if the user is idle."
 msgstr ""
 "Indica si Empathy debe entrar en modo de ausencia automáticamente si el "
 "usuario está inactivo."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:63
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:64
 msgid ""
 "Whether Empathy should reduce the location's accuracy for privacy reasons."
 msgstr ""
 "Indica si Empathy debería reducir la precisión de la ubicación por motivos "
 "de privacidad."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:64
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:65
 msgid ""
 "Whether Empathy should use the avatar of the contact as the chat window icon."
 msgstr ""
 "Indica si Empathy debería usar el avatar del contacto como el icono de la "
 "ventana de chat."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:65
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:66
 msgid ""
 "Whether WebKit developer tools, such as the Web Inspector, should be enabled."
 msgstr ""
 "Indica si las herramientas de desarrollo de WebKit, tales como el Inspector "
 "web, den activarse."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:66
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:67
 msgid ""
 "Whether connectivity managers should be used to automatically disconnect/"
 "reconnect."
@@ -336,78 +340,78 @@ msgstr ""
 "Indica si se debe usan usar gestores de conectividad para desconectarse/"
 "reconectarse automáticamente."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:67
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:68
 msgid ""
 "Whether to check words typed against the languages you want to check with."
 msgstr ""
 "Indica si se deben revisar las palabras tecleadas con respecto a los idiomas "
 "con los que quiere comprobarlo."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:68
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:69
 msgid "Whether to convert smileys into graphical images in conversations."
 msgstr ""
 "Indica si se deben convertir los emoticonos en imágenes gráficas en las "
 "conversaciones."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:69
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:70
 msgid "Whether to play a sound to notify of contacts logging into the network."
 msgstr ""
 "Indica si se debe reproducir un sonido para notificar los inicios de sesión "
 "de los contactos en la red."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:70
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:71
 msgid ""
 "Whether to play a sound to notify of contacts logging out of the network."
 msgstr ""
 "Indica si se debe reproducir un sonido para notificar las finalizaciones de "
 "sesión de los contactos en la red."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:71
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:72
 msgid "Whether to play a sound to notify of events."
 msgstr "Indica si se debe reproducir un sonido para notificar eventos."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:72
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:73
 msgid "Whether to play a sound to notify of incoming messages."
 msgstr ""
 "Indica si se debe reproducir un sonido para notificar mensajes entrantes."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:73
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:74
 msgid "Whether to play a sound to notify of new conversations."
 msgstr ""
 "Indica si se debe reproducir un sonido para notificar conversaciones nuevas."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:74
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:75
 msgid "Whether to play a sound to notify of outgoing messages."
 msgstr ""
 "Indica si se debe reproducir un sonido para notificar mensajes salientes."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:75
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:76
 msgid "Whether to play a sound when logging into a network."
 msgstr "Indica si se debe reproducir un sonido al iniciar sesión en una red."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:76
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:77
 msgid "Whether to play a sound when logging out of a network."
 msgstr "Indica si se debe reproducir un sonido al finalizar sesión en una red."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:77
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:78
 msgid "Whether to play sound notifications when away or busy."
 msgstr ""
 "Indica si se deben reproducir sonidos de notificaciones cuando se esté "
 "ausente u ocupado."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:78
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:79
 msgid "Whether to show a popup notification when a contact goes offline."
 msgstr ""
 "Indica si se deben mostrar las notificaciones emergentes cuando un contacto "
 "se desconecta."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:79
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:80
 msgid "Whether to show a popup notification when a contact goes online."
 msgstr ""
 "Indica si se deben mostrar las notificaciones emergentes cuando un contacto "
 "se conecta."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:80
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:81
 msgid ""
 "Whether to show a popup notification when receiving a new message even if "
 "the chat is already opened, but not focused."
@@ -415,46 +419,50 @@ msgstr ""
 "Indica si de deben mostrar notificaciones emergentes al recibir un mensaje "
 "nuevo incluso si la ventana de chat ya está abierta pero no tiene el foco."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:81
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:82
 msgid "Whether to show a popup notification when receiving a new message."
 msgstr ""
 "Indica si se deben mostrar notificaciones emergentes al recibir un mensaje "
 "nuevo."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:82
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:83
+msgid "Whether to show account balances for in the contact roster."
+msgstr "Indica si se debe mostrar el crédito en la lista de contactos."
+
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:84
 msgid ""
 "Whether to show avatars for contacts in the contact list and chat windows."
 msgstr ""
 "Indica si se deben mostrar los avatares para los contactos en la lista de "
 "contactos y ventanas de chat."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:83
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:85
 msgid "Whether to show contacts that are offline in the contact list."
 msgstr ""
 "Indica si se debe mostrar los contactos que están desconectados en la lista "
 "de contactos."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:84
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:86
 msgid "Whether to show popup notifications when away or busy."
 msgstr ""
 "Indica si se deben mostrar las notificaciones emergentes cuando se esté "
 "ausente u ocupado."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:85
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:87
 msgid "Whether to show protocols for contacts in the contact list."
 msgstr ""
 "Indica si se deben mostrar los protocolos para los contactos en la lista de "
 "contactos."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:86
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:88
 msgid "Whether to show the contact list in chat rooms."
 msgstr "Indica si se debe mostrar la lista de contactos en salas de chat."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:87
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:89
 msgid "Whether to show the contact list in compact mode."
 msgstr "Indica si se debe mostrar la lista de contactos en modo compacto."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:88
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:90
 msgid ""
 "Whether to show the message dialog about closing the main window with the "
 "'x' button in the title bar."
@@ -462,11 +470,11 @@ msgstr ""
 "Indica si se debe mostrar un mensaje de diálogo sobre cómo cerrar la ventana "
 "principal con el botón «x» en la barra de título."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:89
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:91
 msgid "Whether to use the theme for chat rooms."
 msgstr "Indica si se debe usar el tema para salas de chat."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:90
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:92
 msgid ""
 "Which criterion to use when sorting the contact list. Default is to sort by "
 "the contact's name with the value \"name\". A value of \"state\" will sort "
@@ -482,7 +490,7 @@ msgstr "Gestionar las cuentas de mensajería y Voz IP"
 
 #. Tweak the dialog
 #: ../data/empathy-accounts.desktop.in.in.h:2
-#: ../src/empathy-accounts-dialog.c:2340
+#: ../src/empathy-accounts-dialog.c:2320
 msgid "Messaging and VoIP Accounts"
 msgstr "Cuentas de mensajería y Voz IP"
 
@@ -530,144 +538,143 @@ msgstr "Error la intentar transferir el archivo"
 msgid "The other participant is unable to transfer the file"
 msgstr "El otro participante no puede transferir el archivo"
 
-#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:383
+#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:384
 msgid "Unknown reason"
 msgstr "Razón desconocida"
 
-#: ../libempathy/empathy-utils.c:304
+#: ../libempathy/empathy-utils.c:305
 msgid "Available"
 msgstr "Disponible"
 
-#: ../libempathy/empathy-utils.c:306
+#: ../libempathy/empathy-utils.c:307
 msgid "Busy"
 msgstr "Ocupado"
 
-#: ../libempathy/empathy-utils.c:309
+#: ../libempathy/empathy-utils.c:310
 msgid "Away"
 msgstr "Ausente"
 
-#: ../libempathy/empathy-utils.c:311
+#: ../libempathy/empathy-utils.c:312
 msgid "Invisible"
 msgstr "Invisible"
 
-#: ../libempathy/empathy-utils.c:313
+#: ../libempathy/empathy-utils.c:314
 msgid "Offline"
 msgstr "Desconectado"
 
 #. translators: presence type is unknown
-#: ../libempathy/empathy-utils.c:316
-#| msgid "Unknown"
+#: ../libempathy/empathy-utils.c:317
 msgctxt "presence"
 msgid "Unknown"
 msgstr "Desconocido"
 
-#: ../libempathy/empathy-utils.c:355
+#: ../libempathy/empathy-utils.c:356
 msgid "No reason specified"
 msgstr "No se especificó ninguna razón"
 
-#: ../libempathy/empathy-utils.c:357 ../libempathy/empathy-utils.c:413
+#: ../libempathy/empathy-utils.c:358 ../libempathy/empathy-utils.c:414
 msgid "Status is set to offline"
 msgstr "El estado se ha establecido a desconectado"
 
-#: ../libempathy/empathy-utils.c:359 ../libempathy/empathy-utils.c:393
+#: ../libempathy/empathy-utils.c:360 ../libempathy/empathy-utils.c:394
 msgid "Network error"
 msgstr "Error de red"
 
-#: ../libempathy/empathy-utils.c:361 ../libempathy/empathy-utils.c:395
+#: ../libempathy/empathy-utils.c:362 ../libempathy/empathy-utils.c:396
 msgid "Authentication failed"
 msgstr "Falló la autenticación"
 
-#: ../libempathy/empathy-utils.c:363 ../libempathy/empathy-utils.c:397
+#: ../libempathy/empathy-utils.c:364 ../libempathy/empathy-utils.c:398
 msgid "Encryption error"
 msgstr "Error de cifrado"
 
-#: ../libempathy/empathy-utils.c:365
+#: ../libempathy/empathy-utils.c:366
 msgid "Name in use"
 msgstr "Nombre en uso"
 
-#: ../libempathy/empathy-utils.c:367 ../libempathy/empathy-utils.c:399
+#: ../libempathy/empathy-utils.c:368 ../libempathy/empathy-utils.c:400
 msgid "Certificate not provided"
 msgstr "No se proporcionó el certificado"
 
-#: ../libempathy/empathy-utils.c:369 ../libempathy/empathy-utils.c:401
+#: ../libempathy/empathy-utils.c:370 ../libempathy/empathy-utils.c:402
 msgid "Certificate untrusted"
 msgstr "Certificado sin confianza"
 
-#: ../libempathy/empathy-utils.c:371 ../libempathy/empathy-utils.c:403
+#: ../libempathy/empathy-utils.c:372 ../libempathy/empathy-utils.c:404
 msgid "Certificate expired"
 msgstr "El certificado ha expirado"
 
-#: ../libempathy/empathy-utils.c:373 ../libempathy/empathy-utils.c:405
+#: ../libempathy/empathy-utils.c:374 ../libempathy/empathy-utils.c:406
 msgid "Certificate not activated"
 msgstr "El certificado no está activado"
 
-#: ../libempathy/empathy-utils.c:375 ../libempathy/empathy-utils.c:407
+#: ../libempathy/empathy-utils.c:376 ../libempathy/empathy-utils.c:408
 msgid "Certificate hostname mismatch"
 msgstr "El nombre del equipo del certificado no coincide"
 
-#: ../libempathy/empathy-utils.c:377 ../libempathy/empathy-utils.c:409
+#: ../libempathy/empathy-utils.c:378 ../libempathy/empathy-utils.c:410
 msgid "Certificate fingerprint mismatch"
 msgstr "La huella del certificado no coincide"
 
-#: ../libempathy/empathy-utils.c:379 ../libempathy/empathy-utils.c:411
+#: ../libempathy/empathy-utils.c:380 ../libempathy/empathy-utils.c:412
 msgid "Certificate self-signed"
 msgstr "Certificado firmado consigo mismo"
 
-#: ../libempathy/empathy-utils.c:381
+#: ../libempathy/empathy-utils.c:382
 msgid "Certificate error"
 msgstr "Error del certificado"
 
-#: ../libempathy/empathy-utils.c:415
+#: ../libempathy/empathy-utils.c:416
 msgid "Encryption is not available"
 msgstr "El cifrado no está disponible"
 
-#: ../libempathy/empathy-utils.c:417
+#: ../libempathy/empathy-utils.c:418
 msgid "Certificate is invalid"
 msgstr "El certificado no es válido"
 
-#: ../libempathy/empathy-utils.c:419
+#: ../libempathy/empathy-utils.c:420
 msgid "Connection has been refused"
 msgstr "Se rechazó la conexión"
 
-#: ../libempathy/empathy-utils.c:421
+#: ../libempathy/empathy-utils.c:422
 msgid "Connection can't be established"
 msgstr "No se pudo establecer la conexión"
 
-#: ../libempathy/empathy-utils.c:423
+#: ../libempathy/empathy-utils.c:424
 msgid "Connection has been lost"
 msgstr "Se perdió la conexión"
 
-#: ../libempathy/empathy-utils.c:425
+#: ../libempathy/empathy-utils.c:426
 msgid "This resource is already connected to the server"
 msgstr "El recurso ya está conectado al servidor"
 
-#: ../libempathy/empathy-utils.c:427
+#: ../libempathy/empathy-utils.c:428
 msgid ""
 "Connection has been replaced by a new connection using the same resource"
 msgstr ""
 "Se ha reemplazado la conexión por una conexión nueva usando el mismo recurso"
 
-#: ../libempathy/empathy-utils.c:430
+#: ../libempathy/empathy-utils.c:431
 msgid "The account already exists on the server"
 msgstr "La cuenta ya existe en el servidor"
 
-#: ../libempathy/empathy-utils.c:432
+#: ../libempathy/empathy-utils.c:433
 msgid "Server is currently too busy to handle the connection"
 msgstr ""
 "Actualmente el servidor está demasiado ocupado para gestionar la conexión"
 
-#: ../libempathy/empathy-utils.c:434
+#: ../libempathy/empathy-utils.c:435
 msgid "Certificate has been revoked"
 msgstr "Se revocó el certificado"
 
-#: ../libempathy/empathy-utils.c:436
+#: ../libempathy/empathy-utils.c:437
 msgid ""
 "Certificate uses an insecure cipher algorithm or is cryptographically weak"
 msgstr ""
 "El certificado usa un algoritmo de cifrado inseguro o es criptográficamente "
 "débil"
 
-#: ../libempathy/empathy-utils.c:439
+#: ../libempathy/empathy-utils.c:440
 msgid ""
 "The length of the server certificate, or the depth of the server certificate "
 "chain, exceed the limits imposed by the cryptography library"
@@ -676,20 +683,20 @@ msgstr ""
 "servidor de certificados exceden los límites impuestos por la biblioteca "
 "cripotográfica"
 
-#: ../libempathy/empathy-utils.c:602
+#: ../libempathy/empathy-utils.c:603
 #: ../libempathy-gtk/empathy-contact-list-store.h:73
 msgid "People Nearby"
 msgstr "Gente cerca"
 
-#: ../libempathy/empathy-utils.c:607
+#: ../libempathy/empathy-utils.c:608
 msgid "Yahoo! Japan"
 msgstr "Yahoo Japón"
 
-#: ../libempathy/empathy-utils.c:636
+#: ../libempathy/empathy-utils.c:637
 msgid "Google Talk"
 msgstr "Google Talk"
 
-#: ../libempathy/empathy-utils.c:637
+#: ../libempathy/empathy-utils.c:638
 msgid "Facebook Chat"
 msgstr "Chat de Facebook"
 
@@ -812,19 +819,19 @@ msgstr "Ca_ncelar"
 #. * like: "MyUserName on freenode".
 #. * You should reverse the order of these arguments if the
 #. * server should come before the login id in your locale.
-#: ../libempathy-gtk/empathy-account-widget.c:2413
+#: ../libempathy-gtk/empathy-account-widget.c:2410
 #, c-format
 msgid "%1$s on %2$s"
 msgstr "%1$s en %2$s"
 
 #. To translators: The parameter is the protocol name. The resulting
 #. * string will be something like: "Jabber Account"
-#: ../libempathy-gtk/empathy-account-widget.c:2439
+#: ../libempathy-gtk/empathy-account-widget.c:2436
 #, c-format
 msgid "%s Account"
 msgstr "Cuenta %s"
 
-#: ../libempathy-gtk/empathy-account-widget.c:2443
+#: ../libempathy-gtk/empathy-account-widget.c:2440
 msgid "New account"
 msgstr "Cuenta nueva"
 
@@ -1252,35 +1259,35 @@ msgstr "Todos los archivos"
 msgid "Click to enlarge"
 msgstr "Pulse para agrandar"
 
-#: ../libempathy-gtk/empathy-chat.c:652
+#: ../libempathy-gtk/empathy-chat.c:668
 msgid "Failed to open private chat"
 msgstr "Falló al abrir el chat privado"
 
-#: ../libempathy-gtk/empathy-chat.c:717
+#: ../libempathy-gtk/empathy-chat.c:733
 msgid "Topic not supported on this conversation"
 msgstr "El tema no está soportado en esta conversación"
 
-#: ../libempathy-gtk/empathy-chat.c:723
+#: ../libempathy-gtk/empathy-chat.c:739
 msgid "You are not allowed to change the topic"
 msgstr "No le está permitido cambiar el tema"
 
-#: ../libempathy-gtk/empathy-chat.c:932
+#: ../libempathy-gtk/empathy-chat.c:948
 msgid "/clear: clear all messages from the current conversation"
 msgstr "/clear: limpiar todos los mensajes de la conversación actual"
 
-#: ../libempathy-gtk/empathy-chat.c:935
+#: ../libempathy-gtk/empathy-chat.c:951
 msgid "/topic <topic>: set the topic of the current conversation"
 msgstr "/topic <tema>: establecer el tema para la conversación actual"
 
-#: ../libempathy-gtk/empathy-chat.c:938
+#: ../libempathy-gtk/empathy-chat.c:954
 msgid "/join <chat room ID>: join a new chat room"
 msgstr "/join <id de sala de chat>: unirse a una sala de chat nueva"
 
-#: ../libempathy-gtk/empathy-chat.c:941
+#: ../libempathy-gtk/empathy-chat.c:957
 msgid "/j <chat room ID>: join a new chat room"
 msgstr "/j <id de sala de chat>: unirse a una sala de chat nueva"
 
-#: ../libempathy-gtk/empathy-chat.c:946
+#: ../libempathy-gtk/empathy-chat.c:962
 msgid ""
 "/part [<chat room ID>] [<reason>]: leave the chat room, by default the "
 "current one"
@@ -1288,23 +1295,23 @@ msgstr ""
 "/part [<ID de la sala de chat>] [<razón>]: abandonar la sala de chat, la "
 "actual de manera predeterminada"
 
-#: ../libempathy-gtk/empathy-chat.c:951
+#: ../libempathy-gtk/empathy-chat.c:967
 msgid "/query <contact ID> [<message>]: open a private chat"
 msgstr "/query <id del contacto> [<mensaje>]: abrir un chat privado"
 
-#: ../libempathy-gtk/empathy-chat.c:954
+#: ../libempathy-gtk/empathy-chat.c:970
 msgid "/msg <contact ID> <message>: open a private chat"
 msgstr "/msg <id del contacto> <mensaje>: abrir un chat privado"
 
-#: ../libempathy-gtk/empathy-chat.c:957
+#: ../libempathy-gtk/empathy-chat.c:973
 msgid "/nick <nickname>: change your nickname on the current server"
 msgstr "/nick <apodo>: cambiar su apodo en el servidor actual"
 
-#: ../libempathy-gtk/empathy-chat.c:960
+#: ../libempathy-gtk/empathy-chat.c:976
 msgid "/me <message>: send an ACTION message to the current conversation"
 msgstr "/me <mensaje>: enviar un mensaje de ACCIÓN a la conversación actual"
 
-#: ../libempathy-gtk/empathy-chat.c:963
+#: ../libempathy-gtk/empathy-chat.c:979
 msgid ""
 "/say <message>: send <message> to the current conversation. This is used to "
 "send a message starting with a '/'. For example: \"/say /join is used to "
@@ -1314,7 +1321,7 @@ msgstr ""
 "para enviar un mensaje comenzando por una «/». Por ejemplo: «/say /join se usa "
 "para unirse a una sala de chat nueva»"
 
-#: ../libempathy-gtk/empathy-chat.c:968
+#: ../libempathy-gtk/empathy-chat.c:984
 msgid ""
 "/help [<command>]: show all supported commands. If <command> is defined, "
 "show its usage."
@@ -1322,104 +1329,111 @@ msgstr ""
 "/help [<comando>]: mostrar todos los comandos soportados. Si <comando> está "
 "definido, muestra su uso."
 
-#: ../libempathy-gtk/empathy-chat.c:978
+#: ../libempathy-gtk/empathy-chat.c:994
 #, c-format
 msgid "Usage: %s"
 msgstr "Uso: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1017
+#: ../libempathy-gtk/empathy-chat.c:1033
 msgid "Unknown command"
 msgstr "Comando desconocido"
 
-#: ../libempathy-gtk/empathy-chat.c:1143
+#: ../libempathy-gtk/empathy-chat.c:1159
 msgid "Unknown command; see /help for the available commands"
 msgstr "Comando desconocido; consulte /help para ver los comandos disponibles"
 
-#: ../libempathy-gtk/empathy-chat.c:1281
+#: ../libempathy-gtk/empathy-chat.c:1297
+msgid "insufficient balance to send message"
+msgstr "no tiene balance suficiente para enviar el mensaje"
+
+#: ../libempathy-gtk/empathy-chat.c:1299
+msgid "not capable"
+msgstr "no es posible"
+
+#: ../libempathy-gtk/empathy-chat.c:1306
 msgid "offline"
 msgstr "desconectado"
 
-#: ../libempathy-gtk/empathy-chat.c:1284
+#: ../libempathy-gtk/empathy-chat.c:1309
 msgid "invalid contact"
 msgstr "contacto no válido"
 
-#: ../libempathy-gtk/empathy-chat.c:1287
+#: ../libempathy-gtk/empathy-chat.c:1312
 msgid "permission denied"
 msgstr "permiso denegado"
 
-#: ../libempathy-gtk/empathy-chat.c:1290
+#: ../libempathy-gtk/empathy-chat.c:1315
 msgid "too long message"
 msgstr "mensaje demasiado largo"
 
-#: ../libempathy-gtk/empathy-chat.c:1293
+#: ../libempathy-gtk/empathy-chat.c:1318
 msgid "not implemented"
 msgstr "no implementado"
 
-#: ../libempathy-gtk/empathy-chat.c:1297
+#: ../libempathy-gtk/empathy-chat.c:1322
 msgid "unknown"
 msgstr "desconocido"
 
-#: ../libempathy-gtk/empathy-chat.c:1302
+#: ../libempathy-gtk/empathy-chat.c:1328
 #, c-format
 msgid "Error sending message '%s': %s"
 msgstr "Error al enviar el mensaje «%s»: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1306
+#: ../libempathy-gtk/empathy-chat.c:1332
 #, c-format
-#| msgid "Error sending message '%s': %s"
 msgid "Error sending message: %s"
 msgstr "Error al enviar el mensaje: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1367 ../src/empathy-chat-window.c:717
+#: ../libempathy-gtk/empathy-chat.c:1393 ../src/empathy-chat-window.c:760
 msgid "Topic:"
 msgstr "Tema:"
 
-#: ../libempathy-gtk/empathy-chat.c:1379
+#: ../libempathy-gtk/empathy-chat.c:1405
 #, c-format
 msgid "Topic set to: %s"
 msgstr "El tema se ha establecido a: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1381
+#: ../libempathy-gtk/empathy-chat.c:1407
 msgid "No topic defined"
 msgstr "No se ha definido el tema"
 
-#: ../libempathy-gtk/empathy-chat.c:1880
+#: ../libempathy-gtk/empathy-chat.c:1914
 msgid "(No Suggestions)"
 msgstr "(Sin sugerencias)"
 
 #. translators: %s is the selected word
-#: ../libempathy-gtk/empathy-chat.c:1948
+#: ../libempathy-gtk/empathy-chat.c:1982
 #, c-format
 msgid "Add '%s' to Dictionary"
 msgstr "Añadir «%s» al diccionario"
 
 #. translators: first %s is the selected word,
 #. * second %s is the language name of the target dictionary
-#: ../libempathy-gtk/empathy-chat.c:1985
+#: ../libempathy-gtk/empathy-chat.c:2019
 #, c-format
 msgid "Add '%s' to %s Dictionary"
 msgstr "Añadir «%s» al diccionario de «%s»"
 
-#: ../libempathy-gtk/empathy-chat.c:2042
+#: ../libempathy-gtk/empathy-chat.c:2076
 msgid "Insert Smiley"
 msgstr "Insertar emoticono"
 
 #. send button
-#: ../libempathy-gtk/empathy-chat.c:2060
+#: ../libempathy-gtk/empathy-chat.c:2094
 #: ../libempathy-gtk/empathy-ui-utils.c:1808
 msgid "_Send"
 msgstr "E_nviar"
 
 #. Spelling suggestions
-#: ../libempathy-gtk/empathy-chat.c:2095
+#: ../libempathy-gtk/empathy-chat.c:2129
 msgid "_Spelling Suggestions"
 msgstr "_Sugerencias ortográficas"
 
-#: ../libempathy-gtk/empathy-chat.c:2184
+#: ../libempathy-gtk/empathy-chat.c:2218
 msgid "Failed to retrieve recent logs"
 msgstr "Falló al recibir los registros recientes"
 
-#: ../libempathy-gtk/empathy-chat.c:2295
+#: ../libempathy-gtk/empathy-chat.c:2329
 #, c-format
 msgid "%s has disconnected"
 msgstr "%s se ha desconectado"
@@ -1427,12 +1441,12 @@ msgstr "%s se ha desconectado"
 #. translators: reverse the order of these arguments
 #. * if the kicked should come before the kicker in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2302
+#: ../libempathy-gtk/empathy-chat.c:2336
 #, c-format
 msgid "%1$s was kicked by %2$s"
 msgstr "%2$s expulsó a %1$s"
 
-#: ../libempathy-gtk/empathy-chat.c:2305
+#: ../libempathy-gtk/empathy-chat.c:2339
 #, c-format
 msgid "%s was kicked"
 msgstr "%s fue expulsado"
@@ -1440,17 +1454,17 @@ msgstr "%s fue expulsado"
 #. translators: reverse the order of these arguments
 #. * if the banned should come before the banner in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2313
+#: ../libempathy-gtk/empathy-chat.c:2347
 #, c-format
 msgid "%1$s was banned by %2$s"
 msgstr "%2$s vetó a %1$s"
 
-#: ../libempathy-gtk/empathy-chat.c:2316
+#: ../libempathy-gtk/empathy-chat.c:2350
 #, c-format
 msgid "%s was banned"
 msgstr "%s fue vetado"
 
-#: ../libempathy-gtk/empathy-chat.c:2320
+#: ../libempathy-gtk/empathy-chat.c:2354
 #, c-format
 msgid "%s has left the room"
 msgstr "%s ha dejado la sala"
@@ -1460,93 +1474,100 @@ msgstr "%s ha dejado la sala"
 #. * given by the user living the room. If this poses a problem,
 #. * please let us know. :-)
 #.
-#: ../libempathy-gtk/empathy-chat.c:2329
+#: ../libempathy-gtk/empathy-chat.c:2363
 #, c-format
 msgid " (%s)"
 msgstr " (%s)"
 
-#: ../libempathy-gtk/empathy-chat.c:2354
+#: ../libempathy-gtk/empathy-chat.c:2388
 #, c-format
 msgid "%s has joined the room"
 msgstr "%s ha entrado en la sala"
 
-#: ../libempathy-gtk/empathy-chat.c:2379
+#: ../libempathy-gtk/empathy-chat.c:2413
 #, c-format
 msgid "%s is now known as %s"
 msgstr "Ahora %s se llama %s"
 
-#: ../libempathy-gtk/empathy-chat.c:2518
+#: ../libempathy-gtk/empathy-chat.c:2552
 #: ../src/empathy-streamed-media-window.c:1957
-#: ../src/empathy-event-manager.c:1126
+#: ../src/empathy-event-manager.c:1116
 msgid "Disconnected"
 msgstr "Desconectado"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3148
+#: ../libempathy-gtk/empathy-chat.c:3200
 msgid "Would you like to store this password?"
 msgstr "¿Quiere guardar esta contraseña?"
 
-#: ../libempathy-gtk/empathy-chat.c:3154
+#: ../libempathy-gtk/empathy-chat.c:3206
 msgid "Remember"
 msgstr "Recordar"
 
-#: ../libempathy-gtk/empathy-chat.c:3164
+#: ../libempathy-gtk/empathy-chat.c:3216
 msgid "Not now"
 msgstr "Ahora no"
 
-#: ../libempathy-gtk/empathy-chat.c:3208
+#: ../libempathy-gtk/empathy-chat.c:3260
 msgid "Retry"
 msgstr "Volver a intentarlo"
 
-#: ../libempathy-gtk/empathy-chat.c:3212
+#: ../libempathy-gtk/empathy-chat.c:3264
 msgid "Wrong password; please try again:"
 msgstr "Contraseña incorrecta; inténtelo de nuevo:"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3329
+#: ../libempathy-gtk/empathy-chat.c:3381
 msgid "This room is protected by a password:"
 msgstr "Esta sala está protegida por contraseña:"
 
-#: ../libempathy-gtk/empathy-chat.c:3356
+#: ../libempathy-gtk/empathy-chat.c:3408
 msgid "Join"
 msgstr "Unirse"
 
-#: ../libempathy-gtk/empathy-chat.c:3526 ../src/empathy-event-manager.c:1147
+#: ../libempathy-gtk/empathy-chat.c:3600 ../src/empathy-event-manager.c:1137
 msgid "Connected"
 msgstr "Conectado"
 
-#: ../libempathy-gtk/empathy-chat.c:3579
+#: ../libempathy-gtk/empathy-chat.c:3655
 #: ../libempathy-gtk/empathy-log-window.c:650
 msgid "Conversation"
 msgstr "Conversación"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:422
+#. Translators: this string is a something like
+#. * "Escher Cat (SMS)"
+#: ../libempathy-gtk/empathy-chat.c:3660
+#, c-format
+msgid "%s (SMS)"
+msgstr "%s (SMS)"
+
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:423
 msgid "Unknown or invalid identifier"
 msgstr "Identificador desconocido o no válido"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:424
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:425
 msgid "Contact blocking temporarily unavailable"
 msgstr "Bloqueo de contactos no disponible temporalmente"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:426
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:427
 msgid "Contact blocking unavailable"
 msgstr "Bloqueo de contactos no disponible"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:428
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:429
 msgid "Permission Denied"
 msgstr "Permiso denegado"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:432
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:433
 msgid "Could not block contact"
 msgstr "No se pudo bloquear el contacto"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:701
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:702
 msgid "Edit Blocked Contacts"
 msgstr "Editar contactos bloqueados"
 
 #. Account and Identifier
 #: ../libempathy-gtk/empathy-contact-blocking-dialog.ui.h:1
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:520
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:521
 #: ../libempathy-gtk/empathy-contact-widget.ui.h:2
 #: ../libempathy-gtk/empathy-individual-widget.c:1479
 #: ../libempathy-gtk/empathy-contact-selector-dialog.ui.h:1
@@ -1557,13 +1578,13 @@ msgstr "Cuenta:"
 
 #. Copy Link Address menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:320
-#: ../libempathy-gtk/empathy-theme-adium.c:794
+#: ../libempathy-gtk/empathy-theme-adium.c:996
 msgid "_Copy Link Address"
 msgstr "_Copiar la dirección del enlace"
 
 #. Open Link menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:327
-#: ../libempathy-gtk/empathy-theme-adium.c:801
+#: ../libempathy-gtk/empathy-theme-adium.c:1003
 msgid "_Open Link"
 msgstr "_Abrir enlace"
 
@@ -1633,38 +1654,38 @@ msgid "Favorite People"
 msgstr "Gente favorita"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:1987
-#: ../libempathy-gtk/empathy-individual-view.c:2343
+#: ../libempathy-gtk/empathy-individual-view.c:2386
 #, c-format
 msgid "Do you really want to remove the group '%s'?"
 msgstr "¿Realmente quiere quitar el grupo «%s»?"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:1989
-#: ../libempathy-gtk/empathy-individual-view.c:2346
+#: ../libempathy-gtk/empathy-individual-view.c:2389
 msgid "Removing group"
 msgstr "Quitando grupo"
 
 #. Remove
 #: ../libempathy-gtk/empathy-contact-list-view.c:2038
 #: ../libempathy-gtk/empathy-contact-list-view.c:2115
-#: ../libempathy-gtk/empathy-individual-view.c:2401
-#: ../libempathy-gtk/empathy-individual-view.c:2594
+#: ../libempathy-gtk/empathy-individual-view.c:2444
+#: ../libempathy-gtk/empathy-individual-view.c:2637
 #: ../src/empathy-accounts-dialog.ui.h:7
 msgid "_Remove"
 msgstr "_Quitar"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:2068
-#: ../libempathy-gtk/empathy-individual-view.c:2465
+#: ../libempathy-gtk/empathy-individual-view.c:2508
 #, c-format
 msgid "Do you really want to remove the contact '%s'?"
 msgstr "¿Realmente quiere quitar el contacto «%s»?"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:2070
-#: ../libempathy-gtk/empathy-individual-view.c:2486
+#: ../libempathy-gtk/empathy-individual-view.c:2529
 msgid "Removing contact"
 msgstr "Quitando el contacto"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:219
-#: ../src/empathy-main-window.ui.h:13
+#: ../src/empathy-main-window.ui.h:14
 msgid "_Add Contact…"
 msgstr "_Añadir contacto…"
 
@@ -1673,48 +1694,48 @@ msgid "_Block Contact"
 msgstr "_Bloquear contacto"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:328
-#: ../libempathy-gtk/empathy-individual-menu.c:517
-#: ../src/empathy-main-window.ui.h:15
+#: ../libempathy-gtk/empathy-individual-menu.c:536
+#: ../src/empathy-main-window.ui.h:16
 msgid "_Chat"
 msgstr "_Chat"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:359
-#: ../libempathy-gtk/empathy-individual-menu.c:560
+#: ../libempathy-gtk/empathy-individual-menu.c:625
 msgctxt "menu item"
 msgid "_Audio Call"
 msgstr "Llamada de vo_z"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:390
-#: ../libempathy-gtk/empathy-individual-menu.c:602
+#: ../libempathy-gtk/empathy-individual-menu.c:667
 msgctxt "menu item"
 msgid "_Video Call"
 msgstr "Llamada de _vídeo"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:436
-#: ../libempathy-gtk/empathy-individual-menu.c:645
-#: ../src/empathy-main-window.ui.h:26
+#: ../libempathy-gtk/empathy-individual-menu.c:710
+#: ../src/empathy-main-window.ui.h:27
 msgid "_Previous Conversations"
 msgstr "Conversaciones an_teriores"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:458
-#: ../libempathy-gtk/empathy-individual-menu.c:686
+#: ../libempathy-gtk/empathy-individual-menu.c:751
 msgid "Send File"
 msgstr "Enviar archivo"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:481
-#: ../libempathy-gtk/empathy-individual-menu.c:728
+#: ../libempathy-gtk/empathy-individual-menu.c:793
 msgid "Share My Desktop"
 msgstr "Compartir mi escritorio"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:521
-#: ../libempathy-gtk/empathy-contact-widget.c:1761
-#: ../libempathy-gtk/empathy-individual-menu.c:763
+#: ../libempathy-gtk/empathy-contact-widget.c:1751
+#: ../libempathy-gtk/empathy-individual-menu.c:828
 #: ../libempathy-gtk/empathy-individual-widget.c:1370
 msgid "Favorite"
 msgstr "Favorita"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:550
-#: ../libempathy-gtk/empathy-individual-menu.c:791
+#: ../libempathy-gtk/empathy-individual-menu.c:856
 msgid "Infor_mation"
 msgstr "Infor_mación"
 
@@ -1724,30 +1745,30 @@ msgid "_Edit"
 msgstr "_Editar"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:650
-#: ../libempathy-gtk/empathy-individual-menu.c:972
-#: ../src/empathy-chat-window.c:935
+#: ../libempathy-gtk/empathy-individual-menu.c:1037
+#: ../src/empathy-chat-window.c:986
 msgid "Inviting you to this room"
 msgstr "Invitándolo a esta sala"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:681
-#: ../libempathy-gtk/empathy-individual-menu.c:1019
+#: ../libempathy-gtk/empathy-individual-menu.c:1084
 msgid "_Invite to Chat Room"
 msgstr "_Invitar a sala de chat"
 
 #. Title
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:513
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:514
 msgid "Search contacts"
 msgstr "Buscar contactos"
 
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:543
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:544
 msgid "Search: "
 msgstr "Buscar:"
 
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:601
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:602
 msgid "_Add Contact"
 msgstr "_Añadir contacto"
 
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:619
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:620
 msgid "No contacts found"
 msgstr "No se encontraron contactos"
 
@@ -1900,8 +1921,8 @@ msgstr "Latitud:"
 msgid "Altitude:"
 msgstr "Altitud:"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:871
-#: ../libempathy-gtk/empathy-contact-widget.c:886
+#: ../libempathy-gtk/empathy-contact-widget.c:861
+#: ../libempathy-gtk/empathy-contact-widget.c:876
 #: ../libempathy-gtk/empathy-individual-widget.c:616
 #: ../libempathy-gtk/empathy-individual-widget.c:631
 #: ../src/empathy-preferences.ui.h:12
@@ -1909,23 +1930,23 @@ msgid "Location"
 msgstr "Ubicación geográfica"
 
 #. translators: format is "Location, $date"
-#: ../libempathy-gtk/empathy-contact-widget.c:888
+#: ../libempathy-gtk/empathy-contact-widget.c:878
 #: ../libempathy-gtk/empathy-individual-widget.c:633
 #, c-format
 msgid "%s, %s"
 msgstr "%s, %s"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:940
+#: ../libempathy-gtk/empathy-contact-widget.c:930
 #: ../libempathy-gtk/empathy-individual-widget.c:682
 msgid "%B %e, %Y at %R UTC"
 msgstr "%e de %B de %Y a las %R UTC"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:1022
+#: ../libempathy-gtk/empathy-contact-widget.c:1012
 #: ../libempathy-gtk/empathy-individual-widget.c:917
 msgid "Save Avatar"
 msgstr "Guardar avatar"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:1078
+#: ../libempathy-gtk/empathy-contact-widget.c:1068
 #: ../libempathy-gtk/empathy-individual-widget.c:975
 msgid "Unable to save avatar"
 msgstr "No se pudo guardar el avatar"
@@ -1995,7 +2016,7 @@ msgid "Select"
 msgstr "Seleccionar"
 
 #: ../libempathy-gtk/empathy-groups-widget.c:408
-#: ../src/empathy-main-window.c:1436
+#: ../src/empathy-main-window.c:1770
 msgid "Group"
 msgstr "Grupo"
 
@@ -2038,23 +2059,29 @@ msgstr ""
 msgid "%s (%s)"
 msgstr "%s (%s)"
 
-#: ../libempathy-gtk/empathy-individual-menu.c:839
+#. add an SMS button
+#: ../libempathy-gtk/empathy-individual-menu.c:582
+#: ../libempathy-gtk/empathy-new-message-dialog.c:248
+msgid "_SMS"
+msgstr "_SMS"
+
+#: ../libempathy-gtk/empathy-individual-menu.c:904
 msgctxt "Edit individual (contextual menu)"
 msgid "_Edit"
 msgstr "_Editar"
 
 #. Translators: this is a verb meaning "to connect two contacts together
 #. * to form a meta-contact".
-#: ../libempathy-gtk/empathy-individual-menu.c:865
+#: ../libempathy-gtk/empathy-individual-menu.c:930
 msgctxt "Link individual (contextual menu)"
 msgid "_Link Contacts…"
 msgstr "_Enlazar contactos…"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2308
+#: ../libempathy-gtk/empathy-individual-view.c:2351
 msgid "Delete and _Block"
 msgstr "Eliminar y _bloquear"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2474
+#: ../libempathy-gtk/empathy-individual-view.c:2517
 #, c-format
 msgid ""
 "Do you really want to remove the linked contact '%s'? Note that this will "
@@ -2186,12 +2213,12 @@ msgid "Contact ID:"
 msgstr "ID del contacto:"
 
 #. add chat button
-#: ../libempathy-gtk/empathy-new-message-dialog.c:171
+#: ../libempathy-gtk/empathy-new-message-dialog.c:258
 msgid "C_hat"
 msgstr "C_hat"
 
 #. Tweak the dialog
-#: ../libempathy-gtk/empathy-new-message-dialog.c:181
+#: ../libempathy-gtk/empathy-new-message-dialog.c:277
 msgid "New Conversation"
 msgstr "Conversación nueva"
 
@@ -2333,19 +2360,23 @@ msgstr "Guardar mensaje de estado _nuevo"
 msgid "Saved Status Messages"
 msgstr "Mensajes de estado guardados"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:67
+#: ../libempathy-gtk/empathy-theme-adium.c:1462
+msgid "Normal"
+msgstr "Normal"
+
+#: ../libempathy-gtk/empathy-theme-manager.c:68
 msgid "Classic"
 msgstr "Clásico"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:68
+#: ../libempathy-gtk/empathy-theme-manager.c:69
 msgid "Simple"
 msgstr "Simple"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:69
+#: ../libempathy-gtk/empathy-theme-manager.c:70
 msgid "Clean"
 msgstr "Limpio"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:70
+#: ../libempathy-gtk/empathy-theme-manager.c:71
 msgid "Blue"
 msgstr "Azul"
 
@@ -2800,8 +2831,8 @@ msgid "Select the accounts you want to import:"
 msgstr "Seleccione las cuentas que quiere importar:"
 
 #: ../src/empathy-account-assistant.c:813
-#: ../src/empathy-new-chatroom-dialog.c:562
-#: ../src/empathy-new-chatroom-dialog.c:563
+#: ../src/empathy-new-chatroom-dialog.c:555
+#: ../src/empathy-new-chatroom-dialog.c:556
 msgid "Yes"
 msgstr "Sí"
 
@@ -2920,7 +2951,7 @@ msgstr "¿Quiere quitar %s de su equipo?"
 msgid "This will not remove your account on the server."
 msgstr "Esto no quitará su cuenta del servidor."
 
-#: ../src/empathy-accounts-dialog.c:1434
+#: ../src/empathy-accounts-dialog.c:1432
 msgid ""
 "You are about to select another account, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -2929,15 +2960,15 @@ msgstr ""
 "¿Seguro que quiere continuar?"
 
 #. Menu items: to enabled/disable the account
-#: ../src/empathy-accounts-dialog.c:1652
+#: ../src/empathy-accounts-dialog.c:1643
 msgid "_Enable"
 msgstr "_Activar"
 
-#: ../src/empathy-accounts-dialog.c:1653
+#: ../src/empathy-accounts-dialog.c:1644
 msgid "_Disable"
 msgstr "_Desactivar"
 
-#: ../src/empathy-accounts-dialog.c:2174
+#: ../src/empathy-accounts-dialog.c:2154
 msgid ""
 "You are about to close the window, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -2973,11 +3004,11 @@ msgstr "_Añadir…"
 msgid "_Import…"
 msgstr "_Importar…"
 
-#: ../src/empathy-auth-client.c:250
+#: ../src/empathy-auth-client.c:249
 msgid " - Empathy authentication client"
 msgstr ": Cliente de autenticación de Empathy"
 
-#: ../src/empathy-auth-client.c:266
+#: ../src/empathy-auth-client.c:265
 msgid "Empathy authentication client"
 msgstr "Cliente de autenticación de Empathy"
 
@@ -3063,25 +3094,21 @@ msgid "The IP address of the multicast group"
 msgstr "La dirección IP del grupo multicast"
 
 #: ../src/empathy-streamed-media-window.c:1906
-#| msgid "Unknown"
 msgctxt "encoding video codec"
 msgid "Unknown"
 msgstr "Desconocido"
 
 #: ../src/empathy-streamed-media-window.c:1909
-#| msgid "Unknown"
 msgctxt "encoding audio codec"
 msgid "Unknown"
 msgstr "Desconocido"
 
 #: ../src/empathy-streamed-media-window.c:1912
-#| msgid "Unknown"
 msgctxt "decoding video codec"
 msgid "Unknown"
 msgstr "Desconocido"
 
 #: ../src/empathy-streamed-media-window.c:1915
-#| msgid "Unknown"
 msgctxt "decoding audio codec"
 msgid "Unknown"
 msgstr "Desconocido"
@@ -3264,39 +3291,50 @@ msgstr "Vista preliminar del vídeo"
 msgid "_Call"
 msgstr "_Llamar"
 
-#: ../src/empathy-call-window.ui.h:25 ../src/empathy-main-window.ui.h:29
+#: ../src/empathy-call-window.ui.h:25 ../src/empathy-main-window.ui.h:30
 msgid "_View"
 msgstr "_Ver"
 
-#: ../src/empathy-chat-window.c:474 ../src/empathy-chat-window.c:494
+#: ../src/empathy-chat-window.c:480 ../src/empathy-chat-window.c:500
 #, c-format
 msgid "%s (%d unread)"
 msgid_plural "%s (%d unread)"
 msgstr[0] "%s (%d sin leer)"
 msgstr[1] "%s (%d sin leer)"
 
-#: ../src/empathy-chat-window.c:486
+#: ../src/empathy-chat-window.c:492
 #, c-format
 msgid "%s (and %u other)"
 msgid_plural "%s (and %u others)"
 msgstr[0] "%s (y otra)"
 msgstr[1] "%s (y otras %u)"
 
-#: ../src/empathy-chat-window.c:502
+#: ../src/empathy-chat-window.c:508
 #, c-format
 msgid "%s (%d unread from others)"
 msgid_plural "%s (%d unread from others)"
 msgstr[0] "%s (%d sin leer de otros)"
 msgstr[1] "%s (%d sin leer de otros)"
 
-#: ../src/empathy-chat-window.c:511
+#: ../src/empathy-chat-window.c:517
 #, c-format
 msgid "%s (%d unread from all)"
 msgid_plural "%s (%d unread from all)"
 msgstr[0] "%s (%d sin leer de todos)"
 msgstr[1] "%s (%d sin leer de todos)"
 
-#: ../src/empathy-chat-window.c:721
+#: ../src/empathy-chat-window.c:732
+msgid "SMS:"
+msgstr "SMS:"
+
+#: ../src/empathy-chat-window.c:742
+#, c-format
+msgid "Sending %d message"
+msgid_plural "Sending %d messages"
+msgstr[0] "Enviando %d mensaje"
+msgstr[1] "Enviando %d mensajes"
+
+#: ../src/empathy-chat-window.c:764
 msgid "Typing a message."
 msgstr "Tecleando un mensaje."
 
@@ -3332,7 +3370,7 @@ msgstr "Mover pestaña a la _derecha"
 msgid "Notify for All Messages"
 msgstr "Notificar para todos los mensajes"
 
-#: ../src/empathy-chat-window.ui.h:9 ../src/empathy-main-window.ui.h:17
+#: ../src/empathy-chat-window.ui.h:9 ../src/empathy-main-window.ui.h:18
 msgid "_Contents"
 msgstr "Índ_ice"
 
@@ -3344,7 +3382,7 @@ msgstr "_Conversación"
 msgid "_Detach Tab"
 msgstr "_Desacoplar pestaña"
 
-#: ../src/empathy-chat-window.ui.h:12 ../src/empathy-main-window.ui.h:19
+#: ../src/empathy-chat-window.ui.h:12 ../src/empathy-main-window.ui.h:20
 msgid "_Edit"
 msgstr "_Editar"
 
@@ -3352,7 +3390,7 @@ msgstr "_Editar"
 msgid "_Favorite Chat Room"
 msgstr "Sala de chat _favorita"
 
-#: ../src/empathy-chat-window.ui.h:14 ../src/empathy-main-window.ui.h:21
+#: ../src/empathy-chat-window.ui.h:14 ../src/empathy-main-window.ui.h:22
 msgid "_Help"
 msgstr "Ay_uda"
 
@@ -3392,90 +3430,90 @@ msgstr "Autoconectar"
 msgid "Manage Favorite Rooms"
 msgstr "Gestionar salas favoritas"
 
-#: ../src/empathy-event-manager.c:507
+#: ../src/empathy-event-manager.c:504
 msgid "Incoming video call"
 msgstr "Llamada de vídeo entrante"
 
-#: ../src/empathy-event-manager.c:507
+#: ../src/empathy-event-manager.c:504
 msgid "Incoming call"
 msgstr "Llamada entrante"
 
-#: ../src/empathy-event-manager.c:511
+#: ../src/empathy-event-manager.c:508
 #, c-format
 msgid "%s is video calling you. Do you want to answer?"
 msgstr "%s le está llamando con vídeo. ¿Quiere responder?"
 
-#: ../src/empathy-event-manager.c:512
+#: ../src/empathy-event-manager.c:509
 #, c-format
 msgid "%s is calling you. Do you want to answer?"
 msgstr "%s le está llamando. ¿Quiere responder?"
 
-#: ../src/empathy-event-manager.c:515 ../src/empathy-event-manager.c:667
+#: ../src/empathy-event-manager.c:512 ../src/empathy-event-manager.c:661
 #, c-format
 msgid "Incoming call from %s"
 msgstr "Llamada entrante de %s"
 
-#: ../src/empathy-event-manager.c:540
+#: ../src/empathy-event-manager.c:537
 msgid "_Reject"
 msgstr "_Rechazar"
 
-#: ../src/empathy-event-manager.c:546
+#: ../src/empathy-event-manager.c:543
 msgid "_Answer"
 msgstr "Re_spuesta"
 
-#: ../src/empathy-event-manager.c:667
+#: ../src/empathy-event-manager.c:661
 #, c-format
 msgid "Incoming video call from %s"
 msgstr "Llamada de vídeo entrante de %s"
 
-#: ../src/empathy-event-manager.c:744
+#: ../src/empathy-event-manager.c:734
 msgid "Room invitation"
 msgstr "Invitación a una sala"
 
-#: ../src/empathy-event-manager.c:746
+#: ../src/empathy-event-manager.c:736
 #, c-format
 msgid "Invitation to join %s"
 msgstr "Invitación para unirse a %s"
 
-#: ../src/empathy-event-manager.c:753
+#: ../src/empathy-event-manager.c:743
 #, c-format
 msgid "%s is inviting you to join %s"
 msgstr "%s le está invitando a unirse a %s"
 
-#: ../src/empathy-event-manager.c:761
+#: ../src/empathy-event-manager.c:751
 msgid "_Decline"
 msgstr "_Rechazar"
 
-#: ../src/empathy-event-manager.c:766
+#: ../src/empathy-event-manager.c:756
 #: ../src/empathy-new-chatroom-dialog.ui.h:7
 msgid "_Join"
 msgstr "_Unirse"
 
-#: ../src/empathy-event-manager.c:793
+#: ../src/empathy-event-manager.c:783
 #, c-format
 msgid "%s invited you to join %s"
 msgstr "%s le ha invitado a unirse a %s"
 
-#: ../src/empathy-event-manager.c:799
+#: ../src/empathy-event-manager.c:789
 #, c-format
 msgid "You have been invited to join %s"
 msgstr "Le han invitado a unirse a %s"
 
-#: ../src/empathy-event-manager.c:850
+#: ../src/empathy-event-manager.c:840
 #, c-format
 msgid "Incoming file transfer from %s"
 msgstr "Transferencia de archivo entrante de %s"
 
-#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:370
+#: ../src/empathy-event-manager.c:1010 ../src/empathy-main-window.c:377
 msgid "Password required"
 msgstr "Se requiere una contraseña"
 
-#: ../src/empathy-event-manager.c:1076
+#: ../src/empathy-event-manager.c:1066
 #, c-format
 msgid "%s would like permission to see when you are online"
 msgstr "%s quiere permiso para ver cuándo está en línea"
 
-#: ../src/empathy-event-manager.c:1080
+#: ../src/empathy-event-manager.c:1070
 #, c-format
 msgid ""
 "\n"
@@ -3561,7 +3599,7 @@ msgstr "«%s» enviado a %s"
 msgid "File transfer completed"
 msgstr "Transferencia de archivo completada"
 
-#: ../src/empathy-ft-manager.c:616 ../src/empathy-ft-manager.c:783
+#: ../src/empathy-ft-manager.c:616 ../src/empathy-ft-manager.c:780
 msgid "Waiting for the other participant's response"
 msgstr "Esperando la respuesta del otro participante"
 
@@ -3575,15 +3613,15 @@ msgstr "Comprobando la integridad de «%s»"
 msgid "Hashing \"%s\""
 msgstr "Obteniendo el «hash» de «%s»"
 
-#: ../src/empathy-ft-manager.c:1029
+#: ../src/empathy-ft-manager.c:1026
 msgid "%"
 msgstr "%"
 
-#: ../src/empathy-ft-manager.c:1041
+#: ../src/empathy-ft-manager.c:1038
 msgid "File"
 msgstr "Archivo"
 
-#: ../src/empathy-ft-manager.c:1063
+#: ../src/empathy-ft-manager.c:1060
 msgid "Remaining"
 msgstr "Restantes"
 
@@ -3622,39 +3660,55 @@ msgstr "Protocolo"
 msgid "Source"
 msgstr "Origen"
 
-#: ../src/empathy-main-window.c:387
+#: ../src/empathy-main-window.c:394
 msgid "Provide Password"
 msgstr "Escriba su contraseña"
 
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:400
 msgid "Disconnect"
 msgstr "Desconectar"
 
-#: ../src/empathy-main-window.c:533
+#: ../src/empathy-main-window.c:540
 msgid "No match found"
 msgstr "No se encontró ninguna coincidencia"
 
-#: ../src/empathy-main-window.c:688
+#: ../src/empathy-main-window.c:695
 msgid "Reconnect"
 msgstr "Reconectar"
 
-#: ../src/empathy-main-window.c:694
+#: ../src/empathy-main-window.c:701
 msgid "Edit Account"
 msgstr "Editar cuenta"
 
-#: ../src/empathy-main-window.c:700
+#: ../src/empathy-main-window.c:707
 msgid "Close"
 msgstr "Cerrar"
 
-#: ../src/empathy-main-window.c:1418
+#. Translators: this string will be something like:
+#. *   Top up My Account ($1.23)..."
+#: ../src/empathy-main-window.c:849
+#, c-format
+msgid "Top up %s (%s)..."
+msgstr "Recargar %s (%s)…"
+
+#: ../src/empathy-main-window.c:924
+msgid "Top up account credit"
+msgstr "Recargar el saldo de la cuenta"
+
+#. top up button
+#: ../src/empathy-main-window.c:999
+msgid "Top Up..."
+msgstr "Recargar…"
+
+#: ../src/empathy-main-window.c:1752
 msgid "Contact"
 msgstr "Contacto"
 
-#: ../src/empathy-main-window.c:1765
+#: ../src/empathy-main-window.c:2101
 msgid "Contact List"
 msgstr "Lista de contactos"
 
-#: ../src/empathy-main-window.c:1881
+#: ../src/empathy-main-window.c:2219
 msgid "Show and edit accounts"
 msgstr "Mostrar y editar cuentas"
 
@@ -3663,86 +3717,90 @@ msgid "Contacts on a _Map"
 msgstr "Contactos en el _mapa"
 
 #: ../src/empathy-main-window.ui.h:2
+msgid "Credit Balance"
+msgstr "Crédito"
+
+#: ../src/empathy-main-window.ui.h:3
 msgid "Find in Contact _List"
 msgstr "_Buscar en la lista de contactos"
 
-#: ../src/empathy-main-window.ui.h:3
+#: ../src/empathy-main-window.ui.h:4
 msgid "Join _Favorites"
 msgstr "Unirse a _favoritas"
 
-#: ../src/empathy-main-window.ui.h:4
+#: ../src/empathy-main-window.ui.h:5
 msgid "Manage Favorites"
 msgstr "Gestionar favoritos"
 
-#: ../src/empathy-main-window.ui.h:5
+#: ../src/empathy-main-window.ui.h:6
 msgid "N_ormal Size"
 msgstr "Tamaño n_ormal"
 
-#: ../src/empathy-main-window.ui.h:6 ../src/empathy-status-icon.ui.h:1
+#: ../src/empathy-main-window.ui.h:7 ../src/empathy-status-icon.ui.h:1
 msgid "New _Call…"
 msgstr "_Llamada nueva…"
 
-#: ../src/empathy-main-window.ui.h:7
+#: ../src/empathy-main-window.ui.h:8
 msgid "Normal Size With _Avatars"
 msgstr "Tamaño normal con _avatares"
 
-#: ../src/empathy-main-window.ui.h:8
+#: ../src/empathy-main-window.ui.h:9
 msgid "P_references"
 msgstr "Prefere_ncias"
 
-#: ../src/empathy-main-window.ui.h:9
+#: ../src/empathy-main-window.ui.h:10
 msgid "Show P_rotocols"
 msgstr "Mostrar p_rotocolos"
 
-#: ../src/empathy-main-window.ui.h:10
+#: ../src/empathy-main-window.ui.h:11
 msgid "Sort by _Name"
 msgstr "Ordenar por _nombre"
 
-#: ../src/empathy-main-window.ui.h:11
+#: ../src/empathy-main-window.ui.h:12
 msgid "Sort by _Status"
 msgstr "Ordenar por es_tado"
 
-#: ../src/empathy-main-window.ui.h:12
+#: ../src/empathy-main-window.ui.h:13
 msgid "_Accounts"
 msgstr "_Cuentas"
 
-#: ../src/empathy-main-window.ui.h:14
+#: ../src/empathy-main-window.ui.h:15
 msgid "_Blocked Contacts"
 msgstr "Contactos _bloqueados"
 
-#: ../src/empathy-main-window.ui.h:16
+#: ../src/empathy-main-window.ui.h:17
 msgid "_Compact Size"
 msgstr "Tamaño _compacto"
 
-#: ../src/empathy-main-window.ui.h:18
+#: ../src/empathy-main-window.ui.h:19
 msgid "_Debug"
 msgstr "_Depurar"
 
-#: ../src/empathy-main-window.ui.h:20
+#: ../src/empathy-main-window.ui.h:21
 msgid "_File Transfers"
 msgstr "_Transferencias de archivos"
 
-#: ../src/empathy-main-window.ui.h:22
+#: ../src/empathy-main-window.ui.h:23
 msgid "_Join…"
 msgstr "_Unirse…"
 
-#: ../src/empathy-main-window.ui.h:23 ../src/empathy-status-icon.ui.h:3
+#: ../src/empathy-main-window.ui.h:24 ../src/empathy-status-icon.ui.h:3
 msgid "_New Conversation…"
 msgstr "Conversación _nueva…"
 
-#: ../src/empathy-main-window.ui.h:24
+#: ../src/empathy-main-window.ui.h:25
 msgid "_Offline Contacts"
 msgstr "Contactos _desconectados"
 
-#: ../src/empathy-main-window.ui.h:25
+#: ../src/empathy-main-window.ui.h:26
 msgid "_Personal Information"
 msgstr "Información p_ersonal"
 
-#: ../src/empathy-main-window.ui.h:27
+#: ../src/empathy-main-window.ui.h:28
 msgid "_Room"
 msgstr "_Sala"
 
-#: ../src/empathy-main-window.ui.h:28
+#: ../src/empathy-main-window.ui.h:29
 msgid "_Search for Contacts…"
 msgstr "_Buscar contactos…"
 
@@ -3756,7 +3814,7 @@ msgstr "Miembros"
 
 #. Translators: Room/Join's roomlist tooltip. Parameters are a channel name,
 #. yes/no, yes/no and a number.
-#: ../src/empathy-new-chatroom-dialog.c:560
+#: ../src/empathy-new-chatroom-dialog.c:553
 #, c-format
 msgid ""
 "%s\n"
@@ -3769,16 +3827,16 @@ msgstr ""
 "Se necesita contraseña: %s\n"
 "Miembros: %s"
 
-#: ../src/empathy-new-chatroom-dialog.c:562
-#: ../src/empathy-new-chatroom-dialog.c:563
+#: ../src/empathy-new-chatroom-dialog.c:555
+#: ../src/empathy-new-chatroom-dialog.c:556
 msgid "No"
 msgstr "No"
 
-#: ../src/empathy-new-chatroom-dialog.c:591
+#: ../src/empathy-new-chatroom-dialog.c:584
 msgid "Could not start room listing"
 msgstr "No se pudo iniciar la lista de la sala"
 
-#: ../src/empathy-new-chatroom-dialog.c:601
+#: ../src/empathy-new-chatroom-dialog.c:594
 msgid "Could not stop room listing"
 msgstr "No se pudo parar la lista de la sala"
 
@@ -3813,39 +3871,79 @@ msgstr "Lista de salas"
 msgid "_Room:"
 msgstr "_Sala:"
 
-#: ../src/empathy-preferences.c:139
+#: ../src/empathy-preferences.c:147
 msgid "Message received"
 msgstr "Mensaje recibido"
 
-#: ../src/empathy-preferences.c:140
+#: ../src/empathy-preferences.c:148
 msgid "Message sent"
 msgstr "Mensaje enviado"
 
-#: ../src/empathy-preferences.c:141
+#: ../src/empathy-preferences.c:149
 msgid "New conversation"
 msgstr "Conversación nueva"
 
-#: ../src/empathy-preferences.c:142
+#: ../src/empathy-preferences.c:150
 msgid "Contact goes online"
 msgstr "El contacto se conecta"
 
-#: ../src/empathy-preferences.c:143
+#: ../src/empathy-preferences.c:151
 msgid "Contact goes offline"
 msgstr "El contacto se desconecta"
 
-#: ../src/empathy-preferences.c:144
+#: ../src/empathy-preferences.c:152
 msgid "Account connected"
 msgstr "Cuenta conectada"
 
-#: ../src/empathy-preferences.c:145
+#: ../src/empathy-preferences.c:153
 msgid "Account disconnected"
 msgstr "Cuenta desconectada"
 
-#: ../src/empathy-preferences.c:446
+#: ../src/empathy-preferences.c:450
 msgid "Language"
 msgstr "Idioma"
 
-#: ../src/empathy-preferences.c:875
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:700
+msgid "Juliet"
+msgstr "Julieta"
+
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:707
+msgid "Romeo"
+msgstr "Romeo"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:713
+msgid "O Romeo, Romeo, wherefore art thou Romeo?"
+msgstr "¡Oh, Romeo, Romeo!, ¿dónde estás que no te veo?"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:716
+msgid "Deny thy father and refuse thy name;"
+msgstr "Niega a tu padre y rehúsa tu nombre;"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:719
+msgid "Or if thou wilt not, be but sworn my love"
+msgstr "O, si no quieres, júrame tan sólo que me amas"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:722
+msgid "And I'll no longer be a Capulet."
+msgstr "Y dejaré yo de ser una Capuleto"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:725
+msgid "Shall I hear more, or shall I speak at this?"
+msgstr "¿Debo oír más o contestar a lo dicho?"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:728
+msgid "Juliet has disconnected"
+msgstr "Julieta se ha desconectado"
+
+#: ../src/empathy-preferences.c:962
 msgid "Preferences"
 msgstr "Preferencias"
 
@@ -3948,43 +4046,47 @@ msgstr ""
 "diccionario instalado."
 
 #: ../src/empathy-preferences.ui.h:24
+msgid "Theme Variant:"
+msgstr "Variante del tema:"
+
+#: ../src/empathy-preferences.ui.h:25
 msgid "Themes"
 msgstr "Temas"
 
-#: ../src/empathy-preferences.ui.h:25
+#: ../src/empathy-preferences.ui.h:26
 msgid "_Automatically connect on startup"
 msgstr "C_onectarse automáticamente al inicio"
 
-#: ../src/empathy-preferences.ui.h:26
+#: ../src/empathy-preferences.ui.h:27
 msgid "_Cellphone"
 msgstr "Teléfono _móvil"
 
-#: ../src/empathy-preferences.ui.h:27
+#: ../src/empathy-preferences.ui.h:28
 msgid "_Enable bubble notifications"
 msgstr "_Activar notificaciones de burbuja"
 
-#: ../src/empathy-preferences.ui.h:28
+#: ../src/empathy-preferences.ui.h:29
 msgid "_Enable sound notifications"
 msgstr "_Activar notificaciones de sonido"
 
-#: ../src/empathy-preferences.ui.h:29
+#: ../src/empathy-preferences.ui.h:30
 msgid "_GPS"
 msgstr "_GPS"
 
-#: ../src/empathy-preferences.ui.h:30
+#: ../src/empathy-preferences.ui.h:31
 msgid "_Network (IP, Wi-Fi)"
 msgstr "_Red (IP, Wi-Fi)"
 
-#: ../src/empathy-preferences.ui.h:31
+#: ../src/empathy-preferences.ui.h:32
 msgid "_Open new chats in separate windows"
 msgstr "_Abrir charlas nuevas en ventanas separadas"
 
-#: ../src/empathy-preferences.ui.h:32
+#: ../src/empathy-preferences.ui.h:33
 msgid "_Publish location to my contacts"
 msgstr "_Publicar mi ubicación a mis contactos"
 
 #. To translators: The longitude and latitude are rounded to closest 0,1 degrees, so for example 146,2345° is rounded to round(146,2345*10)/10 = 146,2 degrees.
-#: ../src/empathy-preferences.ui.h:34
+#: ../src/empathy-preferences.ui.h:35
 msgid "_Reduce location accuracy"
 msgstr "_Reducir la precisión de la ubicación"
 
@@ -4149,6 +4251,10 @@ msgstr "Llamada perdida de %s"
 msgid "%s just tried to call you, but you were in another call."
 msgstr "%s intentó llamarle, pero estaba en otra llamada."
 
+#: ../libempathy-gtk/empathy-search-bar.c:282
+msgid "_Match case"
+msgstr "_Coincidir con capitalización"
+
 #~ msgid "_Enabled"
 #~ msgstr "_Activada"
 
@@ -4281,9 +4387,6 @@ msgstr "%s intentó llamarle, pero estaba en otra llamada."
 #~ msgid "_Import&#x2026;"
 #~ msgstr "_Importar&#x2026;"
 
-#~ msgid "Salut account is created"
-#~ msgstr "Se creó la cuenta Salut"
-
 #~ msgid "Whether the Salut account has been created on the first Empathy run."
 #~ msgstr ""
 #~ "Indica si la cuenta Salut se ha creado cuando ejecutó por primera vez "
index 7c2127eb8fc7890230c6915111f1107fd75d6033..c4f5cc02dfdc8008c6f2b2199b77efc27e547f33 100644 (file)
--- a/po/gl.po
+++ b/po/gl.po
@@ -13,8 +13,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: empathy-master-po-gl-57278_.merged\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 23:08+0200\n"
-"PO-Revision-Date: 2011-04-30 23:08+0200\n"
+"POT-Creation-Date: 2011-05-09 12:52+0200\n"
+"PO-Revision-Date: 2011-05-09 12:57+0200\n"
 "Last-Translator: Fran Diéguez <frandieguez@gnome.org>\n"
 "Language-Team: Galician <gnome-l10n-gl@gnome.org>\n"
 "Language: gl\n"
@@ -253,113 +253,118 @@ msgstr "Facer emerxer unha notificación cando un contacto sae"
 
 # rever
 #: ../data/org.gnome.Empathy.gschema.xml.in.h:42
+msgid "Show Balance in contact list"
+msgstr "Mostrar o balance na lista de contactos"
+
+# rever
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:43
 msgid "Show avatars"
 msgstr "Mostrar os avatares"
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:43
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:44
 msgid "Show contact list in rooms"
 msgstr "Mostrar a lista de contactos nas salas"
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:44
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:45
 msgid "Show hint about closing the main window"
 msgstr "Mostrar unha indicación sobre pechar a xanela principal"
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:45
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:46
 msgid "Show offline contacts"
 msgstr "Mostrar os contactos desconectados"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:46
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:47
 msgid "Show protocols"
 msgstr "Mostrar os protocolos"
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:47
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:48
 msgid "Spell checking languages"
 msgstr "Idiomas para a corrección ortográfica"
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:48
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:49
 msgid "The default folder to save file transfers in."
 msgstr ""
 "O cartafol predeterminado en que gardar as transferencias de ficheiros."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:49
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:50
 msgid "The last directory that an avatar image was chosen from."
 msgstr "O último cartafol desde onde foi escollida unha imaxe de avatar."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:50
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:51
 msgid "The position for the chat window side pane"
 msgstr "A posición do panel lateral da xanela de conversa"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:51
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:52
 msgid "The stored position (in pixels) of the chat window side pane."
 msgstr ""
 "A posición almacenada (en píxeles) do panel lateral da xanela de conversa."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:52
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:53
 msgid "The theme that is used to display the conversation in chat windows."
 msgstr "O tema usado para mostrar as conversa nas xanelas de conversa."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:53
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:54
 msgid "Use graphical smileys"
 msgstr "Usar emoticonas gráficas"
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:54
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:55
 msgid "Use notification sounds"
 msgstr "Usar sons de notificación"
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:55
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:56
 msgid "Use theme for chat rooms"
 msgstr "Usar un tema para as salas de conversa"
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:56
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:57
 msgid "Whether Empathy can publish the user's location to their contacts."
 msgstr ""
 "Indica se o Empathy pode ou non publicar a localización do usuario aos seus "
 "contactos."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:57
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:58
 msgid "Whether Empathy can use the GPS to guess the location."
 msgstr ""
 "Indica se o Empathy pode usar ou non o GPS para adiviñar a localización."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:58
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:59
 msgid "Whether Empathy can use the cellular network to guess the location."
 msgstr ""
 "Indica se o Empathy pode ou non usar a rede de telefonía móbil para adiviñar "
 "a localización."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:59
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:60
 msgid "Whether Empathy can use the network to guess the location."
 msgstr ""
 "Indica se o Empathy pode ou non usar a rede para adiviñar a localización."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:60
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:61
 msgid "Whether Empathy has migrated butterfly logs."
 msgstr "Indica se Empathy migrou os seus rexistros de butterfly."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:61
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:62
 msgid "Whether Empathy should automatically log into your accounts on startup."
 msgstr ""
 "Indica se o Empathy debería iniciar a sesión nas súas contas automaticamente "
 "ao inicio ou non."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:62
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:63
 msgid ""
 "Whether Empathy should go into away mode automatically if the user is idle."
 msgstr ""
@@ -367,7 +372,7 @@ msgstr ""
 "inactivo."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:63
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:64
 msgid ""
 "Whether Empathy should reduce the location's accuracy for privacy reasons."
 msgstr ""
@@ -375,14 +380,14 @@ msgstr ""
 "motivos de privacidade."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:64
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:65
 msgid ""
 "Whether Empathy should use the avatar of the contact as the chat window icon."
 msgstr ""
 "Indica se o Empathy debería usar o avatar dos contactos como a icona da "
 "xanela da conversa ou non."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:65
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:66
 msgid ""
 "Whether WebKit developer tools, such as the Web Inspector, should be enabled."
 msgstr ""
@@ -390,7 +395,7 @@ msgstr ""
 "deberían ser activadas."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:66
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:67
 msgid ""
 "Whether connectivity managers should be used to automatically disconnect/"
 "reconnect."
@@ -399,7 +404,7 @@ msgstr ""
 "desconectarse automaticamente ou non."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:67
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:68
 msgid ""
 "Whether to check words typed against the languages you want to check with."
 msgstr ""
@@ -407,80 +412,80 @@ msgstr ""
 "as quere verificar."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:68
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:69
 msgid "Whether to convert smileys into graphical images in conversations."
 msgstr ""
 "Indica se converter ou non as emoticonas en imaxes gráficas nas conversas."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:69
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:70
 msgid "Whether to play a sound to notify of contacts logging into the network."
 msgstr ""
 "Indica se reproducir ou non un son para notificar que os contactos inician "
 "unha sesión na rede."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:70
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:71
 msgid ""
 "Whether to play a sound to notify of contacts logging out of the network."
 msgstr ""
 "Indica se reproducir ou non un son para notificar que os contactos terminan "
 "unha sesión na rede."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:71
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:72
 msgid "Whether to play a sound to notify of events."
 msgstr "Indica se reproducir ou non un son para notificar os eventos."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:72
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:73
 msgid "Whether to play a sound to notify of incoming messages."
 msgstr ""
 "Indica se reproducir ou non un son para notificar as mensaxes entrantes."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:73
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:74
 msgid "Whether to play a sound to notify of new conversations."
 msgstr "Indica se reproducir ou non un son para notificar as conversas novas."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:74
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:75
 msgid "Whether to play a sound to notify of outgoing messages."
 msgstr "Indica se reproducir ou non un son para notificar as mensaxes saíntes."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:75
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:76
 msgid "Whether to play a sound when logging into a network."
 msgstr ""
 "Indica se reproducir ou non un son cando se inicia unha sesión na rede."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:76
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:77
 msgid "Whether to play a sound when logging out of a network."
 msgstr "Indica se reproducir ou non un son cando se sae da sesión na rede."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:77
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:78
 msgid "Whether to play sound notifications when away or busy."
 msgstr ""
 "Indica se reproducir ou non un son para notificar cando se está ocupado ou "
 "ausente."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:78
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:79
 msgid "Whether to show a popup notification when a contact goes offline."
 msgstr ""
 "Indica se mostrar ou non unha notificación emerxente cando un contacto está "
 "desconectado."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:79
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:80
 msgid "Whether to show a popup notification when a contact goes online."
 msgstr ""
 "Indica se mostrar ou non unha notificación emerxente cando un contacto está "
 "conectado."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:80
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:81
 msgid ""
 "Whether to show a popup notification when receiving a new message even if "
 "the chat is already opened, but not focused."
@@ -489,14 +494,19 @@ msgstr ""
 "mensaxe nova, aínda cando a conversa xa estea aberta mais non estea enfocada."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:81
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:82
 msgid "Whether to show a popup notification when receiving a new message."
 msgstr ""
 "Indica se mostrar ou non unha notificación emerxente cando se reciba unha "
 "mensaxe nova."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:82
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:83
+msgid "Whether to show account balances in the contact list."
+msgstr "Indica se mostrar ou non os balances na lista de contactos."
+
+# rever
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:84
 msgid ""
 "Whether to show avatars for contacts in the contact list and chat windows."
 msgstr ""
@@ -504,38 +514,38 @@ msgstr ""
 "das xanelas de conversa."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:83
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:85
 msgid "Whether to show contacts that are offline in the contact list."
 msgstr ""
 "Indica se mostrar ou non os contactos que están desconectados na lista de "
 "contactos."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:84
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:86
 msgid "Whether to show popup notifications when away or busy."
 msgstr ""
 "Indica se mostrar ou non as notificacións emerxentes cando se está ausente "
 "ou ocupado."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:85
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:87
 msgid "Whether to show protocols for contacts in the contact list."
 msgstr ""
 "Indica se mostrar ou non os protocolos para os contacto na lista de "
 "contactos."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:86
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:88
 msgid "Whether to show the contact list in chat rooms."
 msgstr "Indica se mostrar ou non a lista de contactos nas salas de conversa."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:87
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:89
 msgid "Whether to show the contact list in compact mode."
 msgstr "Indica se mostrar ou non a lista de contactos no modo compacto."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:88
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:90
 msgid ""
 "Whether to show the message dialog about closing the main window with the "
 "'x' button in the title bar."
@@ -544,12 +554,12 @@ msgstr ""
 "principal co botón 'x' da barra de título."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:89
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:91
 msgid "Whether to use the theme for chat rooms."
 msgstr "Indica se usar ou non o tema para as salas de conversa."
 
 # rever
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:90
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:92
 msgid ""
 "Which criterion to use when sorting the contact list. Default is to sort by "
 "the contact's name with the value \"name\". A value of \"state\" will sort "
@@ -565,7 +575,7 @@ msgstr "Xestionar as contas de mensaxaría e VoIP"
 
 #. Tweak the dialog
 #: ../data/empathy-accounts.desktop.in.in.h:2
-#: ../src/empathy-accounts-dialog.c:2340
+#: ../src/empathy-accounts-dialog.c:2320
 msgid "Messaging and VoIP Accounts"
 msgstr "Contas de mensaxaría e VoIP"
 
@@ -620,158 +630,158 @@ msgstr "Produciuse un erro ao tentar transferir o ficheiro"
 msgid "The other participant is unable to transfer the file"
 msgstr "O outro participante non pode transferir o ficheiro"
 
-#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:383
+#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:384
 msgid "Unknown reason"
 msgstr "Motivo descoñecido"
 
-#: ../libempathy/empathy-utils.c:304
+#: ../libempathy/empathy-utils.c:305
 msgid "Available"
 msgstr "Dispoñíbel"
 
-#: ../libempathy/empathy-utils.c:306
+#: ../libempathy/empathy-utils.c:307
 msgid "Busy"
 msgstr "Ocupado"
 
-#: ../libempathy/empathy-utils.c:309
+#: ../libempathy/empathy-utils.c:310
 msgid "Away"
 msgstr "Ausente"
 
-#: ../libempathy/empathy-utils.c:311
+#: ../libempathy/empathy-utils.c:312
 msgid "Invisible"
 msgstr "Invisíbel"
 
-#: ../libempathy/empathy-utils.c:313
+#: ../libempathy/empathy-utils.c:314
 msgid "Offline"
 msgstr "Desconectado"
 
 #. translators: presence type is unknown
-#: ../libempathy/empathy-utils.c:316
+#: ../libempathy/empathy-utils.c:317
 msgctxt "presence"
 msgid "Unknown"
 msgstr "Descoñecido"
 
 # rever
-#: ../libempathy/empathy-utils.c:355
+#: ../libempathy/empathy-utils.c:356
 msgid "No reason specified"
 msgstr "Non se especificou un motivo"
 
-#: ../libempathy/empathy-utils.c:357 ../libempathy/empathy-utils.c:413
+#: ../libempathy/empathy-utils.c:358 ../libempathy/empathy-utils.c:414
 msgid "Status is set to offline"
 msgstr "O estado está definido a desconectado"
 
 # rever
-#: ../libempathy/empathy-utils.c:359 ../libempathy/empathy-utils.c:393
+#: ../libempathy/empathy-utils.c:360 ../libempathy/empathy-utils.c:394
 msgid "Network error"
 msgstr "Erro de rede"
 
-#: ../libempathy/empathy-utils.c:361 ../libempathy/empathy-utils.c:395
+#: ../libempathy/empathy-utils.c:362 ../libempathy/empathy-utils.c:396
 msgid "Authentication failed"
 msgstr "Fallou a autenticación"
 
 # rever
-#: ../libempathy/empathy-utils.c:363 ../libempathy/empathy-utils.c:397
+#: ../libempathy/empathy-utils.c:364 ../libempathy/empathy-utils.c:398
 msgid "Encryption error"
 msgstr "Erro de cifrado"
 
 # rever
-#: ../libempathy/empathy-utils.c:365
+#: ../libempathy/empathy-utils.c:366
 msgid "Name in use"
 msgstr "Nome en uso"
 
 # rever
-#: ../libempathy/empathy-utils.c:367 ../libempathy/empathy-utils.c:399
+#: ../libempathy/empathy-utils.c:368 ../libempathy/empathy-utils.c:400
 msgid "Certificate not provided"
 msgstr "Non se proporcionou o certificado"
 
-#: ../libempathy/empathy-utils.c:369 ../libempathy/empathy-utils.c:401
+#: ../libempathy/empathy-utils.c:370 ../libempathy/empathy-utils.c:402
 msgid "Certificate untrusted"
 msgstr "Certificado non fiábel"
 
 # rever
-#: ../libempathy/empathy-utils.c:371 ../libempathy/empathy-utils.c:403
+#: ../libempathy/empathy-utils.c:372 ../libempathy/empathy-utils.c:404
 msgid "Certificate expired"
 msgstr "O certificado caducou"
 
 # rever
-#: ../libempathy/empathy-utils.c:373 ../libempathy/empathy-utils.c:405
+#: ../libempathy/empathy-utils.c:374 ../libempathy/empathy-utils.c:406
 msgid "Certificate not activated"
 msgstr "O certificado non está activado"
 
 # rever
-#: ../libempathy/empathy-utils.c:375 ../libempathy/empathy-utils.c:407
+#: ../libempathy/empathy-utils.c:376 ../libempathy/empathy-utils.c:408
 msgid "Certificate hostname mismatch"
 msgstr "O nome do host do certificado non coincide"
 
 # rever
-#: ../libempathy/empathy-utils.c:377 ../libempathy/empathy-utils.c:409
+#: ../libempathy/empathy-utils.c:378 ../libempathy/empathy-utils.c:410
 msgid "Certificate fingerprint mismatch"
 msgstr "A impresión dixital do certificado non coincide"
 
 # rever
-#: ../libempathy/empathy-utils.c:379 ../libempathy/empathy-utils.c:411
+#: ../libempathy/empathy-utils.c:380 ../libempathy/empathy-utils.c:412
 msgid "Certificate self-signed"
 msgstr "Certificado autoasinado"
 
 # rever
-#: ../libempathy/empathy-utils.c:381
+#: ../libempathy/empathy-utils.c:382
 msgid "Certificate error"
 msgstr "Erro de certificado"
 
-#: ../libempathy/empathy-utils.c:415
+#: ../libempathy/empathy-utils.c:416
 msgid "Encryption is not available"
 msgstr "O cifrado non está dispoñíbel"
 
 # rever
-#: ../libempathy/empathy-utils.c:417
+#: ../libempathy/empathy-utils.c:418
 msgid "Certificate is invalid"
 msgstr "O certificado non é válido"
 
 # rever
-#: ../libempathy/empathy-utils.c:419
+#: ../libempathy/empathy-utils.c:420
 msgid "Connection has been refused"
 msgstr "Rexeitouse a conexión"
 
 # rever
-#: ../libempathy/empathy-utils.c:421
+#: ../libempathy/empathy-utils.c:422
 msgid "Connection can't be established"
 msgstr "Non é posíbel estabelecer a conexión"
 
 # rever
-#: ../libempathy/empathy-utils.c:423
+#: ../libempathy/empathy-utils.c:424
 msgid "Connection has been lost"
 msgstr "Perdeuse a conexión"
 
-#: ../libempathy/empathy-utils.c:425
+#: ../libempathy/empathy-utils.c:426
 msgid "This resource is already connected to the server"
 msgstr "Este recurso xa está conectado ao servidor"
 
-#: ../libempathy/empathy-utils.c:427
+#: ../libempathy/empathy-utils.c:428
 msgid ""
 "Connection has been replaced by a new connection using the same resource"
 msgstr ""
 "A conexión foi substituída por unha nova conexión empregando o mesmo recurso"
 
-#: ../libempathy/empathy-utils.c:430
+#: ../libempathy/empathy-utils.c:431
 msgid "The account already exists on the server"
 msgstr "Esta conta xa existe no servidor"
 
-#: ../libempathy/empathy-utils.c:432
+#: ../libempathy/empathy-utils.c:433
 msgid "Server is currently too busy to handle the connection"
 msgstr "Nestes intres o servidor está moi ocupado para xesionar a conexión"
 
 # rever
-#: ../libempathy/empathy-utils.c:434
+#: ../libempathy/empathy-utils.c:435
 msgid "Certificate has been revoked"
 msgstr "O certificado foi revocado"
 
-#: ../libempathy/empathy-utils.c:436
+#: ../libempathy/empathy-utils.c:437
 msgid ""
 "Certificate uses an insecure cipher algorithm or is cryptographically weak"
 msgstr ""
 "O certificado usa un algoritmo de cifrado inseguro ou cripotograficamente "
 "débil"
 
-#: ../libempathy/empathy-utils.c:439
+#: ../libempathy/empathy-utils.c:440
 msgid ""
 "The length of the server certificate, or the depth of the server certificate "
 "chain, exceed the limits imposed by the cryptography library"
@@ -781,21 +791,21 @@ msgstr ""
 "criptografía."
 
 # rever
-#: ../libempathy/empathy-utils.c:602
+#: ../libempathy/empathy-utils.c:603
 #: ../libempathy-gtk/empathy-contact-list-store.h:73
 msgid "People Nearby"
 msgstr "Persoas próximas"
 
 # rever
-#: ../libempathy/empathy-utils.c:607
+#: ../libempathy/empathy-utils.c:608
 msgid "Yahoo! Japan"
 msgstr "Yahoo! Japan"
 
-#: ../libempathy/empathy-utils.c:636
+#: ../libempathy/empathy-utils.c:637
 msgid "Google Talk"
 msgstr "Google Talk"
 
-#: ../libempathy/empathy-utils.c:637
+#: ../libempathy/empathy-utils.c:638
 msgid "Facebook Chat"
 msgstr "Chat de Facebook"
 
@@ -920,20 +930,20 @@ msgstr "Ca_ncelar"
 #. * like: "MyUserName on freenode".
 #. * You should reverse the order of these arguments if the
 #. * server should come before the login id in your locale.
-#: ../libempathy-gtk/empathy-account-widget.c:2413
+#: ../libempathy-gtk/empathy-account-widget.c:2410
 #, c-format
 msgid "%1$s on %2$s"
 msgstr "%1$s sobre %2$s"
 
 #. To translators: The parameter is the protocol name. The resulting
 #. * string will be something like: "Jabber Account"
-#: ../libempathy-gtk/empathy-account-widget.c:2439
+#: ../libempathy-gtk/empathy-account-widget.c:2436
 #, c-format
 msgid "%s Account"
 msgstr "Conta %s"
 
 # rever
-#: ../libempathy-gtk/empathy-account-widget.c:2443
+#: ../libempathy-gtk/empathy-account-widget.c:2440
 msgid "New account"
 msgstr "Conta nova"
 
@@ -1378,35 +1388,35 @@ msgstr "Todos os ficheiros"
 msgid "Click to enlarge"
 msgstr "Prema para ampliar"
 
-#: ../libempathy-gtk/empathy-chat.c:652
+#: ../libempathy-gtk/empathy-chat.c:668
 msgid "Failed to open private chat"
 msgstr "Produciuse un fallo ao abrir un chat privado"
 
-#: ../libempathy-gtk/empathy-chat.c:717
+#: ../libempathy-gtk/empathy-chat.c:733
 msgid "Topic not supported on this conversation"
 msgstr "Ese asunto non se admite nesta conversación"
 
-#: ../libempathy-gtk/empathy-chat.c:723
+#: ../libempathy-gtk/empathy-chat.c:739
 msgid "You are not allowed to change the topic"
 msgstr "Non se lle permite cambiar o asunto"
 
-#: ../libempathy-gtk/empathy-chat.c:932
+#: ../libempathy-gtk/empathy-chat.c:948
 msgid "/clear: clear all messages from the current conversation"
 msgstr "/clear, limpa todas as mensaxes da conversa actual"
 
-#: ../libempathy-gtk/empathy-chat.c:935
+#: ../libempathy-gtk/empathy-chat.c:951
 msgid "/topic <topic>: set the topic of the current conversation"
 msgstr "/topic <topic>, estabelece o asunto da conversa actual"
 
-#: ../libempathy-gtk/empathy-chat.c:938
+#: ../libempathy-gtk/empathy-chat.c:954
 msgid "/join <chat room ID>: join a new chat room"
 msgstr "/join <chatroom id>, unirse a unha nova sala de conversa"
 
-#: ../libempathy-gtk/empathy-chat.c:941
+#: ../libempathy-gtk/empathy-chat.c:957
 msgid "/j <chat room ID>: join a new chat room"
 msgstr "/j <chatroom id>, unirse a unha nova sala de conversa"
 
-#: ../libempathy-gtk/empathy-chat.c:946
+#: ../libempathy-gtk/empathy-chat.c:962
 msgid ""
 "/part [<chat room ID>] [<reason>]: leave the chat room, by default the "
 "current one"
@@ -1414,23 +1424,23 @@ msgstr ""
 "/part [<chat room ID>] [<reason>]: abandonar a sala de char, por omisión a "
 "actual"
 
-#: ../libempathy-gtk/empathy-chat.c:951
+#: ../libempathy-gtk/empathy-chat.c:967
 msgid "/query <contact ID> [<message>]: open a private chat"
 msgstr "/query <contact id> [<message>], abre unha conversa privada"
 
-#: ../libempathy-gtk/empathy-chat.c:954
+#: ../libempathy-gtk/empathy-chat.c:970
 msgid "/msg <contact ID> <message>: open a private chat"
 msgstr "/msg <contact id> <message>, abre unha conversa privada"
 
-#: ../libempathy-gtk/empathy-chat.c:957
+#: ../libempathy-gtk/empathy-chat.c:973
 msgid "/nick <nickname>: change your nickname on the current server"
 msgstr "/nick <nickname>, cambia o seu nome de usuario no servidor actual"
 
-#: ../libempathy-gtk/empathy-chat.c:960
+#: ../libempathy-gtk/empathy-chat.c:976
 msgid "/me <message>: send an ACTION message to the current conversation"
 msgstr "/me <message>, envía unha mensaxe ACTION á conversa actual"
 
-#: ../libempathy-gtk/empathy-chat.c:963
+#: ../libempathy-gtk/empathy-chat.c:979
 msgid ""
 "/say <message>: send <message> to the current conversation. This is used to "
 "send a message starting with a '/'. For example: \"/say /join is used to "
@@ -1440,7 +1450,7 @@ msgstr ""
 "unha mensaxe que comeza cunha '/'. Por exemplo: \"/say /join úsase para "
 "unirse a unha nova sala de conversa\""
 
-#: ../libempathy-gtk/empathy-chat.c:968
+#: ../libempathy-gtk/empathy-chat.c:984
 msgid ""
 "/help [<command>]: show all supported commands. If <command> is defined, "
 "show its usage."
@@ -1448,109 +1458,119 @@ msgstr ""
 "/help [<command>], mostra todas as ordes admitidas. Se <command> está "
 "definida, mostra o seu uso."
 
-#: ../libempathy-gtk/empathy-chat.c:978
+#: ../libempathy-gtk/empathy-chat.c:994
 #, c-format
 msgid "Usage: %s"
 msgstr "Uso: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1017
+#: ../libempathy-gtk/empathy-chat.c:1033
 msgid "Unknown command"
 msgstr "Orde descoñecida"
 
-#: ../libempathy-gtk/empathy-chat.c:1143
+#: ../libempathy-gtk/empathy-chat.c:1159
 msgid "Unknown command; see /help for the available commands"
 msgstr "Orde descoñecida, vexa /help para obter as ordes dispoñíbeis"
 
-#: ../libempathy-gtk/empathy-chat.c:1281
+#. translators: error used when user doesn't have enough credit on his
+#. * account to send the message.
+#: ../libempathy-gtk/empathy-chat.c:1299
+msgid "insufficient balance to send message"
+msgstr "non ten balance suficiente para enviar a mensaxe"
+
+#: ../libempathy-gtk/empathy-chat.c:1301
+msgid "not capable"
+msgstr "non é posíbel"
+
+#: ../libempathy-gtk/empathy-chat.c:1308
 msgid "offline"
 msgstr "desconectado"
 
-#: ../libempathy-gtk/empathy-chat.c:1284
+#: ../libempathy-gtk/empathy-chat.c:1311
 msgid "invalid contact"
 msgstr "contacto incorrecto"
 
-#: ../libempathy-gtk/empathy-chat.c:1287
+#: ../libempathy-gtk/empathy-chat.c:1314
 msgid "permission denied"
 msgstr "permiso denegado"
 
 # rever
-#: ../libempathy-gtk/empathy-chat.c:1290
+#: ../libempathy-gtk/empathy-chat.c:1317
 msgid "too long message"
 msgstr "a mensaxe é demasiado longa"
 
-#: ../libempathy-gtk/empathy-chat.c:1293
+#: ../libempathy-gtk/empathy-chat.c:1320
 msgid "not implemented"
 msgstr "non implementado"
 
-#: ../libempathy-gtk/empathy-chat.c:1297
+#: ../libempathy-gtk/empathy-chat.c:1324
 msgid "unknown"
 msgstr "descoñecido"
 
 # rever
-#: ../libempathy-gtk/empathy-chat.c:1302
+#: ../libempathy-gtk/empathy-chat.c:1330
 #, c-format
 msgid "Error sending message '%s': %s"
 msgstr "Produciuse un erro ao enviar a mensaxe '%s': %s"
 
 # rever
-#: ../libempathy-gtk/empathy-chat.c:1306
+#: ../libempathy-gtk/empathy-chat.c:1334
 #, c-format
 msgid "Error sending message: %s"
 msgstr "Produciuse un erro ao enviar a mensaxe: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1367 ../src/empathy-chat-window.c:717
+#: ../libempathy-gtk/empathy-chat.c:1395 ../src/empathy-chat-window.c:760
 msgid "Topic:"
 msgstr "Asunto:"
 
 # rever
-#: ../libempathy-gtk/empathy-chat.c:1379
+#: ../libempathy-gtk/empathy-chat.c:1407
 #, c-format
 msgid "Topic set to: %s"
 msgstr "Cambiouse o asunto a: %s"
 
 # rever
-#: ../libempathy-gtk/empathy-chat.c:1381
+#: ../libempathy-gtk/empathy-chat.c:1409
 msgid "No topic defined"
 msgstr "Non se definiu un asunto"
 
-#: ../libempathy-gtk/empathy-chat.c:1888
+#: ../libempathy-gtk/empathy-chat.c:1916
 msgid "(No Suggestions)"
 msgstr "(Sen suxestións)"
 
 #. translators: %s is the selected word
-#: ../libempathy-gtk/empathy-chat.c:1956
+#: ../libempathy-gtk/empathy-chat.c:1984
 #, c-format
 msgid "Add '%s' to Dictionary"
 msgstr "Engadir «%s» ao dicionario"
 
 #. translators: first %s is the selected word,
 #. * second %s is the language name of the target dictionary
-#: ../libempathy-gtk/empathy-chat.c:1993
+#: ../libempathy-gtk/empathy-chat.c:2021
 #, c-format
 msgid "Add '%s' to %s Dictionary"
 msgstr "Engadir «%s» ao dicionario de %s"
 
-#: ../libempathy-gtk/empathy-chat.c:2050
+#: ../libempathy-gtk/empathy-chat.c:2078
 msgid "Insert Smiley"
 msgstr "Inserir unha emoticona"
 
 #. send button
-#: ../libempathy-gtk/empathy-chat.c:2068
+#: ../libempathy-gtk/empathy-chat.c:2096
 #: ../libempathy-gtk/empathy-ui-utils.c:1808
 msgid "_Send"
 msgstr "_Enviar"
 
 #. Spelling suggestions
-#: ../libempathy-gtk/empathy-chat.c:2103
+#: ../libempathy-gtk/empathy-chat.c:2131
 msgid "_Spelling Suggestions"
 msgstr "Suxestións de _ortografía"
 
-#: ../libempathy-gtk/empathy-chat.c:2192
+#: ../libempathy-gtk/empathy-chat.c:2220
 msgid "Failed to retrieve recent logs"
 msgstr "Produciuse un fallo ao obter os rexistros recentes"
 
 # rever
-#: ../libempathy-gtk/empathy-chat.c:2303
+#: ../libempathy-gtk/empathy-chat.c:2331
 #, c-format
 msgid "%s has disconnected"
 msgstr "%s desconectou"
@@ -1558,12 +1578,12 @@ msgstr "%s desconectou"
 #. translators: reverse the order of these arguments
 #. * if the kicked should come before the kicker in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2310
+#: ../libempathy-gtk/empathy-chat.c:2338
 #, c-format
 msgid "%1$s was kicked by %2$s"
 msgstr "%1$s foi expulsado por %2$s"
 
-#: ../libempathy-gtk/empathy-chat.c:2313
+#: ../libempathy-gtk/empathy-chat.c:2341
 #, c-format
 msgid "%s was kicked"
 msgstr "%s foi expulsado"
@@ -1571,17 +1591,17 @@ msgstr "%s foi expulsado"
 #. translators: reverse the order of these arguments
 #. * if the banned should come before the banner in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2321
+#: ../libempathy-gtk/empathy-chat.c:2349
 #, c-format
 msgid "%1$s was banned by %2$s"
 msgstr "%1$s foi vetado por %2$s"
 
-#: ../libempathy-gtk/empathy-chat.c:2324
+#: ../libempathy-gtk/empathy-chat.c:2352
 #, c-format
 msgid "%s was banned"
 msgstr "%s foi excluído"
 
-#: ../libempathy-gtk/empathy-chat.c:2328
+#: ../libempathy-gtk/empathy-chat.c:2356
 #, c-format
 msgid "%s has left the room"
 msgstr "%s deixou a sala"
@@ -1591,95 +1611,102 @@ msgstr "%s deixou a sala"
 #. * given by the user living the room. If this poses a problem,
 #. * please let us know. :-)
 #.
-#: ../libempathy-gtk/empathy-chat.c:2337
+#: ../libempathy-gtk/empathy-chat.c:2365
 #, c-format
 msgid " (%s)"
 msgstr " (%s)"
 
 # rever
-#: ../libempathy-gtk/empathy-chat.c:2362
+#: ../libempathy-gtk/empathy-chat.c:2390
 #, c-format
 msgid "%s has joined the room"
 msgstr "%s uniuse á sala"
 
-#: ../libempathy-gtk/empathy-chat.c:2387
+#: ../libempathy-gtk/empathy-chat.c:2415
 #, c-format
 msgid "%s is now known as %s"
 msgstr "%s agora é coñecido como %s"
 
-#: ../libempathy-gtk/empathy-chat.c:2526
+#: ../libempathy-gtk/empathy-chat.c:2554
 #: ../src/empathy-streamed-media-window.c:1957
-#: ../src/empathy-event-manager.c:1126
+#: ../src/empathy-event-manager.c:1116
 msgid "Disconnected"
 msgstr "Desconectado"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3158
+#: ../libempathy-gtk/empathy-chat.c:3202
 msgid "Would you like to store this password?"
 msgstr "Desexa gardar este contrasinal?"
 
-#: ../libempathy-gtk/empathy-chat.c:3164
+#: ../libempathy-gtk/empathy-chat.c:3208
 msgid "Remember"
 msgstr "Lembrar"
 
-#: ../libempathy-gtk/empathy-chat.c:3174
+#: ../libempathy-gtk/empathy-chat.c:3218
 msgid "Not now"
 msgstr "Agora non"
 
-#: ../libempathy-gtk/empathy-chat.c:3218
+#: ../libempathy-gtk/empathy-chat.c:3262
 msgid "Retry"
 msgstr "Reintentar"
 
-#: ../libempathy-gtk/empathy-chat.c:3222
+#: ../libempathy-gtk/empathy-chat.c:3266
 msgid "Wrong password; please try again:"
 msgstr "O contrasinal é incorrecto, ténteo de novo:"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3339
+#: ../libempathy-gtk/empathy-chat.c:3383
 msgid "This room is protected by a password:"
 msgstr "Esta sala está protexida por un contrasinal:"
 
-#: ../libempathy-gtk/empathy-chat.c:3366
+#: ../libempathy-gtk/empathy-chat.c:3410
 msgid "Join"
 msgstr "Unirse"
 
-#: ../libempathy-gtk/empathy-chat.c:3536 ../src/empathy-event-manager.c:1147
+#: ../libempathy-gtk/empathy-chat.c:3602 ../src/empathy-event-manager.c:1137
 msgid "Connected"
 msgstr "Conectado"
 
-#: ../libempathy-gtk/empathy-chat.c:3589
+#: ../libempathy-gtk/empathy-chat.c:3657
 #: ../libempathy-gtk/empathy-log-window.c:650
 msgid "Conversation"
 msgstr "Conversa"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:422
+#. Translators: this string is a something like
+#. * "Escher Cat (SMS)"
+#: ../libempathy-gtk/empathy-chat.c:3662
+#, c-format
+msgid "%s (SMS)"
+msgstr "%s (SMS)"
+
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:423
 msgid "Unknown or invalid identifier"
 msgstr "Identificador descoñecido ou non válido"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:424
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:425
 msgid "Contact blocking temporarily unavailable"
 msgstr "Bloqueo de contactos non dispoñíbel temporalmente"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:426
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:427
 msgid "Contact blocking unavailable"
 msgstr "Bloqueo de contactos non dispoñíbel"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:428
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:429
 msgid "Permission Denied"
 msgstr "Permiso denegado"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:432
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:433
 msgid "Could not block contact"
 msgstr "Non foi posíbel bloquear o contacto"
 
 # rever
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:701
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:702
 msgid "Edit Blocked Contacts"
 msgstr "Editar os contactos bloqueados"
 
 #. Account and Identifier
 #: ../libempathy-gtk/empathy-contact-blocking-dialog.ui.h:1
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:520
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:521
 #: ../libempathy-gtk/empathy-contact-widget.ui.h:2
 #: ../libempathy-gtk/empathy-individual-widget.c:1479
 #: ../libempathy-gtk/empathy-contact-selector-dialog.ui.h:1
@@ -1690,13 +1717,13 @@ msgstr "Conta:"
 
 #. Copy Link Address menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:320
-#: ../libempathy-gtk/empathy-theme-adium.c:962
+#: ../libempathy-gtk/empathy-theme-adium.c:996
 msgid "_Copy Link Address"
 msgstr "_Copiar o enderezo da ligazón"
 
 #. Open Link menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:327
-#: ../libempathy-gtk/empathy-theme-adium.c:969
+#: ../libempathy-gtk/empathy-theme-adium.c:1003
 msgid "_Open Link"
 msgstr "_Abrir a ligazón"
 
@@ -1770,41 +1797,41 @@ msgstr "Persoas favoritas"
 
 # rever
 #: ../libempathy-gtk/empathy-contact-list-view.c:1987
-#: ../libempathy-gtk/empathy-individual-view.c:2343
+#: ../libempathy-gtk/empathy-individual-view.c:2386
 #, c-format
 msgid "Do you really want to remove the group '%s'?"
 msgstr "Está seguro de que quere eliminar o grupo '%s'?"
 
 # rever
 #: ../libempathy-gtk/empathy-contact-list-view.c:1989
-#: ../libempathy-gtk/empathy-individual-view.c:2346
+#: ../libempathy-gtk/empathy-individual-view.c:2389
 msgid "Removing group"
 msgstr "Eliminando o grupo"
 
 #. Remove
 #: ../libempathy-gtk/empathy-contact-list-view.c:2038
 #: ../libempathy-gtk/empathy-contact-list-view.c:2115
-#: ../libempathy-gtk/empathy-individual-view.c:2401
-#: ../libempathy-gtk/empathy-individual-view.c:2594
+#: ../libempathy-gtk/empathy-individual-view.c:2444
+#: ../libempathy-gtk/empathy-individual-view.c:2637
 #: ../src/empathy-accounts-dialog.ui.h:7
 msgid "_Remove"
 msgstr "_Eliminar"
 
 # rever
 #: ../libempathy-gtk/empathy-contact-list-view.c:2068
-#: ../libempathy-gtk/empathy-individual-view.c:2465
+#: ../libempathy-gtk/empathy-individual-view.c:2508
 #, c-format
 msgid "Do you really want to remove the contact '%s'?"
 msgstr "Está seguro de quere eliminar o contacto '%s'?"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:2070
-#: ../libempathy-gtk/empathy-individual-view.c:2486
+#: ../libempathy-gtk/empathy-individual-view.c:2529
 msgid "Removing contact"
 msgstr "Eliminando o contacto"
 
 # rever
 #: ../libempathy-gtk/empathy-contact-menu.c:219
-#: ../src/empathy-main-window.ui.h:13
+#: ../src/empathy-main-window.ui.h:14
 msgid "_Add Contact…"
 msgstr "Eng_adir un contacto…"
 
@@ -1814,50 +1841,50 @@ msgid "_Block Contact"
 msgstr "_Bloquear contacto"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:328
-#: ../libempathy-gtk/empathy-individual-menu.c:517
-#: ../src/empathy-main-window.ui.h:15
+#: ../libempathy-gtk/empathy-individual-menu.c:536
+#: ../src/empathy-main-window.ui.h:16
 msgid "_Chat"
 msgstr "_Conversa"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:359
-#: ../libempathy-gtk/empathy-individual-menu.c:560
+#: ../libempathy-gtk/empathy-individual-menu.c:625
 msgctxt "menu item"
 msgid "_Audio Call"
 msgstr "_Audiochamada"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:390
-#: ../libempathy-gtk/empathy-individual-menu.c:602
+#: ../libempathy-gtk/empathy-individual-menu.c:667
 msgctxt "menu item"
 msgid "_Video Call"
 msgstr "_Videochamada"
 
 # rever
 #: ../libempathy-gtk/empathy-contact-menu.c:436
-#: ../libempathy-gtk/empathy-individual-menu.c:645
-#: ../src/empathy-main-window.ui.h:26
+#: ../libempathy-gtk/empathy-individual-menu.c:710
+#: ../src/empathy-main-window.ui.h:27
 msgid "_Previous Conversations"
 msgstr "Conversas _previas"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:458
-#: ../libempathy-gtk/empathy-individual-menu.c:686
+#: ../libempathy-gtk/empathy-individual-menu.c:751
 msgid "Send File"
 msgstr "Enviar ficheiro"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:481
-#: ../libempathy-gtk/empathy-individual-menu.c:728
+#: ../libempathy-gtk/empathy-individual-menu.c:793
 msgid "Share My Desktop"
 msgstr "Compartir o meu escritorio"
 
 # rever
 #: ../libempathy-gtk/empathy-contact-menu.c:521
-#: ../libempathy-gtk/empathy-contact-widget.c:1761
-#: ../libempathy-gtk/empathy-individual-menu.c:763
+#: ../libempathy-gtk/empathy-contact-widget.c:1751
+#: ../libempathy-gtk/empathy-individual-menu.c:828
 #: ../libempathy-gtk/empathy-individual-widget.c:1370
 msgid "Favorite"
 msgstr "Favorito"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:550
-#: ../libempathy-gtk/empathy-individual-menu.c:791
+#: ../libempathy-gtk/empathy-individual-menu.c:856
 msgid "Infor_mation"
 msgstr "Infor_mación"
 
@@ -1868,34 +1895,34 @@ msgstr "_Editar"
 
 # rever
 #: ../libempathy-gtk/empathy-contact-menu.c:650
-#: ../libempathy-gtk/empathy-individual-menu.c:972
-#: ../src/empathy-chat-window.c:935
+#: ../libempathy-gtk/empathy-individual-menu.c:1037
+#: ../src/empathy-chat-window.c:986
 msgid "Inviting you to this room"
 msgstr "Invítao a vostede a esta sala"
 
 # rever
 #: ../libempathy-gtk/empathy-contact-menu.c:681
-#: ../libempathy-gtk/empathy-individual-menu.c:1019
+#: ../libempathy-gtk/empathy-individual-menu.c:1084
 msgid "_Invite to Chat Room"
 msgstr "Conv_idar a sala de conversa"
 
 # rever
 #. Title
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:513
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:514
 msgid "Search contacts"
 msgstr "Buscar contactos"
 
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:543
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:544
 msgid "Search: "
 msgstr "Buscar:"
 
 # rever
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:601
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:602
 msgid "_Add Contact"
 msgstr "_Engadir contacto"
 
 # rever
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:619
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:620
 msgid "No contacts found"
 msgstr "Non se atoparon contactos"
 
@@ -2050,8 +2077,8 @@ msgstr "Latitude:"
 msgid "Altitude:"
 msgstr "Altitude:"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:871
-#: ../libempathy-gtk/empathy-contact-widget.c:886
+#: ../libempathy-gtk/empathy-contact-widget.c:861
+#: ../libempathy-gtk/empathy-contact-widget.c:876
 #: ../libempathy-gtk/empathy-individual-widget.c:616
 #: ../libempathy-gtk/empathy-individual-widget.c:631
 #: ../src/empathy-preferences.ui.h:12
@@ -2059,25 +2086,25 @@ msgid "Location"
 msgstr "Localización"
 
 #. translators: format is "Location, $date"
-#: ../libempathy-gtk/empathy-contact-widget.c:888
+#: ../libempathy-gtk/empathy-contact-widget.c:878
 #: ../libempathy-gtk/empathy-individual-widget.c:633
 #, c-format
 msgid "%s, %s"
 msgstr "%s, %s"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:940
+#: ../libempathy-gtk/empathy-contact-widget.c:930
 #: ../libempathy-gtk/empathy-individual-widget.c:682
 msgid "%B %e, %Y at %R UTC"
 msgstr "%B %e, %Y de %R UTC"
 
 # rever
-#: ../libempathy-gtk/empathy-contact-widget.c:1022
+#: ../libempathy-gtk/empathy-contact-widget.c:1012
 #: ../libempathy-gtk/empathy-individual-widget.c:917
 msgid "Save Avatar"
 msgstr "Gardar o avatar"
 
 # rever
-#: ../libempathy-gtk/empathy-contact-widget.c:1078
+#: ../libempathy-gtk/empathy-contact-widget.c:1068
 #: ../libempathy-gtk/empathy-individual-widget.c:975
 msgid "Unable to save avatar"
 msgstr "Non foi posíbel gardar o avatar"
@@ -2150,7 +2177,7 @@ msgid "Select"
 msgstr "Seleccionar"
 
 #: ../libempathy-gtk/empathy-groups-widget.c:408
-#: ../src/empathy-main-window.c:1436
+#: ../src/empathy-main-window.c:1770
 msgid "Group"
 msgstr "Grupo"
 
@@ -2193,7 +2220,13 @@ msgstr "Ligaranse entre si os contactos seleccionados na lista da esquerda"
 msgid "%s (%s)"
 msgstr "%s (%s)"
 
-#: ../libempathy-gtk/empathy-individual-menu.c:839
+#. add an SMS button
+#: ../libempathy-gtk/empathy-individual-menu.c:582
+#: ../libempathy-gtk/empathy-new-message-dialog.c:248
+msgid "_SMS"
+msgstr "_SMS"
+
+#: ../libempathy-gtk/empathy-individual-menu.c:904
 msgctxt "Edit individual (contextual menu)"
 msgid "_Edit"
 msgstr "_Editar"
@@ -2201,16 +2234,16 @@ msgstr "_Editar"
 # rever
 #. Translators: this is a verb meaning "to connect two contacts together
 #. * to form a meta-contact".
-#: ../libempathy-gtk/empathy-individual-menu.c:865
+#: ../libempathy-gtk/empathy-individual-menu.c:930
 msgctxt "Link individual (contextual menu)"
 msgid "_Link Contacts…"
 msgstr "_Ligar contactos…"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2308
+#: ../libempathy-gtk/empathy-individual-view.c:2351
 msgid "Delete and _Block"
 msgstr "Eliminar e _bloquear"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2474
+#: ../libempathy-gtk/empathy-individual-view.c:2517
 #, c-format
 msgid ""
 "Do you really want to remove the linked contact '%s'? Note that this will "
@@ -2345,12 +2378,12 @@ msgid "Contact ID:"
 msgstr "ID do contacto:"
 
 #. add chat button
-#: ../libempathy-gtk/empathy-new-message-dialog.c:171
+#: ../libempathy-gtk/empathy-new-message-dialog.c:258
 msgid "C_hat"
 msgstr "Con_versa"
 
 #. Tweak the dialog
-#: ../libempathy-gtk/empathy-new-message-dialog.c:181
+#: ../libempathy-gtk/empathy-new-message-dialog.c:277
 msgid "New Conversation"
 msgstr "Conversa nova"
 
@@ -2503,19 +2536,23 @@ msgstr "Gardar a mensaxe de estado _novo"
 msgid "Saved Status Messages"
 msgstr "Mensaxes de estado gardados"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:67
+#: ../libempathy-gtk/empathy-theme-adium.c:1462
+msgid "Normal"
+msgstr "Normal"
+
+#: ../libempathy-gtk/empathy-theme-manager.c:68
 msgid "Classic"
 msgstr "Clásico"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:68
+#: ../libempathy-gtk/empathy-theme-manager.c:69
 msgid "Simple"
 msgstr "Simple"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:69
+#: ../libempathy-gtk/empathy-theme-manager.c:70
 msgid "Clean"
 msgstr "Limpo"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:70
+#: ../libempathy-gtk/empathy-theme-manager.c:71
 msgid "Blue"
 msgstr "Azul"
 
@@ -2992,8 +3029,8 @@ msgid "Select the accounts you want to import:"
 msgstr "Seleccione as contas que quere importar:"
 
 #: ../src/empathy-account-assistant.c:813
-#: ../src/empathy-new-chatroom-dialog.c:562
-#: ../src/empathy-new-chatroom-dialog.c:563
+#: ../src/empathy-new-chatroom-dialog.c:555
+#: ../src/empathy-new-chatroom-dialog.c:556
 msgid "Yes"
 msgstr "Si"
 
@@ -3116,7 +3153,7 @@ msgid "This will not remove your account on the server."
 msgstr "Isto non eliminará a súa conta no servidor."
 
 # rever
-#: ../src/empathy-accounts-dialog.c:1434
+#: ../src/empathy-accounts-dialog.c:1432
 msgid ""
 "You are about to select another account, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -3125,16 +3162,16 @@ msgstr ""
 "Está seguro de que quere proceder?"
 
 #. Menu items: to enabled/disable the account
-#: ../src/empathy-accounts-dialog.c:1652
+#: ../src/empathy-accounts-dialog.c:1643
 msgid "_Enable"
 msgstr "_Activar"
 
-#: ../src/empathy-accounts-dialog.c:1653
+#: ../src/empathy-accounts-dialog.c:1644
 msgid "_Disable"
 msgstr "_Desactivar"
 
 # rever
-#: ../src/empathy-accounts-dialog.c:2174
+#: ../src/empathy-accounts-dialog.c:2154
 msgid ""
 "You are about to close the window, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -3174,11 +3211,11 @@ msgid "_Import…"
 msgstr "_Importar…"
 
 # rever
-#: ../src/empathy-auth-client.c:250
+#: ../src/empathy-auth-client.c:249
 msgid " - Empathy authentication client"
 msgstr "- Cliente de autenticación Empathy"
 
-#: ../src/empathy-auth-client.c:266
+#: ../src/empathy-auth-client.c:265
 msgid "Empathy authentication client"
 msgstr "Cliente de autenticación Empathy"
 
@@ -3468,40 +3505,52 @@ msgstr "Previsualizar o vídeo"
 msgid "_Call"
 msgstr "_Chamar"
 
-#: ../src/empathy-call-window.ui.h:25 ../src/empathy-main-window.ui.h:29
+#: ../src/empathy-call-window.ui.h:25 ../src/empathy-main-window.ui.h:30
 msgid "_View"
 msgstr "_Ver"
 
-#: ../src/empathy-chat-window.c:474 ../src/empathy-chat-window.c:494
+#: ../src/empathy-chat-window.c:480 ../src/empathy-chat-window.c:500
 #, c-format
 msgid "%s (%d unread)"
 msgid_plural "%s (%d unread)"
 msgstr[0] "%s (%d non lido)"
 msgstr[1] "%s (%d non lidos)"
 
-#: ../src/empathy-chat-window.c:486
+#: ../src/empathy-chat-window.c:492
 #, c-format
 msgid "%s (and %u other)"
 msgid_plural "%s (and %u others)"
 msgstr[0] "%s (e outro %u)"
 msgstr[1] "%s (e outros %u)"
 
-#: ../src/empathy-chat-window.c:502
+#: ../src/empathy-chat-window.c:508
 #, c-format
 msgid "%s (%d unread from others)"
 msgid_plural "%s (%d unread from others)"
 msgstr[0] "%s (%d non lido de outros)"
 msgstr[1] "%s (%d non lidos de outros)"
 
-#: ../src/empathy-chat-window.c:511
+#: ../src/empathy-chat-window.c:517
 #, c-format
 msgid "%s (%d unread from all)"
 msgid_plural "%s (%d unread from all)"
 msgstr[0] "%s (%d non lido de todos)"
 msgstr[1] "%s (%d non lidos de todos)"
 
+#: ../src/empathy-chat-window.c:732
+msgid "SMS:"
+msgstr "SMS:"
+
+# rever
+#: ../src/empathy-chat-window.c:742
+#, c-format
+msgid "Sending %d message"
+msgid_plural "Sending %d messages"
+msgstr[0] "Enviando %d mensaxe."
+msgstr[1] "Enviando %d mensaxes."
+
 # rever
-#: ../src/empathy-chat-window.c:721
+#: ../src/empathy-chat-window.c:764
 msgid "Typing a message."
 msgstr "Escribindo unha mensaxe."
 
@@ -3538,7 +3587,7 @@ msgstr "Mover a lapela á _dereita"
 msgid "Notify for All Messages"
 msgstr "Notificar todas as mensaxes"
 
-#: ../src/empathy-chat-window.ui.h:9 ../src/empathy-main-window.ui.h:17
+#: ../src/empathy-chat-window.ui.h:9 ../src/empathy-main-window.ui.h:18
 msgid "_Contents"
 msgstr "_Contidos"
 
@@ -3550,7 +3599,7 @@ msgstr "_Conversa"
 msgid "_Detach Tab"
 msgstr "Des_prender lapela"
 
-#: ../src/empathy-chat-window.ui.h:12 ../src/empathy-main-window.ui.h:19
+#: ../src/empathy-chat-window.ui.h:12 ../src/empathy-main-window.ui.h:20
 msgid "_Edit"
 msgstr "_Editar"
 
@@ -3559,7 +3608,7 @@ msgstr "_Editar"
 msgid "_Favorite Chat Room"
 msgstr "Sala de conversa _favorita"
 
-#: ../src/empathy-chat-window.ui.h:14 ../src/empathy-main-window.ui.h:21
+#: ../src/empathy-chat-window.ui.h:14 ../src/empathy-main-window.ui.h:22
 msgid "_Help"
 msgstr "A_xuda"
 
@@ -3604,100 +3653,100 @@ msgid "Manage Favorite Rooms"
 msgstr "Xestionar as salas preferidas"
 
 # rever
-#: ../src/empathy-event-manager.c:507
+#: ../src/empathy-event-manager.c:504
 msgid "Incoming video call"
 msgstr "Chamada de vídeo entrante"
 
 # rever
-#: ../src/empathy-event-manager.c:507
+#: ../src/empathy-event-manager.c:504
 msgid "Incoming call"
 msgstr "Chamada entrante"
 
 # rever
-#: ../src/empathy-event-manager.c:511
+#: ../src/empathy-event-manager.c:508
 #, c-format
 msgid "%s is video calling you. Do you want to answer?"
 msgstr "%s solicítalle unha videochamada. Desexa responderlle?"
 
 # rever
-#: ../src/empathy-event-manager.c:512
+#: ../src/empathy-event-manager.c:509
 #, c-format
 msgid "%s is calling you. Do you want to answer?"
 msgstr "%s estao chamando. Quérelle responder?"
 
-#: ../src/empathy-event-manager.c:515 ../src/empathy-event-manager.c:667
+#: ../src/empathy-event-manager.c:512 ../src/empathy-event-manager.c:661
 #, c-format
 msgid "Incoming call from %s"
 msgstr "Chamada entrante de %s"
 
-#: ../src/empathy-event-manager.c:540
+#: ../src/empathy-event-manager.c:537
 msgid "_Reject"
 msgstr "_Rexeitar"
 
 # rever
-#: ../src/empathy-event-manager.c:546
+#: ../src/empathy-event-manager.c:543
 msgid "_Answer"
 msgstr "_Responder"
 
-#: ../src/empathy-event-manager.c:667
+#: ../src/empathy-event-manager.c:661
 #, c-format
 msgid "Incoming video call from %s"
 msgstr "Videochamada entrante de %s"
 
 # rever
-#: ../src/empathy-event-manager.c:744
+#: ../src/empathy-event-manager.c:734
 msgid "Room invitation"
 msgstr "Convite para unha sala"
 
 # rever
-#: ../src/empathy-event-manager.c:746
+#: ../src/empathy-event-manager.c:736
 #, c-format
 msgid "Invitation to join %s"
 msgstr "Invitación a unirse a %s"
 
 # rever
-#: ../src/empathy-event-manager.c:753
+#: ../src/empathy-event-manager.c:743
 #, c-format
 msgid "%s is inviting you to join %s"
 msgstr "%s estao convidando a unirse a %s"
 
-#: ../src/empathy-event-manager.c:761
+#: ../src/empathy-event-manager.c:751
 msgid "_Decline"
 msgstr "_Declinar"
 
-#: ../src/empathy-event-manager.c:766
+#: ../src/empathy-event-manager.c:756
 #: ../src/empathy-new-chatroom-dialog.ui.h:7
 msgid "_Join"
 msgstr "_Unirse"
 
 # rever
-#: ../src/empathy-event-manager.c:793
+#: ../src/empathy-event-manager.c:783
 #, c-format
 msgid "%s invited you to join %s"
 msgstr "%s convidouno a unirse a %s"
 
 # rever
-#: ../src/empathy-event-manager.c:799
+#: ../src/empathy-event-manager.c:789
 #, c-format
 msgid "You have been invited to join %s"
 msgstr "Vostede foi convidado a unirse a %s"
 
 # rever
-#: ../src/empathy-event-manager.c:850
+#: ../src/empathy-event-manager.c:840
 #, c-format
 msgid "Incoming file transfer from %s"
 msgstr "Transferencia de ficheiro entrante de %s"
 
-#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:370
+#: ../src/empathy-event-manager.c:1010 ../src/empathy-main-window.c:377
 msgid "Password required"
 msgstr "Requírese o contrasinal"
 
-#: ../src/empathy-event-manager.c:1076
+#: ../src/empathy-event-manager.c:1066
 #, c-format
 msgid "%s would like permission to see when you are online"
 msgstr "%s solicita permiso para ver cando vostede está dispoñíbel"
 
-#: ../src/empathy-event-manager.c:1080
+#: ../src/empathy-event-manager.c:1070
 #, c-format
 msgid ""
 "\n"
@@ -3793,7 +3842,7 @@ msgid "File transfer completed"
 msgstr "Transferencia de ficheiros rematada"
 
 # rever
-#: ../src/empathy-ft-manager.c:616 ../src/empathy-ft-manager.c:783
+#: ../src/empathy-ft-manager.c:616 ../src/empathy-ft-manager.c:780
 msgid "Waiting for the other participant's response"
 msgstr "Agardando pola resposta do outro participante"
 
@@ -3807,15 +3856,15 @@ msgstr "Verificando a integridade de «%s»"
 msgid "Hashing \"%s\""
 msgstr "Aplicando o hash «%s»"
 
-#: ../src/empathy-ft-manager.c:1029
+#: ../src/empathy-ft-manager.c:1026
 msgid "%"
 msgstr "%"
 
-#: ../src/empathy-ft-manager.c:1041
+#: ../src/empathy-ft-manager.c:1038
 msgid "File"
 msgstr "Ficheiro"
 
-#: ../src/empathy-ft-manager.c:1063
+#: ../src/empathy-ft-manager.c:1060
 msgid "Remaining"
 msgstr "Restantes"
 
@@ -3857,41 +3906,57 @@ msgstr "Protocolo"
 msgid "Source"
 msgstr "Orixe"
 
-#: ../src/empathy-main-window.c:387
+#: ../src/empathy-main-window.c:394
 msgid "Provide Password"
 msgstr "Escriba o seu contrasinal"
 
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:400
 msgid "Disconnect"
 msgstr "Desconectar"
 
 # rever
-#: ../src/empathy-main-window.c:533
+#: ../src/empathy-main-window.c:540
 msgid "No match found"
 msgstr "Non se atopou ningunha coincidencia."
 
-#: ../src/empathy-main-window.c:688
+#: ../src/empathy-main-window.c:695
 msgid "Reconnect"
 msgstr "Reconectar"
 
-#: ../src/empathy-main-window.c:694
+#: ../src/empathy-main-window.c:701
 msgid "Edit Account"
 msgstr "Editar a conta"
 
-#: ../src/empathy-main-window.c:700
+#: ../src/empathy-main-window.c:707
 msgid "Close"
 msgstr "Pechar"
 
-#: ../src/empathy-main-window.c:1418
+#. Translators: this string will be something like:
+#. *   Top up My Account ($1.23)..."
+#: ../src/empathy-main-window.c:849
+#, c-format
+msgid "Top up %s (%s)..."
+msgstr "Recargar %s (%s)…"
+
+#: ../src/empathy-main-window.c:924
+msgid "Top up account credit"
+msgstr "Recargar o saldo da conta"
+
+#. top up button
+#: ../src/empathy-main-window.c:999
+msgid "Top Up..."
+msgstr "Recargar…"
+
+#: ../src/empathy-main-window.c:1752
 msgid "Contact"
 msgstr "Contacto"
 
-#: ../src/empathy-main-window.c:1765
+#: ../src/empathy-main-window.c:2101
 msgid "Contact List"
 msgstr "Lista de contactos"
 
 # rever
-#: ../src/empathy-main-window.c:1881
+#: ../src/empathy-main-window.c:2219
 msgid "Show and edit accounts"
 msgstr "Mostrar e editar contas"
 
@@ -3900,92 +3965,96 @@ msgid "Contacts on a _Map"
 msgstr "Contactos no mapa"
 
 #: ../src/empathy-main-window.ui.h:2
+msgid "Credit Balance"
+msgstr "Crédito"
+
+#: ../src/empathy-main-window.ui.h:3
 msgid "Find in Contact _List"
 msgstr "_Buscar na lista de contactos"
 
 # rever
-#: ../src/empathy-main-window.ui.h:3
+#: ../src/empathy-main-window.ui.h:4
 msgid "Join _Favorites"
 msgstr "Unirse a pre_feridos"
 
-#: ../src/empathy-main-window.ui.h:4
+#: ../src/empathy-main-window.ui.h:5
 msgid "Manage Favorites"
 msgstr "Xestionar as preferidas"
 
-#: ../src/empathy-main-window.ui.h:5
+#: ../src/empathy-main-window.ui.h:6
 msgid "N_ormal Size"
 msgstr "Tamañ_o normal"
 
-#: ../src/empathy-main-window.ui.h:6 ../src/empathy-status-icon.ui.h:1
+#: ../src/empathy-main-window.ui.h:7 ../src/empathy-status-icon.ui.h:1
 msgid "New _Call…"
 msgstr "Nova _chamada…"
 
-#: ../src/empathy-main-window.ui.h:7
+#: ../src/empathy-main-window.ui.h:8
 msgid "Normal Size With _Avatars"
 msgstr "Tamaño normal con _avatares"
 
-#: ../src/empathy-main-window.ui.h:8
+#: ../src/empathy-main-window.ui.h:9
 msgid "P_references"
 msgstr "P_referencias"
 
-#: ../src/empathy-main-window.ui.h:9
+#: ../src/empathy-main-window.ui.h:10
 msgid "Show P_rotocols"
 msgstr "Mostrar os p_rotocolos"
 
 # rever
-#: ../src/empathy-main-window.ui.h:10
+#: ../src/empathy-main-window.ui.h:11
 msgid "Sort by _Name"
 msgstr "Ordenar por _nome"
 
 # rever
-#: ../src/empathy-main-window.ui.h:11
+#: ../src/empathy-main-window.ui.h:12
 msgid "Sort by _Status"
 msgstr "Ordenar por es_tado"
 
-#: ../src/empathy-main-window.ui.h:12
+#: ../src/empathy-main-window.ui.h:13
 msgid "_Accounts"
 msgstr "_Contas"
 
 # rever
-#: ../src/empathy-main-window.ui.h:14
+#: ../src/empathy-main-window.ui.h:15
 msgid "_Blocked Contacts"
 msgstr "Contactos _bloqueados"
 
-#: ../src/empathy-main-window.ui.h:16
+#: ../src/empathy-main-window.ui.h:17
 msgid "_Compact Size"
 msgstr "Ta_maño compacto"
 
-#: ../src/empathy-main-window.ui.h:18
+#: ../src/empathy-main-window.ui.h:19
 msgid "_Debug"
 msgstr "_Depuración"
 
-#: ../src/empathy-main-window.ui.h:20
+#: ../src/empathy-main-window.ui.h:21
 msgid "_File Transfers"
 msgstr "Trans_ferencias de ficheiros"
 
-#: ../src/empathy-main-window.ui.h:22
+#: ../src/empathy-main-window.ui.h:23
 msgid "_Join…"
 msgstr "_Unirse…"
 
-#: ../src/empathy-main-window.ui.h:23 ../src/empathy-status-icon.ui.h:3
+#: ../src/empathy-main-window.ui.h:24 ../src/empathy-status-icon.ui.h:3
 msgid "_New Conversation…"
 msgstr "_Nova conversa…"
 
 # rever
-#: ../src/empathy-main-window.ui.h:24
+#: ../src/empathy-main-window.ui.h:25
 msgid "_Offline Contacts"
 msgstr "Mostrar os contactos _desconectados"
 
-#: ../src/empathy-main-window.ui.h:25
+#: ../src/empathy-main-window.ui.h:26
 msgid "_Personal Information"
 msgstr "Información _persoal"
 
-#: ../src/empathy-main-window.ui.h:27
+#: ../src/empathy-main-window.ui.h:28
 msgid "_Room"
 msgstr "Sa_la"
 
 # rever
-#: ../src/empathy-main-window.ui.h:28
+#: ../src/empathy-main-window.ui.h:29
 msgid "_Search for Contacts…"
 msgstr "_Buscar contactos…"
 
@@ -4000,7 +4069,7 @@ msgstr "Membros"
 
 #. Translators: Room/Join's roomlist tooltip. Parameters are a channel name,
 #. yes/no, yes/no and a number.
-#: ../src/empathy-new-chatroom-dialog.c:560
+#: ../src/empathy-new-chatroom-dialog.c:553
 #, c-format
 msgid ""
 "%s\n"
@@ -4013,16 +4082,16 @@ msgstr ""
 "Contrasinal requirido: %s\n"
 "Membros: %s"
 
-#: ../src/empathy-new-chatroom-dialog.c:562
-#: ../src/empathy-new-chatroom-dialog.c:563
+#: ../src/empathy-new-chatroom-dialog.c:555
+#: ../src/empathy-new-chatroom-dialog.c:556
 msgid "No"
 msgstr "Non"
 
-#: ../src/empathy-new-chatroom-dialog.c:591
+#: ../src/empathy-new-chatroom-dialog.c:584
 msgid "Could not start room listing"
 msgstr "Non foi posíbel arrincar a lista da sala"
 
-#: ../src/empathy-new-chatroom-dialog.c:601
+#: ../src/empathy-new-chatroom-dialog.c:594
 msgid "Could not stop room listing"
 msgstr "Non foi posíbel deter a lista da sala"
 
@@ -4060,43 +4129,84 @@ msgstr "Lista de _salas"
 msgid "_Room:"
 msgstr "Sa_la:"
 
-#: ../src/empathy-preferences.c:139
+#: ../src/empathy-preferences.c:147
 msgid "Message received"
 msgstr "Mensaxe recibida"
 
-#: ../src/empathy-preferences.c:140
+#: ../src/empathy-preferences.c:148
 msgid "Message sent"
 msgstr "Mensaxe enviada"
 
-#: ../src/empathy-preferences.c:141
+#: ../src/empathy-preferences.c:149
 msgid "New conversation"
 msgstr "Conversa nova"
 
 # rever
-#: ../src/empathy-preferences.c:142
+#: ../src/empathy-preferences.c:150
 msgid "Contact goes online"
 msgstr "O contacto conéctase"
 
 # rever
-#: ../src/empathy-preferences.c:143
+#: ../src/empathy-preferences.c:151
 msgid "Contact goes offline"
 msgstr "O contacto desconéctase"
 
 # rever
-#: ../src/empathy-preferences.c:144
+#: ../src/empathy-preferences.c:152
 msgid "Account connected"
 msgstr "Conta conectada"
 
 # rever
-#: ../src/empathy-preferences.c:145
+#: ../src/empathy-preferences.c:153
 msgid "Account disconnected"
 msgstr "Conta desconectada"
 
-#: ../src/empathy-preferences.c:446
+#: ../src/empathy-preferences.c:450
 msgid "Language"
 msgstr "Idioma"
 
-#: ../src/empathy-preferences.c:875
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:700
+msgid "Juliet"
+msgstr "Xulieta"
+
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:707
+msgid "Romeo"
+msgstr "Romeo"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:713
+msgid "O Romeo, Romeo, wherefore art thou Romeo?"
+msgstr "Oh, Romeo, Romeo!, ¿onde estás que non te vexo?"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:716
+msgid "Deny thy father and refuse thy name;"
+msgstr "Nega ao teu pai e rexeita o teu nome;"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:719
+msgid "Or if thou wilt not, be but sworn my love"
+msgstr "Ou, se non queres, xúrame tan só que me amas"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:722
+msgid "And I'll no longer be a Capulet."
+msgstr "Y deixarei eu de ser unha Capuleto."
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:725
+msgid "Shall I hear more, or shall I speak at this?"
+msgstr "Debo escoitar máis ou contestar ao dito?"
+
+# rever
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:728
+msgid "Juliet has disconnected"
+msgstr "Xulieta desconectouse"
+
+#: ../src/empathy-preferences.c:962
 msgid "Preferences"
 msgstr "Preferencias"
 
@@ -4210,48 +4320,52 @@ msgstr ""
 "dicionario instalado."
 
 #: ../src/empathy-preferences.ui.h:24
+msgid "Theme Variant:"
+msgstr "Variante do tema:"
+
+#: ../src/empathy-preferences.ui.h:25
 msgid "Themes"
 msgstr "Temas"
 
 # rever
-#: ../src/empathy-preferences.ui.h:25
+#: ../src/empathy-preferences.ui.h:26
 msgid "_Automatically connect on startup"
 msgstr "_Conectar automaticamente ao iniciar"
 
 # rever
-#: ../src/empathy-preferences.ui.h:26
+#: ../src/empathy-preferences.ui.h:27
 msgid "_Cellphone"
 msgstr "_Teléfono móbil"
 
 # rever
-#: ../src/empathy-preferences.ui.h:27
+#: ../src/empathy-preferences.ui.h:28
 msgid "_Enable bubble notifications"
 msgstr "_Activar as burbullas de notificación"
 
 # rever
-#: ../src/empathy-preferences.ui.h:28
+#: ../src/empathy-preferences.ui.h:29
 msgid "_Enable sound notifications"
 msgstr "_Activar as notificacións de son"
 
-#: ../src/empathy-preferences.ui.h:29
+#: ../src/empathy-preferences.ui.h:30
 msgid "_GPS"
 msgstr "_GPS"
 
-#: ../src/empathy-preferences.ui.h:30
+#: ../src/empathy-preferences.ui.h:31
 msgid "_Network (IP, Wi-Fi)"
 msgstr "_Rede (IP, Wifi)"
 
 # rever
-#: ../src/empathy-preferences.ui.h:31
+#: ../src/empathy-preferences.ui.h:32
 msgid "_Open new chats in separate windows"
 msgstr "A_brir as conversas novas en xanelas separadas"
 
-#: ../src/empathy-preferences.ui.h:32
+#: ../src/empathy-preferences.ui.h:33
 msgid "_Publish location to my contacts"
 msgstr "_Publicar a miña localización aos meus contactos"
 
 #. To translators: The longitude and latitude are rounded to closest 0,1 degrees, so for example 146,2345° is rounded to round(146,2345*10)/10 = 146,2 degrees.
-#: ../src/empathy-preferences.ui.h:34
+#: ../src/empathy-preferences.ui.h:35
 msgid "_Reduce location accuracy"
 msgstr "_Reducir a precisión de localización"
 
@@ -4406,7 +4520,7 @@ msgstr "Declinar"
 msgid "Accept"
 msgstr "Aceptar"
 
-#: ../src/empathy-notifications-approver.c:223
+#: ../src/empathy-notifications-approver.c:226
 msgid "Provide"
 msgstr "Fornecer"
 
@@ -4420,6 +4534,10 @@ msgstr "Chamada perdida de %s"
 msgid "%s just tried to call you, but you were in another call."
 msgstr "%s tentou chamarlle, pero vostede estaba noutra chamada."
 
+#: ../libempathy-gtk/empathy-search-bar.c:282
+msgid "_Match case"
+msgstr "_Coincidir con capitalización"
+
 #~ msgid "_Enabled"
 #~ msgstr "_Activado"
 
index d5c4f63faab5e8b2608c3e63c864dfd30dc696ee..3f54036466702b8126c4d2921dd27a891e618b48 100644 (file)
--- a/po/he.po
+++ b/po/he.po
@@ -6,10 +6,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: empathy\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-18 10:45+0300\n"
-"PO-Revision-Date: 2011-04-18 10:46+0200\n"
+"POT-Creation-Date: 2011-05-09 08:50+0300\n"
+"PO-Revision-Date: 2011-05-09 09:21+0200\n"
 "Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
 "Language-Team: \n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -207,111 +208,115 @@ msgid "Pop up notifications when a contact logs out"
 msgstr "Pop up notifications when a contact logs out"
 
 #: ../data/org.gnome.Empathy.gschema.xml.in.h:42
+msgid "Show Balance in roster"
+msgstr "Show Balance in roster"
+
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:43
 msgid "Show avatars"
 msgstr "Show avatars"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:43
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:44
 msgid "Show contact list in rooms"
 msgstr "Show contact list in rooms"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:44
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:45
 msgid "Show hint about closing the main window"
 msgstr "Show hint about closing the main window"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:45
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:46
 msgid "Show offline contacts"
 msgstr "Show offline contacts"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:46
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:47
 msgid "Show protocols"
 msgstr "Show protocols"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:47
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:48
 msgid "Spell checking languages"
 msgstr "Spell checking languages"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:48
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:49
 msgid "The default folder to save file transfers in."
 msgstr "The default folder to save file transfers in."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:49
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:50
 msgid "The last directory that an avatar image was chosen from."
 msgstr "The last directory that an avatar image was chosen from."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:50
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:51
 msgid "The position for the chat window side pane"
 msgstr "The position for the chat window side pane"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:51
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:52
 msgid "The stored position (in pixels) of the chat window side pane."
 msgstr "The stored position (in pixels) of the chat window side pane."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:52
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:53
 msgid "The theme that is used to display the conversation in chat windows."
 msgstr "The theme that is used to display the conversation in chat windows."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:53
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:54
 msgid "Use graphical smileys"
 msgstr "Use graphical smileys"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:54
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:55
 msgid "Use notification sounds"
 msgstr "Use notification sounds"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:55
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:56
 msgid "Use theme for chat rooms"
 msgstr "Use theme for chat rooms"
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:56
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:57
 msgid "Whether Empathy can publish the user's location to their contacts."
 msgstr "Whether Empathy can publish the user's location to their contacts."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:57
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:58
 msgid "Whether Empathy can use the GPS to guess the location."
 msgstr "Whether Empathy can use the GPS to guess the location."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:58
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:59
 msgid "Whether Empathy can use the cellular network to guess the location."
 msgstr "Whether Empathy can use the cellular network to guess the location."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:59
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:60
 msgid "Whether Empathy can use the network to guess the location."
 msgstr "Whether Empathy can use the network to guess the location."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:60
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:61
 msgid "Whether Empathy has migrated butterfly logs."
 msgstr "Whether Empathy has migrated butterfly logs."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:61
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:62
 msgid "Whether Empathy should automatically log into your accounts on startup."
 msgstr ""
 "Whether Empathy should automatically log into your accounts on startup."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:62
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:63
 msgid ""
 "Whether Empathy should go into away mode automatically if the user is idle."
 msgstr ""
 "Whether Empathy should go into away mode automatically if the user is idle."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:63
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:64
 msgid ""
 "Whether Empathy should reduce the location's accuracy for privacy reasons."
 msgstr ""
 "Whether Empathy should reduce the location's accuracy for privacy reasons."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:64
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:65
 msgid ""
 "Whether Empathy should use the avatar of the contact as the chat window icon."
 msgstr ""
 "Whether Empathy should use the avatar of the contact as the chat window icon."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:65
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:66
 msgid ""
 "Whether WebKit developer tools, such as the Web Inspector, should be enabled."
 msgstr ""
 "Whether WebKit developer tools, such as the Web Inspector, should be enabled."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:66
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:67
 msgid ""
 "Whether connectivity managers should be used to automatically disconnect/"
 "reconnect."
@@ -319,64 +324,64 @@ msgstr ""
 "Whether connectivity managers should be used to automatically disconnect/"
 "reconnect."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:67
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:68
 msgid ""
 "Whether to check words typed against the languages you want to check with."
 msgstr ""
 "Whether to check words typed against the languages you want to check with."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:68
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:69
 msgid "Whether to convert smileys into graphical images in conversations."
 msgstr "Whether to convert smileys into graphical images in conversations."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:69
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:70
 msgid "Whether to play a sound to notify of contacts logging into the network."
 msgstr ""
 "Whether to play a sound to notify of contacts logging into the network."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:70
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:71
 msgid ""
 "Whether to play a sound to notify of contacts logging out of the network."
 msgstr ""
 "Whether to play a sound to notify of contacts logging out of the network."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:71
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:72
 msgid "Whether to play a sound to notify of events."
 msgstr "Whether to play a sound to notify of events."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:72
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:73
 msgid "Whether to play a sound to notify of incoming messages."
 msgstr "Whether to play a sound to notify of incoming messages."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:73
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:74
 msgid "Whether to play a sound to notify of new conversations."
 msgstr "Whether to play a sound to notify of new conversations."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:74
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:75
 msgid "Whether to play a sound to notify of outgoing messages."
 msgstr "Whether to play a sound to notify of outgoing messages."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:75
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:76
 msgid "Whether to play a sound when logging into a network."
 msgstr "Whether to play a sound when logging into a network."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:76
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:77
 msgid "Whether to play a sound when logging out of a network."
 msgstr "Whether to play a sound when logging out of a network."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:77
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:78
 msgid "Whether to play sound notifications when away or busy."
 msgstr "Whether to play sound notifications when away or busy."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:78
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:79
 msgid "Whether to show a popup notification when a contact goes offline."
 msgstr "Whether to show a popup notification when a contact goes offline."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:79
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:80
 msgid "Whether to show a popup notification when a contact goes online."
 msgstr "Whether to show a popup notification when a contact goes online."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:80
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:81
 msgid ""
 "Whether to show a popup notification when receiving a new message even if "
 "the chat is already opened, but not focused."
@@ -384,37 +389,41 @@ msgstr ""
 "Whether to show a popup notification when receiving a new message even if "
 "the chat is already opened, but not focused."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:81
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:82
 msgid "Whether to show a popup notification when receiving a new message."
 msgstr "Whether to show a popup notification when receiving a new message."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:82
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:83
+msgid "Whether to show account balances for in the contact roster."
+msgstr "Whether to show account balances for in the contact roster."
+
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:84
 msgid ""
 "Whether to show avatars for contacts in the contact list and chat windows."
 msgstr ""
 "Whether to show avatars for contacts in the contact list and chat windows."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:83
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:85
 msgid "Whether to show contacts that are offline in the contact list."
 msgstr "Whether to show contacts that are offline in the contact list."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:84
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:86
 msgid "Whether to show popup notifications when away or busy."
 msgstr "Whether to show popup notifications when away or busy."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:85
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:87
 msgid "Whether to show protocols for contacts in the contact list."
 msgstr "Whether to show protocols for contacts in the contact list."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:86
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:88
 msgid "Whether to show the contact list in chat rooms."
 msgstr "Whether to show the contact list in chat rooms."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:87
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:89
 msgid "Whether to show the contact list in compact mode."
 msgstr "Whether to show the contact list in compact mode."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:88
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:90
 msgid ""
 "Whether to show the message dialog about closing the main window with the "
 "'x' button in the title bar."
@@ -422,11 +431,11 @@ msgstr ""
 "Whether to show the message dialog about closing the main window with the "
 "'x' button in the title bar."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:89
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:91
 msgid "Whether to use the theme for chat rooms."
 msgstr "Whether to use the theme for chat rooms."
 
-#: ../data/org.gnome.Empathy.gschema.xml.in.h:90
+#: ../data/org.gnome.Empathy.gschema.xml.in.h:92
 msgid ""
 "Which criterion to use when sorting the contact list. Default is to sort by "
 "the contact's name with the value \"name\". A value of \"state\" will sort "
@@ -442,7 +451,7 @@ msgstr "ניהול חשבונות התכתבות ו־VoIP"
 
 #. Tweak the dialog
 #: ../data/empathy-accounts.desktop.in.in.h:2
-#: ../src/empathy-accounts-dialog.c:2269
+#: ../src/empathy-accounts-dialog.c:2320
 msgid "Messaging and VoIP Accounts"
 msgstr "חשבונות התכתבות ו־VoIP"
 
@@ -490,148 +499,140 @@ msgstr "התרחשה שגיאה בזמן ניסיון העברת הקובץ"
 msgid "The other participant is unable to transfer the file"
 msgstr "המשתתף האחר לא יכול להעביר את הקובץ"
 
-#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:383
+#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:384
 msgid "Unknown reason"
 msgstr "סיבה לא ידועה"
 
-#: ../libempathy/empathy-utils.c:304
+#: ../libempathy/empathy-utils.c:305
 msgid "Available"
 msgstr "זמין"
 
-#: ../libempathy/empathy-utils.c:306
+#: ../libempathy/empathy-utils.c:307
 msgid "Busy"
 msgstr "עסוק"
 
-#: ../libempathy/empathy-utils.c:309
+#: ../libempathy/empathy-utils.c:310
 msgid "Away"
 msgstr "מרוחק"
 
-#: ../libempathy/empathy-utils.c:311
+#: ../libempathy/empathy-utils.c:312
 msgid "Invisible"
 msgstr "בלתי נראה"
 
-#: ../libempathy/empathy-utils.c:313
+#: ../libempathy/empathy-utils.c:314
 msgid "Offline"
 msgstr "לא מחובר"
 
 #. translators: presence type is unknown
-#. translators: encoding video codec is unknown
-#. translators: encoding audio codec is unknown
-#. translators: decoding video codec is unknown
-#. translators: decoding audio codec is unknown
-#: ../libempathy/empathy-utils.c:316
-#: ../src/empathy-streamed-media-window.c:1905
-#: ../src/empathy-streamed-media-window.c:1907
-#: ../src/empathy-streamed-media-window.c:1909
-#: ../src/empathy-streamed-media-window.c:1911
-#: ../src/empathy-call-window.ui.h:18
+#: ../libempathy/empathy-utils.c:317
+msgctxt "presence"
 msgid "Unknown"
 msgstr "לא ידוע"
 
-#: ../libempathy/empathy-utils.c:355
+#: ../libempathy/empathy-utils.c:356
 msgid "No reason specified"
 msgstr "לא צויינה סיבה"
 
-#: ../libempathy/empathy-utils.c:357 ../libempathy/empathy-utils.c:413
+#: ../libempathy/empathy-utils.c:358 ../libempathy/empathy-utils.c:414
 msgid "Status is set to offline"
 msgstr "המצב מוגדר כמנותק"
 
-#: ../libempathy/empathy-utils.c:359 ../libempathy/empathy-utils.c:393
+#: ../libempathy/empathy-utils.c:360 ../libempathy/empathy-utils.c:394
 msgid "Network error"
 msgstr "שגיאת רשת"
 
-#: ../libempathy/empathy-utils.c:361 ../libempathy/empathy-utils.c:395
+#: ../libempathy/empathy-utils.c:362 ../libempathy/empathy-utils.c:396
 msgid "Authentication failed"
 msgstr "האימות נכשל"
 
-#: ../libempathy/empathy-utils.c:363 ../libempathy/empathy-utils.c:397
+#: ../libempathy/empathy-utils.c:364 ../libempathy/empathy-utils.c:398
 msgid "Encryption error"
 msgstr "שגיאת הצפנה"
 
-#: ../libempathy/empathy-utils.c:365
+#: ../libempathy/empathy-utils.c:366
 msgid "Name in use"
 msgstr "השם בשימוש"
 
-#: ../libempathy/empathy-utils.c:367 ../libempathy/empathy-utils.c:399
+#: ../libempathy/empathy-utils.c:368 ../libempathy/empathy-utils.c:400
 msgid "Certificate not provided"
 msgstr "לא סופקה תעודה"
 
-#: ../libempathy/empathy-utils.c:369 ../libempathy/empathy-utils.c:401
+#: ../libempathy/empathy-utils.c:370 ../libempathy/empathy-utils.c:402
 msgid "Certificate untrusted"
 msgstr "התעודה אינה מאובטחת"
 
-#: ../libempathy/empathy-utils.c:371 ../libempathy/empathy-utils.c:403
+#: ../libempathy/empathy-utils.c:372 ../libempathy/empathy-utils.c:404
 msgid "Certificate expired"
 msgstr "התעודה לא תקפה"
 
-#: ../libempathy/empathy-utils.c:373 ../libempathy/empathy-utils.c:405
+#: ../libempathy/empathy-utils.c:374 ../libempathy/empathy-utils.c:406
 msgid "Certificate not activated"
 msgstr "התעודה אינה פעילה"
 
-#: ../libempathy/empathy-utils.c:375 ../libempathy/empathy-utils.c:407
+#: ../libempathy/empathy-utils.c:376 ../libempathy/empathy-utils.c:408
 msgid "Certificate hostname mismatch"
 msgstr "שם המארח בתעודה לא תואם"
 
-#: ../libempathy/empathy-utils.c:377 ../libempathy/empathy-utils.c:409
+#: ../libempathy/empathy-utils.c:378 ../libempathy/empathy-utils.c:410
 msgid "Certificate fingerprint mismatch"
 msgstr "טביעת האצבע של התעודה אינה תואמת"
 
-#: ../libempathy/empathy-utils.c:379 ../libempathy/empathy-utils.c:411
+#: ../libempathy/empathy-utils.c:380 ../libempathy/empathy-utils.c:412
 msgid "Certificate self-signed"
 msgstr "תעודה בחתימה עצמית"
 
-#: ../libempathy/empathy-utils.c:381
+#: ../libempathy/empathy-utils.c:382
 msgid "Certificate error"
 msgstr "שגיאת תעודה"
 
-#: ../libempathy/empathy-utils.c:415
+#: ../libempathy/empathy-utils.c:416
 msgid "Encryption is not available"
 msgstr "אין הצפנה זמינה"
 
-#: ../libempathy/empathy-utils.c:417
+#: ../libempathy/empathy-utils.c:418
 msgid "Certificate is invalid"
 msgstr "התעודה שגויה"
 
-#: ../libempathy/empathy-utils.c:419
+#: ../libempathy/empathy-utils.c:420
 msgid "Connection has been refused"
 msgstr "החיבור נתקל בסירוב"
 
-#: ../libempathy/empathy-utils.c:421
+#: ../libempathy/empathy-utils.c:422
 msgid "Connection can't be established"
 msgstr "לא ניתן לקיים את החיבור"
 
-#: ../libempathy/empathy-utils.c:423
+#: ../libempathy/empathy-utils.c:424
 msgid "Connection has been lost"
 msgstr "החיבור נקטע"
 
-#: ../libempathy/empathy-utils.c:425
+#: ../libempathy/empathy-utils.c:426
 msgid "This resource is already connected to the server"
 msgstr "המשאב כבר מחובר לשרת"
 
-#: ../libempathy/empathy-utils.c:427
+#: ../libempathy/empathy-utils.c:428
 msgid ""
 "Connection has been replaced by a new connection using the same resource"
 msgstr "החיבור הוחלף בחיבור חדש באמצעות אותו המשאב"
 
-#: ../libempathy/empathy-utils.c:430
+#: ../libempathy/empathy-utils.c:431
 msgid "The account already exists on the server"
 msgstr "החשבון כבר קיים בשרת"
 
-#: ../libempathy/empathy-utils.c:432
+#: ../libempathy/empathy-utils.c:433
 msgid "Server is currently too busy to handle the connection"
 msgstr "השרת עסוק מכדי לטפל בחיבור"
 
-#: ../libempathy/empathy-utils.c:434
+#: ../libempathy/empathy-utils.c:435
 msgid "Certificate has been revoked"
 msgstr "התעודה נשללה"
 
-#: ../libempathy/empathy-utils.c:436
+#: ../libempathy/empathy-utils.c:437
 msgid ""
 "Certificate uses an insecure cipher algorithm or is cryptographically weak"
 msgstr ""
 "התעודה משתמשת באלגוריתם הצפנה בלתי מאובטח או שהוא חלש מבחינה קריפטוגרפית"
 
-#: ../libempathy/empathy-utils.c:439
+#: ../libempathy/empathy-utils.c:440
 msgid ""
 "The length of the server certificate, or the depth of the server certificate "
 "chain, exceed the limits imposed by the cryptography library"
@@ -639,66 +640,66 @@ msgstr ""
 "אורך אישור האבטחה של השרת או עומק מחרוזת אישור האבטחה של השרת חורגים "
 "מהמגבלות שהוצבו על ידי ספריית ההצפנה"
 
-#: ../libempathy/empathy-utils.c:602
+#: ../libempathy/empathy-utils.c:603
 #: ../libempathy-gtk/empathy-contact-list-store.h:73
 msgid "People Nearby"
 msgstr "אנשים בקרבתי"
 
-#: ../libempathy/empathy-utils.c:607
+#: ../libempathy/empathy-utils.c:608
 msgid "Yahoo! Japan"
 msgstr "‏Yahoo! יפן"
 
-#: ../libempathy/empathy-utils.c:636
+#: ../libempathy/empathy-utils.c:637
 msgid "Google Talk"
 msgstr "Google Talk"
 
-#: ../libempathy/empathy-utils.c:637
+#: ../libempathy/empathy-utils.c:638
 msgid "Facebook Chat"
 msgstr "צ׳אט Facebook"
 
-#: ../libempathy/empathy-time.c:137
+#: ../libempathy/empathy-time.c:100
 #, c-format
 msgid "%d second ago"
 msgid_plural "%d seconds ago"
 msgstr[0] "לפני שנייה"
 msgstr[1] "לפני %d שניות"
 
-#: ../libempathy/empathy-time.c:142
+#: ../libempathy/empathy-time.c:105
 #, c-format
 msgid "%d minute ago"
 msgid_plural "%d minutes ago"
 msgstr[0] "לפני דקה"
 msgstr[1] "לפני %d דקות"
 
-#: ../libempathy/empathy-time.c:147
+#: ../libempathy/empathy-time.c:110
 #, c-format
 msgid "%d hour ago"
 msgid_plural "%d hours ago"
 msgstr[0] "לפני שעה"
 msgstr[1] "לפני %d שעות"
 
-#: ../libempathy/empathy-time.c:152
+#: ../libempathy/empathy-time.c:115
 #, c-format
 msgid "%d day ago"
 msgid_plural "%d days ago"
 msgstr[0] "לפני יום"
 msgstr[1] "לפני %d ימים"
 
-#: ../libempathy/empathy-time.c:157
+#: ../libempathy/empathy-time.c:120
 #, c-format
 msgid "%d week ago"
 msgid_plural "%d weeks ago"
 msgstr[0] "לפני שבוע"
 msgstr[1] "לפני %d שבועות"
 
-#: ../libempathy/empathy-time.c:162
+#: ../libempathy/empathy-time.c:125
 #, c-format
 msgid "%d month ago"
 msgid_plural "%d months ago"
 msgstr[0] "לפני חודש"
 msgstr[1] "לפני %d חודשים"
 
-#: ../libempathy/empathy-time.c:167
+#: ../libempathy/empathy-time.c:130
 msgid "in the future"
 msgstr "בעתיד"
 
@@ -706,85 +707,67 @@ msgstr "בעתיד"
 msgid "All"
 msgstr "הכול"
 
-#: ../libempathy-gtk/empathy-account-widget.c:682
+#: ../libempathy-gtk/empathy-account-widget.c:678
 #: ../libempathy-gtk/empathy-log-window.c:643
 #: ../src/empathy-import-widget.c:321
 msgid "Account"
 msgstr "חשבון"
 
-#: ../libempathy-gtk/empathy-account-widget.c:683
+#: ../libempathy-gtk/empathy-account-widget.c:679
 msgid "Password"
 msgstr "ססמה"
 
-#: ../libempathy-gtk/empathy-account-widget.c:684
+#: ../libempathy-gtk/empathy-account-widget.c:680
 #: ../libempathy-gtk/empathy-irc-network-dialog.c:507
 msgid "Server"
 msgstr "שרת"
 
-#: ../libempathy-gtk/empathy-account-widget.c:685
+#: ../libempathy-gtk/empathy-account-widget.c:681
 #: ../libempathy-gtk/empathy-irc-network-dialog.c:522
 msgid "Port"
 msgstr "פתחה"
 
-#: ../libempathy-gtk/empathy-account-widget.c:757
-#: ../libempathy-gtk/empathy-account-widget.c:814
+#: ../libempathy-gtk/empathy-account-widget.c:753
+#: ../libempathy-gtk/empathy-account-widget.c:810
 #, c-format
 msgid "%s:"
 msgstr "%s:"
 
-#: ../libempathy-gtk/empathy-account-widget.c:1166
+#: ../libempathy-gtk/empathy-account-widget.c:1151
 #, c-format
 msgid "The account %s is edited via My Web Accounts."
 msgstr "החשבון %s נערך דרך החשבונות המקוונים שלי."
 
-#: ../libempathy-gtk/empathy-account-widget.c:1172
+#: ../libempathy-gtk/empathy-account-widget.c:1157
 #, c-format
 msgid "The account %s cannot be edited in Empathy."
 msgstr "לא ניתן לערוך את החשבון %s ב־Empathy."
 
-#: ../libempathy-gtk/empathy-account-widget.c:1192
+#: ../libempathy-gtk/empathy-account-widget.c:1177
 msgid "Launch My Web Accounts"
 msgstr "טעינת החשבונות המקוונים שלי"
 
-#: ../libempathy-gtk/empathy-account-widget.c:1530
+#: ../libempathy-gtk/empathy-account-widget.c:1515
 msgid "Username:"
 msgstr "ש_ם משתמש:"
 
-#: ../libempathy-gtk/empathy-account-widget.c:1897
+#: ../libempathy-gtk/empathy-account-widget.c:1833
 msgid "A_pply"
 msgstr "ה_חלה"
 
-#: ../libempathy-gtk/empathy-account-widget.c:1927
+#: ../libempathy-gtk/empathy-account-widget.c:1863
 msgid "L_og in"
 msgstr "_כניסה"
 
-#. Account and Identifier
-#: ../libempathy-gtk/empathy-account-widget.c:1993
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.ui.h:1
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:520
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
-#: ../libempathy-gtk/empathy-individual-widget.c:1481
-#: ../libempathy-gtk/empathy-contact-selector-dialog.ui.h:1
-#: ../src/empathy-chatrooms-window.ui.h:1
-#: ../src/empathy-new-chatroom-dialog.ui.h:1
-msgid "Account:"
-msgstr "חשבון:"
-
-#. translators: this is the label of a checkbox used to enable/disable IM
-#. * accounts
-#: ../libempathy-gtk/empathy-account-widget.c:2006
-msgid "_Enabled"
-msgstr "מו_פעל"
-
-#: ../libempathy-gtk/empathy-account-widget.c:2071
+#: ../libempathy-gtk/empathy-account-widget.c:1937
 msgid "This account already exists on the server"
 msgstr "חשבון זה כבר קיים על השרת"
 
-#: ../libempathy-gtk/empathy-account-widget.c:2074
+#: ../libempathy-gtk/empathy-account-widget.c:1940
 msgid "Create a new account on the server"
 msgstr "יצירת חשבון חדש על השרת"
 
-#: ../libempathy-gtk/empathy-account-widget.c:2266
+#: ../libempathy-gtk/empathy-account-widget.c:2132
 msgid "Ca_ncel"
 msgstr "_ביטול"
 
@@ -793,19 +776,19 @@ msgstr "_ביטול"
 #. * like: "MyUserName on freenode".
 #. * You should reverse the order of these arguments if the
 #. * server should come before the login id in your locale.
-#: ../libempathy-gtk/empathy-account-widget.c:2563
+#: ../libempathy-gtk/empathy-account-widget.c:2410
 #, c-format
 msgid "%1$s on %2$s"
 msgstr "‏%1$s על גבי %2$s"
 
 #. To translators: The parameter is the protocol name. The resulting
 #. * string will be something like: "Jabber Account"
-#: ../libempathy-gtk/empathy-account-widget.c:2589
+#: ../libempathy-gtk/empathy-account-widget.c:2436
 #, c-format
 msgid "%s Account"
 msgstr "חשבון %s"
 
-#: ../libempathy-gtk/empathy-account-widget.c:2593
+#: ../libempathy-gtk/empathy-account-widget.c:2440
 msgid "New account"
 msgstr "חשבון חדש"
 
@@ -1233,57 +1216,57 @@ msgstr "כל הקבצים"
 msgid "Click to enlarge"
 msgstr "יש ללחוץ כדי להגדיל"
 
-#: ../libempathy-gtk/empathy-chat.c:652
+#: ../libempathy-gtk/empathy-chat.c:668
 msgid "Failed to open private chat"
 msgstr "ארע כשל בפתיחת שיחה פרטית"
 
-#: ../libempathy-gtk/empathy-chat.c:717
+#: ../libempathy-gtk/empathy-chat.c:733
 msgid "Topic not supported on this conversation"
 msgstr "אין תמיכה בשימוש בנושא בדיון זה"
 
-#: ../libempathy-gtk/empathy-chat.c:723
+#: ../libempathy-gtk/empathy-chat.c:739
 msgid "You are not allowed to change the topic"
 msgstr "אין לך הרשאה לשנות את הנושא"
 
-#: ../libempathy-gtk/empathy-chat.c:930
+#: ../libempathy-gtk/empathy-chat.c:948
 msgid "/clear: clear all messages from the current conversation"
 msgstr "/clear: פינוי כל ההודעות מהדיון הנוכחי"
 
-#: ../libempathy-gtk/empathy-chat.c:933
+#: ../libempathy-gtk/empathy-chat.c:951
 msgid "/topic <topic>: set the topic of the current conversation"
 msgstr "/topic <נושא>:‎ הגדרת נושא השיחה הנוכחית"
 
-#: ../libempathy-gtk/empathy-chat.c:936
+#: ../libempathy-gtk/empathy-chat.c:954
 msgid "/join <chat room ID>: join a new chat room"
 msgstr "/join <זיהוי החדר>:‎ הצטרפות לחדר שיחה חדש"
 
-#: ../libempathy-gtk/empathy-chat.c:939
+#: ../libempathy-gtk/empathy-chat.c:957
 msgid "/j <chat room ID>: join a new chat room"
 msgstr "/j <זיהוי החדר>:‎ הצטרפות לחדר שיחה חדש"
 
-#: ../libempathy-gtk/empathy-chat.c:944
+#: ../libempathy-gtk/empathy-chat.c:962
 msgid ""
 "/part [<chat room ID>] [<reason>]: leave the chat room, by default the "
 "current one"
 msgstr "/part [<זיהוי החדר>]‎ [<סיבה>]:‎ עזיבת ערוץ השיחה, הנוכחי הוא בררת המחדל"
 
-#: ../libempathy-gtk/empathy-chat.c:949
+#: ../libempathy-gtk/empathy-chat.c:967
 msgid "/query <contact ID> [<message>]: open a private chat"
 msgstr "/query <זיהוי איש הקשר> ‎[<הודעה>]:‎ פתיחת צ'אט אישי"
 
-#: ../libempathy-gtk/empathy-chat.c:952
+#: ../libempathy-gtk/empathy-chat.c:970
 msgid "/msg <contact ID> <message>: open a private chat"
 msgstr "/msg <זיהוי איש הקשר>‎ <הודעה>:‎ פתיחת צ'אט פרטי"
 
-#: ../libempathy-gtk/empathy-chat.c:955
+#: ../libempathy-gtk/empathy-chat.c:973
 msgid "/nick <nickname>: change your nickname on the current server"
 msgstr "/nick <כינוי>:‎ שינוי הכינוי שלך בשרת הנוכחי"
 
-#: ../libempathy-gtk/empathy-chat.c:958
+#: ../libempathy-gtk/empathy-chat.c:976
 msgid "/me <message>: send an ACTION message to the current conversation"
 msgstr "/me <הודעה>:‎ שליחת הודעת ACTION לדיון הנוכחי"
 
-#: ../libempathy-gtk/empathy-chat.c:961
+#: ../libempathy-gtk/empathy-chat.c:979
 msgid ""
 "/say <message>: send <message> to the current conversation. This is used to "
 "send a message starting with a '/'. For example: \"/say /join is used to "
@@ -1292,7 +1275,7 @@ msgstr ""
 "/say <הודעה>:‎ שליחת <הודעה> לדיון הנוכחי. פקודה זו משמשת לשליחת הודעות "
 "המתחילות ב־'/'. לדוגמה: \"/say /join משמשת לצורך התחברות לחדר שיחה חדש\""
 
-#: ../libempathy-gtk/empathy-chat.c:966
+#: ../libempathy-gtk/empathy-chat.c:984
 msgid ""
 "/help [<command>]: show all supported commands. If <command> is defined, "
 "show its usage."
@@ -1300,98 +1283,111 @@ msgstr ""
 "/help [<פקודה>]:‎ הצגת כל הפקודות הנתמכות. אם יש הגדרה ל־<פקודה> יוצג אופן "
 "הפעלתה."
 
-#: ../libempathy-gtk/empathy-chat.c:976
+#: ../libempathy-gtk/empathy-chat.c:994
 #, c-format
 msgid "Usage: %s"
 msgstr "שימוש: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1015
+#: ../libempathy-gtk/empathy-chat.c:1033
 msgid "Unknown command"
 msgstr "פקודה לא ידועה"
 
-#: ../libempathy-gtk/empathy-chat.c:1141
+#: ../libempathy-gtk/empathy-chat.c:1159
 msgid "Unknown command; see /help for the available commands"
 msgstr "פקודה בלתי מוכרת; יש לעיין ב־‎/help לצפייה בפקודות הזמינות"
 
-#: ../libempathy-gtk/empathy-chat.c:1278
+#: ../libempathy-gtk/empathy-chat.c:1297
+msgid "insufficient balance to send message"
+msgstr "המאזן אינו מאפשר לשלוח הודעה"
+
+#: ../libempathy-gtk/empathy-chat.c:1299
+msgid "not capable"
+msgstr "ללא יכולת"
+
+#: ../libempathy-gtk/empathy-chat.c:1306
 msgid "offline"
 msgstr "לא מחובר"
 
-#: ../libempathy-gtk/empathy-chat.c:1281
+#: ../libempathy-gtk/empathy-chat.c:1309
 msgid "invalid contact"
 msgstr "איש קשר לא תקין"
 
-#: ../libempathy-gtk/empathy-chat.c:1284
+#: ../libempathy-gtk/empathy-chat.c:1312
 msgid "permission denied"
 msgstr "איש קשר לא תקין"
 
-#: ../libempathy-gtk/empathy-chat.c:1287
+#: ../libempathy-gtk/empathy-chat.c:1315
 msgid "too long message"
 msgstr "הודעה ארוכה מדי"
 
-#: ../libempathy-gtk/empathy-chat.c:1290
+#: ../libempathy-gtk/empathy-chat.c:1318
 msgid "not implemented"
 msgstr "לא ממומש"
 
-#: ../libempathy-gtk/empathy-chat.c:1294
+#: ../libempathy-gtk/empathy-chat.c:1322
 msgid "unknown"
 msgstr "לא ידוע"
 
-#: ../libempathy-gtk/empathy-chat.c:1298
+#: ../libempathy-gtk/empathy-chat.c:1328
 #, c-format
 msgid "Error sending message '%s': %s"
 msgstr "שגיאה בשליחת ההודעה '%s': ‏%s"
 
-#: ../libempathy-gtk/empathy-chat.c:1359 ../src/empathy-chat-window.c:717
+#: ../libempathy-gtk/empathy-chat.c:1332
+#, c-format
+msgid "Error sending message: %s"
+msgstr "שגיאה בשליחת ההודעה: ‏%s"
+
+#: ../libempathy-gtk/empathy-chat.c:1393 ../src/empathy-chat-window.c:760
 msgid "Topic:"
 msgstr "נושא:"
 
-#: ../libempathy-gtk/empathy-chat.c:1371
+#: ../libempathy-gtk/empathy-chat.c:1405
 #, c-format
 msgid "Topic set to: %s"
 msgstr "הנושא הוגדר ל־: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1373
+#: ../libempathy-gtk/empathy-chat.c:1407
 msgid "No topic defined"
 msgstr "לא נקבע נושא"
 
-#: ../libempathy-gtk/empathy-chat.c:1872
+#: ../libempathy-gtk/empathy-chat.c:1914
 msgid "(No Suggestions)"
 msgstr "(אין הצעות)"
 
 #. translators: %s is the selected word
-#: ../libempathy-gtk/empathy-chat.c:1940
+#: ../libempathy-gtk/empathy-chat.c:1982
 #, c-format
 msgid "Add '%s' to Dictionary"
 msgstr "הוספת '%s' למילון"
 
 #. translators: first %s is the selected word,
 #. * second %s is the language name of the target dictionary
-#: ../libempathy-gtk/empathy-chat.c:1977
+#: ../libempathy-gtk/empathy-chat.c:2019
 #, c-format
 msgid "Add '%s' to %s Dictionary"
 msgstr "הוספת '%s' למילון %s"
 
-#: ../libempathy-gtk/empathy-chat.c:2034
+#: ../libempathy-gtk/empathy-chat.c:2076
 msgid "Insert Smiley"
 msgstr "הכנס סמיילי"
 
 #. send button
-#: ../libempathy-gtk/empathy-chat.c:2052
+#: ../libempathy-gtk/empathy-chat.c:2094
 #: ../libempathy-gtk/empathy-ui-utils.c:1808
 msgid "_Send"
 msgstr "_שלח"
 
 #. Spelling suggestions
-#: ../libempathy-gtk/empathy-chat.c:2087
+#: ../libempathy-gtk/empathy-chat.c:2129
 msgid "_Spelling Suggestions"
 msgstr "הצעות _איות"
 
-#: ../libempathy-gtk/empathy-chat.c:2176
+#: ../libempathy-gtk/empathy-chat.c:2218
 msgid "Failed to retrieve recent logs"
 msgstr "ארע כשל בקבלת הדוחות האחרונים"
 
-#: ../libempathy-gtk/empathy-chat.c:2287
+#: ../libempathy-gtk/empathy-chat.c:2329
 #, c-format
 msgid "%s has disconnected"
 msgstr "‏%s התנתק"
@@ -1399,12 +1395,12 @@ msgstr "‏%s התנתק"
 #. translators: reverse the order of these arguments
 #. * if the kicked should come before the kicker in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2294
+#: ../libempathy-gtk/empathy-chat.c:2336
 #, c-format
 msgid "%1$s was kicked by %2$s"
 msgstr "‏%1$s סולק על ידי %2$s"
 
-#: ../libempathy-gtk/empathy-chat.c:2297
+#: ../libempathy-gtk/empathy-chat.c:2339
 #, c-format
 msgid "%s was kicked"
 msgstr "‏%s סולק"
@@ -1412,17 +1408,17 @@ msgstr "‏%s סולק"
 #. translators: reverse the order of these arguments
 #. * if the banned should come before the banner in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2305
+#: ../libempathy-gtk/empathy-chat.c:2347
 #, c-format
 msgid "%1$s was banned by %2$s"
 msgstr "‏%1$s נחסם על ידי %2$s"
 
-#: ../libempathy-gtk/empathy-chat.c:2308
+#: ../libempathy-gtk/empathy-chat.c:2350
 #, c-format
 msgid "%s was banned"
 msgstr "‏%s נחסם"
 
-#: ../libempathy-gtk/empathy-chat.c:2312
+#: ../libempathy-gtk/empathy-chat.c:2354
 #, c-format
 msgid "%s has left the room"
 msgstr "‏%s עזב את החדר"
@@ -1432,105 +1428,123 @@ msgstr "‏%s עזב את החדר"
 #. * given by the user living the room. If this poses a problem,
 #. * please let us know. :-)
 #.
-#: ../libempathy-gtk/empathy-chat.c:2321
+#: ../libempathy-gtk/empathy-chat.c:2363
 #, c-format
 msgid " (%s)"
 msgstr " (%s)"
 
-#: ../libempathy-gtk/empathy-chat.c:2346
+#: ../libempathy-gtk/empathy-chat.c:2388
 #, c-format
 msgid "%s has joined the room"
 msgstr "‏%s הצטרף לחדר"
 
-#: ../libempathy-gtk/empathy-chat.c:2371
+#: ../libempathy-gtk/empathy-chat.c:2413
 #, c-format
 msgid "%s is now known as %s"
 msgstr "‏%s נודע כעת בכינוי %s"
 
-#: ../libempathy-gtk/empathy-chat.c:2510
-#: ../src/empathy-streamed-media-window.c:1953
-#: ../src/empathy-event-manager.c:1126
+#: ../libempathy-gtk/empathy-chat.c:2552
+#: ../src/empathy-streamed-media-window.c:1957
+#: ../src/empathy-event-manager.c:1116
 msgid "Disconnected"
 msgstr "מנותק"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3140
+#: ../libempathy-gtk/empathy-chat.c:3200
 msgid "Would you like to store this password?"
 msgstr "האם ברצונך לאחסן ססמה זו?"
 
-#: ../libempathy-gtk/empathy-chat.c:3146
+#: ../libempathy-gtk/empathy-chat.c:3206
 msgid "Remember"
 msgstr "שמירה"
 
-#: ../libempathy-gtk/empathy-chat.c:3156
+#: ../libempathy-gtk/empathy-chat.c:3216
 msgid "Not now"
 msgstr "לא כעת"
 
-#: ../libempathy-gtk/empathy-chat.c:3200
+#: ../libempathy-gtk/empathy-chat.c:3260
 msgid "Retry"
 msgstr "ניסיון חוזר"
 
-#: ../libempathy-gtk/empathy-chat.c:3204
+#: ../libempathy-gtk/empathy-chat.c:3264
 msgid "Wrong password; please try again:"
 msgstr "ססמה שגויה; נא לנסות שוב:"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3321
+#: ../libempathy-gtk/empathy-chat.c:3381
 msgid "This room is protected by a password:"
 msgstr "חדר זה מוגן בססמה:"
 
-#: ../libempathy-gtk/empathy-chat.c:3348
+#: ../libempathy-gtk/empathy-chat.c:3408
 msgid "Join"
 msgstr "הצטרפות"
 
-#: ../libempathy-gtk/empathy-chat.c:3518 ../src/empathy-event-manager.c:1147
+#: ../libempathy-gtk/empathy-chat.c:3600 ../src/empathy-event-manager.c:1137
 msgid "Connected"
 msgstr "מחובר"
 
-#: ../libempathy-gtk/empathy-chat.c:3571
+#: ../libempathy-gtk/empathy-chat.c:3655
 #: ../libempathy-gtk/empathy-log-window.c:650
 msgid "Conversation"
 msgstr "שיחה"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:422
+#. Translators: this string is a something like
+#. * "Escher Cat (SMS)"
+#: ../libempathy-gtk/empathy-chat.c:3660
+#, c-format
+msgid "%s (SMS)"
+msgstr "%s (SMS)"
+
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:423
 msgid "Unknown or invalid identifier"
 msgstr "המזהה אינו ידוע או שגוי"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:424
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:425
 msgid "Contact blocking temporarily unavailable"
 msgstr "חסימת אנשי קשר אינה זמינה כרגע"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:426
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:427
 msgid "Contact blocking unavailable"
 msgstr "חסימת אנשי קשר אינה זמינה"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:428
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:429
 msgid "Permission Denied"
 msgstr "ההרשאה נדחתה"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:432
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:433
 msgid "Could not block contact"
 msgstr "לא ניתן לחסום את איש הקשר"
 
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:701
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.c:702
 msgid "Edit Blocked Contacts"
 msgstr "עריכת אנשי הקשר החסומים"
 
+#. Account and Identifier
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.ui.h:1
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:521
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
+#: ../libempathy-gtk/empathy-individual-widget.c:1479
+#: ../libempathy-gtk/empathy-contact-selector-dialog.ui.h:1
+#: ../src/empathy-chatrooms-window.ui.h:1
+#: ../src/empathy-new-chatroom-dialog.ui.h:1
+msgid "Account:"
+msgstr "חשבון:"
+
 #. Copy Link Address menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:320
-#: ../libempathy-gtk/empathy-theme-adium.c:794
+#: ../libempathy-gtk/empathy-theme-adium.c:996
 msgid "_Copy Link Address"
 msgstr "העתקת _מיקום הקישור"
 
 #. Open Link menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:327
-#: ../libempathy-gtk/empathy-theme-adium.c:801
+#: ../libempathy-gtk/empathy-theme-adium.c:1003
 msgid "_Open Link"
 msgstr "_פתיחת קישור"
 
 #. Translators: timestamp displayed between conversations in
 #. * chat windows (strftime format string)
-#: ../libempathy-gtk/empathy-chat-text-view.c:420
+#: ../libempathy-gtk/empathy-chat-text-view.c:415
 msgid "%A %B %d %Y"
 msgstr "%A %d ב%B %Y"
 
@@ -1593,38 +1607,38 @@ msgid "Favorite People"
 msgstr "אנשים מועדפים"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:1987
-#: ../libempathy-gtk/empathy-individual-view.c:2343
+#: ../libempathy-gtk/empathy-individual-view.c:2386
 #, c-format
 msgid "Do you really want to remove the group '%s'?"
 msgstr "האם להסיר את הקבוצה '%s'?"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:1989
-#: ../libempathy-gtk/empathy-individual-view.c:2346
+#: ../libempathy-gtk/empathy-individual-view.c:2389
 msgid "Removing group"
 msgstr "הקבוצה מוסרת"
 
 #. Remove
 #: ../libempathy-gtk/empathy-contact-list-view.c:2038
 #: ../libempathy-gtk/empathy-contact-list-view.c:2115
-#: ../libempathy-gtk/empathy-individual-view.c:2401
-#: ../libempathy-gtk/empathy-individual-view.c:2595
+#: ../libempathy-gtk/empathy-individual-view.c:2444
+#: ../libempathy-gtk/empathy-individual-view.c:2637
 #: ../src/empathy-accounts-dialog.ui.h:7
 msgid "_Remove"
 msgstr "ה_סרה"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:2068
-#: ../libempathy-gtk/empathy-individual-view.c:2465
+#: ../libempathy-gtk/empathy-individual-view.c:2508
 #, c-format
 msgid "Do you really want to remove the contact '%s'?"
 msgstr "להסיר את איש הקשר '%s'?"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:2070
-#: ../libempathy-gtk/empathy-individual-view.c:2486
+#: ../libempathy-gtk/empathy-individual-view.c:2529
 msgid "Removing contact"
 msgstr "איש קשר מוסר"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:219
-#: ../src/empathy-main-window.ui.h:13
+#: ../src/empathy-main-window.ui.h:14
 msgid "_Add Contact…"
 msgstr "הוספת _איש קשר…"
 
@@ -1633,48 +1647,48 @@ msgid "_Block Contact"
 msgstr "ח_סימת איש קשר"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:328
-#: ../libempathy-gtk/empathy-individual-menu.c:517
-#: ../src/empathy-main-window.ui.h:15
+#: ../libempathy-gtk/empathy-individual-menu.c:536
+#: ../src/empathy-main-window.ui.h:16
 msgid "_Chat"
 msgstr "_שיחה"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:359
-#: ../libempathy-gtk/empathy-individual-menu.c:560
+#: ../libempathy-gtk/empathy-individual-menu.c:625
 msgctxt "menu item"
 msgid "_Audio Call"
 msgstr "שיחה _קולית"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:390
-#: ../libempathy-gtk/empathy-individual-menu.c:602
+#: ../libempathy-gtk/empathy-individual-menu.c:667
 msgctxt "menu item"
 msgid "_Video Call"
 msgstr "שיחת _וידאו"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:436
-#: ../libempathy-gtk/empathy-individual-menu.c:645
-#: ../src/empathy-main-window.ui.h:26
+#: ../libempathy-gtk/empathy-individual-menu.c:710
+#: ../src/empathy-main-window.ui.h:27
 msgid "_Previous Conversations"
 msgstr "שיחות _קודמות"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:458
-#: ../libempathy-gtk/empathy-individual-menu.c:686
+#: ../libempathy-gtk/empathy-individual-menu.c:751
 msgid "Send File"
 msgstr "שליחת קובץ"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:481
-#: ../libempathy-gtk/empathy-individual-menu.c:728
+#: ../libempathy-gtk/empathy-individual-menu.c:793
 msgid "Share My Desktop"
 msgstr "שיתוף שולחן העבודה שלי"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:521
-#: ../libempathy-gtk/empathy-contact-widget.c:1763
-#: ../libempathy-gtk/empathy-individual-menu.c:763
-#: ../libempathy-gtk/empathy-individual-widget.c:1372
+#: ../libempathy-gtk/empathy-contact-widget.c:1751
+#: ../libempathy-gtk/empathy-individual-menu.c:828
+#: ../libempathy-gtk/empathy-individual-widget.c:1370
 msgid "Favorite"
 msgstr "מועדף"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:550
-#: ../libempathy-gtk/empathy-individual-menu.c:791
+#: ../libempathy-gtk/empathy-individual-menu.c:856
 msgid "Infor_mation"
 msgstr "_מידע"
 
@@ -1684,30 +1698,30 @@ msgid "_Edit"
 msgstr "ע_ריכה"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:650
-#: ../libempathy-gtk/empathy-individual-menu.c:972
-#: ../src/empathy-chat-window.c:935
+#: ../libempathy-gtk/empathy-individual-menu.c:1037
+#: ../src/empathy-chat-window.c:986
 msgid "Inviting you to this room"
 msgstr "מזמין/ה אותך לחדר זה"
 
 #: ../libempathy-gtk/empathy-contact-menu.c:681
-#: ../libempathy-gtk/empathy-individual-menu.c:1019
+#: ../libempathy-gtk/empathy-individual-menu.c:1084
 msgid "_Invite to Chat Room"
 msgstr "ה_זמנה לחדר שיחה"
 
 #. Title
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:513
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:514
 msgid "Search contacts"
 msgstr "חיפוש בין אנשי הקשר"
 
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:543
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:544
 msgid "Search: "
 msgstr "חיפוש:"
 
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:601
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:602
 msgid "_Add Contact"
 msgstr "הוספת _איש קשר"
 
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:619
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:620
 msgid "No contacts found"
 msgstr "לא נמצאו אנשי קשר"
 
@@ -1860,33 +1874,33 @@ msgstr "קו רוחב:"
 msgid "Altitude:"
 msgstr "גובה:"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:871
-#: ../libempathy-gtk/empathy-contact-widget.c:888
+#: ../libempathy-gtk/empathy-contact-widget.c:861
+#: ../libempathy-gtk/empathy-contact-widget.c:876
 #: ../libempathy-gtk/empathy-individual-widget.c:616
-#: ../libempathy-gtk/empathy-individual-widget.c:633
+#: ../libempathy-gtk/empathy-individual-widget.c:631
 #: ../src/empathy-preferences.ui.h:12
 msgid "Location"
 msgstr "מיקום"
 
 #. translators: format is "Location, $date"
-#: ../libempathy-gtk/empathy-contact-widget.c:890
-#: ../libempathy-gtk/empathy-individual-widget.c:635
+#: ../libempathy-gtk/empathy-contact-widget.c:878
+#: ../libempathy-gtk/empathy-individual-widget.c:633
 #, c-format
 msgid "%s, %s"
 msgstr "%s, %s"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:942
-#: ../libempathy-gtk/empathy-individual-widget.c:684
+#: ../libempathy-gtk/empathy-contact-widget.c:930
+#: ../libempathy-gtk/empathy-individual-widget.c:682
 msgid "%B %e, %Y at %R UTC"
 msgstr "‏%B %e, %Y ב־‏%R ‏UTC"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:1024
-#: ../libempathy-gtk/empathy-individual-widget.c:919
+#: ../libempathy-gtk/empathy-contact-widget.c:1012
+#: ../libempathy-gtk/empathy-individual-widget.c:917
 msgid "Save Avatar"
 msgstr "שמירת תמונה אישית"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:1080
-#: ../libempathy-gtk/empathy-individual-widget.c:977
+#: ../libempathy-gtk/empathy-contact-widget.c:1068
+#: ../libempathy-gtk/empathy-individual-widget.c:975
 msgid "Unable to save avatar"
 msgstr "לא ניתן לשמור תמונה אישית"
 
@@ -1896,7 +1910,7 @@ msgstr "<b>מיקום</b> ב(תאריך)\t"
 
 #. Alias
 #: ../libempathy-gtk/empathy-contact-widget.ui.h:3
-#: ../libempathy-gtk/empathy-individual-widget.c:1307
+#: ../libempathy-gtk/empathy-individual-widget.c:1305
 msgid "Alias:"
 msgstr "כינוי:"
 
@@ -1916,7 +1930,7 @@ msgstr "פרטי איש קשר"
 #. Identifier to connect to Instant Messaging network
 #. Translators: Identifier to connect to Instant Messaging network
 #: ../libempathy-gtk/empathy-contact-widget.ui.h:8
-#: ../libempathy-gtk/empathy-individual-widget.c:1511
+#: ../libempathy-gtk/empathy-individual-widget.c:1509
 msgid "Identifier:"
 msgstr "מזהה:"
 
@@ -1955,7 +1969,7 @@ msgid "Select"
 msgstr "בחירה"
 
 #: ../libempathy-gtk/empathy-groups-widget.c:408
-#: ../src/empathy-main-window.c:1436
+#: ../src/empathy-main-window.c:1770
 msgid "Group"
 msgstr "קבוצה"
 
@@ -1996,23 +2010,29 @@ msgstr "אנשי הקשר שנבחרו ברשימה שמימין יקושרו ז
 msgid "%s (%s)"
 msgstr "%s (%s)"
 
-#: ../libempathy-gtk/empathy-individual-menu.c:839
+#. add an SMS button
+#: ../libempathy-gtk/empathy-individual-menu.c:582
+#: ../libempathy-gtk/empathy-new-message-dialog.c:248
+msgid "_SMS"
+msgstr "_SMS"
+
+#: ../libempathy-gtk/empathy-individual-menu.c:904
 msgctxt "Edit individual (contextual menu)"
 msgid "_Edit"
 msgstr "ע_ריכה"
 
 #. Translators: this is a verb meaning "to connect two contacts together
 #. * to form a meta-contact".
-#: ../libempathy-gtk/empathy-individual-menu.c:865
+#: ../libempathy-gtk/empathy-individual-menu.c:930
 msgctxt "Link individual (contextual menu)"
 msgid "_Link Contacts…"
 msgstr "_קישור אנשי קשר…"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2308
+#: ../libempathy-gtk/empathy-individual-view.c:2351
 msgid "Delete and _Block"
 msgstr "מחיקה ו_חסימה"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2474
+#: ../libempathy-gtk/empathy-individual-view.c:2517
 #, c-format
 msgid ""
 "Do you really want to remove the linked contact '%s'? Note that this will "
@@ -2021,7 +2041,7 @@ msgstr ""
 "האם אכן ברצונך להסיר את איש הקשר המקושר '%s'? נא לשים לב שפעולה זו תסיר את "
 "כל אנשי הקשר המתאגדים לאיש קשר מקושר זה."
 
-#: ../libempathy-gtk/empathy-individual-widget.c:1652
+#: ../libempathy-gtk/empathy-individual-widget.c:1650
 #, c-format
 msgid "Linked contact containing %u contact"
 msgid_plural "Linked contacts containing %u contacts"
@@ -2142,12 +2162,12 @@ msgid "Contact ID:"
 msgstr "מזהה איש הקשר:"
 
 #. add chat button
-#: ../libempathy-gtk/empathy-new-message-dialog.c:171
+#: ../libempathy-gtk/empathy-new-message-dialog.c:258
 msgid "C_hat"
 msgstr "שי_חה"
 
 #. Tweak the dialog
-#: ../libempathy-gtk/empathy-new-message-dialog.c:181
+#: ../libempathy-gtk/empathy-new-message-dialog.c:277
 msgid "New Conversation"
 msgstr "שיחה חדשה"
 
@@ -2289,19 +2309,23 @@ msgstr "שמירת הודעת המ_צב החדשה"
 msgid "Saved Status Messages"
 msgstr "הודעות המצב שנשמרו"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:67
+#: ../libempathy-gtk/empathy-theme-adium.c:1462
+msgid "Normal"
+msgstr "רגיל"
+
+#: ../libempathy-gtk/empathy-theme-manager.c:68
 msgid "Classic"
 msgstr "קלאסי"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:68
+#: ../libempathy-gtk/empathy-theme-manager.c:69
 msgid "Simple"
 msgstr "פשוט"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:69
+#: ../libempathy-gtk/empathy-theme-manager.c:70
 msgid "Clean"
 msgstr "נקי"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:70
+#: ../libempathy-gtk/empathy-theme-manager.c:71
 msgid "Blue"
 msgstr "כחול"
 
@@ -2754,8 +2778,8 @@ msgid "Select the accounts you want to import:"
 msgstr "נא לבחור את החשבון שברצונך לייבא:"
 
 #: ../src/empathy-account-assistant.c:813
-#: ../src/empathy-new-chatroom-dialog.c:562
-#: ../src/empathy-new-chatroom-dialog.c:563
+#: ../src/empathy-new-chatroom-dialog.c:555
+#: ../src/empathy-new-chatroom-dialog.c:556
 msgid "Yes"
 msgstr "כן"
 
@@ -2827,34 +2851,34 @@ msgstr "ישנם שינויים שלא נשמרו בחשבון ה־%s שלך."
 msgid "Your new account has not been saved yet."
 msgstr "החשבון החדש שלך לא נשמר עדיין."
 
-#: ../src/empathy-accounts-dialog.c:286
+#: ../src/empathy-accounts-dialog.c:345
 #: ../src/empathy-streamed-media-window.c:809
 msgid "Connecting…"
 msgstr "בהתחברות…"
 
-#: ../src/empathy-accounts-dialog.c:327
+#: ../src/empathy-accounts-dialog.c:386
 #, c-format
 msgid "Offline — %s"
 msgstr "לא מחובר — %s"
 
-#: ../src/empathy-accounts-dialog.c:339
+#: ../src/empathy-accounts-dialog.c:398
 #, c-format
 msgid "Disconnected — %s"
 msgstr "מנותק  — %s"
 
-#: ../src/empathy-accounts-dialog.c:350
+#: ../src/empathy-accounts-dialog.c:409
 msgid "Offline — No Network Connection"
 msgstr "מנותק — אין חיבור לרשת"
 
-#: ../src/empathy-accounts-dialog.c:357
+#: ../src/empathy-accounts-dialog.c:416
 msgid "Unknown Status"
 msgstr "מצב לא ידוע"
 
-#: ../src/empathy-accounts-dialog.c:369
+#: ../src/empathy-accounts-dialog.c:428
 msgid "Offline — Account Disabled"
 msgstr "מנותק — החשבון מנוטרל"
 
-#: ../src/empathy-accounts-dialog.c:772
+#: ../src/empathy-accounts-dialog.c:831
 msgid ""
 "You are about to create a new account, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -2862,16 +2886,16 @@ msgstr ""
 "עומד להיווצר חשבון חדש, מה שיבטל\n"
 "את השינויים שלך. האם ברצונך להמשיך?"
 
-#: ../src/empathy-accounts-dialog.c:1133
+#: ../src/empathy-accounts-dialog.c:1192
 #, c-format
 msgid "Do you want to remove %s from your computer?"
 msgstr "האם ברצונך להסיר את החשבון '%s' ממחשבך?"
 
-#: ../src/empathy-accounts-dialog.c:1137
+#: ../src/empathy-accounts-dialog.c:1196
 msgid "This will not remove your account on the server."
 msgstr "פעולה זו לא תסיר את חשבונך מהשרת."
 
-#: ../src/empathy-accounts-dialog.c:1375
+#: ../src/empathy-accounts-dialog.c:1432
 msgid ""
 "You are about to select another account, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -2880,15 +2904,15 @@ msgstr ""
 "את השינויים שלך. האת אתה בטוח שברצונך להמשיך?"
 
 #. Menu items: to enabled/disable the account
-#: ../src/empathy-accounts-dialog.c:1593
+#: ../src/empathy-accounts-dialog.c:1643
 msgid "_Enable"
 msgstr "ה_פעלה"
 
-#: ../src/empathy-accounts-dialog.c:1594
+#: ../src/empathy-accounts-dialog.c:1644
 msgid "_Disable"
 msgstr "נ_טרול"
 
-#: ../src/empathy-accounts-dialog.c:2113
+#: ../src/empathy-accounts-dialog.c:2154
 msgid ""
 "You are about to close the window, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -2923,11 +2947,11 @@ msgstr "הו_ספה…"
 msgid "_Import…"
 msgstr "י_בוא…"
 
-#: ../src/empathy-auth-client.c:250
+#: ../src/empathy-auth-client.c:249
 msgid " - Empathy authentication client"
 msgstr "- לקוח האימות של Empathy"
 
-#: ../src/empathy-auth-client.c:266
+#: ../src/empathy-auth-client.c:265
 msgid "Empathy authentication client"
 msgstr "לקוח האימות של Empathy"
 
@@ -3012,31 +3036,51 @@ msgstr "כתובת ה־IP של שרת הממסר"
 msgid "The IP address of the multicast group"
 msgstr "כתובת ה־IP של קבוצת התשדורת"
 
+#: ../src/empathy-streamed-media-window.c:1906
+msgctxt "encoding video codec"
+msgid "Unknown"
+msgstr "לא ידוע"
+
+#: ../src/empathy-streamed-media-window.c:1909
+msgctxt "encoding audio codec"
+msgid "Unknown"
+msgstr "לא ידוע"
+
+#: ../src/empathy-streamed-media-window.c:1912
+msgctxt "decoding video codec"
+msgid "Unknown"
+msgstr "לא ידוע"
+
+#: ../src/empathy-streamed-media-window.c:1915
+msgctxt "decoding audio codec"
+msgid "Unknown"
+msgstr "לא ידוע"
+
 #. Translators: number of minutes:seconds the caller has been connected
-#: ../src/empathy-streamed-media-window.c:2270
+#: ../src/empathy-streamed-media-window.c:2274
 #, c-format
 msgid "Connected — %d:%02dm"
 msgstr "מחובר — %d:%02d דק׳"
 
-#: ../src/empathy-streamed-media-window.c:2331
+#: ../src/empathy-streamed-media-window.c:2335
 msgid "Technical Details"
 msgstr "פרטים טכניים"
 
-#: ../src/empathy-streamed-media-window.c:2369
+#: ../src/empathy-streamed-media-window.c:2373
 #, c-format
 msgid ""
 "%s's software does not understand any of the audio formats supported by your "
 "computer"
 msgstr "התכנה של %s אינה מבינה את מבני השמע הנתמכים על ידי המחשב שלך"
 
-#: ../src/empathy-streamed-media-window.c:2374
+#: ../src/empathy-streamed-media-window.c:2378
 #, c-format
 msgid ""
 "%s's software does not understand any of the video formats supported by your "
 "computer"
 msgstr "התכנה של %s אינה מבינה את מבני הווידאו הנתמכים על ידי המחשב שלך"
 
-#: ../src/empathy-streamed-media-window.c:2380
+#: ../src/empathy-streamed-media-window.c:2384
 #, c-format
 msgid ""
 "Can't establish a connection to %s. One of you might be on a network that "
@@ -3045,21 +3089,21 @@ msgstr ""
 "לא ניתן להפעיל את החיבור אל %s. כנראה אחד ממשתתפי השיחה מחובר לרשת שאינה "
 "מאפשרת חיבורים ישירים."
 
-#: ../src/empathy-streamed-media-window.c:2386
+#: ../src/empathy-streamed-media-window.c:2390
 msgid "There was a failure on the network"
 msgstr "אירעה שגיאה ברשת"
 
-#: ../src/empathy-streamed-media-window.c:2390
+#: ../src/empathy-streamed-media-window.c:2394
 msgid ""
 "The audio formats necessary for this call are not installed on your computer"
 msgstr "מבני השמע הדרושים לקיום שיחה זו אינם מותקנים במחשבך"
 
-#: ../src/empathy-streamed-media-window.c:2393
+#: ../src/empathy-streamed-media-window.c:2397
 msgid ""
 "The video formats necessary for this call are not installed on your computer"
 msgstr "מבני הווידאו הדרושים לקיום שיחה זו אינם מותקנים במחשבך"
 
-#: ../src/empathy-streamed-media-window.c:2403
+#: ../src/empathy-streamed-media-window.c:2407
 #, c-format
 msgid ""
 "Something unexpected happened in a Telepathy component. Please <a href=\"%s"
@@ -3069,19 +3113,19 @@ msgstr ""
 "משהו בלתי צפוי ארע ברכיב של Telepathy. נא <a href=\"%s\">לדווח על באג זה</a> "
 "ולהוסיף דוחות שנאספו מחלון 'ניפוי השגיאות' שבתפריט העזרה."
 
-#: ../src/empathy-streamed-media-window.c:2411
+#: ../src/empathy-streamed-media-window.c:2415
 msgid "There was a failure in the call engine"
 msgstr "אירעה שגיאה במנוע הקריאה"
 
-#: ../src/empathy-streamed-media-window.c:2414
+#: ../src/empathy-streamed-media-window.c:2418
 msgid "The end of the stream was reached"
 msgstr "התזרים הגיע לסיומו"
 
-#: ../src/empathy-streamed-media-window.c:2454
+#: ../src/empathy-streamed-media-window.c:2458
 msgid "Can't establish audio stream"
 msgstr "לא ניתן לקיים תזרים שמע"
 
-#: ../src/empathy-streamed-media-window.c:2464
+#: ../src/empathy-streamed-media-window.c:2468
 msgid "Can't establish video stream"
 msgstr "לא ניתן לקיים תזרים וידאו"
 
@@ -3153,6 +3197,10 @@ msgstr "שלח צליל"
 msgid "Toggle audio transmission"
 msgstr "החלפה בין העברה ואי העברה של שמע"
 
+#: ../src/empathy-call-window.ui.h:18
+msgid "Unknown"
+msgstr "לא ידוע"
+
 #: ../src/empathy-call-window.ui.h:19
 msgid "V_ideo"
 msgstr "_וידאו"
@@ -3177,39 +3225,50 @@ msgstr "תצוגה מקדימה לווידאו"
 msgid "_Call"
 msgstr "_שיחה"
 
-#: ../src/empathy-call-window.ui.h:25 ../src/empathy-main-window.ui.h:29
+#: ../src/empathy-call-window.ui.h:25 ../src/empathy-main-window.ui.h:30
 msgid "_View"
 msgstr "_תצוגה"
 
-#: ../src/empathy-chat-window.c:474 ../src/empathy-chat-window.c:494
+#: ../src/empathy-chat-window.c:480 ../src/empathy-chat-window.c:500
 #, c-format
 msgid "%s (%d unread)"
 msgid_plural "%s (%d unread)"
 msgstr[0] "‏%s (אחת שלא נקראה)"
 msgstr[1] "‏%s ‏(%d שלא נקראו)"
 
-#: ../src/empathy-chat-window.c:486
+#: ../src/empathy-chat-window.c:492
 #, c-format
 msgid "%s (and %u other)"
 msgid_plural "%s (and %u others)"
 msgstr[0] "‏%s (ואחד נוסף)"
 msgstr[1] "‏%s (ו־%u נוספים)"
 
-#: ../src/empathy-chat-window.c:502
+#: ../src/empathy-chat-window.c:508
 #, c-format
 msgid "%s (%d unread from others)"
 msgid_plural "%s (%d unread from others)"
 msgstr[0] "‏%s (אחת שלא נקראה מאחרים)"
 msgstr[1] "‏%s (%d שלא נקראו מאחרים)"
 
-#: ../src/empathy-chat-window.c:511
+#: ../src/empathy-chat-window.c:517
 #, c-format
 msgid "%s (%d unread from all)"
 msgid_plural "%s (%d unread from all)"
 msgstr[0] "‏%s (אחת שלא נקראה מכולם)"
 msgstr[1] "‏%s (%d שלא נקראו מכולם)"
 
-#: ../src/empathy-chat-window.c:721
+#: ../src/empathy-chat-window.c:732
+msgid "SMS:"
+msgstr "SMS:"
+
+#: ../src/empathy-chat-window.c:742
+#, c-format
+msgid "Sending %d message"
+msgid_plural "Sending %d messages"
+msgstr[0] "נשלחת הודעה אחת"
+msgstr[1] "נשלחות %d הודעות"
+
+#: ../src/empathy-chat-window.c:764
 msgid "Typing a message."
 msgstr "הודעה מוקלדת."
 
@@ -3245,7 +3304,7 @@ msgstr "הזזת הלשונית _ימינה"
 msgid "Notify for All Messages"
 msgstr "התרעה עבור כל ההודעות"
 
-#: ../src/empathy-chat-window.ui.h:9 ../src/empathy-main-window.ui.h:17
+#: ../src/empathy-chat-window.ui.h:9 ../src/empathy-main-window.ui.h:18
 msgid "_Contents"
 msgstr "_תכנים"
 
@@ -3257,7 +3316,7 @@ msgstr "_שיחה"
 msgid "_Detach Tab"
 msgstr "_ניתוק הלשונית"
 
-#: ../src/empathy-chat-window.ui.h:12 ../src/empathy-main-window.ui.h:19
+#: ../src/empathy-chat-window.ui.h:12 ../src/empathy-main-window.ui.h:20
 msgid "_Edit"
 msgstr "ע_ריכה"
 
@@ -3265,7 +3324,7 @@ msgstr "ע_ריכה"
 msgid "_Favorite Chat Room"
 msgstr "_הוספת חדר השיחה למועדפים"
 
-#: ../src/empathy-chat-window.ui.h:14 ../src/empathy-main-window.ui.h:21
+#: ../src/empathy-chat-window.ui.h:14 ../src/empathy-main-window.ui.h:22
 msgid "_Help"
 msgstr "ע_זרה"
 
@@ -3305,90 +3364,90 @@ msgstr "חיבור אוטומטי"
 msgid "Manage Favorite Rooms"
 msgstr "ניהול חדרי שיחה מועדפים"
 
-#: ../src/empathy-event-manager.c:507
+#: ../src/empathy-event-manager.c:504
 msgid "Incoming video call"
 msgstr "שיחה קולית נכנסת"
 
-#: ../src/empathy-event-manager.c:507
+#: ../src/empathy-event-manager.c:504
 msgid "Incoming call"
 msgstr "שיחה נכנסת"
 
-#: ../src/empathy-event-manager.c:511
+#: ../src/empathy-event-manager.c:508
 #, c-format
 msgid "%s is video calling you. Do you want to answer?"
 msgstr "‏%s מתקשר אליך עם וידאו, האם ברצונך לענות?"
 
-#: ../src/empathy-event-manager.c:512
+#: ../src/empathy-event-manager.c:509
 #, c-format
 msgid "%s is calling you. Do you want to answer?"
 msgstr "‏%s מתקשר אליך, האם ברצונך לענות?"
 
-#: ../src/empathy-event-manager.c:515 ../src/empathy-event-manager.c:667
+#: ../src/empathy-event-manager.c:512 ../src/empathy-event-manager.c:661
 #, c-format
 msgid "Incoming call from %s"
 msgstr "שיחה נכנסת מ־%s"
 
-#: ../src/empathy-event-manager.c:540
+#: ../src/empathy-event-manager.c:537
 msgid "_Reject"
 msgstr "_דחייה"
 
-#: ../src/empathy-event-manager.c:546
+#: ../src/empathy-event-manager.c:543
 msgid "_Answer"
 msgstr "_מענה"
 
-#: ../src/empathy-event-manager.c:667
+#: ../src/empathy-event-manager.c:661
 #, c-format
 msgid "Incoming video call from %s"
 msgstr "שיחת וידאו נכנסת מ־%s"
 
-#: ../src/empathy-event-manager.c:744
+#: ../src/empathy-event-manager.c:734
 msgid "Room invitation"
 msgstr "הזמנה לחדר"
 
-#: ../src/empathy-event-manager.c:746
+#: ../src/empathy-event-manager.c:736
 #, c-format
 msgid "Invitation to join %s"
 msgstr "הזמנה להצטרף ל־%s"
 
-#: ../src/empathy-event-manager.c:753
+#: ../src/empathy-event-manager.c:743
 #, c-format
 msgid "%s is inviting you to join %s"
 msgstr "‏%s מזמין/ה אותך להצטרף אל %s"
 
-#: ../src/empathy-event-manager.c:761
+#: ../src/empathy-event-manager.c:751
 msgid "_Decline"
 msgstr "_סירוב"
 
-#: ../src/empathy-event-manager.c:766
+#: ../src/empathy-event-manager.c:756
 #: ../src/empathy-new-chatroom-dialog.ui.h:7
 msgid "_Join"
 msgstr "ה_צטרפות"
 
-#: ../src/empathy-event-manager.c:793
+#: ../src/empathy-event-manager.c:783
 #, c-format
 msgid "%s invited you to join %s"
 msgstr "‏%s הזמין/ה אותך להצטרף אל %s"
 
-#: ../src/empathy-event-manager.c:799
+#: ../src/empathy-event-manager.c:789
 #, c-format
 msgid "You have been invited to join %s"
 msgstr "הוזמנת להצטרף אל %s"
 
-#: ../src/empathy-event-manager.c:850
+#: ../src/empathy-event-manager.c:840
 #, c-format
 msgid "Incoming file transfer from %s"
 msgstr "העברת קבצים נכנסת מ־%s"
 
-#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:370
+#: ../src/empathy-event-manager.c:1010 ../src/empathy-main-window.c:377
 msgid "Password required"
 msgstr "נדרשת ססמה"
 
-#: ../src/empathy-event-manager.c:1076
+#: ../src/empathy-event-manager.c:1066
 #, c-format
 msgid "%s would like permission to see when you are online"
 msgstr "%s רוצה הרשאות לצפייה מתי המשתמש שלך מחובר"
 
-#: ../src/empathy-event-manager.c:1080
+#: ../src/empathy-event-manager.c:1070
 #, c-format
 msgid ""
 "\n"
@@ -3474,7 +3533,7 @@ msgstr "הקובץ \"%s\" נשלח אל %s"
 msgid "File transfer completed"
 msgstr "העברת קובץ הושלמה"
 
-#: ../src/empathy-ft-manager.c:616 ../src/empathy-ft-manager.c:783
+#: ../src/empathy-ft-manager.c:616 ../src/empathy-ft-manager.c:780
 msgid "Waiting for the other participant's response"
 msgstr "בהמתנה לתגובה של משתתפים נוספים"
 
@@ -3488,15 +3547,15 @@ msgstr "נבדקת השלמות של \"%s\""
 msgid "Hashing \"%s\""
 msgstr "מתבצע גיבוב ל־\"%s\""
 
-#: ../src/empathy-ft-manager.c:1029
+#: ../src/empathy-ft-manager.c:1026
 msgid "%"
 msgstr "%"
 
-#: ../src/empathy-ft-manager.c:1041
+#: ../src/empathy-ft-manager.c:1038
 msgid "File"
 msgstr "קובץ"
 
-#: ../src/empathy-ft-manager.c:1063
+#: ../src/empathy-ft-manager.c:1060
 msgid "Remaining"
 msgstr "נותר"
 
@@ -3532,39 +3591,55 @@ msgstr "פרוטוקול"
 msgid "Source"
 msgstr "מקור"
 
-#: ../src/empathy-main-window.c:387
+#: ../src/empathy-main-window.c:394
 msgid "Provide Password"
 msgstr "הזנת ססמה"
 
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:400
 msgid "Disconnect"
 msgstr "ניתוק"
 
-#: ../src/empathy-main-window.c:533
+#: ../src/empathy-main-window.c:540
 msgid "No match found"
 msgstr "לא נמצאה התאמה"
 
-#: ../src/empathy-main-window.c:688
+#: ../src/empathy-main-window.c:695
 msgid "Reconnect"
 msgstr "התחברות מחדש"
 
-#: ../src/empathy-main-window.c:694
+#: ../src/empathy-main-window.c:701
 msgid "Edit Account"
 msgstr "עריכת חשבון"
 
-#: ../src/empathy-main-window.c:700
+#: ../src/empathy-main-window.c:707
 msgid "Close"
 msgstr "סגירה"
 
-#: ../src/empathy-main-window.c:1418
+#. Translators: this string will be something like:
+#. *   Top up My Account ($1.23)..."
+#: ../src/empathy-main-window.c:849
+#, c-format
+msgid "Top up %s (%s)..."
+msgstr "Top up %s (%s)..."
+
+#: ../src/empathy-main-window.c:924
+msgid "Top up account credit"
+msgstr "אשראי חשבון ה־Top up"
+
+#. top up button
+#: ../src/empathy-main-window.c:999
+msgid "Top Up..."
+msgstr "Top Up..."
+
+#: ../src/empathy-main-window.c:1752
 msgid "Contact"
 msgstr "איש קשר"
 
-#: ../src/empathy-main-window.c:1765
+#: ../src/empathy-main-window.c:2101
 msgid "Contact List"
 msgstr "רשימת אנשי קשר"
 
-#: ../src/empathy-main-window.c:1881
+#: ../src/empathy-main-window.c:2219
 msgid "Show and edit accounts"
 msgstr "הצגה ועריכה של חשבונות"
 
@@ -3573,86 +3648,90 @@ msgid "Contacts on a _Map"
 msgstr "אנשי קשר על ה_מפה"
 
 #: ../src/empathy-main-window.ui.h:2
+msgid "Credit Balance"
+msgstr "מאזן האשראי"
+
+#: ../src/empathy-main-window.ui.h:3
 msgid "Find in Contact _List"
 msgstr "_חיפוש ברשימת אנשי הקשר"
 
-#: ../src/empathy-main-window.ui.h:3
+#: ../src/empathy-main-window.ui.h:4
 msgid "Join _Favorites"
 msgstr "_צירוף למועדפים"
 
-#: ../src/empathy-main-window.ui.h:4
+#: ../src/empathy-main-window.ui.h:5
 msgid "Manage Favorites"
 msgstr "ניהול מועדפים"
 
-#: ../src/empathy-main-window.ui.h:5
+#: ../src/empathy-main-window.ui.h:6
 msgid "N_ormal Size"
 msgstr "גודל _רגיל"
 
-#: ../src/empathy-main-window.ui.h:6 ../src/empathy-status-icon.ui.h:1
+#: ../src/empathy-main-window.ui.h:7 ../src/empathy-status-icon.ui.h:1
 msgid "New _Call…"
 msgstr "_שיחה חדשה…"
 
-#: ../src/empathy-main-window.ui.h:7
+#: ../src/empathy-main-window.ui.h:8
 msgid "Normal Size With _Avatars"
 msgstr "גודל רגיל עם _תמונות אישיות"
 
-#: ../src/empathy-main-window.ui.h:8
+#: ../src/empathy-main-window.ui.h:9
 msgid "P_references"
 msgstr "העד_פות"
 
-#: ../src/empathy-main-window.ui.h:9
+#: ../src/empathy-main-window.ui.h:10
 msgid "Show P_rotocols"
 msgstr "הצגת פ_רוטוקולים"
 
-#: ../src/empathy-main-window.ui.h:10
+#: ../src/empathy-main-window.ui.h:11
 msgid "Sort by _Name"
 msgstr "מיון לפי _שם"
 
-#: ../src/empathy-main-window.ui.h:11
+#: ../src/empathy-main-window.ui.h:12
 msgid "Sort by _Status"
 msgstr "מיון לפי _מצב"
 
-#: ../src/empathy-main-window.ui.h:12
+#: ../src/empathy-main-window.ui.h:13
 msgid "_Accounts"
 msgstr "_חשבונות"
 
-#: ../src/empathy-main-window.ui.h:14
+#: ../src/empathy-main-window.ui.h:15
 msgid "_Blocked Contacts"
 msgstr "אנשי קשר _חסומים"
 
-#: ../src/empathy-main-window.ui.h:16
+#: ../src/empathy-main-window.ui.h:17
 msgid "_Compact Size"
 msgstr "גודל _קומפקטי"
 
-#: ../src/empathy-main-window.ui.h:18
+#: ../src/empathy-main-window.ui.h:19
 msgid "_Debug"
 msgstr "_ניפוי שגיאות"
 
-#: ../src/empathy-main-window.ui.h:20
+#: ../src/empathy-main-window.ui.h:21
 msgid "_File Transfers"
 msgstr "העברות _קבצים"
 
-#: ../src/empathy-main-window.ui.h:22
+#: ../src/empathy-main-window.ui.h:23
 msgid "_Join…"
 msgstr "ה_צטרפות…"
 
-#: ../src/empathy-main-window.ui.h:23 ../src/empathy-status-icon.ui.h:3
+#: ../src/empathy-main-window.ui.h:24 ../src/empathy-status-icon.ui.h:3
 msgid "_New Conversation…"
 msgstr "_שיחה חדשה…"
 
-#: ../src/empathy-main-window.ui.h:24
+#: ../src/empathy-main-window.ui.h:25
 msgid "_Offline Contacts"
 msgstr "אנשי קשר _לא מחוברים"
 
-#: ../src/empathy-main-window.ui.h:25
+#: ../src/empathy-main-window.ui.h:26
 msgid "_Personal Information"
 msgstr "מידע _אישי"
 
-#: ../src/empathy-main-window.ui.h:27
+#: ../src/empathy-main-window.ui.h:28
 msgid "_Room"
 msgstr "_חדר"
 
-#: ../src/empathy-main-window.ui.h:28
+#: ../src/empathy-main-window.ui.h:29
 msgid "_Search for Contacts…"
 msgstr "_חיפוש אחר אנשי קשר…"
 
@@ -3666,7 +3745,7 @@ msgstr "חברים"
 
 #. Translators: Room/Join's roomlist tooltip. Parameters are a channel name,
 #. yes/no, yes/no and a number.
-#: ../src/empathy-new-chatroom-dialog.c:560
+#: ../src/empathy-new-chatroom-dialog.c:553
 #, c-format
 msgid ""
 "%s\n"
@@ -3679,16 +3758,16 @@ msgstr ""
 "נדרשת ססמה: %s\n"
 "חברים: %s"
 
-#: ../src/empathy-new-chatroom-dialog.c:562
-#: ../src/empathy-new-chatroom-dialog.c:563
+#: ../src/empathy-new-chatroom-dialog.c:555
+#: ../src/empathy-new-chatroom-dialog.c:556
 msgid "No"
 msgstr "לא"
 
-#: ../src/empathy-new-chatroom-dialog.c:591
+#: ../src/empathy-new-chatroom-dialog.c:584
 msgid "Could not start room listing"
 msgstr "לא ניתן להתחיל את הצגת החדרים"
 
-#: ../src/empathy-new-chatroom-dialog.c:601
+#: ../src/empathy-new-chatroom-dialog.c:594
 msgid "Could not stop room listing"
 msgstr "לא ניתן לעצור את הצגת החדרים"
 
@@ -3722,39 +3801,79 @@ msgstr "רשימת חדרים"
 msgid "_Room:"
 msgstr "_חדר:"
 
-#: ../src/empathy-preferences.c:139
+#: ../src/empathy-preferences.c:147
 msgid "Message received"
 msgstr "התקבלה הודעה"
 
-#: ../src/empathy-preferences.c:140
+#: ../src/empathy-preferences.c:148
 msgid "Message sent"
 msgstr "הודעה נשלחה"
 
-#: ../src/empathy-preferences.c:141
+#: ../src/empathy-preferences.c:149
 msgid "New conversation"
 msgstr "שיחה חדשה"
 
-#: ../src/empathy-preferences.c:142
+#: ../src/empathy-preferences.c:150
 msgid "Contact goes online"
 msgstr "איש קשר מתחבר"
 
-#: ../src/empathy-preferences.c:143
+#: ../src/empathy-preferences.c:151
 msgid "Contact goes offline"
 msgstr "איש קשר מתנתק"
 
-#: ../src/empathy-preferences.c:144
+#: ../src/empathy-preferences.c:152
 msgid "Account connected"
 msgstr "חשבון מחובר"
 
-#: ../src/empathy-preferences.c:145
+#: ../src/empathy-preferences.c:153
 msgid "Account disconnected"
 msgstr "חשבון נותק"
 
-#: ../src/empathy-preferences.c:446
+#: ../src/empathy-preferences.c:450
 msgid "Language"
 msgstr "שפה"
 
-#: ../src/empathy-preferences.c:875
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:700
+msgid "Juliet"
+msgstr "יוליה"
+
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:707
+msgid "Romeo"
+msgstr "רומיאו"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:713
+msgid "O Romeo, Romeo, wherefore art thou Romeo?"
+msgstr "הו רומיאו, רומיאו, מן אין שבת רומיאו?"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:716
+msgid "Deny thy father and refuse thy name;"
+msgstr ""
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:719
+msgid "Or if thou wilt not, be but sworn my love"
+msgstr ""
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:722
+msgid "And I'll no longer be a Capulet."
+msgstr ""
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:725
+msgid "Shall I hear more, or shall I speak at this?"
+msgstr ""
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:728
+msgid "Juliet has disconnected"
+msgstr "יוליה התנתקה"
+
+#: ../src/empathy-preferences.c:962
 msgid "Preferences"
 msgstr "העדפות"
 
@@ -3854,43 +3973,47 @@ msgid ""
 msgstr "ברשימת השפות מוצגות שפות שעבורן מותקנים אצלך מילונים."
 
 #: ../src/empathy-preferences.ui.h:24
+msgid "Theme Variant:"
+msgstr "הגוון הערכה:"
+
+#: ../src/empathy-preferences.ui.h:25
 msgid "Themes"
 msgstr "ערכות נושא"
 
-#: ../src/empathy-preferences.ui.h:25
+#: ../src/empathy-preferences.ui.h:26
 msgid "_Automatically connect on startup"
 msgstr "התחברות _אוטומטית עם ההפעלה"
 
-#: ../src/empathy-preferences.ui.h:26
+#: ../src/empathy-preferences.ui.h:27
 msgid "_Cellphone"
 msgstr "טלפון _סלולרי"
 
-#: ../src/empathy-preferences.ui.h:27
+#: ../src/empathy-preferences.ui.h:28
 msgid "_Enable bubble notifications"
 msgstr "ה_פעלת התרעות בתוך בועה"
 
-#: ../src/empathy-preferences.ui.h:28
+#: ../src/empathy-preferences.ui.h:29
 msgid "_Enable sound notifications"
 msgstr "ה_פעלת התרעות קוליות"
 
-#: ../src/empathy-preferences.ui.h:29
+#: ../src/empathy-preferences.ui.h:30
 msgid "_GPS"
 msgstr "_GPS"
 
-#: ../src/empathy-preferences.ui.h:30
+#: ../src/empathy-preferences.ui.h:31
 msgid "_Network (IP, Wi-Fi)"
 msgstr "_רשת (IP, אלחוטית)"
 
-#: ../src/empathy-preferences.ui.h:31
+#: ../src/empathy-preferences.ui.h:32
 msgid "_Open new chats in separate windows"
 msgstr "_פתיחת שיחות חדשות בחלונות נפרדים"
 
-#: ../src/empathy-preferences.ui.h:32
+#: ../src/empathy-preferences.ui.h:33
 msgid "_Publish location to my contacts"
 msgstr "_פרסום המיקום שלי לאנשי הקשר שלי"
 
 #. To translators: The longitude and latitude are rounded to closest 0,1 degrees, so for example 146,2345° is rounded to round(146,2345*10)/10 = 146,2 degrees.
-#: ../src/empathy-preferences.ui.h:34
+#: ../src/empathy-preferences.ui.h:35
 msgid "_Reduce location accuracy"
 msgstr "ה_פחתת דיוק המיקום"
 
@@ -3902,7 +4025,7 @@ msgstr "מצב"
 msgid "_Quit"
 msgstr "יצי_אה"
 
-#: ../src/empathy-map-view.c:442
+#: ../src/empathy-map-view.c:448
 msgid "Contact Map View"
 msgstr "מפת אנשי קשר"
 
@@ -4052,6 +4175,13 @@ msgstr "שיחה שלא נענתה מאת %s"
 msgid "%s just tried to call you, but you were in another call."
 msgstr "התקבלה בקשת שיחה מאת %s, אך באותו הזמן כבר היית בשיחה אחרת."
 
+#: ../libempathy-gtk/empathy-search-bar.c:282
+msgid "_Match case"
+msgstr "התאמת _רישיות"
+
+#~ msgid "_Enabled"
+#~ msgstr "מו_פעל"
+
 #~ msgid "%s is now offline."
 #~ msgstr "‏%s מנותק/ת כעת."
 
@@ -4127,9 +4257,6 @@ msgstr "התקבלה בקשת שיחה מאת %s, אך באותו הזמן כב
 #~ msgid "%s account"
 #~ msgstr "חשבון %s"
 
-#~ msgid "Salut account is created"
-#~ msgstr "Salut account is created"
-
 #~ msgid "Whether the Salut account has been created on the first Empathy run."
 #~ msgstr ""
 #~ "Whether the Salut account has been created on the first Empathy run."
index e7f05be23337e325898243dc2cf489b270d5794f..183b6ed3d81fc1a8c9b8d9a474c3dc5c852e06f6 100644 (file)
--- a/po/nb.po
+++ b/po/nb.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: empathy 2.92.x\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-20 11:24+0100\n"
-"PO-Revision-Date: 2011-03-17 09:53+0100\n"
+"POT-Creation-Date: 2011-05-04 11:11+0200\n"
+"PO-Revision-Date: 2011-05-04 11:14+0200\n"
 "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
 "Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n"
 "Language: no\n"
@@ -441,7 +441,7 @@ msgstr "Håndter meldings- og VoIP-kontoer"
 
 #. Tweak the dialog
 #: ../data/empathy-accounts.desktop.in.in.h:2
-#: ../src/empathy-accounts-dialog.c:2242
+#: ../src/empathy-accounts-dialog.c:2340
 msgid "Messaging and VoIP Accounts"
 msgstr "Meldings- og VoIP-kontoer"
 
@@ -489,7 +489,7 @@ msgstr "Feil under overføring av filen"
 msgid "The other participant is unable to transfer the file"
 msgstr "Avsender kan ikke overføre filen"
 
-#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:382
+#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:383
 msgid "Unknown reason"
 msgstr "Ukjent årsak"
 
@@ -513,120 +513,117 @@ msgstr "Usynlig"
 msgid "Offline"
 msgstr "Frakoblet"
 
-#: ../libempathy/empathy-utils.c:315
-#: ../src/empathy-streamed-media-window.c:1904
-#: ../src/empathy-streamed-media-window.c:1905
-#: ../src/empathy-streamed-media-window.c:1906
-#: ../src/empathy-streamed-media-window.c:1907
-#: ../src/empathy-call-window.ui.h:18
+#. translators: presence type is unknown
+#: ../libempathy/empathy-utils.c:316
+msgctxt "presence"
 msgid "Unknown"
 msgstr "Ukjent"
 
-#: ../libempathy/empathy-utils.c:354
+#: ../libempathy/empathy-utils.c:355
 msgid "No reason specified"
 msgstr "Ingen årsak oppgitt"
 
-#: ../libempathy/empathy-utils.c:356 ../libempathy/empathy-utils.c:412
+#: ../libempathy/empathy-utils.c:357 ../libempathy/empathy-utils.c:413
 msgid "Status is set to offline"
 msgstr "Status er satt til frakoblet"
 
-#: ../libempathy/empathy-utils.c:358 ../libempathy/empathy-utils.c:392
+#: ../libempathy/empathy-utils.c:359 ../libempathy/empathy-utils.c:393
 msgid "Network error"
 msgstr "Nettverksfeil"
 
-#: ../libempathy/empathy-utils.c:360 ../libempathy/empathy-utils.c:394
+#: ../libempathy/empathy-utils.c:361 ../libempathy/empathy-utils.c:395
 msgid "Authentication failed"
 msgstr "Autentiseringen feilet"
 
-#: ../libempathy/empathy-utils.c:362 ../libempathy/empathy-utils.c:396
+#: ../libempathy/empathy-utils.c:363 ../libempathy/empathy-utils.c:397
 msgid "Encryption error"
 msgstr "Krypteringsfeil"
 
-#: ../libempathy/empathy-utils.c:364
+#: ../libempathy/empathy-utils.c:365
 msgid "Name in use"
 msgstr "Navn i bruk"
 
-#: ../libempathy/empathy-utils.c:366 ../libempathy/empathy-utils.c:398
+#: ../libempathy/empathy-utils.c:367 ../libempathy/empathy-utils.c:399
 msgid "Certificate not provided"
 msgstr "Sertifikat ikke oppgitt"
 
-#: ../libempathy/empathy-utils.c:368 ../libempathy/empathy-utils.c:400
+#: ../libempathy/empathy-utils.c:369 ../libempathy/empathy-utils.c:401
 msgid "Certificate untrusted"
 msgstr "Stoler ikke på sertifikat"
 
-#: ../libempathy/empathy-utils.c:370 ../libempathy/empathy-utils.c:402
+#: ../libempathy/empathy-utils.c:371 ../libempathy/empathy-utils.c:403
 msgid "Certificate expired"
 msgstr "Sertifikat utgått"
 
-#: ../libempathy/empathy-utils.c:372 ../libempathy/empathy-utils.c:404
+#: ../libempathy/empathy-utils.c:373 ../libempathy/empathy-utils.c:405
 msgid "Certificate not activated"
 msgstr "Sertifikat ikke aktivert"
 
-#: ../libempathy/empathy-utils.c:374 ../libempathy/empathy-utils.c:406
+#: ../libempathy/empathy-utils.c:375 ../libempathy/empathy-utils.c:407
 msgid "Certificate hostname mismatch"
 msgstr "Feil vertsnavn i forhold til sertifikat"
 
-#: ../libempathy/empathy-utils.c:376 ../libempathy/empathy-utils.c:408
+#: ../libempathy/empathy-utils.c:377 ../libempathy/empathy-utils.c:409
 msgid "Certificate fingerprint mismatch"
 msgstr "Fingeravtrykk stemmer ikke for sertifikat"
 
-#: ../libempathy/empathy-utils.c:378 ../libempathy/empathy-utils.c:410
+#: ../libempathy/empathy-utils.c:379 ../libempathy/empathy-utils.c:411
 msgid "Certificate self-signed"
 msgstr "Selvsignert sertifikat"
 
-#: ../libempathy/empathy-utils.c:380
+#: ../libempathy/empathy-utils.c:381
 msgid "Certificate error"
 msgstr "Sertifikatsfeil"
 
-#: ../libempathy/empathy-utils.c:414
+#: ../libempathy/empathy-utils.c:415
 msgid "Encryption is not available"
 msgstr "Kryptering er ikke tilgjengelig"
 
-#: ../libempathy/empathy-utils.c:416
+#: ../libempathy/empathy-utils.c:417
 msgid "Certificate is invalid"
 msgstr "Sertifikatet ikke ugyldig"
 
-#: ../libempathy/empathy-utils.c:418
+#: ../libempathy/empathy-utils.c:419
 msgid "Connection has been refused"
 msgstr "Tilkobling nektes"
 
-#: ../libempathy/empathy-utils.c:420
+#: ../libempathy/empathy-utils.c:421
 msgid "Connection can't be established"
 msgstr "Tilkobling kan ikke etableres"
 
-#: ../libempathy/empathy-utils.c:422
+#: ../libempathy/empathy-utils.c:423
 msgid "Connection has been lost"
 msgstr "Tilkobling mistet"
 
-#: ../libempathy/empathy-utils.c:424
+#: ../libempathy/empathy-utils.c:425
 msgid "This resource is already connected to the server"
 msgstr "Denne ressursen er allerede koblet til tjeneren"
 
-#: ../libempathy/empathy-utils.c:426
+#: ../libempathy/empathy-utils.c:427
 msgid ""
 "Connection has been replaced by a new connection using the same resource"
 msgstr ""
 "Tilkoblingen er erstattet med en ny tilkobling som bruker samme ressurs"
 
-#: ../libempathy/empathy-utils.c:429
+#: ../libempathy/empathy-utils.c:430
 msgid "The account already exists on the server"
 msgstr "Kontoen eksisterer allerede på tjeneren"
 
-#: ../libempathy/empathy-utils.c:431
+#: ../libempathy/empathy-utils.c:432
 msgid "Server is currently too busy to handle the connection"
 msgstr "Tjeneren er for opptatt til å håndtere tilkoblingen"
 
-#: ../libempathy/empathy-utils.c:433
+#: ../libempathy/empathy-utils.c:434
 msgid "Certificate has been revoked"
 msgstr "Sertifikatet er trukket tilbake"
 
-#: ../libempathy/empathy-utils.c:435
+#: ../libempathy/empathy-utils.c:436
 msgid ""
 "Certificate uses an insecure cipher algorithm or is cryptographically weak"
 msgstr ""
 "Sertifikatet bruker en usikker cipher-algoritme eller er kryptografisk svakt"
 
-#: ../libempathy/empathy-utils.c:438
+#: ../libempathy/empathy-utils.c:439
 msgid ""
 "The length of the server certificate, or the depth of the server certificate "
 "chain, exceed the limits imposed by the cryptography library"
@@ -634,66 +631,66 @@ msgstr ""
 "Lengden på tjenersertifikatet eller dybden på sertifikatkjeden på tjeneren "
 "oversteg grensen som settes av kryptografibiblioteket"
 
-#: ../libempathy/empathy-utils.c:601
+#: ../libempathy/empathy-utils.c:602
 #: ../libempathy-gtk/empathy-contact-list-store.h:73
 msgid "People Nearby"
 msgstr "Personer i nærheten"
 
-#: ../libempathy/empathy-utils.c:606
+#: ../libempathy/empathy-utils.c:607
 msgid "Yahoo! Japan"
 msgstr "Yahoo! Japan"
 
-#: ../libempathy/empathy-utils.c:635
+#: ../libempathy/empathy-utils.c:636
 msgid "Google Talk"
 msgstr "Google Talk"
 
-#: ../libempathy/empathy-utils.c:636
+#: ../libempathy/empathy-utils.c:637
 msgid "Facebook Chat"
 msgstr "Facebook-prat"
 
-#: ../libempathy/empathy-time.c:137
+#: ../libempathy/empathy-time.c:100
 #, c-format
 msgid "%d second ago"
 msgid_plural "%d seconds ago"
 msgstr[0] "%d sekund siden"
 msgstr[1] "%d sekunder siden"
 
-#: ../libempathy/empathy-time.c:142
+#: ../libempathy/empathy-time.c:105
 #, c-format
 msgid "%d minute ago"
 msgid_plural "%d minutes ago"
 msgstr[0] "%d minutt siden"
 msgstr[1] "%d minutter siden"
 
-#: ../libempathy/empathy-time.c:147
+#: ../libempathy/empathy-time.c:110
 #, c-format
 msgid "%d hour ago"
 msgid_plural "%d hours ago"
 msgstr[0] "%d time siden"
 msgstr[1] "%d timer siden"
 
-#: ../libempathy/empathy-time.c:152
+#: ../libempathy/empathy-time.c:115
 #, c-format
 msgid "%d day ago"
 msgid_plural "%d days ago"
 msgstr[0] "%d dag siden"
 msgstr[1] "%d dager siden"
 
-#: ../libempathy/empathy-time.c:157
+#: ../libempathy/empathy-time.c:120
 #, c-format
 msgid "%d week ago"
 msgid_plural "%d weeks ago"
 msgstr[0] "%d uke siden"
 msgstr[1] "%d uker siden"
 
-#: ../libempathy/empathy-time.c:162
+#: ../libempathy/empathy-time.c:125
 #, c-format
 msgid "%d month ago"
 msgid_plural "%d months ago"
 msgstr[0] "%d måned siden"
 msgstr[1] "%d måneder siden"
 
-#: ../libempathy/empathy-time.c:167
+#: ../libempathy/empathy-time.c:130
 msgid "in the future"
 msgstr "i fremtiden"
 
@@ -701,83 +698,67 @@ msgstr "i fremtiden"
 msgid "All"
 msgstr "Alle"
 
-#: ../libempathy-gtk/empathy-account-widget.c:682
+#: ../libempathy-gtk/empathy-account-widget.c:678
 #: ../libempathy-gtk/empathy-log-window.c:643
 #: ../src/empathy-import-widget.c:321
 msgid "Account"
 msgstr "Konto"
 
-#: ../libempathy-gtk/empathy-account-widget.c:683
+#: ../libempathy-gtk/empathy-account-widget.c:679
 msgid "Password"
 msgstr "Passord"
 
-#: ../libempathy-gtk/empathy-account-widget.c:684
+#: ../libempathy-gtk/empathy-account-widget.c:680
 #: ../libempathy-gtk/empathy-irc-network-dialog.c:507
 msgid "Server"
 msgstr "Tjener"
 
-#: ../libempathy-gtk/empathy-account-widget.c:685
+#: ../libempathy-gtk/empathy-account-widget.c:681
 #: ../libempathy-gtk/empathy-irc-network-dialog.c:522
 msgid "Port"
 msgstr "Port"
 
-#: ../libempathy-gtk/empathy-account-widget.c:757
-#: ../libempathy-gtk/empathy-account-widget.c:814
+#: ../libempathy-gtk/empathy-account-widget.c:753
+#: ../libempathy-gtk/empathy-account-widget.c:810
 #, c-format
 msgid "%s:"
 msgstr "%s:"
 
-#: ../libempathy-gtk/empathy-account-widget.c:1166
+#: ../libempathy-gtk/empathy-account-widget.c:1151
 #, c-format
 msgid "The account %s is edited via My Web Accounts."
 msgstr "Konto %s er redigert via Mine nettkontoer."
 
-#: ../libempathy-gtk/empathy-account-widget.c:1172
+#: ../libempathy-gtk/empathy-account-widget.c:1157
 #, c-format
 msgid "The account %s cannot be edited in Empathy."
 msgstr "Konto %s kan ikke redigeres i Empathy."
 
-#: ../libempathy-gtk/empathy-account-widget.c:1192
+#: ../libempathy-gtk/empathy-account-widget.c:1177
 msgid "Launch My Web Accounts"
 msgstr "Start Mine nettkontoer"
 
-#: ../libempathy-gtk/empathy-account-widget.c:1530
+#: ../libempathy-gtk/empathy-account-widget.c:1515
 msgid "Username:"
 msgstr "Brukernavn:"
 
-#: ../libempathy-gtk/empathy-account-widget.c:1897
+#: ../libempathy-gtk/empathy-account-widget.c:1833
 msgid "A_pply"
 msgstr "_Bruk"
 
-#: ../libempathy-gtk/empathy-account-widget.c:1927
+#: ../libempathy-gtk/empathy-account-widget.c:1863
 msgid "L_og in"
 msgstr "L_ogg inn"
 
-#. Account and Identifier
-#: ../libempathy-gtk/empathy-account-widget.c:1993
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.ui.h:1
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:520
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
-#: ../libempathy-gtk/empathy-individual-widget.c:1481
-#: ../libempathy-gtk/empathy-contact-selector-dialog.ui.h:1
-#: ../src/empathy-chatrooms-window.ui.h:1
-#: ../src/empathy-new-chatroom-dialog.ui.h:1
-msgid "Account:"
-msgstr "Konto:"
-
-#: ../libempathy-gtk/empathy-account-widget.c:2004
-msgid "_Enabled"
-msgstr "Slått _på"
-
-#: ../libempathy-gtk/empathy-account-widget.c:2069
+#: ../libempathy-gtk/empathy-account-widget.c:1937
 msgid "This account already exists on the server"
 msgstr "Denne kontoen eksisterer allerede på tjeneren"
 
-#: ../libempathy-gtk/empathy-account-widget.c:2072
+#: ../libempathy-gtk/empathy-account-widget.c:1940
 msgid "Create a new account on the server"
 msgstr "Lag en ny konto på tjeneren"
 
-#: ../libempathy-gtk/empathy-account-widget.c:2264
+#: ../libempathy-gtk/empathy-account-widget.c:2132
 msgid "Ca_ncel"
 msgstr "A_vbryt"
 
@@ -786,19 +767,19 @@ msgstr "A_vbryt"
 #. * like: "MyUserName on freenode".
 #. * You should reverse the order of these arguments if the
 #. * server should come before the login id in your locale.
-#: ../libempathy-gtk/empathy-account-widget.c:2561
+#: ../libempathy-gtk/empathy-account-widget.c:2413
 #, c-format
 msgid "%1$s on %2$s"
 msgstr "%1$s av %2$s"
 
 #. To translators: The parameter is the protocol name. The resulting
 #. * string will be something like: "Jabber Account"
-#: ../libempathy-gtk/empathy-account-widget.c:2587
+#: ../libempathy-gtk/empathy-account-widget.c:2439
 #, c-format
 msgid "%s Account"
 msgstr "%s-konto"
 
-#: ../libempathy-gtk/empathy-account-widget.c:2591
+#: ../libempathy-gtk/empathy-account-widget.c:2443
 msgid "New account"
 msgstr "Ny konto"
 
@@ -1238,23 +1219,23 @@ msgstr "Emne er ikke støttet for denne samtalen"
 msgid "You are not allowed to change the topic"
 msgstr "Du har ikke lov til å bytte emne"
 
-#: ../libempathy-gtk/empathy-chat.c:906
+#: ../libempathy-gtk/empathy-chat.c:932
 msgid "/clear: clear all messages from the current conversation"
 msgstr "/clear: tøm alle meldinger fra aktiv samtale"
 
-#: ../libempathy-gtk/empathy-chat.c:909
+#: ../libempathy-gtk/empathy-chat.c:935
 msgid "/topic <topic>: set the topic of the current conversation"
 msgstr "/topic <emne>: sett emne for aktiv samtale"
 
-#: ../libempathy-gtk/empathy-chat.c:912
+#: ../libempathy-gtk/empathy-chat.c:938
 msgid "/join <chat room ID>: join a new chat room"
 msgstr "/join <ID for praterom>: bli med i et nytt praterom"
 
-#: ../libempathy-gtk/empathy-chat.c:915
+#: ../libempathy-gtk/empathy-chat.c:941
 msgid "/j <chat room ID>: join a new chat room"
 msgstr "/j <prateroms-ID>: bli med i et nytt praterom"
 
-#: ../libempathy-gtk/empathy-chat.c:920
+#: ../libempathy-gtk/empathy-chat.c:946
 msgid ""
 "/part [<chat room ID>] [<reason>]: leave the chat room, by default the "
 "current one"
@@ -1262,23 +1243,23 @@ msgstr ""
 "/part [<praterom-ID>] [<årsak>]: forlat praterommet, forvalg er det aktive "
 "rommet"
 
-#: ../libempathy-gtk/empathy-chat.c:925
+#: ../libempathy-gtk/empathy-chat.c:951
 msgid "/query <contact ID> [<message>]: open a private chat"
 msgstr "/query <kontakt-ID> [<melding>]: åpne en privat samtale"
 
-#: ../libempathy-gtk/empathy-chat.c:928
+#: ../libempathy-gtk/empathy-chat.c:954
 msgid "/msg <contact ID> <message>: open a private chat"
 msgstr "/msg <kontakt-ID> <melding>: åpne en privat samtale"
 
-#: ../libempathy-gtk/empathy-chat.c:931
+#: ../libempathy-gtk/empathy-chat.c:957
 msgid "/nick <nickname>: change your nickname on the current server"
 msgstr "/nick <kallenavn>: bytt kallenavn på denne tjeneren"
 
-#: ../libempathy-gtk/empathy-chat.c:934
+#: ../libempathy-gtk/empathy-chat.c:960
 msgid "/me <message>: send an ACTION message to the current conversation"
 msgstr "/me <melding>: send en HANDLINGS-melding til aktiv samtale"
 
-#: ../libempathy-gtk/empathy-chat.c:937
+#: ../libempathy-gtk/empathy-chat.c:963
 msgid ""
 "/say <message>: send <message> to the current conversation. This is used to "
 "send a message starting with a '/'. For example: \"/say /join is used to "
@@ -1288,7 +1269,7 @@ msgstr ""
 "sende en melding som starter med tegnet «/». For eksempel: «/say /join "
 "brukes til å bli med i et nytt praterom»"
 
-#: ../libempathy-gtk/empathy-chat.c:942
+#: ../libempathy-gtk/empathy-chat.c:968
 msgid ""
 "/help [<command>]: show all supported commands. If <command> is defined, "
 "show its usage."
@@ -1296,98 +1277,103 @@ msgstr ""
 "/help [<kommando>]: vis alle støttede kommandoer. Vis hjelp for <kommando> "
 "hvis den er definert."
 
-#: ../libempathy-gtk/empathy-chat.c:952
+#: ../libempathy-gtk/empathy-chat.c:978
 #, c-format
 msgid "Usage: %s"
 msgstr "Bruk: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:991
+#: ../libempathy-gtk/empathy-chat.c:1017
 msgid "Unknown command"
 msgstr "Ukjent kommando"
 
-#: ../libempathy-gtk/empathy-chat.c:1117
+#: ../libempathy-gtk/empathy-chat.c:1143
 msgid "Unknown command; see /help for the available commands"
 msgstr "Ukjent kommando; se /help for tilgjengelige kommandoer"
 
-#: ../libempathy-gtk/empathy-chat.c:1254
+#: ../libempathy-gtk/empathy-chat.c:1281
 msgid "offline"
 msgstr "frakoblet"
 
-#: ../libempathy-gtk/empathy-chat.c:1257
+#: ../libempathy-gtk/empathy-chat.c:1284
 msgid "invalid contact"
 msgstr "ugyldig kontakt"
 
-#: ../libempathy-gtk/empathy-chat.c:1260
+#: ../libempathy-gtk/empathy-chat.c:1287
 msgid "permission denied"
 msgstr "tilgang nektet"
 
-#: ../libempathy-gtk/empathy-chat.c:1263
+#: ../libempathy-gtk/empathy-chat.c:1290
 msgid "too long message"
 msgstr "meldingen er for lang"
 
-#: ../libempathy-gtk/empathy-chat.c:1266
+#: ../libempathy-gtk/empathy-chat.c:1293
 msgid "not implemented"
 msgstr "ikke implementert"
 
-#: ../libempathy-gtk/empathy-chat.c:1270
+#: ../libempathy-gtk/empathy-chat.c:1297
 msgid "unknown"
 msgstr "ukjent"
 
-#: ../libempathy-gtk/empathy-chat.c:1274
+#: ../libempathy-gtk/empathy-chat.c:1302
 #, c-format
 msgid "Error sending message '%s': %s"
 msgstr "Feil ved sending av melding «%s»: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1335 ../src/empathy-chat-window.c:717
+#: ../libempathy-gtk/empathy-chat.c:1306
+#, c-format
+msgid "Error sending message: %s"
+msgstr "Feil ved sending av melding: %s"
+
+#: ../libempathy-gtk/empathy-chat.c:1367 ../src/empathy-chat-window.c:717
 msgid "Topic:"
 msgstr "Emne:"
 
-#: ../libempathy-gtk/empathy-chat.c:1347
+#: ../libempathy-gtk/empathy-chat.c:1379
 #, c-format
 msgid "Topic set to: %s"
 msgstr "Emnet er satt til: %s"
 
-#: ../libempathy-gtk/empathy-chat.c:1349
+#: ../libempathy-gtk/empathy-chat.c:1381
 msgid "No topic defined"
 msgstr "Emne ikke definert"
 
-#: ../libempathy-gtk/empathy-chat.c:1848
+#: ../libempathy-gtk/empathy-chat.c:1888
 msgid "(No Suggestions)"
 msgstr "(Ingen forslag)"
 
 #. translators: %s is the selected word
-#: ../libempathy-gtk/empathy-chat.c:1916
+#: ../libempathy-gtk/empathy-chat.c:1956
 #, c-format
 msgid "Add '%s' to Dictionary"
 msgstr "Legg til «%s» i ordboken"
 
 #. translators: first %s is the selected word,
 #. * second %s is the language name of the target dictionary
-#: ../libempathy-gtk/empathy-chat.c:1953
+#: ../libempathy-gtk/empathy-chat.c:1993
 #, c-format
 msgid "Add '%s' to %s Dictionary"
 msgstr "Legg til «%s» i ordbok for %s"
 
-#: ../libempathy-gtk/empathy-chat.c:2010
+#: ../libempathy-gtk/empathy-chat.c:2050
 msgid "Insert Smiley"
 msgstr "Sett inn smilefjes"
 
 #. send button
-#: ../libempathy-gtk/empathy-chat.c:2028
+#: ../libempathy-gtk/empathy-chat.c:2068
 #: ../libempathy-gtk/empathy-ui-utils.c:1808
 msgid "_Send"
 msgstr "_Send"
 
 #. Spelling suggestions
-#: ../libempathy-gtk/empathy-chat.c:2063
+#: ../libempathy-gtk/empathy-chat.c:2103
 msgid "_Spelling Suggestions"
 msgstr "_Staveforslag"
 
-#: ../libempathy-gtk/empathy-chat.c:2152
+#: ../libempathy-gtk/empathy-chat.c:2192
 msgid "Failed to retrieve recent logs"
 msgstr "Klarte ikke å hente siste logger"
 
-#: ../libempathy-gtk/empathy-chat.c:2263
+#: ../libempathy-gtk/empathy-chat.c:2303
 #, c-format
 msgid "%s has disconnected"
 msgstr "%s har koblet fra"
@@ -1395,12 +1381,12 @@ msgstr "%s har koblet fra"
 #. translators: reverse the order of these arguments
 #. * if the kicked should come before the kicker in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2270
+#: ../libempathy-gtk/empathy-chat.c:2310
 #, c-format
 msgid "%1$s was kicked by %2$s"
 msgstr "%1$s ble sparket av %2$s"
 
-#: ../libempathy-gtk/empathy-chat.c:2273
+#: ../libempathy-gtk/empathy-chat.c:2313
 #, c-format
 msgid "%s was kicked"
 msgstr "%s ble sparket"
@@ -1408,17 +1394,17 @@ msgstr "%s ble sparket"
 #. translators: reverse the order of these arguments
 #. * if the banned should come before the banner in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2281
+#: ../libempathy-gtk/empathy-chat.c:2321
 #, c-format
 msgid "%1$s was banned by %2$s"
 msgstr "%1$s ble bannlyst av %2$s"
 
-#: ../libempathy-gtk/empathy-chat.c:2284
+#: ../libempathy-gtk/empathy-chat.c:2324
 #, c-format
 msgid "%s was banned"
 msgstr "%s ble bannlyst"
 
-#: ../libempathy-gtk/empathy-chat.c:2288
+#: ../libempathy-gtk/empathy-chat.c:2328
 #, c-format
 msgid "%s has left the room"
 msgstr "%s har forlatt rommet"
@@ -1428,62 +1414,62 @@ msgstr "%s har forlatt rommet"
 #. * given by the user living the room. If this poses a problem,
 #. * please let us know. :-)
 #.
-#: ../libempathy-gtk/empathy-chat.c:2297
+#: ../libempathy-gtk/empathy-chat.c:2337
 #, c-format
 msgid " (%s)"
 msgstr " (%s)"
 
-#: ../libempathy-gtk/empathy-chat.c:2322
+#: ../libempathy-gtk/empathy-chat.c:2362
 #, c-format
 msgid "%s has joined the room"
 msgstr "%s har blitt med i rommet"
 
-#: ../libempathy-gtk/empathy-chat.c:2347
+#: ../libempathy-gtk/empathy-chat.c:2387
 #, c-format
 msgid "%s is now known as %s"
 msgstr "%s er nå kjent som %s"
 
-#: ../libempathy-gtk/empathy-chat.c:2486
-#: ../src/empathy-streamed-media-window.c:1949
-#: ../src/empathy-event-manager.c:1122
+#: ../libempathy-gtk/empathy-chat.c:2526
+#: ../src/empathy-streamed-media-window.c:1957
+#: ../src/empathy-event-manager.c:1126
 msgid "Disconnected"
 msgstr "Koblet fra"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3116
+#: ../libempathy-gtk/empathy-chat.c:3158
 msgid "Would you like to store this password?"
 msgstr "Vil du lagre dette passordet?"
 
-#: ../libempathy-gtk/empathy-chat.c:3122
+#: ../libempathy-gtk/empathy-chat.c:3164
 msgid "Remember"
 msgstr "Husk"
 
-#: ../libempathy-gtk/empathy-chat.c:3132
+#: ../libempathy-gtk/empathy-chat.c:3174
 msgid "Not now"
 msgstr "Ikke nå"
 
-#: ../libempathy-gtk/empathy-chat.c:3176
+#: ../libempathy-gtk/empathy-chat.c:3218
 msgid "Retry"
 msgstr "Prøv igjen"
 
-#: ../libempathy-gtk/empathy-chat.c:3180
+#: ../libempathy-gtk/empathy-chat.c:3222
 msgid "Wrong password; please try again:"
 msgstr "Feil passord; vennligst prøv igjen:"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3297
+#: ../libempathy-gtk/empathy-chat.c:3339
 msgid "This room is protected by a password:"
 msgstr "Dette rommet er beskyttet med et passord:"
 
-#: ../libempathy-gtk/empathy-chat.c:3324
+#: ../libempathy-gtk/empathy-chat.c:3366
 msgid "Join"
 msgstr "Bli med"
 
-#: ../libempathy-gtk/empathy-chat.c:3494 ../src/empathy-event-manager.c:1144
+#: ../libempathy-gtk/empathy-chat.c:3536 ../src/empathy-event-manager.c:1147
 msgid "Connected"
 msgstr "Koblet til"
 
-#: ../libempathy-gtk/empathy-chat.c:3547
+#: ../libempathy-gtk/empathy-chat.c:3589
 #: ../libempathy-gtk/empathy-log-window.c:650
 msgid "Conversation"
 msgstr "Samtale"
@@ -1512,21 +1498,32 @@ msgstr "Kunne ikke blokkere kontakt"
 msgid "Edit Blocked Contacts"
 msgstr "Rediger blokkerte kontakter"
 
+#. Account and Identifier
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.ui.h:1
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:520
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
+#: ../libempathy-gtk/empathy-individual-widget.c:1479
+#: ../libempathy-gtk/empathy-contact-selector-dialog.ui.h:1
+#: ../src/empathy-chatrooms-window.ui.h:1
+#: ../src/empathy-new-chatroom-dialog.ui.h:1
+msgid "Account:"
+msgstr "Konto:"
+
 #. Copy Link Address menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:320
-#: ../libempathy-gtk/empathy-theme-adium.c:794
+#: ../libempathy-gtk/empathy-theme-adium.c:1026
 msgid "_Copy Link Address"
 msgstr "_Kopier lenkens adresse"
 
 #. Open Link menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:327
-#: ../libempathy-gtk/empathy-theme-adium.c:801
+#: ../libempathy-gtk/empathy-theme-adium.c:1033
 msgid "_Open Link"
 msgstr "_Åpne lenke"
 
 #. Translators: timestamp displayed between conversations in
 #. * chat windows (strftime format string)
-#: ../libempathy-gtk/empathy-chat-text-view.c:420
+#: ../libempathy-gtk/empathy-chat-text-view.c:415
 msgid "%A %B %d %Y"
 msgstr "%A %d %B %Y"
 
@@ -1544,24 +1541,24 @@ msgstr "Personlig informasjon"
 msgid "New Contact"
 msgstr "Ny kontakt"
 
-#: ../libempathy-gtk/empathy-contact-dialogs.c:532
+#: ../libempathy-gtk/empathy-contact-dialogs.c:533
 #: ../libempathy-gtk/empathy-individual-dialogs.c:199
 #, c-format
 msgid "Block %s?"
 msgstr "Blokker %s?"
 
-#: ../libempathy-gtk/empathy-contact-dialogs.c:537
+#: ../libempathy-gtk/empathy-contact-dialogs.c:538
 #: ../libempathy-gtk/empathy-individual-dialogs.c:247
 #, c-format
 msgid "Are you sure you want to block '%s' from contacting you again?"
 msgstr "Er du sikker på at du vil blokkere «%s» fra å kontakte deg igjen?"
 
-#: ../libempathy-gtk/empathy-contact-dialogs.c:542
+#: ../libempathy-gtk/empathy-contact-dialogs.c:543
 #: ../libempathy-gtk/empathy-individual-dialogs.c:269
 msgid "_Block"
 msgstr "_Blokker"
 
-#: ../libempathy-gtk/empathy-contact-dialogs.c:552
+#: ../libempathy-gtk/empathy-contact-dialogs.c:559
 #: ../libempathy-gtk/empathy-individual-dialogs.c:278
 msgid "_Report this contact as abusive"
 msgid_plural "_Report these contacts as abusive"
@@ -1588,34 +1585,34 @@ msgstr "Ikke gruppert"
 msgid "Favorite People"
 msgstr "Favorittpersoner"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:2001
-#: ../libempathy-gtk/empathy-individual-view.c:2336
+#: ../libempathy-gtk/empathy-contact-list-view.c:1987
+#: ../libempathy-gtk/empathy-individual-view.c:2386
 #, c-format
 msgid "Do you really want to remove the group '%s'?"
 msgstr "Vil du virkelig fjerne gruppen «%s»?"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:2003
-#: ../libempathy-gtk/empathy-individual-view.c:2339
+#: ../libempathy-gtk/empathy-contact-list-view.c:1989
+#: ../libempathy-gtk/empathy-individual-view.c:2389
 msgid "Removing group"
 msgstr "Fjerner gruppe"
 
 #. Remove
-#: ../libempathy-gtk/empathy-contact-list-view.c:2052
-#: ../libempathy-gtk/empathy-contact-list-view.c:2129
-#: ../libempathy-gtk/empathy-individual-view.c:2394
-#: ../libempathy-gtk/empathy-individual-view.c:2588
+#: ../libempathy-gtk/empathy-contact-list-view.c:2038
+#: ../libempathy-gtk/empathy-contact-list-view.c:2115
+#: ../libempathy-gtk/empathy-individual-view.c:2444
+#: ../libempathy-gtk/empathy-individual-view.c:2637
 #: ../src/empathy-accounts-dialog.ui.h:7
 msgid "_Remove"
 msgstr "Fje_rn"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:2082
-#: ../libempathy-gtk/empathy-individual-view.c:2458
+#: ../libempathy-gtk/empathy-contact-list-view.c:2068
+#: ../libempathy-gtk/empathy-individual-view.c:2508
 #, c-format
 msgid "Do you really want to remove the contact '%s'?"
 msgstr "Vil du virkelig fjerne kontakten «%s»?"
 
-#: ../libempathy-gtk/empathy-contact-list-view.c:2084
-#: ../libempathy-gtk/empathy-individual-view.c:2479
+#: ../libempathy-gtk/empathy-contact-list-view.c:2070
+#: ../libempathy-gtk/empathy-individual-view.c:2529
 msgid "Removing contact"
 msgstr "Fjerner kontakt"
 
@@ -1624,68 +1621,68 @@ msgstr "Fjerner kontakt"
 msgid "_Add Contact…"
 msgstr "_Legg til kontakt …"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:296
+#: ../libempathy-gtk/empathy-contact-menu.c:299
 msgid "_Block Contact"
 msgstr "_Blokker kontakt"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:325
+#: ../libempathy-gtk/empathy-contact-menu.c:328
 #: ../libempathy-gtk/empathy-individual-menu.c:517
 #: ../src/empathy-main-window.ui.h:15
 msgid "_Chat"
 msgstr "_Prat"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:356
+#: ../libempathy-gtk/empathy-contact-menu.c:359
 #: ../libempathy-gtk/empathy-individual-menu.c:560
 msgctxt "menu item"
 msgid "_Audio Call"
 msgstr "_Lydsamtale"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:387
+#: ../libempathy-gtk/empathy-contact-menu.c:390
 #: ../libempathy-gtk/empathy-individual-menu.c:602
 msgctxt "menu item"
 msgid "_Video Call"
 msgstr "_Videosamtale"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:433
+#: ../libempathy-gtk/empathy-contact-menu.c:436
 #: ../libempathy-gtk/empathy-individual-menu.c:645
 #: ../src/empathy-main-window.ui.h:26
 msgid "_Previous Conversations"
 msgstr "_Tidligere samtaler"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:455
+#: ../libempathy-gtk/empathy-contact-menu.c:458
 #: ../libempathy-gtk/empathy-individual-menu.c:686
 msgid "Send File"
 msgstr "Send fil"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:478
+#: ../libempathy-gtk/empathy-contact-menu.c:481
 #: ../libempathy-gtk/empathy-individual-menu.c:728
 msgid "Share My Desktop"
 msgstr "Del mitt skrivebord"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:518
-#: ../libempathy-gtk/empathy-contact-widget.c:1763
+#: ../libempathy-gtk/empathy-contact-menu.c:521
+#: ../libempathy-gtk/empathy-contact-widget.c:1761
 #: ../libempathy-gtk/empathy-individual-menu.c:763
-#: ../libempathy-gtk/empathy-individual-widget.c:1372
+#: ../libempathy-gtk/empathy-individual-widget.c:1370
 msgid "Favorite"
 msgstr "Favoritt"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:547
+#: ../libempathy-gtk/empathy-contact-menu.c:550
 #: ../libempathy-gtk/empathy-individual-menu.c:791
 msgid "Infor_mation"
 msgstr "Infor_masjon"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:593
+#: ../libempathy-gtk/empathy-contact-menu.c:596
 msgctxt "Edit contact (contextual menu)"
 msgid "_Edit"
 msgstr "R_ediger"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:647
+#: ../libempathy-gtk/empathy-contact-menu.c:650
 #: ../libempathy-gtk/empathy-individual-menu.c:972
 #: ../src/empathy-chat-window.c:935
 msgid "Inviting you to this room"
 msgstr "Inviterer deg til dette rommet"
 
-#: ../libempathy-gtk/empathy-contact-menu.c:678
+#: ../libempathy-gtk/empathy-contact-menu.c:681
 #: ../libempathy-gtk/empathy-individual-menu.c:1019
 msgid "_Invite to Chat Room"
 msgstr "_Inviter til praterom"
@@ -1857,32 +1854,32 @@ msgid "Altitude:"
 msgstr "Høyde:"
 
 #: ../libempathy-gtk/empathy-contact-widget.c:871
-#: ../libempathy-gtk/empathy-contact-widget.c:888
+#: ../libempathy-gtk/empathy-contact-widget.c:886
 #: ../libempathy-gtk/empathy-individual-widget.c:616
-#: ../libempathy-gtk/empathy-individual-widget.c:633
+#: ../libempathy-gtk/empathy-individual-widget.c:631
 #: ../src/empathy-preferences.ui.h:12
 msgid "Location"
 msgstr "Sted"
 
 #. translators: format is "Location, $date"
-#: ../libempathy-gtk/empathy-contact-widget.c:890
-#: ../libempathy-gtk/empathy-individual-widget.c:635
+#: ../libempathy-gtk/empathy-contact-widget.c:888
+#: ../libempathy-gtk/empathy-individual-widget.c:633
 #, c-format
 msgid "%s, %s"
 msgstr "%s, %s"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:942
-#: ../libempathy-gtk/empathy-individual-widget.c:684
+#: ../libempathy-gtk/empathy-contact-widget.c:940
+#: ../libempathy-gtk/empathy-individual-widget.c:682
 msgid "%B %e, %Y at %R UTC"
 msgstr "%B %e, %Y, %R UTC"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:1024
-#: ../libempathy-gtk/empathy-individual-widget.c:919
+#: ../libempathy-gtk/empathy-contact-widget.c:1022
+#: ../libempathy-gtk/empathy-individual-widget.c:917
 msgid "Save Avatar"
 msgstr "Lagre personbilder"
 
-#: ../libempathy-gtk/empathy-contact-widget.c:1080
-#: ../libempathy-gtk/empathy-individual-widget.c:977
+#: ../libempathy-gtk/empathy-contact-widget.c:1078
+#: ../libempathy-gtk/empathy-individual-widget.c:975
 msgid "Unable to save avatar"
 msgstr "Kan ikke lagre personbilde"
 
@@ -1892,7 +1889,7 @@ msgstr "<b>Plassering</b> (dato)\t"
 
 #. Alias
 #: ../libempathy-gtk/empathy-contact-widget.ui.h:3
-#: ../libempathy-gtk/empathy-individual-widget.c:1307
+#: ../libempathy-gtk/empathy-individual-widget.c:1305
 msgid "Alias:"
 msgstr "Alias:"
 
@@ -1912,7 +1909,7 @@ msgstr "Kontaktdetaljer"
 #. Identifier to connect to Instant Messaging network
 #. Translators: Identifier to connect to Instant Messaging network
 #: ../libempathy-gtk/empathy-contact-widget.ui.h:8
-#: ../libempathy-gtk/empathy-individual-widget.c:1511
+#: ../libempathy-gtk/empathy-individual-widget.c:1509
 msgid "Identifier:"
 msgstr "Identifikator:"
 
@@ -1951,7 +1948,7 @@ msgid "Select"
 msgstr "Velg"
 
 #: ../libempathy-gtk/empathy-groups-widget.c:408
-#: ../src/empathy-main-window.c:1436
+#: ../src/empathy-main-window.c:1439
 msgid "Group"
 msgstr "Gruppe"
 
@@ -2004,11 +2001,11 @@ msgctxt "Link individual (contextual menu)"
 msgid "_Link Contacts…"
 msgstr "Koble kontakter …"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2301
+#: ../libempathy-gtk/empathy-individual-view.c:2351
 msgid "Delete and _Block"
 msgstr "Slett og _blokker"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2467
+#: ../libempathy-gtk/empathy-individual-view.c:2517
 #, c-format
 msgid ""
 "Do you really want to remove the linked contact '%s'? Note that this will "
@@ -2017,7 +2014,7 @@ msgstr ""
 "Vil du virkelig fjerne lenket kontakt «%s»? Merk at dette vil fjerne alle "
 "kontaktene den lenkede kontakten består av."
 
-#: ../libempathy-gtk/empathy-individual-widget.c:1652
+#: ../libempathy-gtk/empathy-individual-widget.c:1650
 #, c-format
 msgid "Linked contact containing %u contact"
 msgid_plural "Linked contacts containing %u contacts"
@@ -2285,19 +2282,19 @@ msgstr "Lagre _nye statusmeldinger"
 msgid "Saved Status Messages"
 msgstr "Lagrede statusmeldinger"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:67
+#: ../libempathy-gtk/empathy-theme-manager.c:68
 msgid "Classic"
 msgstr "Klassisk"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:68
+#: ../libempathy-gtk/empathy-theme-manager.c:69
 msgid "Simple"
 msgstr "Enkel"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:69
+#: ../libempathy-gtk/empathy-theme-manager.c:70
 msgid "Clean"
 msgstr "Tøm"
 
-#: ../libempathy-gtk/empathy-theme-manager.c:70
+#: ../libempathy-gtk/empathy-theme-manager.c:71
 msgid "Blue"
 msgstr "Blå"
 
@@ -2827,34 +2824,34 @@ msgstr "Det finnes ikke-lagrede endringer for din %s-konto."
 msgid "Your new account has not been saved yet."
 msgstr "Din nye konto er ikke lagret ennå."
 
-#: ../src/empathy-accounts-dialog.c:286
+#: ../src/empathy-accounts-dialog.c:345
 #: ../src/empathy-streamed-media-window.c:809
 msgid "Connecting…"
 msgstr "Kobler til …"
 
-#: ../src/empathy-accounts-dialog.c:327
+#: ../src/empathy-accounts-dialog.c:386
 #, c-format
 msgid "Offline — %s"
 msgstr "Frakoblet - %s"
 
-#: ../src/empathy-accounts-dialog.c:339
+#: ../src/empathy-accounts-dialog.c:398
 #, c-format
 msgid "Disconnected — %s"
 msgstr "Koblet fra - %s"
 
-#: ../src/empathy-accounts-dialog.c:350
+#: ../src/empathy-accounts-dialog.c:409
 msgid "Offline — No Network Connection"
 msgstr "Frakoblet - Ingen nettverkstilkobling"
 
-#: ../src/empathy-accounts-dialog.c:357
+#: ../src/empathy-accounts-dialog.c:416
 msgid "Unknown Status"
 msgstr "Ukjent status"
 
-#: ../src/empathy-accounts-dialog.c:369
+#: ../src/empathy-accounts-dialog.c:428
 msgid "Offline — Account Disabled"
 msgstr "Frakoblet - Konto deaktivert"
 
-#: ../src/empathy-accounts-dialog.c:772
+#: ../src/empathy-accounts-dialog.c:831
 msgid ""
 "You are about to create a new account, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -2862,16 +2859,16 @@ msgstr ""
 "Du er i ferd med å lage en ny konto hvilket vil forkaste\n"
 "dine endringer. Er du sikker på at du vil fortsette?"
 
-#: ../src/empathy-accounts-dialog.c:1133
+#: ../src/empathy-accounts-dialog.c:1192
 #, c-format
 msgid "Do you want to remove %s from your computer?"
 msgstr "Vil du fjerne %s fra din datamaskin?"
 
-#: ../src/empathy-accounts-dialog.c:1137
+#: ../src/empathy-accounts-dialog.c:1196
 msgid "This will not remove your account on the server."
 msgstr "Dette vil ikke fjerne din konto på tjeneren."
 
-#: ../src/empathy-accounts-dialog.c:1375
+#: ../src/empathy-accounts-dialog.c:1434
 msgid ""
 "You are about to select another account, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -2880,15 +2877,15 @@ msgstr ""
 "dine endringer. Er du sikker på at du vil fortsette?"
 
 #. Menu items: to enabled/disable the account
-#: ../src/empathy-accounts-dialog.c:1571
+#: ../src/empathy-accounts-dialog.c:1652
 msgid "_Enable"
 msgstr "Slå _på"
 
-#: ../src/empathy-accounts-dialog.c:1572
+#: ../src/empathy-accounts-dialog.c:1653
 msgid "_Disable"
 msgstr "Slå _av"
 
-#: ../src/empathy-accounts-dialog.c:2086
+#: ../src/empathy-accounts-dialog.c:2174
 msgid ""
 "You are about to close the window, which will discard\n"
 "your changes. Are you sure you want to proceed?"
@@ -2924,11 +2921,11 @@ msgstr "_Legg til …"
 msgid "_Import…"
 msgstr "_Importer …"
 
-#: ../src/empathy-auth-client.c:246
+#: ../src/empathy-auth-client.c:250
 msgid " - Empathy authentication client"
 msgstr "- Empathy autentiseringsklient"
 
-#: ../src/empathy-auth-client.c:262
+#: ../src/empathy-auth-client.c:266
 msgid "Empathy authentication client"
 msgstr "Empathy autentiseringsklient"
 
@@ -3013,17 +3010,37 @@ msgstr "IP-adresse for en relay-tjener"
 msgid "The IP address of the multicast group"
 msgstr "IP-adresse for multicast-gruppe"
 
+#: ../src/empathy-streamed-media-window.c:1906
+msgctxt "encoding video codec"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: ../src/empathy-streamed-media-window.c:1909
+msgctxt "encoding audio codec"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: ../src/empathy-streamed-media-window.c:1912
+msgctxt "decoding video codec"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: ../src/empathy-streamed-media-window.c:1915
+msgctxt "decoding audio codec"
+msgid "Unknown"
+msgstr "Ukjent"
+
 #. Translators: number of minutes:seconds the caller has been connected
-#: ../src/empathy-streamed-media-window.c:2266
+#: ../src/empathy-streamed-media-window.c:2274
 #, c-format
 msgid "Connected — %d:%02dm"
 msgstr "Koblet til - %d:%02dm"
 
-#: ../src/empathy-streamed-media-window.c:2327
+#: ../src/empathy-streamed-media-window.c:2335
 msgid "Technical Details"
 msgstr "Tekniske detaljer"
 
-#: ../src/empathy-streamed-media-window.c:2365
+#: ../src/empathy-streamed-media-window.c:2373
 #, c-format
 msgid ""
 "%s's software does not understand any of the audio formats supported by your "
@@ -3032,7 +3049,7 @@ msgstr ""
 "Programvaren til %s forstår ikke noen av lydformatene som støttes av din "
 "datamaskin"
 
-#: ../src/empathy-streamed-media-window.c:2370
+#: ../src/empathy-streamed-media-window.c:2378
 #, c-format
 msgid ""
 "%s's software does not understand any of the video formats supported by your "
@@ -3041,7 +3058,7 @@ msgstr ""
 "Programvaren til %s forstår ikke noen av videoformatene som støttes av din "
 "datamaskin"
 
-#: ../src/empathy-streamed-media-window.c:2376
+#: ../src/empathy-streamed-media-window.c:2384
 #, c-format
 msgid ""
 "Can't establish a connection to %s. One of you might be on a network that "
@@ -3050,25 +3067,25 @@ msgstr ""
 "Kan ikke etablere tilkobling til %s. En av dere kan være på et nettverk som "
 "ikke tillater direkte tilkoblinger."
 
-#: ../src/empathy-streamed-media-window.c:2382
+#: ../src/empathy-streamed-media-window.c:2390
 msgid "There was a failure on the network"
 msgstr "Det oppsto en feil på nettverket"
 
-#: ../src/empathy-streamed-media-window.c:2386
+#: ../src/empathy-streamed-media-window.c:2394
 msgid ""
 "The audio formats necessary for this call are not installed on your computer"
 msgstr ""
 "Lydformatene som kreves for denne samtalen er ikke installert på din "
 "datamaskin"
 
-#: ../src/empathy-streamed-media-window.c:2389
+#: ../src/empathy-streamed-media-window.c:2397
 msgid ""
 "The video formats necessary for this call are not installed on your computer"
 msgstr ""
 "Videoformatene som kreves for denne samtalen er ikke installert på din "
 "datamaskin"
 
-#: ../src/empathy-streamed-media-window.c:2399
+#: ../src/empathy-streamed-media-window.c:2407
 #, c-format
 msgid ""
 "Something unexpected happened in a Telepathy component. Please <a href=\"%s"
@@ -3079,19 +3096,19 @@ msgstr ""
 "\">rapporter denne feilen</a> og legg ved loggene som samles inn i "
 "«Feilsøking»-vinduet i Hjelp-menyen."
 
-#: ../src/empathy-streamed-media-window.c:2407
+#: ../src/empathy-streamed-media-window.c:2415
 msgid "There was a failure in the call engine"
 msgstr "Det oppsto en feil i samtalemotoren"
 
-#: ../src/empathy-streamed-media-window.c:2410
+#: ../src/empathy-streamed-media-window.c:2418
 msgid "The end of the stream was reached"
 msgstr "Slutt på strømmen ble nådd"
 
-#: ../src/empathy-streamed-media-window.c:2450
+#: ../src/empathy-streamed-media-window.c:2458
 msgid "Can't establish audio stream"
 msgstr "Kan ikke etablere lydstrøm"
 
-#: ../src/empathy-streamed-media-window.c:2460
+#: ../src/empathy-streamed-media-window.c:2468
 msgid "Can't establish video stream"
 msgstr "Kan ikke etablere videostrøm"
 
@@ -3163,6 +3180,10 @@ msgstr "Send lyd"
 msgid "Toggle audio transmission"
 msgstr "Slå av/på overføring av lyd"
 
+#: ../src/empathy-call-window.ui.h:18
+msgid "Unknown"
+msgstr "Ukjent"
+
 #: ../src/empathy-call-window.ui.h:19
 msgid "V_ideo"
 msgstr "V_ideo"
@@ -3333,7 +3354,7 @@ msgstr "%s ringer deg med video. Vil du svare?"
 msgid "%s is calling you. Do you want to answer?"
 msgstr "%s ringer deg. Vil du svare?"
 
-#: ../src/empathy-event-manager.c:515 ../src/empathy-event-manager.c:660
+#: ../src/empathy-event-manager.c:515 ../src/empathy-event-manager.c:667
 #, c-format
 msgid "Incoming call from %s"
 msgstr "Innkommende samtale fra %s"
@@ -3346,59 +3367,59 @@ msgstr "Av_vis"
 msgid "_Answer"
 msgstr "Sv_ar"
 
-#: ../src/empathy-event-manager.c:660
+#: ../src/empathy-event-manager.c:667
 #, c-format
 msgid "Incoming video call from %s"
 msgstr "Innkommende videosamtale fra %s"
 
-#: ../src/empathy-event-manager.c:737
+#: ../src/empathy-event-manager.c:744
 msgid "Room invitation"
 msgstr "Invitasjon til rom"
 
-#: ../src/empathy-event-manager.c:739
+#: ../src/empathy-event-manager.c:746
 #, c-format
 msgid "Invitation to join %s"
 msgstr "Invitasjon til å bli med i %s"
 
-#: ../src/empathy-event-manager.c:746
+#: ../src/empathy-event-manager.c:753
 #, c-format
 msgid "%s is inviting you to join %s"
 msgstr "%s inviterer deg til å bli med i %s"
 
-#: ../src/empathy-event-manager.c:754
+#: ../src/empathy-event-manager.c:761
 msgid "_Decline"
 msgstr "_Avslå"
 
-#: ../src/empathy-event-manager.c:759
+#: ../src/empathy-event-manager.c:766
 #: ../src/empathy-new-chatroom-dialog.ui.h:7
 msgid "_Join"
 msgstr "_Bli med"
 
-#: ../src/empathy-event-manager.c:786
+#: ../src/empathy-event-manager.c:793
 #, c-format
 msgid "%s invited you to join %s"
 msgstr "%s inviterte deg til å bli med i %s"
 
-#: ../src/empathy-event-manager.c:792
+#: ../src/empathy-event-manager.c:799
 #, c-format
 msgid "You have been invited to join %s"
 msgstr "Du har blitt invitert til å bli med i %s"
 
-#: ../src/empathy-event-manager.c:843
+#: ../src/empathy-event-manager.c:850
 #, c-format
 msgid "Incoming file transfer from %s"
 msgstr "Innkommende filoverføring fra %s"
 
-#: ../src/empathy-event-manager.c:1013 ../src/empathy-main-window.c:370
+#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:373
 msgid "Password required"
 msgstr "Passord kreves"
 
-#: ../src/empathy-event-manager.c:1069
+#: ../src/empathy-event-manager.c:1076
 #, c-format
 msgid "%s would like permission to see when you are online"
 msgstr "%s ønsker rettigheter til å se når du er tilkoblet"
 
-#: ../src/empathy-event-manager.c:1073
+#: ../src/empathy-event-manager.c:1080
 #, c-format
 msgid ""
 "\n"
@@ -3408,105 +3429,105 @@ msgstr ""
 "Melding: %s"
 
 #. Translators: time left, when it is more than one hour
-#: ../src/empathy-ft-manager.c:99
+#: ../src/empathy-ft-manager.c:100
 #, c-format
 msgid "%u:%02u.%02u"
 msgstr "%u:%02u.%02u"
 
 #. Translators: time left, when is is less than one hour
-#: ../src/empathy-ft-manager.c:102
+#: ../src/empathy-ft-manager.c:103
 #, c-format
 msgid "%02u.%02u"
 msgstr "%02u.%02u"
 
-#: ../src/empathy-ft-manager.c:178
+#: ../src/empathy-ft-manager.c:179
 msgctxt "file transfer percent"
 msgid "Unknown"
 msgstr "Ukjent"
 
-#: ../src/empathy-ft-manager.c:273
+#: ../src/empathy-ft-manager.c:274
 #, c-format
 msgid "%s of %s at %s/s"
 msgstr "%s av %s med %s/s"
 
-#: ../src/empathy-ft-manager.c:274
+#: ../src/empathy-ft-manager.c:275
 #, c-format
 msgid "%s of %s"
 msgstr "%s av %s"
 
 #. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:305
+#: ../src/empathy-ft-manager.c:306
 #, c-format
 msgid "Receiving \"%s\" from %s"
 msgstr "Mottar «%s» fra %s"
 
 #. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:308
+#: ../src/empathy-ft-manager.c:309
 #, c-format
 msgid "Sending \"%s\" to %s"
 msgstr "Sender «%s» til %s"
 
 #. translators: first %s is filename, second %s
 #. * is the contact name
-#: ../src/empathy-ft-manager.c:338
+#: ../src/empathy-ft-manager.c:339
 #, c-format
 msgid "Error receiving \"%s\" from %s"
 msgstr "Feil ved mottak av «%s» fra %s"
 
-#: ../src/empathy-ft-manager.c:341
+#: ../src/empathy-ft-manager.c:342
 msgid "Error receiving a file"
 msgstr "Feil ved mottak av en fil"
 
-#: ../src/empathy-ft-manager.c:346
+#: ../src/empathy-ft-manager.c:347
 #, c-format
 msgid "Error sending \"%s\" to %s"
 msgstr "Feil ved sending av «%s» til %s"
 
-#: ../src/empathy-ft-manager.c:349
+#: ../src/empathy-ft-manager.c:350
 msgid "Error sending a file"
 msgstr "Feil ved sending av en fil"
 
 #. translators: first %s is filename, second %s
 #. * is the contact name
-#: ../src/empathy-ft-manager.c:488
+#: ../src/empathy-ft-manager.c:489
 #, c-format
 msgid "\"%s\" received from %s"
 msgstr "«%s» mottatt fra %s"
 
 #. translators: first %s is filename, second %s
 #. * is the contact name
-#: ../src/empathy-ft-manager.c:493
+#: ../src/empathy-ft-manager.c:494
 #, c-format
 msgid "\"%s\" sent to %s"
 msgstr "«%s» sendt til %s"
 
-#: ../src/empathy-ft-manager.c:496
+#: ../src/empathy-ft-manager.c:497
 msgid "File transfer completed"
 msgstr "Filoverføring fullført"
 
-#: ../src/empathy-ft-manager.c:615 ../src/empathy-ft-manager.c:782
+#: ../src/empathy-ft-manager.c:616 ../src/empathy-ft-manager.c:783
 msgid "Waiting for the other participant's response"
 msgstr "Venter på svar fra motparten"
 
-#: ../src/empathy-ft-manager.c:641 ../src/empathy-ft-manager.c:679
+#: ../src/empathy-ft-manager.c:642 ../src/empathy-ft-manager.c:680
 #, c-format
 msgid "Checking integrity of \"%s\""
 msgstr "Sjekker integriteten for «%s»"
 
-#: ../src/empathy-ft-manager.c:644 ../src/empathy-ft-manager.c:682
+#: ../src/empathy-ft-manager.c:645 ../src/empathy-ft-manager.c:683
 #, c-format
 msgid "Hashing \"%s\""
 msgstr "Hasher «%s»"
 
-#: ../src/empathy-ft-manager.c:1016
+#: ../src/empathy-ft-manager.c:1029
 msgid "%"
 msgstr "%"
 
-#: ../src/empathy-ft-manager.c:1028
+#: ../src/empathy-ft-manager.c:1041
 msgid "File"
 msgstr "Fil"
 
-#: ../src/empathy-ft-manager.c:1050
+#: ../src/empathy-ft-manager.c:1063
 msgid "Remaining"
 msgstr "Gjenstår"
 
@@ -3541,39 +3562,39 @@ msgstr "Protokoll"
 msgid "Source"
 msgstr "Kilde"
 
-#: ../src/empathy-main-window.c:387
+#: ../src/empathy-main-window.c:390
 msgid "Provide Password"
 msgstr "Oppgi passord"
 
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:396
 msgid "Disconnect"
 msgstr "Koble fra"
 
-#: ../src/empathy-main-window.c:533
+#: ../src/empathy-main-window.c:536
 msgid "No match found"
 msgstr "Ingen treff funnet"
 
-#: ../src/empathy-main-window.c:688
+#: ../src/empathy-main-window.c:691
 msgid "Reconnect"
 msgstr "Koble til på nytt"
 
-#: ../src/empathy-main-window.c:694
+#: ../src/empathy-main-window.c:697
 msgid "Edit Account"
 msgstr "Rediger konto"
 
-#: ../src/empathy-main-window.c:700
+#: ../src/empathy-main-window.c:703
 msgid "Close"
 msgstr "Lukk"
 
-#: ../src/empathy-main-window.c:1418
+#: ../src/empathy-main-window.c:1421
 msgid "Contact"
 msgstr "Kontakt"
 
-#: ../src/empathy-main-window.c:1765
+#: ../src/empathy-main-window.c:1768
 msgid "Contact List"
 msgstr "Kontaktliste"
 
-#: ../src/empathy-main-window.c:1881
+#: ../src/empathy-main-window.c:1884
 msgid "Show and edit accounts"
 msgstr "Vis og rediger kontoer"
 
@@ -3732,39 +3753,79 @@ msgstr "Romliste"
 msgid "_Room:"
 msgstr "_Rom:"
 
-#: ../src/empathy-preferences.c:139
+#: ../src/empathy-preferences.c:147
 msgid "Message received"
 msgstr "Melding mottatt"
 
-#: ../src/empathy-preferences.c:140
+#: ../src/empathy-preferences.c:148
 msgid "Message sent"
 msgstr "Melding sendt"
 
-#: ../src/empathy-preferences.c:141
+#: ../src/empathy-preferences.c:149
 msgid "New conversation"
 msgstr "Ny samtale"
 
-#: ../src/empathy-preferences.c:142
+#: ../src/empathy-preferences.c:150
 msgid "Contact goes online"
 msgstr "Kontakt kobler til"
 
-#: ../src/empathy-preferences.c:143
+#: ../src/empathy-preferences.c:151
 msgid "Contact goes offline"
 msgstr "Kontakt kobler fra"
 
-#: ../src/empathy-preferences.c:144
+#: ../src/empathy-preferences.c:152
 msgid "Account connected"
 msgstr "Konto koblet til"
 
-#: ../src/empathy-preferences.c:145
+#: ../src/empathy-preferences.c:153
 msgid "Account disconnected"
 msgstr "Konto koblet fra"
 
-#: ../src/empathy-preferences.c:446
+#: ../src/empathy-preferences.c:454
 msgid "Language"
 msgstr "Språk"
 
-#: ../src/empathy-preferences.c:875
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:704
+msgid "Juliet"
+msgstr "Juliet"
+
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:711
+msgid "Romeo"
+msgstr "Romeo"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:717
+msgid "O Romeo, Romeo, wherefore art thou Romeo?"
+msgstr "O Romeo, Romeo, wherefore art thou Romeo?"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:720
+msgid "Deny thy father and refuse thy name;"
+msgstr "Deny thy father and refuse thy name;"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:723
+msgid "Or if thou wilt not, be but sworn my love"
+msgstr "Or if thou wilt not, be but sworn my love"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:726
+msgid "And I'll no longer be a Capulet."
+msgstr "And I'll no longer be a Capulet."
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:729
+msgid "Shall I hear more, or shall I speak at this?"
+msgstr "Shall I hear more, or shall I speak at this?"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:732
+msgid "Juliet has disconnected"
+msgstr "Juliet har koblet fra"
+
+#: ../src/empathy-preferences.c:966
 msgid "Preferences"
 msgstr "Brukervalg"
 
@@ -3865,43 +3926,47 @@ msgstr ""
 "Listen med språk viser bare de språkene det er installert ordliste for."
 
 #: ../src/empathy-preferences.ui.h:24
+msgid "Theme Variant:"
+msgstr "Temavariant:"
+
+#: ../src/empathy-preferences.ui.h:25
 msgid "Themes"
 msgstr "Temaer"
 
-#: ../src/empathy-preferences.ui.h:25
+#: ../src/empathy-preferences.ui.h:26
 msgid "_Automatically connect on startup"
 msgstr "Koble til _automatisk ved oppstart"
 
-#: ../src/empathy-preferences.ui.h:26
+#: ../src/empathy-preferences.ui.h:27
 msgid "_Cellphone"
 msgstr "_Mobiltelefon"
 
-#: ../src/empathy-preferences.ui.h:27
+#: ../src/empathy-preferences.ui.h:28
 msgid "_Enable bubble notifications"
 msgstr "_Aktiver varsling med bobler"
 
-#: ../src/empathy-preferences.ui.h:28
+#: ../src/empathy-preferences.ui.h:29
 msgid "_Enable sound notifications"
 msgstr "_Aktiver varsling med lyder"
 
-#: ../src/empathy-preferences.ui.h:29
+#: ../src/empathy-preferences.ui.h:30
 msgid "_GPS"
 msgstr "_GPS"
 
-#: ../src/empathy-preferences.ui.h:30
+#: ../src/empathy-preferences.ui.h:31
 msgid "_Network (IP, Wi-Fi)"
 msgstr "_Nettverk (IP, Wi-Fi)"
 
-#: ../src/empathy-preferences.ui.h:31
+#: ../src/empathy-preferences.ui.h:32
 msgid "_Open new chats in separate windows"
 msgstr "_Åpne nye samtaler i egne vinduer"
 
-#: ../src/empathy-preferences.ui.h:32
+#: ../src/empathy-preferences.ui.h:33
 msgid "_Publish location to my contacts"
 msgstr "_Publiser plassering til mine kontakter"
 
 #. To translators: The longitude and latitude are rounded to closest 0,1 degrees, so for example 146,2345° is rounded to round(146,2345*10)/10 = 146,2 degrees.
-#: ../src/empathy-preferences.ui.h:34
+#: ../src/empathy-preferences.ui.h:35
 msgid "_Reduce location accuracy"
 msgstr "_Reduser nøyaktighet for plassering"
 
@@ -3913,7 +3978,7 @@ msgstr "Status"
 msgid "_Quit"
 msgstr "_Avslutt"
 
-#: ../src/empathy-map-view.c:442
+#: ../src/empathy-map-view.c:448
 msgid "Contact Map View"
 msgstr "Kartvisning for kontakter"
 
@@ -4051,6 +4116,10 @@ msgstr "Avslå"
 msgid "Accept"
 msgstr "Godta"
 
+#: ../src/empathy-notifications-approver.c:223
+msgid "Provide"
+msgstr "Oppgi"
+
 #: ../src/empathy-call-observer.c:130
 #, c-format
 msgid "Missed call from %s"
@@ -4060,3 +4129,7 @@ msgstr "Tapt anrop fra %s"
 #, c-format
 msgid "%s just tried to call you, but you were in another call."
 msgstr "%s prøvde å ringe deg, men du var i en annen samtale."
+
+#: ../libempathy-gtk/empathy-search-bar.c:282
+msgid "_Match case"
+msgstr "Skill _mellom små/store bokstaver"
index a4e72e3c86788b723a2cb7dc185ff6c867c21ea0..a51ca2b8274acebd44cd8488f566e7e7f7f0af5b 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -10,8 +10,8 @@ msgstr ""
 "Project-Id-Version: empathy\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
 "product=empathy&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2011-04-21 09:08+0000\n"
-"PO-Revision-Date: 2011-04-26 15:19+0300\n"
+"POT-Creation-Date: 2011-05-02 12:56+0000\n"
+"PO-Revision-Date: 2011-05-03 11:22+0300\n"
 "Last-Translator: Muhammet Kara <muhammet.k@gmail.com>\n"
 "Language-Team: Turkish <gnome-turk@gnome.org>\n"
 "MIME-Version: 1.0\n"
@@ -536,7 +536,6 @@ msgstr "Çevrimdışı"
 
 #. translators: presence type is unknown
 #: ../libempathy/empathy-utils.c:316
-#| msgid "Unknown"
 msgctxt "presence"
 msgid "Unknown"
 msgstr "Bilinmiyor"
@@ -1338,7 +1337,6 @@ msgstr "'%s' mesajı gönderilirken hata : %s"
 
 #: ../libempathy-gtk/empathy-chat.c:1306
 #, c-format
-#| msgid "Error sending message '%s': %s"
 msgid "Error sending message: %s"
 msgstr "Mesaj gönderme hatası: %s"
 
@@ -1355,43 +1353,43 @@ msgstr "Başlık değiştirildi: %s"
 msgid "No topic defined"
 msgstr "Başlık belirtilmemiş"
 
-#: ../libempathy-gtk/empathy-chat.c:1880
+#: ../libempathy-gtk/empathy-chat.c:1888
 msgid "(No Suggestions)"
 msgstr "(Öneri Yok)"
 
 #. translators: %s is the selected word
-#: ../libempathy-gtk/empathy-chat.c:1948
+#: ../libempathy-gtk/empathy-chat.c:1956
 #, c-format
 msgid "Add '%s' to Dictionary"
 msgstr "'%s' kelimesini Sözlüğe ekle"
 
 #. translators: first %s is the selected word,
 #. * second %s is the language name of the target dictionary
-#: ../libempathy-gtk/empathy-chat.c:1985
+#: ../libempathy-gtk/empathy-chat.c:1993
 #, c-format
 msgid "Add '%s' to %s Dictionary"
 msgstr "'%s' kelimesini %s Sözlüğe ekle"
 
-#: ../libempathy-gtk/empathy-chat.c:2042
+#: ../libempathy-gtk/empathy-chat.c:2050
 msgid "Insert Smiley"
 msgstr "Gülümseme Ekle"
 
 #. send button
-#: ../libempathy-gtk/empathy-chat.c:2060
+#: ../libempathy-gtk/empathy-chat.c:2068
 #: ../libempathy-gtk/empathy-ui-utils.c:1808
 msgid "_Send"
 msgstr "_Gönder"
 
 #. Spelling suggestions
-#: ../libempathy-gtk/empathy-chat.c:2095
+#: ../libempathy-gtk/empathy-chat.c:2103
 msgid "_Spelling Suggestions"
 msgstr "_Yazım Önerileri"
 
-#: ../libempathy-gtk/empathy-chat.c:2184
+#: ../libempathy-gtk/empathy-chat.c:2192
 msgid "Failed to retrieve recent logs"
 msgstr "Son kayıtlara erişme başarısız oldu"
 
-#: ../libempathy-gtk/empathy-chat.c:2295
+#: ../libempathy-gtk/empathy-chat.c:2303
 #, c-format
 msgid "%s has disconnected"
 msgstr "%s bağlantısını kesti"
@@ -1399,12 +1397,12 @@ msgstr "%s bağlantısını kesti"
 #. translators: reverse the order of these arguments
 #. * if the kicked should come before the kicker in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2302
+#: ../libempathy-gtk/empathy-chat.c:2310
 #, c-format
 msgid "%1$s was kicked by %2$s"
 msgstr "%2$s tarafından %1$s kanaldan atıldı"
 
-#: ../libempathy-gtk/empathy-chat.c:2305
+#: ../libempathy-gtk/empathy-chat.c:2313
 #, c-format
 msgid "%s was kicked"
 msgstr "%s kanaldan atıldı"
@@ -1412,17 +1410,17 @@ msgstr "%s kanaldan atıldı"
 #. translators: reverse the order of these arguments
 #. * if the banned should come before the banner in your locale.
 #.
-#: ../libempathy-gtk/empathy-chat.c:2313
+#: ../libempathy-gtk/empathy-chat.c:2321
 #, c-format
 msgid "%1$s was banned by %2$s"
 msgstr "%2$s tarafından %1$s yasaklandı"
 
-#: ../libempathy-gtk/empathy-chat.c:2316
+#: ../libempathy-gtk/empathy-chat.c:2324
 #, c-format
 msgid "%s was banned"
 msgstr "%s yasaklandı"
 
-#: ../libempathy-gtk/empathy-chat.c:2320
+#: ../libempathy-gtk/empathy-chat.c:2328
 #, c-format
 msgid "%s has left the room"
 msgstr "%s odayı terk etti"
@@ -1432,62 +1430,62 @@ msgstr "%s odayı terk etti"
 #. * given by the user living the room. If this poses a problem,
 #. * please let us know. :-)
 #.
-#: ../libempathy-gtk/empathy-chat.c:2329
+#: ../libempathy-gtk/empathy-chat.c:2337
 #, c-format
 msgid " (%s)"
 msgstr " (%s)"
 
-#: ../libempathy-gtk/empathy-chat.c:2354
+#: ../libempathy-gtk/empathy-chat.c:2362
 #, c-format
 msgid "%s has joined the room"
 msgstr "%s odaya katıldı"
 
-#: ../libempathy-gtk/empathy-chat.c:2379
+#: ../libempathy-gtk/empathy-chat.c:2387
 #, c-format
 msgid "%s is now known as %s"
 msgstr "%s şimdi %s olarak biliniyor"
 
-#: ../libempathy-gtk/empathy-chat.c:2518
+#: ../libempathy-gtk/empathy-chat.c:2526
 #: ../src/empathy-streamed-media-window.c:1957
 #: ../src/empathy-event-manager.c:1126
 msgid "Disconnected"
 msgstr "Bağlı Değil"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3148
+#: ../libempathy-gtk/empathy-chat.c:3158
 msgid "Would you like to store this password?"
 msgstr "Bu parolayı kaydetmek istiyor musunuz?"
 
-#: ../libempathy-gtk/empathy-chat.c:3154
+#: ../libempathy-gtk/empathy-chat.c:3164
 msgid "Remember"
 msgstr "Hatırla"
 
-#: ../libempathy-gtk/empathy-chat.c:3164
+#: ../libempathy-gtk/empathy-chat.c:3174
 msgid "Not now"
 msgstr "Şimdi değil"
 
-#: ../libempathy-gtk/empathy-chat.c:3208
+#: ../libempathy-gtk/empathy-chat.c:3218
 msgid "Retry"
 msgstr "Yeniden Dene"
 
-#: ../libempathy-gtk/empathy-chat.c:3212
+#: ../libempathy-gtk/empathy-chat.c:3222
 msgid "Wrong password; please try again:"
 msgstr "Yanlış parola: lütfen tekrar deneyin:"
 
 #. Add message
-#: ../libempathy-gtk/empathy-chat.c:3329
+#: ../libempathy-gtk/empathy-chat.c:3339
 msgid "This room is protected by a password:"
 msgstr "Bu oda bir parolayla korunuyor:"
 
-#: ../libempathy-gtk/empathy-chat.c:3356
+#: ../libempathy-gtk/empathy-chat.c:3366
 msgid "Join"
 msgstr "Katıl"
 
-#: ../libempathy-gtk/empathy-chat.c:3526 ../src/empathy-event-manager.c:1147
+#: ../libempathy-gtk/empathy-chat.c:3536 ../src/empathy-event-manager.c:1147
 msgid "Connected"
 msgstr "Bağlı"
 
-#: ../libempathy-gtk/empathy-chat.c:3579
+#: ../libempathy-gtk/empathy-chat.c:3589
 #: ../libempathy-gtk/empathy-log-window.c:650
 msgid "Conversation"
 msgstr "Konuşma"
@@ -1529,13 +1527,13 @@ msgstr "Hesap:"
 
 #. Copy Link Address menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:320
-#: ../libempathy-gtk/empathy-theme-adium.c:794
+#: ../libempathy-gtk/empathy-theme-adium.c:1010
 msgid "_Copy Link Address"
 msgstr "Bağ Adresini _Kopyala"
 
 #. Open Link menu item
 #: ../libempathy-gtk/empathy-chat-text-view.c:327
-#: ../libempathy-gtk/empathy-theme-adium.c:801
+#: ../libempathy-gtk/empathy-theme-adium.c:1017
 msgid "_Open Link"
 msgstr "_Bağı Aç"
 
@@ -1605,33 +1603,33 @@ msgid "Favorite People"
 msgstr "Sık Görüşülen Kişiler"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:1987
-#: ../libempathy-gtk/empathy-individual-view.c:2343
+#: ../libempathy-gtk/empathy-individual-view.c:2386
 #, c-format
 msgid "Do you really want to remove the group '%s'?"
 msgstr "Gerçekten '%s' grubunu kaldırmak istiyor musunuz?"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:1989
-#: ../libempathy-gtk/empathy-individual-view.c:2346
+#: ../libempathy-gtk/empathy-individual-view.c:2389
 msgid "Removing group"
 msgstr "Grup kaldırılıyor"
 
 #. Remove
 #: ../libempathy-gtk/empathy-contact-list-view.c:2038
 #: ../libempathy-gtk/empathy-contact-list-view.c:2115
-#: ../libempathy-gtk/empathy-individual-view.c:2401
-#: ../libempathy-gtk/empathy-individual-view.c:2594
+#: ../libempathy-gtk/empathy-individual-view.c:2444
+#: ../libempathy-gtk/empathy-individual-view.c:2637
 #: ../src/empathy-accounts-dialog.ui.h:7
 msgid "_Remove"
 msgstr "Kaldı_r"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:2068
-#: ../libempathy-gtk/empathy-individual-view.c:2465
+#: ../libempathy-gtk/empathy-individual-view.c:2508
 #, c-format
 msgid "Do you really want to remove the contact '%s'?"
 msgstr "Gerçekten '%s' bağlantısını kaldırmak istiyor musunuz?"
 
 #: ../libempathy-gtk/empathy-contact-list-view.c:2070
-#: ../libempathy-gtk/empathy-individual-view.c:2486
+#: ../libempathy-gtk/empathy-individual-view.c:2529
 msgid "Removing contact"
 msgstr "Bağlantı kaldırılıyor"
 
@@ -1967,7 +1965,7 @@ msgid "Select"
 msgstr "Seç"
 
 #: ../libempathy-gtk/empathy-groups-widget.c:408
-#: ../src/empathy-main-window.c:1436
+#: ../src/empathy-main-window.c:1439
 msgid "Group"
 msgstr "Grup"
 
@@ -2018,11 +2016,11 @@ msgctxt "Link individual (contextual menu)"
 msgid "_Link Contacts…"
 msgstr "_Kişileri Bağla..."
 
-#: ../libempathy-gtk/empathy-individual-view.c:2308
+#: ../libempathy-gtk/empathy-individual-view.c:2351
 msgid "Delete and _Block"
 msgstr "Sil ve _Engelle"
 
-#: ../libempathy-gtk/empathy-individual-view.c:2474
+#: ../libempathy-gtk/empathy-individual-view.c:2517
 #, c-format
 msgid ""
 "Do you really want to remove the linked contact '%s'? Note that this will "
@@ -2667,7 +2665,7 @@ msgstr ""
 "Deniz Koçak <deniz.kocak@linux.org.tr>\n"
 "Barış Çiçek <baris@teamforce.name.tr>\n"
 "Muhammet Kara <muhammet.k@gmail.com>\n"
-"Ubuntu'yu Türkçe'ye Çevirenler Takımı"
+"Launchpad Çevirmenleri"
 
 #: ../src/empathy-account-assistant.c:167
 msgid "There was an error while importing the accounts."
@@ -3027,25 +3025,21 @@ msgid "The IP address of the multicast group"
 msgstr "Çoklu yayın grubunun IP adresi"
 
 #: ../src/empathy-streamed-media-window.c:1906
-#| msgid "Unknown"
 msgctxt "encoding video codec"
 msgid "Unknown"
 msgstr "Bilinmiyor"
 
 #: ../src/empathy-streamed-media-window.c:1909
-#| msgid "Unknown"
 msgctxt "encoding audio codec"
 msgid "Unknown"
 msgstr "Bilinmiyor"
 
 #: ../src/empathy-streamed-media-window.c:1912
-#| msgid "Unknown"
 msgctxt "decoding video codec"
 msgid "Unknown"
 msgstr "Bilinmiyor"
 
 #: ../src/empathy-streamed-media-window.c:1915
-#| msgid "Unknown"
 msgctxt "decoding audio codec"
 msgid "Unknown"
 msgstr "Bilinmiyor"
@@ -3423,7 +3417,7 @@ msgstr "%s'e katılmaya davet edildiniz"
 msgid "Incoming file transfer from %s"
 msgstr "%s kişisinden gelen dosya transferi"
 
-#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:370
+#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:373
 msgid "Password required"
 msgstr "Parola gerekli"
 
@@ -3578,39 +3572,39 @@ msgstr "Protokol"
 msgid "Source"
 msgstr "Kaynak"
 
-#: ../src/empathy-main-window.c:387
+#: ../src/empathy-main-window.c:390
 msgid "Provide Password"
 msgstr "Parola Gir"
 
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:396
 msgid "Disconnect"
 msgstr "Bağlantıyı kes"
 
-#: ../src/empathy-main-window.c:533
+#: ../src/empathy-main-window.c:536
 msgid "No match found"
 msgstr "Eşleşme bulunamadı"
 
-#: ../src/empathy-main-window.c:688
+#: ../src/empathy-main-window.c:691
 msgid "Reconnect"
 msgstr "Yeniden Bağlan"
 
-#: ../src/empathy-main-window.c:694
+#: ../src/empathy-main-window.c:697
 msgid "Edit Account"
 msgstr "Hesabı Düzenle"
 
-#: ../src/empathy-main-window.c:700
+#: ../src/empathy-main-window.c:703
 msgid "Close"
 msgstr "Kapat"
 
-#: ../src/empathy-main-window.c:1418
+#: ../src/empathy-main-window.c:1421
 msgid "Contact"
 msgstr "Bağlantı"
 
-#: ../src/empathy-main-window.c:1765
+#: ../src/empathy-main-window.c:1768
 msgid "Contact List"
 msgstr "Bağlantı Listesi"
 
-#: ../src/empathy-main-window.c:1881
+#: ../src/empathy-main-window.c:1884
 msgid "Show and edit accounts"
 msgstr "Hesapları göster ve düzenle"
 
@@ -4091,7 +4085,6 @@ msgid "Accept"
 msgstr "Kabul Et"
 
 #: ../src/empathy-notifications-approver.c:223
-#| msgid "Preview"
 msgid "Provide"
 msgstr "Sağla"
 
@@ -4105,6 +4098,11 @@ msgstr "Cevapsız çağrı %s"
 msgid "%s just tried to call you, but you were in another call."
 msgstr "%s sizi aramayı denedi, fakat siz başka bir arama ile meşguldünüz."
 
+#: ../libempathy-gtk/empathy-search-bar.c:282
+#| msgid "Match case"
+msgid "_Match case"
+msgstr "_BÜYÜK/küçük harf eşleştir"
+
 #~ msgid "_Enabled"
 #~ msgstr "_Etkin"
 
index 734809f808f1d2eaf5ea07763330e35dcec725ff..14de1d3c56602e6e0412b3416e8b093bda0a3667 100644 (file)
@@ -1209,12 +1209,10 @@ accounts_dialog_button_remove_clicked_cb (GtkWidget *button,
 {
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
   GtkTreeView  *view;
-  GtkTreeModel *model;
   GtkTreeSelection *selection;
   GtkTreeIter iter;
 
   view = GTK_TREE_VIEW (priv->treeview);
-  model = gtk_tree_view_get_model (view);
   selection = gtk_tree_view_get_selection (view);
   if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
       return;
@@ -1491,14 +1489,12 @@ accounts_dialog_get_settings_iter (EmpathyAccountsDialog *dialog,
     GtkTreeIter *iter)
 {
   GtkTreeView      *view;
-  GtkTreeSelection *selection;
   GtkTreeModel     *model;
   gboolean          ok;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
   /* Update the status in the model */
   view = GTK_TREE_VIEW (priv->treeview);
-  selection = gtk_tree_view_get_selection (view);
   model = gtk_tree_view_get_model (view);
 
   for (ok = gtk_tree_model_get_iter_first (model, iter);
@@ -1528,14 +1524,12 @@ accounts_dialog_get_account_iter (EmpathyAccountsDialog *dialog,
     GtkTreeIter *iter)
 {
   GtkTreeView      *view;
-  GtkTreeSelection *selection;
   GtkTreeModel     *model;
   gboolean          ok;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
   /* Update the status in the model */
   view = GTK_TREE_VIEW (priv->treeview);
-  selection = gtk_tree_view_get_selection (view);
   model = gtk_tree_view_get_model (view);
 
   for (ok = gtk_tree_model_get_iter_first (model, iter);
@@ -1585,11 +1579,8 @@ static void
 accounts_dialog_model_set_selected (EmpathyAccountsDialog *dialog,
     EmpathyAccountSettings *settings)
 {
-  GtkTreeSelection *selection;
   GtkTreeIter       iter;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
   if (accounts_dialog_get_settings_iter (dialog, settings, &iter))
     select_and_scroll_to_iter (dialog, &iter);
 }
@@ -1831,14 +1822,12 @@ accounts_dialog_add_account (EmpathyAccountsDialog *dialog,
   GtkTreeIter         iter;
   TpConnectionStatus  status;
   const gchar        *name;
-  gboolean            enabled;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
   gboolean selected = FALSE;
 
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
   status = tp_account_get_connection_status (account, NULL);
   name = tp_account_get_display_name (account);
-  enabled = tp_account_is_enabled (account);
 
   settings = empathy_account_settings_new_for_account (account);
 
@@ -1968,12 +1957,6 @@ enable_or_disable_account (EmpathyAccountsDialog *dialog,
     TpAccount *account,
     gboolean enabled)
 {
-  GtkTreeModel *model;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-
-  /* Update the status in the model */
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
-
   /* Update the status-infobar in the details view */
   accounts_dialog_update_status_infobar (dialog, account);
 
@@ -2036,11 +2019,8 @@ static void
 accounts_dialog_set_selected_account (EmpathyAccountsDialog *dialog,
     TpAccount *account)
 {
-  GtkTreeSelection *selection;
   GtkTreeIter       iter;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
   if (accounts_dialog_get_account_iter (dialog, account, &iter))
     select_and_scroll_to_iter (dialog, &iter);
 }
index 68c4543a881e2d673ef363429bc985d956514862..b7988e07e39f855ed793eaac6fc4ebfe5c0aab16 100644 (file)
@@ -159,7 +159,6 @@ verifier_verify_cb (GObject *source,
     GAsyncResult *result,
     gpointer user_data)
 {
-  gboolean res;
   EmpTLSCertificateRejectReason reason;
   GError *error = NULL;
   EmpathyTLSCertificate *certificate = NULL;
@@ -170,7 +169,7 @@ verifier_verify_cb (GObject *source,
       "certificate", &certificate,
       NULL);
 
-  res = empathy_tls_verifier_verify_finish (EMPATHY_TLS_VERIFIER (source),
+  empathy_tls_verifier_verify_finish (EMPATHY_TLS_VERIFIER (source),
       result, &reason, &details, &error);
 
   if (error != NULL)
index 6c92c25cb4df8ab4b8b6e0d6dad17fa31828b758..a90c2d08cf5a221a4c629e6cdc27103b3262d70d 100644 (file)
@@ -32,7 +32,7 @@
 
 enum {
   CLOSED_CHATS_CHANGED,
-  HANDLED_CHATS_CHANGED,
+  DISPLAYED_CHATS_CHANGED,
   LAST_SIGNAL
 };
 
@@ -49,7 +49,7 @@ struct _EmpathyChatManagerPriv
   /* Queue of (ChatData *) representing the closed chats */
   GQueue *closed_queue;
 
-  guint num_handled_channels;
+  guint num_displayed_chat;
 
   TpBaseClient *handler;
 };
@@ -99,19 +99,37 @@ chat_data_free (ChatData *data)
   g_slice_free (ChatData, data);
 }
 
+static void
+chat_destroyed_cb (gpointer data,
+    GObject *object)
+{
+  EmpathyChatManager *self = data;
+  EmpathyChatManagerPriv *priv = GET_PRIV (self);
+
+  priv->num_displayed_chat--;
+
+  DEBUG ("Chat destroyed; we are now displaying %u chats",
+      priv->num_displayed_chat);
+
+  g_signal_emit (self, signals[DISPLAYED_CHATS_CHANGED], 0,
+      priv->num_displayed_chat);
+}
+
 static void
 process_tp_chat (EmpathyChatManager *self,
     EmpathyTpChat *tp_chat,
     TpAccount *account,
     gint64 user_action_time)
 {
+  EmpathyChatManagerPriv *priv = GET_PRIV (self);
   EmpathyChat *chat = NULL;
   const gchar *id;
 
   id = empathy_tp_chat_get_id (tp_chat);
   if (!tp_str_empty (id))
     {
-      chat = empathy_chat_window_find_chat (account, id);
+      chat = empathy_chat_window_find_chat (account, id,
+          empathy_tp_chat_is_sms_channel (tp_chat));
     }
 
   if (chat != NULL)
@@ -124,6 +142,16 @@ process_tp_chat (EmpathyChatManager *self,
       /* empathy_chat_new returns a floating reference as EmpathyChat is
        * a GtkWidget. This reference will be taken by a container
        * (a GtkNotebook) when we'll call empathy_chat_window_present_chat */
+
+      priv->num_displayed_chat++;
+
+      DEBUG ("Chat displayed; we are now displaying %u chat",
+          priv->num_displayed_chat);
+
+      g_signal_emit (self, signals[DISPLAYED_CHATS_CHANGED], 0,
+          priv->num_displayed_chat);
+
+      g_object_weak_ref ((GObject *) chat, chat_destroyed_cb, self);
     }
   empathy_chat_window_present_chat (chat, user_action_time);
 
@@ -190,24 +218,6 @@ tp_chat_ready_cb (GObject *object,
   chat_ready_ctx_free (ctx);
 }
 
-static void
-channel_invalidated (TpChannel *channel,
-    guint domain,
-    gint code,
-    gchar *message,
-    EmpathyChatManager *self)
-{
-  EmpathyChatManagerPriv *priv = GET_PRIV (self);
-
-  priv->num_handled_channels--;
-
-  DEBUG ("Channel closed; we are now handling %u text channels",
-      priv->num_handled_channels);
-
-  g_signal_emit (self, signals[HANDLED_CHATS_CHANGED], 0,
-      priv->num_handled_channels);
-}
-
 static void
 handle_channels (TpSimpleHandler *handler,
     TpAccount *account,
@@ -219,9 +229,7 @@ handle_channels (TpSimpleHandler *handler,
     gpointer user_data)
 {
   EmpathyChatManager *self = (EmpathyChatManager *) user_data;
-  EmpathyChatManagerPriv *priv = GET_PRIV (self);
   GList *l;
-  gboolean handling = FALSE;
 
   for (l = channels; l != NULL; l = g_list_next (l))
     {
@@ -238,7 +246,7 @@ handle_channels (TpSimpleHandler *handler,
           continue;
         }
 
-      handling = TRUE;
+      DEBUG ("Now handling channel %s", tp_proxy_get_object_path (channel));
 
       tp_chat = empathy_tp_chat_new (account, channel);
 
@@ -254,23 +262,9 @@ handle_channels (TpSimpleHandler *handler,
           ctx->sig_id = g_signal_connect (tp_chat, "notify::ready",
               G_CALLBACK (tp_chat_ready_cb), ctx);
         }
-
-      priv->num_handled_channels++;
-
-      g_signal_connect (channel, "invalidated",
-          G_CALLBACK (channel_invalidated), self);
     }
 
   tp_handle_channels_context_accept (context);
-
-  if (handling)
-    {
-      DEBUG ("Channels handled; we are now handling %u text channels",
-          priv->num_handled_channels);
-
-      g_signal_emit (self, signals[HANDLED_CHATS_CHANGED], 0,
-          priv->num_handled_channels);
-    }
 }
 
 static void
@@ -387,8 +381,8 @@ empathy_chat_manager_class_init (
         G_TYPE_NONE,
         1, G_TYPE_UINT, NULL);
 
-  signals[HANDLED_CHATS_CHANGED] =
-    g_signal_new ("handled-chats-changed",
+  signals[DISPLAYED_CHATS_CHANGED] =
+    g_signal_new ("displayed-chats-changed",
         G_TYPE_FROM_CLASS (object_class),
         G_SIGNAL_RUN_LAST,
         0,
@@ -459,11 +453,3 @@ empathy_chat_manager_get_num_closed_chats (EmpathyChatManager *self)
 
   return g_queue_get_length (priv->closed_queue);
 }
-
-guint
-empathy_chat_manager_get_num_handled_chats (EmpathyChatManager *self)
-{
-  EmpathyChatManagerPriv *priv = GET_PRIV (self);
-
-  return priv->num_handled_channels;
-}
index ee43857f4bda03008e6f80b950cd88ece63d445d..6d249b3e4ded6642f345429819a79a75224ee558 100644 (file)
@@ -65,8 +65,6 @@ void empathy_chat_manager_closed_chat (EmpathyChatManager *self,
 void empathy_chat_manager_undo_closed_chat (EmpathyChatManager *self);
 guint empathy_chat_manager_get_num_closed_chats (EmpathyChatManager *self);
 
-guint empathy_chat_manager_get_num_handled_chats (EmpathyChatManager *self);
-
 G_END_DECLS
 
 #endif /* #ifndef __EMPATHY_CHAT_MANAGER_H__*/
index 94f93e2bf25f7f24fa592c8803daa96f18756d8b..be83f4a299e26289944409d4b9268a2a07c3117d 100644 (file)
@@ -259,7 +259,6 @@ chat_window_create_label (EmpathyChatWindow *window,
                          EmpathyChat       *chat,
                          gboolean           is_tab_label)
 {
-       EmpathyChatWindowPriv *priv;
        GtkWidget            *hbox;
        GtkWidget            *name_label;
        GtkWidget            *status_image;
@@ -268,8 +267,6 @@ chat_window_create_label (EmpathyChatWindow *window,
        PangoAttrList        *attr_list;
        PangoAttribute       *attr;
 
-       priv = GET_PRIV (window);
-
        /* The spacing between the button and the label. */
        hbox = gtk_hbox_new (FALSE, 0);
 
@@ -314,6 +311,15 @@ chat_window_create_label (EmpathyChatWindow *window,
 
        if (is_tab_label) {
                GtkWidget            *close_button;
+               GtkWidget *sending_spinner;
+
+               sending_spinner = gtk_spinner_new ();
+
+               gtk_box_pack_start (GTK_BOX (hbox), sending_spinner,
+                       FALSE, FALSE, 0);
+               g_object_set_data (G_OBJECT (chat),
+                       "chat-window-tab-sending-spinner",
+                       sending_spinner);
 
                close_button = gedit_close_button_new ();
                g_object_set_data (G_OBJECT (chat), "chat-window-tab-close-button", close_button);
@@ -453,14 +459,14 @@ get_all_unread_messages (EmpathyChatWindowPriv *priv)
 static gchar *
 get_window_title_name (EmpathyChatWindowPriv *priv)
 {
-       const gchar *active_name;
+       gchar *active_name, *ret;
        guint nb_chats;
        guint current_unread_msgs;
 
        nb_chats = g_list_length (priv->chats);
        g_assert (nb_chats > 0);
 
-       active_name = empathy_chat_get_name (priv->current_chat);
+       active_name = empathy_chat_dup_name (priv->current_chat);
 
        current_unread_msgs = empathy_chat_get_nb_unread_messages (
                        priv->current_chat);
@@ -468,9 +474,9 @@ get_window_title_name (EmpathyChatWindowPriv *priv)
        if (nb_chats == 1) {
                /* only one tab */
                if (current_unread_msgs == 0)
-                       return g_strdup (active_name);
+                       ret = g_strdup (active_name);
                else
-                       return g_strdup_printf (ngettext (
+                       ret = g_strdup_printf (ngettext (
                                "%s (%d unread)",
                                "%s (%d unread)", current_unread_msgs),
                                active_name, current_unread_msgs);
@@ -482,7 +488,7 @@ get_window_title_name (EmpathyChatWindowPriv *priv)
 
                if (all_unread_msgs == 0) {
                        /* no unread message */
-                       return g_strdup_printf (ngettext (
+                       ret = g_strdup_printf (ngettext (
                                "%s (and %u other)",
                                "%s (and %u others)", nb_others),
                                active_name, nb_others);
@@ -490,7 +496,7 @@ get_window_title_name (EmpathyChatWindowPriv *priv)
 
                else if (all_unread_msgs == current_unread_msgs) {
                        /* unread messages are in the current tab */
-                       return g_strdup_printf (ngettext (
+                       ret = g_strdup_printf (ngettext (
                                "%s (%d unread)",
                                "%s (%d unread)", current_unread_msgs),
                                active_name, current_unread_msgs);
@@ -498,7 +504,7 @@ get_window_title_name (EmpathyChatWindowPriv *priv)
 
                else if (current_unread_msgs == 0) {
                        /* unread messages are in other tabs */
-                       return g_strdup_printf (ngettext (
+                       ret = g_strdup_printf (ngettext (
                                "%s (%d unread from others)",
                                "%s (%d unread from others)",
                                all_unread_msgs),
@@ -507,13 +513,17 @@ get_window_title_name (EmpathyChatWindowPriv *priv)
 
                else {
                        /* unread messages are in all the tabs */
-                       return g_strdup_printf (ngettext (
+                       ret = g_strdup_printf (ngettext (
                                "%s (%d unread from all)",
                                "%s (%d unread from all)",
                                all_unread_msgs),
                                active_name, all_unread_msgs);
                }
        }
+
+       g_free (active_name);
+
+       return ret;
 }
 
 static void
@@ -637,7 +647,7 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
        EmpathyChatWindow     *window;
        EmpathyChatWindowPriv *priv;
        EmpathyContact        *remote_contact;
-       const gchar           *name;
+       gchar                 *name;
        const gchar           *id;
        TpAccount             *account;
        const gchar           *subject;
@@ -648,6 +658,8 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
        const gchar           *icon_name;
        GtkWidget             *tab_image;
        GtkWidget             *menu_image;
+       GtkWidget             *sending_spinner;
+       guint                  nb_sending;
 
        window = chat_window_find_chat (chat);
        if (!window) {
@@ -656,7 +668,7 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
        priv = GET_PRIV (window);
 
        /* Get information */
-       name = empathy_chat_get_name (chat);
+       name = empathy_chat_dup_name (chat);
        account = empathy_chat_get_account (chat);
        subject = empathy_chat_get_subject (chat);
        remote_contact = empathy_chat_get_remote_contact (chat);
@@ -675,6 +687,9 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
        else if (remote_contact && empathy_chat_is_composing (chat)) {
                icon_name = EMPATHY_IMAGE_TYPING;
        }
+       else if (empathy_chat_is_sms_channel (chat)) {
+               icon_name = EMPATHY_IMAGE_SMS;
+       }
        else if (remote_contact) {
                icon_name = empathy_icon_name_for_contact (remote_contact);
        } else {
@@ -693,6 +708,16 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
                gtk_widget_hide (menu_image);
        }
 
+       /* Update the sending spinner */
+       nb_sending = empathy_chat_get_n_messages_sending (chat);
+       sending_spinner = g_object_get_data (G_OBJECT (chat),
+               "chat-window-tab-sending-spinner");
+
+       g_object_set (sending_spinner,
+               "active", nb_sending > 0,
+               "visible", nb_sending > 0,
+               NULL);
+
        /* Update tab tooltip */
        tooltip = g_string_new (NULL);
 
@@ -703,11 +728,29 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
                id = name;
        }
 
+       if (empathy_chat_is_sms_channel (chat)) {
+               append_markup_printf (tooltip, "%s ", _("SMS:"));
+       }
+
        append_markup_printf (tooltip,
                              "<b>%s</b><small> (%s)</small>",
                              id,
                              tp_account_get_display_name (account));
 
+       if (nb_sending > 0) {
+               char *tmp = g_strdup_printf (
+                       ngettext ("Sending %d message",
+                                 "Sending %d messages",
+                                 nb_sending),
+                       nb_sending);
+
+               g_string_append (tooltip, "\n");
+               g_string_append (tooltip, tmp);
+
+               gtk_widget_set_tooltip_text (sending_spinner, tmp);
+               g_free (tmp);
+       }
+
        if (!EMP_STR_EMPTY (status)) {
                append_markup_printf (tooltip, "\n<i>%s</i>", status);
        }
@@ -738,6 +781,8 @@ chat_window_update_chat_tab_full (EmpathyChat *chat,
        if (priv->current_chat == chat) {
                chat_window_update (window, update_contact_menu);
        }
+
+       g_free (name);
 }
 
 static void
@@ -865,21 +910,24 @@ chat_window_favorite_toggled_cb (GtkToggleAction   *toggle_action,
        EmpathyChatWindowPriv *priv = GET_PRIV (window);
        gboolean               active;
        TpAccount             *account;
+       gchar                 *name;
        const gchar           *room;
        EmpathyChatroom       *chatroom;
 
        active = gtk_toggle_action_get_active (toggle_action);
        account = empathy_chat_get_account (priv->current_chat);
        room = empathy_chat_get_id (priv->current_chat);
+       name = empathy_chat_dup_name (priv->current_chat);
 
        chatroom = empathy_chatroom_manager_ensure_chatroom (
                     priv->chatroom_manager,
                     account,
                     room,
-                    empathy_chat_get_name (priv->current_chat));
+                    name);
 
        empathy_chatroom_set_favorite (chatroom, active);
        g_object_unref (chatroom);
+       g_free (name);
 }
 
 static void
@@ -889,21 +937,24 @@ chat_window_always_urgent_toggled_cb (GtkToggleAction   *toggle_action,
        EmpathyChatWindowPriv *priv = GET_PRIV (window);
        gboolean               active;
        TpAccount             *account;
+       gchar                 *name;
        const gchar           *room;
        EmpathyChatroom       *chatroom;
 
        active = gtk_toggle_action_get_active (toggle_action);
        account = empathy_chat_get_account (priv->current_chat);
        room = empathy_chat_get_id (priv->current_chat);
+       name = empathy_chat_dup_name (priv->current_chat);
 
        chatroom = empathy_chatroom_manager_ensure_chatroom (
                     priv->chatroom_manager,
                     account,
                     room,
-                    empathy_chat_get_name (priv->current_chat));
+                    name);
 
        empathy_chatroom_set_always_urgent (chatroom, active);
        g_object_unref (chatroom);
+       g_free (name);
 }
 
 static void
@@ -1086,7 +1137,6 @@ chat_window_tabs_next_activate_cb (GtkAction         *action,
                                   EmpathyChatWindow *window)
 {
        EmpathyChatWindowPriv *priv;
-       EmpathyChat           *chat;
        gint                  index_, numPages;
        gboolean              wrap_around;
 
@@ -1095,7 +1145,6 @@ chat_window_tabs_next_activate_cb (GtkAction         *action,
        g_object_get (gtk_settings_get_default (), "gtk-keynav-wrap-around",
                       &wrap_around, NULL);
 
-       chat = priv->current_chat;
        index_ = gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook));
        numPages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (priv->notebook));
 
@@ -1112,7 +1161,6 @@ chat_window_tabs_previous_activate_cb (GtkAction         *action,
                                   EmpathyChatWindow *window)
 {
        EmpathyChatWindowPriv *priv;
-       EmpathyChat           *chat;
        gint                  index_, numPages;
        gboolean              wrap_around;
 
@@ -1121,7 +1169,6 @@ chat_window_tabs_previous_activate_cb (GtkAction         *action,
        g_object_get (gtk_settings_get_default (), "gtk-keynav-wrap-around",
                       &wrap_around, NULL);
 
-       chat = priv->current_chat;
        index_ = gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook));
        numPages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (priv->notebook));
 
@@ -1335,8 +1382,9 @@ chat_window_show_or_update_notification (EmpathyChatWindow *window,
                                  G_CALLBACK (chat_window_notification_closed_cb), window, 0);
 
                if (has_x_canonical_append) {
+                       /* We have to set a not empty string to keep libnotify happy */
                        notify_notification_set_hint_string (notification,
-                               EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND, "");
+                               EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND, "1");
                }
        }
 
@@ -1356,15 +1404,16 @@ chat_window_show_or_update_notification (EmpathyChatWindow *window,
 static void
 chat_window_set_highlight_room_labels (EmpathyChat *chat)
 {
-       gchar *markup;
+       gchar *markup, *name;
        GtkWidget *widget;
 
        if (!empathy_chat_is_room (chat))
                return;
 
+       name = empathy_chat_dup_name (chat);
        markup = g_markup_printf_escaped (
                "<span color=\"red\" weight=\"bold\">%s</span>",
-               empathy_chat_get_name (chat));
+               name);
 
        widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-label");
        gtk_label_set_markup (GTK_LABEL (widget), markup);
@@ -1372,6 +1421,7 @@ chat_window_set_highlight_room_labels (EmpathyChat *chat)
        widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-label");
        gtk_label_set_markup (GTK_LABEL (widget), markup);
 
+       g_free (name);
        g_free (markup);
 }
 
@@ -1765,7 +1815,7 @@ chat_window_drag_data_received (GtkWidget        *widget,
                        account =
                                tp_account_manager_ensure_account (account_manager, account_id);
                        if (account != NULL)
-                               chat = empathy_chat_window_find_chat (account, contact_id);
+                               chat = empathy_chat_window_find_chat (account, contact_id, FALSE);
                }
 
                if (account == NULL) {
@@ -2131,13 +2181,11 @@ empathy_chat_window_get_default (gboolean room)
        }
 
        for (l = chat_windows; l; l = l->next) {
-               EmpathyChatWindowPriv *priv;
                EmpathyChatWindow *chat_window;
                GtkWidget         *dialog;
                guint nb_rooms, nb_private;
 
                chat_window = l->data;
-               priv = GET_PRIV (chat_window);
 
                dialog = empathy_chat_window_get_dialog (chat_window);
 
@@ -2227,6 +2275,12 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window,
        g_signal_connect (chat, "notify::remote-contact",
                          G_CALLBACK (chat_window_chat_notify_cb),
                          NULL);
+       g_signal_connect (chat, "notify::sms-channel",
+                         G_CALLBACK (chat_window_chat_notify_cb),
+                         NULL);
+       g_signal_connect (chat, "notify::n-messages-sending",
+                         G_CALLBACK (chat_window_chat_notify_cb),
+                         NULL);
        chat_window_chat_notify_cb (chat);
 
        gtk_notebook_append_page_menu (GTK_NOTEBOOK (priv->notebook), child, label, popup_label);
@@ -2330,7 +2384,8 @@ empathy_chat_window_switch_to_chat (EmpathyChatWindow *window,
 
 EmpathyChat *
 empathy_chat_window_find_chat (TpAccount   *account,
-                              const gchar *id)
+                              const gchar *id,
+                              gboolean     sms_channel)
 {
        GList *l;
 
@@ -2350,7 +2405,8 @@ empathy_chat_window_find_chat (TpAccount   *account,
                        chat = ll->data;
 
                        if (account == empathy_chat_get_account (chat) &&
-                           !tp_strdiff (id, empathy_chat_get_id (chat))) {
+                           !tp_strdiff (id, empathy_chat_get_id (chat)) &&
+                           sms_channel == empathy_chat_is_sms_channel (chat)) {
                                return chat;
                        }
                }
index 5477479ac8c7344d41aa2b8e75b8131afd4a9854..2112b6647d9bc3b02f0eab1ddb4b127d762911d5 100644 (file)
@@ -59,7 +59,8 @@ struct _EmpathyChatWindowClass {
 GType              empathy_chat_window_get_type       (void);
 
 EmpathyChat *      empathy_chat_window_find_chat      (TpAccount        *account,
-                                                      const gchar      *id);
+                                                      const gchar      *id,
+                                                      gboolean          sms_channel);
 void               empathy_chat_window_present_chat   (EmpathyChat      *chat,
                                                       gint64 timestamp);
 
index 73d8ce87c58c9ea2283097d04ba4c86d5faed750..43ab00270de142bf8cd02c34dc83353380c38bad 100644 (file)
@@ -52,7 +52,7 @@ static gboolean use_timer = TRUE;
 static EmpathyChatManager *chat_mgr = NULL;
 
 static void
-handled_chats_changed_cb (EmpathyChatManager *mgr,
+displayed_chats_changed_cb (EmpathyChatManager *mgr,
     guint nb_chats,
     gpointer user_data)
 {
@@ -81,8 +81,8 @@ activate_cb (GApplication *application)
   g_assert (chat_mgr == NULL);
   chat_mgr = empathy_chat_manager_dup_singleton ();
 
-  g_signal_connect (chat_mgr, "handled-chats-changed",
-      G_CALLBACK (handled_chats_changed_cb), GUINT_TO_POINTER (1));
+  g_signal_connect (chat_mgr, "displayed-chats-changed",
+      G_CALLBACK (displayed_chats_changed_cb), GUINT_TO_POINTER (1));
 }
 
 int
index 6125ec89597e57d9befb89e350566b9f1683e10e..2786e073861afea53f9b39da2054d0e522040a99 100644 (file)
@@ -335,9 +335,6 @@ static void
 event_text_channel_process_func (EventPriv *event)
 {
   EmpathyTpChat *tp_chat;
-  gint64 timestamp;
-
-  timestamp = tp_user_action_time_from_x11 (gtk_get_current_event_time ());
 
   if (event->approval->handler != 0)
     {
@@ -566,7 +563,6 @@ event_manager_chat_message_received_cb (EmpathyTpChat *tp_chat,
   EmpathyContact  *sender;
   const gchar     *header;
   const gchar     *msg;
-  TpChannel       *channel;
   EventPriv       *event;
   EmpathyEventManagerPriv *priv = GET_PRIV (approval->manager);
 
@@ -583,8 +579,6 @@ event_manager_chat_message_received_cb (EmpathyTpChat *tp_chat,
   header = empathy_contact_get_alias (sender);
   msg = empathy_message_get_body (message);
 
-  channel = empathy_tp_chat_get_channel (tp_chat);
-
   if (event != NULL)
     event_update (approval->manager, event, EMPATHY_IMAGE_NEW_MESSAGE, header,
         msg);
@@ -703,13 +697,9 @@ invite_dialog_response_cb (GtkDialog *dialog,
                            gint response,
                            EventManagerApproval *approval)
 {
-  EmpathyTpChat *tp_chat;
-
   gtk_widget_destroy (GTK_WIDGET (approval->dialog));
   approval->dialog = NULL;
 
-  tp_chat = EMPATHY_TP_CHAT (approval->handler_instance);
-
   if (response != GTK_RESPONSE_OK)
     {
       /* close channel */
index edb470cbbbec3c3e0494675aed453a5291133f7d..e23b0b45a31c69840b69faffde2a84d5cec57e80 100644 (file)
@@ -696,11 +696,8 @@ static void
 ft_manager_start_transfer (EmpathyFTManager *manager,
                            EmpathyFTHandler *handler)
 {
-  EmpathyFTManagerPriv *priv;
   gboolean is_outgoing;
 
-  priv = GET_PRIV (manager);
-
   is_outgoing = !empathy_ft_handler_is_incoming (handler);
 
   DEBUG ("Start transfer, is outgoing %s",
index b4c1254dfdbd0365b6e6e88bbc7439b1953b3482..0cef0e10f47b06842b26f9666e47a7e7f3b3af48 100644 (file)
@@ -145,6 +145,10 @@ struct _EmpathyMainWindowPriv {
        GtkWidget              *edit_context;
        GtkWidget              *edit_context_separator;
 
+       GtkActionGroup         *balance_action_group;
+       GtkAction              *view_balance_show_in_roster;
+       GtkWidget              *balance_vbox;
+
        guint                   size_timeout_id;
 
        /* reffed TpAccount* => visible GtkInfoBar* */
@@ -220,6 +224,8 @@ main_window_flash_foreach (GtkTreeModel *model,
                pixbuf = empathy_individual_store_get_individual_status_icon (
                                                GET_PRIV (data->window)->individual_store,
                                                individual);
+               if (pixbuf != NULL)
+                       g_object_ref (pixbuf);
        }
 
        gtk_tree_store_set (GTK_TREE_STORE (model), iter,
@@ -240,6 +246,7 @@ main_window_flash_foreach (GtkTreeModel *model,
 
        g_object_unref (individual);
        tp_clear_object (&contact);
+       tp_clear_object (&pixbuf);
 
        return FALSE;
 }
@@ -780,6 +787,294 @@ main_window_update_status (EmpathyMainWindow *window)
        g_list_free (children);
 }
 
+static char *
+main_window_account_to_action_name (TpAccount *account)
+{
+       char *r;
+
+       /* action names can't have '/' in them, replace it with '.' */
+       r = g_strdup (tp_account_get_path_suffix (account));
+       r = g_strdelimit (r, "/", '.');
+
+       return r;
+}
+
+static void
+main_window_balance_activate_cb (GtkAction         *action,
+                                EmpathyMainWindow *window)
+{
+       const char *uri;
+
+       uri = g_object_get_data (G_OBJECT (action), "manage-credit-uri");
+
+       if (!tp_str_empty (uri)) {
+               DEBUG ("Top-up credit URI: %s", uri);
+               empathy_url_show (GTK_WIDGET (window), uri);
+       } else {
+               DEBUG ("unknown protocol for top-up");
+       }
+}
+
+static void
+main_window_balance_update_balance (GtkAction   *action,
+                                   GValueArray *balance)
+{
+       TpAccount *account = g_object_get_data (G_OBJECT (action), "account");
+       GtkWidget *label;
+       int amount = 0;
+       guint scale = G_MAXINT32;
+       const char *currency = "";
+       char *money, *str;
+
+       if (balance != NULL)
+               tp_value_array_unpack (balance, 3,
+                       &amount,
+                       &scale,
+                       &currency);
+
+       if (amount == 0 &&
+           scale == G_MAXINT32 &&
+           tp_str_empty (currency)) {
+               /* unknown balance */
+               money = g_strdup ("--");
+       } else {
+               char *tmp = empathy_format_currency (amount, scale, currency);
+
+               money = g_strdup_printf ("%s %s", currency, tmp);
+               g_free (tmp);
+       }
+
+       /* Translators: this string will be something like:
+        *   Top up My Account ($1.23)..." */
+       str = g_strdup_printf (_("Top up %s (%s)..."),
+               tp_account_get_display_name (account),
+               money);
+
+       gtk_action_set_label (action, str);
+       g_free (str);
+
+       /* update the money label in the roster */
+       label = g_object_get_data (G_OBJECT (action), "money-label");
+
+       gtk_label_set_text (GTK_LABEL (label), money);
+       g_free (money);
+}
+
+static void
+main_window_setup_balance_got_balance_props (TpProxy      *conn,
+                                            GHashTable   *props,
+                                            const GError *in_error,
+                                            gpointer      user_data,
+                                            GObject      *action)
+{
+       GValueArray *balance = NULL;
+       const char *uri;
+
+       if (in_error != NULL) {
+               DEBUG ("Failed to get account balance properties: %s",
+                       in_error->message);
+               goto finally;
+       }
+
+       balance = tp_asv_get_boxed (props, "AccountBalance",
+               TP_STRUCT_TYPE_CURRENCY_AMOUNT);
+       uri = tp_asv_get_string (props, "ManageCreditURI");
+
+       g_object_set_data_full (action, "manage-credit-uri",
+               g_strdup (uri), g_free);
+       gtk_action_set_sensitive (GTK_ACTION (action), !tp_str_empty (uri));
+
+finally:
+       main_window_balance_update_balance (GTK_ACTION (action), balance);
+}
+
+static void
+main_window_balance_changed_cb (TpConnection      *conn,
+                               const GValueArray *balance,
+                               gpointer           user_data,
+                               GObject           *action)
+{
+       main_window_balance_update_balance (GTK_ACTION (action),
+               (GValueArray *) balance);
+}
+
+static GtkAction *
+main_window_setup_balance_create_action (EmpathyMainWindow *window,
+                                        TpAccount *account)
+{
+       EmpathyMainWindowPriv *priv = GET_PRIV (window);
+       GtkAction *action;
+       char *name, *ui;
+       guint merge_id;
+       GError *error = NULL;
+
+       /* create the action group if required */
+       if (priv->balance_action_group == NULL) {
+               priv->balance_action_group =
+                       gtk_action_group_new ("balance-action-group");
+
+               gtk_ui_manager_insert_action_group (priv->ui_manager,
+                       priv->balance_action_group, -1);
+       }
+
+       /* create the action */
+       name = main_window_account_to_action_name (account);
+       action = gtk_action_new (name,
+               tp_account_get_display_name (account),
+               _("Top up account credit"),
+               NULL);
+       g_object_bind_property (account, "icon-name", action, "icon-name",
+               G_BINDING_SYNC_CREATE);
+
+       g_object_set_data (G_OBJECT (action), "account", account);
+       g_signal_connect (action, "activate",
+               G_CALLBACK (main_window_balance_activate_cb), window);
+
+       gtk_action_group_add_action (priv->balance_action_group, action);
+       g_object_unref (action);
+
+       ui = g_strdup_printf (
+               "<ui>"
+               " <menubar name='menubar'>"
+               "  <menu action='view'>"
+               "   <placeholder name='view_balance_placeholder'>"
+               "    <menuitem action='%s'/>"
+               "   </placeholder>"
+               "  </menu>"
+               " </menubar>"
+               "</ui>",
+               name);
+
+       merge_id = gtk_ui_manager_add_ui_from_string (priv->ui_manager,
+               ui, -1, &error);
+       if (error != NULL) {
+               DEBUG ("Failed to add balance UI for %s: %s",
+                       tp_account_get_display_name (account),
+                       error->message);
+               g_error_free (error);
+       }
+
+       g_object_set_data (G_OBJECT (action),
+               "merge-id", GUINT_TO_POINTER (merge_id));
+
+       g_free (name);
+       g_free (ui);
+
+       return action;
+}
+
+static GtkWidget *
+main_window_setup_balance_create_widget (EmpathyMainWindow *window,
+                                        GtkAction         *action)
+{
+       EmpathyMainWindowPriv *priv = GET_PRIV (window);
+       TpAccount *account;
+       GtkWidget *hbox, *image, *label, *button;
+
+       account = g_object_get_data (G_OBJECT (action), "account");
+       g_return_val_if_fail (TP_IS_ACCOUNT (account), NULL);
+
+       hbox = gtk_hbox_new (FALSE, 6);
+
+       /* protocol icon */
+       image = gtk_image_new ();
+       gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, TRUE, 0);
+       g_object_bind_property (action, "icon-name", image, "icon-name",
+               G_BINDING_SYNC_CREATE);
+
+       /* account name label */
+       label = gtk_label_new ("");
+       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+       gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
+       g_object_bind_property (account, "display-name", label, "label",
+               G_BINDING_SYNC_CREATE);
+
+       /* balance label */
+       label = gtk_label_new ("");
+       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+       g_object_set_data (G_OBJECT (action), "money-label", label);
+
+       /* top up button */
+       button = gtk_button_new_with_label (_("Top Up..."));
+       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+       g_signal_connect_swapped (button, "clicked",
+               G_CALLBACK (gtk_action_activate), action);
+
+       gtk_box_pack_start (GTK_BOX (priv->balance_vbox), hbox, FALSE, TRUE, 0);
+       gtk_widget_show_all (hbox);
+
+       /* tie the lifetime of the widget to the lifetime of the action */
+       g_object_weak_ref (G_OBJECT (action),
+               (GWeakNotify) gtk_widget_destroy, hbox);
+
+       return hbox;
+}
+
+static void
+main_window_setup_balance_conn_ready (GObject      *conn,
+                                     GAsyncResult *result,
+                                     gpointer      user_data)
+{
+       EmpathyMainWindow *window = user_data;
+       EmpathyMainWindowPriv *priv = GET_PRIV (window);
+       TpAccount *account = g_object_get_data (conn, "account");
+       GtkAction *action;
+       GError *error = NULL;
+
+       if (!tp_proxy_prepare_finish (conn, result, &error)) {
+               DEBUG ("Failed to prepare connection: %s", error->message);
+
+               g_error_free (error);
+               return;
+       }
+
+       if (!tp_proxy_has_interface_by_id (conn,
+                       TP_IFACE_QUARK_CONNECTION_INTERFACE_BALANCE)) {
+               return;
+       }
+
+       DEBUG ("Setting up balance for acct: %s",
+               tp_account_get_display_name (account));
+
+       /* create the action */
+       action = main_window_setup_balance_create_action (window, account);
+
+       if (action == NULL)
+               return;
+
+       gtk_action_set_visible (priv->view_balance_show_in_roster, TRUE);
+
+       /* create the display widget */
+       main_window_setup_balance_create_widget (window, action);
+
+       /* request the current balance and monitor for any changes */
+       tp_cli_dbus_properties_call_get_all (conn, -1,
+               TP_IFACE_CONNECTION_INTERFACE_BALANCE,
+               main_window_setup_balance_got_balance_props,
+               window, NULL, G_OBJECT (action));
+
+       tp_cli_connection_interface_balance_connect_to_balance_changed (
+               TP_CONNECTION (conn), main_window_balance_changed_cb,
+               window, NULL, G_OBJECT (action), NULL);
+}
+
+static void
+main_window_setup_balance (EmpathyMainWindow *window,
+                          TpAccount         *account)
+{
+       TpConnection *conn = tp_account_get_connection (account);
+
+       if (conn == NULL)
+               return;
+
+       /* need to prepare the connection:
+        * store the account on the connection */
+       g_object_set_data (G_OBJECT (conn), "account", account);
+       tp_proxy_prepare_async (conn, NULL,
+               main_window_setup_balance_conn_ready, window);
+}
+
 static void
 main_window_connection_changed_cb (TpAccount  *account,
                                   guint       old_status,
@@ -801,6 +1096,44 @@ main_window_connection_changed_cb (TpAccount  *account,
        if (current == TP_CONNECTION_STATUS_DISCONNECTED) {
                empathy_sound_manager_play (priv->sound_mgr, GTK_WIDGET (window),
                                    EMPATHY_SOUND_ACCOUNT_DISCONNECTED);
+
+               /* remove balance action if required */
+               if (priv->balance_action_group != NULL) {
+                       GtkAction *action;
+                       char *name;
+                       GList *a;
+
+                       name = main_window_account_to_action_name (account);
+
+                       action = gtk_action_group_get_action (
+                               priv->balance_action_group, name);
+
+                       if (action != NULL) {
+                               guint merge_id;
+
+                               DEBUG ("Removing action");
+
+                               merge_id = GPOINTER_TO_UINT (g_object_get_data (
+                                       G_OBJECT (action),
+                                       "merge-id"));
+
+                               gtk_ui_manager_remove_ui (priv->ui_manager,
+                                       merge_id);
+                               gtk_action_group_remove_action (
+                                       priv->balance_action_group, action);
+                       }
+
+                       g_free (name);
+
+                       a = gtk_action_group_list_actions (
+                               priv->balance_action_group);
+
+                       gtk_action_set_visible (
+                               priv->view_balance_show_in_roster,
+                               g_list_length (a) > 0);
+
+                       g_list_free (a);
+               }
        }
 
        if (current == TP_CONNECTION_STATUS_CONNECTED) {
@@ -809,6 +1142,7 @@ main_window_connection_changed_cb (TpAccount  *account,
 
                /* Account connected without error, remove error message if any */
                main_window_remove_error (window, account);
+               main_window_setup_balance (window, account);
        }
 }
 
@@ -1674,6 +2008,8 @@ account_manager_prepared_cb (GObject      *source_object,
                                  window);
                g_hash_table_insert (priv->status_changed_handlers,
                                     account, GUINT_TO_POINTER (handler_id));
+
+               main_window_setup_balance (window, account);
        }
 
        g_signal_connect (manager, "account-validity-changed",
@@ -1770,6 +2106,7 @@ empathy_main_window_init (EmpathyMainWindow *window)
        filename = empathy_file_lookup ("empathy-main-window.ui", "src");
        gui = empathy_builder_get_file (filename,
                                       "main_vbox", &priv->main_vbox,
+                                      "balance_vbox", &priv->balance_vbox,
                                       "errors_vbox", &priv->errors_vbox,
                                       "auth_vbox", &priv->auth_vbox,
                                       "ui_manager", &priv->ui_manager,
@@ -1787,6 +2124,7 @@ empathy_main_window_init (EmpathyMainWindow *window)
                                       "notebook", &priv->notebook,
                                       "no_entry_label", &priv->no_entry_label,
                                       "roster_scrolledwindow", &sw,
+                                      "view_balance_show_in_roster", &priv->view_balance_show_in_roster,
                                       NULL);
        g_free (filename);
 
@@ -1947,6 +2285,14 @@ empathy_main_window_init (EmpathyMainWindow *window)
        /* Set window size. */
        empathy_geometry_bind (GTK_WINDOW (window), GEOMETRY_NAME);
 
+       /* bind view_balance_show_in_roster */
+       g_settings_bind (priv->gsettings_ui, "show-balance-in-roster",
+               priv->view_balance_show_in_roster, "active",
+               G_SETTINGS_BIND_DEFAULT);
+       g_object_bind_property (priv->view_balance_show_in_roster, "active",
+               priv->balance_vbox, "visible",
+               G_BINDING_SYNC_CREATE);
+
        /* Enable event handling */
        priv->call_observer = empathy_call_observer_dup_singleton ();
        priv->event_manager = empathy_event_manager_dup_singleton ();
index 864be1d287f3eed37647a48aa3d8d7b6a9de7980..b21a07bac5483846a710eb2d99553ffb06229d6a 100644 (file)
             <property name="label" translatable="yes">Show P_rotocols</property>
           </object>
         </child>
+        <child>
+          <object class="GtkToggleAction" id="view_balance_show_in_roster">
+            <property name="name">view_balance_show_in_roster</property>
+            <property name="label" translatable="yes">Credit Balance</property>
+            <property name="visible">False</property>
+          </object>
+        </child>
         <child>
           <object class="GtkAction" id="view_show_map">
             <property name="name">view_show_map</property>
           <menuitem action="view_show_offline"/>
           <menuitem action="view_show_protocols"/>
           <separator/>
+          <menuitem action="view_balance_show_in_roster"/>
+          <placeholder name="view_balance_placeholder"/>
+          <separator/>
           <menuitem action="view_sort_by_name"/>
           <menuitem action="view_sort_by_status"/>
           <separator/>
           </packing>
         </child>
         <child>
-          <object class="GtkVBox" id="errors_vbox">
+          <object class="GtkVBox" id="balance_vbox">
+            <property name="spacing">3</property>
             <child>
               <placeholder/>
             </child>
           </packing>
         </child>
         <child>
-          <object class="GtkVBox" id="auth_vbox">
+          <object class="GtkVBox" id="errors_vbox">
             <child>
               <placeholder/>
             </child>
             <property name="position">3</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkVBox" id="auth_vbox">
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkNotebook" id="notebook">
             <property name="visible">True</property>
             </child>
           </object>
           <packing>
-            <property name="position">4</property>
+            <property name="position">5</property>
           </packing>
         </child>
       </object>
index f27e8de030562e2b2b88d43dc76f9ca27a0223f1..388a1e506843cad564f51765535b487e75fb0d32 100644 (file)
@@ -386,11 +386,8 @@ out:
 static void
 new_chatroom_dialog_update_widgets (EmpathyNewChatroomDialog *dialog)
 {
-       EmpathyAccountChooser *account_chooser;
        const gchar           *protocol;
 
-       account_chooser = EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser);
-
        if (dialog->account == NULL)
                return;
 
@@ -535,8 +532,6 @@ new_chatroom_dialog_new_room_cb (EmpathyTpRoomlist        *room_list,
                                 EmpathyChatroom          *chatroom,
                                 EmpathyNewChatroomDialog *dialog)
 {
-       GtkTreeView      *view;
-       GtkTreeSelection *selection;
        GtkListStore     *store;
        GtkTreeIter       iter;
        gchar            *members;
@@ -550,8 +545,6 @@ new_chatroom_dialog_new_room_cb (EmpathyTpRoomlist        *room_list,
                empathy_chatroom_get_room (chatroom));
 
        /* Add to model */
-       view = GTK_TREE_VIEW (dialog->treeview);
-       selection = gtk_tree_view_get_selection (view);
        store = GTK_LIST_STORE (dialog->model);
        members = g_strdup_printf ("%d", empathy_chatroom_get_members_count (chatroom));
        tmp = g_strdup_printf ("<b>%s</b>", empathy_chatroom_get_name (chatroom));
index a87a6d30e74db43b02ba241f9224f07c3f8ad72a..af6c139d2ea3130958885805e063e1ee345b9071 100644 (file)
@@ -219,6 +219,9 @@ add_notification_actions (EmpathyNotificationsApprover *self,
       break;
 
     case EMPATHY_EVENT_TYPE_AUTH:
+      /* translators: the 'Provide' button is displayed in a notification
+       * bubble when Empathy is asking for an account password; clicking on it
+       * brings the password popup. */
       notify_notification_add_action (notification,
         "provide", _("Provide"), (NotifyActionCallback) notification_approve_cb,
           self, NULL);
@@ -335,8 +338,9 @@ update_notification (EmpathyNotificationsApprover *self)
           NOTIFY_EXPIRES_DEFAULT);
 
       if (has_x_canonical_append)
+        /* We have to set a not empty string to keep libnotify happy */
         notify_notification_set_hint_string (notification,
-            EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND, "");
+            EMPATHY_NOTIFY_MANAGER_CAP_X_CANONICAL_APPEND, "1");
 
       if (empathy_notify_manager_has_capability (self->priv->notify_mgr,
             EMPATHY_NOTIFY_MANAGER_CAP_ACTIONS))
index 813637dca9de3bd1b16eafbd2e9450a3732742f2..f90724c7ff44f1b309918b1febf626f35bd38ea4 100644 (file)
@@ -48,6 +48,9 @@
 
 #include "empathy-preferences.h"
 
+#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
+#include <libempathy/empathy-debug.h>
+
 G_DEFINE_TYPE (EmpathyPreferences, empathy_preferences, GTK_TYPE_DIALOG);
 
 #define GET_PRIV(self) ((EmpathyPreferencesPriv *)((EmpathyPreferences *) self)->priv)
@@ -57,7 +60,6 @@ struct _EmpathyPreferencesPriv {
 
        GtkWidget *checkbutton_show_smileys;
        GtkWidget *checkbutton_show_contacts_in_rooms;
-       GtkWidget *combobox_chat_theme;
        GtkWidget *checkbutton_separate_chat_windows;
        GtkWidget *checkbutton_events_notif_area;
        GtkWidget *checkbutton_autoconnect;
@@ -81,6 +83,12 @@ struct _EmpathyPreferencesPriv {
        GtkWidget *checkbutton_location_resource_cell;
        GtkWidget *checkbutton_location_resource_gps;
 
+       GtkWidget *vbox_chat_theme;
+       GtkWidget *combobox_chat_theme;
+       GtkWidget *sw_chat_theme_preview;
+       EmpathyChatView *chat_theme_preview;
+       EmpathyThemeManager *theme_manager;
+
        GSettings *gsettings;
        GSettings *gsettings_chat;
        GSettings *gsettings_loc;
@@ -115,11 +123,11 @@ enum {
 };
 
 enum {
-       COL_COMBO_IS_ADIUM,
-       COL_COMBO_VISIBLE_NAME,
-       COL_COMBO_NAME,
-       COL_COMBO_PATH,
-       COL_COMBO_COUNT
+       COL_THEME_VISIBLE_NAME,
+       COL_THEME_NAME,
+       COL_THEME_IS_ADIUM,
+       COL_THEME_ADIUM_PATH,
+       COL_THEME_COUNT
 };
 
 enum {
@@ -312,7 +320,7 @@ preferences_sound_cell_toggled_cb (GtkCellRendererToggle *toggle,
 {
        EmpathyPreferencesPriv *priv = GET_PRIV (preferences);
        GtkTreePath *path;
-       gboolean toggled, instore;
+       gboolean instore;
        GtkTreeIter iter;
        GtkTreeView *view;
        GtkTreeModel *model;
@@ -322,7 +330,6 @@ preferences_sound_cell_toggled_cb (GtkCellRendererToggle *toggle,
        model = gtk_tree_view_get_model (view);
 
        path = gtk_tree_path_new_from_string (path_string);
-       toggled = gtk_cell_renderer_toggle_get_active (toggle);
 
        gtk_tree_model_get_iter (model, &iter, path);
        gtk_tree_model_get (model, &iter, COL_SOUND_KEY, &key,
@@ -411,7 +418,6 @@ preferences_languages_setup (EmpathyPreferences *preferences)
        GtkTreeView       *view;
        GtkListStore      *store;
        GtkTreeSelection  *selection;
-       GtkTreeModel      *model;
        GtkTreeViewColumn *column;
        GtkCellRenderer   *renderer;
        guint              col_offset;
@@ -428,8 +434,6 @@ preferences_languages_setup (EmpathyPreferences *preferences)
        selection = gtk_tree_view_get_selection (view);
        gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
 
-       model = GTK_TREE_MODEL (store);
-
        renderer = gtk_cell_renderer_toggle_new ();
        g_signal_connect (renderer, "toggled",
                          G_CALLBACK (preferences_languages_cell_toggled_cb),
@@ -645,6 +649,124 @@ preferences_languages_cell_toggled_cb (GtkCellRendererToggle *cell,
        preferences_languages_save (preferences);
 }
 
+static void
+preferences_preview_theme_append_message (EmpathyChatView *view,
+                                         EmpathyContact *sender,
+                                         EmpathyContact *receiver,
+                                         const gchar *text)
+{
+       EmpathyMessage *message;
+
+       message = g_object_new (EMPATHY_TYPE_MESSAGE,
+               "sender", sender,
+               "receiver", receiver,
+               "body", text,
+               NULL);
+
+       empathy_chat_view_append_message (view, message);
+       g_object_unref (message);
+}
+
+static void
+preferences_preview_theme_changed_cb (EmpathyThemeManager *manager,
+                                     EmpathyPreferences  *preferences)
+{
+       EmpathyPreferencesPriv *priv = GET_PRIV (preferences);
+       TpDBusDaemon *dbus;
+       TpAccount *account;
+       EmpathyContact *juliet;
+       EmpathyContact *romeo;
+
+       DEBUG ("Theme changed, update preview widget");
+
+       if (priv->chat_theme_preview != NULL) {
+               gtk_widget_destroy (GTK_WIDGET (priv->chat_theme_preview));
+       }
+       priv->chat_theme_preview = empathy_theme_manager_create_view (manager);
+       gtk_container_add (GTK_CONTAINER (priv->sw_chat_theme_preview),
+                          GTK_WIDGET (priv->chat_theme_preview));
+       gtk_widget_show (GTK_WIDGET (priv->chat_theme_preview));
+
+       /* FIXME: It is ugly to add a fake conversation like that.
+        * Would be cool if we could request a TplLogManager for a fake
+        * conversation */
+       dbus = tp_dbus_daemon_dup (NULL);
+       account = tp_account_new (dbus,
+               TP_ACCOUNT_OBJECT_PATH_BASE "cm/jabber/account", NULL);
+       juliet = g_object_new (EMPATHY_TYPE_CONTACT,
+               "account", account,
+               "id", "juliet",
+               /* translators: Contact name for the chat theme preview */
+               "alias", _("Juliet"),
+               "is-user", FALSE,
+               NULL);
+       romeo = g_object_new (EMPATHY_TYPE_CONTACT,
+               "account", account,
+               "id", "romeo",
+               /* translators: Contact name for the chat theme preview */
+               "alias", _("Romeo"),
+               "is-user", TRUE,
+               NULL);
+
+       preferences_preview_theme_append_message (priv->chat_theme_preview,
+               /* translators: Quote from Romeo & Julier, for chat theme preview */
+               juliet, romeo, _("O Romeo, Romeo, wherefore art thou Romeo?"));
+       preferences_preview_theme_append_message (priv->chat_theme_preview,
+               /* translators: Quote from Romeo & Julier, for chat theme preview */
+               juliet, romeo, _("Deny thy father and refuse thy name;"));
+       preferences_preview_theme_append_message (priv->chat_theme_preview,
+               /* translators: Quote from Romeo & Julier, for chat theme preview */
+               juliet, romeo, _("Or if thou wilt not, be but sworn my love"));
+       preferences_preview_theme_append_message (priv->chat_theme_preview,
+               /* translators: Quote from Romeo & Julier, for chat theme preview */
+               juliet, romeo, _("And I'll no longer be a Capulet."));
+       preferences_preview_theme_append_message (priv->chat_theme_preview,
+               /* translators: Quote from Romeo & Julier, for chat theme preview */
+               romeo, juliet, _("Shall I hear more, or shall I speak at this?"));
+
+       /* translators: Quote from Romeo & Julier, for chat theme preview */
+       empathy_chat_view_append_event (priv->chat_theme_preview, _("Juliet has disconnected"));
+
+       g_object_unref (juliet);
+       g_object_unref (romeo);
+       g_object_unref (account);
+       g_object_unref (dbus);
+}
+
+static void
+preferences_theme_changed_cb (GtkComboBox        *combo,
+                             EmpathyPreferences *preferences)
+{
+       EmpathyPreferencesPriv *priv = GET_PRIV (preferences);
+       GtkTreeIter   iter;
+
+       if (gtk_combo_box_get_active_iter (combo, &iter)) {
+               GtkTreeModel *model;
+               gboolean      is_adium;
+               gchar        *name;
+               gchar        *path;
+
+               model = gtk_combo_box_get_model (combo);
+               gtk_tree_model_get (model, &iter,
+                                   COL_THEME_IS_ADIUM, &is_adium,
+                                   COL_THEME_NAME, &name,
+                                   COL_THEME_ADIUM_PATH, &path,
+                                   -1);
+
+               g_settings_set_string (priv->gsettings_chat,
+                                      EMPATHY_PREFS_CHAT_THEME,
+                                      name);
+               if (is_adium) {
+                       g_settings_set_string (priv->gsettings_chat,
+                                              EMPATHY_PREFS_CHAT_ADIUM_PATH,
+                                              path);
+               }
+
+               g_free (name);
+               g_free (path);
+       }
+}
+
 static void
 preferences_theme_notify_cb (GSettings   *gsettings,
                             const gchar *key,
@@ -658,38 +780,34 @@ preferences_theme_notify_cb (GSettings   *gsettings,
        GtkTreeModel       *model;
        GtkTreeIter         iter;
        gboolean            found = FALSE;
+       gboolean            ok;
 
        conf_name = g_settings_get_string (gsettings, EMPATHY_PREFS_CHAT_THEME);
        conf_path = g_settings_get_string (gsettings, EMPATHY_PREFS_CHAT_ADIUM_PATH);
 
        combo = GTK_COMBO_BOX (priv->combobox_chat_theme);
        model = gtk_combo_box_get_model (combo);
-       if (gtk_tree_model_get_iter_first (model, &iter)) {
+       for (ok = gtk_tree_model_get_iter_first (model, &iter);
+            ok && !found;
+            ok = gtk_tree_model_iter_next (model, &iter)) {
                gboolean is_adium;
                gchar *name;
                gchar *path;
 
-               do {
-                       gtk_tree_model_get (model, &iter,
-                                           COL_COMBO_IS_ADIUM, &is_adium,
-                                           COL_COMBO_NAME, &name,
-                                           COL_COMBO_PATH, &path,
-                                           -1);
-
-                       if (!tp_strdiff (name, conf_name)) {
-                               if (tp_strdiff (name, "adium") ||
-                                   !tp_strdiff (path, conf_path)) {
-                                       found = TRUE;
-                                       gtk_combo_box_set_active_iter (combo, &iter);
-                                       g_free (name);
-                                       g_free (path);
-                                       break;
-                               }
-                       }
-
-                       g_free (name);
-                       g_free (path);
-               } while (gtk_tree_model_iter_next (model, &iter));
+               gtk_tree_model_get (model, &iter,
+                                   COL_THEME_IS_ADIUM, &is_adium,
+                                   COL_THEME_NAME, &name,
+                                   COL_THEME_ADIUM_PATH, &path,
+                                   -1);
+
+               if (!tp_strdiff (name, conf_name) &&
+                   (!is_adium || !tp_strdiff (path, conf_path))) {
+                       found = TRUE;
+                       gtk_combo_box_set_active_iter (combo, &iter);
+               }
+
+               g_free (name);
+               g_free (path);
        }
 
        /* Fallback to the first one. */
@@ -703,38 +821,6 @@ preferences_theme_notify_cb (GSettings   *gsettings,
        g_free (conf_path);
 }
 
-static void
-preferences_theme_changed_cb (GtkComboBox        *combo,
-                             EmpathyPreferences *preferences)
-{
-       EmpathyPreferencesPriv *priv = GET_PRIV (preferences);
-       GtkTreeModel *model;
-       GtkTreeIter   iter;
-       gboolean      is_adium;
-       gchar        *name;
-       gchar        *path;
-
-       if (gtk_combo_box_get_active_iter (combo, &iter)) {
-               model = gtk_combo_box_get_model (combo);
-
-               gtk_tree_model_get (model, &iter,
-                                   COL_COMBO_IS_ADIUM, &is_adium,
-                                   COL_COMBO_NAME, &name,
-                                   COL_COMBO_PATH, &path,
-                                   -1);
-
-               g_settings_set_string (priv->gsettings_chat,
-                                      EMPATHY_PREFS_CHAT_THEME,
-                                      name);
-               if (is_adium == TRUE)
-                       g_settings_set_string (priv->gsettings_chat,
-                                              EMPATHY_PREFS_CHAT_ADIUM_PATH,
-                                              path);
-               g_free (name);
-               g_free (path);
-       }
-}
-
 static void
 preferences_themes_setup (EmpathyPreferences *preferences)
 {
@@ -751,22 +837,21 @@ preferences_themes_setup (EmpathyPreferences *preferences)
        cell_layout = GTK_CELL_LAYOUT (combo);
 
        /* Create the model */
-       store = gtk_list_store_new (COL_COMBO_COUNT,
-                                   G_TYPE_BOOLEAN, /* Is an Adium theme */
-                                   G_TYPE_STRING,  /* Display name */
-                                   G_TYPE_STRING,  /* Theme name */
-                                   G_TYPE_STRING); /* Theme path */
+       store = gtk_list_store_new (COL_THEME_COUNT,
+                                   G_TYPE_STRING,      /* Display name */
+                                   G_TYPE_STRING,      /* Theme name */
+                                   G_TYPE_BOOLEAN,     /* Is an Adium theme */
+                                   G_TYPE_STRING);     /* Adium theme path */
        gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
-               COL_COMBO_VISIBLE_NAME, GTK_SORT_ASCENDING);
+               COL_THEME_VISIBLE_NAME, GTK_SORT_ASCENDING);
 
        /* Fill the model */
        themes = empathy_theme_manager_get_themes ();
        for (i = 0; themes[i]; i += 2) {
                gtk_list_store_insert_with_values (store, NULL, -1,
-                       COL_COMBO_IS_ADIUM, FALSE,
-                       COL_COMBO_VISIBLE_NAME, _(themes[i + 1]),
-                       COL_COMBO_NAME, themes[i],
-                       COL_COMBO_PATH, NULL,
+                       COL_THEME_VISIBLE_NAME, _(themes[i + 1]),
+                       COL_THEME_NAME, themes[i],
+                       COL_THEME_IS_ADIUM, FALSE,
                        -1);
        }
 
@@ -782,10 +867,10 @@ preferences_themes_setup (EmpathyPreferences *preferences)
 
                if (name != NULL && path != NULL) {
                        gtk_list_store_insert_with_values (store, NULL, -1,
-                               COL_COMBO_IS_ADIUM, TRUE,
-                               COL_COMBO_VISIBLE_NAME, name,
-                               COL_COMBO_NAME, "adium",
-                               COL_COMBO_PATH, path,
+                               COL_THEME_VISIBLE_NAME, name,
+                               COL_THEME_NAME, "adium",
+                               COL_THEME_IS_ADIUM, TRUE,
+                               COL_THEME_ADIUM_PATH, path,
                                -1);
                }
                g_hash_table_unref (info);
@@ -796,7 +881,7 @@ preferences_themes_setup (EmpathyPreferences *preferences)
        renderer = gtk_cell_renderer_text_new ();
        gtk_cell_layout_pack_start (cell_layout, renderer, TRUE);
        gtk_cell_layout_set_attributes (cell_layout, renderer,
-               "text", COL_COMBO_VISIBLE_NAME, NULL);
+               "text", COL_THEME_VISIBLE_NAME, NULL);
 
        gtk_combo_box_set_model (combo, GTK_TREE_MODEL (store));
        g_object_unref (store);
@@ -832,6 +917,8 @@ empathy_preferences_finalize (GObject *self)
 {
        EmpathyPreferencesPriv *priv = GET_PRIV (self);
 
+       g_object_unref (priv->theme_manager);
+
        g_object_unref (priv->gsettings);
        g_object_unref (priv->gsettings_chat);
        g_object_unref (priv->gsettings_loc);
@@ -883,7 +970,9 @@ empathy_preferences_init (EmpathyPreferences *preferences)
                "notebook", &priv->notebook,
                "checkbutton_show_smileys", &priv->checkbutton_show_smileys,
                "checkbutton_show_contacts_in_rooms", &priv->checkbutton_show_contacts_in_rooms,
+               "vbox_chat_theme", &priv->vbox_chat_theme,
                "combobox_chat_theme", &priv->combobox_chat_theme,
+               "sw_chat_theme_preview", &priv->sw_chat_theme_preview,
                "checkbutton_separate_chat_windows", &priv->checkbutton_separate_chat_windows,
                "checkbutton_events_notif_area", &priv->checkbutton_events_notif_area,
                "checkbutton_autoconnect", &priv->checkbutton_autoconnect,
@@ -918,6 +1007,13 @@ empathy_preferences_init (EmpathyPreferences *preferences)
        priv->gsettings_ui = g_settings_new (EMPATHY_PREFS_UI_SCHEMA);
        priv->gsettings_logger = g_settings_new (EMPATHY_PREFS_LOGGER_SCHEMA);
 
+       /* Create chat theme preview, and track changes */
+       priv->theme_manager = empathy_theme_manager_dup_singleton ();
+       tp_g_signal_connect_object (priv->theme_manager, "theme-changed",
+                         G_CALLBACK (preferences_preview_theme_changed_cb),
+                         preferences, 0);
+       preferences_preview_theme_changed_cb (priv->theme_manager, preferences);
+
        preferences_themes_setup (preferences);
 
        preferences_setup_widgets (preferences);
index 4acc6f3c7d5726144f22cbb2239201ea95613093..6bc17b761ed8ec28230c3f430c2e14f70e5a4e8e 100644 (file)
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="2.16"/>
-  <!-- interface-naming-policy toplevel-contextual -->
-          <object class="GtkNotebook" id="notebook">
+  <object class="GtkNotebook" id="notebook">
+    <property name="visible">True</property>
+    <property name="can_focus">True</property>
+    <property name="border_width">5</property>
+    <child>
+      <object class="GtkBox" id="vbox197">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">12</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">18</property>
+        <child>
+          <object class="GtkFrame" id="frame3">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="border_width">5</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
             <child>
-              <object class="GtkBox" id="vbox197">
+              <object class="GtkAlignment" id="alignment11">
                 <property name="visible">True</property>
-                <property name="border_width">12</property>
-                <property name="spacing">18</property>
-                <property name="orientation">vertical</property>
+                <property name="can_focus">False</property>
+                <property name="top_padding">6</property>
+                <property name="left_padding">12</property>
                 <child>
-                  <object class="GtkFrame" id="frame3">
+                  <object class="GtkBox" id="vbox199">
                     <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">none</property>
+                    <property name="can_focus">False</property>
+                    <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkAlignment" id="alignment11">
+                      <object class="GtkCheckButton" id="checkbutton_show_smileys">
+                        <property name="label" translatable="yes">Show _smileys as images</property>
                         <property name="visible">True</property>
-                        <property name="top_padding">6</property>
-                        <property name="left_padding">12</property>
-                        <child>
-                          <object class="GtkBox" id="vbox199">
-                            <property name="visible">True</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_show_smileys">
-                                <property name="label" translatable="yes">Show _smileys as images</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="active">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_show_contacts_in_rooms">
-                                <property name="label" translatable="yes">Show contact _list in rooms</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="active">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">3</property>
-                              </packing>
-                            </child>
-                          </object>
-                        </child>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
                       </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">2</property>
+                      </packing>
                     </child>
-                    <child type="label">
-                      <object class="GtkLabel" id="label611">
+                    <child>
+                      <object class="GtkCheckButton" id="checkbutton_show_contacts_in_rooms">
+                        <property name="label" translatable="yes">Show contact _list in rooms</property>
                         <property name="visible">True</property>
-                        <property name="label" translatable="yes">Appearance</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
                       </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">3</property>
+                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label611">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Appearance</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame4">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment" id="alignment12">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="top_padding">6</property>
+                <property name="left_padding">12</property>
                 <child>
-                  <object class="GtkFrame" id="frame4">
+                  <object class="GtkBox" id="vbox218">
                     <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">none</property>
+                    <property name="can_focus">False</property>
+                    <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkAlignment" id="alignment12">
+                      <object class="GtkCheckButton" id="checkbutton_separate_chat_windows">
+                        <property name="label" translatable="yes">_Open new chats in separate windows</property>
                         <property name="visible">True</property>
-                        <property name="top_padding">6</property>
-                        <property name="left_padding">12</property>
-                        <child>
-                          <object class="GtkBox" id="vbox218">
-                            <property name="orientation">vertical</property>
-                            <property name="visible">True</property>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_separate_chat_windows">
-                                <property name="label" translatable="yes">_Open new chats in separate windows</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                           <child>
-                              <object class="GtkCheckButton" id="checkbutton_events_notif_area">
-                                <property name="label" translatable="yes">Display incoming events in the notification area</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_autoconnect">
-                                <property name="label" translatable="yes">_Automatically connect on startup</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="active">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_logging">
-                                <property name="label" translatable="yes">Log conversations</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="active">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="position">3</property>
-                              </packing>
-                            </child>
-                          </object>
-                        </child>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
                       </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
                     </child>
-                    <child type="label">
-                      <object class="GtkLabel" id="label612">
+                    <child>
+                      <object class="GtkCheckButton" id="checkbutton_events_notif_area">
+                        <property name="label" translatable="yes">Display incoming events in the notification area</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="checkbutton_autoconnect">
+                        <property name="label" translatable="yes">_Automatically connect on startup</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="checkbutton_logging">
+                        <property name="label" translatable="yes">Log conversations</property>
                         <property name="visible">True</property>
-                        <property name="label" translatable="yes">Behavior</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
                       </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">3</property>
+                      </packing>
                     </child>
                   </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label612">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Behavior</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <child type="tab">
+      <object class="GtkLabel" id="label602">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">General</property>
+      </object>
+      <packing>
+        <property name="tab_fill">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkBox" id="vbox2">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">12</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">6</property>
+        <child>
+          <object class="GtkCheckButton" id="checkbutton_notifications_enabled">
+            <property name="label" translatable="yes">_Enable bubble notifications</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">False</property>
+            <property name="use_action_appearance">False</property>
+            <property name="use_underline">True</property>
+            <property name="draw_indicator">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkAlignment" id="alignment1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="left_padding">12</property>
+            <child>
+              <object class="GtkBox" id="vbox3">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkCheckButton" id="checkbutton_notifications_disabled_away">
+                    <property name="label" translatable="yes">Disable notifications when _away or busy</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="checkbutton_notifications_focus">
+                    <property name="label" translatable="yes">Enable notifications when the _chat is not focused</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
                   <packing>
                     <property name="expand">False</property>
-                    <property name="fill">False</property>
+                    <property name="fill">True</property>
                     <property name="position">1</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkCheckButton" id="checkbutton_notifications_contact_signin">
+                    <property name="label" translatable="yes">Enable notifications when a contact comes online</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="checkbutton_notifications_contact_signout">
+                    <property name="label" translatable="yes">Enable notifications when a contact goes offline</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
               </object>
             </child>
-            <child type="tab">
-              <object class="GtkLabel" id="label602">
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child type="tab">
+      <object class="GtkLabel" id="label1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Notifications</property>
+      </object>
+      <packing>
+        <property name="position">1</property>
+        <property name="tab_fill">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkBox" id="outer_vbox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">12</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">18</property>
+        <child>
+          <object class="GtkBox" id="vbox219">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">6</property>
+            <child>
+              <object class="GtkCheckButton" id="checkbutton_sounds_enabled">
+                <property name="label" translatable="yes">_Enable sound notifications</property>
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">General</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_underline">True</property>
+                <property name="draw_indicator">True</property>
               </object>
               <packing>
-                <property name="tab_fill">False</property>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
               </packing>
             </child>
             <child>
-              <object class="GtkBox" id="vbox2">
+              <object class="GtkAlignment" id="alignment32">
                 <property name="visible">True</property>
-                <property name="border_width">12</property>
-                <property name="spacing">6</property>
-                <property name="orientation">vertical</property>
+                <property name="can_focus">False</property>
+                <property name="left_padding">12</property>
                 <child>
-                  <object class="GtkCheckButton" id="checkbutton_notifications_enabled">
-                    <property name="label" translatable="yes">_Enable bubble notifications</property>
+                  <object class="GtkCheckButton" id="checkbutton_sounds_disabled_away">
+                    <property name="label" translatable="yes">Disable sounds when _away or busy</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">False</property>
+                    <property name="use_action_appearance">False</property>
                     <property name="use_underline">True</property>
                     <property name="draw_indicator">True</property>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkBox" id="vbox221">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">6</property>
+            <child>
+              <object class="GtkLabel" id="label645">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">Play sound for events</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="alignment33">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <object class="GtkScrolledWindow" id="scrolledwindow19">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="shadow_type">in</property>
+                    <child>
+                      <object class="GtkTreeView" id="treeview_sounds">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="headers_visible">False</property>
+                        <child internal-child="selection">
+                          <object class="GtkTreeSelection" id="treeview-selection1"/>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="position">2</property>
+      </packing>
+    </child>
+    <child type="tab">
+      <object class="GtkLabel" id="label607">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Sounds</property>
+      </object>
+      <packing>
+        <property name="position">2</property>
+        <property name="tab_fill">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">12</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">18</property>
+        <child>
+          <object class="GtkCheckButton" id="checkbutton_location_publish">
+            <property name="label" translatable="yes">_Publish location to my contacts</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">False</property>
+            <property name="use_action_appearance">False</property>
+            <property name="use_underline">True</property>
+            <property name="draw_indicator">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment" id="alignment2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="top_padding">6</property>
+                <property name="left_padding">12</property>
                 <child>
-                  <object class="GtkAlignment" id="alignment1">
+                  <object class="GtkBox" id="vbox4">
                     <property name="visible">True</property>
-                    <property name="left_padding">12</property>
+                    <property name="can_focus">False</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
                     <child>
-                      <object class="GtkBox" id="vbox3">
+                      <object class="GtkBox" id="hbox1">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="spacing">6</property>
-                        <property name="orientation">vertical</property>
                         <child>
-                          <object class="GtkCheckButton" id="checkbutton_notifications_disabled_away">
-                            <property name="label" translatable="yes">Disable notifications when _away or busy</property>
+                          <object class="GtkImage" id="image1">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
-                            <property name="draw_indicator">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="yalign">0</property>
+                            <property name="stock">gtk-dialog-info</property>
                           </object>
                           <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
                             <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkCheckButton" id="checkbutton_notifications_focus">
-                            <property name="label" translatable="yes">Enable notifications when the _chat is not focused</property>
+                          <object class="GtkLabel" id="label6">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
-                            <property name="draw_indicator">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Reduced location accuracy means that nothing more precise than your city, state and country will be published.  GPS coordinates will be accurate to 1 decimal place.</property>
+                            <property name="wrap">True</property>
+                            <attributes>
+                              <attribute name="scale" value="0.80000000000000004"/>
+                            </attributes>
                           </object>
                           <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
                             <property name="position">1</property>
                           </packing>
                         </child>
-                        <child>
-                          <object class="GtkCheckButton" id="checkbutton_notifications_contact_signin">
-                            <property name="label" translatable="yes">Enable notifications when a contact comes online</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
-                            <property name="draw_indicator">True</property>
-                          </object>
-                          <packing>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkCheckButton" id="checkbutton_notifications_contact_signout">
-                            <property name="label" translatable="yes">Enable notifications when a contact goes offline</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
-                            <property name="draw_indicator">True</property>
-                          </object>
-                          <packing>
-                            <property name="position">3</property>
-                          </packing>
-                        </child>
                       </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="checkbutton_location_reduce_accuracy">
+                        <property name="label" translatable="yes" comments="To translators: The longitude and latitude are rounded to closest 0,1 degrees, so for example 146,2345° is rounded to round(146,2345*10)/10 = 146,2 degrees.">_Reduce location accuracy</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="position">1</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
             </child>
-            <child type="tab">
-              <object class="GtkLabel" id="label1">
+            <child type="label">
+              <object class="GtkLabel" id="label3">
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Notifications</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Privacy</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
               </object>
-              <packing>
-                <property name="position">1</property>
-                <property name="tab_fill">False</property>
-              </packing>
             </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame5">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
             <child>
-              <object class="GtkBox" id="outer_vbox">
+              <object class="GtkAlignment" id="alignment4">
                 <property name="visible">True</property>
-                <property name="border_width">12</property>
-                <property name="spacing">18</property>
-                <property name="orientation">vertical</property>
+                <property name="can_focus">False</property>
+                <property name="top_padding">6</property>
+                <property name="left_padding">12</property>
                 <child>
-                  <object class="GtkBox" id="vbox219">
+                  <object class="GtkBox" id="vbox5">
                     <property name="visible">True</property>
-                    <property name="spacing">6</property>
+                    <property name="can_focus">False</property>
                     <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkCheckButton" id="checkbutton_sounds_enabled">
-                        <property name="label" translatable="yes">_Enable sound notifications</property>
+                      <object class="GtkCheckButton" id="checkbutton_location_resource_gps">
+                        <property name="label" translatable="yes">_GPS</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="use_underline">True</property>
                         <property name="draw_indicator">True</property>
                       </object>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkAlignment" id="alignment32">
+                      <object class="GtkCheckButton" id="checkbutton_location_resource_cell">
+                        <property name="label" translatable="yes">_Cellphone</property>
                         <property name="visible">True</property>
-                        <property name="left_padding">12</property>
-                        <child>
-                          <object class="GtkCheckButton" id="checkbutton_sounds_disabled_away">
-                            <property name="label" translatable="yes">Disable sounds when _away or busy</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
-                            <property name="draw_indicator">True</property>
-                          </object>
-                        </child>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
                       </object>
                       <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
                         <property name="position">1</property>
                       </packing>
                     </child>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkBox" id="vbox221">
-                    <property name="visible">True</property>
-                    <property name="spacing">6</property>
-                    <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkLabel" id="label645">
+                      <object class="GtkCheckButton" id="checkbutton_location_resource_network">
+                        <property name="label" translatable="yes">_Network (IP, Wi-Fi)</property>
                         <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">Play sound for events</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_action_appearance">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">False</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkAlignment" id="alignment33">
-                        <property name="visible">True</property>
-                        <property name="left_padding">12</property>
-                        <child>
-                          <object class="GtkScrolledWindow" id="scrolledwindow19">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="hscrollbar_policy">automatic</property>
-                            <property name="vscrollbar_policy">automatic</property>
-                            <property name="shadow_type">in</property>
-                            <child>
-                              <object class="GtkTreeView" id="treeview_sounds">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="headers_visible">False</property>
-                              </object>
-                            </child>
-                          </object>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="position">1</property>
-                        <property name="expand">True</property>
+                        <property name="position">2</property>
                       </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="position">1</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="position">2</property>
-              </packing>
             </child>
-            <child type="tab">
-              <object class="GtkLabel" id="label607">
+            <child type="label">
+              <object class="GtkLabel" id="label5">
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Sounds</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Location sources:</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
               </object>
-              <packing>
-                <property name="position">2</property>
-                <property name="tab_fill">False</property>
-              </packing>
             </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="position">3</property>
+      </packing>
+    </child>
+    <child type="tab">
+      <object class="GtkLabel" id="label2">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Location</property>
+      </object>
+      <packing>
+        <property name="position">3</property>
+        <property name="tab_fill">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkBox" id="vbox168">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">12</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">18</property>
+        <child>
+          <object class="GtkFrame" id="frame7">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
             <child>
-              <object class="GtkBox" id="vbox1">
+              <object class="GtkAlignment" id="alignment15">
                 <property name="visible">True</property>
-                <property name="border_width">12</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">18</property>
-                <child>
-                  <object class="GtkCheckButton" id="checkbutton_location_publish">
-                    <property name="label" translatable="yes">_Publish location to my contacts</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_underline">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
+                <property name="can_focus">False</property>
+                <property name="top_padding">6</property>
+                <property name="left_padding">12</property>
                 <child>
-                  <object class="GtkFrame" id="frame1">
+                  <object class="GtkBox" id="vbox201">
                     <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">none</property>
+                    <property name="can_focus">False</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
                     <child>
-                      <object class="GtkAlignment" id="alignment2">
+                      <object class="GtkScrolledWindow" id="scrolledwindow18">
                         <property name="visible">True</property>
-                        <property name="top_padding">6</property>
-                        <property name="left_padding">12</property>
+                        <property name="can_focus">False</property>
+                        <property name="shadow_type">in</property>
                         <child>
-                          <object class="GtkBox" id="vbox4">
+                          <object class="GtkTreeView" id="treeview_spell_checker">
                             <property name="visible">True</property>
-                            <property name="orientation">vertical</property>
-                            <property name="spacing">6</property>
-                            <child>
-                              <object class="GtkBox" id="hbox1">
-                                <property name="visible">True</property>
-                                <property name="spacing">6</property>
-                                <property name="orientation">horizontal</property>
-                                <child>
-                                  <object class="GtkImage" id="image1">
-                                    <property name="visible">True</property>
-                                    <property name="yalign">0</property>
-                                    <property name="stock">gtk-dialog-info</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label6">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="wrap">True</property>
-                                    <property name="label" translatable="yes">Reduced location accuracy means that nothing more precise than your city, state and country will be published.  GPS coordinates will be accurate to 1 decimal place.</property>
-                                    <attributes>
-                                      <attribute name="scale" value="0.8"/>
-                                    </attributes>
-                                  </object>
-                                  <packing>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_location_reduce_accuracy">
-                                <property name="label" translatable="yes" comments="To translators: The longitude and latitude are rounded to closest 0,1 degrees, so for example 146,2345° is rounded to round(146,2345*10)/10 = 146,2 degrees.">_Reduce location accuracy</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="active">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">1</property>
-                              </packing>
+                            <property name="can_focus">True</property>
+                            <property name="headers_visible">False</property>
+                            <child internal-child="selection">
+                              <object class="GtkTreeSelection" id="treeview-selection2"/>
                             </child>
                           </object>
                         </child>
                       </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
                     </child>
-                    <child type="label">
-                      <object class="GtkLabel" id="label3">
-                        <property name="visible">True</property>
-                        <property name="label" translatable="yes">Privacy</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
-                      </object>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkFrame" id="frame5">
-                    <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">none</property>
                     <child>
-                      <object class="GtkAlignment" id="alignment4">
+                      <object class="GtkBox" id="hbox155">
                         <property name="visible">True</property>
-                        <property name="top_padding">6</property>
-                        <property name="left_padding">12</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">6</property>
                         <child>
-                          <object class="GtkBox" id="vbox5">
+                          <object class="GtkImage" id="image422">
                             <property name="visible">True</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_location_resource_gps">
-                                <property name="label" translatable="yes">_GPS</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_location_resource_cell">
-                                <property name="label" translatable="yes">_Cellphone</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="active">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkCheckButton" id="checkbutton_location_resource_network">
-                                <property name="label" translatable="yes">_Network (IP, Wi-Fi)</property>
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="use_underline">True</property>
-                                <property name="active">True</property>
-                                <property name="draw_indicator">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
+                            <property name="can_focus">False</property>
+                            <property name="yalign">0</property>
+                            <property name="stock">gtk-dialog-info</property>
                           </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="label616">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">The list of languages reflects only the languages for which you have a dictionary installed.</property>
+                            <property name="wrap">True</property>
+                            <attributes>
+                              <attribute name="scale" value="0.80000000000000004"/>
+                            </attributes>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
                         </child>
                       </object>
-                    </child>
-                    <child type="label">
-                      <object class="GtkLabel" id="label5">
-                        <property name="visible">True</property>
-                        <property name="label" translatable="yes">Location sources:</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
-                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="position">2</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="position">3</property>
-              </packing>
             </child>
-            <child type="tab">
-              <object class="GtkLabel" id="label2">
+            <child type="label">
+              <object class="GtkLabel" id="label615">
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Location</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Enable spell checking for languages:</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
               </object>
-              <packing>
-                <property name="position">3</property>
-                <property name="tab_fill">False</property>
-              </packing>
             </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+      </object>
+      <packing>
+        <property name="position">4</property>
+      </packing>
+    </child>
+    <child type="tab">
+      <object class="GtkLabel" id="label567">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Spell Checking</property>
+      </object>
+      <packing>
+        <property name="position">4</property>
+        <property name="tab_fill">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkBox" id="vbox206">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">12</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">18</property>
+        <child>
+          <object class="GtkFrame" id="frame11">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
             <child>
-              <object class="GtkBox" id="vbox168">
+              <object class="GtkAlignment" id="alignment19">
                 <property name="visible">True</property>
-                <property name="border_width">12</property>
-                <property name="spacing">18</property>
-                <property name="orientation">vertical</property>
+                <property name="can_focus">False</property>
+                <property name="top_padding">6</property>
+                <property name="left_padding">12</property>
                 <child>
-                  <object class="GtkFrame" id="frame7">
+                  <object class="GtkBox" id="vbox_chat_theme">
                     <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">none</property>
+                    <property name="can_focus">False</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
                     <child>
-                      <object class="GtkAlignment" id="alignment15">
+                      <object class="GtkBox" id="hbox139">
                         <property name="visible">True</property>
-                        <property name="top_padding">6</property>
-                        <property name="left_padding">12</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">12</property>
                         <child>
-                          <object class="GtkBox" id="vbox201">
+                          <object class="GtkLabel" id="label586">
                             <property name="visible">True</property>
-                            <property name="spacing">6</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <object class="GtkScrolledWindow" id="scrolledwindow18">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="hscrollbar_policy">automatic</property>
-                                <property name="vscrollbar_policy">automatic</property>
-                                <property name="shadow_type">in</property>
-                                <child>
-                                  <object class="GtkTreeView" id="treeview_spell_checker">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="headers_visible">False</property>
-                                  </object>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="position">0</property>
-                                <property name="expand">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkBox" id="hbox155">
-                                <property name="visible">True</property>
-                                <property name="spacing">6</property>
-                                <property name="orientation">horizontal</property>
-                                <child>
-                                  <object class="GtkImage" id="image422">
-                                    <property name="visible">True</property>
-                                    <property name="yalign">0</property>
-                                    <property name="stock">gtk-dialog-info</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel" id="label616">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="wrap">True</property>
-                                    <property name="label" translatable="yes">The list of languages reflects only the languages for which you have a dictionary installed.</property>
-                                    <attributes>
-                                      <attribute name="scale" value="0.8"/>
-                                    </attributes>
-                                  </object>
-                                  <packing>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">Chat Th_eme:</property>
+                            <property name="use_underline">True</property>
+                            <property name="mnemonic_widget">combobox_chat_theme</property>
                           </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkComboBox" id="combobox_chat_theme">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
                         </child>
                       </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
                     </child>
-                    <child type="label">
-                      <object class="GtkLabel" id="label615">
-                        <property name="visible">True</property>
-                        <property name="label" translatable="yes">Enable spell checking for languages:</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
-                      </object>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-              </object>
-              <packing>
-                <property name="position">4</property>
-              </packing>
-            </child>
-            <child type="tab">
-              <object class="GtkLabel" id="label567">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Spell Checking</property>
-              </object>
-              <packing>
-                <property name="position">4</property>
-                <property name="tab_fill">False</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkBox" id="vbox206">
-                <property name="visible">True</property>
-                <property name="border_width">12</property>
-                <property name="spacing">18</property>
-                <property name="orientation">vertical</property>
-                <child>
-                  <object class="GtkFrame" id="frame11">
-                    <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">none</property>
                     <child>
-                      <object class="GtkAlignment" id="alignment19">
-                        <property name="visible">True</property>
-                        <property name="top_padding">6</property>
-                        <property name="left_padding">12</property>
+                      <object class="GtkBox" id="hbox_chat_theme_variant">
+                        <property name="visible">False</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">12</property>
                         <child>
-                          <object class="GtkBox" id="vbox207">
+                          <object class="GtkLabel" id="label4">
                             <property name="visible">True</property>
-                            <property name="spacing">6</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <object class="GtkBox" id="hbox139">
-                                <property name="visible">True</property>
-                                <property name="spacing">12</property>
-                                <property name="orientation">horizontal</property>
-                                <child>
-                                  <object class="GtkLabel" id="label586">
-                                    <property name="visible">True</property>
-                                    <property name="label" translatable="yes">Chat Th_eme:</property>
-                                    <property name="use_underline">True</property>
-                                    <property name="mnemonic_widget">combobox_chat_theme</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkComboBox" id="combobox_chat_theme">
-                                    <property name="visible">True</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">Theme Variant:</property>
+                            <property name="use_underline">True</property>
+                            <property name="mnemonic_widget">combobox_chat_theme_variant</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkComboBox" id="combobox_chat_theme_variant">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                           </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
                         </child>
                       </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
                     </child>
-                    <child type="label">
-                      <object class="GtkLabel" id="label626">
+                    <child>
+                      <object class="GtkScrolledWindow" id="sw_chat_theme_preview">
                         <property name="visible">True</property>
-                        <property name="label" translatable="yes">Appearance</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
+                        <property name="can_focus">True</property>
+                        <property name="shadow_type">in</property>
+                        <child>
+                          <placeholder/>
+                        </child>
                       </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
+                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="position">5</property>
-              </packing>
             </child>
-            <child type="tab">
-              <object class="GtkLabel" id="label624">
+            <child type="label">
+              <object class="GtkLabel" id="label626">
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Themes</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Appearance</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
               </object>
-              <packing>
-                <property name="position">5</property>
-                <property name="tab_fill">False</property>
-              </packing>
             </child>
           </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="position">5</property>
+      </packing>
+    </child>
+    <child type="tab">
+      <object class="GtkLabel" id="label624">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Themes</property>
+      </object>
+      <packing>
+        <property name="position">5</property>
+        <property name="tab_fill">False</property>
+      </packing>
+    </child>
+  </object>
 </interface>
index d0dd2b61572a0f8e6ff1208ccfea709873b7edb0..9c805372dd780f0c105844f2856c4cccca0c2041 100644 (file)
@@ -64,10 +64,8 @@ static void
 ev_sidebar_class_init (EvSidebarClass *ev_sidebar_class)
 {
        GObjectClass *g_object_class;
-       GtkWidgetClass *widget_class;
  
        g_object_class = G_OBJECT_CLASS (ev_sidebar_class);
-       widget_class = GTK_WIDGET_CLASS (ev_sidebar_class);
           
        g_type_class_add_private (g_object_class, sizeof (EvSidebarPrivate));
 
index 7793b44d9832430abdb74ede6584766a3aa93336..e391df6349ae896e30e6d1b0ed7997086c7e645c 100644 (file)
@@ -12,7 +12,6 @@ int
 main (int argc, char **argv)
 {
        EmpathyContactManager *manager;
-       GMainLoop             *main_loop;
        EmpathyContactListStore *store;
        GtkWidget *combo;
        GtkWidget *window;
@@ -22,7 +21,7 @@ main (int argc, char **argv)
        empathy_gtk_init ();
 
        empathy_debug_set_flags (g_getenv ("EMPATHY_DEBUG"));
-       main_loop = g_main_loop_new (NULL, FALSE);
+       g_main_loop_new (NULL, FALSE);
        manager = empathy_contact_manager_dup_singleton ();
        store = empathy_contact_list_store_new (EMPATHY_CONTACT_LIST (manager));
        empathy_contact_list_store_set_is_compact (store, TRUE);