aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--data/Template.html354
-rw-r--r--libempathy-gtk/empathy-individual-store.c7
-rw-r--r--libempathy-gtk/empathy-individual-view.c53
-rw-r--r--libempathy-gtk/empathy-theme-adium.c460
-rw-r--r--libempathy-gtk/empathy-theme-adium.h3
-rw-r--r--libempathy-gtk/empathy-theme-manager.c89
-rw-r--r--po/POTFILES.in1
-rw-r--r--po/es.po211
-rw-r--r--po/nb.po623
-rw-r--r--po/tr.po112
-rw-r--r--src/empathy-chat-manager.c79
-rw-r--r--src/empathy-chat-manager.h2
-rw-r--r--src/empathy-chat-window.c3
-rw-r--r--src/empathy-chat.c6
-rw-r--r--src/empathy-main-window.c3
-rw-r--r--src/empathy-notifications-approver.c3
-rw-r--r--src/empathy-preferences.c250
-rw-r--r--src/empathy-preferences.ui1427
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
diff --git a/po/es.po b/po/es.po
index cacaa6341..7d0fe4022 100644
--- a/po/es.po
+++ b/po/es.po
@@ -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"
diff --git a/po/nb.po b/po/nb.po
index e7f05be23..183b6ed3d 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: empathy 2.92.x\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-20 11:24+0100\n"
-"PO-Revision-Date: 2011-03-17 09:53+0100\n"
+"POT-Creation-Date: 2011-05-04 11:11+0200\n"
+"PO-Revision-Date: 2011-05-04 11:14+0200\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: no\n"
@@ -441,7 +441,7 @@ msgstr "Håndter meldings- og VoIP-kontoer"
#. Tweak the dialog
#: ../data/empathy-accounts.desktop.in.in.h:2
-#: ../src/empathy-accounts-dialog.c:2242
+#: ../src/empathy-accounts-dialog.c:2340
msgid "Messaging and VoIP Accounts"
msgstr "Meldings- og VoIP-kontoer"
@@ -489,7 +489,7 @@ msgstr "Feil under overføring av filen"
msgid "The other participant is unable to transfer the file"
msgstr "Avsender kan ikke overføre filen"
-#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:382
+#: ../libempathy/empathy-tp-file.c:405 ../libempathy/empathy-utils.c:383
msgid "Unknown reason"
msgstr "Ukjent årsak"
@@ -513,120 +513,117 @@ msgstr "Usynlig"
msgid "Offline"
msgstr "Frakoblet"
-#: ../libempathy/empathy-utils.c:315
-#: ../src/empathy-streamed-media-window.c:1904
-#: ../src/empathy-streamed-media-window.c:1905
-#: ../src/empathy-streamed-media-window.c:1906
-#: ../src/empathy-streamed-media-window.c:1907
-#: ../src/empathy-call-window.ui.h:18
+#. translators: presence type is unknown
+#: ../libempathy/empathy-utils.c:316
+msgctxt "presence"
msgid "Unknown"
msgstr "Ukjent"
-#: ../libempathy/empathy-utils.c:354
+#: ../libempathy/empathy-utils.c:355
msgid "No reason specified"
msgstr "Ingen årsak oppgitt"
-#: ../libempathy/empathy-utils.c:356 ../libempathy/empathy-utils.c:412
+#: ../libempathy/empathy-utils.c:357 ../libempathy/empathy-utils.c:413
msgid "Status is set to offline"
msgstr "Status er satt til frakoblet"
-#: ../libempathy/empathy-utils.c:358 ../libempathy/empathy-utils.c:392
+#: ../libempathy/empathy-utils.c:359 ../libempathy/empathy-utils.c:393
msgid "Network error"
msgstr "Nettverksfeil"
-#: ../libempathy/empathy-utils.c:360 ../libempathy/empathy-utils.c:394
+#: ../libempathy/empathy-utils.c:361 ../libempathy/empathy-utils.c:395
msgid "Authentication failed"
msgstr "Autentiseringen feilet"
-#: ../libempathy/empathy-utils.c:362 ../libempathy/empathy-utils.c:396
+#: ../libempathy/empathy-utils.c:363 ../libempathy/empathy-utils.c:397
msgid "Encryption error"
msgstr "Krypteringsfeil"
-#: ../libempathy/empathy-utils.c:364
+#: ../libempathy/empathy-utils.c:365
msgid "Name in use"
msgstr "Navn i bruk"
-#: ../libempathy/empathy-utils.c:366 ../libempathy/empathy-utils.c:398
+#: ../libempathy/empathy-utils.c:367 ../libempathy/empathy-utils.c:399
msgid "Certificate not provided"
msgstr "Sertifikat ikke oppgitt"
-#: ../libempathy/empathy-utils.c:368 ../libempathy/empathy-utils.c:400
+#: ../libempathy/empathy-utils.c:369 ../libempathy/empathy-utils.c:401
msgid "Certificate untrusted"
msgstr "Stoler ikke på sertifikat"
-#: ../libempathy/empathy-utils.c:370 ../libempathy/empathy-utils.c:402
+#: ../libempathy/empathy-utils.c:371 ../libempathy/empathy-utils.c:403
msgid "Certificate expired"
msgstr "Sertifikat utgått"
-#: ../libempathy/empathy-utils.c:372 ../libempathy/empathy-utils.c:404
+#: ../libempathy/empathy-utils.c:373 ../libempathy/empathy-utils.c:405
msgid "Certificate not activated"
msgstr "Sertifikat ikke aktivert"
-#: ../libempathy/empathy-utils.c:374 ../libempathy/empathy-utils.c:406
+#: ../libempathy/empathy-utils.c:375 ../libempathy/empathy-utils.c:407
msgid "Certificate hostname mismatch"
msgstr "Feil vertsnavn i forhold til sertifikat"
-#: ../libempathy/empathy-utils.c:376 ../libempathy/empathy-utils.c:408
+#: ../libempathy/empathy-utils.c:377 ../libempathy/empathy-utils.c:409
msgid "Certificate fingerprint mismatch"
msgstr "Fingeravtrykk stemmer ikke for sertifikat"
-#: ../libempathy/empathy-utils.c:378 ../libempathy/empathy-utils.c:410
+#: ../libempathy/empathy-utils.c:379 ../libempathy/empathy-utils.c:411
msgid "Certificate self-signed"
msgstr "Selvsignert sertifikat"
-#: ../libempathy/empathy-utils.c:380
+#: ../libempathy/empathy-utils.c:381
msgid "Certificate error"
msgstr "Sertifikatsfeil"
-#: ../libempathy/empathy-utils.c:414
+#: ../libempathy/empathy-utils.c:415
msgid "Encryption is not available"
msgstr "Kryptering er ikke tilgjengelig"
-#: ../libempathy/empathy-utils.c:416
+#: ../libempathy/empathy-utils.c:417
msgid "Certificate is invalid"
msgstr "Sertifikatet ikke ugyldig"
-#: ../libempathy/empathy-utils.c:418
+#: ../libempathy/empathy-utils.c:419
msgid "Connection has been refused"
msgstr "Tilkobling nektes"
-#: ../libempathy/empathy-utils.c:420
+#: ../libempathy/empathy-utils.c:421
msgid "Connection can't be established"
msgstr "Tilkobling kan ikke etableres"
-#: ../libempathy/empathy-utils.c:422
+#: ../libempathy/empathy-utils.c:423
msgid "Connection has been lost"
msgstr "Tilkobling mistet"
-#: ../libempathy/empathy-utils.c:424
+#: ../libempathy/empathy-utils.c:425
msgid "This resource is already connected to the server"
msgstr "Denne ressursen er allerede koblet til tjeneren"
-#: ../libempathy/empathy-utils.c:426
+#: ../libempathy/empathy-utils.c:427
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr ""
"Tilkoblingen er erstattet med en ny tilkobling som bruker samme ressurs"
-#: ../libempathy/empathy-utils.c:429
+#: ../libempathy/empathy-utils.c:430
msgid "The account already exists on the server"
msgstr "Kontoen eksisterer allerede på tjeneren"
-#: ../libempathy/empathy-utils.c:431
+#: ../libempathy/empathy-utils.c:432
msgid "Server is currently too busy to handle the connection"
msgstr "Tjeneren er for opptatt til å håndtere tilkoblingen"
-#: ../libempathy/empathy-utils.c:433
+#: ../libempathy/empathy-utils.c:434
msgid "Certificate has been revoked"
msgstr "Sertifikatet er trukket tilbake"
-#: ../libempathy/empathy-utils.c:435
+#: ../libempathy/empathy-utils.c:436
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"Sertifikatet bruker en usikker cipher-algoritme eller er kryptografisk svakt"
-#: ../libempathy/empathy-utils.c:438
+#: ../libempathy/empathy-utils.c:439
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
@@ -634,66 +631,66 @@ msgstr ""
"Lengden på tjenersertifikatet eller dybden på sertifikatkjeden på tjeneren "
"oversteg grensen som settes av kryptografibiblioteket"
-#: ../libempathy/empathy-utils.c:601
+#: ../libempathy/empathy-utils.c:602
#: ../libempathy-gtk/empathy-contact-list-store.h:73
msgid "People Nearby"
msgstr "Personer i nærheten"
-#: ../libempathy/empathy-utils.c:606
+#: ../libempathy/empathy-utils.c:607
msgid "Yahoo! Japan"
msgstr "Yahoo! Japan"
-#: ../libempathy/empathy-utils.c:635
+#: ../libempathy/empathy-utils.c:636
msgid "Google Talk"
msgstr "Google Talk"
-#: ../libempathy/empathy-utils.c:636
+#: ../libempathy/empathy-utils.c:637
msgid "Facebook Chat"
msgstr "Facebook-prat"
-#: ../libempathy/empathy-time.c:137
+#: ../libempathy/empathy-time.c:100
#, c-format
msgid "%d second ago"
msgid_plural "%d seconds ago"
msgstr[0] "%d sekund siden"
msgstr[1] "%d sekunder siden"
-#: ../libempathy/empathy-time.c:142
+#: ../libempathy/empathy-time.c:105
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minutt siden"
msgstr[1] "%d minutter siden"
-#: ../libempathy/empathy-time.c:147
+#: ../libempathy/empathy-time.c:110
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d time siden"
msgstr[1] "%d timer siden"
-#: ../libempathy/empathy-time.c:152
+#: ../libempathy/empathy-time.c:115
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d dag siden"
msgstr[1] "%d dager siden"
-#: ../libempathy/empathy-time.c:157
+#: ../libempathy/empathy-time.c:120
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d uke siden"
msgstr[1] "%d uker siden"
-#: ../libempathy/empathy-time.c:162
+#: ../libempathy/empathy-time.c:125
#, c-format
msgid "%d month ago"
msgid_plural "%d months ago"
msgstr[0] "%d måned siden"
msgstr[1] "%d måneder siden"
-#: ../libempathy/empathy-time.c:167
+#: ../libempathy/empathy-time.c:130
msgid "in the future"
msgstr "i fremtiden"
@@ -701,83 +698,67 @@ msgstr "i fremtiden"
msgid "All"
msgstr "Alle"
-#: ../libempathy-gtk/empathy-account-widget.c:682
+#: ../libempathy-gtk/empathy-account-widget.c:678
#: ../libempathy-gtk/empathy-log-window.c:643
#: ../src/empathy-import-widget.c:321
msgid "Account"
msgstr "Konto"
-#: ../libempathy-gtk/empathy-account-widget.c:683
+#: ../libempathy-gtk/empathy-account-widget.c:679
msgid "Password"
msgstr "Passord"
-#: ../libempathy-gtk/empathy-account-widget.c:684
+#: ../libempathy-gtk/empathy-account-widget.c:680
#: ../libempathy-gtk/empathy-irc-network-dialog.c:507
msgid "Server"
msgstr "Tjener"
-#: ../libempathy-gtk/empathy-account-widget.c:685
+#: ../libempathy-gtk/empathy-account-widget.c:681
#: ../libempathy-gtk/empathy-irc-network-dialog.c:522
msgid "Port"
msgstr "Port"
-#: ../libempathy-gtk/empathy-account-widget.c:757
-#: ../libempathy-gtk/empathy-account-widget.c:814
+#: ../libempathy-gtk/empathy-account-widget.c:753
+#: ../libempathy-gtk/empathy-account-widget.c:810
#, c-format
msgid "%s:"
msgstr "%s:"
-#: ../libempathy-gtk/empathy-account-widget.c:1166
+#: ../libempathy-gtk/empathy-account-widget.c:1151
#, c-format
msgid "The account %s is edited via My Web Accounts."
msgstr "Konto %s er redigert via Mine nettkontoer."
-#: ../libempathy-gtk/empathy-account-widget.c:1172
+#: ../libempathy-gtk/empathy-account-widget.c:1157
#, c-format
msgid "The account %s cannot be edited in Empathy."
msgstr "Konto %s kan ikke redigeres i Empathy."
-#: ../libempathy-gtk/empathy-account-widget.c:1192
+#: ../libempathy-gtk/empathy-account-widget.c:1177
msgid "Launch My Web Accounts"
msgstr "Start Mine nettkontoer"
-#: ../libempathy-gtk/empathy-account-widget.c:1530
+#: ../libempathy-gtk/empathy-account-widget.c:1515
msgid "Username:"
msgstr "Brukernavn:"
-#: ../libempathy-gtk/empathy-account-widget.c:1897
+#: ../libempathy-gtk/empathy-account-widget.c:1833
msgid "A_pply"
msgstr "_Bruk"
-#: ../libempathy-gtk/empathy-account-widget.c:1927
+#: ../libempathy-gtk/empathy-account-widget.c:1863
msgid "L_og in"
msgstr "L_ogg inn"
-#. Account and Identifier
-#: ../libempathy-gtk/empathy-account-widget.c:1993
-#: ../libempathy-gtk/empathy-contact-blocking-dialog.ui.h:1
-#: ../libempathy-gtk/empathy-contact-search-dialog.c:520
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
-#: ../libempathy-gtk/empathy-individual-widget.c:1481
-#: ../libempathy-gtk/empathy-contact-selector-dialog.ui.h:1
-#: ../src/empathy-chatrooms-window.ui.h:1
-#: ../src/empathy-new-chatroom-dialog.ui.h:1
-msgid "Account:"
-msgstr "Konto:"
-
-#: ../libempathy-gtk/empathy-account-widget.c:2004
-msgid "_Enabled"
-msgstr "Slått _på"
-
-#: ../libempathy-gtk/empathy-account-widget.c:2069
+#: ../libempathy-gtk/empathy-account-widget.c:1937
msgid "This account already exists on the server"
msgstr "Denne kontoen eksisterer allerede på tjeneren"
-#: ../libempathy-gtk/empathy-account-widget.c:2072
+#: ../libempathy-gtk/empathy-account-widget.c:1940
msgid "Create a new account on the server"
msgstr "Lag en ny konto på tjeneren"
-#: ../libempathy-gtk/empathy-account-widget.c:2264
+#: ../libempathy-gtk/empathy-account-widget.c:2132
msgid "Ca_ncel"
msgstr "A_vbryt"
@@ -786,19 +767,19 @@ msgstr "A_vbryt"
#. * like: "MyUserName on freenode".
#. * You should reverse the order of these arguments if the
#. * server should come before the login id in your locale.
-#: ../libempathy-gtk/empathy-account-widget.c:2561
+#: ../libempathy-gtk/empathy-account-widget.c:2413
#, c-format
msgid "%1$s on %2$s"
msgstr "%1$s av %2$s"
#. To translators: The parameter is the protocol name. The resulting
#. * string will be something like: "Jabber Account"
-#: ../libempathy-gtk/empathy-account-widget.c:2587
+#: ../libempathy-gtk/empathy-account-widget.c:2439
#, c-format
msgid "%s Account"
msgstr "%s-konto"
-#: ../libempathy-gtk/empathy-account-widget.c:2591
+#: ../libempathy-gtk/empathy-account-widget.c:2443
msgid "New account"
msgstr "Ny konto"
@@ -1238,23 +1219,23 @@ msgstr "Emne er ikke støttet for denne samtalen"
msgid "You are not allowed to change the topic"
msgstr "Du har ikke lov til å bytte emne"
-#: ../libempathy-gtk/empathy-chat.c:906
+#: ../libempathy-gtk/empathy-chat.c:932
msgid "/clear: clear all messages from the current conversation"
msgstr "/clear: tøm alle meldinger fra aktiv samtale"
-#: ../libempathy-gtk/empathy-chat.c:909
+#: ../libempathy-gtk/empathy-chat.c:935
msgid "/topic <topic>: set the topic of the current conversation"
msgstr "/topic <emne>: sett emne for aktiv samtale"
-#: ../libempathy-gtk/empathy-chat.c:912
+#: ../libempathy-gtk/empathy-chat.c:938
msgid "/join <chat room ID>: join a new chat room"
msgstr "/join <ID for praterom>: bli med i et nytt praterom"
-#: ../libempathy-gtk/empathy-chat.c:915
+#: ../libempathy-gtk/empathy-chat.c:941
msgid "/j <chat room ID>: join a new chat room"
msgstr "/j <prateroms-ID>: bli med i et nytt praterom"
-#: ../libempathy-gtk/empathy-chat.c:920
+#: ../libempathy-gtk/empathy-chat.c:946
msgid ""
"/part [<chat room ID>] [<reason>]: leave the chat room, by default the "
"current one"
@@ -1262,23 +1243,23 @@ msgstr ""
"/part [<praterom-ID>] [<årsak>]: forlat praterommet, forvalg er det aktive "
"rommet"
-#: ../libempathy-gtk/empathy-chat.c:925
+#: ../libempathy-gtk/empathy-chat.c:951
msgid "/query <contact ID> [<message>]: open a private chat"
msgstr "/query <kontakt-ID> [<melding>]: åpne en privat samtale"
-#: ../libempathy-gtk/empathy-chat.c:928
+#: ../libempathy-gtk/empathy-chat.c:954
msgid "/msg <contact ID> <message>: open a private chat"
msgstr "/msg <kontakt-ID> <melding>: åpne en privat samtale"
-#: ../libempathy-gtk/empathy-chat.c:931
+#: ../libempathy-gtk/empathy-chat.c:957
msgid "/nick <nickname>: change your nickname on the current server"
msgstr "/nick <kallenavn>: bytt kallenavn på denne tjeneren"
-#: ../libempathy-gtk/empathy-chat.c:934
+#: ../libempathy-gtk/empathy-chat.c:960
msgid "/me <message>: send an ACTION message to the current conversation"
msgstr "/me <melding>: send en HANDLINGS-melding til aktiv samtale"
-#: ../libempathy-gtk/empathy-chat.c:937
+#: ../libempathy-gtk/empathy-chat.c:963
msgid ""
"/say <message>: send <message> to the current conversation. This is used to "
"send a message starting with a '/'. For example: \"/say /join is used to "
@@ -1288,7 +1269,7 @@ msgstr ""
"sende en melding som starter med tegnet «/». For eksempel: «/say /join "
"brukes til å bli med i et nytt praterom»"
-#: ../libempathy-gtk/empathy-chat.c:942
+#: ../libempathy-gtk/empathy-chat.c:968
msgid ""
"/help [<command>]: show all supported commands. If <command> is defined, "
"show its usage."
@@ -1296,98 +1277,103 @@ msgstr ""
"/help [<kommando>]: vis alle støttede kommandoer. Vis hjelp for <kommando> "
"hvis den er definert."
-#: ../libempathy-gtk/empathy-chat.c:952
+#: ../libempathy-gtk/empathy-chat.c:978
#, c-format
msgid "Usage: %s"
msgstr "Bruk: %s"
-#: ../libempathy-gtk/empathy-chat.c:991
+#: ../libempathy-gtk/empathy-chat.c:1017
msgid "Unknown command"
msgstr "Ukjent kommando"
-#: ../libempathy-gtk/empathy-chat.c:1117
+#: ../libempathy-gtk/empathy-chat.c:1143
msgid "Unknown command; see /help for the available commands"
msgstr "Ukjent kommando; se /help for tilgjengelige kommandoer"
-#: ../libempathy-gtk/empathy-chat.c:1254
+#: ../libempathy-gtk/empathy-chat.c:1281
msgid "offline"
msgstr "frakoblet"
-#: ../libempathy-gtk/empathy-chat.c:1257
+#: ../libempathy-gtk/empathy-chat.c:1284
msgid "invalid contact"
msgstr "ugyldig kontakt"
-#: ../libempathy-gtk/empathy-chat.c:1260
+#: ../libempathy-gtk/empathy-chat.c:1287
msgid "permission denied"
msgstr "tilgang nektet"
-#: ../libempathy-gtk/empathy-chat.c:1263
+#: ../libempathy-gtk/empathy-chat.c:1290
msgid "too long message"
msgstr "meldingen er for lang"
-#: ../libempathy-gtk/empathy-chat.c:1266
+#: ../libempathy-gtk/empathy-chat.c:1293
msgid "not implemented"
msgstr "ikke implementert"
-#: ../libempathy-gtk/empathy-chat.c:1270
+#: ../libempathy-gtk/empathy-chat.c:1297
msgid "unknown"
msgstr "ukjent"
-#: ../libempathy-gtk/empathy-chat.c:1274
+#: ../libempathy-gtk/empathy-chat.c:1302
#, c-format
msgid "Error sending message '%s': %s"
msgstr "Feil ved sending av melding «%s»: %s"
-#: ../libempathy-gtk/empathy-chat.c:1335 ../src/empathy-chat-window.c:717
+#: ../libempathy-gtk/empathy-chat.c:1306
+#, c-format
+msgid "Error sending message: %s"
+msgstr "Feil ved sending av melding: %s"
+
+#: ../libempathy-gtk/empathy-chat.c:1367 ../src/empathy-chat-window.c:717
msgid "Topic:"
msgstr "Emne:"
-#: ../libempathy-gtk/empathy-chat.c:1347
+#: ../libempathy-gtk/empathy-chat.c:1379
#, c-format
msgid "Topic set to: %s"
msgstr "Emnet er satt til: %s"
-#: ../libempathy-gtk/empathy-chat.c:1349
+#: ../libempathy-gtk/empathy-chat.c:1381
msgid "No topic defined"
msgstr "Emne ikke definert"
-#: ../libempathy-gtk/empathy-chat.c:1848
+#: ../libempathy-gtk/empathy-chat.c:1888
msgid "(No Suggestions)"
msgstr "(Ingen forslag)"
#. translators: %s is the selected word
-#: ../libempathy-gtk/empathy-chat.c:1916
+#: ../libempathy-gtk/empathy-chat.c:1956
#, c-format
msgid "Add '%s' to Dictionary"
msgstr "Legg til «%s» i ordboken"
#. translators: first %s is the selected word,
#. * second %s is the language name of the target dictionary
-#: ../libempathy-gtk/empathy-chat.c:1953
+#: ../libempathy-gtk/empathy-chat.c:1993
#, c-format
msgid "Add '%s' to %s Dictionary"
msgstr "Legg til «%s» i ordbok for %s"
-#: ../libempathy-gtk/empathy-chat.c:2010
+#: ../libempathy-gtk/empathy-chat.c:2050
msgid "Insert Smiley"
msgstr "Sett inn smilefjes"
#. send button
-#: ../libempathy-gtk/empathy-chat.c:2028
+#: ../libempathy-gtk/empathy-chat.c:2068
#: ../libempathy-gtk/empathy-ui-utils.c:1808
msgid "_Send"
msgstr "_Send"
#. Spelling suggestions
-#: ../libempathy-gtk/empathy-chat.c:2063
+#: ../libempathy-gtk/empathy-chat.c:2103
msgid "_Spelling Suggestions"
msgstr "_Staveforslag"
-#: ../libempathy-gtk/empathy-chat.c:2152
+#: ../libempathy-gtk/empathy-chat.c:2192
msgid "Failed to retrieve recent logs"
msgstr "Klarte ikke å hente siste logger"
-#: ../libempathy-gtk/empathy-chat.c:2263
+#: ../libempathy-gtk/empathy-chat.c:2303
#, c-format
msgid "%s has disconnected"
msgstr "%s har koblet fra"
@@ -1395,12 +1381,12 @@ msgstr "%s har koblet fra"
#. translators: reverse the order of these arguments
#. * if the kicked should come before the kicker in your locale.
#.
-#: ../libempathy-gtk/empathy-chat.c:2270
+#: ../libempathy-gtk/empathy-chat.c:2310
#, c-format
msgid "%1$s was kicked by %2$s"
msgstr "%1$s ble sparket av %2$s"
-#: ../libempathy-gtk/empathy-chat.c:2273
+#: ../libempathy-gtk/empathy-chat.c:2313
#, c-format
msgid "%s was kicked"
msgstr "%s ble sparket"
@@ -1408,17 +1394,17 @@ msgstr "%s ble sparket"
#. translators: reverse the order of these arguments
#. * if the banned should come before the banner in your locale.
#.
-#: ../libempathy-gtk/empathy-chat.c:2281
+#: ../libempathy-gtk/empathy-chat.c:2321
#, c-format
msgid "%1$s was banned by %2$s"
msgstr "%1$s ble bannlyst av %2$s"
-#: ../libempathy-gtk/empathy-chat.c:2284
+#: ../libempathy-gtk/empathy-chat.c:2324
#, c-format
msgid "%s was banned"
msgstr "%s ble bannlyst"
-#: ../libempathy-gtk/empathy-chat.c:2288
+#: ../libempathy-gtk/empathy-chat.c:2328
#, c-format
msgid "%s has left the room"
msgstr "%s har forlatt rommet"
@@ -1428,62 +1414,62 @@ msgstr "%s har forlatt rommet"
#. * given by the user living the room. If this poses a problem,
#. * please let us know. :-)
#.
-#: ../libempathy-gtk/empathy-chat.c:2297
+#: ../libempathy-gtk/empathy-chat.c:2337
#, c-format
msgid " (%s)"
msgstr " (%s)"
-#: ../libempathy-gtk/empathy-chat.c:2322
+#: ../libempathy-gtk/empathy-chat.c:2362
#, c-format
msgid "%s has joined the room"
msgstr "%s har blitt med i rommet"
-#: ../libempathy-gtk/empathy-chat.c:2347
+#: ../libempathy-gtk/empathy-chat.c:2387
#, c-format
msgid "%s is now known as %s"
msgstr "%s er nå kjent som %s"
-#: ../libempathy-gtk/empathy-chat.c:2486
-#: ../src/empathy-streamed-media-window.c:1949
-#: ../src/empathy-event-manager.c:1122
+#: ../libempathy-gtk/empathy-chat.c:2526
+#: ../src/empathy-streamed-media-window.c:1957
+#: ../src/empathy-event-manager.c:1126
msgid "Disconnected"
msgstr "Koblet fra"
#. Add message
-#: ../libempathy-gtk/empathy-chat.c:3116
+#: ../libempathy-gtk/empathy-chat.c:3158
msgid "Would you like to store this password?"
msgstr "Vil du lagre dette passordet?"
-#: ../libempathy-gtk/empathy-chat.c:3122
+#: ../libempathy-gtk/empathy-chat.c:3164
msgid "Remember"
msgstr "Husk"
-#: ../libempathy-gtk/empathy-chat.c:3132
+#: ../libempathy-gtk/empathy-chat.c:3174
msgid "Not now"
msgstr "Ikke nå"
-#: ../libempathy-gtk/empathy-chat.c:3176
+#: ../libempathy-gtk/empathy-chat.c:3218
msgid "Retry"
msgstr "Prøv igjen"
-#: ../libempathy-gtk/empathy-chat.c:3180
+#: ../libempathy-gtk/empathy-chat.c:3222
msgid "Wrong password; please try again:"
msgstr "Feil passord; vennligst prøv igjen:"
#. Add message
-#: ../libempathy-gtk/empathy-chat.c:3297
+#: ../libempathy-gtk/empathy-chat.c:3339
msgid "This room is protected by a password:"
msgstr "Dette rommet er beskyttet med et passord:"
-#: ../libempathy-gtk/empathy-chat.c:3324
+#: ../libempathy-gtk/empathy-chat.c:3366
msgid "Join"
msgstr "Bli med"
-#: ../libempathy-gtk/empathy-chat.c:3494 ../src/empathy-event-manager.c:1144
+#: ../libempathy-gtk/empathy-chat.c:3536 ../src/empathy-event-manager.c:1147
msgid "Connected"
msgstr "Koblet til"
-#: ../libempathy-gtk/empathy-chat.c:3547
+#: ../libempathy-gtk/empathy-chat.c:3589
#: ../libempathy-gtk/empathy-log-window.c:650
msgid "Conversation"
msgstr "Samtale"
@@ -1512,21 +1498,32 @@ msgstr "Kunne ikke blokkere kontakt"
msgid "Edit Blocked Contacts"
msgstr "Rediger blokkerte kontakter"
+#. Account and Identifier
+#: ../libempathy-gtk/empathy-contact-blocking-dialog.ui.h:1
+#: ../libempathy-gtk/empathy-contact-search-dialog.c:520
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
+#: ../libempathy-gtk/empathy-individual-widget.c:1479
+#: ../libempathy-gtk/empathy-contact-selector-dialog.ui.h:1
+#: ../src/empathy-chatrooms-window.ui.h:1
+#: ../src/empathy-new-chatroom-dialog.ui.h:1
+msgid "Account:"
+msgstr "Konto:"
+
#. Copy Link Address menu item
#: ../libempathy-gtk/empathy-chat-text-view.c:320
-#: ../libempathy-gtk/empathy-theme-adium.c:794
+#: ../libempathy-gtk/empathy-theme-adium.c:1026
msgid "_Copy Link Address"
msgstr "_Kopier lenkens adresse"
#. Open Link menu item
#: ../libempathy-gtk/empathy-chat-text-view.c:327
-#: ../libempathy-gtk/empathy-theme-adium.c:801
+#: ../libempathy-gtk/empathy-theme-adium.c:1033
msgid "_Open Link"
msgstr "_Åpne lenke"
#. Translators: timestamp displayed between conversations in
#. * chat windows (strftime format string)
-#: ../libempathy-gtk/empathy-chat-text-view.c:420
+#: ../libempathy-gtk/empathy-chat-text-view.c:415
msgid "%A %B %d %Y"
msgstr "%A %d %B %Y"
@@ -1544,24 +1541,24 @@ msgstr "Personlig informasjon"
msgid "New Contact"
msgstr "Ny kontakt"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:532
+#: ../libempathy-gtk/empathy-contact-dialogs.c:533
#: ../libempathy-gtk/empathy-individual-dialogs.c:199
#, c-format
msgid "Block %s?"
msgstr "Blokker %s?"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:537
+#: ../libempathy-gtk/empathy-contact-dialogs.c:538
#: ../libempathy-gtk/empathy-individual-dialogs.c:247
#, c-format
msgid "Are you sure you want to block '%s' from contacting you again?"
msgstr "Er du sikker på at du vil blokkere «%s» fra å kontakte deg igjen?"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:542
+#: ../libempathy-gtk/empathy-contact-dialogs.c:543
#: ../libempathy-gtk/empathy-individual-dialogs.c:269
msgid "_Block"
msgstr "_Blokker"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:552
+#: ../libempathy-gtk/empathy-contact-dialogs.c:559
#: ../libempathy-gtk/empathy-individual-dialogs.c:278
msgid "_Report this contact as abusive"
msgid_plural "_Report these contacts as abusive"
@@ -1588,34 +1585,34 @@ msgstr "Ikke gruppert"
msgid "Favorite People"
msgstr "Favorittpersoner"
-#: ../libempathy-gtk/empathy-contact-list-view.c:2001
-#: ../libempathy-gtk/empathy-individual-view.c:2336
+#: ../libempathy-gtk/empathy-contact-list-view.c:1987
+#: ../libempathy-gtk/empathy-individual-view.c:2386
#, c-format
msgid "Do you really want to remove the group '%s'?"
msgstr "Vil du virkelig fjerne gruppen «%s»?"
-#: ../libempathy-gtk/empathy-contact-list-view.c:2003
-#: ../libempathy-gtk/empathy-individual-view.c:2339
+#: ../libempathy-gtk/empathy-contact-list-view.c:1989
+#: ../libempathy-gtk/empathy-individual-view.c:2389
msgid "Removing group"
msgstr "Fjerner gruppe"
#. Remove
-#: ../libempathy-gtk/empathy-contact-list-view.c:2052
-#: ../libempathy-gtk/empathy-contact-list-view.c:2129
-#: ../libempathy-gtk/empathy-individual-view.c:2394
-#: ../libempathy-gtk/empathy-individual-view.c:2588
+#: ../libempathy-gtk/empathy-contact-list-view.c:2038
+#: ../libempathy-gtk/empathy-contact-list-view.c:2115
+#: ../libempathy-gtk/empathy-individual-view.c:2444
+#: ../libempathy-gtk/empathy-individual-view.c:2637
#: ../src/empathy-accounts-dialog.ui.h:7
msgid "_Remove"
msgstr "Fje_rn"
-#: ../libempathy-gtk/empathy-contact-list-view.c:2082
-#: ../libempathy-gtk/empathy-individual-view.c:2458
+#: ../libempathy-gtk/empathy-contact-list-view.c:2068
+#: ../libempathy-gtk/empathy-individual-view.c:2508
#, c-format
msgid "Do you really want to remove the contact '%s'?"
msgstr "Vil du virkelig fjerne kontakten «%s»?"
-#: ../libempathy-gtk/empathy-contact-list-view.c:2084
-#: ../libempathy-gtk/empathy-individual-view.c:2479
+#: ../libempathy-gtk/empathy-contact-list-view.c:2070
+#: ../libempathy-gtk/empathy-individual-view.c:2529
msgid "Removing contact"
msgstr "Fjerner kontakt"
@@ -1624,68 +1621,68 @@ msgstr "Fjerner kontakt"
msgid "_Add Contact…"
msgstr "_Legg til kontakt …"
-#: ../libempathy-gtk/empathy-contact-menu.c:296
+#: ../libempathy-gtk/empathy-contact-menu.c:299
msgid "_Block Contact"
msgstr "_Blokker kontakt"
-#: ../libempathy-gtk/empathy-contact-menu.c:325
+#: ../libempathy-gtk/empathy-contact-menu.c:328
#: ../libempathy-gtk/empathy-individual-menu.c:517
#: ../src/empathy-main-window.ui.h:15
msgid "_Chat"
msgstr "_Prat"
-#: ../libempathy-gtk/empathy-contact-menu.c:356
+#: ../libempathy-gtk/empathy-contact-menu.c:359
#: ../libempathy-gtk/empathy-individual-menu.c:560
msgctxt "menu item"
msgid "_Audio Call"
msgstr "_Lydsamtale"
-#: ../libempathy-gtk/empathy-contact-menu.c:387
+#: ../libempathy-gtk/empathy-contact-menu.c:390
#: ../libempathy-gtk/empathy-individual-menu.c:602
msgctxt "menu item"
msgid "_Video Call"
msgstr "_Videosamtale"
-#: ../libempathy-gtk/empathy-contact-menu.c:433
+#: ../libempathy-gtk/empathy-contact-menu.c:436
#: ../libempathy-gtk/empathy-individual-menu.c:645
#: ../src/empathy-main-window.ui.h:26
msgid "_Previous Conversations"
msgstr "_Tidligere samtaler"
-#: ../libempathy-gtk/empathy-contact-menu.c:455
+#: ../libempathy-gtk/empathy-contact-menu.c:458
#: ../libempathy-gtk/empathy-individual-menu.c:686
msgid "Send File"
msgstr "Send fil"
-#: ../libempathy-gtk/empathy-contact-menu.c:478
+#: ../libempathy-gtk/empathy-contact-menu.c:481
#: ../libempathy-gtk/empathy-individual-menu.c:728
msgid "Share My Desktop"
msgstr "Del mitt skrivebord"
-#: ../libempathy-gtk/empathy-contact-menu.c:518
-#: ../libempathy-gtk/empathy-contact-widget.c:1763
+#: ../libempathy-gtk/empathy-contact-menu.c:521
+#: ../libempathy-gtk/empathy-contact-widget.c:1761
#: ../libempathy-gtk/empathy-individual-menu.c:763
-#: ../libempathy-gtk/empathy-individual-widget.c:1372
+#: ../libempathy-gtk/empathy-individual-widget.c:1370
msgid "Favorite"
msgstr "Favoritt"
-#: ../libempathy-gtk/empathy-contact-menu.c:547
+#: ../libempathy-gtk/empathy-contact-menu.c:550
#: ../libempathy-gtk/empathy-individual-menu.c:791
msgid "Infor_mation"
msgstr "Infor_masjon"
-#: ../libempathy-gtk/empathy-contact-menu.c:593
+#: ../libempathy-gtk/empathy-contact-menu.c:596
msgctxt "Edit contact (contextual menu)"
msgid "_Edit"
msgstr "R_ediger"
-#: ../libempathy-gtk/empathy-contact-menu.c:647
+#: ../libempathy-gtk/empathy-contact-menu.c:650
#: ../libempathy-gtk/empathy-individual-menu.c:972
#: ../src/empathy-chat-window.c:935
msgid "Inviting you to this room"
msgstr "Inviterer deg til dette rommet"
-#: ../libempathy-gtk/empathy-contact-menu.c:678
+#: ../libempathy-gtk/empathy-contact-menu.c:681
#: ../libempathy-gtk/empathy-individual-menu.c:1019
msgid "_Invite to Chat Room"
msgstr "_Inviter til praterom"
@@ -1857,32 +1854,32 @@ msgid "Altitude:"
msgstr "Høyde:"
#: ../libempathy-gtk/empathy-contact-widget.c:871
-#: ../libempathy-gtk/empathy-contact-widget.c:888
+#: ../libempathy-gtk/empathy-contact-widget.c:886
#: ../libempathy-gtk/empathy-individual-widget.c:616
-#: ../libempathy-gtk/empathy-individual-widget.c:633
+#: ../libempathy-gtk/empathy-individual-widget.c:631
#: ../src/empathy-preferences.ui.h:12
msgid "Location"
msgstr "Sted"
#. translators: format is "Location, $date"
-#: ../libempathy-gtk/empathy-contact-widget.c:890
-#: ../libempathy-gtk/empathy-individual-widget.c:635
+#: ../libempathy-gtk/empathy-contact-widget.c:888
+#: ../libempathy-gtk/empathy-individual-widget.c:633
#, c-format
msgid "%s, %s"
msgstr "%s, %s"
-#: ../libempathy-gtk/empathy-contact-widget.c:942
-#: ../libempathy-gtk/empathy-individual-widget.c:684
+#: ../libempathy-gtk/empathy-contact-widget.c:940
+#: ../libempathy-gtk/empathy-individual-widget.c:682
msgid "%B %e, %Y at %R UTC"
msgstr "%B %e, %Y, %R UTC"
-#: ../libempathy-gtk/empathy-contact-widget.c:1024
-#: ../libempathy-gtk/empathy-individual-widget.c:919
+#: ../libempathy-gtk/empathy-contact-widget.c:1022
+#: ../libempathy-gtk/empathy-individual-widget.c:917
msgid "Save Avatar"
msgstr "Lagre personbilder"
-#: ../libempathy-gtk/empathy-contact-widget.c:1080
-#: ../libempathy-gtk/empathy-individual-widget.c:977
+#: ../libempathy-gtk/empathy-contact-widget.c:1078
+#: ../libempathy-gtk/empathy-individual-widget.c:975
msgid "Unable to save avatar"
msgstr "Kan ikke lagre personbilde"
@@ -1892,7 +1889,7 @@ msgstr "<b>Plassering</b> (dato)\t"
#. Alias
#: ../libempathy-gtk/empathy-contact-widget.ui.h:3
-#: ../libempathy-gtk/empathy-individual-widget.c:1307
+#: ../libempathy-gtk/empathy-individual-widget.c:1305
msgid "Alias:"
msgstr "Alias:"
@@ -1912,7 +1909,7 @@ msgstr "Kontaktdetaljer"
#. Identifier to connect to Instant Messaging network
#. Translators: Identifier to connect to Instant Messaging network
#: ../libempathy-gtk/empathy-contact-widget.ui.h:8
-#: ../libempathy-gtk/empathy-individual-widget.c:1511
+#: ../libempathy-gtk/empathy-individual-widget.c:1509
msgid "Identifier:"
msgstr "Identifikator:"
@@ -1951,7 +1948,7 @@ msgid "Select"
msgstr "Velg"
#: ../libempathy-gtk/empathy-groups-widget.c:408
-#: ../src/empathy-main-window.c:1436
+#: ../src/empathy-main-window.c:1439
msgid "Group"
msgstr "Gruppe"
@@ -2004,11 +2001,11 @@ msgctxt "Link individual (contextual menu)"
msgid "_Link Contacts…"
msgstr "Koble kontakter …"
-#: ../libempathy-gtk/empathy-individual-view.c:2301
+#: ../libempathy-gtk/empathy-individual-view.c:2351
msgid "Delete and _Block"
msgstr "Slett og _blokker"
-#: ../libempathy-gtk/empathy-individual-view.c:2467
+#: ../libempathy-gtk/empathy-individual-view.c:2517
#, c-format
msgid ""
"Do you really want to remove the linked contact '%s'? Note that this will "
@@ -2017,7 +2014,7 @@ msgstr ""
"Vil du virkelig fjerne lenket kontakt «%s»? Merk at dette vil fjerne alle "
"kontaktene den lenkede kontakten består av."
-#: ../libempathy-gtk/empathy-individual-widget.c:1652
+#: ../libempathy-gtk/empathy-individual-widget.c:1650
#, c-format
msgid "Linked contact containing %u contact"
msgid_plural "Linked contacts containing %u contacts"
@@ -2285,19 +2282,19 @@ msgstr "Lagre _nye statusmeldinger"
msgid "Saved Status Messages"
msgstr "Lagrede statusmeldinger"
-#: ../libempathy-gtk/empathy-theme-manager.c:67
+#: ../libempathy-gtk/empathy-theme-manager.c:68
msgid "Classic"
msgstr "Klassisk"
-#: ../libempathy-gtk/empathy-theme-manager.c:68
+#: ../libempathy-gtk/empathy-theme-manager.c:69
msgid "Simple"
msgstr "Enkel"
-#: ../libempathy-gtk/empathy-theme-manager.c:69
+#: ../libempathy-gtk/empathy-theme-manager.c:70
msgid "Clean"
msgstr "Tøm"
-#: ../libempathy-gtk/empathy-theme-manager.c:70
+#: ../libempathy-gtk/empathy-theme-manager.c:71
msgid "Blue"
msgstr "Blå"
@@ -2827,34 +2824,34 @@ msgstr "Det finnes ikke-lagrede endringer for din %s-konto."
msgid "Your new account has not been saved yet."
msgstr "Din nye konto er ikke lagret ennå."
-#: ../src/empathy-accounts-dialog.c:286
+#: ../src/empathy-accounts-dialog.c:345
#: ../src/empathy-streamed-media-window.c:809
msgid "Connecting…"
msgstr "Kobler til …"
-#: ../src/empathy-accounts-dialog.c:327
+#: ../src/empathy-accounts-dialog.c:386
#, c-format
msgid "Offline — %s"
msgstr "Frakoblet - %s"
-#: ../src/empathy-accounts-dialog.c:339
+#: ../src/empathy-accounts-dialog.c:398
#, c-format
msgid "Disconnected — %s"
msgstr "Koblet fra - %s"
-#: ../src/empathy-accounts-dialog.c:350
+#: ../src/empathy-accounts-dialog.c:409
msgid "Offline — No Network Connection"
msgstr "Frakoblet - Ingen nettverkstilkobling"
-#: ../src/empathy-accounts-dialog.c:357
+#: ../src/empathy-accounts-dialog.c:416
msgid "Unknown Status"
msgstr "Ukjent status"
-#: ../src/empathy-accounts-dialog.c:369
+#: ../src/empathy-accounts-dialog.c:428
msgid "Offline — Account Disabled"
msgstr "Frakoblet - Konto deaktivert"
-#: ../src/empathy-accounts-dialog.c:772
+#: ../src/empathy-accounts-dialog.c:831
msgid ""
"You are about to create a new account, which will discard\n"
"your changes. Are you sure you want to proceed?"
@@ -2862,16 +2859,16 @@ msgstr ""
"Du er i ferd med å lage en ny konto hvilket vil forkaste\n"
"dine endringer. Er du sikker på at du vil fortsette?"
-#: ../src/empathy-accounts-dialog.c:1133
+#: ../src/empathy-accounts-dialog.c:1192
#, c-format
msgid "Do you want to remove %s from your computer?"
msgstr "Vil du fjerne %s fra din datamaskin?"
-#: ../src/empathy-accounts-dialog.c:1137
+#: ../src/empathy-accounts-dialog.c:1196
msgid "This will not remove your account on the server."
msgstr "Dette vil ikke fjerne din konto på tjeneren."
-#: ../src/empathy-accounts-dialog.c:1375
+#: ../src/empathy-accounts-dialog.c:1434
msgid ""
"You are about to select another account, which will discard\n"
"your changes. Are you sure you want to proceed?"
@@ -2880,15 +2877,15 @@ msgstr ""
"dine endringer. Er du sikker på at du vil fortsette?"
#. Menu items: to enabled/disable the account
-#: ../src/empathy-accounts-dialog.c:1571
+#: ../src/empathy-accounts-dialog.c:1652
msgid "_Enable"
msgstr "Slå _på"
-#: ../src/empathy-accounts-dialog.c:1572
+#: ../src/empathy-accounts-dialog.c:1653
msgid "_Disable"
msgstr "Slå _av"
-#: ../src/empathy-accounts-dialog.c:2086
+#: ../src/empathy-accounts-dialog.c:2174
msgid ""
"You are about to close the window, which will discard\n"
"your changes. Are you sure you want to proceed?"
@@ -2924,11 +2921,11 @@ msgstr "_Legg til …"
msgid "_Import…"
msgstr "_Importer …"
-#: ../src/empathy-auth-client.c:246
+#: ../src/empathy-auth-client.c:250
msgid " - Empathy authentication client"
msgstr "- Empathy autentiseringsklient"
-#: ../src/empathy-auth-client.c:262
+#: ../src/empathy-auth-client.c:266
msgid "Empathy authentication client"
msgstr "Empathy autentiseringsklient"
@@ -3013,17 +3010,37 @@ msgstr "IP-adresse for en relay-tjener"
msgid "The IP address of the multicast group"
msgstr "IP-adresse for multicast-gruppe"
+#: ../src/empathy-streamed-media-window.c:1906
+msgctxt "encoding video codec"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: ../src/empathy-streamed-media-window.c:1909
+msgctxt "encoding audio codec"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: ../src/empathy-streamed-media-window.c:1912
+msgctxt "decoding video codec"
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: ../src/empathy-streamed-media-window.c:1915
+msgctxt "decoding audio codec"
+msgid "Unknown"
+msgstr "Ukjent"
+
#. Translators: number of minutes:seconds the caller has been connected
-#: ../src/empathy-streamed-media-window.c:2266
+#: ../src/empathy-streamed-media-window.c:2274
#, c-format
msgid "Connected — %d:%02dm"
msgstr "Koblet til - %d:%02dm"
-#: ../src/empathy-streamed-media-window.c:2327
+#: ../src/empathy-streamed-media-window.c:2335
msgid "Technical Details"
msgstr "Tekniske detaljer"
-#: ../src/empathy-streamed-media-window.c:2365
+#: ../src/empathy-streamed-media-window.c:2373
#, c-format
msgid ""
"%s's software does not understand any of the audio formats supported by your "
@@ -3032,7 +3049,7 @@ msgstr ""
"Programvaren til %s forstår ikke noen av lydformatene som støttes av din "
"datamaskin"
-#: ../src/empathy-streamed-media-window.c:2370
+#: ../src/empathy-streamed-media-window.c:2378
#, c-format
msgid ""
"%s's software does not understand any of the video formats supported by your "
@@ -3041,7 +3058,7 @@ msgstr ""
"Programvaren til %s forstår ikke noen av videoformatene som støttes av din "
"datamaskin"
-#: ../src/empathy-streamed-media-window.c:2376
+#: ../src/empathy-streamed-media-window.c:2384
#, c-format
msgid ""
"Can't establish a connection to %s. One of you might be on a network that "
@@ -3050,25 +3067,25 @@ msgstr ""
"Kan ikke etablere tilkobling til %s. En av dere kan være på et nettverk som "
"ikke tillater direkte tilkoblinger."
-#: ../src/empathy-streamed-media-window.c:2382
+#: ../src/empathy-streamed-media-window.c:2390
msgid "There was a failure on the network"
msgstr "Det oppsto en feil på nettverket"
-#: ../src/empathy-streamed-media-window.c:2386
+#: ../src/empathy-streamed-media-window.c:2394
msgid ""
"The audio formats necessary for this call are not installed on your computer"
msgstr ""
"Lydformatene som kreves for denne samtalen er ikke installert på din "
"datamaskin"
-#: ../src/empathy-streamed-media-window.c:2389
+#: ../src/empathy-streamed-media-window.c:2397
msgid ""
"The video formats necessary for this call are not installed on your computer"
msgstr ""
"Videoformatene som kreves for denne samtalen er ikke installert på din "
"datamaskin"
-#: ../src/empathy-streamed-media-window.c:2399
+#: ../src/empathy-streamed-media-window.c:2407
#, c-format
msgid ""
"Something unexpected happened in a Telepathy component. Please <a href=\"%s"
@@ -3079,19 +3096,19 @@ msgstr ""
"\">rapporter denne feilen</a> og legg ved loggene som samles inn i "
"«Feilsøking»-vinduet i Hjelp-menyen."
-#: ../src/empathy-streamed-media-window.c:2407
+#: ../src/empathy-streamed-media-window.c:2415
msgid "There was a failure in the call engine"
msgstr "Det oppsto en feil i samtalemotoren"
-#: ../src/empathy-streamed-media-window.c:2410
+#: ../src/empathy-streamed-media-window.c:2418
msgid "The end of the stream was reached"
msgstr "Slutt på strømmen ble nådd"
-#: ../src/empathy-streamed-media-window.c:2450
+#: ../src/empathy-streamed-media-window.c:2458
msgid "Can't establish audio stream"
msgstr "Kan ikke etablere lydstrøm"
-#: ../src/empathy-streamed-media-window.c:2460
+#: ../src/empathy-streamed-media-window.c:2468
msgid "Can't establish video stream"
msgstr "Kan ikke etablere videostrøm"
@@ -3163,6 +3180,10 @@ msgstr "Send lyd"
msgid "Toggle audio transmission"
msgstr "Slå av/på overføring av lyd"
+#: ../src/empathy-call-window.ui.h:18
+msgid "Unknown"
+msgstr "Ukjent"
+
#: ../src/empathy-call-window.ui.h:19
msgid "V_ideo"
msgstr "V_ideo"
@@ -3333,7 +3354,7 @@ msgstr "%s ringer deg med video. Vil du svare?"
msgid "%s is calling you. Do you want to answer?"
msgstr "%s ringer deg. Vil du svare?"
-#: ../src/empathy-event-manager.c:515 ../src/empathy-event-manager.c:660
+#: ../src/empathy-event-manager.c:515 ../src/empathy-event-manager.c:667
#, c-format
msgid "Incoming call from %s"
msgstr "Innkommende samtale fra %s"
@@ -3346,59 +3367,59 @@ msgstr "Av_vis"
msgid "_Answer"
msgstr "Sv_ar"
-#: ../src/empathy-event-manager.c:660
+#: ../src/empathy-event-manager.c:667
#, c-format
msgid "Incoming video call from %s"
msgstr "Innkommende videosamtale fra %s"
-#: ../src/empathy-event-manager.c:737
+#: ../src/empathy-event-manager.c:744
msgid "Room invitation"
msgstr "Invitasjon til rom"
-#: ../src/empathy-event-manager.c:739
+#: ../src/empathy-event-manager.c:746
#, c-format
msgid "Invitation to join %s"
msgstr "Invitasjon til å bli med i %s"
-#: ../src/empathy-event-manager.c:746
+#: ../src/empathy-event-manager.c:753
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s inviterer deg til å bli med i %s"
-#: ../src/empathy-event-manager.c:754
+#: ../src/empathy-event-manager.c:761
msgid "_Decline"
msgstr "_Avslå"
-#: ../src/empathy-event-manager.c:759
+#: ../src/empathy-event-manager.c:766
#: ../src/empathy-new-chatroom-dialog.ui.h:7
msgid "_Join"
msgstr "_Bli med"
-#: ../src/empathy-event-manager.c:786
+#: ../src/empathy-event-manager.c:793
#, c-format
msgid "%s invited you to join %s"
msgstr "%s inviterte deg til å bli med i %s"
-#: ../src/empathy-event-manager.c:792
+#: ../src/empathy-event-manager.c:799
#, c-format
msgid "You have been invited to join %s"
msgstr "Du har blitt invitert til å bli med i %s"
-#: ../src/empathy-event-manager.c:843
+#: ../src/empathy-event-manager.c:850
#, c-format
msgid "Incoming file transfer from %s"
msgstr "Innkommende filoverføring fra %s"
-#: ../src/empathy-event-manager.c:1013 ../src/empathy-main-window.c:370
+#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:373
msgid "Password required"
msgstr "Passord kreves"
-#: ../src/empathy-event-manager.c:1069
+#: ../src/empathy-event-manager.c:1076
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s ønsker rettigheter til å se når du er tilkoblet"
-#: ../src/empathy-event-manager.c:1073
+#: ../src/empathy-event-manager.c:1080
#, c-format
msgid ""
"\n"
@@ -3408,105 +3429,105 @@ msgstr ""
"Melding: %s"
#. Translators: time left, when it is more than one hour
-#: ../src/empathy-ft-manager.c:99
+#: ../src/empathy-ft-manager.c:100
#, c-format
msgid "%u:%02u.%02u"
msgstr "%u:%02u.%02u"
#. Translators: time left, when is is less than one hour
-#: ../src/empathy-ft-manager.c:102
+#: ../src/empathy-ft-manager.c:103
#, c-format
msgid "%02u.%02u"
msgstr "%02u.%02u"
-#: ../src/empathy-ft-manager.c:178
+#: ../src/empathy-ft-manager.c:179
msgctxt "file transfer percent"
msgid "Unknown"
msgstr "Ukjent"
-#: ../src/empathy-ft-manager.c:273
+#: ../src/empathy-ft-manager.c:274
#, c-format
msgid "%s of %s at %s/s"
msgstr "%s av %s med %s/s"
-#: ../src/empathy-ft-manager.c:274
+#: ../src/empathy-ft-manager.c:275
#, c-format
msgid "%s of %s"
msgstr "%s av %s"
#. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:305
+#: ../src/empathy-ft-manager.c:306
#, c-format
msgid "Receiving \"%s\" from %s"
msgstr "Mottar «%s» fra %s"
#. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:308
+#: ../src/empathy-ft-manager.c:309
#, c-format
msgid "Sending \"%s\" to %s"
msgstr "Sender «%s» til %s"
#. translators: first %s is filename, second %s
#. * is the contact name
-#: ../src/empathy-ft-manager.c:338
+#: ../src/empathy-ft-manager.c:339
#, c-format
msgid "Error receiving \"%s\" from %s"
msgstr "Feil ved mottak av «%s» fra %s"
-#: ../src/empathy-ft-manager.c:341
+#: ../src/empathy-ft-manager.c:342
msgid "Error receiving a file"
msgstr "Feil ved mottak av en fil"
-#: ../src/empathy-ft-manager.c:346
+#: ../src/empathy-ft-manager.c:347
#, c-format
msgid "Error sending \"%s\" to %s"
msgstr "Feil ved sending av «%s» til %s"
-#: ../src/empathy-ft-manager.c:349
+#: ../src/empathy-ft-manager.c:350
msgid "Error sending a file"
msgstr "Feil ved sending av en fil"
#. translators: first %s is filename, second %s
#. * is the contact name
-#: ../src/empathy-ft-manager.c:488
+#: ../src/empathy-ft-manager.c:489
#, c-format
msgid "\"%s\" received from %s"
msgstr "«%s» mottatt fra %s"
#. translators: first %s is filename, second %s
#. * is the contact name
-#: ../src/empathy-ft-manager.c:493
+#: ../src/empathy-ft-manager.c:494
#, c-format
msgid "\"%s\" sent to %s"
msgstr "«%s» sendt til %s"
-#: ../src/empathy-ft-manager.c:496
+#: ../src/empathy-ft-manager.c:497
msgid "File transfer completed"
msgstr "Filoverføring fullført"
-#: ../src/empathy-ft-manager.c:615 ../src/empathy-ft-manager.c:782
+#: ../src/empathy-ft-manager.c:616 ../src/empathy-ft-manager.c:783
msgid "Waiting for the other participant's response"
msgstr "Venter på svar fra motparten"
-#: ../src/empathy-ft-manager.c:641 ../src/empathy-ft-manager.c:679
+#: ../src/empathy-ft-manager.c:642 ../src/empathy-ft-manager.c:680
#, c-format
msgid "Checking integrity of \"%s\""
msgstr "Sjekker integriteten for «%s»"
-#: ../src/empathy-ft-manager.c:644 ../src/empathy-ft-manager.c:682
+#: ../src/empathy-ft-manager.c:645 ../src/empathy-ft-manager.c:683
#, c-format
msgid "Hashing \"%s\""
msgstr "Hasher «%s»"
-#: ../src/empathy-ft-manager.c:1016
+#: ../src/empathy-ft-manager.c:1029
msgid "%"
msgstr "%"
-#: ../src/empathy-ft-manager.c:1028
+#: ../src/empathy-ft-manager.c:1041
msgid "File"
msgstr "Fil"
-#: ../src/empathy-ft-manager.c:1050
+#: ../src/empathy-ft-manager.c:1063
msgid "Remaining"
msgstr "Gjenstår"
@@ -3541,39 +3562,39 @@ msgstr "Protokoll"
msgid "Source"
msgstr "Kilde"
-#: ../src/empathy-main-window.c:387
+#: ../src/empathy-main-window.c:390
msgid "Provide Password"
msgstr "Oppgi passord"
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:396
msgid "Disconnect"
msgstr "Koble fra"
-#: ../src/empathy-main-window.c:533
+#: ../src/empathy-main-window.c:536
msgid "No match found"
msgstr "Ingen treff funnet"
-#: ../src/empathy-main-window.c:688
+#: ../src/empathy-main-window.c:691
msgid "Reconnect"
msgstr "Koble til på nytt"
-#: ../src/empathy-main-window.c:694
+#: ../src/empathy-main-window.c:697
msgid "Edit Account"
msgstr "Rediger konto"
-#: ../src/empathy-main-window.c:700
+#: ../src/empathy-main-window.c:703
msgid "Close"
msgstr "Lukk"
-#: ../src/empathy-main-window.c:1418
+#: ../src/empathy-main-window.c:1421
msgid "Contact"
msgstr "Kontakt"
-#: ../src/empathy-main-window.c:1765
+#: ../src/empathy-main-window.c:1768
msgid "Contact List"
msgstr "Kontaktliste"
-#: ../src/empathy-main-window.c:1881
+#: ../src/empathy-main-window.c:1884
msgid "Show and edit accounts"
msgstr "Vis og rediger kontoer"
@@ -3732,39 +3753,79 @@ msgstr "Romliste"
msgid "_Room:"
msgstr "_Rom:"
-#: ../src/empathy-preferences.c:139
+#: ../src/empathy-preferences.c:147
msgid "Message received"
msgstr "Melding mottatt"
-#: ../src/empathy-preferences.c:140
+#: ../src/empathy-preferences.c:148
msgid "Message sent"
msgstr "Melding sendt"
-#: ../src/empathy-preferences.c:141
+#: ../src/empathy-preferences.c:149
msgid "New conversation"
msgstr "Ny samtale"
-#: ../src/empathy-preferences.c:142
+#: ../src/empathy-preferences.c:150
msgid "Contact goes online"
msgstr "Kontakt kobler til"
-#: ../src/empathy-preferences.c:143
+#: ../src/empathy-preferences.c:151
msgid "Contact goes offline"
msgstr "Kontakt kobler fra"
-#: ../src/empathy-preferences.c:144
+#: ../src/empathy-preferences.c:152
msgid "Account connected"
msgstr "Konto koblet til"
-#: ../src/empathy-preferences.c:145
+#: ../src/empathy-preferences.c:153
msgid "Account disconnected"
msgstr "Konto koblet fra"
-#: ../src/empathy-preferences.c:446
+#: ../src/empathy-preferences.c:454
msgid "Language"
msgstr "Språk"
-#: ../src/empathy-preferences.c:875
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:704
+msgid "Juliet"
+msgstr "Juliet"
+
+#. translators: Contact name for the chat theme preview
+#: ../src/empathy-preferences.c:711
+msgid "Romeo"
+msgstr "Romeo"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:717
+msgid "O Romeo, Romeo, wherefore art thou Romeo?"
+msgstr "O Romeo, Romeo, wherefore art thou Romeo?"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:720
+msgid "Deny thy father and refuse thy name;"
+msgstr "Deny thy father and refuse thy name;"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:723
+msgid "Or if thou wilt not, be but sworn my love"
+msgstr "Or if thou wilt not, be but sworn my love"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:726
+msgid "And I'll no longer be a Capulet."
+msgstr "And I'll no longer be a Capulet."
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:729
+msgid "Shall I hear more, or shall I speak at this?"
+msgstr "Shall I hear more, or shall I speak at this?"
+
+#. translators: Quote from Romeo & Julier, for chat theme preview
+#: ../src/empathy-preferences.c:732
+msgid "Juliet has disconnected"
+msgstr "Juliet har koblet fra"
+
+#: ../src/empathy-preferences.c:966
msgid "Preferences"
msgstr "Brukervalg"
@@ -3865,43 +3926,47 @@ msgstr ""
"Listen med språk viser bare de språkene det er installert ordliste for."
#: ../src/empathy-preferences.ui.h:24
+msgid "Theme Variant:"
+msgstr "Temavariant:"
+
+#: ../src/empathy-preferences.ui.h:25
msgid "Themes"
msgstr "Temaer"
-#: ../src/empathy-preferences.ui.h:25
+#: ../src/empathy-preferences.ui.h:26
msgid "_Automatically connect on startup"
msgstr "Koble til _automatisk ved oppstart"
-#: ../src/empathy-preferences.ui.h:26
+#: ../src/empathy-preferences.ui.h:27
msgid "_Cellphone"
msgstr "_Mobiltelefon"
-#: ../src/empathy-preferences.ui.h:27
+#: ../src/empathy-preferences.ui.h:28
msgid "_Enable bubble notifications"
msgstr "_Aktiver varsling med bobler"
-#: ../src/empathy-preferences.ui.h:28
+#: ../src/empathy-preferences.ui.h:29
msgid "_Enable sound notifications"
msgstr "_Aktiver varsling med lyder"
-#: ../src/empathy-preferences.ui.h:29
+#: ../src/empathy-preferences.ui.h:30
msgid "_GPS"
msgstr "_GPS"
-#: ../src/empathy-preferences.ui.h:30
+#: ../src/empathy-preferences.ui.h:31
msgid "_Network (IP, Wi-Fi)"
msgstr "_Nettverk (IP, Wi-Fi)"
-#: ../src/empathy-preferences.ui.h:31
+#: ../src/empathy-preferences.ui.h:32
msgid "_Open new chats in separate windows"
msgstr "_Åpne nye samtaler i egne vinduer"
-#: ../src/empathy-preferences.ui.h:32
+#: ../src/empathy-preferences.ui.h:33
msgid "_Publish location to my contacts"
msgstr "_Publiser plassering til mine kontakter"
#. To translators: The longitude and latitude are rounded to closest 0,1 degrees, so for example 146,2345° is rounded to round(146,2345*10)/10 = 146,2 degrees.
-#: ../src/empathy-preferences.ui.h:34
+#: ../src/empathy-preferences.ui.h:35
msgid "_Reduce location accuracy"
msgstr "_Reduser nøyaktighet for plassering"
@@ -3913,7 +3978,7 @@ msgstr "Status"
msgid "_Quit"
msgstr "_Avslutt"
-#: ../src/empathy-map-view.c:442
+#: ../src/empathy-map-view.c:448
msgid "Contact Map View"
msgstr "Kartvisning for kontakter"
@@ -4051,6 +4116,10 @@ msgstr "Avslå"
msgid "Accept"
msgstr "Godta"
+#: ../src/empathy-notifications-approver.c:223
+msgid "Provide"
+msgstr "Oppgi"
+
#: ../src/empathy-call-observer.c:130
#, c-format
msgid "Missed call from %s"
@@ -4060,3 +4129,7 @@ msgstr "Tapt anrop fra %s"
#, c-format
msgid "%s just tried to call you, but you were in another call."
msgstr "%s prøvde å ringe deg, men du var i en annen samtale."
+
+#: ../libempathy-gtk/empathy-search-bar.c:282
+msgid "_Match case"
+msgstr "Skill _mellom små/store bokstaver"
diff --git a/po/tr.po b/po/tr.po
index a4e72e3c8..a51ca2b82 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: empathy\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=empathy&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2011-04-21 09:08+0000\n"
-"PO-Revision-Date: 2011-04-26 15:19+0300\n"
+"POT-Creation-Date: 2011-05-02 12:56+0000\n"
+"PO-Revision-Date: 2011-05-03 11:22+0300\n"
"Last-Translator: Muhammet Kara <muhammet.k@gmail.com>\n"
"Language-Team: Turkish <gnome-turk@gnome.org>\n"
"MIME-Version: 1.0\n"
@@ -536,7 +536,6 @@ msgstr "Çevrimdışı"
#. translators: presence type is unknown
#: ../libempathy/empathy-utils.c:316
-#| msgid "Unknown"
msgctxt "presence"
msgid "Unknown"
msgstr "Bilinmiyor"
@@ -1338,7 +1337,6 @@ msgstr "'%s' mesajı gönderilirken hata : %s"
#: ../libempathy-gtk/empathy-chat.c:1306
#, c-format
-#| msgid "Error sending message '%s': %s"
msgid "Error sending message: %s"
msgstr "Mesaj gönderme hatası: %s"
@@ -1355,43 +1353,43 @@ msgstr "Başlık değiştirildi: %s"
msgid "No topic defined"
msgstr "Başlık belirtilmemiş"
-#: ../libempathy-gtk/empathy-chat.c:1880
+#: ../libempathy-gtk/empathy-chat.c:1888
msgid "(No Suggestions)"
msgstr "(Öneri Yok)"
#. translators: %s is the selected word
-#: ../libempathy-gtk/empathy-chat.c:1948
+#: ../libempathy-gtk/empathy-chat.c:1956
#, c-format
msgid "Add '%s' to Dictionary"
msgstr "'%s' kelimesini Sözlüğe ekle"
#. translators: first %s is the selected word,
#. * second %s is the language name of the target dictionary
-#: ../libempathy-gtk/empathy-chat.c:1985
+#: ../libempathy-gtk/empathy-chat.c:1993
#, c-format
msgid "Add '%s' to %s Dictionary"
msgstr "'%s' kelimesini %s Sözlüğe ekle"
-#: ../libempathy-gtk/empathy-chat.c:2042
+#: ../libempathy-gtk/empathy-chat.c:2050
msgid "Insert Smiley"
msgstr "Gülümseme Ekle"
#. send button
-#: ../libempathy-gtk/empathy-chat.c:2060
+#: ../libempathy-gtk/empathy-chat.c:2068
#: ../libempathy-gtk/empathy-ui-utils.c:1808
msgid "_Send"
msgstr "_Gönder"
#. Spelling suggestions
-#: ../libempathy-gtk/empathy-chat.c:2095
+#: ../libempathy-gtk/empathy-chat.c:2103
msgid "_Spelling Suggestions"
msgstr "_Yazım Önerileri"
-#: ../libempathy-gtk/empathy-chat.c:2184
+#: ../libempathy-gtk/empathy-chat.c:2192
msgid "Failed to retrieve recent logs"
msgstr "Son kayıtlara erişme başarısız oldu"
-#: ../libempathy-gtk/empathy-chat.c:2295
+#: ../libempathy-gtk/empathy-chat.c:2303
#, c-format
msgid "%s has disconnected"
msgstr "%s bağlantısını kesti"
@@ -1399,12 +1397,12 @@ msgstr "%s bağlantısını kesti"
#. translators: reverse the order of these arguments
#. * if the kicked should come before the kicker in your locale.
#.
-#: ../libempathy-gtk/empathy-chat.c:2302
+#: ../libempathy-gtk/empathy-chat.c:2310
#, c-format
msgid "%1$s was kicked by %2$s"
msgstr "%2$s tarafından %1$s kanaldan atıldı"
-#: ../libempathy-gtk/empathy-chat.c:2305
+#: ../libempathy-gtk/empathy-chat.c:2313
#, c-format
msgid "%s was kicked"
msgstr "%s kanaldan atıldı"
@@ -1412,17 +1410,17 @@ msgstr "%s kanaldan atıldı"
#. translators: reverse the order of these arguments
#. * if the banned should come before the banner in your locale.
#.
-#: ../libempathy-gtk/empathy-chat.c:2313
+#: ../libempathy-gtk/empathy-chat.c:2321
#, c-format
msgid "%1$s was banned by %2$s"
msgstr "%2$s tarafından %1$s yasaklandı"
-#: ../libempathy-gtk/empathy-chat.c:2316
+#: ../libempathy-gtk/empathy-chat.c:2324
#, c-format
msgid "%s was banned"
msgstr "%s yasaklandı"
-#: ../libempathy-gtk/empathy-chat.c:2320
+#: ../libempathy-gtk/empathy-chat.c:2328
#, c-format
msgid "%s has left the room"
msgstr "%s odayı terk etti"
@@ -1432,62 +1430,62 @@ msgstr "%s odayı terk etti"
#. * given by the user living the room. If this poses a problem,
#. * please let us know. :-)
#.
-#: ../libempathy-gtk/empathy-chat.c:2329
+#: ../libempathy-gtk/empathy-chat.c:2337
#, c-format
msgid " (%s)"
msgstr " (%s)"
-#: ../libempathy-gtk/empathy-chat.c:2354
+#: ../libempathy-gtk/empathy-chat.c:2362
#, c-format
msgid "%s has joined the room"
msgstr "%s odaya katıldı"
-#: ../libempathy-gtk/empathy-chat.c:2379
+#: ../libempathy-gtk/empathy-chat.c:2387
#, c-format
msgid "%s is now known as %s"
msgstr "%s şimdi %s olarak biliniyor"
-#: ../libempathy-gtk/empathy-chat.c:2518
+#: ../libempathy-gtk/empathy-chat.c:2526
#: ../src/empathy-streamed-media-window.c:1957
#: ../src/empathy-event-manager.c:1126
msgid "Disconnected"
msgstr "Bağlı Değil"
#. Add message
-#: ../libempathy-gtk/empathy-chat.c:3148
+#: ../libempathy-gtk/empathy-chat.c:3158
msgid "Would you like to store this password?"
msgstr "Bu parolayı kaydetmek istiyor musunuz?"
-#: ../libempathy-gtk/empathy-chat.c:3154
+#: ../libempathy-gtk/empathy-chat.c:3164
msgid "Remember"
msgstr "Hatırla"
-#: ../libempathy-gtk/empathy-chat.c:3164
+#: ../libempathy-gtk/empathy-chat.c:3174
msgid "Not now"
msgstr "Şimdi değil"
-#: ../libempathy-gtk/empathy-chat.c:3208
+#: ../libempathy-gtk/empathy-chat.c:3218
msgid "Retry"
msgstr "Yeniden Dene"
-#: ../libempathy-gtk/empathy-chat.c:3212
+#: ../libempathy-gtk/empathy-chat.c:3222
msgid "Wrong password; please try again:"
msgstr "Yanlış parola: lütfen tekrar deneyin:"
#. Add message
-#: ../libempathy-gtk/empathy-chat.c:3329
+#: ../libempathy-gtk/empathy-chat.c:3339
msgid "This room is protected by a password:"
msgstr "Bu oda bir parolayla korunuyor:"
-#: ../libempathy-gtk/empathy-chat.c:3356
+#: ../libempathy-gtk/empathy-chat.c:3366
msgid "Join"
msgstr "Katıl"
-#: ../libempathy-gtk/empathy-chat.c:3526 ../src/empathy-event-manager.c:1147
+#: ../libempathy-gtk/empathy-chat.c:3536 ../src/empathy-event-manager.c:1147
msgid "Connected"
msgstr "Bağlı"
-#: ../libempathy-gtk/empathy-chat.c:3579
+#: ../libempathy-gtk/empathy-chat.c:3589
#: ../libempathy-gtk/empathy-log-window.c:650
msgid "Conversation"
msgstr "Konuşma"
@@ -1529,13 +1527,13 @@ msgstr "Hesap:"
#. Copy Link Address menu item
#: ../libempathy-gtk/empathy-chat-text-view.c:320
-#: ../libempathy-gtk/empathy-theme-adium.c:794
+#: ../libempathy-gtk/empathy-theme-adium.c:1010
msgid "_Copy Link Address"
msgstr "Bağ Adresini _Kopyala"
#. Open Link menu item
#: ../libempathy-gtk/empathy-chat-text-view.c:327
-#: ../libempathy-gtk/empathy-theme-adium.c:801
+#: ../libempathy-gtk/empathy-theme-adium.c:1017
msgid "_Open Link"
msgstr "_Bağı Aç"
@@ -1605,33 +1603,33 @@ msgid "Favorite People"
msgstr "Sık Görüşülen Kişiler"
#: ../libempathy-gtk/empathy-contact-list-view.c:1987
-#: ../libempathy-gtk/empathy-individual-view.c:2343
+#: ../libempathy-gtk/empathy-individual-view.c:2386
#, c-format
msgid "Do you really want to remove the group '%s'?"
msgstr "Gerçekten '%s' grubunu kaldırmak istiyor musunuz?"
#: ../libempathy-gtk/empathy-contact-list-view.c:1989
-#: ../libempathy-gtk/empathy-individual-view.c:2346
+#: ../libempathy-gtk/empathy-individual-view.c:2389
msgid "Removing group"
msgstr "Grup kaldırılıyor"
#. Remove
#: ../libempathy-gtk/empathy-contact-list-view.c:2038
#: ../libempathy-gtk/empathy-contact-list-view.c:2115
-#: ../libempathy-gtk/empathy-individual-view.c:2401
-#: ../libempathy-gtk/empathy-individual-view.c:2594
+#: ../libempathy-gtk/empathy-individual-view.c:2444
+#: ../libempathy-gtk/empathy-individual-view.c:2637
#: ../src/empathy-accounts-dialog.ui.h:7
msgid "_Remove"
msgstr "Kaldı_r"
#: ../libempathy-gtk/empathy-contact-list-view.c:2068
-#: ../libempathy-gtk/empathy-individual-view.c:2465
+#: ../libempathy-gtk/empathy-individual-view.c:2508
#, c-format
msgid "Do you really want to remove the contact '%s'?"
msgstr "Gerçekten '%s' bağlantısını kaldırmak istiyor musunuz?"
#: ../libempathy-gtk/empathy-contact-list-view.c:2070
-#: ../libempathy-gtk/empathy-individual-view.c:2486
+#: ../libempathy-gtk/empathy-individual-view.c:2529
msgid "Removing contact"
msgstr "Bağlantı kaldırılıyor"
@@ -1967,7 +1965,7 @@ msgid "Select"
msgstr "Seç"
#: ../libempathy-gtk/empathy-groups-widget.c:408
-#: ../src/empathy-main-window.c:1436
+#: ../src/empathy-main-window.c:1439
msgid "Group"
msgstr "Grup"
@@ -2018,11 +2016,11 @@ msgctxt "Link individual (contextual menu)"
msgid "_Link Contacts…"
msgstr "_Kişileri Bağla..."
-#: ../libempathy-gtk/empathy-individual-view.c:2308
+#: ../libempathy-gtk/empathy-individual-view.c:2351
msgid "Delete and _Block"
msgstr "Sil ve _Engelle"
-#: ../libempathy-gtk/empathy-individual-view.c:2474
+#: ../libempathy-gtk/empathy-individual-view.c:2517
#, c-format
msgid ""
"Do you really want to remove the linked contact '%s'? Note that this will "
@@ -2667,7 +2665,7 @@ msgstr ""
"Deniz Koçak <deniz.kocak@linux.org.tr>\n"
"Barış Çiçek <baris@teamforce.name.tr>\n"
"Muhammet Kara <muhammet.k@gmail.com>\n"
-"Ubuntu'yu Türkçe'ye Çevirenler Takımı"
+"Launchpad Çevirmenleri"
#: ../src/empathy-account-assistant.c:167
msgid "There was an error while importing the accounts."
@@ -3027,25 +3025,21 @@ msgid "The IP address of the multicast group"
msgstr "Çoklu yayın grubunun IP adresi"
#: ../src/empathy-streamed-media-window.c:1906
-#| msgid "Unknown"
msgctxt "encoding video codec"
msgid "Unknown"
msgstr "Bilinmiyor"
#: ../src/empathy-streamed-media-window.c:1909
-#| msgid "Unknown"
msgctxt "encoding audio codec"
msgid "Unknown"
msgstr "Bilinmiyor"
#: ../src/empathy-streamed-media-window.c:1912
-#| msgid "Unknown"
msgctxt "decoding video codec"
msgid "Unknown"
msgstr "Bilinmiyor"
#: ../src/empathy-streamed-media-window.c:1915
-#| msgid "Unknown"
msgctxt "decoding audio codec"
msgid "Unknown"
msgstr "Bilinmiyor"
@@ -3423,7 +3417,7 @@ msgstr "%s'e katılmaya davet edildiniz"
msgid "Incoming file transfer from %s"
msgstr "%s kişisinden gelen dosya transferi"
-#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:370
+#: ../src/empathy-event-manager.c:1020 ../src/empathy-main-window.c:373
msgid "Password required"
msgstr "Parola gerekli"
@@ -3578,39 +3572,39 @@ msgstr "Protokol"
msgid "Source"
msgstr "Kaynak"
-#: ../src/empathy-main-window.c:387
+#: ../src/empathy-main-window.c:390
msgid "Provide Password"
msgstr "Parola Gir"
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:396
msgid "Disconnect"
msgstr "Bağlantıyı kes"
-#: ../src/empathy-main-window.c:533
+#: ../src/empathy-main-window.c:536
msgid "No match found"
msgstr "Eşleşme bulunamadı"
-#: ../src/empathy-main-window.c:688
+#: ../src/empathy-main-window.c:691
msgid "Reconnect"
msgstr "Yeniden Bağlan"
-#: ../src/empathy-main-window.c:694
+#: ../src/empathy-main-window.c:697
msgid "Edit Account"
msgstr "Hesabı Düzenle"
-#: ../src/empathy-main-window.c:700
+#: ../src/empathy-main-window.c:703
msgid "Close"
msgstr "Kapat"
-#: ../src/empathy-main-window.c:1418
+#: ../src/empathy-main-window.c:1421
msgid "Contact"
msgstr "Bağlantı"
-#: ../src/empathy-main-window.c:1765
+#: ../src/empathy-main-window.c:1768
msgid "Contact List"
msgstr "Bağlantı Listesi"
-#: ../src/empathy-main-window.c:1881
+#: ../src/empathy-main-window.c:1884
msgid "Show and edit accounts"
msgstr "Hesapları göster ve düzenle"
@@ -4091,7 +4085,6 @@ msgid "Accept"
msgstr "Kabul Et"
#: ../src/empathy-notifications-approver.c:223
-#| msgid "Preview"
msgid "Provide"
msgstr "Sağla"
@@ -4105,6 +4098,11 @@ msgstr "Cevapsız çağrı %s"
msgid "%s just tried to call you, but you were in another call."
msgstr "%s sizi aramayı denedi, fakat siz başka bir arama ile meşguldünüz."
+#: ../libempathy-gtk/empathy-search-bar.c:282
+#| msgid "Match case"
+msgid "_Match case"
+msgstr "_BÜYÜK/küçük harf eşleştir"
+
#~ msgid "_Enabled"
#~ msgstr "_Etkin"
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>