diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | data/Template.html | 354 | ||||
-rw-r--r-- | libempathy-gtk/empathy-individual-store.c | 7 | ||||
-rw-r--r-- | libempathy-gtk/empathy-individual-view.c | 53 | ||||
-rw-r--r-- | libempathy-gtk/empathy-theme-adium.c | 460 | ||||
-rw-r--r-- | libempathy-gtk/empathy-theme-adium.h | 3 | ||||
-rw-r--r-- | libempathy-gtk/empathy-theme-manager.c | 89 | ||||
-rw-r--r-- | po/POTFILES.in | 1 | ||||
-rw-r--r-- | po/es.po | 211 | ||||
-rw-r--r-- | po/nb.po | 623 | ||||
-rw-r--r-- | po/tr.po | 112 | ||||
-rw-r--r-- | src/empathy-chat-manager.c | 79 | ||||
-rw-r--r-- | src/empathy-chat-manager.h | 2 | ||||
-rw-r--r-- | src/empathy-chat-window.c | 3 | ||||
-rw-r--r-- | src/empathy-chat.c | 6 | ||||
-rw-r--r-- | src/empathy-main-window.c | 3 | ||||
-rw-r--r-- | src/empathy-notifications-approver.c | 3 | ||||
-rw-r--r-- | src/empathy-preferences.c | 250 | ||||
-rw-r--r-- | src/empathy-preferences.ui | 1427 |
19 files changed, 2283 insertions, 1405 deletions
diff --git a/configure.ac b/configure.ac index 91bd284eb..ec6b3f763 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/data/Template.html b/data/Template.html index 708e85bdb..79224b8de 100644 --- a/data/Template.html +++ b/data/Template.html @@ -3,66 +3,215 @@ <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 ) ) ); @@ -73,49 +222,74 @@ //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; @@ -126,31 +300,41 @@ 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> diff --git a/libempathy-gtk/empathy-individual-store.c b/libempathy-gtk/empathy-individual-store.c index 735e2db9d..b550245dc 100644 --- a/libempathy-gtk/empathy-individual-store.c +++ b/libempathy-gtk/empathy-individual-store.c @@ -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); } diff --git a/libempathy-gtk/empathy-individual-view.c b/libempathy-gtk/empathy-individual-view.c index cc9d49e86..fcbc93fa4 100644 --- a/libempathy-gtk/empathy-individual-view.c +++ b/libempathy-gtk/empathy-individual-view.c @@ -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) diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c index 2ab3383b3..e6cf03c86 100644 --- a/libempathy-gtk/empathy-theme-adium.c +++ b/libempathy-gtk/empathy-theme-adium.c @@ -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 { @@ -74,6 +76,13 @@ struct _EmpathyAdiumData { gchar *default_incoming_avatar_filename; gchar *default_outgoing_avatar_filename; gchar *template_html; + gchar *content_html; + gsize content_len; + GHashTable *info; + guint version; + gboolean custom_template; + + /* Legacy themes */ gchar *in_content_html; gsize in_content_len; gchar *in_context_html; @@ -92,7 +101,6 @@ struct _EmpathyAdiumData { gsize out_nextcontext_len; gchar *status_html; gsize status_len; - GHashTable *info; }; static void theme_adium_iface_init (EmpathyChatViewIface *iface); @@ -191,6 +199,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 +321,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,6 +383,32 @@ 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, @@ -366,7 +430,7 @@ theme_adium_append_html (EmpathyThemeAdium *theme, string = g_string_sized_new (len + 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 +444,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...) @@ -492,13 +560,25 @@ theme_adium_append_event_escaped (EmpathyChatView *view, { EmpathyThemeAdium *theme = EMPATHY_THEME_ADIUM (view); EmpathyThemeAdiumPriv *priv = GET_PRIV (theme); + gchar *html; + gsize len; + + html = priv->data->content_html; + len = priv->data->content_len; + + /* Fallback to legacy status_html */ + if (html == NULL) { + html = priv->data->status_html; + len = priv->data->status_len; + } - if (priv->data->status_html) { + if (html != NULL) { 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); + html, len, escaped, NULL, NULL, NULL, + NULL, "event", + empathy_time_get_current (), FALSE); + } else { + DEBUG ("Couldn't find HTML file for this event"); } /* There is no last contact */ @@ -587,10 +667,12 @@ theme_adium_append_message (EmpathyChatView *view, 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 +688,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,27 +762,34 @@ 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)) { + html = priv->data->content_html; + len = priv->data->content_len; + + /* Fallback to legacy Outgoing */ + if (html == NULL && empathy_contact_is_user (sender)) { if (consecutive) { if (is_backlog) { html = priv->data->out_nextcontext_html; @@ -782,8 +875,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 +893,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 +1132,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 +1141,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; + + 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)); + } - theme_adium_append_message (chat_view, message); - priv->message_queue = g_list_remove (priv->message_queue, message); - g_object_unref (message); + tp_g_value_slice_free (value); } + g_queue_clear (&priv->message_queue); } static void @@ -1319,6 +1430,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", @@ -1364,7 +1477,16 @@ empathy_adium_path_is_valid (const gchar *path) /* 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 + * 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) + return ret; + + /* Legacy themes have Incoming/Content.html (outgoing fallback to use * incoming). */ file = g_build_filename (path, "Contents", "Resources", "Incoming", "Content.html", NULL); @@ -1400,6 +1522,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) { @@ -1421,14 +1645,8 @@ 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; g_return_val_if_fail (empathy_adium_path_is_valid (path), NULL); @@ -1438,46 +1656,58 @@ 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); + + DEBUG ("Loading theme at %s", path); /* 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); + file = g_build_filename (data->basedir, "Content.html", NULL); + g_file_get_contents (file, &data->content_html, &data->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); + /* Fallback to legacy html files */ + if (data->content_html == NULL) { + DEBUG (" fallback to legacy theme"); - 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", "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", "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, "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, "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, "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, "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, "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", "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", "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", "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, "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, "Status.html", NULL); - g_file_get_contents (file, &data->status_html, &data->status_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_file_get_contents (file, &footer_html, NULL, NULL); g_free (file); file = g_build_filename (data->basedir, "Incoming", "buddy_icon.png", NULL); @@ -1494,65 +1724,46 @@ empathy_adium_data_new_with_info (const gchar *path, GHashTable *info) g_free (file); } - 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); + if (g_file_get_contents (file, &template_html, NULL, NULL)) { + data->custom_template = TRUE; } 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); + /* If there were no custom template, fallack to our own */ + if (template_html == NULL) { + data->custom_template = FALSE; file = empathy_file_lookup ("Template.html", "data"); - g_file_get_contents (file, &template_html, &template_len, NULL); + g_file_get_contents (file, &template_html, NULL, NULL); g_free (file); - strv = g_strsplit (template_html, "%@", -1); - len = g_strv_length (strv); } - /* 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) { + data->template_html = 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); + data->template_html = 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_free (variant_path); g_free (footer_html); g_free (template_html); - g_free (css_path); - g_strfreev (strv); return data; } @@ -1588,7 +1799,13 @@ 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->default_avatar_filename); + g_free (data->default_incoming_avatar_filename); + g_free (data->default_outgoing_avatar_filename); g_free (data->template_html); + g_free (data->content_html); + g_hash_table_unref (data->info); + g_free (data->in_content_html); g_free (data->in_nextcontent_html); g_free (data->in_context_html); @@ -1597,11 +1814,8 @@ empathy_adium_data_unref (EmpathyAdiumData *data) 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_slice_free (EmpathyAdiumData, data); } } diff --git a/libempathy-gtk/empathy-theme-adium.h b/libempathy-gtk/empathy-theme-adium.h index a8ed19de4..d0ad0170d 100644 --- a/libempathy-gtk/empathy-theme-adium.h +++ b/libempathy-gtk/empathy-theme-adium.h @@ -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; diff --git a/libempathy-gtk/empathy-theme-manager.c b/libempathy-gtk/empathy-theme-manager.c index 1a4f5ae47..0dcb40a70 100644 --- a/libempathy-gtk/empathy-theme-manager.c +++ b/libempathy-gtk/empathy-theme-manager.c @@ -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); } diff --git a/po/POTFILES.in b/po/POTFILES.in index 12bec0898..7a78f2558 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -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 @@ -8,9 +8,9 @@ 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" +"product=empathy&keywords=I18N+L10N&component=General\n" +"POT-Creation-Date: 2011-05-04 20:37+0000\n" +"PO-Revision-Date: 2011-05-04 22:39+0200\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Language-Team: Español <gnome-es-list@gnome.org>\n" "MIME-Version: 1.0\n" @@ -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" @@ -242,7 +242,7 @@ msgstr "La carpeta predeterminada donde guardar los archivos transferidos." #: ../data/org.gnome.Empathy.gschema.xml.in.h:49 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 msgid "The position for the chat window side pane" @@ -556,7 +556,6 @@ msgstr "Desconectado" #. translators: presence type is unknown #: ../libempathy/empathy-utils.c:316 -#| msgid "Unknown" msgctxt "presence" msgid "Unknown" msgstr "Desconocido" @@ -1311,8 +1310,8 @@ msgid "" "join a new chat room\"" msgstr "" "/say <mensaje>: enviar un <mensaje> a la conversación actual. Esto se usa " -"para enviar un mensaje comenzando por una «/». Por ejemplo: «/say /join se usa " -"para unirse a una sala de chat nueva»" +"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 msgid "" @@ -1366,7 +1365,6 @@ msgstr "Error al enviar el mensaje «%s»: %s" #: ../libempathy-gtk/empathy-chat.c:1306 #, c-format -#| msgid "Error sending message '%s': %s" msgid "Error sending message: %s" msgstr "Error al enviar el mensaje: %s" @@ -1383,43 +1381,43 @@ msgstr "El tema se ha establecido a: %s" msgid "No topic defined" msgstr "No se ha definido el tema" -#: ../libempathy-gtk/empathy-chat.c:1880 +#: ../libempathy-gtk/empathy-chat.c:1888 msgid "(No Suggestions)" msgstr "(Sin sugerencias)" #. 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 "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:1993 #, 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:2050 msgid "Insert Smiley" msgstr "Insertar emoticono" #. send button -#: ../libempathy-gtk/empathy-chat.c:2060 +#: ../libempathy-gtk/empathy-chat.c:2068 #: ../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:2103 msgid "_Spelling Suggestions" msgstr "_Sugerencias ortográficas" -#: ../libempathy-gtk/empathy-chat.c:2184 +#: ../libempathy-gtk/empathy-chat.c:2192 msgid "Failed to retrieve recent logs" msgstr "Falló al recibir los registros recientes" -#: ../libempathy-gtk/empathy-chat.c:2295 +#: ../libempathy-gtk/empathy-chat.c:2303 #, c-format msgid "%s has disconnected" msgstr "%s se ha desconectado" @@ -1427,12 +1425,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:2310 #, 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:2313 #, c-format msgid "%s was kicked" msgstr "%s fue expulsado" @@ -1440,17 +1438,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:2321 #, 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:2324 #, c-format msgid "%s was banned" msgstr "%s fue vetado" -#: ../libempathy-gtk/empathy-chat.c:2320 +#: ../libempathy-gtk/empathy-chat.c:2328 #, c-format msgid "%s has left the room" msgstr "%s ha dejado la sala" @@ -1460,62 +1458,62 @@ 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: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 ha entrado en la sala" -#: ../libempathy-gtk/empathy-chat.c:2379 +#: ../libempathy-gtk/empathy-chat.c:2387 #, 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:2526 #: ../src/empathy-streamed-media-window.c:1957 #: ../src/empathy-event-manager.c:1126 msgid "Disconnected" msgstr "Desconectado" #. Add message -#: ../libempathy-gtk/empathy-chat.c:3148 +#: ../libempathy-gtk/empathy-chat.c:3158 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:3164 msgid "Remember" msgstr "Recordar" -#: ../libempathy-gtk/empathy-chat.c:3164 +#: ../libempathy-gtk/empathy-chat.c:3174 msgid "Not now" msgstr "Ahora no" -#: ../libempathy-gtk/empathy-chat.c:3208 +#: ../libempathy-gtk/empathy-chat.c:3218 msgid "Retry" msgstr "Volver a intentarlo" -#: ../libempathy-gtk/empathy-chat.c:3212 +#: ../libempathy-gtk/empathy-chat.c:3222 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:3339 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:3366 msgid "Join" msgstr "Unirse" -#: ../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 "Conectado" -#: ../libempathy-gtk/empathy-chat.c:3579 +#: ../libempathy-gtk/empathy-chat.c:3589 #: ../libempathy-gtk/empathy-log-window.c:650 msgid "Conversation" msgstr "Conversación" @@ -1557,13 +1555,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:1066 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:1073 msgid "_Open Link" msgstr "_Abrir enlace" @@ -1633,33 +1631,33 @@ 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" @@ -1995,7 +1993,7 @@ msgid "Select" msgstr "Seleccionar" #: ../libempathy-gtk/empathy-groups-widget.c:408 -#: ../src/empathy-main-window.c:1436 +#: ../src/empathy-main-window.c:1439 msgid "Group" msgstr "Grupo" @@ -2050,11 +2048,11 @@ 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 " @@ -2333,19 +2331,24 @@ 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:1535 +#| msgid "N_ormal Size" +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" @@ -3063,25 +3066,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" @@ -3466,7 +3465,7 @@ msgstr "Le han invitado a unirse a %s" 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:1020 ../src/empathy-main-window.c:373 msgid "Password required" msgstr "Se requiere una contraseña" @@ -3622,39 +3621,39 @@ msgstr "Protocolo" msgid "Source" msgstr "Origen" -#: ../src/empathy-main-window.c:387 +#: ../src/empathy-main-window.c:390 msgid "Provide Password" msgstr "Escriba su contraseña" -#: ../src/empathy-main-window.c:393 +#: ../src/empathy-main-window.c:396 msgid "Disconnect" msgstr "Desconectar" -#: ../src/empathy-main-window.c:533 +#: ../src/empathy-main-window.c:536 msgid "No match found" msgstr "No se encontró ninguna coincidencia" -#: ../src/empathy-main-window.c:688 +#: ../src/empathy-main-window.c:691 msgid "Reconnect" msgstr "Reconectar" -#: ../src/empathy-main-window.c:694 +#: ../src/empathy-main-window.c:697 msgid "Edit Account" msgstr "Editar cuenta" -#: ../src/empathy-main-window.c:700 +#: ../src/empathy-main-window.c:703 msgid "Close" msgstr "Cerrar" -#: ../src/empathy-main-window.c:1418 +#: ../src/empathy-main-window.c:1421 msgid "Contact" msgstr "Contacto" -#: ../src/empathy-main-window.c:1765 +#: ../src/empathy-main-window.c:1768 msgid "Contact List" msgstr "Lista de contactos" -#: ../src/empathy-main-window.c:1881 +#: ../src/empathy-main-window.c:1884 msgid "Show and edit accounts" msgstr "Mostrar y editar cuentas" @@ -3813,39 +3812,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:454 msgid "Language" msgstr "Idioma" -#: ../src/empathy-preferences.c:875 +#. translators: Contact name for the chat theme preview +#: ../src/empathy-preferences.c:704 +msgid "Juliet" +msgstr "Julieta" + +#. 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 "¡Oh, Romeo, Romeo!, ¿dónde estás que no te veo?" + +#. translators: Quote from Romeo & Julier, for chat theme preview +#: ../src/empathy-preferences.c:720 +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:723 +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:726 +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:729 +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:732 +msgid "Juliet has disconnected" +msgstr "Julieta se ha desconectado" + +#: ../src/empathy-preferences.c:966 msgid "Preferences" msgstr "Preferencias" @@ -3948,43 +3987,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 +4192,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" @@ -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" @@ -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" diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c index 544ede69f..a90c2d08c 100644 --- a/src/empathy-chat-manager.c +++ b/src/empathy-chat-manager.c @@ -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; }; @@ -100,11 +100,28 @@ chat_data_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; @@ -125,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); @@ -192,24 +219,6 @@ tp_chat_ready_cb (GObject *object, } 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, TpConnection *connection, @@ -220,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)) { @@ -239,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); @@ -255,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 @@ -388,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, @@ -460,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; -} diff --git a/src/empathy-chat-manager.h b/src/empathy-chat-manager.h index ee43857f4..6d249b3e4 100644 --- a/src/empathy-chat-manager.h +++ b/src/empathy-chat-manager.h @@ -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__*/ diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c index ac97601ce..7faeb2793 100644 --- a/src/empathy-chat-window.c +++ b/src/empathy-chat-window.c @@ -1354,8 +1354,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"); } } diff --git a/src/empathy-chat.c b/src/empathy-chat.c index 73d8ce87c..43ab00270 100644 --- a/src/empathy-chat.c +++ b/src/empathy-chat.c @@ -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 diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c index b4c1254df..851a424ea 100644 --- a/src/empathy-main-window.c +++ b/src/empathy-main-window.c @@ -220,6 +220,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 +242,7 @@ main_window_flash_foreach (GtkTreeModel *model, g_object_unref (individual); tp_clear_object (&contact); + tp_clear_object (&pixbuf); return FALSE; } diff --git a/src/empathy-notifications-approver.c b/src/empathy-notifications-approver.c index a87a6d30e..ec1e65c24 100644 --- a/src/empathy-notifications-approver.c +++ b/src/empathy-notifications-approver.c @@ -335,8 +335,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)) diff --git a/src/empathy-preferences.c b/src/empathy-preferences.c index 813637dca..52bc3de7a 100644 --- a/src/empathy-preferences.c +++ b/src/empathy-preferences.c @@ -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 { @@ -646,6 +654,124 @@ preferences_languages_cell_toggled_cb (GtkCellRendererToggle *cell, } 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, gpointer user_data) @@ -658,38 +784,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. */ @@ -704,38 +826,6 @@ preferences_theme_notify_cb (GSettings *gsettings, } 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) { EmpathyPreferencesPriv *priv = GET_PRIV (preferences); @@ -751,22 +841,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 +871,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 +885,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 +921,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 +974,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 +1011,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); diff --git a/src/empathy-preferences.ui b/src/empathy-preferences.ui index 4acc6f3c7..6bc17b761 100644 --- a/src/empathy-preferences.ui +++ b/src/empathy-preferences.ui @@ -1,308 +1,606 @@ -<?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> @@ -313,500 +611,355 @@ </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> |