\n
\n
▼ '+
+((__t=( unread_msgs ))==null?'':__t)+
+' ▼
\n ';
if (show_textarea) {
__p+='\n
\n
'+
+'" type="text"/>\n\n';
+ }
+__p+='\n
'+
((__t=(label_occupants))==null?'':__t)+
':
\n
\n\n';
}
@@ -25784,6 +25739,16 @@ define("converse-templates", [
'list-multi': 'dropdown'
};
+ var isImage = function (url) {
+ var deferred = new $.Deferred();
+ $("
", {
+ src: url,
+ error: deferred.reject,
+ load: deferred.resolve
+ });
+ return deferred.promise();
+ };
+
$.expr[':'].emptyVal = function(obj){
return obj.value === '';
};
@@ -25798,19 +25763,33 @@ define("converse-templates", [
return false;
};
+ $.fn.throttledHTML = _.throttle($.fn.html, 500);
+
$.fn.addHyperlinks = function () {
if (this.length > 0) {
this.each(function (i, obj) {
- var x = $(obj).html();
+ var prot, escaped_url;
+ var $obj = $(obj);
+ var x = $obj.html();
var list = x.match(/\b(https?:\/\/|www\.|https?:\/\/www\.)[^\s<]{2,200}\b/g );
if (list) {
for (i=0; i
'+ list[i] + '' );
}
}
- $(obj).html(x);
+ $obj.html(x);
+ _.each(list, function (url) {
+ isImage(url).then(function () {
+ var prot = url.indexOf('http://') === 0 || url.indexOf('https://') === 0 ? '' : 'http://';
+ var escaped_url = encodeURI(decodeURI(url)).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
+ var new_url = ''+ url + '';
+ event.target.className = 'chat-image';
+ x = x.replace(new_url, event.target.outerHTML);
+ $obj.throttledHTML(x);
+ });
+ });
});
}
return this;
@@ -25889,6 +25868,12 @@ define("converse-templates", [
return str;
},
+ isOTRMessage: function (message) {
+ var $body = $(message).children('body'),
+ text = ($body.length > 0 ? $body.text() : undefined);
+ return text && !!text.match(/^\?OTR/);
+ },
+
isHeadlineMessage: function (message) {
var $message = $(message),
from_jid = $message.attr('from');
@@ -26082,6 +26067,174 @@ if (!String.prototype.trim) {
;
define("polyfill", function(){});
+/*
+ * ____ __ __ __ _
+ * / __ \/ /_ __ ___ ___ ____ _/ /_ / /__ (_)____
+ * / /_/ / / / / / __ \/ __ \/ __/ / __ \/ / _ \ / / ___/
+ * / ____/ / /_/ / /_/ / /_/ / /_/ / /_/ / / __/ / (__ )
+ * /_/ /_/\__,_/\__, /\__, /\__/_/_.___/_/\___(_)_/ /____/
+ * /____//____/ /___/
+ *
+ */
+(function (root, factory) {
+ define("converse-pluggable", ["jquery", "underscore"], factory);
+}(this, function ($, _) {
+ "use strict";
+
+ function Pluggable (plugged) {
+ this.plugged = plugged;
+ this.plugged._super = {};
+ this.plugins = {};
+ this.initialized_plugins = [];
+ }
+ _.extend(Pluggable.prototype, {
+ wrappedOverride: function (key, value, super_method) {
+ /* We create a partially applied wrapper function, that
+ * makes sure to set the proper super method when the
+ * overriding method is called. This is done to enable
+ * chaining of plugin methods, all the way up to the
+ * original method.
+ */
+ if (typeof super_method === "function") {
+ this._super[key] = super_method.bind(this);
+ }
+ return value.apply(this, _.rest(arguments, 3));
+ },
+
+ _overrideAttribute: function (key, plugin) {
+ /* Overrides an attribute on the original object (the thing being
+ * plugged into).
+ *
+ * If the attribute being overridden is a function, then the original
+ * function will still be available via the _super attribute.
+ *
+ * If the same function is being overridden multiple times, then
+ * the original function will be available at the end of a chain of
+ * functions, starting from the most recent override, all the way
+ * back to the original function, each being referenced by the
+ * previous' _super attribute.
+ *
+ * For example:
+ *
+ * plugin2.MyFunc._super.myFunc => * plugin1.MyFunc._super.myFunc => original.myFunc
+ */
+ var value = plugin.overrides[key];
+ if (typeof value === "function") {
+ var wrapped_function = _.partial(
+ this.wrappedOverride, key, value, this.plugged[key]
+ );
+ this.plugged[key] = wrapped_function;
+ } else {
+ this.plugged[key] = value;
+ }
+ },
+
+ _extendObject: function (obj, attributes) {
+ if (!obj.prototype._super) {
+ // FIXME: make generic
+ obj.prototype._super = {'converse': this.plugged };
+ }
+ _.each(attributes, function (value, key) {
+ if (key === 'events') {
+ obj.prototype[key] = _.extend(value, obj.prototype[key]);
+ } else if (typeof value === 'function') {
+ // We create a partially applied wrapper function, that
+ // makes sure to set the proper super method when the
+ // overriding method is called. This is done to enable
+ // chaining of plugin methods, all the way up to the
+ // original method.
+ var wrapped_function = _.partial(
+ this.wrappedOverride, key, value, obj.prototype[key]
+ );
+ obj.prototype[key] = wrapped_function;
+ } else {
+ obj.prototype[key] = value;
+ }
+ }.bind(this));
+ },
+
+ loadOptionalDependencies: function (plugin) {
+ _.each(plugin.optional_dependencies, function (name) {
+ var dep = this.plugins[name];
+ if (dep) {
+ if (_.contains(dep.optional_dependencies, plugin.__name__)) {
+ // FIXME: circular dependency checking is only one level deep.
+ throw "Found a circular dependency between the plugins \""+
+ plugin.__name__+"\" and \""+name+"\"";
+ }
+ this.initializePlugin(dep);
+ } else {
+ this.throwUndefinedDependencyError(
+ "Could not find optional dependency \""+name+"\" "+
+ "for the plugin \""+plugin.__name__+"\". "+
+ "If it's needed, make sure it's loaded by require.js");
+ }
+ }.bind(this));
+ },
+
+ throwUndefinedDependencyError: function (msg) {
+ if (this.plugged.strict_plugin_dependencies) {
+ throw msg;
+ } else {
+ console.log(msg);
+ return;
+ }
+ },
+
+ applyOverrides: function (plugin) {
+ _.each(Object.keys(plugin.overrides || {}), function (key) {
+ /* We automatically override all methods and Backbone views and
+ * models that are in the "overrides" namespace.
+ */
+ var override = plugin.overrides[key];
+ if (typeof override === "object") {
+ if (typeof this.plugged[key] === 'undefined') {
+ this.throwUndefinedDependencyError("Error: Plugin \""+plugin.__name__+"\" tried to override "+key+" but it's not found.");
+ } else {
+ this._extendObject(this.plugged[key], override);
+ }
+ } else {
+ this._overrideAttribute(key, plugin);
+ }
+ }.bind(this));
+ },
+
+ initializePlugin: function (plugin) {
+ if (_.contains(this.initialized_plugins, plugin.__name__)) {
+ // Don't initialize plugins twice, otherwise we get
+ // infinite recursion in overridden methods.
+ return;
+ }
+ _.extend(plugin, this.properties);
+ if (plugin.optional_dependencies) {
+ this.loadOptionalDependencies(plugin);
+ }
+ this.applyOverrides(plugin);
+ if (typeof plugin.initialize === "function") {
+ plugin.initialize.bind(plugin)(this);
+ }
+ this.initialized_plugins.push(plugin.__name__);
+ },
+
+ initializePlugins: function (properties) {
+ /* The properties variable is an object of attributes and methods
+ * which will be attached to the plugins.
+ */
+ if (!_.size(this.plugins)) {
+ return;
+ }
+ this.properties = properties;
+ _.each(_.values(this.plugins), this.initializePlugin.bind(this));
+ }
+ });
+ return {
+ 'enable': function (object) {
+ /* Call this method to make an object pluggable */
+ return _.extend(object, {'pluggable': new Pluggable(object)});
+ }
+ };
+}));
+
/*
Copyright 2010, François de Metz
*/
@@ -28336,11 +28489,12 @@ return Backbone.BrowserStorage;
"moment_with_locales",
"strophe",
"converse-templates",
+ "converse-pluggable",
"strophe.disco",
"backbone.browserStorage",
"backbone.overview",
], factory);
-}(this, function ($, _, dummy, utils, moment, Strophe, templates) {
+}(this, function ($, _, dummy, utils, moment, Strophe, templates, pluggable) {
/*
* Cannot use this due to Safari bug.
* See https://github.com/jcbrand/converse.js/issues/196
@@ -28371,26 +28525,31 @@ return Backbone.BrowserStorage;
var event_context = {};
var converse = {
- plugins: {},
- initialized_plugins: [],
templates: templates,
+
emit: function (evt, data) {
$(event_context).trigger(evt, data);
},
+
once: function (evt, handler) {
$(event_context).one(evt, handler);
},
+
on: function (evt, handler) {
if (_.contains(['ready', 'initialized'], evt)) {
converse.log('Warning: The "'+evt+'" event has been deprecated and will be removed, please use "connected".');
}
$(event_context).bind(evt, handler);
},
+
off: function (evt, handler) {
$(event_context).unbind(evt, handler);
}
};
+ // Make converse pluggable
+ pluggable.enable(converse);
+
// Module-level constants
converse.STATUS_WEIGHTS = {
'offline': 6,
@@ -28439,6 +28598,7 @@ return Backbone.BrowserStorage;
converse.initialize = function (settings, callback) {
"use strict";
+ var init_deferred = new $.Deferred();
var converse = this;
var unloadevent;
if ('onpagehide' in window) {
@@ -28464,6 +28624,7 @@ return Backbone.BrowserStorage;
Strophe.addNamespace('ROSTERX', 'http://jabber.org/protocol/rosterx');
Strophe.addNamespace('XFORM', 'jabber:x:data');
Strophe.addNamespace('NICK', 'http://jabber.org/protocol/nick');
+ Strophe.addNamespace('HINTS', 'urn:xmpp:hints');
// Instance level constants
this.TIMEOUTS = { // Set as module attr so that we can override in tests.
@@ -28517,7 +28678,7 @@ return Backbone.BrowserStorage;
}
}
};
-
+
this.detectLocale = function (library_check) {
/* Determine which locale is supported by the user's system as well
* as by the relevant library (e.g. converse.js or moment.js).
@@ -28545,12 +28706,12 @@ return Backbone.BrowserStorage;
}
return locale || 'en';
};
-
+
if (!moment.locale) { //moment.lang is deprecated after 2.8.1, use moment.locale instead
moment.locale = moment.lang;
}
moment.locale(this.detectLocale(this.isMomentLocale));
- this.i18n = settings.i18n ? settings.i18n : locales[this.detectLocale(this.isConverseLocale)];
+ this.i18n = settings.i18n ? settings.i18n : locales[this.detectLocale(this.isConverseLocale)] || {};
// Translation machinery
// ---------------------
@@ -28571,7 +28732,9 @@ return Backbone.BrowserStorage;
credentials_url: null, // URL from where login credentials can be fetched
csi_waiting_time: 0, // Support for XEP-0352. Seconds before client is considered idle and CSI is sent out.
debug: false,
+ default_state: 'online',
expose_rid_and_sid: false,
+ filter_by_resource: false,
forward_messages: false,
hide_offline_users: false,
include_offline_state: false,
@@ -28668,7 +28831,9 @@ return Backbone.BrowserStorage;
}
if (converse.auto_changed_status === true) {
converse.auto_changed_status = false;
- converse.xmppstatus.setStatus('online');
+ // XXX: we should really remember the original state here, and
+ // then set it back to that...
+ converse.xmppstatus.setStatus(converse.default_state);
}
};
@@ -28755,11 +28920,11 @@ return Backbone.BrowserStorage;
}, 1000);
this.onDisconnected = function (condition) {
- if (!converse.auto_reconnect) { return; }
- if (converse.disconnection_cause === Strophe.Status.CONNFAIL) {
+ if (converse.disconnection_cause === Strophe.Status.CONNFAIL && converse.auto_reconnect) {
converse.reconnect(condition);
return 'reconnecting';
} else {
+ converse._tearDown();
converse.emit('disconnected');
return 'disconnected';
}
@@ -28816,8 +28981,6 @@ return Backbone.BrowserStorage;
} else {
document.title = document.title.replace(/^Messages \(\d+\) /, "Messages (" + this.msg_counter + ") ");
}
- window.blur();
- window.focus();
} else if (document.title.search(/^Messages \(\d+\) /) !== -1) {
document.title = document.title.replace(/^Messages \(\d+\) /, "");
}
@@ -28871,13 +29034,57 @@ return Backbone.BrowserStorage;
}
};
+ this.saveWindowState = function (ev, hidden) {
+ // XXX: eventually we should be able to just use
+ // document.visibilityState (when we drop support for older
+ // browsers).
+ var state;
+ var v = "visible", h = "hidden",
+ event_map = {
+ 'focus': v,
+ 'focusin': v,
+ 'pageshow': v,
+ 'blur': h,
+ 'focusout': h,
+ 'pagehide': h
+ };
+ ev = ev || document.createEvent('Events');
+ if (ev.type in event_map) {
+ state = event_map[ev.type];
+ } else {
+ state = document[hidden] ? "hidden" : "visible";
+ }
+ if (state === 'visible') {
+ converse.clearMsgCounter();
+ }
+ converse.windowState = state;
+
+ };
+
this.registerGlobalEventHandlers = function () {
- $(window).on("blur focus", function (ev) {
- if ((converse.windowState !== ev.type) && (ev.type === 'focus')) {
- converse.clearMsgCounter();
- }
- converse.windowState = ev.type;
- });
+ // Taken from:
+ // http://stackoverflow.com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-is-not-currently-active
+ var hidden = "hidden";
+ // Standards:
+ if (hidden in document) {
+ document.addEventListener("visibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "mozHidden") in document) {
+ document.addEventListener("mozvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "webkitHidden") in document) {
+ document.addEventListener("webkitvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "msHidden") in document) {
+ document.addEventListener("msvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ("onfocusin" in document) {
+ // IE 9 and lower:
+ document.onfocusin = document.onfocusout = _.partial(converse.saveWindowState, _, hidden);
+ } else {
+ // All others:
+ window.onpageshow = window.onpagehide = window.onfocus = window.onblur = _.partial(converse.saveWindowState, _, hidden);
+ }
+ // set the initial state (but only if browser supports the Page Visibility API)
+ if( document[hidden] !== undefined ) {
+ _.partial(converse.saveWindowState, _, hidden)({type: document[hidden] ? "blur" : "focus"});
+ }
};
this.afterReconnected = function () {
@@ -28923,28 +29130,22 @@ return Backbone.BrowserStorage;
};
- this.onStatusInitialized = function (deferred) {
- this.registerIntervalHandler();
+ this.onStatusInitialized = function () {
+ this.registerIntervalHandler();
this.roster = new this.RosterContacts();
this.roster.browserStorage = new Backbone.BrowserStorage[this.storage](
b64_sha1('converse.contacts-'+this.bare_jid));
this.chatboxes.onConnected();
this.giveFeedback(__('Contacts'));
if (typeof this.callback === 'function') {
- // A callback method may be passed in via the
- // converse.initialize method.
- // XXX: Can we use $.Deferred instead of this callback?
- if (this.connection.service === 'jasmine tests') {
- // XXX: Call back with the internal converse object. This
- // object should never be exposed to production systems.
- // 'jasmine tests' is an invalid http bind service value,
- // so we're sure that this is just for tests.
- this.callback(this);
- } else {
- this.callback();
- }
+ // XXX: Deprecate in favor of init_deferred
+ this.callback();
+ }
+ if (converse.connection.service === 'jasmine tests') {
+ init_deferred.resolve(converse);
+ } else {
+ init_deferred.resolve();
}
- deferred.resolve();
converse.emit('initialized');
};
@@ -28952,7 +29153,6 @@ return Backbone.BrowserStorage;
// When reconnecting, there might be some open chat boxes. We don't
// know whether these boxes are of the same account or not, so we
// close them now.
- var deferred = new $.Deferred();
// XXX: ran into an issue where a returned PubSub BOSH response was
// not received by the browser. The solution was to flush the
// connection early on. I don't know what the underlying cause of
@@ -28972,13 +29172,11 @@ return Backbone.BrowserStorage;
this.domain = Strophe.getDomainFromJid(this.connection.jid);
this.features = new this.Features();
this.enableCarbons();
- this.initStatus().done(_.bind(this.onStatusInitialized, this, deferred));
+ this.initStatus().done(_.bind(this.onStatusInitialized, this));
converse.emit('connected');
converse.emit('ready'); // BBB: Will be removed.
- return deferred.promise();
};
-
this.RosterContact = Backbone.Model.extend({
initialize: function (attributes, options) {
@@ -29447,7 +29645,6 @@ return Backbone.BrowserStorage;
this.Message = Backbone.Model.extend({
- idAttribute: 'msgid',
defaults: function(){
return {
msgid: converse.connection.getUniqueId()
@@ -29480,13 +29677,12 @@ return Backbone.BrowserStorage;
});
},
- createMessage: function ($message, $delay) {
+ getMessageAttributes: function ($message, $delay, original_stanza) {
$delay = $delay || $message.find('delay');
var body = $message.children('body').text(),
delayed = $delay.length > 0,
fullname = this.get('fullname'),
is_groupchat = $message.attr('type') === 'groupchat',
- msgid = $message.attr('id'),
chat_state = $message.find(converse.COMPOSING).length && converse.COMPOSING ||
$message.find(converse.PAUSED).length && converse.PAUSED ||
$message.find(converse.INACTIVE).length && converse.INACTIVE ||
@@ -29513,18 +29709,22 @@ return Backbone.BrowserStorage;
} else {
sender = 'them';
}
- return this.messages.create({
+ return {
chat_state: chat_state,
delayed: delayed,
fullname: fullname,
message: body || undefined,
- msgid: msgid,
+ msgid: $message.attr('id'),
sender: sender,
time: time
- });
+ };
+ },
+
+ createMessage: function ($message, $delay, original_stanza) {
+ return this.messages.create(this.getMessageAttributes.apply(this, arguments));
}
});
-
+
this.ChatBoxes = Backbone.Collection.extend({
model: converse.ChatBox,
comparator: 'time_opened',
@@ -29577,20 +29777,12 @@ return Backbone.BrowserStorage;
to_jid = $message.attr('to'),
to_resource = Strophe.getResourceFromJid(to_jid);
- if (to_resource && to_resource !== converse.resource) {
+ if (converse.filter_by_resource && (to_resource && to_resource !== converse.resource)) {
converse.log(
'onMessage: Ignoring incoming message intended for a different resource: '+to_jid,
'info'
);
return true;
- } else if (from_jid === converse.connection.jid) {
- // FIXME: Forwarded messages should be sent to specific
- // resources, not broadcasted
- converse.log(
- "onMessage: Ignoring incoming message sent from this client's JID: "+from_jid,
- 'info'
- );
- return true;
} else if (utils.isHeadlineMessage(message)) {
// XXX: Ideally we wouldn't have to check for headline
// messages, but Prosody sends headline messages with the
@@ -29629,7 +29821,7 @@ return Backbone.BrowserStorage;
if (msgid && chatbox.messages.findWhere({msgid: msgid})) {
return true; // We already have this message stored.
}
- chatbox.createMessage($message, $delay);
+ chatbox.createMessage($message, $delay, message);
converse.roster.addResource(contact_jid, resource);
converse.emit('message', message);
return true;
@@ -29712,18 +29904,23 @@ return Backbone.BrowserStorage;
return this.model.chatBoxMayBeShown(chatbox);
},
- showChat: function (attrs) {
- /* Find the chat box and show it (if it may be shown).
- * If it doesn't exist, create it.
- */
+ getChatBox: function (attrs, create) {
var chatbox = this.model.get(attrs.jid);
- if (!chatbox) {
+ if (!chatbox && create) {
chatbox = this.model.create(attrs, {
'error': function (model, response) {
converse.log(response.responseText);
}
});
}
+ return chatbox;
+ },
+
+ showChat: function (attrs) {
+ /* Find the chat box and show it (if it may be shown).
+ * If it doesn't exist, create it.
+ */
+ var chatbox = this.getChatBox(attrs, true);
if (this.chatBoxMayBeShown(chatbox)) {
chatbox.trigger('show', true);
}
@@ -29748,15 +29945,11 @@ return Backbone.BrowserStorage;
},
constructPresence: function (type, status_message) {
- if (typeof type !== 'string') {
- type = this.get('status') || 'online';
- }
- if (typeof status_message !== 'string') {
- status_message = this.get('status_message');
- }
var presence;
+ type = typeof type === 'string' ? type : (this.get('status') || converse.default_state);
+ status_message = typeof status_message === 'string' ? status_message : undefined;
// Most of these presence types are actually not explicitly sent,
- // but I add all of them here fore reference and future proofing.
+ // but I add all of them here for reference and future proofing.
if ((type === 'unavailable') ||
(type === 'probe') ||
(type === 'error') ||
@@ -29767,18 +29960,13 @@ return Backbone.BrowserStorage;
presence = $pres({'type': type});
} else if (type === 'offline') {
presence = $pres({'type': 'unavailable'});
- if (status_message) {
- presence.c('show').t(type);
- }
+ } else if (type === 'online') {
+ presence = $pres();
} else {
- if (type === 'online') {
- presence = $pres();
- } else {
- presence = $pres().c('show').t(type).up();
- }
- if (status_message) {
- presence.c('status').t(status_message);
- }
+ presence = $pres().c('show').t(type).up();
+ }
+ if (status_message) {
+ presence.c('status').t(status_message);
}
return presence;
},
@@ -29793,7 +29981,7 @@ return Backbone.BrowserStorage;
},
getStatus: function () {
- return this.get('status') || 'online';
+ return this.get('status') || converse.default_state;
},
setStatusMessage: function (status_message) {
@@ -29894,6 +30082,9 @@ return Backbone.BrowserStorage;
});
this.setUpXMLLogging = function () {
+ Strophe.log = function (level, msg) {
+ converse.log(msg, level);
+ };
if (this.debug) {
this.connection.xmlInput = function (body) { converse.log(body.outerHTML); };
this.connection.xmlOutput = function (body) { converse.log(body.outerHTML); };
@@ -30005,7 +30196,7 @@ return Backbone.BrowserStorage;
*/
if (this.keepalive) {
try {
- return this.connection.restore(undefined, this.onConnectStatusChanged);
+ return this.connection.restore(this.jid, this.onConnectStatusChanged);
} catch (e) {
this.log("Could not restore session. Error message: "+e.message);
this.clearSession(); // If there's a roster, we want to clear it (see #555)
@@ -30085,116 +30276,28 @@ return Backbone.BrowserStorage;
return this;
};
- this.wrappedOverride = function (key, value, super_method) {
- // We create a partially applied wrapper function, that
- // makes sure to set the proper super method when the
- // overriding method is called. This is done to enable
- // chaining of plugin methods, all the way up to the
- // original method.
- this._super[key] = super_method;
- return value.apply(this, _.rest(arguments, 3));
- };
-
- this._overrideAttribute = function (key, plugin) {
- // See converse.plugins.override
- var value = plugin.overrides[key];
- if (typeof value === "function") {
- var wrapped_function = _.partial(
- converse.wrappedOverride.bind(converse),
- key, value, converse[key].bind(converse)
- );
- converse[key] = wrapped_function;
- } else {
- converse[key] = value;
- }
- };
-
- this._extendObject = function (obj, attributes) {
- // See converse.plugins.extend
- if (!obj.prototype._super) {
- obj.prototype._super = {'converse': converse};
- }
- _.each(attributes, function (value, key) {
- if (key === 'events') {
- obj.prototype[key] = _.extend(value, obj.prototype[key]);
- } else if (typeof value === 'function') {
- // We create a partially applied wrapper function, that
- // makes sure to set the proper super method when the
- // overriding method is called. This is done to enable
- // chaining of plugin methods, all the way up to the
- // original method.
- var wrapped_function = _.partial(
- converse.wrappedOverride,
- key, value, obj.prototype[key]
- );
- obj.prototype[key] = wrapped_function;
- } else {
- obj.prototype[key] = value;
- }
- });
- };
-
- this.initializePlugins = function () {
- if (typeof converse._super === 'undefined') {
- converse._super = { 'converse': converse };
- }
-
- var updateSettings = function (settings) {
- /* Helper method which gets put on the plugin and allows it to
- * add more user-facing config settings to converse.js.
- */
- _.extend(converse.default_settings, settings);
- _.extend(converse, settings);
- _.extend(converse, _.pick(converse.user_settings, Object.keys(settings)));
- };
-
- _.each(_.keys(this.plugins), function (name) {
- var plugin = this.plugins[name];
- plugin.updateSettings = updateSettings;
-
- if (_.contains(this.initialized_plugins, name)) {
- // Don't initialize plugins twice, otherwise we get
- // infinite recursion in overridden methods.
- return;
- }
- plugin.converse = converse;
- _.each(Object.keys(plugin.overrides || {}), function (key) {
- /* We automatically override all methods and Backbone views and
- * models that are in the "overrides" namespace.
- */
- var msg,
- override = plugin.overrides[key];
- if (typeof override === "object") {
- if (typeof converse[key] === 'undefined') {
- msg = "Error: Plugin tried to override "+key+" but it's not found.";
- if (converse.strict_plugin_dependencies) {
- throw msg;
- } else {
- converse.log(msg);
- }
- }
- this._extendObject(converse[key], override);
- } else {
- this._overrideAttribute(key, plugin);
- }
- }.bind(this));
-
- if (typeof plugin.initialize === "function") {
- plugin.initialize.bind(plugin)(this);
- }
- this.initialized_plugins.push(name);
- }.bind(this));
- };
-
// Initialization
// --------------
// This is the end of the initialize method.
if (settings.connection) {
this.connection = settings.connection;
}
- this.initializePlugins();
- this._initialize();
- this.registerGlobalEventHandlers();
+ var updateSettings = function (settings) {
+ /* Helper method which gets put on the plugin and allows it to
+ * add more user-facing config settings to converse.js.
+ */
+ _.extend(converse.default_settings, settings);
+ _.extend(converse, settings);
+ _.extend(converse, _.pick(converse.user_settings, Object.keys(settings)));
+ };
+ converse.pluggable.initializePlugins({
+ 'updateSettings': updateSettings,
+ 'converse': converse
+ });
+ converse.emit('pluginsInitialized');
+ converse._initialize();
+ converse.registerGlobalEventHandlers();
+ return init_deferred.promise();
};
return converse;
}));
@@ -30224,8 +30327,9 @@ return Backbone.BrowserStorage;
var Strophe = strophe.Strophe;
return {
'initialize': function (settings, callback) {
- converse.initialize(settings, callback);
+ return converse.initialize(settings, callback);
},
+ 'log': converse.log,
'connection': {
'connected': function () {
return converse.connection && converse.connection.connected || false;
@@ -30333,7 +30437,13 @@ return Backbone.BrowserStorage;
} else if (typeof jids === "string") {
return converse.wrappedChatBox(converse.chatboxes.getChatBox(jids, true));
}
- return _.map(jids, _.partial(_.compose(converse.wrappedChatBox, converse.chatboxes.getChatBox.bind(converse.chatboxes)), _, true));
+ return _.map(jids,
+ _.partial(
+ _.compose(
+ converse.wrappedChatBox.bind(converse), converse.chatboxes.getChatBox.bind(converse.chatboxes)
+ ), _, true
+ )
+ );
}
},
'tokens': {
@@ -30381,7 +30491,8 @@ return Backbone.BrowserStorage;
},
'plugins': {
'add': function (name, plugin) {
- converse.plugins[name] = plugin;
+ plugin.__name__ = name;
+ converse.pluggable.plugins[name] = plugin;
},
'remove': function (name) {
delete converse.plugins[name];
@@ -31568,7 +31679,7 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
};
- converse_api.plugins.add('chatview', {
+ converse_api.plugins.add('converse-chatview', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -31612,7 +31723,8 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
'click .toggle-smiley': 'toggleEmoticonMenu',
'click .toggle-smiley ul li': 'insertEmoticon',
'click .toggle-clear': 'clearMessages',
- 'click .toggle-call': 'toggleCall'
+ 'click .toggle-call': 'toggleCall',
+ 'click .new-msgs-indicator': 'viewUnreadMessages'
},
initialize: function () {
@@ -31627,6 +31739,12 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
this.model.on('showHelpMessages', this.showHelpMessages, this);
this.model.on('sendMessage', this.sendMessage, this);
this.render().fetchMessages().insertIntoPage().hide();
+ // XXX: adding the event below to the events map above doesn't work.
+ // The code that gets executed because of that looks like this:
+ // this.$el.on('scroll', '.chat-content', this.markScrolled.bind(this));
+ // Which for some reason doesn't work.
+ // So working around that fact here:
+ this.$el.find('.chat-content').on('scroll', this.markScrolled.bind(this));
converse.emit('chatBoxInitialized', this);
},
@@ -31637,6 +31755,7 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
show_toolbar: converse.show_toolbar,
show_textarea: true,
title: this.model.get('fullname'),
+ unread_msgs: __('You have unread messages'),
info_close: __('Close this chat box'),
label_personal_message: __('Personal message')
}
@@ -31679,11 +31798,8 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
if (!keep_old) {
this.clearStatusNotification();
}
- var was_at_bottom = this.$content.scrollTop() + this.$content.innerHeight() >= this.$content[0].scrollHeight;
this.$content.append($('').text(message));
- if (was_at_bottom) {
- this.scrollDown();
- }
+ this.scrollDown();
},
addSpinner: function () {
@@ -31698,30 +31814,37 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
}
},
- prependDayIndicator: function (date) {
- /* Prepends an indicator into the chat area, showing the day as
- * given by the passed in date.
+ insertDayIndicator: function (date, prepend) {
+ /* Appends (or prepends if "prepend" is truthy) an indicator
+ * into the chat area, showing the day as given by the
+ * passed in date.
*
* Parameters:
* (String) date - An ISO8601 date string.
*/
var day_date = moment(date).startOf('day');
- this.$content.prepend(converse.templates.new_day({
+ var insert = prepend ? this.$content.prepend: this.$content.append;
+ insert.call(this.$content, converse.templates.new_day({
isodate: day_date.format(),
datestring: day_date.format("dddd MMM Do YYYY")
}));
},
- appendMessage: function (attrs) {
- /* Helper method which appends a message to the end of the chat
- * box's content area.
+ insertMessage: function (attrs, prepend) {
+ /* Helper method which appends a message (or prepends if the
+ * 2nd parameter is set to true) to the end of the chat box's
+ * content area.
*
* Parameters:
* (Object) attrs: An object containing the message attributes.
*/
+ var insert = prepend ? this.$content.prepend : this.$content.append;
_.compose(
- _.debounce(this.scrollDown.bind(this), 50),
- this.$content.append.bind(this.$content)
+ this.scrollDownMessageHeight.bind(this),
+ function ($el) {
+ insert.call(this.$content, $el);
+ return $el;
+ }.bind(this)
)(this.renderMessage(attrs));
},
@@ -31736,79 +31859,54 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
* Parameters:
* (Object) attrs: An object containing the message attributes.
*/
- var $first_msg = this.$content.children('.chat-message:first'),
+ var msg_dates, idx,
+ $first_msg = this.$content.children('.chat-message:first'),
first_msg_date = $first_msg.data('isodate'),
- last_msg_date, current_msg_date, day_date, $msgs, msg_dates, idx;
+ current_msg_date = moment(attrs.time) || moment,
+ last_msg_date = this.$content.children('.chat-message:last').data('isodate');
+
if (!first_msg_date) {
- this.appendMessage(attrs);
+ // This is the first received message, so we insert a
+ // date indicator before it.
+ this.insertDayIndicator(current_msg_date);
+ this.insertMessage(attrs);
return;
}
- current_msg_date = moment(attrs.time) || moment;
- last_msg_date = this.$content.children('.chat-message:last').data('isodate');
-
- if (typeof last_msg_date !== "undefined" && (current_msg_date.isAfter(last_msg_date) || current_msg_date.isSame(last_msg_date))) {
+ if (current_msg_date.isAfter(last_msg_date) || current_msg_date.isSame(last_msg_date)) {
// The new message is after the last message
if (current_msg_date.isAfter(last_msg_date, 'day')) {
// Append a new day indicator
- day_date = moment(current_msg_date).startOf('day');
- this.$content.append(converse.templates.new_day({
- isodate: current_msg_date.format(),
- datestring: current_msg_date.format("dddd MMM Do YYYY")
- }));
+ this.insertDayIndicator(current_msg_date);
}
- this.appendMessage(attrs);
+ this.insertMessage(attrs);
return;
}
-
- if (typeof first_msg_date !== "undefined" &&
- (current_msg_date.isBefore(first_msg_date) ||
- (current_msg_date.isSame(first_msg_date) && !current_msg_date.isSame(last_msg_date)))) {
- // The new message is before the first message
-
- if ($first_msg.prev().length === 0) {
- // There's no day indicator before the first message, so we prepend one.
- this.prependDayIndicator(first_msg_date);
- }
+ if (current_msg_date.isBefore(first_msg_date) || current_msg_date.isSame(first_msg_date)) {
+ // The message is before the first, but on the same day.
+ // We need to prepend the message immediately before the
+ // first message (so that it'll still be after the day indicator).
+ this.insertMessage(attrs, 'prepend');
if (current_msg_date.isBefore(first_msg_date, 'day')) {
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- this.$content.prepend($el);
- return $el;
- }.bind(this)
- )(this.renderMessage(attrs));
- // This message is on a different day, so we add a day indicator.
- this.prependDayIndicator(current_msg_date);
- } else {
- // The message is before the first, but on the same day.
- // We need to prepend the message immediately before the
- // first message (so that it'll still be after the day indicator).
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- $el.insertBefore($first_msg);
- return $el;
- }
- )(this.renderMessage(attrs));
+ // This message is also on a different day, so we prepend a day indicator.
+ this.insertDayIndicator(current_msg_date, 'prepend');
}
- } else {
- // We need to find the correct place to position the message
- current_msg_date = current_msg_date.format();
- $msgs = this.$content.children('.chat-message');
- msg_dates = _.map($msgs, function (el) {
- return $(el).data('isodate');
- });
- msg_dates.push(current_msg_date);
- msg_dates.sort();
- idx = msg_dates.indexOf(current_msg_date)-1;
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- $el.insertAfter(this.$content.find('.chat-message[data-isodate="'+msg_dates[idx]+'"]'));
- return $el;
- }.bind(this)
- )(this.renderMessage(attrs));
+ return;
}
+ // Find the correct place to position the message
+ current_msg_date = current_msg_date.format();
+ msg_dates = _.map(this.$content.children('.chat-message'), function (el) {
+ return $(el).data('isodate');
+ });
+ msg_dates.push(current_msg_date);
+ msg_dates.sort();
+ idx = msg_dates.indexOf(current_msg_date)-1;
+ _.compose(
+ this.scrollDownMessageHeight.bind(this),
+ function ($el) {
+ $el.insertAfter(this.$content.find('.chat-message[data-isodate="'+msg_dates[idx]+'"]'));
+ return $el;
+ }.bind(this)
+ )(this.renderMessage(attrs));
},
renderMessage: function (attrs) {
@@ -31886,13 +31984,40 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
return !this.$el.is(':visible');
},
+ updateNewMessageIndicators: function (message) {
+ /* We have two indicators of new messages. The unread messages
+ * counter, which shows the number of unread messages in
+ * the document.title, and the "new messages" indicator in
+ * a chat area, if it's scrolled up so that new messages
+ * aren't visible.
+ *
+ * In both cases we ignore MAM messages.
+ */
+ if (!message.get('archive_id')) {
+ if (this.model.get('scrolled', true)) {
+ this.$el.find('.new-msgs-indicator').removeClass('hidden');
+ }
+ if (converse.windowState === 'hidden' || this.model.get('scrolled', true)) {
+ converse.incrementMsgCounter();
+ }
+ }
+ },
+
handleTextMessage: function (message) {
this.showMessage(_.clone(message.attributes));
- if ((message.get('sender') !== 'me') && (converse.windowState === 'blur')) {
- converse.incrementMsgCounter();
+ if (message.get('sender') !== 'me') {
+ this.updateNewMessageIndicators(message);
+ } else {
+ // We remove the "scrolled" flag so that the chat area
+ // gets scrolled down. We always want to scroll down
+ // when the user writes a message as opposed to when a
+ // message is received.
+ this.model.set('scrolled', false);
}
if (this.shouldShowOnTextMessage()) {
this.show();
+ } else {
+ this.scrollDown();
}
},
@@ -31991,7 +32116,9 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
*/
converse.connection.send(
$msg({'to':this.model.get('jid'), 'type': 'chat'})
- .c(this.model.get('chat_state'), {'xmlns': Strophe.NS.CHATSTATES})
+ .c(this.model.get('chat_state'), {'xmlns': Strophe.NS.CHATSTATES}).up()
+ .c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
+ .c('no-permanent-store', {'xmlns': Strophe.NS.HINTS})
);
},
@@ -32187,10 +32314,8 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
},
hide: function () {
- if (this.$el.is(':visible') && this.$el.css('opacity') === "1") {
- this.$el.hide();
- utils.refreshWebkit();
- }
+ this.$el.hide();
+ utils.refreshWebkit();
return this;
},
@@ -32228,16 +32353,42 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
return this;
},
+ markScrolled: _.debounce(function (ev) {
+ /* Called when the chat content is scrolled up or down.
+ * We want to record when the user has scrolled away from
+ * the bottom, so that we don't automatically scroll away
+ * from what the user is reading when new messages are
+ * received.
+ */
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var is_at_bottom = this.$content.scrollTop() + this.$content.innerHeight() >= this.$content[0].scrollHeight-10;
+ if (is_at_bottom) {
+ this.model.set('scrolled', false);
+ this.$el.find('.new-msgs-indicator').addClass('hidden');
+ } else {
+ // We're not at the bottom of the chat area, so we mark
+ // that the box is in a scrolled-up state.
+ this.model.set('scrolled', true);
+ }
+ }, 150),
+
+
+ viewUnreadMessages: function () {
+ this.model.set('scrolled', false);
+ this.scrollDown();
+ },
+
scrollDownMessageHeight: function ($message) {
- if (this.$content.is(':visible')) {
+ if (this.$content.is(':visible') && !this.model.get('scrolled')) {
this.$content.scrollTop(this.$content.scrollTop() + $message[0].scrollHeight);
}
return this;
},
scrollDown: function () {
- if (this.$content.is(':visible')) {
+ if (this.$content.is(':visible') && !this.model.get('scrolled')) {
this.$content.scrollTop(this.$content[0].scrollHeight);
+ this.$el.find('.new-msgs-indicator').addClass('hidden');
}
return this;
}
@@ -32246,6 +32397,1657 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
});
}));
+// Converse.js (A browser based XMPP chat client)
+// http://conversejs.org
+//
+// Copyright (c) 2012-2016, Jan-Carel Brand
+// Licensed under the Mozilla Public License (MPLv2)
+//
+/*global Backbone, define */
+
+(function (root, factory) {
+ define("converse-rosterview", ["converse-core", "converse-api"], factory);
+}(this, function (converse, converse_api) {
+ "use strict";
+ var $ = converse_api.env.jQuery,
+ utils = converse_api.env.utils,
+ Strophe = converse_api.env.Strophe,
+ $iq = converse_api.env.$iq,
+ b64_sha1 = converse_api.env.b64_sha1,
+ _ = converse_api.env._,
+ __ = utils.__.bind(converse);
+
+
+ converse_api.plugins.add('rosterview', {
+
+ overrides: {
+ // Overrides mentioned here will be picked up by converse.js's
+ // plugin architecture they will replace existing methods on the
+ // relevant objects or classes.
+ //
+ // New functions which don't exist yet can also be added.
+
+ afterReconnected: function () {
+ this.rosterview.registerRosterXHandler();
+ this.rosterview.registerPresenceHandler();
+ this._super.afterReconnected.apply(this, arguments);
+ }
+ },
+
+
+ initialize: function () {
+ /* The initialize function gets called as soon as the plugin is
+ * loaded by converse.js's plugin machinery.
+ */
+ this.updateSettings({
+ allow_chat_pending_contacts: false,
+ allow_contact_removal: true,
+ show_toolbar: true,
+ });
+
+ var STATUSES = {
+ 'dnd': __('This contact is busy'),
+ 'online': __('This contact is online'),
+ 'offline': __('This contact is offline'),
+ 'unavailable': __('This contact is unavailable'),
+ 'xa': __('This contact is away for an extended period'),
+ 'away': __('This contact is away')
+ };
+ var DESC_GROUP_TOGGLE = __('Click to hide these contacts');
+ var LABEL_CONTACTS = __('Contacts');
+ var LABEL_GROUPS = __('Groups');
+ var HEADER_CURRENT_CONTACTS = __('My contacts');
+ var HEADER_PENDING_CONTACTS = __('Pending contacts');
+ var HEADER_REQUESTING_CONTACTS = __('Contact requests');
+ var HEADER_UNGROUPED = __('Ungrouped');
+ var HEADER_WEIGHTS = {};
+ HEADER_WEIGHTS[HEADER_CURRENT_CONTACTS] = 0;
+ HEADER_WEIGHTS[HEADER_UNGROUPED] = 1;
+ HEADER_WEIGHTS[HEADER_REQUESTING_CONTACTS] = 2;
+ HEADER_WEIGHTS[HEADER_PENDING_CONTACTS] = 3;
+
+ converse.RosterFilter = Backbone.Model.extend({
+ initialize: function () {
+ this.set({
+ 'filter_text': '',
+ 'filter_type': 'contacts',
+ 'chat_state': ''
+ });
+ },
+ });
+
+ converse.RosterFilterView = Backbone.View.extend({
+ tagName: 'span',
+ events: {
+ "keydown .roster-filter": "liveFilter",
+ "click .onX": "clearFilter",
+ "mousemove .x": "toggleX",
+ "change .filter-type": "changeTypeFilter",
+ "change .state-type": "changeChatStateFilter"
+ },
+
+ initialize: function () {
+ this.model.on('change', this.render, this);
+ },
+
+ render: function () {
+ this.$el.html(converse.templates.roster(
+ _.extend(this.model.toJSON(), {
+ placeholder: __('Filter'),
+ label_contacts: LABEL_CONTACTS,
+ label_groups: LABEL_GROUPS,
+ label_state: __('State'),
+ label_any: __('Any'),
+ label_online: __('Online'),
+ label_chatty: __('Chatty'),
+ label_busy: __('Busy'),
+ label_away: __('Away'),
+ label_xa: __('Extended Away'),
+ label_offline: __('Offline')
+ })
+ ));
+ var $roster_filter = this.$('.roster-filter');
+ $roster_filter[this.tog($roster_filter.val())]('x');
+ return this.$el;
+ },
+
+ tog: function (v) {
+ return v?'addClass':'removeClass';
+ },
+
+ toggleX: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var el = ev.target;
+ $(el)[this.tog(el.offsetWidth-18 < ev.clientX-el.getBoundingClientRect().left)]('onX');
+ },
+
+ changeChatStateFilter: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ this.model.save({
+ 'chat_state': this.$('.state-type').val()
+ });
+ },
+
+ changeTypeFilter: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var type = ev.target.value;
+ if (type === 'state') {
+ this.model.save({
+ 'filter_type': type,
+ 'chat_state': this.$('.state-type').val()
+ });
+ } else {
+ this.model.save({
+ 'filter_type': type,
+ 'filter_text': this.$('.roster-filter').val(),
+ });
+ }
+ },
+
+ liveFilter: _.debounce(function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ this.model.save({
+ 'filter_type': this.$('.filter-type').val(),
+ 'filter_text': this.$('.roster-filter').val()
+ });
+ }, 250),
+
+ isActive: function () {
+ /* Returns true if the filter is enabled (i.e. if the user
+ * has added values to the filter).
+ */
+ if (this.model.get('filter_type') === 'state' ||
+ this.model.get('filter_text')) {
+ return true;
+ }
+ return false;
+ },
+
+ show: function () {
+ if (this.$el.is(':visible')) { return this; }
+ this.$el.show();
+ return this;
+ },
+
+ hide: function () {
+ if (!this.$el.is(':visible')) { return this; }
+ if (this.$('.roster-filter').val().length > 0) {
+ // Don't hide if user is currently filtering.
+ return;
+ }
+ this.model.save({
+ 'filter_text': '',
+ 'chat_state': ''
+ });
+ this.$el.hide();
+ return this;
+ },
+
+ clearFilter: function (ev) {
+ if (ev && ev.preventDefault) {
+ ev.preventDefault();
+ $(ev.target).removeClass('x onX').val('');
+ }
+ this.model.save({
+ 'filter_text': ''
+ });
+ }
+ });
+
+ converse.RosterView = Backbone.Overview.extend({
+ tagName: 'div',
+ id: 'converse-roster',
+
+ initialize: function () {
+ this.roster_handler_ref = this.registerRosterHandler();
+ this.rosterx_handler_ref = this.registerRosterXHandler();
+ this.presence_ref = this.registerPresenceHandler();
+ converse.roster.on("add", this.onContactAdd, this);
+ converse.roster.on('change', this.onContactChange, this);
+ converse.roster.on("destroy", this.update, this);
+ converse.roster.on("remove", this.update, this);
+ this.model.on("add", this.onGroupAdd, this);
+ this.model.on("reset", this.reset, this);
+ this.$roster = $('
');
+ // Create a model on which we can store filter properties
+ var model = new converse.RosterFilter();
+ model.id = b64_sha1('converse.rosterfilter'+converse.bare_jid);
+ model.browserStorage = new Backbone.BrowserStorage.local(this.filter.id);
+ this.filter_view = new converse.RosterFilterView({'model': model});
+ this.filter_view.model.on('change', this.updateFilter, this);
+ this.filter_view.model.fetch();
+ },
+
+ render: function () {
+ this.$el.html(this.filter_view.render());
+ if (!converse.allow_contact_requests) {
+ // XXX: if we ever support live editing of config then
+ // we'll need to be able to remove this class on the fly.
+ this.$el.addClass('no-contact-requests');
+ }
+ return this;
+ },
+
+ updateFilter: _.debounce(function () {
+ /* Filter the roster again.
+ * Called whenever the filter settings have been changed or
+ * when contacts have been added, removed or changed.
+ *
+ * Debounced so that it doesn't get called for every
+ * contact fetched from browser storage.
+ */
+ var type = this.filter_view.model.get('filter_type');
+ if (type === 'state') {
+ this.filter(this.filter_view.model.get('chat_state'), type);
+ } else {
+ this.filter(this.filter_view.model.get('filter_text'), type);
+ }
+ }, 100),
+
+ unregisterHandlers: function () {
+ converse.connection.deleteHandler(this.roster_handler_ref);
+ delete this.roster_handler_ref;
+ converse.connection.deleteHandler(this.rosterx_handler_ref);
+ delete this.rosterx_handler_ref;
+ converse.connection.deleteHandler(this.presence_ref);
+ delete this.presence_ref;
+ },
+
+ update: _.debounce(function () {
+ if (this.$roster.parent().length === 0) {
+ this.$el.append(this.$roster.show());
+ }
+ return this.showHideFilter();
+ }, converse.animate ? 100 : 0),
+
+ showHideFilter: function () {
+ if (!this.$el.is(':visible')) {
+ return;
+ }
+ if (this.$roster.hasScrollBar()) {
+ this.filter_view.show();
+ } else if (!this.filter_view.isActive()) {
+ this.filter_view.hide();
+ }
+ return this;
+ },
+
+ fetch: function () {
+ this.model.fetch({
+ silent: true, // We use the success handler to handle groups that were added,
+ // we need to first have all groups before positionFetchedGroups
+ // will work properly.
+ success: function (collection, resp, options) {
+ if (collection.length !== 0) {
+ this.positionFetchedGroups(collection, resp, options);
+ }
+ converse.roster.fetch({
+ add: true,
+ success: function (collection) {
+ if (collection.length === 0) {
+ /* We don't have any roster contacts stored in sessionStorage,
+ * so lets fetch the roster from the XMPP server. We pass in
+ * 'sendPresence' as callback method, because after initially
+ * fetching the roster we are ready to receive presence
+ * updates from our contacts.
+ */
+ converse.roster.fetchFromServer(
+ converse.xmppstatus.sendPresence.bind(converse.xmppstatus));
+ } else {
+ converse.emit('cachedRoster', collection);
+ if (converse.send_initial_presence) {
+ /* We're not going to fetch the roster again because we have
+ * it already cached in sessionStorage, but we still need to
+ * send out a presence stanza because this is a new session.
+ * See: https://github.com/jcbrand/converse.js/issues/536
+ */
+ converse.xmppstatus.sendPresence();
+ }
+ }
+ }
+ });
+ }.bind(this)
+ });
+ return this;
+ },
+
+ filter: function (query, type) {
+ // First we make sure the filter is restored to its
+ // original state
+ _.each(this.getAll(), function (view) {
+ if (view.model.contacts.length > 0) {
+ view.show().filter('');
+ }
+ });
+ // Now we can filter
+ query = query.toLowerCase();
+ if (type === 'groups') {
+ _.each(this.getAll(), function (view, idx) {
+ if (view.model.get('name').toLowerCase().indexOf(query.toLowerCase()) === -1) {
+ view.hide();
+ } else if (view.model.contacts.length > 0) {
+ view.show();
+ }
+ });
+ } else {
+ _.each(this.getAll(), function (view) {
+ view.filter(query, type);
+ });
+ }
+ },
+
+ reset: function () {
+ converse.roster.reset();
+ this.removeAll();
+ this.$roster = $('
');
+ this.render().update();
+ return this;
+ },
+
+ registerRosterHandler: function () {
+ converse.connection.addHandler(
+ converse.roster.onRosterPush.bind(converse.roster),
+ Strophe.NS.ROSTER, 'iq', "set"
+ );
+ },
+
+ registerRosterXHandler: function () {
+ var t = 0;
+ converse.connection.addHandler(
+ function (msg) {
+ window.setTimeout(
+ function () {
+ converse.connection.flush();
+ converse.roster.subscribeToSuggestedItems.bind(converse.roster)(msg);
+ },
+ t
+ );
+ t += $(msg).find('item').length*250;
+ return true;
+ },
+ Strophe.NS.ROSTERX, 'message', null
+ );
+ },
+
+ registerPresenceHandler: function () {
+ converse.connection.addHandler(
+ function (presence) {
+ converse.roster.presenceHandler(presence);
+ return true;
+ }.bind(this), null, 'presence', null);
+ },
+
+ onGroupAdd: function (group) {
+ var view = new converse.RosterGroupView({model: group});
+ this.add(group.get('name'), view.render());
+ this.positionGroup(view);
+ },
+
+ onContactAdd: function (contact) {
+ this.addRosterContact(contact).update();
+ this.updateFilter();
+ },
+
+ onContactChange: function (contact) {
+ this.updateChatBox(contact).update();
+ if (_.has(contact.changed, 'subscription')) {
+ if (contact.changed.subscription === 'from') {
+ this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
+ } else if (_.contains(['both', 'to'], contact.get('subscription'))) {
+ this.addExistingContact(contact);
+ }
+ }
+ if (_.has(contact.changed, 'ask') && contact.changed.ask === 'subscribe') {
+ this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
+ }
+ if (_.has(contact.changed, 'subscription') && contact.changed.requesting === 'true') {
+ this.addContactToGroup(contact, HEADER_REQUESTING_CONTACTS);
+ }
+ this.updateFilter();
+ },
+
+ updateChatBox: function (contact) {
+ var chatbox = converse.chatboxes.get(contact.get('jid')),
+ changes = {};
+ if (!chatbox) {
+ return this;
+ }
+ if (_.has(contact.changed, 'chat_status')) {
+ changes.chat_status = contact.get('chat_status');
+ }
+ if (_.has(contact.changed, 'status')) {
+ changes.status = contact.get('status');
+ }
+ chatbox.save(changes);
+ return this;
+ },
+
+ positionFetchedGroups: function (model, resp, options) {
+ /* Instead of throwing an add event for each group
+ * fetched, we wait until they're all fetched and then
+ * we position them.
+ * Works around the problem of positionGroup not
+ * working when all groups besides the one being
+ * positioned aren't already in inserted into the
+ * roster DOM element.
+ */
+ model.sort();
+ model.each(function (group, idx) {
+ var view = this.get(group.get('name'));
+ if (!view) {
+ view = new converse.RosterGroupView({model: group});
+ this.add(group.get('name'), view.render());
+ }
+ if (idx === 0) {
+ this.$roster.append(view.$el);
+ } else {
+ this.appendGroup(view);
+ }
+ }.bind(this));
+ },
+
+ positionGroup: function (view) {
+ /* Place the group's DOM element in the correct alphabetical
+ * position amongst the other groups in the roster.
+ */
+ var $groups = this.$roster.find('.roster-group'),
+ index = $groups.length ? this.model.indexOf(view.model) : 0;
+ if (index === 0) {
+ this.$roster.prepend(view.$el);
+ } else if (index === (this.model.length-1)) {
+ this.appendGroup(view);
+ } else {
+ $($groups.eq(index)).before(view.$el);
+ }
+ return this;
+ },
+
+ appendGroup: function (view) {
+ /* Add the group at the bottom of the roster
+ */
+ var $last = this.$roster.find('.roster-group').last();
+ var $siblings = $last.siblings('dd');
+ if ($siblings.length > 0) {
+ $siblings.last().after(view.$el);
+ } else {
+ $last.after(view.$el);
+ }
+ return this;
+ },
+
+ getGroup: function (name) {
+ /* Returns the group as specified by name.
+ * Creates the group if it doesn't exist.
+ */
+ var view = this.get(name);
+ if (view) {
+ return view.model;
+ }
+ return this.model.create({name: name, id: b64_sha1(name)});
+ },
+
+ addContactToGroup: function (contact, name) {
+ this.getGroup(name).contacts.add(contact);
+ },
+
+ addExistingContact: function (contact) {
+ var groups;
+ if (converse.roster_groups) {
+ groups = contact.get('groups');
+ if (groups.length === 0) {
+ groups = [HEADER_UNGROUPED];
+ }
+ } else {
+ groups = [HEADER_CURRENT_CONTACTS];
+ }
+ _.each(groups, _.bind(this.addContactToGroup, this, contact));
+ },
+
+ addRosterContact: function (contact) {
+ if (contact.get('subscription') === 'both' || contact.get('subscription') === 'to') {
+ this.addExistingContact(contact);
+ } else {
+ if ((contact.get('ask') === 'subscribe') || (contact.get('subscription') === 'from')) {
+ this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
+ } else if (contact.get('requesting') === true) {
+ this.addContactToGroup(contact, HEADER_REQUESTING_CONTACTS);
+ }
+ }
+ return this;
+ }
+ });
+
+
+ converse.RosterContactView = Backbone.View.extend({
+ tagName: 'dd',
+
+ events: {
+ "click .accept-xmpp-request": "acceptRequest",
+ "click .decline-xmpp-request": "declineRequest",
+ "click .open-chat": "openChat",
+ "click .remove-xmpp-contact": "removeContact"
+ },
+
+ initialize: function () {
+ this.model.on("change", this.render, this);
+ this.model.on("remove", this.remove, this);
+ this.model.on("destroy", this.remove, this);
+ this.model.on("open", this.openChat, this);
+ },
+
+ render: function () {
+ if (!this.mayBeShown()) {
+ this.$el.hide();
+ return this;
+ }
+ var item = this.model,
+ ask = item.get('ask'),
+ chat_status = item.get('chat_status'),
+ requesting = item.get('requesting'),
+ subscription = item.get('subscription');
+
+ var classes_to_remove = [
+ 'current-xmpp-contact',
+ 'pending-xmpp-contact',
+ 'requesting-xmpp-contact'
+ ].concat(_.keys(STATUSES));
+
+ _.each(classes_to_remove,
+ function (cls) {
+ if (this.el.className.indexOf(cls) !== -1) {
+ this.$el.removeClass(cls);
+ }
+ }, this);
+ this.$el.addClass(chat_status).data('status', chat_status);
+
+ if ((ask === 'subscribe') || (subscription === 'from')) {
+ /* ask === 'subscribe'
+ * Means we have asked to subscribe to them.
+ *
+ * subscription === 'from'
+ * They are subscribed to use, but not vice versa.
+ * We assume that there is a pending subscription
+ * from us to them (otherwise we're in a state not
+ * supported by converse.js).
+ *
+ * So in both cases the user is a "pending" contact.
+ */
+ this.$el.addClass('pending-xmpp-contact');
+ this.$el.html(converse.templates.pending_contact(
+ _.extend(item.toJSON(), {
+ 'desc_remove': __('Click to remove this contact'),
+ 'allow_chat_pending_contacts': converse.allow_chat_pending_contacts
+ })
+ ));
+ } else if (requesting === true) {
+ this.$el.addClass('requesting-xmpp-contact');
+ this.$el.html(converse.templates.requesting_contact(
+ _.extend(item.toJSON(), {
+ 'desc_accept': __("Click to accept this contact request"),
+ 'desc_decline': __("Click to decline this contact request"),
+ 'allow_chat_pending_contacts': converse.allow_chat_pending_contacts
+ })
+ ));
+ converse.controlboxtoggle.showControlBox();
+ } else if (subscription === 'both' || subscription === 'to') {
+ this.$el.addClass('current-xmpp-contact');
+ this.$el.removeClass(_.without(['both', 'to'], subscription)[0]).addClass(subscription);
+ this.$el.html(converse.templates.roster_item(
+ _.extend(item.toJSON(), {
+ 'desc_status': STATUSES[chat_status||'offline'],
+ 'desc_chat': __('Click to chat with this contact'),
+ 'desc_remove': __('Click to remove this contact'),
+ 'title_fullname': __('Name'),
+ 'allow_contact_removal': converse.allow_contact_removal
+ })
+ ));
+ }
+ return this;
+ },
+
+ isGroupCollapsed: function () {
+ /* Check whether the group in which this contact appears is
+ * collapsed.
+ */
+ // XXX: this sucks and is fragile.
+ // It's because I tried to do the "right thing"
+ // and use definition lists to represent roster groups.
+ // If roster group items were inside the group elements, we
+ // would simplify things by not having to check whether the
+ // group is collapsed or not.
+ var name = this.$el.prevAll('dt:first').data('group');
+ var group = converse.rosterview.model.where({'name': name})[0];
+ if (group.get('state') === converse.CLOSED) {
+ return true;
+ }
+ return false;
+ },
+
+ mayBeShown: function () {
+ /* Return a boolean indicating whether this contact should
+ * generally be visible in the roster.
+ *
+ * It doesn't check for the more specific case of whether
+ * the group it's in is collapsed (see isGroupCollapsed).
+ */
+ var chatStatus = this.model.get('chat_status');
+ if ((converse.show_only_online_users && chatStatus !== 'online') ||
+ (converse.hide_offline_users && chatStatus === 'offline')) {
+ // If pending or requesting, show
+ if ((this.model.get('ask') === 'subscribe') ||
+ (this.model.get('subscription') === 'from') ||
+ (this.model.get('requesting') === true)) {
+ return true;
+ }
+ return false;
+ }
+ return true;
+ },
+
+ openChat: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ return converse.chatboxviews.showChat(this.model.attributes);
+ },
+
+ removeContact: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ if (!converse.allow_contact_removal) { return; }
+ var result = confirm(__("Are you sure you want to remove this contact?"));
+ if (result === true) {
+ var iq = $iq({type: 'set'})
+ .c('query', {xmlns: Strophe.NS.ROSTER})
+ .c('item', {jid: this.model.get('jid'), subscription: "remove"});
+ converse.connection.sendIQ(iq,
+ function (iq) {
+ this.model.destroy();
+ this.remove();
+ }.bind(this),
+ function (err) {
+ alert(__("Sorry, there was an error while trying to remove "+name+" as a contact."));
+ converse.log(err);
+ }
+ );
+ }
+ },
+
+ acceptRequest: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ converse.roster.sendContactAddIQ(
+ this.model.get('jid'),
+ this.model.get('fullname'),
+ [],
+ function () { this.model.authorize().subscribe(); }.bind(this)
+ );
+ },
+
+ declineRequest: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var result = confirm(__("Are you sure you want to decline this contact request?"));
+ if (result === true) {
+ this.model.unauthorize().destroy();
+ }
+ return this;
+ }
+ });
+
+
+ converse.RosterGroup = Backbone.Model.extend({
+ initialize: function (attributes, options) {
+ this.set(_.extend({
+ description: DESC_GROUP_TOGGLE,
+ state: converse.OPENED
+ }, attributes));
+ // Collection of contacts belonging to this group.
+ this.contacts = new converse.RosterContacts();
+ }
+ });
+
+
+ converse.RosterGroupView = Backbone.Overview.extend({
+ tagName: 'dt',
+ className: 'roster-group',
+ events: {
+ "click a.group-toggle": "toggle"
+ },
+
+ initialize: function () {
+ this.model.contacts.on("add", this.addContact, this);
+ this.model.contacts.on("change:subscription", this.onContactSubscriptionChange, this);
+ this.model.contacts.on("change:requesting", this.onContactRequestChange, this);
+ this.model.contacts.on("change:chat_status", function (contact) {
+ // This might be optimized by instead of first sorting,
+ // finding the correct position in positionContact
+ this.model.contacts.sort();
+ this.positionContact(contact).render();
+ }, this);
+ this.model.contacts.on("destroy", this.onRemove, this);
+ this.model.contacts.on("remove", this.onRemove, this);
+ converse.roster.on('change:groups', this.onContactGroupChange, this);
+ },
+
+ render: function () {
+ this.$el.attr('data-group', this.model.get('name'));
+ this.$el.html(
+ $(converse.templates.group_header({
+ label_group: this.model.get('name'),
+ desc_group_toggle: this.model.get('description'),
+ toggle_state: this.model.get('state')
+ }))
+ );
+ return this;
+ },
+
+ addContact: function (contact) {
+ var view = new converse.RosterContactView({model: contact});
+ this.add(contact.get('id'), view);
+ view = this.positionContact(contact).render();
+ if (view.mayBeShown()) {
+ if (this.model.get('state') === converse.CLOSED) {
+ if (view.$el[0].style.display !== "none") { view.$el.hide(); }
+ if (!this.$el.is(':visible')) { this.$el.show(); }
+ } else {
+ if (this.$el[0].style.display !== "block") { this.show(); }
+ }
+ }
+ },
+
+ positionContact: function (contact) {
+ /* Place the contact's DOM element in the correct alphabetical
+ * position amongst the other contacts in this group.
+ */
+ var view = this.get(contact.get('id'));
+ var index = this.model.contacts.indexOf(contact);
+ view.$el.detach();
+ if (index === 0) {
+ this.$el.after(view.$el);
+ } else if (index === (this.model.contacts.length-1)) {
+ this.$el.nextUntil('dt').last().after(view.$el);
+ } else {
+ this.$el.nextUntil('dt').eq(index).before(view.$el);
+ }
+ return view;
+ },
+
+ show: function () {
+ this.$el.show();
+ _.each(this.getAll(), function (view) {
+ if (view.mayBeShown() && !view.isGroupCollapsed()) {
+ view.$el.show();
+ }
+ });
+ return this;
+ },
+
+ hide: function () {
+ this.$el.nextUntil('dt').addBack().hide();
+ },
+
+ filter: function (q, type) {
+ /* Filter the group's contacts based on the query "q".
+ * The query is matched against the contact's full name.
+ * If all contacts are filtered out (i.e. hidden), then the
+ * group must be filtered out as well.
+ */
+ var matches;
+ if (q.length === 0) {
+ if (this.model.get('state') === converse.OPENED) {
+ this.model.contacts.each(function (item) {
+ var view = this.get(item.get('id'));
+ if (view.mayBeShown() && !view.isGroupCollapsed()) {
+ view.$el.show();
+ }
+ }.bind(this));
+ }
+ this.showIfNecessary();
+ } else {
+ q = q.toLowerCase();
+ if (type === 'state') {
+ matches = this.model.contacts.filter(
+ utils.contains.not('chat_status', q)
+ );
+ } else {
+ matches = this.model.contacts.filter(
+ utils.contains.not('fullname', q)
+ );
+ }
+ if (matches.length === this.model.contacts.length) {
+ // hide the whole group
+ this.hide();
+ } else {
+ _.each(matches, function (item) {
+ this.get(item.get('id')).$el.hide();
+ }.bind(this));
+ _.each(this.model.contacts.reject(utils.contains.not('fullname', q)), function (item) {
+ this.get(item.get('id')).$el.show();
+ }.bind(this));
+ this.showIfNecessary();
+ }
+ }
+ },
+
+ showIfNecessary: function () {
+ if (!this.$el.is(':visible') && this.model.contacts.length > 0) {
+ this.$el.show();
+ }
+ },
+
+ toggle: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var $el = $(ev.target);
+ if ($el.hasClass("icon-opened")) {
+ this.$el.nextUntil('dt').slideUp();
+ this.model.save({state: converse.CLOSED});
+ $el.removeClass("icon-opened").addClass("icon-closed");
+ } else {
+ $el.removeClass("icon-closed").addClass("icon-opened");
+ this.model.save({state: converse.OPENED});
+ this.filter(
+ converse.rosterview.$('.roster-filter').val() || '',
+ converse.rosterview.$('.filter-type').val()
+ );
+ }
+ },
+
+ onContactGroupChange: function (contact) {
+ var in_this_group = _.contains(contact.get('groups'), this.model.get('name'));
+ var cid = contact.get('id');
+ var in_this_overview = !this.get(cid);
+ if (in_this_group && !in_this_overview) {
+ this.model.contacts.remove(cid);
+ } else if (!in_this_group && in_this_overview) {
+ this.addContact(contact);
+ }
+ },
+
+ onContactSubscriptionChange: function (contact) {
+ if ((this.model.get('name') === HEADER_PENDING_CONTACTS) && contact.get('subscription') !== 'from') {
+ this.model.contacts.remove(contact.get('id'));
+ }
+ },
+
+ onContactRequestChange: function (contact) {
+ if ((this.model.get('name') === HEADER_REQUESTING_CONTACTS) && !contact.get('requesting')) {
+ this.model.contacts.remove(contact.get('id'));
+ }
+ },
+
+ onRemove: function (contact) {
+ this.remove(contact.get('id'));
+ if (this.model.contacts.length === 0) {
+ this.$el.hide();
+ }
+ }
+ });
+
+
+ converse.RosterGroups = Backbone.Collection.extend({
+ model: converse.RosterGroup,
+ comparator: function (a, b) {
+ /* Groups are sorted alphabetically, ignoring case.
+ * However, Ungrouped, Requesting Contacts and Pending Contacts
+ * appear last and in that order. */
+ a = a.get('name');
+ b = b.get('name');
+ var special_groups = _.keys(HEADER_WEIGHTS);
+ var a_is_special = _.contains(special_groups, a);
+ var b_is_special = _.contains(special_groups, b);
+ if (!a_is_special && !b_is_special ) {
+ return a.toLowerCase() < b.toLowerCase() ? -1 : (a.toLowerCase() > b.toLowerCase() ? 1 : 0);
+ } else if (a_is_special && b_is_special) {
+ return HEADER_WEIGHTS[a] < HEADER_WEIGHTS[b] ? -1 : (HEADER_WEIGHTS[a] > HEADER_WEIGHTS[b] ? 1 : 0);
+ } else if (!a_is_special && b_is_special) {
+ return (b === HEADER_CURRENT_CONTACTS) ? 1 : -1;
+ } else if (a_is_special && !b_is_special) {
+ return (a === HEADER_CURRENT_CONTACTS) ? -1 : 1;
+ }
+ }
+ });
+ }
+ });
+}));
+
+// Converse.js (A browser based XMPP chat client)
+// http://conversejs.org
+//
+// Copyright (c) 2012-2016, Jan-Carel Brand
+// Licensed under the Mozilla Public License (MPLv2)
+//
+/*global define, Backbone */
+
+(function (root, factory) {
+ define("converse-controlbox", [
+ "converse-core",
+ "converse-api",
+ // TODO: remove the next two dependencies
+ "converse-rosterview",
+ "converse-chatview"
+ ], factory);
+}(this, function (converse, converse_api) {
+ "use strict";
+ // Strophe methods for building stanzas
+ var Strophe = converse_api.env.Strophe,
+ b64_sha1 = converse_api.env.b64_sha1,
+ utils = converse_api.env.utils;
+ // Other necessary globals
+ var $ = converse_api.env.jQuery,
+ _ = converse_api.env._,
+ __ = utils.__.bind(converse),
+ moment = converse_api.env.moment;
+
+
+ converse_api.plugins.add('converse-controlbox', {
+
+ overrides: {
+ // Overrides mentioned here will be picked up by converse.js's
+ // plugin architecture they will replace existing methods on the
+ // relevant objects or classes.
+ //
+ // New functions which don't exist yet can also be added.
+
+ initSession: function () {
+ this.controlboxtoggle = new this.ControlBoxToggle();
+ this._super.initSession.apply(this, arguments);
+ },
+
+ initConnection: function () {
+ this._super.initConnection.apply(this, arguments);
+ if (this.connection) {
+ this.addControlBox();
+ }
+ },
+
+ onDisconnected: function () {
+ var result = this._super.onDisconnected.apply(this, arguments);
+ if (result === 'disconnected') {
+ var view = converse.chatboxviews.get('controlbox');
+ view.model.set({connected:false});
+ view.$('#controlbox-tabs').empty();
+ view.renderLoginPanel();
+ }
+ return result;
+ },
+
+ _tearDown: function () {
+ this._super._tearDown.apply(this, arguments);
+ if (this.rosterview) {
+ this.rosterview.unregisterHandlers();
+ // Removes roster groups
+ this.rosterview.model.off().reset();
+ this.rosterview.undelegateEvents().remove();
+ }
+ },
+
+ clearSession: function () {
+ this._super.clearSession.apply(this, arguments);
+ if (typeof this.connection !== 'undefined' && this.connection.connected) {
+ this.chatboxes.get('controlbox').save({'connected': false});
+ }
+ },
+
+ ChatBoxes: {
+ chatBoxMayBeShown: function (chatbox) {
+ return this._super.chatBoxMayBeShown.apply(this, arguments) &&
+ chatbox.get('id') !== 'controlbox';
+ },
+
+ onChatBoxesFetched: function (collection, resp) {
+ this._super.onChatBoxesFetched.apply(this, arguments);
+ if (!_.include(_.pluck(resp, 'id'), 'controlbox')) {
+ this.add({
+ id: 'controlbox',
+ box_id: 'controlbox'
+ });
+ }
+ this.get('controlbox').save({connected:true});
+ },
+ },
+
+ ChatBoxViews: {
+ onChatBoxAdded: function (item) {
+ if (item.get('box_id') === 'controlbox') {
+ var view = this.get(item.get('id'));
+ if (view) {
+ view.model = item;
+ view.initialize();
+ return view;
+ } else {
+ view = new converse.ControlBoxView({model: item});
+ return this.add(item.get('id'), view);
+ }
+ } else {
+ return this._super.onChatBoxAdded.apply(this, arguments);
+ }
+ },
+
+ closeAllChatBoxes: function () {
+ this.each(function (view) {
+ if (view.model.get('id') !== 'controlbox') {
+ view.close();
+ }
+ });
+ return this;
+ },
+
+ getChatBoxWidth: function (view) {
+ var controlbox = this.get('controlbox');
+ if (view.model.get('id') === 'controlbox') {
+ /* We return the width of the controlbox or its toggle,
+ * depending on which is visible.
+ */
+ if (!controlbox || !controlbox.$el.is(':visible')) {
+ return converse.controlboxtoggle.$el.outerWidth(true);
+ } else {
+ return controlbox.$el.outerWidth(true);
+ }
+ } else {
+ return this._super.getChatBoxWidth.apply(this, arguments);
+ }
+ }
+ },
+
+
+ ChatBox: {
+ initialize: function () {
+ if (this.get('id') === 'controlbox') {
+ this.set({
+ 'time_opened': moment(0).valueOf(),
+ 'num_unread': 0
+ });
+ } else {
+ this._super.initialize.apply(this, arguments);
+ }
+ },
+ },
+
+
+ ChatBoxView: {
+ insertIntoPage: function () {
+ this.$el.insertAfter(converse.chatboxviews.get("controlbox").$el);
+ return this;
+ }
+ }
+ },
+
+ initialize: function () {
+ /* The initialize function gets called as soon as the plugin is
+ * loaded by converse.js's plugin machinery.
+ */
+ var converse = this.converse;
+ this.updateSettings({
+ allow_logout: true,
+ default_domain: undefined,
+ show_controlbox_by_default: false,
+ sticky_controlbox: false,
+ xhr_user_search: false,
+ xhr_user_search_url: ''
+ });
+
+ var LABEL_CONTACTS = __('Contacts');
+
+ converse.addControlBox = function () {
+ return converse.chatboxes.add({
+ id: 'controlbox',
+ box_id: 'controlbox',
+ closed: !converse.show_controlbox_by_default
+ });
+ };
+
+ converse.ControlBoxView = converse.ChatBoxView.extend({
+ tagName: 'div',
+ className: 'chatbox',
+ id: 'controlbox',
+ events: {
+ 'click a.close-chatbox-button': 'close',
+ 'click ul#controlbox-tabs li a': 'switchTab',
+ },
+
+ initialize: function () {
+ this.$el.insertAfter(converse.controlboxtoggle.$el);
+ this.model.on('change:connected', this.onConnected, this);
+ this.model.on('destroy', this.hide, this);
+ this.model.on('hide', this.hide, this);
+ this.model.on('show', this.show, this);
+ this.model.on('change:closed', this.ensureClosedState, this);
+ this.render();
+ if (this.model.get('connected')) {
+ this.initRoster();
+ }
+ if (typeof this.model.get('closed')==='undefined') {
+ this.model.set('closed', !converse.show_controlbox_by_default);
+ }
+ if (!this.model.get('closed')) {
+ this.show();
+ } else {
+ this.hide();
+ }
+ },
+
+ render: function () {
+ this.$el.html(converse.templates.controlbox(
+ _.extend(this.model.toJSON(), {
+ sticky_controlbox: converse.sticky_controlbox
+ }))
+ );
+ if (!converse.connection.connected || !converse.connection.authenticated || converse.connection.disconnecting) {
+ this.renderLoginPanel();
+ } else if (!this.contactspanel || !this.contactspanel.$el.is(':visible')) {
+ this.renderContactsPanel();
+ }
+ return this;
+ },
+
+ giveFeedback: function (message, klass) {
+ var $el = this.$('.conn-feedback');
+ $el.addClass('conn-feedback').text(message);
+ if (klass) {
+ $el.addClass(klass);
+ }
+ },
+
+ onConnected: function () {
+ if (this.model.get('connected')) {
+ this.render().initRoster();
+ }
+ },
+
+ initRoster: function () {
+ /* We initialize the roster, which will appear inside the
+ * Contacts Panel.
+ */
+ var rostergroups = new converse.RosterGroups();
+ rostergroups.browserStorage = new Backbone.BrowserStorage[converse.storage](
+ b64_sha1('converse.roster.groups'+converse.bare_jid));
+ converse.rosterview = new converse.RosterView({model: rostergroups});
+ this.contactspanel.$el.append(converse.rosterview.$el);
+ converse.rosterview.render().fetch().update();
+ return this;
+ },
+
+ renderLoginPanel: function () {
+ var $feedback = this.$('.conn-feedback'); // we want to still show any existing feedback.
+ this.loginpanel = new converse.LoginPanel({
+ '$parent': this.$el.find('.controlbox-panes'),
+ 'model': this
+ });
+ this.loginpanel.render();
+ if ($feedback.length && $feedback.text() !== __('Connecting')) {
+ this.$('.conn-feedback').replaceWith($feedback);
+ }
+ return this;
+ },
+
+ renderContactsPanel: function () {
+ this.contactspanel = new converse.ContactsPanel({
+ '$parent': this.$el.find('.controlbox-panes')
+ });
+ this.contactspanel.render();
+ converse.xmppstatusview = new converse.XMPPStatusView({
+ 'model': converse.xmppstatus
+ });
+ converse.xmppstatusview.render();
+ },
+
+ close: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ if (converse.connection.connected) {
+ this.model.save({'closed': true});
+ } else {
+ this.model.trigger('hide');
+ }
+ converse.emit('controlBoxClosed', this);
+ return this;
+ },
+
+ ensureClosedState: function () {
+ if (this.model.get('closed')) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ },
+
+ hide: function (callback) {
+ this.$el.hide('fast', function () {
+ utils.refreshWebkit();
+ converse.emit('chatBoxClosed', this);
+ converse.controlboxtoggle.show(function () {
+ if (typeof callback === "function") {
+ callback();
+ }
+ });
+ });
+ return this;
+ },
+
+ onControlBoxToggleHidden: function () {
+ this.$el.show('fast', function () {
+ converse.controlboxtoggle.updateOnlineCount();
+ utils.refreshWebkit();
+ converse.emit('controlBoxOpened', this);
+ }.bind(this));
+ },
+
+ show: function () {
+ converse.controlboxtoggle.hide(
+ this.onControlBoxToggleHidden.bind(this)
+ );
+ return this;
+ },
+
+ switchTab: function (ev) {
+ // TODO: automatically focus the relevant input
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var $tab = $(ev.target),
+ $sibling = $tab.parent().siblings('li').children('a'),
+ $tab_panel = $($tab.attr('href'));
+ $($sibling.attr('href')).hide();
+ $sibling.removeClass('current');
+ $tab.addClass('current');
+ $tab_panel.show();
+ return this;
+ },
+
+ showHelpMessages: function (msgs) {
+ // Override showHelpMessages in ChatBoxView, for now do nothing.
+ return;
+ }
+ });
+
+
+ converse.LoginPanel = Backbone.View.extend({
+ tagName: 'div',
+ id: "login-dialog",
+ className: 'controlbox-pane',
+ events: {
+ 'submit form#converse-login': 'authenticate'
+ },
+
+ initialize: function (cfg) {
+ cfg.$parent.html(this.$el.html(
+ converse.templates.login_panel({
+ 'LOGIN': converse.LOGIN,
+ 'ANONYMOUS': converse.ANONYMOUS,
+ 'PREBIND': converse.PREBIND,
+ 'auto_login': converse.auto_login,
+ 'authentication': converse.authentication,
+ 'label_username': __('XMPP Username:'),
+ 'label_password': __('Password:'),
+ 'label_anon_login': __('Click here to log in anonymously'),
+ 'label_login': __('Log In'),
+ 'placeholder_username': (converse.locked_domain || converse.default_domain) && __('Username') || __('user@server'),
+ 'placeholder_password': __('password')
+ })
+ ));
+ this.$tabs = cfg.$parent.parent().find('#controlbox-tabs');
+ },
+
+ render: function () {
+ this.$tabs.append(converse.templates.login_tab({label_sign_in: __('Sign in')}));
+ this.$el.find('input#jid').focus();
+ if (!this.$el.is(':visible')) {
+ this.$el.show();
+ }
+ return this;
+ },
+
+ authenticate: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var $form = $(ev.target);
+ if (converse.authentication === converse.ANONYMOUS) {
+ this.connect($form, converse.jid, null);
+ return;
+ }
+ var $jid_input = $form.find('input[name=jid]'),
+ jid = $jid_input.val(),
+ $pw_input = $form.find('input[name=password]'),
+ password = $pw_input.val(),
+ errors = false;
+
+ if (! jid) {
+ errors = true;
+ $jid_input.addClass('error');
+ }
+ if (! password) {
+ errors = true;
+ $pw_input.addClass('error');
+ }
+ if (errors) { return; }
+ if (converse.locked_domain) {
+ jid = Strophe.escapeNode(jid) + '@' + converse.locked_domain;
+ } else if (converse.default_domain && jid.indexOf('@') === -1) {
+ jid = jid + '@' + converse.default_domain;
+ }
+ this.connect($form, jid, password);
+ return false;
+ },
+
+ connect: function ($form, jid, password) {
+ var resource;
+ if ($form) {
+ $form.find('input[type=submit]').hide().after('');
+ }
+ if (jid) {
+ resource = Strophe.getResourceFromJid(jid);
+ if (!resource) {
+ jid = jid.toLowerCase() + converse.generateResource();
+ } else {
+ jid = Strophe.getBareJidFromJid(jid).toLowerCase()+'/'+resource;
+ }
+ }
+ converse.connection.connect(jid, password, converse.onConnectStatusChanged);
+ },
+
+ remove: function () {
+ this.$tabs.empty();
+ this.$el.parent().empty();
+ }
+ });
+
+
+ converse.XMPPStatusView = Backbone.View.extend({
+ el: "span#xmpp-status-holder",
+
+ events: {
+ "click a.choose-xmpp-status": "toggleOptions",
+ "click #fancy-xmpp-status-select a.change-xmpp-status-message": "renderStatusChangeForm",
+ "submit #set-custom-xmpp-status": "setStatusMessage",
+ "click .dropdown dd ul li a": "setStatus"
+ },
+
+ initialize: function () {
+ this.model.on("change:status", this.updateStatusUI, this);
+ this.model.on("change:status_message", this.updateStatusUI, this);
+ this.model.on("update-status-ui", this.updateStatusUI, this);
+ },
+
+ render: function () {
+ // Replace the default dropdown with something nicer
+ var $select = this.$el.find('select#select-xmpp-status'),
+ chat_status = this.model.get('status') || 'offline',
+ options = $('option', $select),
+ $options_target,
+ options_list = [];
+ this.$el.html(converse.templates.choose_status());
+ this.$el.find('#fancy-xmpp-status-select')
+ .html(converse.templates.chat_status({
+ 'status_message': this.model.get('status_message') || __("I am %1$s", this.getPrettyStatus(chat_status)),
+ 'chat_status': chat_status,
+ 'desc_custom_status': __('Click here to write a custom status message'),
+ 'desc_change_status': __('Click to change your chat status')
+ }));
+ // iterate through all the \n \n
\n
▼ '+
+((__t=( unread_msgs ))==null?'':__t)+
+' ▼
\n ';
if (show_textarea) {
__p+='\n
\n
'+
+'" type="text"/>\n\n';
+ }
+__p+='\n
'+
((__t=(label_occupants))==null?'':__t)+
':
\n
\n\n';
}
@@ -2221,6 +2229,16 @@ define("converse-templates", [
'list-multi': 'dropdown'
};
+ var isImage = function (url) {
+ var deferred = new $.Deferred();
+ $("
", {
+ src: url,
+ error: deferred.reject,
+ load: deferred.resolve
+ });
+ return deferred.promise();
+ };
+
$.expr[':'].emptyVal = function(obj){
return obj.value === '';
};
@@ -2235,19 +2253,33 @@ define("converse-templates", [
return false;
};
+ $.fn.throttledHTML = _.throttle($.fn.html, 500);
+
$.fn.addHyperlinks = function () {
if (this.length > 0) {
this.each(function (i, obj) {
- var x = $(obj).html();
+ var prot, escaped_url;
+ var $obj = $(obj);
+ var x = $obj.html();
var list = x.match(/\b(https?:\/\/|www\.|https?:\/\/www\.)[^\s<]{2,200}\b/g );
if (list) {
for (i=0; i
'+ list[i] + '' );
}
}
- $(obj).html(x);
+ $obj.html(x);
+ _.each(list, function (url) {
+ isImage(url).then(function () {
+ var prot = url.indexOf('http://') === 0 || url.indexOf('https://') === 0 ? '' : 'http://';
+ var escaped_url = encodeURI(decodeURI(url)).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
+ var new_url = ''+ url + '';
+ event.target.className = 'chat-image';
+ x = x.replace(new_url, event.target.outerHTML);
+ $obj.throttledHTML(x);
+ });
+ });
});
}
return this;
@@ -2326,6 +2358,12 @@ define("converse-templates", [
return str;
},
+ isOTRMessage: function (message) {
+ var $body = $(message).children('body'),
+ text = ($body.length > 0 ? $body.text() : undefined);
+ return text && !!text.match(/^\?OTR/);
+ },
+
isHeadlineMessage: function (message) {
var $message = $(message),
from_jid = $message.attr('from');
@@ -2519,6 +2557,174 @@ if (!String.prototype.trim) {
;
define("polyfill", function(){});
+/*
+ * ____ __ __ __ _
+ * / __ \/ /_ __ ___ ___ ____ _/ /_ / /__ (_)____
+ * / /_/ / / / / / __ \/ __ \/ __/ / __ \/ / _ \ / / ___/
+ * / ____/ / /_/ / /_/ / /_/ / /_/ / /_/ / / __/ / (__ )
+ * /_/ /_/\__,_/\__, /\__, /\__/_/_.___/_/\___(_)_/ /____/
+ * /____//____/ /___/
+ *
+ */
+(function (root, factory) {
+ define("converse-pluggable", ["jquery", "underscore"], factory);
+}(this, function ($, _) {
+ "use strict";
+
+ function Pluggable (plugged) {
+ this.plugged = plugged;
+ this.plugged._super = {};
+ this.plugins = {};
+ this.initialized_plugins = [];
+ }
+ _.extend(Pluggable.prototype, {
+ wrappedOverride: function (key, value, super_method) {
+ /* We create a partially applied wrapper function, that
+ * makes sure to set the proper super method when the
+ * overriding method is called. This is done to enable
+ * chaining of plugin methods, all the way up to the
+ * original method.
+ */
+ if (typeof super_method === "function") {
+ this._super[key] = super_method.bind(this);
+ }
+ return value.apply(this, _.rest(arguments, 3));
+ },
+
+ _overrideAttribute: function (key, plugin) {
+ /* Overrides an attribute on the original object (the thing being
+ * plugged into).
+ *
+ * If the attribute being overridden is a function, then the original
+ * function will still be available via the _super attribute.
+ *
+ * If the same function is being overridden multiple times, then
+ * the original function will be available at the end of a chain of
+ * functions, starting from the most recent override, all the way
+ * back to the original function, each being referenced by the
+ * previous' _super attribute.
+ *
+ * For example:
+ *
+ * plugin2.MyFunc._super.myFunc => * plugin1.MyFunc._super.myFunc => original.myFunc
+ */
+ var value = plugin.overrides[key];
+ if (typeof value === "function") {
+ var wrapped_function = _.partial(
+ this.wrappedOverride, key, value, this.plugged[key]
+ );
+ this.plugged[key] = wrapped_function;
+ } else {
+ this.plugged[key] = value;
+ }
+ },
+
+ _extendObject: function (obj, attributes) {
+ if (!obj.prototype._super) {
+ // FIXME: make generic
+ obj.prototype._super = {'converse': this.plugged };
+ }
+ _.each(attributes, function (value, key) {
+ if (key === 'events') {
+ obj.prototype[key] = _.extend(value, obj.prototype[key]);
+ } else if (typeof value === 'function') {
+ // We create a partially applied wrapper function, that
+ // makes sure to set the proper super method when the
+ // overriding method is called. This is done to enable
+ // chaining of plugin methods, all the way up to the
+ // original method.
+ var wrapped_function = _.partial(
+ this.wrappedOverride, key, value, obj.prototype[key]
+ );
+ obj.prototype[key] = wrapped_function;
+ } else {
+ obj.prototype[key] = value;
+ }
+ }.bind(this));
+ },
+
+ loadOptionalDependencies: function (plugin) {
+ _.each(plugin.optional_dependencies, function (name) {
+ var dep = this.plugins[name];
+ if (dep) {
+ if (_.contains(dep.optional_dependencies, plugin.__name__)) {
+ // FIXME: circular dependency checking is only one level deep.
+ throw "Found a circular dependency between the plugins \""+
+ plugin.__name__+"\" and \""+name+"\"";
+ }
+ this.initializePlugin(dep);
+ } else {
+ this.throwUndefinedDependencyError(
+ "Could not find optional dependency \""+name+"\" "+
+ "for the plugin \""+plugin.__name__+"\". "+
+ "If it's needed, make sure it's loaded by require.js");
+ }
+ }.bind(this));
+ },
+
+ throwUndefinedDependencyError: function (msg) {
+ if (this.plugged.strict_plugin_dependencies) {
+ throw msg;
+ } else {
+ console.log(msg);
+ return;
+ }
+ },
+
+ applyOverrides: function (plugin) {
+ _.each(Object.keys(plugin.overrides || {}), function (key) {
+ /* We automatically override all methods and Backbone views and
+ * models that are in the "overrides" namespace.
+ */
+ var override = plugin.overrides[key];
+ if (typeof override === "object") {
+ if (typeof this.plugged[key] === 'undefined') {
+ this.throwUndefinedDependencyError("Error: Plugin \""+plugin.__name__+"\" tried to override "+key+" but it's not found.");
+ } else {
+ this._extendObject(this.plugged[key], override);
+ }
+ } else {
+ this._overrideAttribute(key, plugin);
+ }
+ }.bind(this));
+ },
+
+ initializePlugin: function (plugin) {
+ if (_.contains(this.initialized_plugins, plugin.__name__)) {
+ // Don't initialize plugins twice, otherwise we get
+ // infinite recursion in overridden methods.
+ return;
+ }
+ _.extend(plugin, this.properties);
+ if (plugin.optional_dependencies) {
+ this.loadOptionalDependencies(plugin);
+ }
+ this.applyOverrides(plugin);
+ if (typeof plugin.initialize === "function") {
+ plugin.initialize.bind(plugin)(this);
+ }
+ this.initialized_plugins.push(plugin.__name__);
+ },
+
+ initializePlugins: function (properties) {
+ /* The properties variable is an object of attributes and methods
+ * which will be attached to the plugins.
+ */
+ if (!_.size(this.plugins)) {
+ return;
+ }
+ this.properties = properties;
+ _.each(_.values(this.plugins), this.initializePlugin.bind(this));
+ }
+ });
+ return {
+ 'enable': function (object) {
+ /* Call this method to make an object pluggable */
+ return _.extend(object, {'pluggable': new Pluggable(object)});
+ }
+ };
+}));
+
// Converse.js (A browser based XMPP chat client)
// http://conversejs.org
//
@@ -2544,11 +2750,12 @@ define("polyfill", function(){});
"moment_with_locales",
"strophe",
"converse-templates",
+ "converse-pluggable",
"strophe.disco",
"backbone.browserStorage",
"backbone.overview",
], factory);
-}(this, function ($, _, dummy, utils, moment, Strophe, templates) {
+}(this, function ($, _, dummy, utils, moment, Strophe, templates, pluggable) {
/*
* Cannot use this due to Safari bug.
* See https://github.com/jcbrand/converse.js/issues/196
@@ -2579,26 +2786,31 @@ define("polyfill", function(){});
var event_context = {};
var converse = {
- plugins: {},
- initialized_plugins: [],
templates: templates,
+
emit: function (evt, data) {
$(event_context).trigger(evt, data);
},
+
once: function (evt, handler) {
$(event_context).one(evt, handler);
},
+
on: function (evt, handler) {
if (_.contains(['ready', 'initialized'], evt)) {
converse.log('Warning: The "'+evt+'" event has been deprecated and will be removed, please use "connected".');
}
$(event_context).bind(evt, handler);
},
+
off: function (evt, handler) {
$(event_context).unbind(evt, handler);
}
};
+ // Make converse pluggable
+ pluggable.enable(converse);
+
// Module-level constants
converse.STATUS_WEIGHTS = {
'offline': 6,
@@ -2647,6 +2859,7 @@ define("polyfill", function(){});
converse.initialize = function (settings, callback) {
"use strict";
+ var init_deferred = new $.Deferred();
var converse = this;
var unloadevent;
if ('onpagehide' in window) {
@@ -2672,6 +2885,7 @@ define("polyfill", function(){});
Strophe.addNamespace('ROSTERX', 'http://jabber.org/protocol/rosterx');
Strophe.addNamespace('XFORM', 'jabber:x:data');
Strophe.addNamespace('NICK', 'http://jabber.org/protocol/nick');
+ Strophe.addNamespace('HINTS', 'urn:xmpp:hints');
// Instance level constants
this.TIMEOUTS = { // Set as module attr so that we can override in tests.
@@ -2725,7 +2939,7 @@ define("polyfill", function(){});
}
}
};
-
+
this.detectLocale = function (library_check) {
/* Determine which locale is supported by the user's system as well
* as by the relevant library (e.g. converse.js or moment.js).
@@ -2753,12 +2967,12 @@ define("polyfill", function(){});
}
return locale || 'en';
};
-
+
if (!moment.locale) { //moment.lang is deprecated after 2.8.1, use moment.locale instead
moment.locale = moment.lang;
}
moment.locale(this.detectLocale(this.isMomentLocale));
- this.i18n = settings.i18n ? settings.i18n : locales[this.detectLocale(this.isConverseLocale)];
+ this.i18n = settings.i18n ? settings.i18n : locales[this.detectLocale(this.isConverseLocale)] || {};
// Translation machinery
// ---------------------
@@ -2779,7 +2993,9 @@ define("polyfill", function(){});
credentials_url: null, // URL from where login credentials can be fetched
csi_waiting_time: 0, // Support for XEP-0352. Seconds before client is considered idle and CSI is sent out.
debug: false,
+ default_state: 'online',
expose_rid_and_sid: false,
+ filter_by_resource: false,
forward_messages: false,
hide_offline_users: false,
include_offline_state: false,
@@ -2876,7 +3092,9 @@ define("polyfill", function(){});
}
if (converse.auto_changed_status === true) {
converse.auto_changed_status = false;
- converse.xmppstatus.setStatus('online');
+ // XXX: we should really remember the original state here, and
+ // then set it back to that...
+ converse.xmppstatus.setStatus(converse.default_state);
}
};
@@ -2963,11 +3181,11 @@ define("polyfill", function(){});
}, 1000);
this.onDisconnected = function (condition) {
- if (!converse.auto_reconnect) { return; }
- if (converse.disconnection_cause === Strophe.Status.CONNFAIL) {
+ if (converse.disconnection_cause === Strophe.Status.CONNFAIL && converse.auto_reconnect) {
converse.reconnect(condition);
return 'reconnecting';
} else {
+ converse._tearDown();
converse.emit('disconnected');
return 'disconnected';
}
@@ -3024,8 +3242,6 @@ define("polyfill", function(){});
} else {
document.title = document.title.replace(/^Messages \(\d+\) /, "Messages (" + this.msg_counter + ") ");
}
- window.blur();
- window.focus();
} else if (document.title.search(/^Messages \(\d+\) /) !== -1) {
document.title = document.title.replace(/^Messages \(\d+\) /, "");
}
@@ -3079,13 +3295,57 @@ define("polyfill", function(){});
}
};
+ this.saveWindowState = function (ev, hidden) {
+ // XXX: eventually we should be able to just use
+ // document.visibilityState (when we drop support for older
+ // browsers).
+ var state;
+ var v = "visible", h = "hidden",
+ event_map = {
+ 'focus': v,
+ 'focusin': v,
+ 'pageshow': v,
+ 'blur': h,
+ 'focusout': h,
+ 'pagehide': h
+ };
+ ev = ev || document.createEvent('Events');
+ if (ev.type in event_map) {
+ state = event_map[ev.type];
+ } else {
+ state = document[hidden] ? "hidden" : "visible";
+ }
+ if (state === 'visible') {
+ converse.clearMsgCounter();
+ }
+ converse.windowState = state;
+
+ };
+
this.registerGlobalEventHandlers = function () {
- $(window).on("blur focus", function (ev) {
- if ((converse.windowState !== ev.type) && (ev.type === 'focus')) {
- converse.clearMsgCounter();
- }
- converse.windowState = ev.type;
- });
+ // Taken from:
+ // http://stackoverflow.com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-is-not-currently-active
+ var hidden = "hidden";
+ // Standards:
+ if (hidden in document) {
+ document.addEventListener("visibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "mozHidden") in document) {
+ document.addEventListener("mozvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "webkitHidden") in document) {
+ document.addEventListener("webkitvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "msHidden") in document) {
+ document.addEventListener("msvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ("onfocusin" in document) {
+ // IE 9 and lower:
+ document.onfocusin = document.onfocusout = _.partial(converse.saveWindowState, _, hidden);
+ } else {
+ // All others:
+ window.onpageshow = window.onpagehide = window.onfocus = window.onblur = _.partial(converse.saveWindowState, _, hidden);
+ }
+ // set the initial state (but only if browser supports the Page Visibility API)
+ if( document[hidden] !== undefined ) {
+ _.partial(converse.saveWindowState, _, hidden)({type: document[hidden] ? "blur" : "focus"});
+ }
};
this.afterReconnected = function () {
@@ -3131,28 +3391,22 @@ define("polyfill", function(){});
};
- this.onStatusInitialized = function (deferred) {
- this.registerIntervalHandler();
+ this.onStatusInitialized = function () {
+ this.registerIntervalHandler();
this.roster = new this.RosterContacts();
this.roster.browserStorage = new Backbone.BrowserStorage[this.storage](
b64_sha1('converse.contacts-'+this.bare_jid));
this.chatboxes.onConnected();
this.giveFeedback(__('Contacts'));
if (typeof this.callback === 'function') {
- // A callback method may be passed in via the
- // converse.initialize method.
- // XXX: Can we use $.Deferred instead of this callback?
- if (this.connection.service === 'jasmine tests') {
- // XXX: Call back with the internal converse object. This
- // object should never be exposed to production systems.
- // 'jasmine tests' is an invalid http bind service value,
- // so we're sure that this is just for tests.
- this.callback(this);
- } else {
- this.callback();
- }
+ // XXX: Deprecate in favor of init_deferred
+ this.callback();
+ }
+ if (converse.connection.service === 'jasmine tests') {
+ init_deferred.resolve(converse);
+ } else {
+ init_deferred.resolve();
}
- deferred.resolve();
converse.emit('initialized');
};
@@ -3160,7 +3414,6 @@ define("polyfill", function(){});
// When reconnecting, there might be some open chat boxes. We don't
// know whether these boxes are of the same account or not, so we
// close them now.
- var deferred = new $.Deferred();
// XXX: ran into an issue where a returned PubSub BOSH response was
// not received by the browser. The solution was to flush the
// connection early on. I don't know what the underlying cause of
@@ -3180,13 +3433,11 @@ define("polyfill", function(){});
this.domain = Strophe.getDomainFromJid(this.connection.jid);
this.features = new this.Features();
this.enableCarbons();
- this.initStatus().done(_.bind(this.onStatusInitialized, this, deferred));
+ this.initStatus().done(_.bind(this.onStatusInitialized, this));
converse.emit('connected');
converse.emit('ready'); // BBB: Will be removed.
- return deferred.promise();
};
-
this.RosterContact = Backbone.Model.extend({
initialize: function (attributes, options) {
@@ -3655,7 +3906,6 @@ define("polyfill", function(){});
this.Message = Backbone.Model.extend({
- idAttribute: 'msgid',
defaults: function(){
return {
msgid: converse.connection.getUniqueId()
@@ -3688,13 +3938,12 @@ define("polyfill", function(){});
});
},
- createMessage: function ($message, $delay) {
+ getMessageAttributes: function ($message, $delay, original_stanza) {
$delay = $delay || $message.find('delay');
var body = $message.children('body').text(),
delayed = $delay.length > 0,
fullname = this.get('fullname'),
is_groupchat = $message.attr('type') === 'groupchat',
- msgid = $message.attr('id'),
chat_state = $message.find(converse.COMPOSING).length && converse.COMPOSING ||
$message.find(converse.PAUSED).length && converse.PAUSED ||
$message.find(converse.INACTIVE).length && converse.INACTIVE ||
@@ -3721,18 +3970,22 @@ define("polyfill", function(){});
} else {
sender = 'them';
}
- return this.messages.create({
+ return {
chat_state: chat_state,
delayed: delayed,
fullname: fullname,
message: body || undefined,
- msgid: msgid,
+ msgid: $message.attr('id'),
sender: sender,
time: time
- });
+ };
+ },
+
+ createMessage: function ($message, $delay, original_stanza) {
+ return this.messages.create(this.getMessageAttributes.apply(this, arguments));
}
});
-
+
this.ChatBoxes = Backbone.Collection.extend({
model: converse.ChatBox,
comparator: 'time_opened',
@@ -3785,20 +4038,12 @@ define("polyfill", function(){});
to_jid = $message.attr('to'),
to_resource = Strophe.getResourceFromJid(to_jid);
- if (to_resource && to_resource !== converse.resource) {
+ if (converse.filter_by_resource && (to_resource && to_resource !== converse.resource)) {
converse.log(
'onMessage: Ignoring incoming message intended for a different resource: '+to_jid,
'info'
);
return true;
- } else if (from_jid === converse.connection.jid) {
- // FIXME: Forwarded messages should be sent to specific
- // resources, not broadcasted
- converse.log(
- "onMessage: Ignoring incoming message sent from this client's JID: "+from_jid,
- 'info'
- );
- return true;
} else if (utils.isHeadlineMessage(message)) {
// XXX: Ideally we wouldn't have to check for headline
// messages, but Prosody sends headline messages with the
@@ -3837,7 +4082,7 @@ define("polyfill", function(){});
if (msgid && chatbox.messages.findWhere({msgid: msgid})) {
return true; // We already have this message stored.
}
- chatbox.createMessage($message, $delay);
+ chatbox.createMessage($message, $delay, message);
converse.roster.addResource(contact_jid, resource);
converse.emit('message', message);
return true;
@@ -3920,18 +4165,23 @@ define("polyfill", function(){});
return this.model.chatBoxMayBeShown(chatbox);
},
- showChat: function (attrs) {
- /* Find the chat box and show it (if it may be shown).
- * If it doesn't exist, create it.
- */
+ getChatBox: function (attrs, create) {
var chatbox = this.model.get(attrs.jid);
- if (!chatbox) {
+ if (!chatbox && create) {
chatbox = this.model.create(attrs, {
'error': function (model, response) {
converse.log(response.responseText);
}
});
}
+ return chatbox;
+ },
+
+ showChat: function (attrs) {
+ /* Find the chat box and show it (if it may be shown).
+ * If it doesn't exist, create it.
+ */
+ var chatbox = this.getChatBox(attrs, true);
if (this.chatBoxMayBeShown(chatbox)) {
chatbox.trigger('show', true);
}
@@ -3956,15 +4206,11 @@ define("polyfill", function(){});
},
constructPresence: function (type, status_message) {
- if (typeof type !== 'string') {
- type = this.get('status') || 'online';
- }
- if (typeof status_message !== 'string') {
- status_message = this.get('status_message');
- }
var presence;
+ type = typeof type === 'string' ? type : (this.get('status') || converse.default_state);
+ status_message = typeof status_message === 'string' ? status_message : undefined;
// Most of these presence types are actually not explicitly sent,
- // but I add all of them here fore reference and future proofing.
+ // but I add all of them here for reference and future proofing.
if ((type === 'unavailable') ||
(type === 'probe') ||
(type === 'error') ||
@@ -3975,18 +4221,13 @@ define("polyfill", function(){});
presence = $pres({'type': type});
} else if (type === 'offline') {
presence = $pres({'type': 'unavailable'});
- if (status_message) {
- presence.c('show').t(type);
- }
+ } else if (type === 'online') {
+ presence = $pres();
} else {
- if (type === 'online') {
- presence = $pres();
- } else {
- presence = $pres().c('show').t(type).up();
- }
- if (status_message) {
- presence.c('status').t(status_message);
- }
+ presence = $pres().c('show').t(type).up();
+ }
+ if (status_message) {
+ presence.c('status').t(status_message);
}
return presence;
},
@@ -4001,7 +4242,7 @@ define("polyfill", function(){});
},
getStatus: function () {
- return this.get('status') || 'online';
+ return this.get('status') || converse.default_state;
},
setStatusMessage: function (status_message) {
@@ -4102,6 +4343,9 @@ define("polyfill", function(){});
});
this.setUpXMLLogging = function () {
+ Strophe.log = function (level, msg) {
+ converse.log(msg, level);
+ };
if (this.debug) {
this.connection.xmlInput = function (body) { converse.log(body.outerHTML); };
this.connection.xmlOutput = function (body) { converse.log(body.outerHTML); };
@@ -4213,7 +4457,7 @@ define("polyfill", function(){});
*/
if (this.keepalive) {
try {
- return this.connection.restore(undefined, this.onConnectStatusChanged);
+ return this.connection.restore(this.jid, this.onConnectStatusChanged);
} catch (e) {
this.log("Could not restore session. Error message: "+e.message);
this.clearSession(); // If there's a roster, we want to clear it (see #555)
@@ -4293,116 +4537,28 @@ define("polyfill", function(){});
return this;
};
- this.wrappedOverride = function (key, value, super_method) {
- // We create a partially applied wrapper function, that
- // makes sure to set the proper super method when the
- // overriding method is called. This is done to enable
- // chaining of plugin methods, all the way up to the
- // original method.
- this._super[key] = super_method;
- return value.apply(this, _.rest(arguments, 3));
- };
-
- this._overrideAttribute = function (key, plugin) {
- // See converse.plugins.override
- var value = plugin.overrides[key];
- if (typeof value === "function") {
- var wrapped_function = _.partial(
- converse.wrappedOverride.bind(converse),
- key, value, converse[key].bind(converse)
- );
- converse[key] = wrapped_function;
- } else {
- converse[key] = value;
- }
- };
-
- this._extendObject = function (obj, attributes) {
- // See converse.plugins.extend
- if (!obj.prototype._super) {
- obj.prototype._super = {'converse': converse};
- }
- _.each(attributes, function (value, key) {
- if (key === 'events') {
- obj.prototype[key] = _.extend(value, obj.prototype[key]);
- } else if (typeof value === 'function') {
- // We create a partially applied wrapper function, that
- // makes sure to set the proper super method when the
- // overriding method is called. This is done to enable
- // chaining of plugin methods, all the way up to the
- // original method.
- var wrapped_function = _.partial(
- converse.wrappedOverride,
- key, value, obj.prototype[key]
- );
- obj.prototype[key] = wrapped_function;
- } else {
- obj.prototype[key] = value;
- }
- });
- };
-
- this.initializePlugins = function () {
- if (typeof converse._super === 'undefined') {
- converse._super = { 'converse': converse };
- }
-
- var updateSettings = function (settings) {
- /* Helper method which gets put on the plugin and allows it to
- * add more user-facing config settings to converse.js.
- */
- _.extend(converse.default_settings, settings);
- _.extend(converse, settings);
- _.extend(converse, _.pick(converse.user_settings, Object.keys(settings)));
- };
-
- _.each(_.keys(this.plugins), function (name) {
- var plugin = this.plugins[name];
- plugin.updateSettings = updateSettings;
-
- if (_.contains(this.initialized_plugins, name)) {
- // Don't initialize plugins twice, otherwise we get
- // infinite recursion in overridden methods.
- return;
- }
- plugin.converse = converse;
- _.each(Object.keys(plugin.overrides || {}), function (key) {
- /* We automatically override all methods and Backbone views and
- * models that are in the "overrides" namespace.
- */
- var msg,
- override = plugin.overrides[key];
- if (typeof override === "object") {
- if (typeof converse[key] === 'undefined') {
- msg = "Error: Plugin tried to override "+key+" but it's not found.";
- if (converse.strict_plugin_dependencies) {
- throw msg;
- } else {
- converse.log(msg);
- }
- }
- this._extendObject(converse[key], override);
- } else {
- this._overrideAttribute(key, plugin);
- }
- }.bind(this));
-
- if (typeof plugin.initialize === "function") {
- plugin.initialize.bind(plugin)(this);
- }
- this.initialized_plugins.push(name);
- }.bind(this));
- };
-
// Initialization
// --------------
// This is the end of the initialize method.
if (settings.connection) {
this.connection = settings.connection;
}
- this.initializePlugins();
- this._initialize();
- this.registerGlobalEventHandlers();
+ var updateSettings = function (settings) {
+ /* Helper method which gets put on the plugin and allows it to
+ * add more user-facing config settings to converse.js.
+ */
+ _.extend(converse.default_settings, settings);
+ _.extend(converse, settings);
+ _.extend(converse, _.pick(converse.user_settings, Object.keys(settings)));
+ };
+ converse.pluggable.initializePlugins({
+ 'updateSettings': updateSettings,
+ 'converse': converse
+ });
+ converse.emit('pluginsInitialized');
+ converse._initialize();
+ converse.registerGlobalEventHandlers();
+ return init_deferred.promise();
};
return converse;
}));
@@ -4432,8 +4588,9 @@ define("polyfill", function(){});
var Strophe = strophe.Strophe;
return {
'initialize': function (settings, callback) {
- converse.initialize(settings, callback);
+ return converse.initialize(settings, callback);
},
+ 'log': converse.log,
'connection': {
'connected': function () {
return converse.connection && converse.connection.connected || false;
@@ -4541,7 +4698,13 @@ define("polyfill", function(){});
} else if (typeof jids === "string") {
return converse.wrappedChatBox(converse.chatboxes.getChatBox(jids, true));
}
- return _.map(jids, _.partial(_.compose(converse.wrappedChatBox, converse.chatboxes.getChatBox.bind(converse.chatboxes)), _, true));
+ return _.map(jids,
+ _.partial(
+ _.compose(
+ converse.wrappedChatBox.bind(converse), converse.chatboxes.getChatBox.bind(converse.chatboxes)
+ ), _, true
+ )
+ );
}
},
'tokens': {
@@ -4589,7 +4752,8 @@ define("polyfill", function(){});
},
'plugins': {
'add': function (name, plugin) {
- converse.plugins[name] = plugin;
+ plugin.__name__ = name;
+ converse.pluggable.plugins[name] = plugin;
},
'remove': function (name) {
delete converse.plugins[name];
@@ -5672,7 +5836,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
};
- converse_api.plugins.add('chatview', {
+ converse_api.plugins.add('converse-chatview', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -5716,7 +5880,8 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
'click .toggle-smiley': 'toggleEmoticonMenu',
'click .toggle-smiley ul li': 'insertEmoticon',
'click .toggle-clear': 'clearMessages',
- 'click .toggle-call': 'toggleCall'
+ 'click .toggle-call': 'toggleCall',
+ 'click .new-msgs-indicator': 'viewUnreadMessages'
},
initialize: function () {
@@ -5731,6 +5896,12 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
this.model.on('showHelpMessages', this.showHelpMessages, this);
this.model.on('sendMessage', this.sendMessage, this);
this.render().fetchMessages().insertIntoPage().hide();
+ // XXX: adding the event below to the events map above doesn't work.
+ // The code that gets executed because of that looks like this:
+ // this.$el.on('scroll', '.chat-content', this.markScrolled.bind(this));
+ // Which for some reason doesn't work.
+ // So working around that fact here:
+ this.$el.find('.chat-content').on('scroll', this.markScrolled.bind(this));
converse.emit('chatBoxInitialized', this);
},
@@ -5741,6 +5912,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
show_toolbar: converse.show_toolbar,
show_textarea: true,
title: this.model.get('fullname'),
+ unread_msgs: __('You have unread messages'),
info_close: __('Close this chat box'),
label_personal_message: __('Personal message')
}
@@ -5783,11 +5955,8 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
if (!keep_old) {
this.clearStatusNotification();
}
- var was_at_bottom = this.$content.scrollTop() + this.$content.innerHeight() >= this.$content[0].scrollHeight;
this.$content.append($('').text(message));
- if (was_at_bottom) {
- this.scrollDown();
- }
+ this.scrollDown();
},
addSpinner: function () {
@@ -5802,30 +5971,37 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
}
},
- prependDayIndicator: function (date) {
- /* Prepends an indicator into the chat area, showing the day as
- * given by the passed in date.
+ insertDayIndicator: function (date, prepend) {
+ /* Appends (or prepends if "prepend" is truthy) an indicator
+ * into the chat area, showing the day as given by the
+ * passed in date.
*
* Parameters:
* (String) date - An ISO8601 date string.
*/
var day_date = moment(date).startOf('day');
- this.$content.prepend(converse.templates.new_day({
+ var insert = prepend ? this.$content.prepend: this.$content.append;
+ insert.call(this.$content, converse.templates.new_day({
isodate: day_date.format(),
datestring: day_date.format("dddd MMM Do YYYY")
}));
},
- appendMessage: function (attrs) {
- /* Helper method which appends a message to the end of the chat
- * box's content area.
+ insertMessage: function (attrs, prepend) {
+ /* Helper method which appends a message (or prepends if the
+ * 2nd parameter is set to true) to the end of the chat box's
+ * content area.
*
* Parameters:
* (Object) attrs: An object containing the message attributes.
*/
+ var insert = prepend ? this.$content.prepend : this.$content.append;
_.compose(
- _.debounce(this.scrollDown.bind(this), 50),
- this.$content.append.bind(this.$content)
+ this.scrollDownMessageHeight.bind(this),
+ function ($el) {
+ insert.call(this.$content, $el);
+ return $el;
+ }.bind(this)
)(this.renderMessage(attrs));
},
@@ -5840,79 +6016,54 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
* Parameters:
* (Object) attrs: An object containing the message attributes.
*/
- var $first_msg = this.$content.children('.chat-message:first'),
+ var msg_dates, idx,
+ $first_msg = this.$content.children('.chat-message:first'),
first_msg_date = $first_msg.data('isodate'),
- last_msg_date, current_msg_date, day_date, $msgs, msg_dates, idx;
+ current_msg_date = moment(attrs.time) || moment,
+ last_msg_date = this.$content.children('.chat-message:last').data('isodate');
+
if (!first_msg_date) {
- this.appendMessage(attrs);
+ // This is the first received message, so we insert a
+ // date indicator before it.
+ this.insertDayIndicator(current_msg_date);
+ this.insertMessage(attrs);
return;
}
- current_msg_date = moment(attrs.time) || moment;
- last_msg_date = this.$content.children('.chat-message:last').data('isodate');
-
- if (typeof last_msg_date !== "undefined" && (current_msg_date.isAfter(last_msg_date) || current_msg_date.isSame(last_msg_date))) {
+ if (current_msg_date.isAfter(last_msg_date) || current_msg_date.isSame(last_msg_date)) {
// The new message is after the last message
if (current_msg_date.isAfter(last_msg_date, 'day')) {
// Append a new day indicator
- day_date = moment(current_msg_date).startOf('day');
- this.$content.append(converse.templates.new_day({
- isodate: current_msg_date.format(),
- datestring: current_msg_date.format("dddd MMM Do YYYY")
- }));
+ this.insertDayIndicator(current_msg_date);
}
- this.appendMessage(attrs);
+ this.insertMessage(attrs);
return;
}
-
- if (typeof first_msg_date !== "undefined" &&
- (current_msg_date.isBefore(first_msg_date) ||
- (current_msg_date.isSame(first_msg_date) && !current_msg_date.isSame(last_msg_date)))) {
- // The new message is before the first message
-
- if ($first_msg.prev().length === 0) {
- // There's no day indicator before the first message, so we prepend one.
- this.prependDayIndicator(first_msg_date);
- }
+ if (current_msg_date.isBefore(first_msg_date) || current_msg_date.isSame(first_msg_date)) {
+ // The message is before the first, but on the same day.
+ // We need to prepend the message immediately before the
+ // first message (so that it'll still be after the day indicator).
+ this.insertMessage(attrs, 'prepend');
if (current_msg_date.isBefore(first_msg_date, 'day')) {
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- this.$content.prepend($el);
- return $el;
- }.bind(this)
- )(this.renderMessage(attrs));
- // This message is on a different day, so we add a day indicator.
- this.prependDayIndicator(current_msg_date);
- } else {
- // The message is before the first, but on the same day.
- // We need to prepend the message immediately before the
- // first message (so that it'll still be after the day indicator).
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- $el.insertBefore($first_msg);
- return $el;
- }
- )(this.renderMessage(attrs));
+ // This message is also on a different day, so we prepend a day indicator.
+ this.insertDayIndicator(current_msg_date, 'prepend');
}
- } else {
- // We need to find the correct place to position the message
- current_msg_date = current_msg_date.format();
- $msgs = this.$content.children('.chat-message');
- msg_dates = _.map($msgs, function (el) {
- return $(el).data('isodate');
- });
- msg_dates.push(current_msg_date);
- msg_dates.sort();
- idx = msg_dates.indexOf(current_msg_date)-1;
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- $el.insertAfter(this.$content.find('.chat-message[data-isodate="'+msg_dates[idx]+'"]'));
- return $el;
- }.bind(this)
- )(this.renderMessage(attrs));
+ return;
}
+ // Find the correct place to position the message
+ current_msg_date = current_msg_date.format();
+ msg_dates = _.map(this.$content.children('.chat-message'), function (el) {
+ return $(el).data('isodate');
+ });
+ msg_dates.push(current_msg_date);
+ msg_dates.sort();
+ idx = msg_dates.indexOf(current_msg_date)-1;
+ _.compose(
+ this.scrollDownMessageHeight.bind(this),
+ function ($el) {
+ $el.insertAfter(this.$content.find('.chat-message[data-isodate="'+msg_dates[idx]+'"]'));
+ return $el;
+ }.bind(this)
+ )(this.renderMessage(attrs));
},
renderMessage: function (attrs) {
@@ -5990,13 +6141,40 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
return !this.$el.is(':visible');
},
+ updateNewMessageIndicators: function (message) {
+ /* We have two indicators of new messages. The unread messages
+ * counter, which shows the number of unread messages in
+ * the document.title, and the "new messages" indicator in
+ * a chat area, if it's scrolled up so that new messages
+ * aren't visible.
+ *
+ * In both cases we ignore MAM messages.
+ */
+ if (!message.get('archive_id')) {
+ if (this.model.get('scrolled', true)) {
+ this.$el.find('.new-msgs-indicator').removeClass('hidden');
+ }
+ if (converse.windowState === 'hidden' || this.model.get('scrolled', true)) {
+ converse.incrementMsgCounter();
+ }
+ }
+ },
+
handleTextMessage: function (message) {
this.showMessage(_.clone(message.attributes));
- if ((message.get('sender') !== 'me') && (converse.windowState === 'blur')) {
- converse.incrementMsgCounter();
+ if (message.get('sender') !== 'me') {
+ this.updateNewMessageIndicators(message);
+ } else {
+ // We remove the "scrolled" flag so that the chat area
+ // gets scrolled down. We always want to scroll down
+ // when the user writes a message as opposed to when a
+ // message is received.
+ this.model.set('scrolled', false);
}
if (this.shouldShowOnTextMessage()) {
this.show();
+ } else {
+ this.scrollDown();
}
},
@@ -6095,7 +6273,9 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
*/
converse.connection.send(
$msg({'to':this.model.get('jid'), 'type': 'chat'})
- .c(this.model.get('chat_state'), {'xmlns': Strophe.NS.CHATSTATES})
+ .c(this.model.get('chat_state'), {'xmlns': Strophe.NS.CHATSTATES}).up()
+ .c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
+ .c('no-permanent-store', {'xmlns': Strophe.NS.HINTS})
);
},
@@ -6291,10 +6471,8 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
},
hide: function () {
- if (this.$el.is(':visible') && this.$el.css('opacity') === "1") {
- this.$el.hide();
- utils.refreshWebkit();
- }
+ this.$el.hide();
+ utils.refreshWebkit();
return this;
},
@@ -6332,16 +6510,42 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
return this;
},
+ markScrolled: _.debounce(function (ev) {
+ /* Called when the chat content is scrolled up or down.
+ * We want to record when the user has scrolled away from
+ * the bottom, so that we don't automatically scroll away
+ * from what the user is reading when new messages are
+ * received.
+ */
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var is_at_bottom = this.$content.scrollTop() + this.$content.innerHeight() >= this.$content[0].scrollHeight-10;
+ if (is_at_bottom) {
+ this.model.set('scrolled', false);
+ this.$el.find('.new-msgs-indicator').addClass('hidden');
+ } else {
+ // We're not at the bottom of the chat area, so we mark
+ // that the box is in a scrolled-up state.
+ this.model.set('scrolled', true);
+ }
+ }, 150),
+
+
+ viewUnreadMessages: function () {
+ this.model.set('scrolled', false);
+ this.scrollDown();
+ },
+
scrollDownMessageHeight: function ($message) {
- if (this.$content.is(':visible')) {
+ if (this.$content.is(':visible') && !this.model.get('scrolled')) {
this.$content.scrollTop(this.$content.scrollTop() + $message[0].scrollHeight);
}
return this;
},
scrollDown: function () {
- if (this.$content.is(':visible')) {
+ if (this.$content.is(':visible') && !this.model.get('scrolled')) {
this.$content.scrollTop(this.$content[0].scrollHeight);
+ this.$el.find('.new-msgs-indicator').addClass('hidden');
}
return this;
}
@@ -6646,13 +6850,16 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
*/
converse.roster.fetchFromServer(
converse.xmppstatus.sendPresence.bind(converse.xmppstatus));
- } else if (converse.send_initial_presence) {
- /* We're not going to fetch the roster again because we have
- * it already cached in sessionStorage, but we still need to
- * send out a presence stanza because this is a new session.
- * See: https://github.com/jcbrand/converse.js/issues/536
- */
- converse.xmppstatus.sendPresence();
+ } else {
+ converse.emit('cachedRoster', collection);
+ if (converse.send_initial_presence) {
+ /* We're not going to fetch the roster again because we have
+ * it already cached in sessionStorage, but we still need to
+ * send out a presence stanza because this is a new session.
+ * See: https://github.com/jcbrand/converse.js/issues/536
+ */
+ converse.xmppstatus.sendPresence();
+ }
}
}
});
@@ -7285,7 +7492,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
moment = converse_api.env.moment;
- converse_api.plugins.add('controlbox', {
+ converse_api.plugins.add('converse-controlbox', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -7309,12 +7516,12 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
onDisconnected: function () {
var result = this._super.onDisconnected.apply(this, arguments);
if (result === 'disconnected') {
- converse._tearDown();
var view = converse.chatboxviews.get('controlbox');
view.model.set({connected:false});
view.$('#controlbox-tabs').empty();
view.renderLoginPanel();
}
+ return result;
},
_tearDown: function () {
@@ -7926,6 +8133,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
initialize: function () {
this.render();
+ this.updateOnlineCount();
converse.on('initialized', function () {
converse.roster.on("add", this.updateOnlineCount, this);
converse.roster.on('change', this.updateOnlineCount, this);
@@ -8013,9 +8221,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
"converse-core",
"converse-api",
"typeahead",
- "converse-chatview",
- // XXX: should we remove this dependency?
- "converse-controlbox"
+ "converse-chatview"
], factory);
}(this, function (converse, converse_api) {
"use strict";
@@ -8043,7 +8249,16 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
Strophe.addNamespace('MUC_ROOMCONF', Strophe.NS.MUC + "#roomconfig");
Strophe.addNamespace('MUC_USER', Strophe.NS.MUC + "#user");
- converse_api.plugins.add('muc', {
+ converse_api.plugins.add('converse-muc', {
+ /* Optional dependencies are other plugins which might be
+ * overridden or relied upon, if they exist, otherwise they're ignored.
+ *
+ * However, if the setting "strict_plugin_dependencies" is set to true,
+ * an error will be raised if the plugin is not found.
+ *
+ * NB: These plugins need to have already been loaded via require.js.
+ */
+ optional_dependencies: ["converse-controlbox"],
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -8066,9 +8281,11 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
Features: {
addClientFeatures: function () {
this._super.addClientFeatures.apply(this, arguments);
- converse.connection.disco.addFeature('jabber:x:conference'); // Invites
- if (this.allow_muc) {
- this.connection.disco.addFeature(Strophe.NS.MUC);
+ if (converse.allow_muc_invitations) {
+ converse.connection.disco.addFeature('jabber:x:conference'); // Invites
+ }
+ if (converse.allow_muc) {
+ converse.connection.disco.addFeature(Strophe.NS.MUC);
}
}
},
@@ -8147,6 +8364,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
var converse = this.converse;
// Configuration values for this plugin
this.updateSettings({
+ allow_muc_invitations: true,
allow_muc: true,
auto_join_on_invite: false, // Auto-join chatroom on invite
auto_join_rooms: [], // List of maps {'jid': 'room@example.org', 'nick': 'WizardKing69' },
@@ -8174,7 +8392,8 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
'click .toggle-clear': 'clearChatRoomMessages',
'click .toggle-call': 'toggleCall',
'click .toggle-occupants a': 'toggleOccupants',
- 'keypress textarea.chat-textarea': 'keyPressed',
+ 'click .new-msgs-indicator': 'viewUnreadMessages',
+ 'keypress textarea.chat-textarea': 'keyPressed'
},
initialize: function () {
@@ -8191,11 +8410,26 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
this.render().$el.hide();
this.occupantsview.model.fetch({add:true});
this.join(null, {'maxstanzas': converse.muc_history_max_stanzas});
- this.fetchMessages();
- this.$el.insertAfter(converse.chatboxviews.get("controlbox").$el);
+ this.fetchMessages().insertIntoDOM();
+ // XXX: adding the event below to the events map above doesn't work.
+ // The code that gets executed because of that looks like this:
+ // this.$el.on('scroll', '.chat-content', this.markScrolled.bind(this));
+ // Which for some reason doesn't work.
+ // So working around that fact here:
+ this.$el.find('.chat-content').on('scroll', this.markScrolled.bind(this));
converse.emit('chatRoomOpened', this);
},
+ insertIntoDOM: function () {
+ var view = converse.chatboxviews.get("controlbox");
+ if (view) {
+ this.$el.insertAfter(view.$el);
+ } else {
+ $('#conversejs').prepend(this.$el);
+ }
+ return this;
+ },
+
render: function () {
this.$el.attr('id', this.model.get('box_id'))
.html(converse.templates.chatroom(this.model.toJSON()));
@@ -8209,6 +8443,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
this.$('.chatroom-body').empty()
.append(
converse.templates.chatarea({
+ 'unread_msgs': __('You have unread messages'),
'show_toolbar': converse.show_toolbar,
'label_message': __('Message')
}))
@@ -8235,16 +8470,15 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
// Bit of a hack, to make sure that the sidebar's state doesn't change
this.model.set({hidden_occupants: !this.model.get('hidden_occupants')});
}
- var $el = this.$('.icon-hide-users');
if (!this.model.get('hidden_occupants')) {
this.model.save({hidden_occupants: true});
- $el.removeClass('icon-hide-users').addClass('icon-show-users');
+ this.$('.icon-hide-users').removeClass('icon-hide-users').addClass('icon-show-users');
this.$('.occupants').addClass('hidden');
this.$('.chat-area').addClass('full');
this.scrollDown();
} else {
this.model.save({hidden_occupants: false});
- $el.removeClass('icon-show-users').addClass('icon-hide-users');
+ this.$('.icon-show-users').removeClass('icon-show-users').addClass('icon-hide-users');
this.$('.chat-area').removeClass('full');
this.$('div.occupants').removeClass('hidden');
this.scrollDown();
@@ -8285,10 +8519,8 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
}).c("body").t(text).up()
.c("x", {xmlns: "jabber:x:event"}).c("composing");
converse.connection.send(msg);
-
- var fullname = converse.xmppstatus.get('fullname');
this.model.messages.create({
- fullname: _.isEmpty(fullname)? converse.bare_jid: fullname,
+ fullname: this.model.get('nick'),
sender: 'me',
time: moment().format(),
message: text,
@@ -8773,7 +9005,9 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
for (i=0; i 0 ? $body.text() : undefined);
- return !!text.match(/^\?OTR/);
- },
-
shouldPlayNotification: function ($message) {
/* Don't play a notification if this is an OTR message but
* encryption is not yet set up. That would mean that the
@@ -9979,10 +10240,10 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
* "visible" OTR messages being exchanged.
*/
return this._super.shouldPlayNotification.apply(this, arguments) &&
- !(this.isOTRMessage($message) && !_.contains([UNVERIFIED, VERIFIED], this.get('otr_status')));
+ !(utils.isOTRMessage($message[0]) && !_.contains([UNVERIFIED, VERIFIED], this.get('otr_status')));
},
- createMessage: function ($message, $delay, archive_id) {
+ createMessage: function ($message, $delay, original_stanza) {
var converse = this._super.converse,
$body = $message.children('body'),
text = ($body.length > 0 ? $body.text() : undefined);
@@ -10166,9 +10427,12 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
createMessageStanza: function () {
var stanza = this._super.createMessageStanza.apply(this, arguments);
- if (this.model.get('otr_status') !== UNENCRYPTED) {
+ if (this.model.get('otr_status') !== UNENCRYPTED || utils.isOTRMessage(stanza.nodeTree)) {
// OTR messages aren't carbon copied
- stanza.c('private', {'xmlns': Strophe.NS.CARBONS});
+ stanza.c('private', {'xmlns': Strophe.NS.CARBONS}).up()
+ .c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
+ .c('no-permanent-store', {'xmlns': Strophe.NS.HINTS}).up()
+ .c('no-copy', {'xmlns': Strophe.NS.HINTS});
}
return stanza;
},
@@ -10445,7 +10709,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
Strophe.Status.CONFLICT = i + 3;
Strophe.Status.NOTACCEPTABLE = i + 5;
- converse_api.plugins.add('register', {
+ converse_api.plugins.add('converse-register', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -10935,7 +11199,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
// Other necessary globals
var _ = converse_api.env._;
- converse_api.plugins.add('ping', {
+ converse_api.plugins.add('converse-ping', {
initialize: function () {
/* The initialize function gets called as soon as the plugin is
@@ -11041,18 +11305,18 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
var __ = utils.__.bind(converse);
var ___ = utils.___;
- var supports_html5_notification = "Notification" in window;
-
- converse_api.plugins.add('notification', {
+ converse_api.plugins.add('converse-notification', {
initialize: function () {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
var converse = this.converse;
+ converse.supports_html5_notification = "Notification" in window;
this.updateSettings({
+ notify_all_room_messages: false,
show_desktop_notifications: true,
chatstate_notification_blacklist: [],
// ^ a list of JIDs to ignore concerning chat state notifications
@@ -11077,15 +11341,22 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
converse.shouldNotifyOfGroupMessage = function ($message) {
/* Is this a group message worthy of notification?
*/
- var jid = $message.attr('from'),
+ var notify_all = converse.notify_all_room_messages,
+ jid = $message.attr('from'),
resource = Strophe.getResourceFromJid(jid),
+ room_jid = Strophe.getBareJidFromJid(jid),
sender = resource && Strophe.unescapeNode(resource) || '';
if (sender === '' || $message.find('delay').length > 0) {
return false;
}
- var room = converse.chatboxes.get(Strophe.getBareJidFromJid(jid));
- var body = $message.children('body').text();
- if (sender === room.get('nick') || !(new RegExp("\\b"+room.get('nick')+"\\b")).test(body)) {
+ var room = converse.chatboxes.get(room_jid);
+ var $body = $message.children('body');
+ if (!$body.length) {
+ return false;
+ }
+ var mentioned = (new RegExp("\\b"+room.get('nick')+"\\b")).test($body.text());
+ notify_all = notify_all === true || (_.isArray(notify_all) && _.contains(notify_all, room_jid));
+ if (sender === room.get('nick') || (!notify_all && !mentioned)) {
return false;
}
return true;
@@ -11094,6 +11365,9 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
converse.shouldNotifyOfMessage = function (message) {
/* Is this a message worthy of notification?
*/
+ if (utils.isOTRMessage(message)) {
+ return false;
+ }
var $message = $(message),
$forwarded = $message.find('forwarded');
if ($forwarded.length) {
@@ -11126,14 +11400,14 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
}
};
- converse.areDesktopNotificationsEnabled = function (ignore_blur) {
- var enabled = supports_html5_notification &&
+ converse.areDesktopNotificationsEnabled = function (ignore_hidden) {
+ var enabled = converse.supports_html5_notification &&
converse.show_desktop_notifications &&
Notification.permission === "granted";
- if (ignore_blur) {
+ if (ignore_hidden) {
return enabled;
} else {
- return enabled && converse.windowState === 'blur';
+ return enabled && converse.windowState === 'hidden';
}
};
@@ -11253,18 +11527,23 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
};
converse.requestPermission = function (evt) {
- if (supports_html5_notification &&
+ if (converse.supports_html5_notification &&
! _.contains(['denied', 'granted'], Notification.permission)) {
// Ask user to enable HTML5 notifications
Notification.requestPermission();
}
};
- converse.on('contactRequest', converse.handleContactRequestNotification);
- converse.on('contactStatusChanged', converse.handleChatStateNotification);
- converse.on('message', converse.handleMessageNotification);
- converse.on('feedback', converse.handleFeedback);
- converse.on('connected', converse.requestPermission);
+ converse.on('pluginsInitialized', function () {
+ // We only register event handlers after all plugins are
+ // registered, because other plugins might override some of our
+ // handlers.
+ converse.on('contactRequest', converse.handleContactRequestNotification);
+ converse.on('contactStatusChanged', converse.handleChatStateNotification);
+ converse.on('message', converse.handleMessageNotification);
+ converse.on('feedback', converse.handleFeedback);
+ converse.on('connected', converse.requestPermission);
+ });
}
});
}));
@@ -11294,7 +11573,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
utils = converse_api.env.utils,
__ = utils.__.bind(converse);
- converse_api.plugins.add('minimize', {
+ converse_api.plugins.add('converse-minimize', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -11489,7 +11768,14 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
getShownChats: function () {
return this.filter(function (view) {
- return (!view.model.get('minimized') && view.$el.is(':visible'));
+ // The controlbox can take a while to close,
+ // so we need to check its state. That's why we checked
+ // the 'closed' state.
+ return (
+ !view.model.get('minimized') &&
+ !view.model.get('closed') &&
+ view.$el.is(':visible')
+ );
});
},
@@ -11802,7 +12088,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
var $ = converse_api.env.jQuery,
_ = converse_api.env._;
- converse_api.plugins.add('dragresize', {
+ converse_api.plugins.add('converse-dragresize', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -11810,7 +12096,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
// relevant objects or classes.
//
// New functions which don't exist yet can also be added.
-
+
registerGlobalEventHandlers: function () {
$(document).on('mousemove', function (ev) {
if (!this.resizing || !this.allow_dragresize) { return true; }
@@ -12111,13 +12397,13 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
'jid': from_jid,
'fullname': from_jid,
'type': 'headline'
- }).createMessage($message);
+ }).createMessage($message, undefined, message);
converse.emit('message', message);
}
return true;
};
- converse_api.plugins.add('headline', {
+ converse_api.plugins.add('converse-headline', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -12125,7 +12411,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
// relevant objects or classes.
//
// New functions which don't exist yet can also be added.
-
+
ChatBoxViews: {
onChatBoxAdded: function (item) {
var view = this.get(item.get('id'));
@@ -12157,8 +12443,11 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
},
initialize: function () {
+ if (typeof this.setDimensions !== "undefined") {
+ // setDimensions is defined for dragresize
+ $(window).on('resize', _.debounce(this.setDimensions.bind(this), 100));
+ }
this.disable_mam = true; // Don't do MAM queries for this box
- $(window).on('resize', _.debounce(this.setDimensions.bind(this), 100));
this.model.messages.on('add', this.onMessageAdded, this);
this.model.on('show', this.show, this);
this.model.on('destroy', this.hide, this);
@@ -12174,6 +12463,7 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
show_toolbar: converse.show_toolbar,
show_textarea: false,
title: this.model.get('fullname'),
+ unread_msgs: __('You have unread messages'),
info_close: __('Close this box'),
info_minimize: __('Minimize this box'),
label_personal_message: ''
@@ -12181,7 +12471,10 @@ define('text!ca',[],function () { return '{\n "domain": "converse",\n "local
)
)
);
- this.setWidth();
+ if (typeof this.setWidth !== "undefined") {
+ // setWidth is defined for dragresize
+ $(window).on('resize', _.debounce(this.setWidth.bind(this), 100));
+ }
this.$content = this.$el.find('.chat-content');
converse.emit('chatBoxOpened', this);
window.setTimeout(utils.refreshWebkit, 50);
@@ -12257,6 +12550,7 @@ require.config({
"converse-notification": "src/converse-notification",
"converse-otr": "src/converse-otr",
"converse-ping": "src/converse-ping",
+ "converse-pluggable": "src/converse-pluggable",
"converse-register": "src/converse-register",
"converse-rosterview": "src/converse-rosterview",
"converse-templates": "src/converse-templates",
@@ -12436,11 +12730,11 @@ if (typeof define !== 'undefined') {
// translations that you care about.
"converse-chatview", // Renders standalone chat boxes for single user chat
+ "converse-controlbox", // The control box
"converse-mam", // XEP-0313 Message Archive Management
"converse-muc", // XEP-0045 Multi-user chat
"converse-vcard", // XEP-0054 VCard-temp
"converse-otr", // Off-the-record encryption for one-on-one messages
- "converse-controlbox", // The control box
"converse-register", // XEP-0077 In-band registration
"converse-ping", // XEP-0199 XMPP Ping
"converse-notification",// HTML5 Notifications
diff --git a/dist/converse.js b/dist/converse.js
index 69a2e68b0..cab95e483 100644
--- a/dist/converse.js
+++ b/dist/converse.js
@@ -18799,8 +18799,7 @@ return {
* The bound function.
*/
if (!Function.prototype.bind) {
- Function.prototype.bind = function (obj /*, arg1, arg2, ... */)
- {
+ Function.prototype.bind = function (obj /*, arg1, arg2, ... */) {
var func = this;
var _slice = Array.prototype.slice;
var _concat = Array.prototype.concat;
@@ -18859,6 +18858,7 @@ if (!Array.prototype.indexOf)
};
}
}));
+
/*
This program is distributed under the terms of the MIT license.
Please see the LICENSE file for details.
@@ -19081,6 +19081,7 @@ Strophe = {
* Status.DISCONNECTED - The connection has been terminated
* Status.DISCONNECTING - The connection is currently being terminated
* Status.ATTACHED - The connection has been attached
+ * Status.CONNTIMEOUT - The connection has timed out
*/
Status: {
ERROR: 0,
@@ -19092,7 +19093,8 @@ Strophe = {
DISCONNECTED: 6,
DISCONNECTING: 7,
ATTACHED: 8,
- REDIRECT: 9
+ REDIRECT: 9,
+ CONNTIMEOUT: 10
},
/** Constants: Log Level Constants
@@ -19155,8 +19157,7 @@ Strophe = {
* referenced under Strophe.NS
* (String) value - The actual namespace.
*/
- addNamespace: function (name, value)
- {
+ addNamespace: function (name, value) {
Strophe.NS[name] = value;
},
@@ -19174,8 +19175,7 @@ Strophe = {
* (Function) func - The function to apply to each child. This
* function should take a single argument, a DOM element.
*/
- forEachChild: function (elem, elemName, func)
- {
+ forEachChild: function (elem, elemName, func) {
var i, childNode;
for (i = 0; i < elem.childNodes.length; i++) {
@@ -19200,8 +19200,7 @@ Strophe = {
* true if the element's tag name matches _el_, and false
* otherwise.
*/
- isTagEqual: function (el, name)
- {
+ isTagEqual: function (el, name) {
return el.tagName == name;
},
@@ -19299,8 +19298,7 @@ Strophe = {
* Returns:
* A new XML DOM element.
*/
- xmlElement: function (name)
- {
+ xmlElement: function (name) {
if (!name) { return null; }
var node = Strophe.xmlGenerator().createElement(name);
@@ -19389,8 +19387,7 @@ Strophe = {
* Returns:
* A new XML DOM text node.
*/
- xmlTextNode: function (text)
- {
+ xmlTextNode: function (text) {
return Strophe.xmlGenerator().createTextNode(text);
},
@@ -19403,8 +19400,7 @@ Strophe = {
* Returns:
* A new XML DOM text node.
*/
- xmlHtmlNode: function (html)
- {
+ xmlHtmlNode: function (html) {
var node;
//ensure text is escaped
if (window.DOMParser) {
@@ -19427,8 +19423,7 @@ Strophe = {
* Returns:
* A String with the concatenated text of all text element children.
*/
- getText: function (elem)
- {
+ getText: function (elem) {
if (!elem) { return null; }
var str = "";
@@ -19458,8 +19453,7 @@ Strophe = {
* Returns:
* A new, copied DOM element tree.
*/
- copyElement: function (elem)
- {
+ copyElement: function (elem) {
var i, el;
if (elem.nodeType == Strophe.ElementType.NORMAL) {
el = Strophe.xmlElement(elem.tagName);
@@ -19492,8 +19486,7 @@ Strophe = {
* Returns:
* A new, copied DOM element tree.
*/
- createHtml: function (elem)
- {
+ createHtml: function (elem) {
var i, el, j, tag, attribute, value, css, cssAttrs, attr, cssName, cssValue;
if (elem.nodeType == Strophe.ElementType.NORMAL) {
tag = elem.nodeName.toLowerCase(); // XHTML tags must be lower case.
@@ -19565,8 +19558,7 @@ Strophe = {
* Returns:
* An escaped node (or local part).
*/
- escapeNode: function (node)
- {
+ escapeNode: function (node) {
if (typeof node !== "string") { return node; }
return node.replace(/^\s+|\s+$/g, '')
.replace(/\\/g, "\\5c")
@@ -19590,8 +19582,7 @@ Strophe = {
* Returns:
* An unescaped node (or local part).
*/
- unescapeNode: function (node)
- {
+ unescapeNode: function (node) {
if (typeof node !== "string") { return node; }
return node.replace(/\\20/g, " ")
.replace(/\\22/g, '"')
@@ -19614,8 +19605,7 @@ Strophe = {
* Returns:
* A String containing the node.
*/
- getNodeFromJid: function (jid)
- {
+ getNodeFromJid: function (jid) {
if (jid.indexOf("@") < 0) { return null; }
return jid.split("@")[0];
},
@@ -19629,8 +19619,7 @@ Strophe = {
* Returns:
* A String containing the domain.
*/
- getDomainFromJid: function (jid)
- {
+ getDomainFromJid: function (jid) {
var bare = Strophe.getBareJidFromJid(jid);
if (bare.indexOf("@") < 0) {
return bare;
@@ -19650,8 +19639,7 @@ Strophe = {
* Returns:
* A String containing the resource.
*/
- getResourceFromJid: function (jid)
- {
+ getResourceFromJid: function (jid) {
var s = jid.split("/");
if (s.length < 2) { return null; }
s.splice(0, 1);
@@ -19667,8 +19655,7 @@ Strophe = {
* Returns:
* A String containing the bare JID.
*/
- getBareJidFromJid: function (jid)
- {
+ getBareJidFromJid: function (jid) {
return jid ? jid.split("/")[0] : null;
},
@@ -19702,8 +19689,7 @@ Strophe = {
* (String) msg - The log message.
*/
/* jshint ignore:start */
- log: function (level, msg)
- {
+ log: function (level, msg) {
return;
},
/* jshint ignore:end */
@@ -19725,8 +19711,7 @@ Strophe = {
* Parameters:
* (String) msg - The log message.
*/
- info: function (msg)
- {
+ info: function (msg) {
this.log(this.LogLevel.INFO, msg);
},
@@ -19736,8 +19721,7 @@ Strophe = {
* Parameters:
* (String) msg - The log message.
*/
- warn: function (msg)
- {
+ warn: function (msg) {
this.log(this.LogLevel.WARN, msg);
},
@@ -19747,8 +19731,7 @@ Strophe = {
* Parameters:
* (String) msg - The log message.
*/
- error: function (msg)
- {
+ error: function (msg) {
this.log(this.LogLevel.ERROR, msg);
},
@@ -19758,8 +19741,7 @@ Strophe = {
* Parameters:
* (String) msg - The log message.
*/
- fatal: function (msg)
- {
+ fatal: function (msg) {
this.log(this.LogLevel.FATAL, msg);
},
@@ -19772,8 +19754,7 @@ Strophe = {
* Returns:
* The serialized element tree as a String.
*/
- serialize: function (elem)
- {
+ serialize: function (elem) {
var result;
if (!elem) { return null; }
@@ -19846,8 +19827,7 @@ Strophe = {
* (String) name - The name of the extension.
* (Object) ptype - The plugin's prototype.
*/
- addConnectionPlugin: function (name, ptype)
- {
+ addConnectionPlugin: function (name, ptype) {
Strophe._connectionPlugins[name] = ptype;
}
};
@@ -19893,8 +19873,7 @@ Strophe = {
* Returns:
* A new Strophe.Builder.
*/
-Strophe.Builder = function (name, attrs)
-{
+Strophe.Builder = function (name, attrs) {
// Set correct namespace for jabber:client elements
if (name == "presence" || name == "message" || name == "iq") {
if (attrs && !attrs.xmlns) {
@@ -19921,8 +19900,7 @@ Strophe.Builder.prototype = {
* Returns:
* The DOM tree as a element object.
*/
- tree: function ()
- {
+ tree: function () {
return this.nodeTree;
},
@@ -19936,8 +19914,7 @@ Strophe.Builder.prototype = {
* Returns:
* The serialized DOM tree in a String.
*/
- toString: function ()
- {
+ toString: function () {
return Strophe.serialize(this.nodeTree);
},
@@ -19951,8 +19928,7 @@ Strophe.Builder.prototype = {
* Returns:
* The Stophe.Builder object.
*/
- up: function ()
- {
+ up: function () {
this.node = this.node.parentNode;
return this;
},
@@ -19969,8 +19945,7 @@ Strophe.Builder.prototype = {
* Returns:
* The Strophe.Builder object.
*/
- attrs: function (moreattrs)
- {
+ attrs: function (moreattrs) {
for (var k in moreattrs) {
if (moreattrs.hasOwnProperty(k)) {
if (moreattrs[k] === undefined) {
@@ -19999,11 +19974,10 @@ Strophe.Builder.prototype = {
* Returns:
* The Strophe.Builder object.
*/
- c: function (name, attrs, text)
- {
+ c: function (name, attrs, text) {
var child = Strophe.xmlElement(name, attrs, text);
this.node.appendChild(child);
- if (typeof text !== "string") {
+ if (typeof text !== "string" && typeof text !=="number") {
this.node = child;
}
return this;
@@ -20023,8 +19997,7 @@ Strophe.Builder.prototype = {
* Returns:
* The Strophe.Builder object.
*/
- cnode: function (elem)
- {
+ cnode: function (elem) {
var impNode;
var xmlGen = Strophe.xmlGenerator();
try {
@@ -20053,8 +20026,7 @@ Strophe.Builder.prototype = {
* Returns:
* The Strophe.Builder object.
*/
- t: function (text)
- {
+ t: function (text) {
var child = Strophe.xmlTextNode(text);
this.node.appendChild(child);
return this;
@@ -20071,8 +20043,7 @@ Strophe.Builder.prototype = {
* Returns:
* The Strophe.Builder object.
*/
- h: function (html)
- {
+ h: function (html) {
var fragment = document.createElement('body');
// force the browser to try and fix any invalid HTML tags
@@ -20117,8 +20088,7 @@ Strophe.Builder.prototype = {
* Returns:
* A new Strophe.Handler object.
*/
-Strophe.Handler = function (handler, ns, name, type, id, from, options)
-{
+Strophe.Handler = function (handler, ns, name, type, id, from, options) {
this.handler = handler;
this.ns = ns;
this.name = name;
@@ -20151,8 +20121,7 @@ Strophe.Handler.prototype = {
* Returns:
* true if the stanza matches and false otherwise.
*/
- isMatch: function (elem)
- {
+ isMatch: function (elem) {
var nsMatch;
var from = null;
@@ -20198,8 +20167,7 @@ Strophe.Handler.prototype = {
* Returns:
* A boolean indicating if the handler should remain active.
*/
- run: function (elem)
- {
+ run: function (elem) {
var result = null;
try {
result = this.handler(elem);
@@ -20232,8 +20200,7 @@ Strophe.Handler.prototype = {
* Returns:
* A String.
*/
- toString: function ()
- {
+ toString: function () {
return "{Handler: " + this.handler + "(" + this.name + "," +
this.id + "," + this.ns + ")}";
}
@@ -20264,8 +20231,7 @@ Strophe.Handler.prototype = {
* Returns:
* A new Strophe.TimedHandler object.
*/
-Strophe.TimedHandler = function (period, handler)
-{
+Strophe.TimedHandler = function (period, handler) {
this.period = period;
this.handler = handler;
@@ -20281,8 +20247,7 @@ Strophe.TimedHandler.prototype = {
* true if the Strophe.TimedHandler should be called again, and false
* otherwise.
*/
- run: function ()
- {
+ run: function () {
this.lastCalled = new Date().getTime();
return this.handler();
},
@@ -20290,8 +20255,7 @@ Strophe.TimedHandler.prototype = {
/** PrivateFunction: reset
* Reset the last called time for the Strophe.TimedHandler.
*/
- reset: function ()
- {
+ reset: function () {
this.lastCalled = new Date().getTime();
},
@@ -20301,8 +20265,7 @@ Strophe.TimedHandler.prototype = {
* Returns:
* The string representation.
*/
- toString: function ()
- {
+ toString: function () {
return "{TimedHandler: " + this.handler + "(" + this.period +")}";
}
};
@@ -20349,13 +20312,8 @@ Strophe.TimedHandler.prototype = {
* document. These cookies will then be included in the BOSH XMLHttpRequest
* or in the websocket connection.
*
- * The passed in value must be a map of cookie names and string values or
- * cookie attributes.
+ * The passed in value must be a map of cookie names and string values:
*
- * For example:
- * { "myCookie": "1234" }
- *
- * or:
* { "myCookie": {
* "value": "1234",
* "domain": ".example.org",
@@ -20415,7 +20373,7 @@ Strophe.TimedHandler.prototype = {
* and for some reason need to send cookies to it.
* In order for this to work cross-domain, the server must also enable
* credentials by setting the Access-Control-Allow-Credentials response header
- * to “true”. For most usecases however this setting should be false (which
+ * to "true". For most usecases however this setting should be false (which
* is the default).
* Additionally, when using Access-Control-Allow-Credentials, the
* Access-Control-Allow-Origin header can't be set to the wildcard "*", but
@@ -20428,8 +20386,7 @@ Strophe.TimedHandler.prototype = {
* Returns:
* A new Strophe.Connection object.
*/
-Strophe.Connection = function (service, options)
-{
+Strophe.Connection = function (service, options) {
// The service URL
this.service = service;
// Configuration options
@@ -20486,7 +20443,10 @@ Strophe.Connection = function (service, options)
this.maxRetries = 5;
// Call onIdle callback every 1/10th of a second
- this._idleTimeout = setTimeout(this._onIdle.bind(this), 100);
+ // XXX: setTimeout should be called only with function expressions (23974bc1)
+ this._idleTimeout = setTimeout(function() {
+ this._onIdle();
+ }.bind(this), 100);
utils.addCookies(this.options.cookies);
@@ -20510,8 +20470,7 @@ Strophe.Connection.prototype = {
* This function should be called after a connection is disconnected
* before that connection is reused.
*/
- reset: function ()
- {
+ reset: function () {
this._proto._reset();
// SASL
@@ -20546,8 +20505,7 @@ Strophe.Connection.prototype = {
* This causes Strophe to send the data in a single request, saving
* many request trips.
*/
- pause: function ()
- {
+ pause: function () {
this.paused = true;
},
@@ -20556,8 +20514,7 @@ Strophe.Connection.prototype = {
*
* This resumes after pause() has been called.
*/
- resume: function ()
- {
+ resume: function () {
this.paused = false;
},
@@ -20627,8 +20584,7 @@ Strophe.Connection.prototype = {
* (String) authcid - The optional alternative authentication identity
* (username) if intending to impersonate another user.
*/
- connect: function (jid, pass, callback, wait, hold, route, authcid)
- {
+ connect: function (jid, pass, callback, wait, hold, route, authcid) {
this.jid = jid;
/** Variable: authzid
* Authorization identity.
@@ -20684,8 +20640,7 @@ Strophe.Connection.prototype = {
* (Integer) wind - The optional HTTBIND window value. This is the
* allowed range of request ids that are valid. The default is 5.
*/
- attach: function (jid, sid, rid, callback, wait, hold, wind)
- {
+ attach: function (jid, sid, rid, callback, wait, hold, wind) {
if (this._proto instanceof Strophe.Bosh) {
this._proto._attach(jid, sid, rid, callback, wait, hold, wind);
} else {
@@ -20723,8 +20678,7 @@ Strophe.Connection.prototype = {
* (Integer) wind - The optional HTTBIND window value. This is the
* allowed range of request ids that are valid. The default is 5.
*/
- restore: function (jid, callback, wait, hold, wind)
- {
+ restore: function (jid, callback, wait, hold, wind) {
if (this._sessionCachingSupported()) {
this._proto._restore(jid, callback, wait, hold, wind);
} else {
@@ -20739,8 +20693,7 @@ Strophe.Connection.prototype = {
* Checks whether sessionStorage and JSON are supported and whether we're
* using BOSH.
*/
- _sessionCachingSupported: function ()
- {
+ _sessionCachingSupported: function () {
if (this._proto instanceof Strophe.Bosh) {
if (!JSON) { return false; }
try {
@@ -20773,8 +20726,7 @@ Strophe.Connection.prototype = {
* (XMLElement) elem - The XML data received by the connection.
*/
/* jshint unused:false */
- xmlInput: function (elem)
- {
+ xmlInput: function (elem) {
return;
},
/* jshint unused:true */
@@ -20798,8 +20750,7 @@ Strophe.Connection.prototype = {
* (XMLElement) elem - The XMLdata sent by the connection.
*/
/* jshint unused:false */
- xmlOutput: function (elem)
- {
+ xmlOutput: function (elem) {
return;
},
/* jshint unused:true */
@@ -20817,8 +20768,7 @@ Strophe.Connection.prototype = {
* (String) data - The data received by the connection.
*/
/* jshint unused:false */
- rawInput: function (data)
- {
+ rawInput: function (data) {
return;
},
/* jshint unused:true */
@@ -20836,8 +20786,7 @@ Strophe.Connection.prototype = {
* (String) data - The data sent by the connection.
*/
/* jshint unused:false */
- rawOutput: function (data)
- {
+ rawOutput: function (data) {
return;
},
/* jshint unused:true */
@@ -20854,8 +20803,7 @@ Strophe.Connection.prototype = {
* (Number) rid - The next valid rid
*/
/* jshint unused:false */
- nextValidRid: function (rid)
- {
+ nextValidRid: function (rid) {
return;
},
/* jshint unused:true */
@@ -20872,8 +20820,7 @@ Strophe.Connection.prototype = {
* [XMLElement] |
* Strophe.Builder) elem - The stanza to send.
*/
- send: function (elem)
- {
+ send: function (elem) {
if (elem === null) { return ; }
if (typeof(elem.sort) === "function") {
for (var i = 0; i < elem.length; i++) {
@@ -20896,8 +20843,7 @@ Strophe.Connection.prototype = {
* several send()s are called in succession. flush() can be used to
* immediately send all pending data.
*/
- flush: function ()
- {
+ flush: function () {
// cancel the pending idle period and run the idle function
// immediately
clearTimeout(this._idleTimeout);
@@ -21013,13 +20959,15 @@ Strophe.Connection.prototype = {
/** PrivateFunction: _sendRestart
* Send an xmpp:restart stanza.
*/
- _sendRestart: function ()
- {
+ _sendRestart: function () {
this._data.push("restart");
this._proto._sendRestart();
- this._idleTimeout = setTimeout(this._onIdle.bind(this), 100);
+ // XXX: setTimeout should be called only with function expressions (23974bc1)
+ this._idleTimeout = setTimeout(function() {
+ this._onIdle();
+ }.bind(this), 100);
},
/** Function: addTimedHandler
@@ -21044,8 +20992,7 @@ Strophe.Connection.prototype = {
* Returns:
* A reference to the handler that can be used to remove it.
*/
- addTimedHandler: function (period, handler)
- {
+ addTimedHandler: function (period, handler) {
var thand = new Strophe.TimedHandler(period, handler);
this.addTimeds.push(thand);
return thand;
@@ -21061,8 +21008,7 @@ Strophe.Connection.prototype = {
* Parameters:
* (Strophe.TimedHandler) handRef - The handler reference.
*/
- deleteTimedHandler: function (handRef)
- {
+ deleteTimedHandler: function (handRef) {
// this must be done in the Idle loop so that we don't change
// the handlers during iteration
this.removeTimeds.push(handRef);
@@ -21106,8 +21052,7 @@ Strophe.Connection.prototype = {
* Returns:
* A reference to the handler that can be used to remove it.
*/
- addHandler: function (handler, ns, name, type, id, from, options)
- {
+ addHandler: function (handler, ns, name, type, id, from, options) {
var hand = new Strophe.Handler(handler, ns, name, type, id, from, options);
this.addHandlers.push(hand);
return hand;
@@ -21123,8 +21068,7 @@ Strophe.Connection.prototype = {
* Parameters:
* (Strophe.Handler) handRef - The handler reference.
*/
- deleteHandler: function (handRef)
- {
+ deleteHandler: function (handRef) {
// this must be done in the Idle loop so that we don't change
// the handlers during iteration
this.removeHandlers.push(handRef);
@@ -21152,8 +21096,7 @@ Strophe.Connection.prototype = {
* Parameters:
* (String) reason - The reason the disconnect is occuring.
*/
- disconnect: function (reason)
- {
+ disconnect: function (reason) {
this._changeConnectStatus(Strophe.Status.DISCONNECTING, reason);
Strophe.info("Disconnect was called because: " + reason);
@@ -21185,8 +21128,7 @@ Strophe.Connection.prototype = {
* in Strophe.Status
* (String) condition - the error condition or null
*/
- _changeConnectStatus: function (status, condition)
- {
+ _changeConnectStatus: function (status, condition) {
// notify all plugins listening for status changes
for (var k in Strophe._connectionPlugins) {
if (Strophe._connectionPlugins.hasOwnProperty(k)) {
@@ -21219,8 +21161,7 @@ Strophe.Connection.prototype = {
* This is the last piece of the disconnection logic. This resets the
* connection and alerts the user's connection callback.
*/
- _doDisconnect: function (condition)
- {
+ _doDisconnect: function (condition) {
if (typeof this._idleTimeout == "number") {
clearTimeout(this._idleTimeout);
}
@@ -21263,8 +21204,7 @@ Strophe.Connection.prototype = {
* (Strophe.Request) req - The request that has data ready.
* (string) req - The stanza a raw string (optiona).
*/
- _dataRecv: function (req, raw)
- {
+ _dataRecv: function (req, raw) {
Strophe.info("_dataRecv called");
var elem = this._proto._reqToData(req);
if (elem === null) { return; }
@@ -21378,8 +21318,7 @@ Strophe.Connection.prototype = {
* Useful for plugins with their own xmpp connect callback (when their)
* want to do something special).
*/
- _connect_cb: function (req, _callback, raw)
- {
+ _connect_cb: function (req, _callback, raw) {
Strophe.info("_connect_cb was called");
this.connected = true;
@@ -21463,8 +21402,7 @@ Strophe.Connection.prototype = {
* the code will fall back to legacy authentication.
*
*/
- authenticate: function (matched)
- {
+ authenticate: function (matched) {
var i;
// Sorting matched mechanisms according to priority.
for (i = 0; i < matched.length - 1; ++i) {
@@ -21570,8 +21508,7 @@ Strophe.Connection.prototype = {
* false to remove the handler.
*/
/* jshint unused:false */
- _auth1_cb: function (elem)
- {
+ _auth1_cb: function (elem) {
// build plaintext auth iq
var iq = $iq({type: "set", id: "_auth_2"})
.c('query', {xmlns: Strophe.NS.AUTH})
@@ -21605,8 +21542,7 @@ Strophe.Connection.prototype = {
* Returns:
* false to remove the handler.
*/
- _sasl_success_cb: function (elem)
- {
+ _sasl_success_cb: function (elem) {
if (this._sasl_data["server-signature"]) {
var serverSignature;
var success = Base64.decode(Strophe.getText(elem));
@@ -21673,8 +21609,7 @@ Strophe.Connection.prototype = {
* Returns:
* false to remove the handler.
*/
- _sasl_auth1_cb: function (elem)
- {
+ _sasl_auth1_cb: function (elem) {
// save stream:features for future usage
this.features = elem;
@@ -21709,7 +21644,6 @@ Strophe.Connection.prototype = {
.tree());
}
}
-
return false;
},
@@ -21722,8 +21656,7 @@ Strophe.Connection.prototype = {
* Returns:
* false to remove the handler.
*/
- _sasl_bind_cb: function (elem)
- {
+ _sasl_bind_cb: function (elem) {
if (elem.getAttribute("type") == "error") {
Strophe.info("SASL binding failed.");
var conflict = elem.getElementsByTagName("conflict"), condition;
@@ -21774,8 +21707,7 @@ Strophe.Connection.prototype = {
* Returns:
* false to remove the handler.
*/
- _sasl_session_cb: function (elem)
- {
+ _sasl_session_cb: function (elem) {
if (elem.getAttribute("type") == "result") {
this.authenticated = true;
this._changeConnectStatus(Strophe.Status.CONNECTED, null);
@@ -21784,7 +21716,6 @@ Strophe.Connection.prototype = {
this._changeConnectStatus(Strophe.Status.AUTHFAIL, null);
return false;
}
-
return false;
},
@@ -21798,8 +21729,7 @@ Strophe.Connection.prototype = {
* false to remove the handler.
*/
/* jshint unused:false */
- _sasl_failure_cb: function (elem)
- {
+ _sasl_failure_cb: function (elem) {
// delete unneeded handlers
if (this._sasl_success_handler) {
this.deleteHandler(this._sasl_success_handler);
@@ -21829,8 +21759,7 @@ Strophe.Connection.prototype = {
* Returns:
* false to remove the handler.
*/
- _auth2_cb: function (elem)
- {
+ _auth2_cb: function (elem) {
if (elem.getAttribute("type") == "result") {
this.authenticated = true;
this._changeConnectStatus(Strophe.Status.CONNECTED, null);
@@ -21838,7 +21767,6 @@ Strophe.Connection.prototype = {
this._changeConnectStatus(Strophe.Status.AUTHFAIL, null);
this.disconnect('authentication failed');
}
-
return false;
},
@@ -21853,8 +21781,7 @@ Strophe.Connection.prototype = {
* (Integer) period - The period of the handler.
* (Function) handler - The callback function.
*/
- _addSysTimedHandler: function (period, handler)
- {
+ _addSysTimedHandler: function (period, handler) {
var thand = new Strophe.TimedHandler(period, handler);
thand.user = false;
this.addTimeds.push(thand);
@@ -21896,6 +21823,8 @@ Strophe.Connection.prototype = {
{
Strophe.info("_onDisconnectTimeout was called");
+ this._changeConnectStatus(Strophe.Status.CONNTIMEOUT, null);
+
this._proto._onDisconnectTimeout();
// actually disconnect
@@ -21954,7 +21883,10 @@ Strophe.Connection.prototype = {
// reactivate the timer only if connected
if (this.connected) {
- this._idleTimeout = setTimeout(this._onIdle.bind(this), 100);
+ // XXX: setTimeout should be called only with function expressions (23974bc1)
+ this._idleTimeout = setTimeout(function() {
+ this._onIdle();
+ }.bind(this), 100);
}
}
};
@@ -22046,8 +21978,7 @@ Strophe.SASLMechanism.prototype = {
* Parameters:
* (Strophe.Connection) connection - Target Connection.
*/
- onStart: function(connection)
- {
+ onStart: function(connection) {
this._connection = connection;
},
@@ -22090,6 +22021,7 @@ Strophe.SASLMechanism.prototype = {
* Strophe.SASLPlain - SASL Plain authentication.
* Strophe.SASLMD5 - SASL Digest-MD5 authentication
* Strophe.SASLSHA1 - SASL SCRAM-SHA1 authentication
+ * Strophe.SASLOAuthBearer - SASL OAuth Bearer authentication
*/
// Building SASL callbacks
@@ -22304,6 +22236,32 @@ Strophe.SASLMD5.prototype.onChallenge = function(connection, challenge, test_cno
Strophe.Connection.prototype.mechanisms[Strophe.SASLMD5.prototype.name] = Strophe.SASLMD5;
+/** PrivateConstructor: SASLOAuthBearer
+ * SASL OAuth Bearer authentication.
+ */
+Strophe.SASLOAuthBearer = function() {};
+
+Strophe.SASLOAuthBearer.prototype = new Strophe.SASLMechanism("OAUTHBEARER", true, 80);
+
+Strophe.SASLOAuthBearer.test = function(connection) {
+ return connection.authcid !== null;
+};
+
+Strophe.SASLOAuthBearer.prototype.onChallenge = function(connection) {
+ var auth_str = 'n,a=';
+ auth_str = auth_str + connection.authzid;
+ auth_str = auth_str + ',';
+ auth_str = auth_str + "\u0001";
+ auth_str = auth_str + 'auth=Bearer ';
+ auth_str = auth_str + connection.pass;
+ auth_str = auth_str + "\u0001";
+ auth_str = auth_str + "\u0001";
+
+ return utils.utf16to8(auth_str);
+};
+
+Strophe.Connection.prototype.mechanisms[Strophe.SASLOAuthBearer.prototype.name] = Strophe.SASLOAuthBearer;
+
return {
Strophe: Strophe,
$build: $build,
@@ -22359,8 +22317,7 @@ return {
* (Integer) sends - The number of times this same request has been
* sent.
*/
-Strophe.Request = function (elem, func, rid, sends)
-{
+Strophe.Request = function (elem, func, rid, sends) {
this.id = ++Strophe._requestId;
this.xmlData = elem;
this.data = Strophe.serialize(elem);
@@ -22401,8 +22358,7 @@ Strophe.Request.prototype = {
* Returns:
* The DOM element tree of the response.
*/
- getResponse: function ()
- {
+ getResponse: function () {
var node = null;
if (this.xhr.responseXML && this.xhr.responseXML.documentElement) {
node = this.xhr.responseXML.documentElement;
@@ -22430,8 +22386,7 @@ Strophe.Request.prototype = {
* Returns:
* A new XMLHttpRequest.
*/
- _newXHR: function ()
- {
+ _newXHR: function () {
var xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
@@ -22507,8 +22462,7 @@ Strophe.Bosh.prototype = {
* Returns:
* A Strophe.Builder with a element.
*/
- _buildBody: function ()
- {
+ _buildBody: function () {
var bodyWrap = $build('body', {
rid: this.rid++,
xmlns: Strophe.NS.HTTPBIND
@@ -22516,7 +22470,7 @@ Strophe.Bosh.prototype = {
if (this.sid !== null) {
bodyWrap.attrs({sid: this.sid});
}
- if (this._conn.options.keepalive) {
+ if (this._conn.options.keepalive && this._conn._sessionCachingSupported()) {
this._cacheSession();
}
return bodyWrap;
@@ -22527,12 +22481,13 @@ Strophe.Bosh.prototype = {
*
* This function is called by the reset function of the Strophe Connection
*/
- _reset: function ()
- {
+ _reset: function () {
this.rid = Math.floor(Math.random() * 4294967295);
this.sid = null;
this.errors = 0;
- window.sessionStorage.removeItem('strophe-bosh-session');
+ if (this._conn._sessionCachingSupported()) {
+ window.sessionStorage.removeItem('strophe-bosh-session');
+ }
this._conn.nextValidRid(this.rid);
},
@@ -22542,8 +22497,7 @@ Strophe.Bosh.prototype = {
*
* Creates and sends the Request that initializes the BOSH connection.
*/
- _connect: function (wait, hold, route)
- {
+ _connect: function (wait, hold, route) {
this.wait = wait || this.wait;
this.hold = hold || this.hold;
this.errors = 0;
@@ -22600,8 +22554,7 @@ Strophe.Bosh.prototype = {
* (Integer) wind - The optional HTTBIND window value. This is the
* allowed range of request ids that are valid. The default is 5.
*/
- _attach: function (jid, sid, rid, callback, wait, hold, wind)
- {
+ _attach: function (jid, sid, rid, callback, wait, hold, wind) {
this._conn.jid = jid;
this.sid = sid;
this.rid = rid;
@@ -22639,15 +22592,14 @@ Strophe.Bosh.prototype = {
* (Integer) wind - The optional HTTBIND window value. This is the
* allowed range of request ids that are valid. The default is 5.
*/
- _restore: function (jid, callback, wait, hold, wind)
- {
+ _restore: function (jid, callback, wait, hold, wind) {
var session = JSON.parse(window.sessionStorage.getItem('strophe-bosh-session'));
if (typeof session !== "undefined" &&
session !== null &&
session.rid &&
session.sid &&
session.jid &&
- (typeof jid === "undefined" || jid === "null" || Strophe.getBareJidFromJid(session.jid) == Strophe.getBareJidFromJid(jid)))
+ (typeof jid === "undefined" || jid === null || Strophe.getBareJidFromJid(session.jid) == Strophe.getBareJidFromJid(jid)))
{
this._conn.restored = true;
this._attach(session.jid, session.sid, session.rid, callback, wait, hold, wind);
@@ -22663,8 +22615,7 @@ Strophe.Bosh.prototype = {
* Parameters:
* (Strophe.Request) bodyWrap - The received stanza.
*/
- _cacheSession: function ()
- {
+ _cacheSession: function () {
if (this._conn.authenticated) {
if (this._conn.jid && this.rid && this.sid) {
window.sessionStorage.setItem('strophe-bosh-session', JSON.stringify({
@@ -22685,8 +22636,7 @@ Strophe.Bosh.prototype = {
* Parameters:
* (Strophe.Request) bodyWrap - The received stanza.
*/
- _connect_cb: function (bodyWrap)
- {
+ _connect_cb: function (bodyWrap) {
var typ = bodyWrap.getAttribute("type");
var cond, conflict;
if (typ !== null && typ == "terminate") {
@@ -22725,8 +22675,7 @@ Strophe.Bosh.prototype = {
* Parameters:
* (Request) pres - This stanza will be sent before disconnecting.
*/
- _disconnect: function (pres)
- {
+ _disconnect: function (pres) {
this._sendTerminate(pres);
},
@@ -22735,11 +22684,12 @@ Strophe.Bosh.prototype = {
*
* Resets the SID and RID.
*/
- _doDisconnect: function ()
- {
+ _doDisconnect: function () {
this.sid = null;
this.rid = Math.floor(Math.random() * 4294967295);
- window.sessionStorage.removeItem('strophe-bosh-session');
+ if (this._conn._sessionCachingSupported()) {
+ window.sessionStorage.removeItem('strophe-bosh-session');
+ }
this._conn.nextValidRid(this.rid);
},
@@ -22750,8 +22700,7 @@ Strophe.Bosh.prototype = {
* Returns:
* True, if there are no Requests queued, False otherwise.
*/
- _emptyQueue: function ()
- {
+ _emptyQueue: function () {
return this._requests.length === 0;
},
@@ -22765,8 +22714,7 @@ Strophe.Bosh.prototype = {
* Parameters:
* (Integer) reqStatus - The request status.
*/
- _hitError: function (reqStatus)
- {
+ _hitError: function (reqStatus) {
this.errors++;
Strophe.warn("request errored, status: " + reqStatus +
", number of errors: " + this.errors);
@@ -22780,8 +22728,7 @@ Strophe.Bosh.prototype = {
* Called on stream start/restart when no stream:features
* has been received and sends a blank poll request.
*/
- _no_auth_received: function (_callback)
- {
+ _no_auth_received: function (_callback) {
if (_callback) {
_callback = _callback.bind(this._conn);
} else {
@@ -22897,8 +22844,7 @@ Strophe.Bosh.prototype = {
* (Function) func - The handler for the request.
* (Strophe.Request) req - The request that is changing readyState.
*/
- _onRequestStateChange: function (func, req)
- {
+ _onRequestStateChange: function (func, req) {
Strophe.debug("request id " + req.id +
"." + req.sends + " state changed to " +
req.xhr.readyState);
@@ -22993,8 +22939,7 @@ Strophe.Bosh.prototype = {
* Parameters:
* (Integer) i - The index of the request in the queue.
*/
- _processRequest: function (i)
- {
+ _processRequest: function (i) {
var self = this;
var req = this._requests[i];
var reqStatus = -1;
@@ -23086,7 +23031,11 @@ Strophe.Bosh.prototype = {
// expanding retry window
var backoff = Math.min(Math.floor(Strophe.TIMEOUT * this.wait),
Math.pow(req.sends, 3)) * 1000;
- setTimeout(sendFunc, backoff);
+
+ // XXX: setTimeout should be called only with function expressions (23974bc1)
+ setTimeout(function() {
+ sendFunc();
+ }, backoff);
} else {
sendFunc();
}
@@ -23117,8 +23066,7 @@ Strophe.Bosh.prototype = {
* Parameters:
* (Strophe.Request) req - The request to remove.
*/
- _removeRequest: function (req)
- {
+ _removeRequest: function (req) {
Strophe.debug("removing request");
var i;
@@ -23140,8 +23088,7 @@ Strophe.Bosh.prototype = {
* Parameters:
* (Integer) i - The index of the request in the queue.
*/
- _restartRequest: function (i)
- {
+ _restartRequest: function (i) {
var req = this._requests[i];
if (req.dead === null) {
req.dead = new Date();
@@ -23162,8 +23109,7 @@ Strophe.Bosh.prototype = {
* Returns:
* The stanza that was passed.
*/
- _reqToData: function (req)
- {
+ _reqToData: function (req) {
try {
return req.getResponse();
} catch (e) {
@@ -23179,8 +23125,7 @@ Strophe.Bosh.prototype = {
* the BOSH server a terminate body and includes an unavailable
* presence if authentication has completed.
*/
- _sendTerminate: function (pres)
- {
+ _sendTerminate: function (pres) {
Strophe.info("_sendTerminate was called");
var body = this._buildBody().attrs({type: "terminate"});
@@ -23205,15 +23150,18 @@ Strophe.Bosh.prototype = {
_send: function () {
clearTimeout(this._conn._idleTimeout);
this._throttledRequestHandler();
- this._conn._idleTimeout = setTimeout(this._conn._onIdle.bind(this._conn), 100);
+
+ // XXX: setTimeout should be called only with function expressions (23974bc1)
+ this._conn._idleTimeout = setTimeout(function() {
+ this._onIdle();
+ }.bind(this._conn), 100);
},
/** PrivateFunction: _sendRestart
*
* Send an xmpp:restart stanza.
*/
- _sendRestart: function ()
- {
+ _sendRestart: function () {
this._throttledRequestHandler();
clearTimeout(this._conn._idleTimeout);
},
@@ -23225,8 +23173,7 @@ Strophe.Bosh.prototype = {
* request ids overflow the connection window in the case that one
* request died.
*/
- _throttledRequestHandler: function ()
- {
+ _throttledRequestHandler: function () {
if (!this._requests) {
Strophe.debug("_throttledRequestHandler called with " +
"undefined requests");
@@ -23341,8 +23288,7 @@ Strophe.Websocket.prototype = {
* Returns:
* A Strophe.Builder with a element.
*/
- _buildStream: function ()
- {
+ _buildStream: function () {
return $build("open", {
"xmlns": Strophe.NS.FRAMING,
"to": this._conn.domain,
@@ -23412,8 +23358,7 @@ Strophe.Websocket.prototype = {
* This function is called by the reset function of the Strophe Connection.
* Is not needed by WebSockets.
*/
- _reset: function ()
- {
+ _reset: function () {
return;
},
@@ -23535,8 +23480,7 @@ Strophe.Websocket.prototype = {
* Parameters:
* (Request) pres - This stanza will be sent before disconnecting.
*/
- _disconnect: function (pres)
- {
+ _disconnect: function (pres) {
if (this.socket && this.socket.readyState !== WebSocket.CLOSED) {
if (pres) {
this._conn.send(pres);
@@ -23559,8 +23503,7 @@ Strophe.Websocket.prototype = {
*
* Just closes the Socket for WebSockets
*/
- _doDisconnect: function ()
- {
+ _doDisconnect: function () {
Strophe.info("WebSockets _doDisconnect was called");
this._closeSocket();
},
@@ -23569,8 +23512,7 @@ Strophe.Websocket.prototype = {
* _Private_ helper function to wrap a stanza in a tag.
* This is used so Strophe can process stanzas from WebSockets like BOSH
*/
- _streamWrap: function (stanza)
- {
+ _streamWrap: function (stanza) {
return "" + stanza + '';
},
@@ -23580,8 +23522,7 @@ Strophe.Websocket.prototype = {
*
* Closes the socket if it is still open and deletes it
*/
- _closeSocket: function ()
- {
+ _closeSocket: function () {
if (this.socket) { try {
this.socket.close();
} catch (e) {} }
@@ -23594,8 +23535,7 @@ Strophe.Websocket.prototype = {
* Returns:
* True, because WebSocket messages are send immediately after queueing.
*/
- _emptyQueue: function ()
- {
+ _emptyQueue: function () {
return true;
},
@@ -23606,7 +23546,7 @@ Strophe.Websocket.prototype = {
*/
_onClose: function() {
if(this._conn.connected && !this._conn.disconnecting) {
- Strophe.error("Websocket closed unexcectedly");
+ Strophe.error("Websocket closed unexpectedly");
this._conn._doDisconnect();
} else {
Strophe.info("Websocket closed");
@@ -23618,8 +23558,7 @@ Strophe.Websocket.prototype = {
* Called on stream start/restart when no stream:features
* has been received.
*/
- _no_auth_received: function (_callback)
- {
+ _no_auth_received: function (_callback) {
Strophe.error("Server did not send any auth methods");
this._conn._changeConnectStatus(Strophe.Status.CONNFAIL, "Server did not send any auth methods");
if (_callback) {
@@ -23682,11 +23621,22 @@ Strophe.Websocket.prototype = {
/** PrivateFunction: _onMessage
* _Private_ function to handle websockets messages.
*
- * This function parses each of the messages as if they are full documents. [TODO : We may actually want to use a SAX Push parser].
+ * This function parses each of the messages as if they are full documents.
+ * [TODO : We may actually want to use a SAX Push parser].
*
- * Since all XMPP traffic starts with ""
- * The first stanza will always fail to be parsed...
- * Addtionnaly, the seconds stanza will always be a with the stream NS defined in the previous stanza... so we need to 'force' the inclusion of the NS in this stanza!
+ * Since all XMPP traffic starts with
+ *
+ *
+ * The first stanza will always fail to be parsed.
+ *
+ * Additionally, the seconds stanza will always be with
+ * the stream NS defined in the previous stanza, so we need to 'force'
+ * the inclusion of the NS in this stanza.
*
* Parameters:
* (string) message - The websocket message.
@@ -23705,7 +23655,6 @@ Strophe.Websocket.prototype = {
} else if (message.data.search("\n \n \n \n
\n
▼ '+
+((__t=( unread_msgs ))==null?'':__t)+
+' ▼
\n ';
if (show_textarea) {
__p+='\n
\n ';
if (show_toolbar) {
@@ -24644,9 +24595,13 @@ return __p;
define('tpl!chatroom_sidebar', [],function () { return function(obj){
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
with(obj||{}){
-__p+='\n\n -->\n';
+ if (allow_muc_invitations) {
+__p+='\n\n \n\n
'+
+'" type="text"/>\n\n';
+ }
+__p+='\n
'+
((__t=(label_occupants))==null?'':__t)+
':
\n
\n\n';
}
@@ -25784,6 +25739,16 @@ define("converse-templates", [
'list-multi': 'dropdown'
};
+ var isImage = function (url) {
+ var deferred = new $.Deferred();
+ $("
", {
+ src: url,
+ error: deferred.reject,
+ load: deferred.resolve
+ });
+ return deferred.promise();
+ };
+
$.expr[':'].emptyVal = function(obj){
return obj.value === '';
};
@@ -25798,19 +25763,33 @@ define("converse-templates", [
return false;
};
+ $.fn.throttledHTML = _.throttle($.fn.html, 500);
+
$.fn.addHyperlinks = function () {
if (this.length > 0) {
this.each(function (i, obj) {
- var x = $(obj).html();
+ var prot, escaped_url;
+ var $obj = $(obj);
+ var x = $obj.html();
var list = x.match(/\b(https?:\/\/|www\.|https?:\/\/www\.)[^\s<]{2,200}\b/g );
if (list) {
for (i=0; i
'+ list[i] + '' );
}
}
- $(obj).html(x);
+ $obj.html(x);
+ _.each(list, function (url) {
+ isImage(url).then(function () {
+ var prot = url.indexOf('http://') === 0 || url.indexOf('https://') === 0 ? '' : 'http://';
+ var escaped_url = encodeURI(decodeURI(url)).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
+ var new_url = ''+ url + '';
+ event.target.className = 'chat-image';
+ x = x.replace(new_url, event.target.outerHTML);
+ $obj.throttledHTML(x);
+ });
+ });
});
}
return this;
@@ -25889,6 +25868,12 @@ define("converse-templates", [
return str;
},
+ isOTRMessage: function (message) {
+ var $body = $(message).children('body'),
+ text = ($body.length > 0 ? $body.text() : undefined);
+ return text && !!text.match(/^\?OTR/);
+ },
+
isHeadlineMessage: function (message) {
var $message = $(message),
from_jid = $message.attr('from');
@@ -26082,6 +26067,174 @@ if (!String.prototype.trim) {
;
define("polyfill", function(){});
+/*
+ * ____ __ __ __ _
+ * / __ \/ /_ __ ___ ___ ____ _/ /_ / /__ (_)____
+ * / /_/ / / / / / __ \/ __ \/ __/ / __ \/ / _ \ / / ___/
+ * / ____/ / /_/ / /_/ / /_/ / /_/ / /_/ / / __/ / (__ )
+ * /_/ /_/\__,_/\__, /\__, /\__/_/_.___/_/\___(_)_/ /____/
+ * /____//____/ /___/
+ *
+ */
+(function (root, factory) {
+ define("converse-pluggable", ["jquery", "underscore"], factory);
+}(this, function ($, _) {
+ "use strict";
+
+ function Pluggable (plugged) {
+ this.plugged = plugged;
+ this.plugged._super = {};
+ this.plugins = {};
+ this.initialized_plugins = [];
+ }
+ _.extend(Pluggable.prototype, {
+ wrappedOverride: function (key, value, super_method) {
+ /* We create a partially applied wrapper function, that
+ * makes sure to set the proper super method when the
+ * overriding method is called. This is done to enable
+ * chaining of plugin methods, all the way up to the
+ * original method.
+ */
+ if (typeof super_method === "function") {
+ this._super[key] = super_method.bind(this);
+ }
+ return value.apply(this, _.rest(arguments, 3));
+ },
+
+ _overrideAttribute: function (key, plugin) {
+ /* Overrides an attribute on the original object (the thing being
+ * plugged into).
+ *
+ * If the attribute being overridden is a function, then the original
+ * function will still be available via the _super attribute.
+ *
+ * If the same function is being overridden multiple times, then
+ * the original function will be available at the end of a chain of
+ * functions, starting from the most recent override, all the way
+ * back to the original function, each being referenced by the
+ * previous' _super attribute.
+ *
+ * For example:
+ *
+ * plugin2.MyFunc._super.myFunc => * plugin1.MyFunc._super.myFunc => original.myFunc
+ */
+ var value = plugin.overrides[key];
+ if (typeof value === "function") {
+ var wrapped_function = _.partial(
+ this.wrappedOverride, key, value, this.plugged[key]
+ );
+ this.plugged[key] = wrapped_function;
+ } else {
+ this.plugged[key] = value;
+ }
+ },
+
+ _extendObject: function (obj, attributes) {
+ if (!obj.prototype._super) {
+ // FIXME: make generic
+ obj.prototype._super = {'converse': this.plugged };
+ }
+ _.each(attributes, function (value, key) {
+ if (key === 'events') {
+ obj.prototype[key] = _.extend(value, obj.prototype[key]);
+ } else if (typeof value === 'function') {
+ // We create a partially applied wrapper function, that
+ // makes sure to set the proper super method when the
+ // overriding method is called. This is done to enable
+ // chaining of plugin methods, all the way up to the
+ // original method.
+ var wrapped_function = _.partial(
+ this.wrappedOverride, key, value, obj.prototype[key]
+ );
+ obj.prototype[key] = wrapped_function;
+ } else {
+ obj.prototype[key] = value;
+ }
+ }.bind(this));
+ },
+
+ loadOptionalDependencies: function (plugin) {
+ _.each(plugin.optional_dependencies, function (name) {
+ var dep = this.plugins[name];
+ if (dep) {
+ if (_.contains(dep.optional_dependencies, plugin.__name__)) {
+ // FIXME: circular dependency checking is only one level deep.
+ throw "Found a circular dependency between the plugins \""+
+ plugin.__name__+"\" and \""+name+"\"";
+ }
+ this.initializePlugin(dep);
+ } else {
+ this.throwUndefinedDependencyError(
+ "Could not find optional dependency \""+name+"\" "+
+ "for the plugin \""+plugin.__name__+"\". "+
+ "If it's needed, make sure it's loaded by require.js");
+ }
+ }.bind(this));
+ },
+
+ throwUndefinedDependencyError: function (msg) {
+ if (this.plugged.strict_plugin_dependencies) {
+ throw msg;
+ } else {
+ console.log(msg);
+ return;
+ }
+ },
+
+ applyOverrides: function (plugin) {
+ _.each(Object.keys(plugin.overrides || {}), function (key) {
+ /* We automatically override all methods and Backbone views and
+ * models that are in the "overrides" namespace.
+ */
+ var override = plugin.overrides[key];
+ if (typeof override === "object") {
+ if (typeof this.plugged[key] === 'undefined') {
+ this.throwUndefinedDependencyError("Error: Plugin \""+plugin.__name__+"\" tried to override "+key+" but it's not found.");
+ } else {
+ this._extendObject(this.plugged[key], override);
+ }
+ } else {
+ this._overrideAttribute(key, plugin);
+ }
+ }.bind(this));
+ },
+
+ initializePlugin: function (plugin) {
+ if (_.contains(this.initialized_plugins, plugin.__name__)) {
+ // Don't initialize plugins twice, otherwise we get
+ // infinite recursion in overridden methods.
+ return;
+ }
+ _.extend(plugin, this.properties);
+ if (plugin.optional_dependencies) {
+ this.loadOptionalDependencies(plugin);
+ }
+ this.applyOverrides(plugin);
+ if (typeof plugin.initialize === "function") {
+ plugin.initialize.bind(plugin)(this);
+ }
+ this.initialized_plugins.push(plugin.__name__);
+ },
+
+ initializePlugins: function (properties) {
+ /* The properties variable is an object of attributes and methods
+ * which will be attached to the plugins.
+ */
+ if (!_.size(this.plugins)) {
+ return;
+ }
+ this.properties = properties;
+ _.each(_.values(this.plugins), this.initializePlugin.bind(this));
+ }
+ });
+ return {
+ 'enable': function (object) {
+ /* Call this method to make an object pluggable */
+ return _.extend(object, {'pluggable': new Pluggable(object)});
+ }
+ };
+}));
+
/*
Copyright 2010, François de Metz
*/
@@ -28336,11 +28489,12 @@ return Backbone.BrowserStorage;
"moment_with_locales",
"strophe",
"converse-templates",
+ "converse-pluggable",
"strophe.disco",
"backbone.browserStorage",
"backbone.overview",
], factory);
-}(this, function ($, _, dummy, utils, moment, Strophe, templates) {
+}(this, function ($, _, dummy, utils, moment, Strophe, templates, pluggable) {
/*
* Cannot use this due to Safari bug.
* See https://github.com/jcbrand/converse.js/issues/196
@@ -28371,26 +28525,31 @@ return Backbone.BrowserStorage;
var event_context = {};
var converse = {
- plugins: {},
- initialized_plugins: [],
templates: templates,
+
emit: function (evt, data) {
$(event_context).trigger(evt, data);
},
+
once: function (evt, handler) {
$(event_context).one(evt, handler);
},
+
on: function (evt, handler) {
if (_.contains(['ready', 'initialized'], evt)) {
converse.log('Warning: The "'+evt+'" event has been deprecated and will be removed, please use "connected".');
}
$(event_context).bind(evt, handler);
},
+
off: function (evt, handler) {
$(event_context).unbind(evt, handler);
}
};
+ // Make converse pluggable
+ pluggable.enable(converse);
+
// Module-level constants
converse.STATUS_WEIGHTS = {
'offline': 6,
@@ -28439,6 +28598,7 @@ return Backbone.BrowserStorage;
converse.initialize = function (settings, callback) {
"use strict";
+ var init_deferred = new $.Deferred();
var converse = this;
var unloadevent;
if ('onpagehide' in window) {
@@ -28464,6 +28624,7 @@ return Backbone.BrowserStorage;
Strophe.addNamespace('ROSTERX', 'http://jabber.org/protocol/rosterx');
Strophe.addNamespace('XFORM', 'jabber:x:data');
Strophe.addNamespace('NICK', 'http://jabber.org/protocol/nick');
+ Strophe.addNamespace('HINTS', 'urn:xmpp:hints');
// Instance level constants
this.TIMEOUTS = { // Set as module attr so that we can override in tests.
@@ -28517,7 +28678,7 @@ return Backbone.BrowserStorage;
}
}
};
-
+
this.detectLocale = function (library_check) {
/* Determine which locale is supported by the user's system as well
* as by the relevant library (e.g. converse.js or moment.js).
@@ -28545,12 +28706,12 @@ return Backbone.BrowserStorage;
}
return locale || 'en';
};
-
+
if (!moment.locale) { //moment.lang is deprecated after 2.8.1, use moment.locale instead
moment.locale = moment.lang;
}
moment.locale(this.detectLocale(this.isMomentLocale));
- this.i18n = settings.i18n ? settings.i18n : locales[this.detectLocale(this.isConverseLocale)];
+ this.i18n = settings.i18n ? settings.i18n : locales[this.detectLocale(this.isConverseLocale)] || {};
// Translation machinery
// ---------------------
@@ -28571,7 +28732,9 @@ return Backbone.BrowserStorage;
credentials_url: null, // URL from where login credentials can be fetched
csi_waiting_time: 0, // Support for XEP-0352. Seconds before client is considered idle and CSI is sent out.
debug: false,
+ default_state: 'online',
expose_rid_and_sid: false,
+ filter_by_resource: false,
forward_messages: false,
hide_offline_users: false,
include_offline_state: false,
@@ -28668,7 +28831,9 @@ return Backbone.BrowserStorage;
}
if (converse.auto_changed_status === true) {
converse.auto_changed_status = false;
- converse.xmppstatus.setStatus('online');
+ // XXX: we should really remember the original state here, and
+ // then set it back to that...
+ converse.xmppstatus.setStatus(converse.default_state);
}
};
@@ -28755,11 +28920,11 @@ return Backbone.BrowserStorage;
}, 1000);
this.onDisconnected = function (condition) {
- if (!converse.auto_reconnect) { return; }
- if (converse.disconnection_cause === Strophe.Status.CONNFAIL) {
+ if (converse.disconnection_cause === Strophe.Status.CONNFAIL && converse.auto_reconnect) {
converse.reconnect(condition);
return 'reconnecting';
} else {
+ converse._tearDown();
converse.emit('disconnected');
return 'disconnected';
}
@@ -28816,8 +28981,6 @@ return Backbone.BrowserStorage;
} else {
document.title = document.title.replace(/^Messages \(\d+\) /, "Messages (" + this.msg_counter + ") ");
}
- window.blur();
- window.focus();
} else if (document.title.search(/^Messages \(\d+\) /) !== -1) {
document.title = document.title.replace(/^Messages \(\d+\) /, "");
}
@@ -28871,13 +29034,57 @@ return Backbone.BrowserStorage;
}
};
+ this.saveWindowState = function (ev, hidden) {
+ // XXX: eventually we should be able to just use
+ // document.visibilityState (when we drop support for older
+ // browsers).
+ var state;
+ var v = "visible", h = "hidden",
+ event_map = {
+ 'focus': v,
+ 'focusin': v,
+ 'pageshow': v,
+ 'blur': h,
+ 'focusout': h,
+ 'pagehide': h
+ };
+ ev = ev || document.createEvent('Events');
+ if (ev.type in event_map) {
+ state = event_map[ev.type];
+ } else {
+ state = document[hidden] ? "hidden" : "visible";
+ }
+ if (state === 'visible') {
+ converse.clearMsgCounter();
+ }
+ converse.windowState = state;
+
+ };
+
this.registerGlobalEventHandlers = function () {
- $(window).on("blur focus", function (ev) {
- if ((converse.windowState !== ev.type) && (ev.type === 'focus')) {
- converse.clearMsgCounter();
- }
- converse.windowState = ev.type;
- });
+ // Taken from:
+ // http://stackoverflow.com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-is-not-currently-active
+ var hidden = "hidden";
+ // Standards:
+ if (hidden in document) {
+ document.addEventListener("visibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "mozHidden") in document) {
+ document.addEventListener("mozvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "webkitHidden") in document) {
+ document.addEventListener("webkitvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ((hidden = "msHidden") in document) {
+ document.addEventListener("msvisibilitychange", _.partial(converse.saveWindowState, _, hidden));
+ } else if ("onfocusin" in document) {
+ // IE 9 and lower:
+ document.onfocusin = document.onfocusout = _.partial(converse.saveWindowState, _, hidden);
+ } else {
+ // All others:
+ window.onpageshow = window.onpagehide = window.onfocus = window.onblur = _.partial(converse.saveWindowState, _, hidden);
+ }
+ // set the initial state (but only if browser supports the Page Visibility API)
+ if( document[hidden] !== undefined ) {
+ _.partial(converse.saveWindowState, _, hidden)({type: document[hidden] ? "blur" : "focus"});
+ }
};
this.afterReconnected = function () {
@@ -28923,28 +29130,22 @@ return Backbone.BrowserStorage;
};
- this.onStatusInitialized = function (deferred) {
- this.registerIntervalHandler();
+ this.onStatusInitialized = function () {
+ this.registerIntervalHandler();
this.roster = new this.RosterContacts();
this.roster.browserStorage = new Backbone.BrowserStorage[this.storage](
b64_sha1('converse.contacts-'+this.bare_jid));
this.chatboxes.onConnected();
this.giveFeedback(__('Contacts'));
if (typeof this.callback === 'function') {
- // A callback method may be passed in via the
- // converse.initialize method.
- // XXX: Can we use $.Deferred instead of this callback?
- if (this.connection.service === 'jasmine tests') {
- // XXX: Call back with the internal converse object. This
- // object should never be exposed to production systems.
- // 'jasmine tests' is an invalid http bind service value,
- // so we're sure that this is just for tests.
- this.callback(this);
- } else {
- this.callback();
- }
+ // XXX: Deprecate in favor of init_deferred
+ this.callback();
+ }
+ if (converse.connection.service === 'jasmine tests') {
+ init_deferred.resolve(converse);
+ } else {
+ init_deferred.resolve();
}
- deferred.resolve();
converse.emit('initialized');
};
@@ -28952,7 +29153,6 @@ return Backbone.BrowserStorage;
// When reconnecting, there might be some open chat boxes. We don't
// know whether these boxes are of the same account or not, so we
// close them now.
- var deferred = new $.Deferred();
// XXX: ran into an issue where a returned PubSub BOSH response was
// not received by the browser. The solution was to flush the
// connection early on. I don't know what the underlying cause of
@@ -28972,13 +29172,11 @@ return Backbone.BrowserStorage;
this.domain = Strophe.getDomainFromJid(this.connection.jid);
this.features = new this.Features();
this.enableCarbons();
- this.initStatus().done(_.bind(this.onStatusInitialized, this, deferred));
+ this.initStatus().done(_.bind(this.onStatusInitialized, this));
converse.emit('connected');
converse.emit('ready'); // BBB: Will be removed.
- return deferred.promise();
};
-
this.RosterContact = Backbone.Model.extend({
initialize: function (attributes, options) {
@@ -29447,7 +29645,6 @@ return Backbone.BrowserStorage;
this.Message = Backbone.Model.extend({
- idAttribute: 'msgid',
defaults: function(){
return {
msgid: converse.connection.getUniqueId()
@@ -29480,13 +29677,12 @@ return Backbone.BrowserStorage;
});
},
- createMessage: function ($message, $delay) {
+ getMessageAttributes: function ($message, $delay, original_stanza) {
$delay = $delay || $message.find('delay');
var body = $message.children('body').text(),
delayed = $delay.length > 0,
fullname = this.get('fullname'),
is_groupchat = $message.attr('type') === 'groupchat',
- msgid = $message.attr('id'),
chat_state = $message.find(converse.COMPOSING).length && converse.COMPOSING ||
$message.find(converse.PAUSED).length && converse.PAUSED ||
$message.find(converse.INACTIVE).length && converse.INACTIVE ||
@@ -29513,18 +29709,22 @@ return Backbone.BrowserStorage;
} else {
sender = 'them';
}
- return this.messages.create({
+ return {
chat_state: chat_state,
delayed: delayed,
fullname: fullname,
message: body || undefined,
- msgid: msgid,
+ msgid: $message.attr('id'),
sender: sender,
time: time
- });
+ };
+ },
+
+ createMessage: function ($message, $delay, original_stanza) {
+ return this.messages.create(this.getMessageAttributes.apply(this, arguments));
}
});
-
+
this.ChatBoxes = Backbone.Collection.extend({
model: converse.ChatBox,
comparator: 'time_opened',
@@ -29577,20 +29777,12 @@ return Backbone.BrowserStorage;
to_jid = $message.attr('to'),
to_resource = Strophe.getResourceFromJid(to_jid);
- if (to_resource && to_resource !== converse.resource) {
+ if (converse.filter_by_resource && (to_resource && to_resource !== converse.resource)) {
converse.log(
'onMessage: Ignoring incoming message intended for a different resource: '+to_jid,
'info'
);
return true;
- } else if (from_jid === converse.connection.jid) {
- // FIXME: Forwarded messages should be sent to specific
- // resources, not broadcasted
- converse.log(
- "onMessage: Ignoring incoming message sent from this client's JID: "+from_jid,
- 'info'
- );
- return true;
} else if (utils.isHeadlineMessage(message)) {
// XXX: Ideally we wouldn't have to check for headline
// messages, but Prosody sends headline messages with the
@@ -29629,7 +29821,7 @@ return Backbone.BrowserStorage;
if (msgid && chatbox.messages.findWhere({msgid: msgid})) {
return true; // We already have this message stored.
}
- chatbox.createMessage($message, $delay);
+ chatbox.createMessage($message, $delay, message);
converse.roster.addResource(contact_jid, resource);
converse.emit('message', message);
return true;
@@ -29712,18 +29904,23 @@ return Backbone.BrowserStorage;
return this.model.chatBoxMayBeShown(chatbox);
},
- showChat: function (attrs) {
- /* Find the chat box and show it (if it may be shown).
- * If it doesn't exist, create it.
- */
+ getChatBox: function (attrs, create) {
var chatbox = this.model.get(attrs.jid);
- if (!chatbox) {
+ if (!chatbox && create) {
chatbox = this.model.create(attrs, {
'error': function (model, response) {
converse.log(response.responseText);
}
});
}
+ return chatbox;
+ },
+
+ showChat: function (attrs) {
+ /* Find the chat box and show it (if it may be shown).
+ * If it doesn't exist, create it.
+ */
+ var chatbox = this.getChatBox(attrs, true);
if (this.chatBoxMayBeShown(chatbox)) {
chatbox.trigger('show', true);
}
@@ -29748,15 +29945,11 @@ return Backbone.BrowserStorage;
},
constructPresence: function (type, status_message) {
- if (typeof type !== 'string') {
- type = this.get('status') || 'online';
- }
- if (typeof status_message !== 'string') {
- status_message = this.get('status_message');
- }
var presence;
+ type = typeof type === 'string' ? type : (this.get('status') || converse.default_state);
+ status_message = typeof status_message === 'string' ? status_message : undefined;
// Most of these presence types are actually not explicitly sent,
- // but I add all of them here fore reference and future proofing.
+ // but I add all of them here for reference and future proofing.
if ((type === 'unavailable') ||
(type === 'probe') ||
(type === 'error') ||
@@ -29767,18 +29960,13 @@ return Backbone.BrowserStorage;
presence = $pres({'type': type});
} else if (type === 'offline') {
presence = $pres({'type': 'unavailable'});
- if (status_message) {
- presence.c('show').t(type);
- }
+ } else if (type === 'online') {
+ presence = $pres();
} else {
- if (type === 'online') {
- presence = $pres();
- } else {
- presence = $pres().c('show').t(type).up();
- }
- if (status_message) {
- presence.c('status').t(status_message);
- }
+ presence = $pres().c('show').t(type).up();
+ }
+ if (status_message) {
+ presence.c('status').t(status_message);
}
return presence;
},
@@ -29793,7 +29981,7 @@ return Backbone.BrowserStorage;
},
getStatus: function () {
- return this.get('status') || 'online';
+ return this.get('status') || converse.default_state;
},
setStatusMessage: function (status_message) {
@@ -29894,6 +30082,9 @@ return Backbone.BrowserStorage;
});
this.setUpXMLLogging = function () {
+ Strophe.log = function (level, msg) {
+ converse.log(msg, level);
+ };
if (this.debug) {
this.connection.xmlInput = function (body) { converse.log(body.outerHTML); };
this.connection.xmlOutput = function (body) { converse.log(body.outerHTML); };
@@ -30005,7 +30196,7 @@ return Backbone.BrowserStorage;
*/
if (this.keepalive) {
try {
- return this.connection.restore(undefined, this.onConnectStatusChanged);
+ return this.connection.restore(this.jid, this.onConnectStatusChanged);
} catch (e) {
this.log("Could not restore session. Error message: "+e.message);
this.clearSession(); // If there's a roster, we want to clear it (see #555)
@@ -30085,116 +30276,28 @@ return Backbone.BrowserStorage;
return this;
};
- this.wrappedOverride = function (key, value, super_method) {
- // We create a partially applied wrapper function, that
- // makes sure to set the proper super method when the
- // overriding method is called. This is done to enable
- // chaining of plugin methods, all the way up to the
- // original method.
- this._super[key] = super_method;
- return value.apply(this, _.rest(arguments, 3));
- };
-
- this._overrideAttribute = function (key, plugin) {
- // See converse.plugins.override
- var value = plugin.overrides[key];
- if (typeof value === "function") {
- var wrapped_function = _.partial(
- converse.wrappedOverride.bind(converse),
- key, value, converse[key].bind(converse)
- );
- converse[key] = wrapped_function;
- } else {
- converse[key] = value;
- }
- };
-
- this._extendObject = function (obj, attributes) {
- // See converse.plugins.extend
- if (!obj.prototype._super) {
- obj.prototype._super = {'converse': converse};
- }
- _.each(attributes, function (value, key) {
- if (key === 'events') {
- obj.prototype[key] = _.extend(value, obj.prototype[key]);
- } else if (typeof value === 'function') {
- // We create a partially applied wrapper function, that
- // makes sure to set the proper super method when the
- // overriding method is called. This is done to enable
- // chaining of plugin methods, all the way up to the
- // original method.
- var wrapped_function = _.partial(
- converse.wrappedOverride,
- key, value, obj.prototype[key]
- );
- obj.prototype[key] = wrapped_function;
- } else {
- obj.prototype[key] = value;
- }
- });
- };
-
- this.initializePlugins = function () {
- if (typeof converse._super === 'undefined') {
- converse._super = { 'converse': converse };
- }
-
- var updateSettings = function (settings) {
- /* Helper method which gets put on the plugin and allows it to
- * add more user-facing config settings to converse.js.
- */
- _.extend(converse.default_settings, settings);
- _.extend(converse, settings);
- _.extend(converse, _.pick(converse.user_settings, Object.keys(settings)));
- };
-
- _.each(_.keys(this.plugins), function (name) {
- var plugin = this.plugins[name];
- plugin.updateSettings = updateSettings;
-
- if (_.contains(this.initialized_plugins, name)) {
- // Don't initialize plugins twice, otherwise we get
- // infinite recursion in overridden methods.
- return;
- }
- plugin.converse = converse;
- _.each(Object.keys(plugin.overrides || {}), function (key) {
- /* We automatically override all methods and Backbone views and
- * models that are in the "overrides" namespace.
- */
- var msg,
- override = plugin.overrides[key];
- if (typeof override === "object") {
- if (typeof converse[key] === 'undefined') {
- msg = "Error: Plugin tried to override "+key+" but it's not found.";
- if (converse.strict_plugin_dependencies) {
- throw msg;
- } else {
- converse.log(msg);
- }
- }
- this._extendObject(converse[key], override);
- } else {
- this._overrideAttribute(key, plugin);
- }
- }.bind(this));
-
- if (typeof plugin.initialize === "function") {
- plugin.initialize.bind(plugin)(this);
- }
- this.initialized_plugins.push(name);
- }.bind(this));
- };
-
// Initialization
// --------------
// This is the end of the initialize method.
if (settings.connection) {
this.connection = settings.connection;
}
- this.initializePlugins();
- this._initialize();
- this.registerGlobalEventHandlers();
+ var updateSettings = function (settings) {
+ /* Helper method which gets put on the plugin and allows it to
+ * add more user-facing config settings to converse.js.
+ */
+ _.extend(converse.default_settings, settings);
+ _.extend(converse, settings);
+ _.extend(converse, _.pick(converse.user_settings, Object.keys(settings)));
+ };
+ converse.pluggable.initializePlugins({
+ 'updateSettings': updateSettings,
+ 'converse': converse
+ });
+ converse.emit('pluginsInitialized');
+ converse._initialize();
+ converse.registerGlobalEventHandlers();
+ return init_deferred.promise();
};
return converse;
}));
@@ -30224,8 +30327,9 @@ return Backbone.BrowserStorage;
var Strophe = strophe.Strophe;
return {
'initialize': function (settings, callback) {
- converse.initialize(settings, callback);
+ return converse.initialize(settings, callback);
},
+ 'log': converse.log,
'connection': {
'connected': function () {
return converse.connection && converse.connection.connected || false;
@@ -30333,7 +30437,13 @@ return Backbone.BrowserStorage;
} else if (typeof jids === "string") {
return converse.wrappedChatBox(converse.chatboxes.getChatBox(jids, true));
}
- return _.map(jids, _.partial(_.compose(converse.wrappedChatBox, converse.chatboxes.getChatBox.bind(converse.chatboxes)), _, true));
+ return _.map(jids,
+ _.partial(
+ _.compose(
+ converse.wrappedChatBox.bind(converse), converse.chatboxes.getChatBox.bind(converse.chatboxes)
+ ), _, true
+ )
+ );
}
},
'tokens': {
@@ -30381,7 +30491,8 @@ return Backbone.BrowserStorage;
},
'plugins': {
'add': function (name, plugin) {
- converse.plugins[name] = plugin;
+ plugin.__name__ = name;
+ converse.pluggable.plugins[name] = plugin;
},
'remove': function (name) {
delete converse.plugins[name];
@@ -31568,7 +31679,7 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
};
- converse_api.plugins.add('chatview', {
+ converse_api.plugins.add('converse-chatview', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -31612,7 +31723,8 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
'click .toggle-smiley': 'toggleEmoticonMenu',
'click .toggle-smiley ul li': 'insertEmoticon',
'click .toggle-clear': 'clearMessages',
- 'click .toggle-call': 'toggleCall'
+ 'click .toggle-call': 'toggleCall',
+ 'click .new-msgs-indicator': 'viewUnreadMessages'
},
initialize: function () {
@@ -31627,6 +31739,12 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
this.model.on('showHelpMessages', this.showHelpMessages, this);
this.model.on('sendMessage', this.sendMessage, this);
this.render().fetchMessages().insertIntoPage().hide();
+ // XXX: adding the event below to the events map above doesn't work.
+ // The code that gets executed because of that looks like this:
+ // this.$el.on('scroll', '.chat-content', this.markScrolled.bind(this));
+ // Which for some reason doesn't work.
+ // So working around that fact here:
+ this.$el.find('.chat-content').on('scroll', this.markScrolled.bind(this));
converse.emit('chatBoxInitialized', this);
},
@@ -31637,6 +31755,7 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
show_toolbar: converse.show_toolbar,
show_textarea: true,
title: this.model.get('fullname'),
+ unread_msgs: __('You have unread messages'),
info_close: __('Close this chat box'),
label_personal_message: __('Personal message')
}
@@ -31679,11 +31798,8 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
if (!keep_old) {
this.clearStatusNotification();
}
- var was_at_bottom = this.$content.scrollTop() + this.$content.innerHeight() >= this.$content[0].scrollHeight;
this.$content.append($('').text(message));
- if (was_at_bottom) {
- this.scrollDown();
- }
+ this.scrollDown();
},
addSpinner: function () {
@@ -31698,30 +31814,37 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
}
},
- prependDayIndicator: function (date) {
- /* Prepends an indicator into the chat area, showing the day as
- * given by the passed in date.
+ insertDayIndicator: function (date, prepend) {
+ /* Appends (or prepends if "prepend" is truthy) an indicator
+ * into the chat area, showing the day as given by the
+ * passed in date.
*
* Parameters:
* (String) date - An ISO8601 date string.
*/
var day_date = moment(date).startOf('day');
- this.$content.prepend(converse.templates.new_day({
+ var insert = prepend ? this.$content.prepend: this.$content.append;
+ insert.call(this.$content, converse.templates.new_day({
isodate: day_date.format(),
datestring: day_date.format("dddd MMM Do YYYY")
}));
},
- appendMessage: function (attrs) {
- /* Helper method which appends a message to the end of the chat
- * box's content area.
+ insertMessage: function (attrs, prepend) {
+ /* Helper method which appends a message (or prepends if the
+ * 2nd parameter is set to true) to the end of the chat box's
+ * content area.
*
* Parameters:
* (Object) attrs: An object containing the message attributes.
*/
+ var insert = prepend ? this.$content.prepend : this.$content.append;
_.compose(
- _.debounce(this.scrollDown.bind(this), 50),
- this.$content.append.bind(this.$content)
+ this.scrollDownMessageHeight.bind(this),
+ function ($el) {
+ insert.call(this.$content, $el);
+ return $el;
+ }.bind(this)
)(this.renderMessage(attrs));
},
@@ -31736,79 +31859,54 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
* Parameters:
* (Object) attrs: An object containing the message attributes.
*/
- var $first_msg = this.$content.children('.chat-message:first'),
+ var msg_dates, idx,
+ $first_msg = this.$content.children('.chat-message:first'),
first_msg_date = $first_msg.data('isodate'),
- last_msg_date, current_msg_date, day_date, $msgs, msg_dates, idx;
+ current_msg_date = moment(attrs.time) || moment,
+ last_msg_date = this.$content.children('.chat-message:last').data('isodate');
+
if (!first_msg_date) {
- this.appendMessage(attrs);
+ // This is the first received message, so we insert a
+ // date indicator before it.
+ this.insertDayIndicator(current_msg_date);
+ this.insertMessage(attrs);
return;
}
- current_msg_date = moment(attrs.time) || moment;
- last_msg_date = this.$content.children('.chat-message:last').data('isodate');
-
- if (typeof last_msg_date !== "undefined" && (current_msg_date.isAfter(last_msg_date) || current_msg_date.isSame(last_msg_date))) {
+ if (current_msg_date.isAfter(last_msg_date) || current_msg_date.isSame(last_msg_date)) {
// The new message is after the last message
if (current_msg_date.isAfter(last_msg_date, 'day')) {
// Append a new day indicator
- day_date = moment(current_msg_date).startOf('day');
- this.$content.append(converse.templates.new_day({
- isodate: current_msg_date.format(),
- datestring: current_msg_date.format("dddd MMM Do YYYY")
- }));
+ this.insertDayIndicator(current_msg_date);
}
- this.appendMessage(attrs);
+ this.insertMessage(attrs);
return;
}
-
- if (typeof first_msg_date !== "undefined" &&
- (current_msg_date.isBefore(first_msg_date) ||
- (current_msg_date.isSame(first_msg_date) && !current_msg_date.isSame(last_msg_date)))) {
- // The new message is before the first message
-
- if ($first_msg.prev().length === 0) {
- // There's no day indicator before the first message, so we prepend one.
- this.prependDayIndicator(first_msg_date);
- }
+ if (current_msg_date.isBefore(first_msg_date) || current_msg_date.isSame(first_msg_date)) {
+ // The message is before the first, but on the same day.
+ // We need to prepend the message immediately before the
+ // first message (so that it'll still be after the day indicator).
+ this.insertMessage(attrs, 'prepend');
if (current_msg_date.isBefore(first_msg_date, 'day')) {
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- this.$content.prepend($el);
- return $el;
- }.bind(this)
- )(this.renderMessage(attrs));
- // This message is on a different day, so we add a day indicator.
- this.prependDayIndicator(current_msg_date);
- } else {
- // The message is before the first, but on the same day.
- // We need to prepend the message immediately before the
- // first message (so that it'll still be after the day indicator).
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- $el.insertBefore($first_msg);
- return $el;
- }
- )(this.renderMessage(attrs));
+ // This message is also on a different day, so we prepend a day indicator.
+ this.insertDayIndicator(current_msg_date, 'prepend');
}
- } else {
- // We need to find the correct place to position the message
- current_msg_date = current_msg_date.format();
- $msgs = this.$content.children('.chat-message');
- msg_dates = _.map($msgs, function (el) {
- return $(el).data('isodate');
- });
- msg_dates.push(current_msg_date);
- msg_dates.sort();
- idx = msg_dates.indexOf(current_msg_date)-1;
- _.compose(
- this.scrollDownMessageHeight.bind(this),
- function ($el) {
- $el.insertAfter(this.$content.find('.chat-message[data-isodate="'+msg_dates[idx]+'"]'));
- return $el;
- }.bind(this)
- )(this.renderMessage(attrs));
+ return;
}
+ // Find the correct place to position the message
+ current_msg_date = current_msg_date.format();
+ msg_dates = _.map(this.$content.children('.chat-message'), function (el) {
+ return $(el).data('isodate');
+ });
+ msg_dates.push(current_msg_date);
+ msg_dates.sort();
+ idx = msg_dates.indexOf(current_msg_date)-1;
+ _.compose(
+ this.scrollDownMessageHeight.bind(this),
+ function ($el) {
+ $el.insertAfter(this.$content.find('.chat-message[data-isodate="'+msg_dates[idx]+'"]'));
+ return $el;
+ }.bind(this)
+ )(this.renderMessage(attrs));
},
renderMessage: function (attrs) {
@@ -31886,13 +31984,40 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
return !this.$el.is(':visible');
},
+ updateNewMessageIndicators: function (message) {
+ /* We have two indicators of new messages. The unread messages
+ * counter, which shows the number of unread messages in
+ * the document.title, and the "new messages" indicator in
+ * a chat area, if it's scrolled up so that new messages
+ * aren't visible.
+ *
+ * In both cases we ignore MAM messages.
+ */
+ if (!message.get('archive_id')) {
+ if (this.model.get('scrolled', true)) {
+ this.$el.find('.new-msgs-indicator').removeClass('hidden');
+ }
+ if (converse.windowState === 'hidden' || this.model.get('scrolled', true)) {
+ converse.incrementMsgCounter();
+ }
+ }
+ },
+
handleTextMessage: function (message) {
this.showMessage(_.clone(message.attributes));
- if ((message.get('sender') !== 'me') && (converse.windowState === 'blur')) {
- converse.incrementMsgCounter();
+ if (message.get('sender') !== 'me') {
+ this.updateNewMessageIndicators(message);
+ } else {
+ // We remove the "scrolled" flag so that the chat area
+ // gets scrolled down. We always want to scroll down
+ // when the user writes a message as opposed to when a
+ // message is received.
+ this.model.set('scrolled', false);
}
if (this.shouldShowOnTextMessage()) {
this.show();
+ } else {
+ this.scrollDown();
}
},
@@ -31991,7 +32116,9 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
*/
converse.connection.send(
$msg({'to':this.model.get('jid'), 'type': 'chat'})
- .c(this.model.get('chat_state'), {'xmlns': Strophe.NS.CHATSTATES})
+ .c(this.model.get('chat_state'), {'xmlns': Strophe.NS.CHATSTATES}).up()
+ .c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
+ .c('no-permanent-store', {'xmlns': Strophe.NS.HINTS})
);
},
@@ -32187,10 +32314,8 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
},
hide: function () {
- if (this.$el.is(':visible') && this.$el.css('opacity') === "1") {
- this.$el.hide();
- utils.refreshWebkit();
- }
+ this.$el.hide();
+ utils.refreshWebkit();
return this;
},
@@ -32228,16 +32353,42 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
return this;
},
+ markScrolled: _.debounce(function (ev) {
+ /* Called when the chat content is scrolled up or down.
+ * We want to record when the user has scrolled away from
+ * the bottom, so that we don't automatically scroll away
+ * from what the user is reading when new messages are
+ * received.
+ */
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var is_at_bottom = this.$content.scrollTop() + this.$content.innerHeight() >= this.$content[0].scrollHeight-10;
+ if (is_at_bottom) {
+ this.model.set('scrolled', false);
+ this.$el.find('.new-msgs-indicator').addClass('hidden');
+ } else {
+ // We're not at the bottom of the chat area, so we mark
+ // that the box is in a scrolled-up state.
+ this.model.set('scrolled', true);
+ }
+ }, 150),
+
+
+ viewUnreadMessages: function () {
+ this.model.set('scrolled', false);
+ this.scrollDown();
+ },
+
scrollDownMessageHeight: function ($message) {
- if (this.$content.is(':visible')) {
+ if (this.$content.is(':visible') && !this.model.get('scrolled')) {
this.$content.scrollTop(this.$content.scrollTop() + $message[0].scrollHeight);
}
return this;
},
scrollDown: function () {
- if (this.$content.is(':visible')) {
+ if (this.$content.is(':visible') && !this.model.get('scrolled')) {
this.$content.scrollTop(this.$content[0].scrollHeight);
+ this.$el.find('.new-msgs-indicator').addClass('hidden');
}
return this;
}
@@ -32246,6 +32397,1657 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
});
}));
+// Converse.js (A browser based XMPP chat client)
+// http://conversejs.org
+//
+// Copyright (c) 2012-2016, Jan-Carel Brand
+// Licensed under the Mozilla Public License (MPLv2)
+//
+/*global Backbone, define */
+
+(function (root, factory) {
+ define("converse-rosterview", ["converse-core", "converse-api"], factory);
+}(this, function (converse, converse_api) {
+ "use strict";
+ var $ = converse_api.env.jQuery,
+ utils = converse_api.env.utils,
+ Strophe = converse_api.env.Strophe,
+ $iq = converse_api.env.$iq,
+ b64_sha1 = converse_api.env.b64_sha1,
+ _ = converse_api.env._,
+ __ = utils.__.bind(converse);
+
+
+ converse_api.plugins.add('rosterview', {
+
+ overrides: {
+ // Overrides mentioned here will be picked up by converse.js's
+ // plugin architecture they will replace existing methods on the
+ // relevant objects or classes.
+ //
+ // New functions which don't exist yet can also be added.
+
+ afterReconnected: function () {
+ this.rosterview.registerRosterXHandler();
+ this.rosterview.registerPresenceHandler();
+ this._super.afterReconnected.apply(this, arguments);
+ }
+ },
+
+
+ initialize: function () {
+ /* The initialize function gets called as soon as the plugin is
+ * loaded by converse.js's plugin machinery.
+ */
+ this.updateSettings({
+ allow_chat_pending_contacts: false,
+ allow_contact_removal: true,
+ show_toolbar: true,
+ });
+
+ var STATUSES = {
+ 'dnd': __('This contact is busy'),
+ 'online': __('This contact is online'),
+ 'offline': __('This contact is offline'),
+ 'unavailable': __('This contact is unavailable'),
+ 'xa': __('This contact is away for an extended period'),
+ 'away': __('This contact is away')
+ };
+ var DESC_GROUP_TOGGLE = __('Click to hide these contacts');
+ var LABEL_CONTACTS = __('Contacts');
+ var LABEL_GROUPS = __('Groups');
+ var HEADER_CURRENT_CONTACTS = __('My contacts');
+ var HEADER_PENDING_CONTACTS = __('Pending contacts');
+ var HEADER_REQUESTING_CONTACTS = __('Contact requests');
+ var HEADER_UNGROUPED = __('Ungrouped');
+ var HEADER_WEIGHTS = {};
+ HEADER_WEIGHTS[HEADER_CURRENT_CONTACTS] = 0;
+ HEADER_WEIGHTS[HEADER_UNGROUPED] = 1;
+ HEADER_WEIGHTS[HEADER_REQUESTING_CONTACTS] = 2;
+ HEADER_WEIGHTS[HEADER_PENDING_CONTACTS] = 3;
+
+ converse.RosterFilter = Backbone.Model.extend({
+ initialize: function () {
+ this.set({
+ 'filter_text': '',
+ 'filter_type': 'contacts',
+ 'chat_state': ''
+ });
+ },
+ });
+
+ converse.RosterFilterView = Backbone.View.extend({
+ tagName: 'span',
+ events: {
+ "keydown .roster-filter": "liveFilter",
+ "click .onX": "clearFilter",
+ "mousemove .x": "toggleX",
+ "change .filter-type": "changeTypeFilter",
+ "change .state-type": "changeChatStateFilter"
+ },
+
+ initialize: function () {
+ this.model.on('change', this.render, this);
+ },
+
+ render: function () {
+ this.$el.html(converse.templates.roster(
+ _.extend(this.model.toJSON(), {
+ placeholder: __('Filter'),
+ label_contacts: LABEL_CONTACTS,
+ label_groups: LABEL_GROUPS,
+ label_state: __('State'),
+ label_any: __('Any'),
+ label_online: __('Online'),
+ label_chatty: __('Chatty'),
+ label_busy: __('Busy'),
+ label_away: __('Away'),
+ label_xa: __('Extended Away'),
+ label_offline: __('Offline')
+ })
+ ));
+ var $roster_filter = this.$('.roster-filter');
+ $roster_filter[this.tog($roster_filter.val())]('x');
+ return this.$el;
+ },
+
+ tog: function (v) {
+ return v?'addClass':'removeClass';
+ },
+
+ toggleX: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var el = ev.target;
+ $(el)[this.tog(el.offsetWidth-18 < ev.clientX-el.getBoundingClientRect().left)]('onX');
+ },
+
+ changeChatStateFilter: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ this.model.save({
+ 'chat_state': this.$('.state-type').val()
+ });
+ },
+
+ changeTypeFilter: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var type = ev.target.value;
+ if (type === 'state') {
+ this.model.save({
+ 'filter_type': type,
+ 'chat_state': this.$('.state-type').val()
+ });
+ } else {
+ this.model.save({
+ 'filter_type': type,
+ 'filter_text': this.$('.roster-filter').val(),
+ });
+ }
+ },
+
+ liveFilter: _.debounce(function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ this.model.save({
+ 'filter_type': this.$('.filter-type').val(),
+ 'filter_text': this.$('.roster-filter').val()
+ });
+ }, 250),
+
+ isActive: function () {
+ /* Returns true if the filter is enabled (i.e. if the user
+ * has added values to the filter).
+ */
+ if (this.model.get('filter_type') === 'state' ||
+ this.model.get('filter_text')) {
+ return true;
+ }
+ return false;
+ },
+
+ show: function () {
+ if (this.$el.is(':visible')) { return this; }
+ this.$el.show();
+ return this;
+ },
+
+ hide: function () {
+ if (!this.$el.is(':visible')) { return this; }
+ if (this.$('.roster-filter').val().length > 0) {
+ // Don't hide if user is currently filtering.
+ return;
+ }
+ this.model.save({
+ 'filter_text': '',
+ 'chat_state': ''
+ });
+ this.$el.hide();
+ return this;
+ },
+
+ clearFilter: function (ev) {
+ if (ev && ev.preventDefault) {
+ ev.preventDefault();
+ $(ev.target).removeClass('x onX').val('');
+ }
+ this.model.save({
+ 'filter_text': ''
+ });
+ }
+ });
+
+ converse.RosterView = Backbone.Overview.extend({
+ tagName: 'div',
+ id: 'converse-roster',
+
+ initialize: function () {
+ this.roster_handler_ref = this.registerRosterHandler();
+ this.rosterx_handler_ref = this.registerRosterXHandler();
+ this.presence_ref = this.registerPresenceHandler();
+ converse.roster.on("add", this.onContactAdd, this);
+ converse.roster.on('change', this.onContactChange, this);
+ converse.roster.on("destroy", this.update, this);
+ converse.roster.on("remove", this.update, this);
+ this.model.on("add", this.onGroupAdd, this);
+ this.model.on("reset", this.reset, this);
+ this.$roster = $('
');
+ // Create a model on which we can store filter properties
+ var model = new converse.RosterFilter();
+ model.id = b64_sha1('converse.rosterfilter'+converse.bare_jid);
+ model.browserStorage = new Backbone.BrowserStorage.local(this.filter.id);
+ this.filter_view = new converse.RosterFilterView({'model': model});
+ this.filter_view.model.on('change', this.updateFilter, this);
+ this.filter_view.model.fetch();
+ },
+
+ render: function () {
+ this.$el.html(this.filter_view.render());
+ if (!converse.allow_contact_requests) {
+ // XXX: if we ever support live editing of config then
+ // we'll need to be able to remove this class on the fly.
+ this.$el.addClass('no-contact-requests');
+ }
+ return this;
+ },
+
+ updateFilter: _.debounce(function () {
+ /* Filter the roster again.
+ * Called whenever the filter settings have been changed or
+ * when contacts have been added, removed or changed.
+ *
+ * Debounced so that it doesn't get called for every
+ * contact fetched from browser storage.
+ */
+ var type = this.filter_view.model.get('filter_type');
+ if (type === 'state') {
+ this.filter(this.filter_view.model.get('chat_state'), type);
+ } else {
+ this.filter(this.filter_view.model.get('filter_text'), type);
+ }
+ }, 100),
+
+ unregisterHandlers: function () {
+ converse.connection.deleteHandler(this.roster_handler_ref);
+ delete this.roster_handler_ref;
+ converse.connection.deleteHandler(this.rosterx_handler_ref);
+ delete this.rosterx_handler_ref;
+ converse.connection.deleteHandler(this.presence_ref);
+ delete this.presence_ref;
+ },
+
+ update: _.debounce(function () {
+ if (this.$roster.parent().length === 0) {
+ this.$el.append(this.$roster.show());
+ }
+ return this.showHideFilter();
+ }, converse.animate ? 100 : 0),
+
+ showHideFilter: function () {
+ if (!this.$el.is(':visible')) {
+ return;
+ }
+ if (this.$roster.hasScrollBar()) {
+ this.filter_view.show();
+ } else if (!this.filter_view.isActive()) {
+ this.filter_view.hide();
+ }
+ return this;
+ },
+
+ fetch: function () {
+ this.model.fetch({
+ silent: true, // We use the success handler to handle groups that were added,
+ // we need to first have all groups before positionFetchedGroups
+ // will work properly.
+ success: function (collection, resp, options) {
+ if (collection.length !== 0) {
+ this.positionFetchedGroups(collection, resp, options);
+ }
+ converse.roster.fetch({
+ add: true,
+ success: function (collection) {
+ if (collection.length === 0) {
+ /* We don't have any roster contacts stored in sessionStorage,
+ * so lets fetch the roster from the XMPP server. We pass in
+ * 'sendPresence' as callback method, because after initially
+ * fetching the roster we are ready to receive presence
+ * updates from our contacts.
+ */
+ converse.roster.fetchFromServer(
+ converse.xmppstatus.sendPresence.bind(converse.xmppstatus));
+ } else {
+ converse.emit('cachedRoster', collection);
+ if (converse.send_initial_presence) {
+ /* We're not going to fetch the roster again because we have
+ * it already cached in sessionStorage, but we still need to
+ * send out a presence stanza because this is a new session.
+ * See: https://github.com/jcbrand/converse.js/issues/536
+ */
+ converse.xmppstatus.sendPresence();
+ }
+ }
+ }
+ });
+ }.bind(this)
+ });
+ return this;
+ },
+
+ filter: function (query, type) {
+ // First we make sure the filter is restored to its
+ // original state
+ _.each(this.getAll(), function (view) {
+ if (view.model.contacts.length > 0) {
+ view.show().filter('');
+ }
+ });
+ // Now we can filter
+ query = query.toLowerCase();
+ if (type === 'groups') {
+ _.each(this.getAll(), function (view, idx) {
+ if (view.model.get('name').toLowerCase().indexOf(query.toLowerCase()) === -1) {
+ view.hide();
+ } else if (view.model.contacts.length > 0) {
+ view.show();
+ }
+ });
+ } else {
+ _.each(this.getAll(), function (view) {
+ view.filter(query, type);
+ });
+ }
+ },
+
+ reset: function () {
+ converse.roster.reset();
+ this.removeAll();
+ this.$roster = $('
');
+ this.render().update();
+ return this;
+ },
+
+ registerRosterHandler: function () {
+ converse.connection.addHandler(
+ converse.roster.onRosterPush.bind(converse.roster),
+ Strophe.NS.ROSTER, 'iq', "set"
+ );
+ },
+
+ registerRosterXHandler: function () {
+ var t = 0;
+ converse.connection.addHandler(
+ function (msg) {
+ window.setTimeout(
+ function () {
+ converse.connection.flush();
+ converse.roster.subscribeToSuggestedItems.bind(converse.roster)(msg);
+ },
+ t
+ );
+ t += $(msg).find('item').length*250;
+ return true;
+ },
+ Strophe.NS.ROSTERX, 'message', null
+ );
+ },
+
+ registerPresenceHandler: function () {
+ converse.connection.addHandler(
+ function (presence) {
+ converse.roster.presenceHandler(presence);
+ return true;
+ }.bind(this), null, 'presence', null);
+ },
+
+ onGroupAdd: function (group) {
+ var view = new converse.RosterGroupView({model: group});
+ this.add(group.get('name'), view.render());
+ this.positionGroup(view);
+ },
+
+ onContactAdd: function (contact) {
+ this.addRosterContact(contact).update();
+ this.updateFilter();
+ },
+
+ onContactChange: function (contact) {
+ this.updateChatBox(contact).update();
+ if (_.has(contact.changed, 'subscription')) {
+ if (contact.changed.subscription === 'from') {
+ this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
+ } else if (_.contains(['both', 'to'], contact.get('subscription'))) {
+ this.addExistingContact(contact);
+ }
+ }
+ if (_.has(contact.changed, 'ask') && contact.changed.ask === 'subscribe') {
+ this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
+ }
+ if (_.has(contact.changed, 'subscription') && contact.changed.requesting === 'true') {
+ this.addContactToGroup(contact, HEADER_REQUESTING_CONTACTS);
+ }
+ this.updateFilter();
+ },
+
+ updateChatBox: function (contact) {
+ var chatbox = converse.chatboxes.get(contact.get('jid')),
+ changes = {};
+ if (!chatbox) {
+ return this;
+ }
+ if (_.has(contact.changed, 'chat_status')) {
+ changes.chat_status = contact.get('chat_status');
+ }
+ if (_.has(contact.changed, 'status')) {
+ changes.status = contact.get('status');
+ }
+ chatbox.save(changes);
+ return this;
+ },
+
+ positionFetchedGroups: function (model, resp, options) {
+ /* Instead of throwing an add event for each group
+ * fetched, we wait until they're all fetched and then
+ * we position them.
+ * Works around the problem of positionGroup not
+ * working when all groups besides the one being
+ * positioned aren't already in inserted into the
+ * roster DOM element.
+ */
+ model.sort();
+ model.each(function (group, idx) {
+ var view = this.get(group.get('name'));
+ if (!view) {
+ view = new converse.RosterGroupView({model: group});
+ this.add(group.get('name'), view.render());
+ }
+ if (idx === 0) {
+ this.$roster.append(view.$el);
+ } else {
+ this.appendGroup(view);
+ }
+ }.bind(this));
+ },
+
+ positionGroup: function (view) {
+ /* Place the group's DOM element in the correct alphabetical
+ * position amongst the other groups in the roster.
+ */
+ var $groups = this.$roster.find('.roster-group'),
+ index = $groups.length ? this.model.indexOf(view.model) : 0;
+ if (index === 0) {
+ this.$roster.prepend(view.$el);
+ } else if (index === (this.model.length-1)) {
+ this.appendGroup(view);
+ } else {
+ $($groups.eq(index)).before(view.$el);
+ }
+ return this;
+ },
+
+ appendGroup: function (view) {
+ /* Add the group at the bottom of the roster
+ */
+ var $last = this.$roster.find('.roster-group').last();
+ var $siblings = $last.siblings('dd');
+ if ($siblings.length > 0) {
+ $siblings.last().after(view.$el);
+ } else {
+ $last.after(view.$el);
+ }
+ return this;
+ },
+
+ getGroup: function (name) {
+ /* Returns the group as specified by name.
+ * Creates the group if it doesn't exist.
+ */
+ var view = this.get(name);
+ if (view) {
+ return view.model;
+ }
+ return this.model.create({name: name, id: b64_sha1(name)});
+ },
+
+ addContactToGroup: function (contact, name) {
+ this.getGroup(name).contacts.add(contact);
+ },
+
+ addExistingContact: function (contact) {
+ var groups;
+ if (converse.roster_groups) {
+ groups = contact.get('groups');
+ if (groups.length === 0) {
+ groups = [HEADER_UNGROUPED];
+ }
+ } else {
+ groups = [HEADER_CURRENT_CONTACTS];
+ }
+ _.each(groups, _.bind(this.addContactToGroup, this, contact));
+ },
+
+ addRosterContact: function (contact) {
+ if (contact.get('subscription') === 'both' || contact.get('subscription') === 'to') {
+ this.addExistingContact(contact);
+ } else {
+ if ((contact.get('ask') === 'subscribe') || (contact.get('subscription') === 'from')) {
+ this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
+ } else if (contact.get('requesting') === true) {
+ this.addContactToGroup(contact, HEADER_REQUESTING_CONTACTS);
+ }
+ }
+ return this;
+ }
+ });
+
+
+ converse.RosterContactView = Backbone.View.extend({
+ tagName: 'dd',
+
+ events: {
+ "click .accept-xmpp-request": "acceptRequest",
+ "click .decline-xmpp-request": "declineRequest",
+ "click .open-chat": "openChat",
+ "click .remove-xmpp-contact": "removeContact"
+ },
+
+ initialize: function () {
+ this.model.on("change", this.render, this);
+ this.model.on("remove", this.remove, this);
+ this.model.on("destroy", this.remove, this);
+ this.model.on("open", this.openChat, this);
+ },
+
+ render: function () {
+ if (!this.mayBeShown()) {
+ this.$el.hide();
+ return this;
+ }
+ var item = this.model,
+ ask = item.get('ask'),
+ chat_status = item.get('chat_status'),
+ requesting = item.get('requesting'),
+ subscription = item.get('subscription');
+
+ var classes_to_remove = [
+ 'current-xmpp-contact',
+ 'pending-xmpp-contact',
+ 'requesting-xmpp-contact'
+ ].concat(_.keys(STATUSES));
+
+ _.each(classes_to_remove,
+ function (cls) {
+ if (this.el.className.indexOf(cls) !== -1) {
+ this.$el.removeClass(cls);
+ }
+ }, this);
+ this.$el.addClass(chat_status).data('status', chat_status);
+
+ if ((ask === 'subscribe') || (subscription === 'from')) {
+ /* ask === 'subscribe'
+ * Means we have asked to subscribe to them.
+ *
+ * subscription === 'from'
+ * They are subscribed to use, but not vice versa.
+ * We assume that there is a pending subscription
+ * from us to them (otherwise we're in a state not
+ * supported by converse.js).
+ *
+ * So in both cases the user is a "pending" contact.
+ */
+ this.$el.addClass('pending-xmpp-contact');
+ this.$el.html(converse.templates.pending_contact(
+ _.extend(item.toJSON(), {
+ 'desc_remove': __('Click to remove this contact'),
+ 'allow_chat_pending_contacts': converse.allow_chat_pending_contacts
+ })
+ ));
+ } else if (requesting === true) {
+ this.$el.addClass('requesting-xmpp-contact');
+ this.$el.html(converse.templates.requesting_contact(
+ _.extend(item.toJSON(), {
+ 'desc_accept': __("Click to accept this contact request"),
+ 'desc_decline': __("Click to decline this contact request"),
+ 'allow_chat_pending_contacts': converse.allow_chat_pending_contacts
+ })
+ ));
+ converse.controlboxtoggle.showControlBox();
+ } else if (subscription === 'both' || subscription === 'to') {
+ this.$el.addClass('current-xmpp-contact');
+ this.$el.removeClass(_.without(['both', 'to'], subscription)[0]).addClass(subscription);
+ this.$el.html(converse.templates.roster_item(
+ _.extend(item.toJSON(), {
+ 'desc_status': STATUSES[chat_status||'offline'],
+ 'desc_chat': __('Click to chat with this contact'),
+ 'desc_remove': __('Click to remove this contact'),
+ 'title_fullname': __('Name'),
+ 'allow_contact_removal': converse.allow_contact_removal
+ })
+ ));
+ }
+ return this;
+ },
+
+ isGroupCollapsed: function () {
+ /* Check whether the group in which this contact appears is
+ * collapsed.
+ */
+ // XXX: this sucks and is fragile.
+ // It's because I tried to do the "right thing"
+ // and use definition lists to represent roster groups.
+ // If roster group items were inside the group elements, we
+ // would simplify things by not having to check whether the
+ // group is collapsed or not.
+ var name = this.$el.prevAll('dt:first').data('group');
+ var group = converse.rosterview.model.where({'name': name})[0];
+ if (group.get('state') === converse.CLOSED) {
+ return true;
+ }
+ return false;
+ },
+
+ mayBeShown: function () {
+ /* Return a boolean indicating whether this contact should
+ * generally be visible in the roster.
+ *
+ * It doesn't check for the more specific case of whether
+ * the group it's in is collapsed (see isGroupCollapsed).
+ */
+ var chatStatus = this.model.get('chat_status');
+ if ((converse.show_only_online_users && chatStatus !== 'online') ||
+ (converse.hide_offline_users && chatStatus === 'offline')) {
+ // If pending or requesting, show
+ if ((this.model.get('ask') === 'subscribe') ||
+ (this.model.get('subscription') === 'from') ||
+ (this.model.get('requesting') === true)) {
+ return true;
+ }
+ return false;
+ }
+ return true;
+ },
+
+ openChat: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ return converse.chatboxviews.showChat(this.model.attributes);
+ },
+
+ removeContact: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ if (!converse.allow_contact_removal) { return; }
+ var result = confirm(__("Are you sure you want to remove this contact?"));
+ if (result === true) {
+ var iq = $iq({type: 'set'})
+ .c('query', {xmlns: Strophe.NS.ROSTER})
+ .c('item', {jid: this.model.get('jid'), subscription: "remove"});
+ converse.connection.sendIQ(iq,
+ function (iq) {
+ this.model.destroy();
+ this.remove();
+ }.bind(this),
+ function (err) {
+ alert(__("Sorry, there was an error while trying to remove "+name+" as a contact."));
+ converse.log(err);
+ }
+ );
+ }
+ },
+
+ acceptRequest: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ converse.roster.sendContactAddIQ(
+ this.model.get('jid'),
+ this.model.get('fullname'),
+ [],
+ function () { this.model.authorize().subscribe(); }.bind(this)
+ );
+ },
+
+ declineRequest: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var result = confirm(__("Are you sure you want to decline this contact request?"));
+ if (result === true) {
+ this.model.unauthorize().destroy();
+ }
+ return this;
+ }
+ });
+
+
+ converse.RosterGroup = Backbone.Model.extend({
+ initialize: function (attributes, options) {
+ this.set(_.extend({
+ description: DESC_GROUP_TOGGLE,
+ state: converse.OPENED
+ }, attributes));
+ // Collection of contacts belonging to this group.
+ this.contacts = new converse.RosterContacts();
+ }
+ });
+
+
+ converse.RosterGroupView = Backbone.Overview.extend({
+ tagName: 'dt',
+ className: 'roster-group',
+ events: {
+ "click a.group-toggle": "toggle"
+ },
+
+ initialize: function () {
+ this.model.contacts.on("add", this.addContact, this);
+ this.model.contacts.on("change:subscription", this.onContactSubscriptionChange, this);
+ this.model.contacts.on("change:requesting", this.onContactRequestChange, this);
+ this.model.contacts.on("change:chat_status", function (contact) {
+ // This might be optimized by instead of first sorting,
+ // finding the correct position in positionContact
+ this.model.contacts.sort();
+ this.positionContact(contact).render();
+ }, this);
+ this.model.contacts.on("destroy", this.onRemove, this);
+ this.model.contacts.on("remove", this.onRemove, this);
+ converse.roster.on('change:groups', this.onContactGroupChange, this);
+ },
+
+ render: function () {
+ this.$el.attr('data-group', this.model.get('name'));
+ this.$el.html(
+ $(converse.templates.group_header({
+ label_group: this.model.get('name'),
+ desc_group_toggle: this.model.get('description'),
+ toggle_state: this.model.get('state')
+ }))
+ );
+ return this;
+ },
+
+ addContact: function (contact) {
+ var view = new converse.RosterContactView({model: contact});
+ this.add(contact.get('id'), view);
+ view = this.positionContact(contact).render();
+ if (view.mayBeShown()) {
+ if (this.model.get('state') === converse.CLOSED) {
+ if (view.$el[0].style.display !== "none") { view.$el.hide(); }
+ if (!this.$el.is(':visible')) { this.$el.show(); }
+ } else {
+ if (this.$el[0].style.display !== "block") { this.show(); }
+ }
+ }
+ },
+
+ positionContact: function (contact) {
+ /* Place the contact's DOM element in the correct alphabetical
+ * position amongst the other contacts in this group.
+ */
+ var view = this.get(contact.get('id'));
+ var index = this.model.contacts.indexOf(contact);
+ view.$el.detach();
+ if (index === 0) {
+ this.$el.after(view.$el);
+ } else if (index === (this.model.contacts.length-1)) {
+ this.$el.nextUntil('dt').last().after(view.$el);
+ } else {
+ this.$el.nextUntil('dt').eq(index).before(view.$el);
+ }
+ return view;
+ },
+
+ show: function () {
+ this.$el.show();
+ _.each(this.getAll(), function (view) {
+ if (view.mayBeShown() && !view.isGroupCollapsed()) {
+ view.$el.show();
+ }
+ });
+ return this;
+ },
+
+ hide: function () {
+ this.$el.nextUntil('dt').addBack().hide();
+ },
+
+ filter: function (q, type) {
+ /* Filter the group's contacts based on the query "q".
+ * The query is matched against the contact's full name.
+ * If all contacts are filtered out (i.e. hidden), then the
+ * group must be filtered out as well.
+ */
+ var matches;
+ if (q.length === 0) {
+ if (this.model.get('state') === converse.OPENED) {
+ this.model.contacts.each(function (item) {
+ var view = this.get(item.get('id'));
+ if (view.mayBeShown() && !view.isGroupCollapsed()) {
+ view.$el.show();
+ }
+ }.bind(this));
+ }
+ this.showIfNecessary();
+ } else {
+ q = q.toLowerCase();
+ if (type === 'state') {
+ matches = this.model.contacts.filter(
+ utils.contains.not('chat_status', q)
+ );
+ } else {
+ matches = this.model.contacts.filter(
+ utils.contains.not('fullname', q)
+ );
+ }
+ if (matches.length === this.model.contacts.length) {
+ // hide the whole group
+ this.hide();
+ } else {
+ _.each(matches, function (item) {
+ this.get(item.get('id')).$el.hide();
+ }.bind(this));
+ _.each(this.model.contacts.reject(utils.contains.not('fullname', q)), function (item) {
+ this.get(item.get('id')).$el.show();
+ }.bind(this));
+ this.showIfNecessary();
+ }
+ }
+ },
+
+ showIfNecessary: function () {
+ if (!this.$el.is(':visible') && this.model.contacts.length > 0) {
+ this.$el.show();
+ }
+ },
+
+ toggle: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var $el = $(ev.target);
+ if ($el.hasClass("icon-opened")) {
+ this.$el.nextUntil('dt').slideUp();
+ this.model.save({state: converse.CLOSED});
+ $el.removeClass("icon-opened").addClass("icon-closed");
+ } else {
+ $el.removeClass("icon-closed").addClass("icon-opened");
+ this.model.save({state: converse.OPENED});
+ this.filter(
+ converse.rosterview.$('.roster-filter').val() || '',
+ converse.rosterview.$('.filter-type').val()
+ );
+ }
+ },
+
+ onContactGroupChange: function (contact) {
+ var in_this_group = _.contains(contact.get('groups'), this.model.get('name'));
+ var cid = contact.get('id');
+ var in_this_overview = !this.get(cid);
+ if (in_this_group && !in_this_overview) {
+ this.model.contacts.remove(cid);
+ } else if (!in_this_group && in_this_overview) {
+ this.addContact(contact);
+ }
+ },
+
+ onContactSubscriptionChange: function (contact) {
+ if ((this.model.get('name') === HEADER_PENDING_CONTACTS) && contact.get('subscription') !== 'from') {
+ this.model.contacts.remove(contact.get('id'));
+ }
+ },
+
+ onContactRequestChange: function (contact) {
+ if ((this.model.get('name') === HEADER_REQUESTING_CONTACTS) && !contact.get('requesting')) {
+ this.model.contacts.remove(contact.get('id'));
+ }
+ },
+
+ onRemove: function (contact) {
+ this.remove(contact.get('id'));
+ if (this.model.contacts.length === 0) {
+ this.$el.hide();
+ }
+ }
+ });
+
+
+ converse.RosterGroups = Backbone.Collection.extend({
+ model: converse.RosterGroup,
+ comparator: function (a, b) {
+ /* Groups are sorted alphabetically, ignoring case.
+ * However, Ungrouped, Requesting Contacts and Pending Contacts
+ * appear last and in that order. */
+ a = a.get('name');
+ b = b.get('name');
+ var special_groups = _.keys(HEADER_WEIGHTS);
+ var a_is_special = _.contains(special_groups, a);
+ var b_is_special = _.contains(special_groups, b);
+ if (!a_is_special && !b_is_special ) {
+ return a.toLowerCase() < b.toLowerCase() ? -1 : (a.toLowerCase() > b.toLowerCase() ? 1 : 0);
+ } else if (a_is_special && b_is_special) {
+ return HEADER_WEIGHTS[a] < HEADER_WEIGHTS[b] ? -1 : (HEADER_WEIGHTS[a] > HEADER_WEIGHTS[b] ? 1 : 0);
+ } else if (!a_is_special && b_is_special) {
+ return (b === HEADER_CURRENT_CONTACTS) ? 1 : -1;
+ } else if (a_is_special && !b_is_special) {
+ return (a === HEADER_CURRENT_CONTACTS) ? -1 : 1;
+ }
+ }
+ });
+ }
+ });
+}));
+
+// Converse.js (A browser based XMPP chat client)
+// http://conversejs.org
+//
+// Copyright (c) 2012-2016, Jan-Carel Brand
+// Licensed under the Mozilla Public License (MPLv2)
+//
+/*global define, Backbone */
+
+(function (root, factory) {
+ define("converse-controlbox", [
+ "converse-core",
+ "converse-api",
+ // TODO: remove the next two dependencies
+ "converse-rosterview",
+ "converse-chatview"
+ ], factory);
+}(this, function (converse, converse_api) {
+ "use strict";
+ // Strophe methods for building stanzas
+ var Strophe = converse_api.env.Strophe,
+ b64_sha1 = converse_api.env.b64_sha1,
+ utils = converse_api.env.utils;
+ // Other necessary globals
+ var $ = converse_api.env.jQuery,
+ _ = converse_api.env._,
+ __ = utils.__.bind(converse),
+ moment = converse_api.env.moment;
+
+
+ converse_api.plugins.add('converse-controlbox', {
+
+ overrides: {
+ // Overrides mentioned here will be picked up by converse.js's
+ // plugin architecture they will replace existing methods on the
+ // relevant objects or classes.
+ //
+ // New functions which don't exist yet can also be added.
+
+ initSession: function () {
+ this.controlboxtoggle = new this.ControlBoxToggle();
+ this._super.initSession.apply(this, arguments);
+ },
+
+ initConnection: function () {
+ this._super.initConnection.apply(this, arguments);
+ if (this.connection) {
+ this.addControlBox();
+ }
+ },
+
+ onDisconnected: function () {
+ var result = this._super.onDisconnected.apply(this, arguments);
+ if (result === 'disconnected') {
+ var view = converse.chatboxviews.get('controlbox');
+ view.model.set({connected:false});
+ view.$('#controlbox-tabs').empty();
+ view.renderLoginPanel();
+ }
+ return result;
+ },
+
+ _tearDown: function () {
+ this._super._tearDown.apply(this, arguments);
+ if (this.rosterview) {
+ this.rosterview.unregisterHandlers();
+ // Removes roster groups
+ this.rosterview.model.off().reset();
+ this.rosterview.undelegateEvents().remove();
+ }
+ },
+
+ clearSession: function () {
+ this._super.clearSession.apply(this, arguments);
+ if (typeof this.connection !== 'undefined' && this.connection.connected) {
+ this.chatboxes.get('controlbox').save({'connected': false});
+ }
+ },
+
+ ChatBoxes: {
+ chatBoxMayBeShown: function (chatbox) {
+ return this._super.chatBoxMayBeShown.apply(this, arguments) &&
+ chatbox.get('id') !== 'controlbox';
+ },
+
+ onChatBoxesFetched: function (collection, resp) {
+ this._super.onChatBoxesFetched.apply(this, arguments);
+ if (!_.include(_.pluck(resp, 'id'), 'controlbox')) {
+ this.add({
+ id: 'controlbox',
+ box_id: 'controlbox'
+ });
+ }
+ this.get('controlbox').save({connected:true});
+ },
+ },
+
+ ChatBoxViews: {
+ onChatBoxAdded: function (item) {
+ if (item.get('box_id') === 'controlbox') {
+ var view = this.get(item.get('id'));
+ if (view) {
+ view.model = item;
+ view.initialize();
+ return view;
+ } else {
+ view = new converse.ControlBoxView({model: item});
+ return this.add(item.get('id'), view);
+ }
+ } else {
+ return this._super.onChatBoxAdded.apply(this, arguments);
+ }
+ },
+
+ closeAllChatBoxes: function () {
+ this.each(function (view) {
+ if (view.model.get('id') !== 'controlbox') {
+ view.close();
+ }
+ });
+ return this;
+ },
+
+ getChatBoxWidth: function (view) {
+ var controlbox = this.get('controlbox');
+ if (view.model.get('id') === 'controlbox') {
+ /* We return the width of the controlbox or its toggle,
+ * depending on which is visible.
+ */
+ if (!controlbox || !controlbox.$el.is(':visible')) {
+ return converse.controlboxtoggle.$el.outerWidth(true);
+ } else {
+ return controlbox.$el.outerWidth(true);
+ }
+ } else {
+ return this._super.getChatBoxWidth.apply(this, arguments);
+ }
+ }
+ },
+
+
+ ChatBox: {
+ initialize: function () {
+ if (this.get('id') === 'controlbox') {
+ this.set({
+ 'time_opened': moment(0).valueOf(),
+ 'num_unread': 0
+ });
+ } else {
+ this._super.initialize.apply(this, arguments);
+ }
+ },
+ },
+
+
+ ChatBoxView: {
+ insertIntoPage: function () {
+ this.$el.insertAfter(converse.chatboxviews.get("controlbox").$el);
+ return this;
+ }
+ }
+ },
+
+ initialize: function () {
+ /* The initialize function gets called as soon as the plugin is
+ * loaded by converse.js's plugin machinery.
+ */
+ var converse = this.converse;
+ this.updateSettings({
+ allow_logout: true,
+ default_domain: undefined,
+ show_controlbox_by_default: false,
+ sticky_controlbox: false,
+ xhr_user_search: false,
+ xhr_user_search_url: ''
+ });
+
+ var LABEL_CONTACTS = __('Contacts');
+
+ converse.addControlBox = function () {
+ return converse.chatboxes.add({
+ id: 'controlbox',
+ box_id: 'controlbox',
+ closed: !converse.show_controlbox_by_default
+ });
+ };
+
+ converse.ControlBoxView = converse.ChatBoxView.extend({
+ tagName: 'div',
+ className: 'chatbox',
+ id: 'controlbox',
+ events: {
+ 'click a.close-chatbox-button': 'close',
+ 'click ul#controlbox-tabs li a': 'switchTab',
+ },
+
+ initialize: function () {
+ this.$el.insertAfter(converse.controlboxtoggle.$el);
+ this.model.on('change:connected', this.onConnected, this);
+ this.model.on('destroy', this.hide, this);
+ this.model.on('hide', this.hide, this);
+ this.model.on('show', this.show, this);
+ this.model.on('change:closed', this.ensureClosedState, this);
+ this.render();
+ if (this.model.get('connected')) {
+ this.initRoster();
+ }
+ if (typeof this.model.get('closed')==='undefined') {
+ this.model.set('closed', !converse.show_controlbox_by_default);
+ }
+ if (!this.model.get('closed')) {
+ this.show();
+ } else {
+ this.hide();
+ }
+ },
+
+ render: function () {
+ this.$el.html(converse.templates.controlbox(
+ _.extend(this.model.toJSON(), {
+ sticky_controlbox: converse.sticky_controlbox
+ }))
+ );
+ if (!converse.connection.connected || !converse.connection.authenticated || converse.connection.disconnecting) {
+ this.renderLoginPanel();
+ } else if (!this.contactspanel || !this.contactspanel.$el.is(':visible')) {
+ this.renderContactsPanel();
+ }
+ return this;
+ },
+
+ giveFeedback: function (message, klass) {
+ var $el = this.$('.conn-feedback');
+ $el.addClass('conn-feedback').text(message);
+ if (klass) {
+ $el.addClass(klass);
+ }
+ },
+
+ onConnected: function () {
+ if (this.model.get('connected')) {
+ this.render().initRoster();
+ }
+ },
+
+ initRoster: function () {
+ /* We initialize the roster, which will appear inside the
+ * Contacts Panel.
+ */
+ var rostergroups = new converse.RosterGroups();
+ rostergroups.browserStorage = new Backbone.BrowserStorage[converse.storage](
+ b64_sha1('converse.roster.groups'+converse.bare_jid));
+ converse.rosterview = new converse.RosterView({model: rostergroups});
+ this.contactspanel.$el.append(converse.rosterview.$el);
+ converse.rosterview.render().fetch().update();
+ return this;
+ },
+
+ renderLoginPanel: function () {
+ var $feedback = this.$('.conn-feedback'); // we want to still show any existing feedback.
+ this.loginpanel = new converse.LoginPanel({
+ '$parent': this.$el.find('.controlbox-panes'),
+ 'model': this
+ });
+ this.loginpanel.render();
+ if ($feedback.length && $feedback.text() !== __('Connecting')) {
+ this.$('.conn-feedback').replaceWith($feedback);
+ }
+ return this;
+ },
+
+ renderContactsPanel: function () {
+ this.contactspanel = new converse.ContactsPanel({
+ '$parent': this.$el.find('.controlbox-panes')
+ });
+ this.contactspanel.render();
+ converse.xmppstatusview = new converse.XMPPStatusView({
+ 'model': converse.xmppstatus
+ });
+ converse.xmppstatusview.render();
+ },
+
+ close: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ if (converse.connection.connected) {
+ this.model.save({'closed': true});
+ } else {
+ this.model.trigger('hide');
+ }
+ converse.emit('controlBoxClosed', this);
+ return this;
+ },
+
+ ensureClosedState: function () {
+ if (this.model.get('closed')) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ },
+
+ hide: function (callback) {
+ this.$el.hide('fast', function () {
+ utils.refreshWebkit();
+ converse.emit('chatBoxClosed', this);
+ converse.controlboxtoggle.show(function () {
+ if (typeof callback === "function") {
+ callback();
+ }
+ });
+ });
+ return this;
+ },
+
+ onControlBoxToggleHidden: function () {
+ this.$el.show('fast', function () {
+ converse.controlboxtoggle.updateOnlineCount();
+ utils.refreshWebkit();
+ converse.emit('controlBoxOpened', this);
+ }.bind(this));
+ },
+
+ show: function () {
+ converse.controlboxtoggle.hide(
+ this.onControlBoxToggleHidden.bind(this)
+ );
+ return this;
+ },
+
+ switchTab: function (ev) {
+ // TODO: automatically focus the relevant input
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var $tab = $(ev.target),
+ $sibling = $tab.parent().siblings('li').children('a'),
+ $tab_panel = $($tab.attr('href'));
+ $($sibling.attr('href')).hide();
+ $sibling.removeClass('current');
+ $tab.addClass('current');
+ $tab_panel.show();
+ return this;
+ },
+
+ showHelpMessages: function (msgs) {
+ // Override showHelpMessages in ChatBoxView, for now do nothing.
+ return;
+ }
+ });
+
+
+ converse.LoginPanel = Backbone.View.extend({
+ tagName: 'div',
+ id: "login-dialog",
+ className: 'controlbox-pane',
+ events: {
+ 'submit form#converse-login': 'authenticate'
+ },
+
+ initialize: function (cfg) {
+ cfg.$parent.html(this.$el.html(
+ converse.templates.login_panel({
+ 'LOGIN': converse.LOGIN,
+ 'ANONYMOUS': converse.ANONYMOUS,
+ 'PREBIND': converse.PREBIND,
+ 'auto_login': converse.auto_login,
+ 'authentication': converse.authentication,
+ 'label_username': __('XMPP Username:'),
+ 'label_password': __('Password:'),
+ 'label_anon_login': __('Click here to log in anonymously'),
+ 'label_login': __('Log In'),
+ 'placeholder_username': (converse.locked_domain || converse.default_domain) && __('Username') || __('user@server'),
+ 'placeholder_password': __('password')
+ })
+ ));
+ this.$tabs = cfg.$parent.parent().find('#controlbox-tabs');
+ },
+
+ render: function () {
+ this.$tabs.append(converse.templates.login_tab({label_sign_in: __('Sign in')}));
+ this.$el.find('input#jid').focus();
+ if (!this.$el.is(':visible')) {
+ this.$el.show();
+ }
+ return this;
+ },
+
+ authenticate: function (ev) {
+ if (ev && ev.preventDefault) { ev.preventDefault(); }
+ var $form = $(ev.target);
+ if (converse.authentication === converse.ANONYMOUS) {
+ this.connect($form, converse.jid, null);
+ return;
+ }
+ var $jid_input = $form.find('input[name=jid]'),
+ jid = $jid_input.val(),
+ $pw_input = $form.find('input[name=password]'),
+ password = $pw_input.val(),
+ errors = false;
+
+ if (! jid) {
+ errors = true;
+ $jid_input.addClass('error');
+ }
+ if (! password) {
+ errors = true;
+ $pw_input.addClass('error');
+ }
+ if (errors) { return; }
+ if (converse.locked_domain) {
+ jid = Strophe.escapeNode(jid) + '@' + converse.locked_domain;
+ } else if (converse.default_domain && jid.indexOf('@') === -1) {
+ jid = jid + '@' + converse.default_domain;
+ }
+ this.connect($form, jid, password);
+ return false;
+ },
+
+ connect: function ($form, jid, password) {
+ var resource;
+ if ($form) {
+ $form.find('input[type=submit]').hide().after('');
+ }
+ if (jid) {
+ resource = Strophe.getResourceFromJid(jid);
+ if (!resource) {
+ jid = jid.toLowerCase() + converse.generateResource();
+ } else {
+ jid = Strophe.getBareJidFromJid(jid).toLowerCase()+'/'+resource;
+ }
+ }
+ converse.connection.connect(jid, password, converse.onConnectStatusChanged);
+ },
+
+ remove: function () {
+ this.$tabs.empty();
+ this.$el.parent().empty();
+ }
+ });
+
+
+ converse.XMPPStatusView = Backbone.View.extend({
+ el: "span#xmpp-status-holder",
+
+ events: {
+ "click a.choose-xmpp-status": "toggleOptions",
+ "click #fancy-xmpp-status-select a.change-xmpp-status-message": "renderStatusChangeForm",
+ "submit #set-custom-xmpp-status": "setStatusMessage",
+ "click .dropdown dd ul li a": "setStatus"
+ },
+
+ initialize: function () {
+ this.model.on("change:status", this.updateStatusUI, this);
+ this.model.on("change:status_message", this.updateStatusUI, this);
+ this.model.on("update-status-ui", this.updateStatusUI, this);
+ },
+
+ render: function () {
+ // Replace the default dropdown with something nicer
+ var $select = this.$el.find('select#select-xmpp-status'),
+ chat_status = this.model.get('status') || 'offline',
+ options = $('option', $select),
+ $options_target,
+ options_list = [];
+ this.$el.html(converse.templates.choose_status());
+ this.$el.find('#fancy-xmpp-status-select')
+ .html(converse.templates.chat_status({
+ 'status_message': this.model.get('status_message') || __("I am %1$s", this.getPrettyStatus(chat_status)),
+ 'chat_status': chat_status,
+ 'desc_custom_status': __('Click here to write a custom status message'),
+ 'desc_change_status': __('Click to change your chat status')
+ }));
+ // iterate through all the elements and add option values
+ options.each(function () {
+ options_list.push(converse.templates.status_option({
+ 'value': $(this).val(),
+ 'text': this.text
+ }));
+ });
+ $options_target = this.$el.find("#target dd ul").hide();
+ $options_target.append(options_list.join(''));
+ $select.remove();
+ return this;
+ },
+
+ toggleOptions: function (ev) {
+ ev.preventDefault();
+ $(ev.target).parent().parent().siblings('dd').find('ul').toggle('fast');
+ },
+
+ renderStatusChangeForm: function (ev) {
+ ev.preventDefault();
+ var status_message = this.model.get('status') || 'offline';
+ var input = converse.templates.change_status_message({
+ 'status_message': status_message,
+ 'label_custom_status': __('Custom status'),
+ 'label_save': __('Save')
+ });
+ var $xmppstatus = this.$el.find('.xmpp-status');
+ $xmppstatus.parent().addClass('no-border');
+ $xmppstatus.replaceWith(input);
+ this.$el.find('.custom-xmpp-status').focus().focus();
+ },
+
+ setStatusMessage: function (ev) {
+ ev.preventDefault();
+ this.model.setStatusMessage($(ev.target).find('input').val());
+ },
+
+ setStatus: function (ev) {
+ ev.preventDefault();
+ var $el = $(ev.currentTarget),
+ value = $el.attr('data-value');
+ if (value === 'logout') {
+ this.$el.find(".dropdown dd ul").hide();
+ converse.logOut();
+ } else {
+ this.model.setStatus(value);
+ this.$el.find(".dropdown dd ul").hide();
+ }
+ },
+
+ getPrettyStatus: function (stat) {
+ if (stat === 'chat') {
+ return __('online');
+ } else if (stat === 'dnd') {
+ return __('busy');
+ } else if (stat === 'xa') {
+ return __('away for long');
+ } else if (stat === 'away') {
+ return __('away');
+ } else if (stat === 'offline') {
+ return __('offline');
+ } else {
+ return __(stat) || __('online');
+ }
+ },
+
+ updateStatusUI: function (model) {
+ var stat = model.get('status');
+ // For translators: the %1$s part gets replaced with the status
+ // Example, I am online
+ var status_message = model.get('status_message') || __("I am %1$s", this.getPrettyStatus(stat));
+ this.$el.find('#fancy-xmpp-status-select').removeClass('no-border').html(
+ converse.templates.chat_status({
+ 'chat_status': stat,
+ 'status_message': status_message,
+ 'desc_custom_status': __('Click here to write a custom status message'),
+ 'desc_change_status': __('Click to change your chat status')
+ }));
+ }
+ });
+
+
+ converse.ContactsPanel = Backbone.View.extend({
+ tagName: 'div',
+ className: 'controlbox-pane',
+ id: 'users',
+ events: {
+ 'click a.toggle-xmpp-contact-form': 'toggleContactForm',
+ 'submit form.add-xmpp-contact': 'addContactFromForm',
+ 'submit form.search-xmpp-contact': 'searchContacts',
+ 'click a.subscribe-to-user': 'addContactFromList'
+ },
+
+ initialize: function (cfg) {
+ cfg.$parent.append(this.$el);
+ this.$tabs = cfg.$parent.parent().find('#controlbox-tabs');
+ },
+
+ render: function () {
+ var markup;
+ var widgets = converse.templates.contacts_panel({
+ label_online: __('Online'),
+ label_busy: __('Busy'),
+ label_away: __('Away'),
+ label_offline: __('Offline'),
+ label_logout: __('Log out'),
+ include_offline_state: converse.include_offline_state,
+ allow_logout: converse.allow_logout
+ });
+ this.$tabs.append(converse.templates.contacts_tab({label_contacts: LABEL_CONTACTS}));
+ if (converse.xhr_user_search) {
+ markup = converse.templates.search_contact({
+ label_contact_name: __('Contact name'),
+ label_search: __('Search')
+ });
+ } else {
+ markup = converse.templates.add_contact_form({
+ label_contact_username: __('e.g. user@example.org'),
+ label_add: __('Add')
+ });
+ }
+ if (converse.allow_contact_requests) {
+ widgets += converse.templates.add_contact_dropdown({
+ label_click_to_chat: __('Click to add new chat contacts'),
+ label_add_contact: __('Add a contact')
+ });
+ }
+ this.$el.html(widgets);
+ this.$el.find('.search-xmpp ul').append(markup);
+ return this;
+ },
+
+ toggleContactForm: function (ev) {
+ ev.preventDefault();
+ this.$el.find('.search-xmpp').toggle('fast', function () {
+ if ($(this).is(':visible')) {
+ $(this).find('input.username').focus();
+ }
+ });
+ },
+
+ searchContacts: function (ev) {
+ ev.preventDefault();
+ $.getJSON(converse.xhr_user_search_url+ "?q=" + $(ev.target).find('input.username').val(), function (data) {
+ var $ul= $('.search-xmpp ul');
+ $ul.find('li.found-user').remove();
+ $ul.find('li.chat-info').remove();
+ if (!data.length) {
+ $ul.append(''+__('No users found')+'');
+ }
+ $(data).each(function (idx, obj) {
+ $ul.append(
+ $('')
+ .append(
+ $('')
+ .attr('data-recipient', Strophe.getNodeFromJid(obj.id)+"@"+Strophe.getDomainFromJid(obj.id))
+ .text(obj.fullname)
+ )
+ );
+ });
+ });
+ },
+
+ addContactFromForm: function (ev) {
+ ev.preventDefault();
+ var $input = $(ev.target).find('input');
+ var jid = $input.val();
+ if (! jid) {
+ // this is not a valid JID
+ $input.addClass('error');
+ return;
+ }
+ converse.roster.addAndSubscribe(jid);
+ $('.search-xmpp').hide();
+ },
+
+ addContactFromList: function (ev) {
+ ev.preventDefault();
+ var $target = $(ev.target),
+ jid = $target.attr('data-recipient'),
+ name = $target.text();
+ converse.roster.addAndSubscribe(jid, name);
+ $target.parent().remove();
+ $('.search-xmpp').hide();
+ }
+ });
+
+
+ converse.ControlBoxToggle = Backbone.View.extend({
+ tagName: 'a',
+ className: 'toggle-controlbox',
+ id: 'toggle-controlbox',
+ events: {
+ 'click': 'onClick'
+ },
+ attributes: {
+ 'href': "#"
+ },
+
+ initialize: function () {
+ this.render();
+ this.updateOnlineCount();
+ converse.on('initialized', function () {
+ converse.roster.on("add", this.updateOnlineCount, this);
+ converse.roster.on('change', this.updateOnlineCount, this);
+ converse.roster.on("destroy", this.updateOnlineCount, this);
+ converse.roster.on("remove", this.updateOnlineCount, this);
+ }.bind(this));
+ },
+
+ render: function () {
+ $('#conversejs').prepend(this.$el.html(
+ converse.templates.controlbox_toggle({
+ 'label_toggle': __('Toggle chat')
+ })
+ ));
+ // We let the render method of ControlBoxView decide whether
+ // the ControlBox or the Toggle must be shown. This prevents
+ // artifacts (i.e. on page load the toggle is shown only to then
+ // seconds later be hidden in favor of the control box).
+ this.$el.hide();
+ return this;
+ },
+
+ updateOnlineCount: _.debounce(function () {
+ if (typeof converse.roster === 'undefined') {
+ return;
+ }
+ var $count = this.$('#online-count');
+ $count.text('('+converse.roster.getNumOnlineContacts()+')');
+ if (!$count.is(':visible')) {
+ $count.show();
+ }
+ }, converse.animate ? 100 : 0),
+
+ hide: function (callback) {
+ this.$el.fadeOut('fast', callback);
+ },
+
+ show: function (callback) {
+ this.$el.show('fast', callback);
+ },
+
+ showControlBox: function () {
+ var controlbox = converse.chatboxes.get('controlbox');
+ if (!controlbox) {
+ controlbox = converse.addControlBox();
+ }
+ if (converse.connection.connected) {
+ controlbox.save({closed: false});
+ } else {
+ controlbox.trigger('show');
+ }
+ },
+
+ onClick: function (e) {
+ e.preventDefault();
+ if ($("div#controlbox").is(':visible')) {
+ var controlbox = converse.chatboxes.get('controlbox');
+ if (converse.connection.connected) {
+ controlbox.save({closed: true});
+ } else {
+ controlbox.trigger('hide');
+ }
+ } else {
+ this.showControlBox();
+ }
+ }
+ });
+ }
+ });
+}));
+
/*!
* typeahead.js 0.10.5
* https://github.com/twitter/typeahead.js
@@ -33442,1653 +35244,6 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
return {};
}));
-// Converse.js (A browser based XMPP chat client)
-// http://conversejs.org
-//
-// Copyright (c) 2012-2016, Jan-Carel Brand
-// Licensed under the Mozilla Public License (MPLv2)
-//
-/*global Backbone, define */
-
-(function (root, factory) {
- define("converse-rosterview", ["converse-core", "converse-api"], factory);
-}(this, function (converse, converse_api) {
- "use strict";
- var $ = converse_api.env.jQuery,
- utils = converse_api.env.utils,
- Strophe = converse_api.env.Strophe,
- $iq = converse_api.env.$iq,
- b64_sha1 = converse_api.env.b64_sha1,
- _ = converse_api.env._,
- __ = utils.__.bind(converse);
-
-
- converse_api.plugins.add('rosterview', {
-
- overrides: {
- // Overrides mentioned here will be picked up by converse.js's
- // plugin architecture they will replace existing methods on the
- // relevant objects or classes.
- //
- // New functions which don't exist yet can also be added.
-
- afterReconnected: function () {
- this.rosterview.registerRosterXHandler();
- this.rosterview.registerPresenceHandler();
- this._super.afterReconnected.apply(this, arguments);
- }
- },
-
-
- initialize: function () {
- /* The initialize function gets called as soon as the plugin is
- * loaded by converse.js's plugin machinery.
- */
- this.updateSettings({
- allow_chat_pending_contacts: false,
- allow_contact_removal: true,
- show_toolbar: true,
- });
-
- var STATUSES = {
- 'dnd': __('This contact is busy'),
- 'online': __('This contact is online'),
- 'offline': __('This contact is offline'),
- 'unavailable': __('This contact is unavailable'),
- 'xa': __('This contact is away for an extended period'),
- 'away': __('This contact is away')
- };
- var DESC_GROUP_TOGGLE = __('Click to hide these contacts');
- var LABEL_CONTACTS = __('Contacts');
- var LABEL_GROUPS = __('Groups');
- var HEADER_CURRENT_CONTACTS = __('My contacts');
- var HEADER_PENDING_CONTACTS = __('Pending contacts');
- var HEADER_REQUESTING_CONTACTS = __('Contact requests');
- var HEADER_UNGROUPED = __('Ungrouped');
- var HEADER_WEIGHTS = {};
- HEADER_WEIGHTS[HEADER_CURRENT_CONTACTS] = 0;
- HEADER_WEIGHTS[HEADER_UNGROUPED] = 1;
- HEADER_WEIGHTS[HEADER_REQUESTING_CONTACTS] = 2;
- HEADER_WEIGHTS[HEADER_PENDING_CONTACTS] = 3;
-
- converse.RosterFilter = Backbone.Model.extend({
- initialize: function () {
- this.set({
- 'filter_text': '',
- 'filter_type': 'contacts',
- 'chat_state': ''
- });
- },
- });
-
- converse.RosterFilterView = Backbone.View.extend({
- tagName: 'span',
- events: {
- "keydown .roster-filter": "liveFilter",
- "click .onX": "clearFilter",
- "mousemove .x": "toggleX",
- "change .filter-type": "changeTypeFilter",
- "change .state-type": "changeChatStateFilter"
- },
-
- initialize: function () {
- this.model.on('change', this.render, this);
- },
-
- render: function () {
- this.$el.html(converse.templates.roster(
- _.extend(this.model.toJSON(), {
- placeholder: __('Filter'),
- label_contacts: LABEL_CONTACTS,
- label_groups: LABEL_GROUPS,
- label_state: __('State'),
- label_any: __('Any'),
- label_online: __('Online'),
- label_chatty: __('Chatty'),
- label_busy: __('Busy'),
- label_away: __('Away'),
- label_xa: __('Extended Away'),
- label_offline: __('Offline')
- })
- ));
- var $roster_filter = this.$('.roster-filter');
- $roster_filter[this.tog($roster_filter.val())]('x');
- return this.$el;
- },
-
- tog: function (v) {
- return v?'addClass':'removeClass';
- },
-
- toggleX: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- var el = ev.target;
- $(el)[this.tog(el.offsetWidth-18 < ev.clientX-el.getBoundingClientRect().left)]('onX');
- },
-
- changeChatStateFilter: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- this.model.save({
- 'chat_state': this.$('.state-type').val()
- });
- },
-
- changeTypeFilter: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- var type = ev.target.value;
- if (type === 'state') {
- this.model.save({
- 'filter_type': type,
- 'chat_state': this.$('.state-type').val()
- });
- } else {
- this.model.save({
- 'filter_type': type,
- 'filter_text': this.$('.roster-filter').val(),
- });
- }
- },
-
- liveFilter: _.debounce(function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- this.model.save({
- 'filter_type': this.$('.filter-type').val(),
- 'filter_text': this.$('.roster-filter').val()
- });
- }, 250),
-
- isActive: function () {
- /* Returns true if the filter is enabled (i.e. if the user
- * has added values to the filter).
- */
- if (this.model.get('filter_type') === 'state' ||
- this.model.get('filter_text')) {
- return true;
- }
- return false;
- },
-
- show: function () {
- if (this.$el.is(':visible')) { return this; }
- this.$el.show();
- return this;
- },
-
- hide: function () {
- if (!this.$el.is(':visible')) { return this; }
- if (this.$('.roster-filter').val().length > 0) {
- // Don't hide if user is currently filtering.
- return;
- }
- this.model.save({
- 'filter_text': '',
- 'chat_state': ''
- });
- this.$el.hide();
- return this;
- },
-
- clearFilter: function (ev) {
- if (ev && ev.preventDefault) {
- ev.preventDefault();
- $(ev.target).removeClass('x onX').val('');
- }
- this.model.save({
- 'filter_text': ''
- });
- }
- });
-
- converse.RosterView = Backbone.Overview.extend({
- tagName: 'div',
- id: 'converse-roster',
-
- initialize: function () {
- this.roster_handler_ref = this.registerRosterHandler();
- this.rosterx_handler_ref = this.registerRosterXHandler();
- this.presence_ref = this.registerPresenceHandler();
- converse.roster.on("add", this.onContactAdd, this);
- converse.roster.on('change', this.onContactChange, this);
- converse.roster.on("destroy", this.update, this);
- converse.roster.on("remove", this.update, this);
- this.model.on("add", this.onGroupAdd, this);
- this.model.on("reset", this.reset, this);
- this.$roster = $('
');
- // Create a model on which we can store filter properties
- var model = new converse.RosterFilter();
- model.id = b64_sha1('converse.rosterfilter'+converse.bare_jid);
- model.browserStorage = new Backbone.BrowserStorage.local(this.filter.id);
- this.filter_view = new converse.RosterFilterView({'model': model});
- this.filter_view.model.on('change', this.updateFilter, this);
- this.filter_view.model.fetch();
- },
-
- render: function () {
- this.$el.html(this.filter_view.render());
- if (!converse.allow_contact_requests) {
- // XXX: if we ever support live editing of config then
- // we'll need to be able to remove this class on the fly.
- this.$el.addClass('no-contact-requests');
- }
- return this;
- },
-
- updateFilter: _.debounce(function () {
- /* Filter the roster again.
- * Called whenever the filter settings have been changed or
- * when contacts have been added, removed or changed.
- *
- * Debounced so that it doesn't get called for every
- * contact fetched from browser storage.
- */
- var type = this.filter_view.model.get('filter_type');
- if (type === 'state') {
- this.filter(this.filter_view.model.get('chat_state'), type);
- } else {
- this.filter(this.filter_view.model.get('filter_text'), type);
- }
- }, 100),
-
- unregisterHandlers: function () {
- converse.connection.deleteHandler(this.roster_handler_ref);
- delete this.roster_handler_ref;
- converse.connection.deleteHandler(this.rosterx_handler_ref);
- delete this.rosterx_handler_ref;
- converse.connection.deleteHandler(this.presence_ref);
- delete this.presence_ref;
- },
-
- update: _.debounce(function () {
- if (this.$roster.parent().length === 0) {
- this.$el.append(this.$roster.show());
- }
- return this.showHideFilter();
- }, converse.animate ? 100 : 0),
-
- showHideFilter: function () {
- if (!this.$el.is(':visible')) {
- return;
- }
- if (this.$roster.hasScrollBar()) {
- this.filter_view.show();
- } else if (!this.filter_view.isActive()) {
- this.filter_view.hide();
- }
- return this;
- },
-
- fetch: function () {
- this.model.fetch({
- silent: true, // We use the success handler to handle groups that were added,
- // we need to first have all groups before positionFetchedGroups
- // will work properly.
- success: function (collection, resp, options) {
- if (collection.length !== 0) {
- this.positionFetchedGroups(collection, resp, options);
- }
- converse.roster.fetch({
- add: true,
- success: function (collection) {
- if (collection.length === 0) {
- /* We don't have any roster contacts stored in sessionStorage,
- * so lets fetch the roster from the XMPP server. We pass in
- * 'sendPresence' as callback method, because after initially
- * fetching the roster we are ready to receive presence
- * updates from our contacts.
- */
- converse.roster.fetchFromServer(
- converse.xmppstatus.sendPresence.bind(converse.xmppstatus));
- } else if (converse.send_initial_presence) {
- /* We're not going to fetch the roster again because we have
- * it already cached in sessionStorage, but we still need to
- * send out a presence stanza because this is a new session.
- * See: https://github.com/jcbrand/converse.js/issues/536
- */
- converse.xmppstatus.sendPresence();
- }
- }
- });
- }.bind(this)
- });
- return this;
- },
-
- filter: function (query, type) {
- // First we make sure the filter is restored to its
- // original state
- _.each(this.getAll(), function (view) {
- if (view.model.contacts.length > 0) {
- view.show().filter('');
- }
- });
- // Now we can filter
- query = query.toLowerCase();
- if (type === 'groups') {
- _.each(this.getAll(), function (view, idx) {
- if (view.model.get('name').toLowerCase().indexOf(query.toLowerCase()) === -1) {
- view.hide();
- } else if (view.model.contacts.length > 0) {
- view.show();
- }
- });
- } else {
- _.each(this.getAll(), function (view) {
- view.filter(query, type);
- });
- }
- },
-
- reset: function () {
- converse.roster.reset();
- this.removeAll();
- this.$roster = $('
');
- this.render().update();
- return this;
- },
-
- registerRosterHandler: function () {
- converse.connection.addHandler(
- converse.roster.onRosterPush.bind(converse.roster),
- Strophe.NS.ROSTER, 'iq', "set"
- );
- },
-
- registerRosterXHandler: function () {
- var t = 0;
- converse.connection.addHandler(
- function (msg) {
- window.setTimeout(
- function () {
- converse.connection.flush();
- converse.roster.subscribeToSuggestedItems.bind(converse.roster)(msg);
- },
- t
- );
- t += $(msg).find('item').length*250;
- return true;
- },
- Strophe.NS.ROSTERX, 'message', null
- );
- },
-
- registerPresenceHandler: function () {
- converse.connection.addHandler(
- function (presence) {
- converse.roster.presenceHandler(presence);
- return true;
- }.bind(this), null, 'presence', null);
- },
-
- onGroupAdd: function (group) {
- var view = new converse.RosterGroupView({model: group});
- this.add(group.get('name'), view.render());
- this.positionGroup(view);
- },
-
- onContactAdd: function (contact) {
- this.addRosterContact(contact).update();
- this.updateFilter();
- },
-
- onContactChange: function (contact) {
- this.updateChatBox(contact).update();
- if (_.has(contact.changed, 'subscription')) {
- if (contact.changed.subscription === 'from') {
- this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
- } else if (_.contains(['both', 'to'], contact.get('subscription'))) {
- this.addExistingContact(contact);
- }
- }
- if (_.has(contact.changed, 'ask') && contact.changed.ask === 'subscribe') {
- this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
- }
- if (_.has(contact.changed, 'subscription') && contact.changed.requesting === 'true') {
- this.addContactToGroup(contact, HEADER_REQUESTING_CONTACTS);
- }
- this.updateFilter();
- },
-
- updateChatBox: function (contact) {
- var chatbox = converse.chatboxes.get(contact.get('jid')),
- changes = {};
- if (!chatbox) {
- return this;
- }
- if (_.has(contact.changed, 'chat_status')) {
- changes.chat_status = contact.get('chat_status');
- }
- if (_.has(contact.changed, 'status')) {
- changes.status = contact.get('status');
- }
- chatbox.save(changes);
- return this;
- },
-
- positionFetchedGroups: function (model, resp, options) {
- /* Instead of throwing an add event for each group
- * fetched, we wait until they're all fetched and then
- * we position them.
- * Works around the problem of positionGroup not
- * working when all groups besides the one being
- * positioned aren't already in inserted into the
- * roster DOM element.
- */
- model.sort();
- model.each(function (group, idx) {
- var view = this.get(group.get('name'));
- if (!view) {
- view = new converse.RosterGroupView({model: group});
- this.add(group.get('name'), view.render());
- }
- if (idx === 0) {
- this.$roster.append(view.$el);
- } else {
- this.appendGroup(view);
- }
- }.bind(this));
- },
-
- positionGroup: function (view) {
- /* Place the group's DOM element in the correct alphabetical
- * position amongst the other groups in the roster.
- */
- var $groups = this.$roster.find('.roster-group'),
- index = $groups.length ? this.model.indexOf(view.model) : 0;
- if (index === 0) {
- this.$roster.prepend(view.$el);
- } else if (index === (this.model.length-1)) {
- this.appendGroup(view);
- } else {
- $($groups.eq(index)).before(view.$el);
- }
- return this;
- },
-
- appendGroup: function (view) {
- /* Add the group at the bottom of the roster
- */
- var $last = this.$roster.find('.roster-group').last();
- var $siblings = $last.siblings('dd');
- if ($siblings.length > 0) {
- $siblings.last().after(view.$el);
- } else {
- $last.after(view.$el);
- }
- return this;
- },
-
- getGroup: function (name) {
- /* Returns the group as specified by name.
- * Creates the group if it doesn't exist.
- */
- var view = this.get(name);
- if (view) {
- return view.model;
- }
- return this.model.create({name: name, id: b64_sha1(name)});
- },
-
- addContactToGroup: function (contact, name) {
- this.getGroup(name).contacts.add(contact);
- },
-
- addExistingContact: function (contact) {
- var groups;
- if (converse.roster_groups) {
- groups = contact.get('groups');
- if (groups.length === 0) {
- groups = [HEADER_UNGROUPED];
- }
- } else {
- groups = [HEADER_CURRENT_CONTACTS];
- }
- _.each(groups, _.bind(this.addContactToGroup, this, contact));
- },
-
- addRosterContact: function (contact) {
- if (contact.get('subscription') === 'both' || contact.get('subscription') === 'to') {
- this.addExistingContact(contact);
- } else {
- if ((contact.get('ask') === 'subscribe') || (contact.get('subscription') === 'from')) {
- this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
- } else if (contact.get('requesting') === true) {
- this.addContactToGroup(contact, HEADER_REQUESTING_CONTACTS);
- }
- }
- return this;
- }
- });
-
-
- converse.RosterContactView = Backbone.View.extend({
- tagName: 'dd',
-
- events: {
- "click .accept-xmpp-request": "acceptRequest",
- "click .decline-xmpp-request": "declineRequest",
- "click .open-chat": "openChat",
- "click .remove-xmpp-contact": "removeContact"
- },
-
- initialize: function () {
- this.model.on("change", this.render, this);
- this.model.on("remove", this.remove, this);
- this.model.on("destroy", this.remove, this);
- this.model.on("open", this.openChat, this);
- },
-
- render: function () {
- if (!this.mayBeShown()) {
- this.$el.hide();
- return this;
- }
- var item = this.model,
- ask = item.get('ask'),
- chat_status = item.get('chat_status'),
- requesting = item.get('requesting'),
- subscription = item.get('subscription');
-
- var classes_to_remove = [
- 'current-xmpp-contact',
- 'pending-xmpp-contact',
- 'requesting-xmpp-contact'
- ].concat(_.keys(STATUSES));
-
- _.each(classes_to_remove,
- function (cls) {
- if (this.el.className.indexOf(cls) !== -1) {
- this.$el.removeClass(cls);
- }
- }, this);
- this.$el.addClass(chat_status).data('status', chat_status);
-
- if ((ask === 'subscribe') || (subscription === 'from')) {
- /* ask === 'subscribe'
- * Means we have asked to subscribe to them.
- *
- * subscription === 'from'
- * They are subscribed to use, but not vice versa.
- * We assume that there is a pending subscription
- * from us to them (otherwise we're in a state not
- * supported by converse.js).
- *
- * So in both cases the user is a "pending" contact.
- */
- this.$el.addClass('pending-xmpp-contact');
- this.$el.html(converse.templates.pending_contact(
- _.extend(item.toJSON(), {
- 'desc_remove': __('Click to remove this contact'),
- 'allow_chat_pending_contacts': converse.allow_chat_pending_contacts
- })
- ));
- } else if (requesting === true) {
- this.$el.addClass('requesting-xmpp-contact');
- this.$el.html(converse.templates.requesting_contact(
- _.extend(item.toJSON(), {
- 'desc_accept': __("Click to accept this contact request"),
- 'desc_decline': __("Click to decline this contact request"),
- 'allow_chat_pending_contacts': converse.allow_chat_pending_contacts
- })
- ));
- converse.controlboxtoggle.showControlBox();
- } else if (subscription === 'both' || subscription === 'to') {
- this.$el.addClass('current-xmpp-contact');
- this.$el.removeClass(_.without(['both', 'to'], subscription)[0]).addClass(subscription);
- this.$el.html(converse.templates.roster_item(
- _.extend(item.toJSON(), {
- 'desc_status': STATUSES[chat_status||'offline'],
- 'desc_chat': __('Click to chat with this contact'),
- 'desc_remove': __('Click to remove this contact'),
- 'title_fullname': __('Name'),
- 'allow_contact_removal': converse.allow_contact_removal
- })
- ));
- }
- return this;
- },
-
- isGroupCollapsed: function () {
- /* Check whether the group in which this contact appears is
- * collapsed.
- */
- // XXX: this sucks and is fragile.
- // It's because I tried to do the "right thing"
- // and use definition lists to represent roster groups.
- // If roster group items were inside the group elements, we
- // would simplify things by not having to check whether the
- // group is collapsed or not.
- var name = this.$el.prevAll('dt:first').data('group');
- var group = converse.rosterview.model.where({'name': name})[0];
- if (group.get('state') === converse.CLOSED) {
- return true;
- }
- return false;
- },
-
- mayBeShown: function () {
- /* Return a boolean indicating whether this contact should
- * generally be visible in the roster.
- *
- * It doesn't check for the more specific case of whether
- * the group it's in is collapsed (see isGroupCollapsed).
- */
- var chatStatus = this.model.get('chat_status');
- if ((converse.show_only_online_users && chatStatus !== 'online') ||
- (converse.hide_offline_users && chatStatus === 'offline')) {
- // If pending or requesting, show
- if ((this.model.get('ask') === 'subscribe') ||
- (this.model.get('subscription') === 'from') ||
- (this.model.get('requesting') === true)) {
- return true;
- }
- return false;
- }
- return true;
- },
-
- openChat: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- return converse.chatboxviews.showChat(this.model.attributes);
- },
-
- removeContact: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- if (!converse.allow_contact_removal) { return; }
- var result = confirm(__("Are you sure you want to remove this contact?"));
- if (result === true) {
- var iq = $iq({type: 'set'})
- .c('query', {xmlns: Strophe.NS.ROSTER})
- .c('item', {jid: this.model.get('jid'), subscription: "remove"});
- converse.connection.sendIQ(iq,
- function (iq) {
- this.model.destroy();
- this.remove();
- }.bind(this),
- function (err) {
- alert(__("Sorry, there was an error while trying to remove "+name+" as a contact."));
- converse.log(err);
- }
- );
- }
- },
-
- acceptRequest: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- converse.roster.sendContactAddIQ(
- this.model.get('jid'),
- this.model.get('fullname'),
- [],
- function () { this.model.authorize().subscribe(); }.bind(this)
- );
- },
-
- declineRequest: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- var result = confirm(__("Are you sure you want to decline this contact request?"));
- if (result === true) {
- this.model.unauthorize().destroy();
- }
- return this;
- }
- });
-
-
- converse.RosterGroup = Backbone.Model.extend({
- initialize: function (attributes, options) {
- this.set(_.extend({
- description: DESC_GROUP_TOGGLE,
- state: converse.OPENED
- }, attributes));
- // Collection of contacts belonging to this group.
- this.contacts = new converse.RosterContacts();
- }
- });
-
-
- converse.RosterGroupView = Backbone.Overview.extend({
- tagName: 'dt',
- className: 'roster-group',
- events: {
- "click a.group-toggle": "toggle"
- },
-
- initialize: function () {
- this.model.contacts.on("add", this.addContact, this);
- this.model.contacts.on("change:subscription", this.onContactSubscriptionChange, this);
- this.model.contacts.on("change:requesting", this.onContactRequestChange, this);
- this.model.contacts.on("change:chat_status", function (contact) {
- // This might be optimized by instead of first sorting,
- // finding the correct position in positionContact
- this.model.contacts.sort();
- this.positionContact(contact).render();
- }, this);
- this.model.contacts.on("destroy", this.onRemove, this);
- this.model.contacts.on("remove", this.onRemove, this);
- converse.roster.on('change:groups', this.onContactGroupChange, this);
- },
-
- render: function () {
- this.$el.attr('data-group', this.model.get('name'));
- this.$el.html(
- $(converse.templates.group_header({
- label_group: this.model.get('name'),
- desc_group_toggle: this.model.get('description'),
- toggle_state: this.model.get('state')
- }))
- );
- return this;
- },
-
- addContact: function (contact) {
- var view = new converse.RosterContactView({model: contact});
- this.add(contact.get('id'), view);
- view = this.positionContact(contact).render();
- if (view.mayBeShown()) {
- if (this.model.get('state') === converse.CLOSED) {
- if (view.$el[0].style.display !== "none") { view.$el.hide(); }
- if (!this.$el.is(':visible')) { this.$el.show(); }
- } else {
- if (this.$el[0].style.display !== "block") { this.show(); }
- }
- }
- },
-
- positionContact: function (contact) {
- /* Place the contact's DOM element in the correct alphabetical
- * position amongst the other contacts in this group.
- */
- var view = this.get(contact.get('id'));
- var index = this.model.contacts.indexOf(contact);
- view.$el.detach();
- if (index === 0) {
- this.$el.after(view.$el);
- } else if (index === (this.model.contacts.length-1)) {
- this.$el.nextUntil('dt').last().after(view.$el);
- } else {
- this.$el.nextUntil('dt').eq(index).before(view.$el);
- }
- return view;
- },
-
- show: function () {
- this.$el.show();
- _.each(this.getAll(), function (view) {
- if (view.mayBeShown() && !view.isGroupCollapsed()) {
- view.$el.show();
- }
- });
- return this;
- },
-
- hide: function () {
- this.$el.nextUntil('dt').addBack().hide();
- },
-
- filter: function (q, type) {
- /* Filter the group's contacts based on the query "q".
- * The query is matched against the contact's full name.
- * If all contacts are filtered out (i.e. hidden), then the
- * group must be filtered out as well.
- */
- var matches;
- if (q.length === 0) {
- if (this.model.get('state') === converse.OPENED) {
- this.model.contacts.each(function (item) {
- var view = this.get(item.get('id'));
- if (view.mayBeShown() && !view.isGroupCollapsed()) {
- view.$el.show();
- }
- }.bind(this));
- }
- this.showIfNecessary();
- } else {
- q = q.toLowerCase();
- if (type === 'state') {
- matches = this.model.contacts.filter(
- utils.contains.not('chat_status', q)
- );
- } else {
- matches = this.model.contacts.filter(
- utils.contains.not('fullname', q)
- );
- }
- if (matches.length === this.model.contacts.length) {
- // hide the whole group
- this.hide();
- } else {
- _.each(matches, function (item) {
- this.get(item.get('id')).$el.hide();
- }.bind(this));
- _.each(this.model.contacts.reject(utils.contains.not('fullname', q)), function (item) {
- this.get(item.get('id')).$el.show();
- }.bind(this));
- this.showIfNecessary();
- }
- }
- },
-
- showIfNecessary: function () {
- if (!this.$el.is(':visible') && this.model.contacts.length > 0) {
- this.$el.show();
- }
- },
-
- toggle: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- var $el = $(ev.target);
- if ($el.hasClass("icon-opened")) {
- this.$el.nextUntil('dt').slideUp();
- this.model.save({state: converse.CLOSED});
- $el.removeClass("icon-opened").addClass("icon-closed");
- } else {
- $el.removeClass("icon-closed").addClass("icon-opened");
- this.model.save({state: converse.OPENED});
- this.filter(
- converse.rosterview.$('.roster-filter').val() || '',
- converse.rosterview.$('.filter-type').val()
- );
- }
- },
-
- onContactGroupChange: function (contact) {
- var in_this_group = _.contains(contact.get('groups'), this.model.get('name'));
- var cid = contact.get('id');
- var in_this_overview = !this.get(cid);
- if (in_this_group && !in_this_overview) {
- this.model.contacts.remove(cid);
- } else if (!in_this_group && in_this_overview) {
- this.addContact(contact);
- }
- },
-
- onContactSubscriptionChange: function (contact) {
- if ((this.model.get('name') === HEADER_PENDING_CONTACTS) && contact.get('subscription') !== 'from') {
- this.model.contacts.remove(contact.get('id'));
- }
- },
-
- onContactRequestChange: function (contact) {
- if ((this.model.get('name') === HEADER_REQUESTING_CONTACTS) && !contact.get('requesting')) {
- this.model.contacts.remove(contact.get('id'));
- }
- },
-
- onRemove: function (contact) {
- this.remove(contact.get('id'));
- if (this.model.contacts.length === 0) {
- this.$el.hide();
- }
- }
- });
-
-
- converse.RosterGroups = Backbone.Collection.extend({
- model: converse.RosterGroup,
- comparator: function (a, b) {
- /* Groups are sorted alphabetically, ignoring case.
- * However, Ungrouped, Requesting Contacts and Pending Contacts
- * appear last and in that order. */
- a = a.get('name');
- b = b.get('name');
- var special_groups = _.keys(HEADER_WEIGHTS);
- var a_is_special = _.contains(special_groups, a);
- var b_is_special = _.contains(special_groups, b);
- if (!a_is_special && !b_is_special ) {
- return a.toLowerCase() < b.toLowerCase() ? -1 : (a.toLowerCase() > b.toLowerCase() ? 1 : 0);
- } else if (a_is_special && b_is_special) {
- return HEADER_WEIGHTS[a] < HEADER_WEIGHTS[b] ? -1 : (HEADER_WEIGHTS[a] > HEADER_WEIGHTS[b] ? 1 : 0);
- } else if (!a_is_special && b_is_special) {
- return (b === HEADER_CURRENT_CONTACTS) ? 1 : -1;
- } else if (a_is_special && !b_is_special) {
- return (a === HEADER_CURRENT_CONTACTS) ? -1 : 1;
- }
- }
- });
- }
- });
-}));
-
-// Converse.js (A browser based XMPP chat client)
-// http://conversejs.org
-//
-// Copyright (c) 2012-2016, Jan-Carel Brand
-// Licensed under the Mozilla Public License (MPLv2)
-//
-/*global define, Backbone */
-
-(function (root, factory) {
- define("converse-controlbox", [
- "converse-core",
- "converse-api",
- // TODO: remove the next two dependencies
- "converse-rosterview",
- "converse-chatview"
- ], factory);
-}(this, function (converse, converse_api) {
- "use strict";
- // Strophe methods for building stanzas
- var Strophe = converse_api.env.Strophe,
- b64_sha1 = converse_api.env.b64_sha1,
- utils = converse_api.env.utils;
- // Other necessary globals
- var $ = converse_api.env.jQuery,
- _ = converse_api.env._,
- __ = utils.__.bind(converse),
- moment = converse_api.env.moment;
-
-
- converse_api.plugins.add('controlbox', {
-
- overrides: {
- // Overrides mentioned here will be picked up by converse.js's
- // plugin architecture they will replace existing methods on the
- // relevant objects or classes.
- //
- // New functions which don't exist yet can also be added.
-
- initSession: function () {
- this.controlboxtoggle = new this.ControlBoxToggle();
- this._super.initSession.apply(this, arguments);
- },
-
- initConnection: function () {
- this._super.initConnection.apply(this, arguments);
- if (this.connection) {
- this.addControlBox();
- }
- },
-
- onDisconnected: function () {
- var result = this._super.onDisconnected.apply(this, arguments);
- if (result === 'disconnected') {
- converse._tearDown();
- var view = converse.chatboxviews.get('controlbox');
- view.model.set({connected:false});
- view.$('#controlbox-tabs').empty();
- view.renderLoginPanel();
- }
- },
-
- _tearDown: function () {
- this._super._tearDown.apply(this, arguments);
- if (this.rosterview) {
- this.rosterview.unregisterHandlers();
- // Removes roster groups
- this.rosterview.model.off().reset();
- this.rosterview.undelegateEvents().remove();
- }
- },
-
- clearSession: function () {
- this._super.clearSession.apply(this, arguments);
- if (typeof this.connection !== 'undefined' && this.connection.connected) {
- this.chatboxes.get('controlbox').save({'connected': false});
- }
- },
-
- ChatBoxes: {
- chatBoxMayBeShown: function (chatbox) {
- return this._super.chatBoxMayBeShown.apply(this, arguments) &&
- chatbox.get('id') !== 'controlbox';
- },
-
- onChatBoxesFetched: function (collection, resp) {
- this._super.onChatBoxesFetched.apply(this, arguments);
- if (!_.include(_.pluck(resp, 'id'), 'controlbox')) {
- this.add({
- id: 'controlbox',
- box_id: 'controlbox'
- });
- }
- this.get('controlbox').save({connected:true});
- },
- },
-
- ChatBoxViews: {
- onChatBoxAdded: function (item) {
- if (item.get('box_id') === 'controlbox') {
- var view = this.get(item.get('id'));
- if (view) {
- view.model = item;
- view.initialize();
- return view;
- } else {
- view = new converse.ControlBoxView({model: item});
- return this.add(item.get('id'), view);
- }
- } else {
- return this._super.onChatBoxAdded.apply(this, arguments);
- }
- },
-
- closeAllChatBoxes: function () {
- this.each(function (view) {
- if (view.model.get('id') !== 'controlbox') {
- view.close();
- }
- });
- return this;
- },
-
- getChatBoxWidth: function (view) {
- var controlbox = this.get('controlbox');
- if (view.model.get('id') === 'controlbox') {
- /* We return the width of the controlbox or its toggle,
- * depending on which is visible.
- */
- if (!controlbox || !controlbox.$el.is(':visible')) {
- return converse.controlboxtoggle.$el.outerWidth(true);
- } else {
- return controlbox.$el.outerWidth(true);
- }
- } else {
- return this._super.getChatBoxWidth.apply(this, arguments);
- }
- }
- },
-
-
- ChatBox: {
- initialize: function () {
- if (this.get('id') === 'controlbox') {
- this.set({
- 'time_opened': moment(0).valueOf(),
- 'num_unread': 0
- });
- } else {
- this._super.initialize.apply(this, arguments);
- }
- },
- },
-
-
- ChatBoxView: {
- insertIntoPage: function () {
- this.$el.insertAfter(converse.chatboxviews.get("controlbox").$el);
- return this;
- }
- }
- },
-
- initialize: function () {
- /* The initialize function gets called as soon as the plugin is
- * loaded by converse.js's plugin machinery.
- */
- var converse = this.converse;
- this.updateSettings({
- allow_logout: true,
- default_domain: undefined,
- show_controlbox_by_default: false,
- sticky_controlbox: false,
- xhr_user_search: false,
- xhr_user_search_url: ''
- });
-
- var LABEL_CONTACTS = __('Contacts');
-
- converse.addControlBox = function () {
- return converse.chatboxes.add({
- id: 'controlbox',
- box_id: 'controlbox',
- closed: !converse.show_controlbox_by_default
- });
- };
-
- converse.ControlBoxView = converse.ChatBoxView.extend({
- tagName: 'div',
- className: 'chatbox',
- id: 'controlbox',
- events: {
- 'click a.close-chatbox-button': 'close',
- 'click ul#controlbox-tabs li a': 'switchTab',
- },
-
- initialize: function () {
- this.$el.insertAfter(converse.controlboxtoggle.$el);
- this.model.on('change:connected', this.onConnected, this);
- this.model.on('destroy', this.hide, this);
- this.model.on('hide', this.hide, this);
- this.model.on('show', this.show, this);
- this.model.on('change:closed', this.ensureClosedState, this);
- this.render();
- if (this.model.get('connected')) {
- this.initRoster();
- }
- if (typeof this.model.get('closed')==='undefined') {
- this.model.set('closed', !converse.show_controlbox_by_default);
- }
- if (!this.model.get('closed')) {
- this.show();
- } else {
- this.hide();
- }
- },
-
- render: function () {
- this.$el.html(converse.templates.controlbox(
- _.extend(this.model.toJSON(), {
- sticky_controlbox: converse.sticky_controlbox
- }))
- );
- if (!converse.connection.connected || !converse.connection.authenticated || converse.connection.disconnecting) {
- this.renderLoginPanel();
- } else if (!this.contactspanel || !this.contactspanel.$el.is(':visible')) {
- this.renderContactsPanel();
- }
- return this;
- },
-
- giveFeedback: function (message, klass) {
- var $el = this.$('.conn-feedback');
- $el.addClass('conn-feedback').text(message);
- if (klass) {
- $el.addClass(klass);
- }
- },
-
- onConnected: function () {
- if (this.model.get('connected')) {
- this.render().initRoster();
- }
- },
-
- initRoster: function () {
- /* We initialize the roster, which will appear inside the
- * Contacts Panel.
- */
- var rostergroups = new converse.RosterGroups();
- rostergroups.browserStorage = new Backbone.BrowserStorage[converse.storage](
- b64_sha1('converse.roster.groups'+converse.bare_jid));
- converse.rosterview = new converse.RosterView({model: rostergroups});
- this.contactspanel.$el.append(converse.rosterview.$el);
- converse.rosterview.render().fetch().update();
- return this;
- },
-
- renderLoginPanel: function () {
- var $feedback = this.$('.conn-feedback'); // we want to still show any existing feedback.
- this.loginpanel = new converse.LoginPanel({
- '$parent': this.$el.find('.controlbox-panes'),
- 'model': this
- });
- this.loginpanel.render();
- if ($feedback.length && $feedback.text() !== __('Connecting')) {
- this.$('.conn-feedback').replaceWith($feedback);
- }
- return this;
- },
-
- renderContactsPanel: function () {
- this.contactspanel = new converse.ContactsPanel({
- '$parent': this.$el.find('.controlbox-panes')
- });
- this.contactspanel.render();
- converse.xmppstatusview = new converse.XMPPStatusView({
- 'model': converse.xmppstatus
- });
- converse.xmppstatusview.render();
- },
-
- close: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- if (converse.connection.connected) {
- this.model.save({'closed': true});
- } else {
- this.model.trigger('hide');
- }
- converse.emit('controlBoxClosed', this);
- return this;
- },
-
- ensureClosedState: function () {
- if (this.model.get('closed')) {
- this.hide();
- } else {
- this.show();
- }
- },
-
- hide: function (callback) {
- this.$el.hide('fast', function () {
- utils.refreshWebkit();
- converse.emit('chatBoxClosed', this);
- converse.controlboxtoggle.show(function () {
- if (typeof callback === "function") {
- callback();
- }
- });
- });
- return this;
- },
-
- onControlBoxToggleHidden: function () {
- this.$el.show('fast', function () {
- converse.controlboxtoggle.updateOnlineCount();
- utils.refreshWebkit();
- converse.emit('controlBoxOpened', this);
- }.bind(this));
- },
-
- show: function () {
- converse.controlboxtoggle.hide(
- this.onControlBoxToggleHidden.bind(this)
- );
- return this;
- },
-
- switchTab: function (ev) {
- // TODO: automatically focus the relevant input
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- var $tab = $(ev.target),
- $sibling = $tab.parent().siblings('li').children('a'),
- $tab_panel = $($tab.attr('href'));
- $($sibling.attr('href')).hide();
- $sibling.removeClass('current');
- $tab.addClass('current');
- $tab_panel.show();
- return this;
- },
-
- showHelpMessages: function (msgs) {
- // Override showHelpMessages in ChatBoxView, for now do nothing.
- return;
- }
- });
-
-
- converse.LoginPanel = Backbone.View.extend({
- tagName: 'div',
- id: "login-dialog",
- className: 'controlbox-pane',
- events: {
- 'submit form#converse-login': 'authenticate'
- },
-
- initialize: function (cfg) {
- cfg.$parent.html(this.$el.html(
- converse.templates.login_panel({
- 'LOGIN': converse.LOGIN,
- 'ANONYMOUS': converse.ANONYMOUS,
- 'PREBIND': converse.PREBIND,
- 'auto_login': converse.auto_login,
- 'authentication': converse.authentication,
- 'label_username': __('XMPP Username:'),
- 'label_password': __('Password:'),
- 'label_anon_login': __('Click here to log in anonymously'),
- 'label_login': __('Log In'),
- 'placeholder_username': (converse.locked_domain || converse.default_domain) && __('Username') || __('user@server'),
- 'placeholder_password': __('password')
- })
- ));
- this.$tabs = cfg.$parent.parent().find('#controlbox-tabs');
- },
-
- render: function () {
- this.$tabs.append(converse.templates.login_tab({label_sign_in: __('Sign in')}));
- this.$el.find('input#jid').focus();
- if (!this.$el.is(':visible')) {
- this.$el.show();
- }
- return this;
- },
-
- authenticate: function (ev) {
- if (ev && ev.preventDefault) { ev.preventDefault(); }
- var $form = $(ev.target);
- if (converse.authentication === converse.ANONYMOUS) {
- this.connect($form, converse.jid, null);
- return;
- }
- var $jid_input = $form.find('input[name=jid]'),
- jid = $jid_input.val(),
- $pw_input = $form.find('input[name=password]'),
- password = $pw_input.val(),
- errors = false;
-
- if (! jid) {
- errors = true;
- $jid_input.addClass('error');
- }
- if (! password) {
- errors = true;
- $pw_input.addClass('error');
- }
- if (errors) { return; }
- if (converse.locked_domain) {
- jid = Strophe.escapeNode(jid) + '@' + converse.locked_domain;
- } else if (converse.default_domain && jid.indexOf('@') === -1) {
- jid = jid + '@' + converse.default_domain;
- }
- this.connect($form, jid, password);
- return false;
- },
-
- connect: function ($form, jid, password) {
- var resource;
- if ($form) {
- $form.find('input[type=submit]').hide().after('');
- }
- if (jid) {
- resource = Strophe.getResourceFromJid(jid);
- if (!resource) {
- jid = jid.toLowerCase() + converse.generateResource();
- } else {
- jid = Strophe.getBareJidFromJid(jid).toLowerCase()+'/'+resource;
- }
- }
- converse.connection.connect(jid, password, converse.onConnectStatusChanged);
- },
-
- remove: function () {
- this.$tabs.empty();
- this.$el.parent().empty();
- }
- });
-
-
- converse.XMPPStatusView = Backbone.View.extend({
- el: "span#xmpp-status-holder",
-
- events: {
- "click a.choose-xmpp-status": "toggleOptions",
- "click #fancy-xmpp-status-select a.change-xmpp-status-message": "renderStatusChangeForm",
- "submit #set-custom-xmpp-status": "setStatusMessage",
- "click .dropdown dd ul li a": "setStatus"
- },
-
- initialize: function () {
- this.model.on("change:status", this.updateStatusUI, this);
- this.model.on("change:status_message", this.updateStatusUI, this);
- this.model.on("update-status-ui", this.updateStatusUI, this);
- },
-
- render: function () {
- // Replace the default dropdown with something nicer
- var $select = this.$el.find('select#select-xmpp-status'),
- chat_status = this.model.get('status') || 'offline',
- options = $('option', $select),
- $options_target,
- options_list = [];
- this.$el.html(converse.templates.choose_status());
- this.$el.find('#fancy-xmpp-status-select')
- .html(converse.templates.chat_status({
- 'status_message': this.model.get('status_message') || __("I am %1$s", this.getPrettyStatus(chat_status)),
- 'chat_status': chat_status,
- 'desc_custom_status': __('Click here to write a custom status message'),
- 'desc_change_status': __('Click to change your chat status')
- }));
- // iterate through all the elements and add option values
- options.each(function () {
- options_list.push(converse.templates.status_option({
- 'value': $(this).val(),
- 'text': this.text
- }));
- });
- $options_target = this.$el.find("#target dd ul").hide();
- $options_target.append(options_list.join(''));
- $select.remove();
- return this;
- },
-
- toggleOptions: function (ev) {
- ev.preventDefault();
- $(ev.target).parent().parent().siblings('dd').find('ul').toggle('fast');
- },
-
- renderStatusChangeForm: function (ev) {
- ev.preventDefault();
- var status_message = this.model.get('status') || 'offline';
- var input = converse.templates.change_status_message({
- 'status_message': status_message,
- 'label_custom_status': __('Custom status'),
- 'label_save': __('Save')
- });
- var $xmppstatus = this.$el.find('.xmpp-status');
- $xmppstatus.parent().addClass('no-border');
- $xmppstatus.replaceWith(input);
- this.$el.find('.custom-xmpp-status').focus().focus();
- },
-
- setStatusMessage: function (ev) {
- ev.preventDefault();
- this.model.setStatusMessage($(ev.target).find('input').val());
- },
-
- setStatus: function (ev) {
- ev.preventDefault();
- var $el = $(ev.currentTarget),
- value = $el.attr('data-value');
- if (value === 'logout') {
- this.$el.find(".dropdown dd ul").hide();
- converse.logOut();
- } else {
- this.model.setStatus(value);
- this.$el.find(".dropdown dd ul").hide();
- }
- },
-
- getPrettyStatus: function (stat) {
- if (stat === 'chat') {
- return __('online');
- } else if (stat === 'dnd') {
- return __('busy');
- } else if (stat === 'xa') {
- return __('away for long');
- } else if (stat === 'away') {
- return __('away');
- } else if (stat === 'offline') {
- return __('offline');
- } else {
- return __(stat) || __('online');
- }
- },
-
- updateStatusUI: function (model) {
- var stat = model.get('status');
- // For translators: the %1$s part gets replaced with the status
- // Example, I am online
- var status_message = model.get('status_message') || __("I am %1$s", this.getPrettyStatus(stat));
- this.$el.find('#fancy-xmpp-status-select').removeClass('no-border').html(
- converse.templates.chat_status({
- 'chat_status': stat,
- 'status_message': status_message,
- 'desc_custom_status': __('Click here to write a custom status message'),
- 'desc_change_status': __('Click to change your chat status')
- }));
- }
- });
-
-
- converse.ContactsPanel = Backbone.View.extend({
- tagName: 'div',
- className: 'controlbox-pane',
- id: 'users',
- events: {
- 'click a.toggle-xmpp-contact-form': 'toggleContactForm',
- 'submit form.add-xmpp-contact': 'addContactFromForm',
- 'submit form.search-xmpp-contact': 'searchContacts',
- 'click a.subscribe-to-user': 'addContactFromList'
- },
-
- initialize: function (cfg) {
- cfg.$parent.append(this.$el);
- this.$tabs = cfg.$parent.parent().find('#controlbox-tabs');
- },
-
- render: function () {
- var markup;
- var widgets = converse.templates.contacts_panel({
- label_online: __('Online'),
- label_busy: __('Busy'),
- label_away: __('Away'),
- label_offline: __('Offline'),
- label_logout: __('Log out'),
- include_offline_state: converse.include_offline_state,
- allow_logout: converse.allow_logout
- });
- this.$tabs.append(converse.templates.contacts_tab({label_contacts: LABEL_CONTACTS}));
- if (converse.xhr_user_search) {
- markup = converse.templates.search_contact({
- label_contact_name: __('Contact name'),
- label_search: __('Search')
- });
- } else {
- markup = converse.templates.add_contact_form({
- label_contact_username: __('e.g. user@example.org'),
- label_add: __('Add')
- });
- }
- if (converse.allow_contact_requests) {
- widgets += converse.templates.add_contact_dropdown({
- label_click_to_chat: __('Click to add new chat contacts'),
- label_add_contact: __('Add a contact')
- });
- }
- this.$el.html(widgets);
- this.$el.find('.search-xmpp ul').append(markup);
- return this;
- },
-
- toggleContactForm: function (ev) {
- ev.preventDefault();
- this.$el.find('.search-xmpp').toggle('fast', function () {
- if ($(this).is(':visible')) {
- $(this).find('input.username').focus();
- }
- });
- },
-
- searchContacts: function (ev) {
- ev.preventDefault();
- $.getJSON(converse.xhr_user_search_url+ "?q=" + $(ev.target).find('input.username').val(), function (data) {
- var $ul= $('.search-xmpp ul');
- $ul.find('li.found-user').remove();
- $ul.find('li.chat-info').remove();
- if (!data.length) {
- $ul.append(''+__('No users found')+'');
- }
- $(data).each(function (idx, obj) {
- $ul.append(
- $('')
- .append(
- $('')
- .attr('data-recipient', Strophe.getNodeFromJid(obj.id)+"@"+Strophe.getDomainFromJid(obj.id))
- .text(obj.fullname)
- )
- );
- });
- });
- },
-
- addContactFromForm: function (ev) {
- ev.preventDefault();
- var $input = $(ev.target).find('input');
- var jid = $input.val();
- if (! jid) {
- // this is not a valid JID
- $input.addClass('error');
- return;
- }
- converse.roster.addAndSubscribe(jid);
- $('.search-xmpp').hide();
- },
-
- addContactFromList: function (ev) {
- ev.preventDefault();
- var $target = $(ev.target),
- jid = $target.attr('data-recipient'),
- name = $target.text();
- converse.roster.addAndSubscribe(jid, name);
- $target.parent().remove();
- $('.search-xmpp').hide();
- }
- });
-
-
- converse.ControlBoxToggle = Backbone.View.extend({
- tagName: 'a',
- className: 'toggle-controlbox',
- id: 'toggle-controlbox',
- events: {
- 'click': 'onClick'
- },
- attributes: {
- 'href': "#"
- },
-
- initialize: function () {
- this.render();
- converse.on('initialized', function () {
- converse.roster.on("add", this.updateOnlineCount, this);
- converse.roster.on('change', this.updateOnlineCount, this);
- converse.roster.on("destroy", this.updateOnlineCount, this);
- converse.roster.on("remove", this.updateOnlineCount, this);
- }.bind(this));
- },
-
- render: function () {
- $('#conversejs').prepend(this.$el.html(
- converse.templates.controlbox_toggle({
- 'label_toggle': __('Toggle chat')
- })
- ));
- // We let the render method of ControlBoxView decide whether
- // the ControlBox or the Toggle must be shown. This prevents
- // artifacts (i.e. on page load the toggle is shown only to then
- // seconds later be hidden in favor of the control box).
- this.$el.hide();
- return this;
- },
-
- updateOnlineCount: _.debounce(function () {
- if (typeof converse.roster === 'undefined') {
- return;
- }
- var $count = this.$('#online-count');
- $count.text('('+converse.roster.getNumOnlineContacts()+')');
- if (!$count.is(':visible')) {
- $count.show();
- }
- }, converse.animate ? 100 : 0),
-
- hide: function (callback) {
- this.$el.fadeOut('fast', callback);
- },
-
- show: function (callback) {
- this.$el.show('fast', callback);
- },
-
- showControlBox: function () {
- var controlbox = converse.chatboxes.get('controlbox');
- if (!controlbox) {
- controlbox = converse.addControlBox();
- }
- if (converse.connection.connected) {
- controlbox.save({closed: false});
- } else {
- controlbox.trigger('show');
- }
- },
-
- onClick: function (e) {
- e.preventDefault();
- if ($("div#controlbox").is(':visible')) {
- var controlbox = converse.chatboxes.get('controlbox');
- if (converse.connection.connected) {
- controlbox.save({closed: true});
- } else {
- controlbox.trigger('hide');
- }
- } else {
- this.showControlBox();
- }
- }
- });
- }
- });
-}));
-
// Converse.js (A browser based XMPP chat client)
// http://conversejs.org
//
@@ -35105,9 +35260,7 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
"converse-core",
"converse-api",
"typeahead",
- "converse-chatview",
- // XXX: should we remove this dependency?
- "converse-controlbox"
+ "converse-chatview"
], factory);
}(this, function (converse, converse_api) {
"use strict";
@@ -35135,7 +35288,16 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
Strophe.addNamespace('MUC_ROOMCONF', Strophe.NS.MUC + "#roomconfig");
Strophe.addNamespace('MUC_USER', Strophe.NS.MUC + "#user");
- converse_api.plugins.add('muc', {
+ converse_api.plugins.add('converse-muc', {
+ /* Optional dependencies are other plugins which might be
+ * overridden or relied upon, if they exist, otherwise they're ignored.
+ *
+ * However, if the setting "strict_plugin_dependencies" is set to true,
+ * an error will be raised if the plugin is not found.
+ *
+ * NB: These plugins need to have already been loaded via require.js.
+ */
+ optional_dependencies: ["converse-controlbox"],
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -35158,9 +35320,11 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
Features: {
addClientFeatures: function () {
this._super.addClientFeatures.apply(this, arguments);
- converse.connection.disco.addFeature('jabber:x:conference'); // Invites
- if (this.allow_muc) {
- this.connection.disco.addFeature(Strophe.NS.MUC);
+ if (converse.allow_muc_invitations) {
+ converse.connection.disco.addFeature('jabber:x:conference'); // Invites
+ }
+ if (converse.allow_muc) {
+ converse.connection.disco.addFeature(Strophe.NS.MUC);
}
}
},
@@ -35239,6 +35403,7 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
var converse = this.converse;
// Configuration values for this plugin
this.updateSettings({
+ allow_muc_invitations: true,
allow_muc: true,
auto_join_on_invite: false, // Auto-join chatroom on invite
auto_join_rooms: [], // List of maps {'jid': 'room@example.org', 'nick': 'WizardKing69' },
@@ -35266,7 +35431,8 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
'click .toggle-clear': 'clearChatRoomMessages',
'click .toggle-call': 'toggleCall',
'click .toggle-occupants a': 'toggleOccupants',
- 'keypress textarea.chat-textarea': 'keyPressed',
+ 'click .new-msgs-indicator': 'viewUnreadMessages',
+ 'keypress textarea.chat-textarea': 'keyPressed'
},
initialize: function () {
@@ -35283,11 +35449,26 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
this.render().$el.hide();
this.occupantsview.model.fetch({add:true});
this.join(null, {'maxstanzas': converse.muc_history_max_stanzas});
- this.fetchMessages();
- this.$el.insertAfter(converse.chatboxviews.get("controlbox").$el);
+ this.fetchMessages().insertIntoDOM();
+ // XXX: adding the event below to the events map above doesn't work.
+ // The code that gets executed because of that looks like this:
+ // this.$el.on('scroll', '.chat-content', this.markScrolled.bind(this));
+ // Which for some reason doesn't work.
+ // So working around that fact here:
+ this.$el.find('.chat-content').on('scroll', this.markScrolled.bind(this));
converse.emit('chatRoomOpened', this);
},
+ insertIntoDOM: function () {
+ var view = converse.chatboxviews.get("controlbox");
+ if (view) {
+ this.$el.insertAfter(view.$el);
+ } else {
+ $('#conversejs').prepend(this.$el);
+ }
+ return this;
+ },
+
render: function () {
this.$el.attr('id', this.model.get('box_id'))
.html(converse.templates.chatroom(this.model.toJSON()));
@@ -35301,6 +35482,7 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
this.$('.chatroom-body').empty()
.append(
converse.templates.chatarea({
+ 'unread_msgs': __('You have unread messages'),
'show_toolbar': converse.show_toolbar,
'label_message': __('Message')
}))
@@ -35327,16 +35509,15 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
// Bit of a hack, to make sure that the sidebar's state doesn't change
this.model.set({hidden_occupants: !this.model.get('hidden_occupants')});
}
- var $el = this.$('.icon-hide-users');
if (!this.model.get('hidden_occupants')) {
this.model.save({hidden_occupants: true});
- $el.removeClass('icon-hide-users').addClass('icon-show-users');
+ this.$('.icon-hide-users').removeClass('icon-hide-users').addClass('icon-show-users');
this.$('.occupants').addClass('hidden');
this.$('.chat-area').addClass('full');
this.scrollDown();
} else {
this.model.save({hidden_occupants: false});
- $el.removeClass('icon-show-users').addClass('icon-hide-users');
+ this.$('.icon-show-users').removeClass('icon-show-users').addClass('icon-hide-users');
this.$('.chat-area').removeClass('full');
this.$('div.occupants').removeClass('hidden');
this.scrollDown();
@@ -35377,10 +35558,8 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
}).c("body").t(text).up()
.c("x", {xmlns: "jabber:x:event"}).c("composing");
converse.connection.send(msg);
-
- var fullname = converse.xmppstatus.get('fullname');
this.model.messages.create({
- fullname: _.isEmpty(fullname)? converse.bare_jid: fullname,
+ fullname: this.model.get('nick'),
sender: 'me',
time: moment().format(),
message: text,
@@ -35865,7 +36044,9 @@ define('text!zh',[],function () { return '{\n "domain": "converse",\n "local
for (i=0; i 0 ? $body.text() : undefined);
- return !!text.match(/^\?OTR/);
- },
-
shouldPlayNotification: function ($message) {
/* Don't play a notification if this is an OTR message but
* encryption is not yet set up. That would mean that the
@@ -44820,10 +45028,10 @@ define("crypto.mode-ctr", ["crypto.cipher-core"], function(){});
* "visible" OTR messages being exchanged.
*/
return this._super.shouldPlayNotification.apply(this, arguments) &&
- !(this.isOTRMessage($message) && !_.contains([UNVERIFIED, VERIFIED], this.get('otr_status')));
+ !(utils.isOTRMessage($message[0]) && !_.contains([UNVERIFIED, VERIFIED], this.get('otr_status')));
},
- createMessage: function ($message, $delay, archive_id) {
+ createMessage: function ($message, $delay, original_stanza) {
var converse = this._super.converse,
$body = $message.children('body'),
text = ($body.length > 0 ? $body.text() : undefined);
@@ -45007,9 +45215,12 @@ define("crypto.mode-ctr", ["crypto.cipher-core"], function(){});
createMessageStanza: function () {
var stanza = this._super.createMessageStanza.apply(this, arguments);
- if (this.model.get('otr_status') !== UNENCRYPTED) {
+ if (this.model.get('otr_status') !== UNENCRYPTED || utils.isOTRMessage(stanza.nodeTree)) {
// OTR messages aren't carbon copied
- stanza.c('private', {'xmlns': Strophe.NS.CARBONS});
+ stanza.c('private', {'xmlns': Strophe.NS.CARBONS}).up()
+ .c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
+ .c('no-permanent-store', {'xmlns': Strophe.NS.HINTS}).up()
+ .c('no-copy', {'xmlns': Strophe.NS.HINTS});
}
return stanza;
},
@@ -45286,7 +45497,7 @@ define("crypto.mode-ctr", ["crypto.cipher-core"], function(){});
Strophe.Status.CONFLICT = i + 3;
Strophe.Status.NOTACCEPTABLE = i + 5;
- converse_api.plugins.add('register', {
+ converse_api.plugins.add('converse-register', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -45877,7 +46088,7 @@ Strophe.addConnectionPlugin('ping', {
// Other necessary globals
var _ = converse_api.env._;
- converse_api.plugins.add('ping', {
+ converse_api.plugins.add('converse-ping', {
initialize: function () {
/* The initialize function gets called as soon as the plugin is
@@ -45983,18 +46194,18 @@ Strophe.addConnectionPlugin('ping', {
var __ = utils.__.bind(converse);
var ___ = utils.___;
- var supports_html5_notification = "Notification" in window;
-
- converse_api.plugins.add('notification', {
+ converse_api.plugins.add('converse-notification', {
initialize: function () {
/* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery.
*/
var converse = this.converse;
+ converse.supports_html5_notification = "Notification" in window;
this.updateSettings({
+ notify_all_room_messages: false,
show_desktop_notifications: true,
chatstate_notification_blacklist: [],
// ^ a list of JIDs to ignore concerning chat state notifications
@@ -46019,15 +46230,22 @@ Strophe.addConnectionPlugin('ping', {
converse.shouldNotifyOfGroupMessage = function ($message) {
/* Is this a group message worthy of notification?
*/
- var jid = $message.attr('from'),
+ var notify_all = converse.notify_all_room_messages,
+ jid = $message.attr('from'),
resource = Strophe.getResourceFromJid(jid),
+ room_jid = Strophe.getBareJidFromJid(jid),
sender = resource && Strophe.unescapeNode(resource) || '';
if (sender === '' || $message.find('delay').length > 0) {
return false;
}
- var room = converse.chatboxes.get(Strophe.getBareJidFromJid(jid));
- var body = $message.children('body').text();
- if (sender === room.get('nick') || !(new RegExp("\\b"+room.get('nick')+"\\b")).test(body)) {
+ var room = converse.chatboxes.get(room_jid);
+ var $body = $message.children('body');
+ if (!$body.length) {
+ return false;
+ }
+ var mentioned = (new RegExp("\\b"+room.get('nick')+"\\b")).test($body.text());
+ notify_all = notify_all === true || (_.isArray(notify_all) && _.contains(notify_all, room_jid));
+ if (sender === room.get('nick') || (!notify_all && !mentioned)) {
return false;
}
return true;
@@ -46036,6 +46254,9 @@ Strophe.addConnectionPlugin('ping', {
converse.shouldNotifyOfMessage = function (message) {
/* Is this a message worthy of notification?
*/
+ if (utils.isOTRMessage(message)) {
+ return false;
+ }
var $message = $(message),
$forwarded = $message.find('forwarded');
if ($forwarded.length) {
@@ -46068,14 +46289,14 @@ Strophe.addConnectionPlugin('ping', {
}
};
- converse.areDesktopNotificationsEnabled = function (ignore_blur) {
- var enabled = supports_html5_notification &&
+ converse.areDesktopNotificationsEnabled = function (ignore_hidden) {
+ var enabled = converse.supports_html5_notification &&
converse.show_desktop_notifications &&
Notification.permission === "granted";
- if (ignore_blur) {
+ if (ignore_hidden) {
return enabled;
} else {
- return enabled && converse.windowState === 'blur';
+ return enabled && converse.windowState === 'hidden';
}
};
@@ -46195,18 +46416,23 @@ Strophe.addConnectionPlugin('ping', {
};
converse.requestPermission = function (evt) {
- if (supports_html5_notification &&
+ if (converse.supports_html5_notification &&
! _.contains(['denied', 'granted'], Notification.permission)) {
// Ask user to enable HTML5 notifications
Notification.requestPermission();
}
};
- converse.on('contactRequest', converse.handleContactRequestNotification);
- converse.on('contactStatusChanged', converse.handleChatStateNotification);
- converse.on('message', converse.handleMessageNotification);
- converse.on('feedback', converse.handleFeedback);
- converse.on('connected', converse.requestPermission);
+ converse.on('pluginsInitialized', function () {
+ // We only register event handlers after all plugins are
+ // registered, because other plugins might override some of our
+ // handlers.
+ converse.on('contactRequest', converse.handleContactRequestNotification);
+ converse.on('contactStatusChanged', converse.handleChatStateNotification);
+ converse.on('message', converse.handleMessageNotification);
+ converse.on('feedback', converse.handleFeedback);
+ converse.on('connected', converse.requestPermission);
+ });
}
});
}));
@@ -46236,7 +46462,7 @@ Strophe.addConnectionPlugin('ping', {
utils = converse_api.env.utils,
__ = utils.__.bind(converse);
- converse_api.plugins.add('minimize', {
+ converse_api.plugins.add('converse-minimize', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -46431,7 +46657,14 @@ Strophe.addConnectionPlugin('ping', {
getShownChats: function () {
return this.filter(function (view) {
- return (!view.model.get('minimized') && view.$el.is(':visible'));
+ // The controlbox can take a while to close,
+ // so we need to check its state. That's why we checked
+ // the 'closed' state.
+ return (
+ !view.model.get('minimized') &&
+ !view.model.get('closed') &&
+ view.$el.is(':visible')
+ );
});
},
@@ -46744,7 +46977,7 @@ Strophe.addConnectionPlugin('ping', {
var $ = converse_api.env.jQuery,
_ = converse_api.env._;
- converse_api.plugins.add('dragresize', {
+ converse_api.plugins.add('converse-dragresize', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -46752,7 +46985,7 @@ Strophe.addConnectionPlugin('ping', {
// relevant objects or classes.
//
// New functions which don't exist yet can also be added.
-
+
registerGlobalEventHandlers: function () {
$(document).on('mousemove', function (ev) {
if (!this.resizing || !this.allow_dragresize) { return true; }
@@ -47053,13 +47286,13 @@ Strophe.addConnectionPlugin('ping', {
'jid': from_jid,
'fullname': from_jid,
'type': 'headline'
- }).createMessage($message);
+ }).createMessage($message, undefined, message);
converse.emit('message', message);
}
return true;
};
- converse_api.plugins.add('headline', {
+ converse_api.plugins.add('converse-headline', {
overrides: {
// Overrides mentioned here will be picked up by converse.js's
@@ -47067,7 +47300,7 @@ Strophe.addConnectionPlugin('ping', {
// relevant objects or classes.
//
// New functions which don't exist yet can also be added.
-
+
ChatBoxViews: {
onChatBoxAdded: function (item) {
var view = this.get(item.get('id'));
@@ -47099,8 +47332,11 @@ Strophe.addConnectionPlugin('ping', {
},
initialize: function () {
+ if (typeof this.setDimensions !== "undefined") {
+ // setDimensions is defined for dragresize
+ $(window).on('resize', _.debounce(this.setDimensions.bind(this), 100));
+ }
this.disable_mam = true; // Don't do MAM queries for this box
- $(window).on('resize', _.debounce(this.setDimensions.bind(this), 100));
this.model.messages.on('add', this.onMessageAdded, this);
this.model.on('show', this.show, this);
this.model.on('destroy', this.hide, this);
@@ -47116,6 +47352,7 @@ Strophe.addConnectionPlugin('ping', {
show_toolbar: converse.show_toolbar,
show_textarea: false,
title: this.model.get('fullname'),
+ unread_msgs: __('You have unread messages'),
info_close: __('Close this box'),
info_minimize: __('Minimize this box'),
label_personal_message: ''
@@ -47123,7 +47360,10 @@ Strophe.addConnectionPlugin('ping', {
)
)
);
- this.setWidth();
+ if (typeof this.setWidth !== "undefined") {
+ // setWidth is defined for dragresize
+ $(window).on('resize', _.debounce(this.setWidth.bind(this), 100));
+ }
this.$content = this.$el.find('.chat-content');
converse.emit('chatBoxOpened', this);
window.setTimeout(utils.refreshWebkit, 50);
@@ -47199,6 +47439,7 @@ require.config({
"converse-notification": "src/converse-notification",
"converse-otr": "src/converse-otr",
"converse-ping": "src/converse-ping",
+ "converse-pluggable": "src/converse-pluggable",
"converse-register": "src/converse-register",
"converse-rosterview": "src/converse-rosterview",
"converse-templates": "src/converse-templates",
@@ -47378,11 +47619,11 @@ if (typeof define !== 'undefined') {
// translations that you care about.
"converse-chatview", // Renders standalone chat boxes for single user chat
+ "converse-controlbox", // The control box
"converse-mam", // XEP-0313 Message Archive Management
"converse-muc", // XEP-0045 Multi-user chat
"converse-vcard", // XEP-0054 VCard-temp
"converse-otr", // Off-the-record encryption for one-on-one messages
- "converse-controlbox", // The control box
"converse-register", // XEP-0077 In-band registration
"converse-ping", // XEP-0199 XMPP Ping
"converse-notification",// HTML5 Notifications
diff --git a/dist/templates.js b/dist/templates.js
index 62cbb5cef..a591ccb7b 100644
--- a/dist/templates.js
+++ b/dist/templates.js
@@ -93,7 +93,9 @@ obj || (obj = {});
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
function print() { __p += __j.call(arguments, '') }
with (obj) {
-__p += '\n
\n
\n ';
+__p += '\n
\n
▼ ' +
+((__t = ( unread_msgs )) == null ? '' : __t) +
+' ▼
\n
\n ';
if (show_toolbar) { ;
__p += '\n \n ';
} ;
@@ -124,7 +126,9 @@ __p += '\n ' +
if (url) { ;
__p += '\n \n ';
} ;
-__p += '\n \n \n \n \n \n \n \n
\n
▼ ' +
+((__t = ( unread_msgs )) == null ? '' : __t) +
+' ▼
\n ';
if (show_textarea) { ;
__p += '\n
\n ';
if (show_toolbar) { ;
@@ -192,11 +196,16 @@ return __p
this["templates"]["chatroom_sidebar"] = function(obj) {
obj || (obj = {});
-var __t, __p = '', __e = _.escape;
+var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
+function print() { __p += __j.call(arguments, '') }
with (obj) {
-__p += '\n\n -->\n';
+ if (allow_muc_invitations) { ;
+__p += '\n\n \n\n
' +
+'" type="text"/>\n\n';
+ } ;
+__p += '\n
' +
((__t = (label_occupants)) == null ? '' : __t) +
':
\n
\n\n';
diff --git a/docs/CHANGES.md b/docs/CHANGES.md
index e337d161c..534c44637 100755
--- a/docs/CHANGES.md
+++ b/docs/CHANGES.md
@@ -1,6 +1,6 @@
# Changelog
-## 1.0.3 (Unreleased)
+## 1.0.3 (2016-06-20)
- Update the plugin architecture to allow plugins to have optional dependencies [jcbrand]
- Bugfix. Login form doesn't render after logging out, when `auto_reconnect = false` [jcbrand]
@@ -13,11 +13,11 @@
- New config option [default_state](https://conversejs.org/docs/html/configuration.html#default_state) [jcbrand]
- New API method `converse.rooms.close()`
- New configuration setting [allow_muc_invites](https://conversejs.org/docs/html/configuration.html#allow-muc-invites) [jcbrand]
+- Add new event [pluginsInitialized](https://conversejs.org/docs/html/development.html#pluginsInitialized)
- #553 Add processing hints to OTR messages [jcbrand]
- #650 Don't ignore incoming messages with same JID as current user (might be MAM archived) [jcbrand]
- #656 online users count in minimized chat window on initialization corrected
-
## 1.0.2 (2016-05-24)
- Bugfix. Bind `sendPresence` to the right context. Bug that slipped in during
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 3c7ddee47..aa2d61e5c 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -48,9 +48,9 @@ copyright = u'2014, JC Brand'
# built documents.
#
# The short X.Y version.
-version = '1.0.2'
+version = '1.0.3'
# The full version, including alpha/beta/rc tags.
-release = '1.0.2'
+release = '1.0.3'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/locale/af/LC_MESSAGES/converse.po b/locale/af/LC_MESSAGES/converse.po
index f16a24cff..9e3b84e15 100644
--- a/locale/af/LC_MESSAGES/converse.po
+++ b/locale/af/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:34+0000\n"
"Last-Translator: JC Brand
\n"
"Language-Team: Afrikaans\n"
@@ -19,78 +19,84 @@ msgstr ""
"lang: af\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Verwyder boodskappe"
+
+#: src/converse-chatview.js:104
msgid "Close this chat box"
msgstr "Sluit hierdie kletskas"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Persoonlike boodskap"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "ek"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "tik tans"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "het opgehou tik"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "het weggegaan"
# The last three values are needed by Jed (a Javascript translations library)
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Vertoon hierdie keuselys"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Skryf in die derde persoon"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Verwyder boodskappe"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Is u seker u wil die boodskappe in hierdie kletskas uitvee?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr "is nou aflyn"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "is besig"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Vee alle boodskappe uit"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr "Verskuil die lys van deelnemers"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr "Voeg 'n emotikon by"
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "Begin 'n oproep"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Kontakte"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Verbind tans"
@@ -144,7 +150,7 @@ msgstr "Klik om jou klets-status te verander"
msgid "Custom status"
msgstr "Doelgemaakte status"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Stoor"
@@ -221,196 +227,196 @@ msgstr "Geen gebruikers gevind"
msgid "Click to add as a chat contact"
msgstr "Klik om as kletskontak by te voeg"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Klets"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Fout"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Besig om te bekragtig"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Bekragtiging het gefaal"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr "Hierdie klient laat nie beskikbaarheidsinskrywings toe nie"
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
msgid "Close this box"
msgstr "Maak hierdie kletskas toe"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
msgid "Minimize this box"
msgstr "Minimeer hierdie kletskas"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Klik om hierdie klets te herstel"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Geminimaliseer"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr "Minimeer hierdie kletskas"
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Boodskap"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Fout: kon nie die opdrag uitvoer nie"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Is u seker dat u die boodskappe in hierdie kamer wil verwyder?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr "Verander die gebruiker se affiliasie na admin"
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Verban gebruiker uit hierdie kletskamer"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr "Verander gebruiker se rol na lid"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Skop gebruiker uit hierdie kletskamer"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "Skryf in die derde persoon"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr "Verleen lidmaatskap aan 'n gebruiker"
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "Verwyder gebruiker se vermoë om boodskappe te plaas"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Verander u bynaam"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr "Verleen moderator rol aan gebruiker"
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "Verleen eienaarskap van hierdie kamer"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr "Herroep gebruiker se lidmaatskap"
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Stel onderwerp vir kletskamer"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "Laat stilgemaakte gebruiker toe om weer boodskappe te plaas"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Kanseleer"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "A fout het voorgekom terwyl probeer is om die vorm te stoor."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Hiedie kletskamer benodig 'n wagwoord"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Wagwoord:"
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Dien in"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Hierdie vertrek is nie anoniem nie"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Hierdie vertrek wys nou onbeskikbare lede"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Hierdie vertrek wys nie onbeskikbare lede nie"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Nie-privaatheidverwante kamer instellings het verander"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Kamer log is nou aangeskakel"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Kamer log is nou afgeskakel"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Hiedie kamer is nou nie anoniem nie"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Hierdie kamer is nou gedeeltelik anoniem"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Hierdie kamer is nou ten volle anoniem"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "'n Nuwe kamer is geskep"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Jy is uit die kamer verban"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Jy is uit die kamer geskop"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Jy is vanuit die kamer verwyder a.g.v 'n verandering van affiliasie"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -418,7 +424,7 @@ msgstr ""
"Jy is vanuit die kamer verwyder omdat die kamer nou slegs tot lede beperk "
"word en jy nie 'n lid is nie."
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -436,95 +442,95 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s is verban"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "%1$s se bynaam het verander"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s is uitgeskop"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "%1$s is verwyder a.g.v 'n verandering van affiliasie"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s is nie 'n lid nie, en dus verwyder"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "U bynaam is outomaties verander na: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "U bynaam is verander na: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "Die gegewe rede is: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Jy is nie op die ledelys van hierdie kamer nie"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Geen bynaam verskaf nie"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Jy word nie toegelaat om nog kletskamers te skep nie"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Jou bynaam voldoen nie aan die kamer se beleid nie"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Jou bynaam is reeds geneem"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Hierdie kamer bestaan tans (nog) nie"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
msgid "This room has reached its maximum number of occupants"
msgstr "Hierdie kletskamer het sy maksimum aantal deelnemers bereik"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Onderwerp deur %1$s bygewerk na: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Hierdie gebruiker is 'n moderator"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Hierdie gebruiker kan boodskappe na die kamer stuur"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Nooi uit"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Deelnemers"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "U is op die punt om %1$s na die kletskamer \"%2$s\" uit te nooi."
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
@@ -532,110 +538,110 @@ msgstr ""
"U mag na keuse 'n boodskap insluit, om bv. die rede vir die uitnodiging te "
"staaf."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Kamer naam"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Bynaam"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Bediener"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Betree kletskamer"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Wys kletskamers"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Kletskamers"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Geen kletskamers op %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Kletskamers op %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Klik om hierdie kletskamer te open"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Wys meer inligting aangaande hierdie kletskamer"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Beskrywing:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Deelnemers:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Eienskappe:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Benodig magtiging"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Verskuil"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Benodig 'n uitnodiging"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Gemodereer"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Nie-anoniem"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Oop kletskamer"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Permanente kamer"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Publiek"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Deels anoniem"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Tydelike kamer"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Ongemodereer"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s het u uitgenooi om die kletskamer %2$s te besoek"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -645,40 +651,40 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr "Kennisgewing van %1$s"
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr "%1$s sê"
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
msgid "has come online"
msgstr "het aanlyn gekom"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr "wil jou kontak wees"
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr "'n Fout het voorgekom"
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Herstel versleutelde sessie"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Genereer private sleutel."
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "U webblaaier mag tydelik onreageerbaar word."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -694,19 +700,19 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Kon nie hierdie gebruiker se identitied bevestig nie."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "Sleutels word met gespreksmaat uitgeruil."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "U boodskappe is nie meer versleutel nie"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
@@ -714,28 +720,28 @@ msgstr ""
"U boodskappe is now versleutel maar u gespreksmaat se identiteit is nog "
"onseker."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr "U gespreksmaat se identiteit is bevestig."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
"U gespreksmaat het versleuteling gestaak, u behoort nou dieselfde te doen."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "U boodskap kon nie gestuur word nie"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Ons het 'n onversleutelde boodskap ontvang"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Ons het 'n onleesbare versleutelde boodskap ontvang"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -756,7 +762,7 @@ msgstr ""
"\n"
"Indien u die vingerafdrukke bevestig het, klik OK, andersinds klik Kanselleer"
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -771,61 +777,61 @@ msgstr ""
"dieselfde antwoord (lw. hoofletters tel) verskaf, sal hul identiteit "
"bevestig wees."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Wat is u sekuriteitsvraag?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Wat is die antwoord tot die sekuriteitsvraag?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Ongeldige verifikasiemetode verskaf"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"U boodskappe is nie versleutel nie. Klik hier om OTR versleuteling te "
"aktiveer."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
"U boodskappe is versleutel, maar u gespreksmaat se identiteit is not onseker."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr "U boodskappe is versleutel en u gespreksmaat se identiteit bevestig."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
"U gespreksmaat het die private sessie gestaak. U behoort dieselfde te doen"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Beëindig versleutelde gesprek"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Verfris versleutelde gesprek"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Begin versleutelde gesprek"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Bevestig met vingerafdrukke"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Bevestig met SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Wat is hierdie?"
@@ -835,19 +841,19 @@ msgstr "Wat is hierdie?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "nie-privaat"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "onbevestig"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "privaat"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "afgesluit"
@@ -983,35 +989,35 @@ msgstr "Geselserig"
msgid "Extended Away"
msgstr "Weg vir langer"
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Klik om hierdie kontak te verwyder"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Klik om hierdie kontakversoek te aanvaar"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Klik om hierdie kontakversoek te weier"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Klik om met hierdie kontak te klets"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr "Naam"
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Is u seker u wil hierdie gespreksmaat verwyder?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr "Jammer, 'n fout het voorgekom tydens die verwydering van "
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Is u seker dat u hierdie persoon se versoek wil afkeur?"
diff --git a/locale/ca/LC_MESSAGES/converse.po b/locale/ca/LC_MESSAGES/converse.po
index 922213074..2b9342fb7 100644
--- a/locale/ca/LC_MESSAGES/converse.po
+++ b/locale/ca/LC_MESSAGES/converse.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-01-25 17:25+0100\n"
"Last-Translator: Ruben Mansilla \n"
"Language-Team: CA \n"
@@ -26,77 +26,83 @@ msgstr ""
"gt es-hn es-mx es-ni es-pa es-py es-pe es-pr es-us es-uy es-ve\n"
"X-Generator: Poedit 1.8.6\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Elimina els missatges"
+
+#: src/converse-chatview.js:104
msgid "Close this chat box"
msgstr "Tanca aquest quadre del xat"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Missatge personal"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "jo"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "està escrivint"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "ha deixat d'escriure"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "ha marxat"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Mostra aquest menú"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Escriu en tercera persona"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Elimina els missatges"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Segur que voleu esborrar els missatges d'aquest quadre del xat?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr "s'ha desconnectat"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "està ocupat"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Esborra tots els missatges"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr "Amaga la llista d'ocupants"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr "Insereix una cara somrient"
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "Inicia una trucada"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Contactes"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "S'està establint la connexió"
@@ -151,7 +157,7 @@ msgstr "Feu clic per canviar l'estat del xat"
msgid "Custom status"
msgstr "Estat personalitzat"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Desa"
@@ -228,200 +234,200 @@ msgstr "No s'ha trobat cap usuari"
msgid "Click to add as a chat contact"
msgstr "Feu clic per afegir com a contacte del xat"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Canvia de xat"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
#, fuzzy
msgid "Attempting to reconnect"
msgstr "S'intentarà tornar a establir la connexió en 5 segons"
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Error"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "S'està efectuant l'autenticació"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Error d'autenticació"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr "S'ha produït un error en intentar afegir "
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr "Aquest client no admet les subscripcions de presència"
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Tanca aquest quadre del xat"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Minimitza aquest quadre del xat"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Feu clic per restaurar aquest xat"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Minimitzat"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr "Minimitza aquest quadre del xat"
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Missatge"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Error: no s'ha pogut executar l'ordre"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr "Error: el \""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Segur que voleu esborrar els missatges d'aquesta sala?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr "Canvia l'afiliació de l'usuari a administrador"
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Expulsa l'usuari de la sala"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr "Canvia el rol de l'usuari a ocupant"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Expulsa l'usuari de la sala"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "Escriu en tercera persona"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr "Atorga una afiliació a un usuari"
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "Elimina la capacitat de l'usuari de publicar missatges"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Canvieu el vostre àlies"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr "Atorga el rol de moderador a l'usuari"
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "Atorga la propietat d'aquesta sala"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr "Revoca l'afiliació de l'usuari"
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Defineix un tema per a la sala"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "Permet que un usuari silenciat publiqui missatges"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Cancel·la"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "S'ha produït un error en intentar desar el formulari."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Aquesta sala de xat requereix una contrasenya"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Contrasenya:"
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Envia"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Aquesta sala no és anònima"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Aquesta sala ara mostra membres no disponibles"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Aquesta sala no mostra membres no disponibles"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr ""
"S'ha canviat la configuració de la sala no relacionada amb la privadesa"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "El registre de la sala està habilitat"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "El registre de la sala està deshabilitat"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Aquesta sala ara no és anònima"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Aquesta sala ara és parcialment anònima"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Aquesta sala ara és totalment anònima"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "S'ha creat una sala nova"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Se us ha expulsat d'aquesta sala"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Se us ha expulsat d'aquesta sala"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Se us ha eliminat d'aquesta sala a causa d'un canvi d'afiliació"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -429,7 +435,7 @@ msgstr ""
"Se us ha eliminat d'aquesta sala perquè ara només permet membres i no en sou "
"membre"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -447,207 +453,207 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "S'ha expulsat %1$s"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "L'àlies de %1$s ha canviat"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "S'ha expulsat %1$s"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "S'ha eliminat %1$s a causa d'un canvi d'afiliació"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "S'ha eliminat %1$s perquè no és membre"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "El vostre àlies ha canviat automàticament a: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "El vostre àlies ha canviat a: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "El motiu indicat és: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "No sou a la llista de membres d'aquesta sala"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "No s'ha especificat cap àlies"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "No teniu permís per crear sales noves"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "El vostre àlies no s'ajusta a les polítiques d'aquesta sala"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "El vostre àlies ja està en ús"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Aquesta sala (encara) no existeix"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Aquesta sala ha assolit el nombre màxim d'ocupants"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Tema definit per %1$s en: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Aquest usuari és un moderador"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Aquest usuari pot enviar missatges a aquesta sala"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Aquest usuari NO pot enviar missatges a aquesta sala"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
#, fuzzy
msgid "Invite"
msgstr "Convida..."
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Ocupants"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "Esteu a punt de convidar %1$s a la sala de xat \"%2$s\". "
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
"Teniu l'opció d'incloure un missatge per explicar el motiu de la invitació."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Nom de la sala"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Àlies"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Servidor"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Uneix-me a la sala"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Mostra les sales"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Sales"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "No hi ha cap sala a %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Sales a %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Feu clic per obrir aquesta sala"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Mostra més informació d'aquesta sala"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Descripció:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Ocupants:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Característiques:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Cal autenticar-se"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Amagat"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Cal tenir una invitació"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderada"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "No és anònima"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Obre la sala"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Sala permanent"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Pública"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semianònima"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Sala temporal"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "No moderada"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s us ha convidat a unir-vos a una sala de xat: %2$s"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -657,41 +663,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "s'ha desconnectat"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "S'està tornant a establir la sessió xifrada"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "S'està generant la clau privada"
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "És possible que el navegador no respongui."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -707,19 +713,19 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "No s'ha pogut verificar la identitat d'aquest usuari."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "S'està intercanviant la clau privada amb el contacte."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Els vostres missatges ja no estan xifrats"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
@@ -727,27 +733,27 @@ msgstr ""
"Ara, els vostres missatges estan xifrats, però no s'ha verificat la "
"identitat del contacte."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr "S'ha verificat la identitat del contacte."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "El contacte ha conclòs el xifratge; cal que feu el mateix."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "No s'ha pogut enviar el missatge"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Hem rebut un missatge sense xifrar"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Hem rebut un missatge xifrat il·legible"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -768,7 +774,7 @@ msgstr ""
"Si heu confirmat que les empremtes coincideixen, feu clic a D'acord; en cas "
"contrari, feu clic a Cancel·la."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -783,61 +789,61 @@ msgstr ""
"mateixa resposta (es distingeix majúscules de minúscules), se'n verificarà "
"la identitat."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Quina és la vostra pregunta de seguretat?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Quina és la resposta a la pregunta de seguretat?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "S'ha indicat un esquema d'autenticació no vàlid"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Els vostres missatges no estan xifrats. Feu clic aquí per habilitar el "
"xifratge OTR."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
"Els vostres missatges estan xifrats, però no s'ha verificat el contacte."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr "Els vostres missatges estan xifrats i s'ha verificat el contacte."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
"El vostre contacte ha tancat la seva sessió privada; cal que feu el mateix."
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Finalitza la conversa xifrada"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Actualitza la conversa xifrada"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Comença la conversa xifrada"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Verifica amb empremtes"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Verifica amb SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Què és això?"
@@ -847,19 +853,19 @@ msgstr "Què és això?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "sense xifrar"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "sense verificar"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "verificat"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "acabat"
@@ -995,35 +1001,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Feu clic per eliminar aquest contacte"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Feu clic per acceptar aquesta sol·licitud de contacte"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Feu clic per rebutjar aquesta sol·licitud de contacte"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Feu clic per conversar amb aquest contacte"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr "Nom"
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Segur que voleu eliminar aquest contacte?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr "S'ha produït un error en intentar eliminar "
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Segur que voleu rebutjar aquesta sol·licitud de contacte?"
diff --git a/locale/converse.pot b/locale/converse.pot
index 88d6101fa..4da25f4ad 100644
--- a/locale/converse.pot
+++ b/locale/converse.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.10.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -17,77 +17,82 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+msgid "You have unread messages"
+msgstr ""
+
+#: src/converse-chatview.js:104
msgid "Close this chat box"
msgstr ""
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr ""
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr ""
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr ""
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr ""
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr ""
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr ""
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr ""
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr ""
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr ""
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr ""
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr ""
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr ""
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr ""
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr ""
@@ -141,7 +146,7 @@ msgstr ""
msgid "Custom status"
msgstr ""
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr ""
@@ -217,202 +222,202 @@ msgstr ""
msgid "Click to add as a chat contact"
msgstr ""
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr ""
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr ""
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr ""
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr ""
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
msgid "Close this box"
msgstr ""
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
msgid "Minimize this box"
msgstr ""
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr ""
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr ""
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr ""
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr ""
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr ""
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr ""
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr ""
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr ""
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr ""
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr ""
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr ""
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr ""
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr ""
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr ""
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr ""
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr ""
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr ""
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr ""
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr ""
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr ""
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr ""
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr ""
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr ""
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr ""
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr ""
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr ""
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr ""
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -428,204 +433,204 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr ""
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr ""
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr ""
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr ""
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr ""
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr ""
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr ""
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr ""
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr ""
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr ""
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr ""
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr ""
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr ""
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
msgid "This room has reached its maximum number of occupants"
msgstr ""
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr ""
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr ""
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr ""
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr ""
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr ""
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr ""
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr ""
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr ""
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr ""
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr ""
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr ""
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr ""
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr ""
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr ""
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr ""
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr ""
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr ""
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr ""
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr ""
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr ""
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr ""
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr ""
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr ""
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr ""
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr ""
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr ""
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr ""
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr ""
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr ""
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr ""
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr ""
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -633,40 +638,40 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
msgid "has come online"
msgstr ""
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr ""
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr ""
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr ""
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -676,45 +681,45 @@ msgid ""
"%2$s"
msgstr ""
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr ""
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr ""
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr ""
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr ""
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr ""
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr ""
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr ""
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr ""
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -727,7 +732,7 @@ msgid ""
"Cancel."
msgstr ""
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -736,57 +741,57 @@ msgid ""
"exact same answer (case sensitive), their identity will be verified."
msgstr ""
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr ""
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr ""
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr ""
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr ""
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr ""
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr ""
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr ""
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr ""
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr ""
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr ""
@@ -796,19 +801,19 @@ msgstr ""
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr ""
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr ""
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr ""
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr ""
@@ -938,34 +943,34 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr ""
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr ""
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr ""
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr ""
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr ""
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr ""
diff --git a/locale/de/LC_MESSAGES/converse.po b/locale/de/LC_MESSAGES/converse.po
index 3b9f1221c..08e1ea96a 100644
--- a/locale/de/LC_MESSAGES/converse.po
+++ b/locale/de/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:20+0000\n"
"Last-Translator: JC Brand \n"
"Language-Team: German\n"
@@ -20,81 +20,87 @@ msgstr ""
"lang: de\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Nachrichten entfernen"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Hier klicken um diesen Chat wiederherzustellen"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Persönliche Nachricht"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "Ich"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "tippt"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "tippt nicht mehr"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "ist jetzt abwesend"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Dieses Menü anzeigen"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "In der dritten Person schreiben"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Nachrichten entfernen"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr ""
"Sind Sie sicher, dass Sie alle Nachrichten dieses Chats löschen möchten?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
#, fuzzy
msgid "has gone offline"
msgstr "Dieser Kontakt ist offline"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "ist beschäftigt"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Alle Nachrichten löschen"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
#, fuzzy
msgid "Hide the list of occupants"
msgstr "Teilnehmerliste ausblenden"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Kontakte"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Verbindungsaufbau …"
@@ -150,7 +156,7 @@ msgstr "Hier klicken um Status zu ändern"
msgid "Custom status"
msgstr "Statusnachricht"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Speichern"
@@ -227,206 +233,206 @@ msgstr "Keine Benutzer gefunden"
msgid "Click to add as a chat contact"
msgstr "Hier klicken um als Kontakt hinzuzufügen"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Chat ein-/ausblenden"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Fehler"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Authentifizierung"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Authentifizierung gescheitert"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Hier klicken um diesen Chat wiederherzustellen"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Minimiert"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Hier klicken um diesen Chat wiederherzustellen"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Minimiert"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Nachricht"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Fehler: Konnte den Befehl nicht ausführen"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr ""
"Sind Sie sicher, dass Sie alle Nachrichten in diesem Raum löschen möchten?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Verbanne einen Benutzer aus dem Raum."
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
#, fuzzy
msgid "Change user role to occupant"
msgstr "Benutzerrolle zu Teilnehmer ändern"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Werfe einen Benutzer aus dem Raum."
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "In der dritten Person schreiben"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Spitznamen ändern"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "Besitzrechte an diesem Raum vergeben"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Chatraum Thema festlegen"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Abbrechen"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Beim Speichern des Formulars ist ein Fehler aufgetreten."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Dieser Raum erfordert ein Passwort"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Passwort: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Abschicken"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Dieser Raum ist nicht anonym"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Dieser Raum zeigt jetzt nicht verfügbare Mitglieder an"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Dieser Raum zeigt jetzt nicht verfügbare Mitglieder nicht an"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Die Raumkonfiguration hat sich geändert (nicht Privatsphäre relevant)"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Nachrichten in diesem Raum werden ab jetzt protokolliert."
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Nachrichten in diesem Raum werden nicht mehr protokolliert."
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Dieser Raum ist jetzt nicht anonym"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Dieser Raum ist jetzt teils anonym"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Dieser Raum ist jetzt anonym"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Ein neuer Raum wurde erstellt"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Sie sind aus diesem Raum verbannt worden"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Sie wurden aus diesem Raum hinausgeworfen"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Sie wurden wegen einer Zugehörigkeitsänderung entfernt"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr "Sie wurden aus diesem Raum entfernt, da Sie kein Mitglied sind."
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -444,206 +450,206 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s ist verbannt worden"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "%1$s hat den Spitznamen geändert"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s wurde hinausgeworfen"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr ""
"%1$s wurde wegen einer Zugehörigkeitsänderung entfernt"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s ist kein Mitglied und wurde daher entfernt"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Ihr Spitzname wurde automatisiert geändert zu: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "Ihr Spitzname wurde geändert zu: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "Die angegebene Begründung lautet: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Sie sind nicht auf der Mitgliederliste dieses Raums"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Kein Spitzname festgelegt"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Es ist Ihnen nicht erlaubt neue Räume anzulegen"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Ungültiger Spitzname"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Ihre Spitzname existiert bereits."
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Dieser Raum existiert (noch) nicht"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Dieser Raum hat die maximale Mitgliederanzahl erreicht"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "%1$s hat das Thema zu \"%2$s\" geändert"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Dieser Benutzer ist ein Moderator"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Dieser Benutzer kann Nachrichten in diesem Raum verschicken"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Einladen"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Teilnehmer"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Raumname"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Spitzname"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Server"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Raum betreten"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Räume anzeigen"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Räume"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Keine Räume auf %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Räume auf %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Hier klicken um diesen Raum zu öffnen"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Mehr Information über diesen Raum zeigen"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Beschreibung"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Teilnehmer"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Funktionen:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Authentifizierung erforderlich"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Versteckt"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Einladung erforderlich"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderiert"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Nicht anonym"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Offener Raum"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Dauerhafter Raum"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Öffentlich"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Teils anonym"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Vorübergehender Raum"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Unmoderiert"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s hat Sie in den Raum \"%2$s\" eingeladen"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -651,41 +657,41 @@ msgstr "%1$s hat Sie in den Raum \"%2$s\" eingeladen. Begründung: \"%3$s\""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "Dieser Kontakt ist offline"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Verschlüsselte Sitzung wiederherstellen"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Generiere privaten Schlüssel."
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Ihr Browser könnte langsam reagieren."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -700,45 +706,45 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Die Identität des Benutzers konnte nicht verifiziert werden."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "Tausche private Schlüssel mit Kontakt aus."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr ""
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr ""
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr ""
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Ihre Nachricht konnte nicht gesendet werden"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Wir haben eine unverschlüsselte Nachricht empfangen"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Wir haben eine unlesbare Nachricht empfangen"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -751,7 +757,7 @@ msgid ""
"Cancel."
msgstr ""
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -760,57 +766,57 @@ msgid ""
"exact same answer (case sensitive), their identity will be verified."
msgstr ""
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr ""
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr ""
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr ""
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr ""
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr ""
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr ""
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr ""
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr ""
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr ""
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Was ist das?"
@@ -820,19 +826,19 @@ msgstr "Was ist das?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "unverschlüsselt"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "nicht verifiziert"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "verifiziert"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "erledigt"
@@ -962,35 +968,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Hier klicken um diesen Kontakt zu entfernen"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Hier klicken um diese Kontaktanfrage zu akzeptieren"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Hier klicken um diese Kontaktanfrage zu abzulehnen"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Hier klicken um mit diesem Kontakt zu chatten"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Wollen Sie diesen Kontakt wirklich entfernen?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Wollen Sie diese Kontaktanfrage wirklich ablehnen?"
diff --git a/locale/en/LC_MESSAGES/converse.po b/locale/en/LC_MESSAGES/converse.po
index bc721a89c..d6bbcfce0 100644
--- a/locale/en/LC_MESSAGES/converse.po
+++ b/locale/en/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2015-05-01 12:37+0200\n"
"Last-Translator: JC Brand \n"
"Language-Team: English\n"
@@ -17,77 +17,83 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Remove messages"
+
+#: src/converse-chatview.js:104
msgid "Close this chat box"
msgstr ""
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr ""
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr ""
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr ""
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr ""
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr ""
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Show this menu"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Write in the third person"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Remove messages"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr ""
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr ""
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr ""
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr ""
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr ""
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr ""
@@ -142,7 +148,7 @@ msgstr "Click to change your chat status"
msgid "Custom status"
msgstr "Custom status"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Save"
@@ -219,196 +225,196 @@ msgstr ""
msgid "Click to add as a chat contact"
msgstr ""
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr ""
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr ""
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr ""
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr ""
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
msgid "Close this box"
msgstr ""
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
msgid "Minimize this box"
msgstr ""
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr ""
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr ""
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Message"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr ""
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr ""
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr ""
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr ""
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr ""
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr ""
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Cancel"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "An error occurred while trying to save the form."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "This chatroom requires a password"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Password: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Submit"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "This room is not anonymous"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "This room now shows unavailable members"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "This room does not show unavailable members"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Non-privacy-related room configuration has changed"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Room logging is now enabled"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Room logging is now disabled"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "This room is now non-anonymous"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "This room is now semi-anonymous"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "This room is now fully-anonymous"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "A new room has been created"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "You have been banned from this room"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "You have been kicked from this room"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "You have been removed from this room because of an affiliation change"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -416,7 +422,7 @@ msgstr ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -434,206 +440,206 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s has been banned"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr ""
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s has been kicked out"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr ""
"%1$s has been removed because of an affiliation change"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s has been removed for not being a member"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr ""
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr ""
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "You are not on the member list of this room"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "No nickname was specified"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "You are not allowed to create new rooms"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Your nickname doesn't conform to this room's policies"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Your nickname is already taken"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "This room does not (yet) exist"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "This room has reached it's maximum number of occupants"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Topic set by %1$s to: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "This user is a moderator"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "This user can send messages in this room"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "This user can NOT send messages in this room"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr ""
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr ""
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr ""
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr ""
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Server"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr ""
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr ""
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr ""
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr ""
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Rooms on %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Click to open this room"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Show more information on this room"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Description:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Occupants:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Features:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Requires authentication"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Hidden"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Requires an invitation"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderated"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Non-anonymous"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Open room"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Permanent room"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Public"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semi-anonymous"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Temporary room"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Unmoderated"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr ""
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -641,40 +647,40 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
msgid "has come online"
msgstr ""
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr ""
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr ""
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr ""
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -684,45 +690,45 @@ msgid ""
"%2$s"
msgstr ""
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr ""
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr ""
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr ""
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr ""
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr ""
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr ""
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr ""
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr ""
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -735,7 +741,7 @@ msgid ""
"Cancel."
msgstr ""
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -744,57 +750,57 @@ msgid ""
"exact same answer (case sensitive), their identity will be verified."
msgstr ""
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr ""
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr ""
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr ""
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr ""
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr ""
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr ""
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr ""
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr ""
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr ""
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr ""
@@ -804,19 +810,19 @@ msgstr ""
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr ""
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr ""
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr ""
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr ""
@@ -946,35 +952,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Click to remove this contact"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr ""
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr ""
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Click to chat with this contact"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr ""
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr ""
diff --git a/locale/es/LC_MESSAGES/converse.po b/locale/es/LC_MESSAGES/converse.po
index cf1845c7c..a3cc1e5fd 100644
--- a/locale/es/LC_MESSAGES/converse.po
+++ b/locale/es/LC_MESSAGES/converse.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:21+0000\n"
"Last-Translator: Javier Lopez \n"
"Language-Team: ES \n"
@@ -25,82 +25,88 @@ msgstr ""
"X-Is-Fallback-For: es-ar es-bo es-cl es-co es-cr es-do es-ec es-es es-sv es-"
"gt es-hn es-mx es-ni es-pa es-py es-pe es-pr es-us es-uy es-ve\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Eliminar mensajes"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Haga click para eliminar este contacto"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Mensaje personal"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "yo"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr ""
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr ""
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
#, fuzzy
msgid "has gone away"
msgstr "Este contacto está ausente"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Mostrar este menú"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Escribir en tercera persona"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Eliminar mensajes"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "¿Está seguro de querer limpiar los mensajes de esta conversación?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
#, fuzzy
msgid "has gone offline"
msgstr "Este contacto está desconectado"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
#, fuzzy
msgid "is busy"
msgstr "ocupado"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
#, fuzzy
msgid "Clear all messages"
msgstr "Mensaje personal"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Contactos"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Conectando"
@@ -158,7 +164,7 @@ msgstr "Haga click para cambiar su estatus de chat"
msgid "Custom status"
msgstr "Personalizar estatus"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Guardar"
@@ -236,205 +242,205 @@ msgstr "Sin usuarios encontrados"
msgid "Click to add as a chat contact"
msgstr "Haga click para agregar como contacto de chat"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Chat"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Error"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Autenticando"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "La autenticación falló"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Haga click para eliminar este contacto"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Minimizado"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Haga click para eliminar este contacto"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Minimizado"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Mensaje"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "¿Está seguro de querer limpiar los mensajes de esta sala?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
#, fuzzy
msgid "Ban user from room"
msgstr "Prohibir usuario de sala de chat."
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
#, fuzzy
msgid "Kick user from room"
msgstr "Expulsar usuario de sala de chat."
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
#, fuzzy
msgid "Write in 3rd person"
msgstr "Escribir en tercera persona"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
#, fuzzy
msgid "Grant ownership of this room"
msgstr "Usted no está en la lista de miembros de esta sala"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
#, fuzzy
msgid "Set room topic"
msgstr "Definir tema de sala de chat"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Cancelar"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Un error ocurrío mientras se guardaba el formulario."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Esta sala de chat requiere una contraseña."
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Contraseña: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Enviar"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Esta sala no es para usuarios anónimos"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Esta sala ahora muestra los miembros no disponibles"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Esta sala no muestra los miembros no disponibles"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr ""
"Una configuración de la sala no relacionada con la privacidad ha sido "
"cambiada"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "El registro de la sala ahora está habilitado"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "El registro de la sala ahora está deshabilitado"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Esta sala ahora es pública"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Esta sala ahora es semi-anónima"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Esta sala ahora es completamente anónima"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Una nueva sala ha sido creada"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Usted ha sido bloqueado de esta sala"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Usted ha sido expulsado de esta sala"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Usted ha sido eliminado de esta sala debido a un cambio de afiliación"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -442,7 +448,7 @@ msgstr ""
"Usted ha sido eliminado de esta sala debido a que la sala cambio su "
"configuración a solo-miembros y usted no es un miembro"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -460,210 +466,210 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s ha sido bloqueado"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
#, fuzzy
msgid "%1$s's nickname has changed"
msgstr "%1$s ha sido bloqueado"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s ha sido expulsado"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr ""
"%1$s ha sido eliminado debido a un cambio de afiliación"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s ha sido eliminado debido a que no es miembro"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
#, fuzzy
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Su apodo ha sido cambiado"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
#, fuzzy
msgid "Your nickname has been changed to: %1$s"
msgstr "Su apodo ha sido cambiado"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Usted no está en la lista de miembros de esta sala"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Sin apodo especificado"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Usted no esta autorizado para crear nuevas salas"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Su apodo no se ajusta a la política de esta sala"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Su apodo ya ha sido tomando por otro usuario"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Esta sala (aún) no existe"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Esta sala ha alcanzado su número máximo de ocupantes"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Tema fijado por %1$s a: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Este usuario es un moderador"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Este usuario puede enviar mensajes en esta sala"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Este usuario NO puede enviar mensajes en esta"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr ""
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Ocupantes"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Nombre de sala"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Apodo"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Servidor"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
#, fuzzy
msgid "Join Room"
msgstr "Unirse"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Mostrar salas"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Salas"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Sin salas en %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Salas en %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Haga click para abrir esta sala"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Mostrar más información en esta sala"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Descripción"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Ocupantes:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Características:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Autenticación requerida"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Oculto"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Requiere una invitación"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderado"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "No anónimo"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Abrir sala"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Sala permanente"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Pública"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semi anónimo"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Sala temporal"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Sin moderar"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr ""
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -671,41 +677,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "Este contacto está desconectado"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Re-estableciendo sesión cifrada"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Generando llave privada"
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Su navegador podría dejar de responder por un momento"
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
#, fuzzy
msgid ""
"Authentication request from %1$s\n"
@@ -721,20 +727,20 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "No se pudo verificar la identidad de este usuario"
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
#, fuzzy
msgid "Exchanging private key with contact."
msgstr "Intercambiando llaves privadas"
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Sus mensajes han dejado de cifrarse"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
#, fuzzy
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
@@ -743,29 +749,29 @@ msgstr ""
"Sus mensajes están ahora cifrados pero la identidad de su contacto no ha "
"sido verificada."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
#, fuzzy
msgid "Your contact's identify has been verified."
msgstr "La identidad de su contacto ha sido confirmada"
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
#, fuzzy
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "Su contacto finalizó la sesión cifrada, debería hacer lo mismo"
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Su mensaje no se pudo enviar"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Se recibío un mensaje sin cifrar"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Se recibío un mensaje cifrado corrupto"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -786,7 +792,7 @@ msgstr ""
"Después de confirmar los identificadores haga click en OK, cancele si no "
"concuerdan."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
#, fuzzy
msgid ""
"You will be prompted to provide a security question and then an answer to "
@@ -800,63 +806,63 @@ msgstr ""
"La pregunta que responda se le hará a su contacto, si las respuestas "
"concuerdan (cuidando mayúsculas/minúsculas) su identidad quedará verificada."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Introduzca su pregunta de seguridad"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Introduzca la respuesta a su pregunta de seguridad"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Esquema de autenticación inválido"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Sus mensajes no están cifrados. Haga click aquí para habilitar el cifrado OTR"
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
#, fuzzy
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
"Sus mensajes están cifrados pero la identidad de su contacto no ha sido "
"verificada"
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
#, fuzzy
msgid "Your messages are encrypted and your contact verified."
msgstr "Sus mensajes están cifrados y su contacto ha sido verificado"
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
#, fuzzy
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "Su contacto finalizó la sesión cifrada, debería hacer lo mismo"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Finalizar sesión cifrada"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Actualizar sesión cifrada"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Iniciar sesión cifrada"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Verificar con identificadores"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Verificar con SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "¿Qué es esto?"
@@ -866,19 +872,19 @@ msgstr "¿Qué es esto?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "texto plano"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "sin verificar"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "verificado"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "finalizado"
@@ -1009,37 +1015,37 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Haga click para eliminar este contacto"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
#, fuzzy
msgid "Click to accept this contact request"
msgstr "Haga click para eliminar este contacto"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
#, fuzzy
msgid "Click to decline this contact request"
msgstr "Haga click para eliminar este contacto"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Haga click para conversar con este contacto"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "¿Esta seguro de querer eliminar este contacto?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
#, fuzzy
msgid "Are you sure you want to decline this contact request?"
msgstr "¿Esta seguro de querer eliminar este contacto?"
diff --git a/locale/fr/LC_MESSAGES/converse.po b/locale/fr/LC_MESSAGES/converse.po
index 844329267..384ad6d42 100644
--- a/locale/fr/LC_MESSAGES/converse.po
+++ b/locale/fr/LC_MESSAGES/converse.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:22+0000\n"
"Language-Team: FR \n"
"Language: fr\n"
@@ -20,79 +20,85 @@ msgstr ""
"Domain: converse\n"
"domain: converse\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Effacer les messages"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Cliquez pour afficher cette discussion"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Message personnel"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "moi"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "écrit"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "a arrêté d'écrire"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "est parti"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Afficher ce menu"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Écrire à la troisième personne"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Effacer les messages"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Êtes-vous sûr de vouloir supprimer les messages de cette conversation?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr "s'est déconnecté"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "est occupé"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Supprimer tous les messages"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
#, fuzzy
msgid "Hide the list of occupants"
msgstr "Cacher la liste des participants"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "Démarrer un appel"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Contacts"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Connexion"
@@ -148,7 +154,7 @@ msgstr "Cliquez pour changer votre statut"
msgid "Custom status"
msgstr "Statut personnel"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Enregistrer"
@@ -225,199 +231,199 @@ msgstr "Aucun utilisateur trouvé"
msgid "Click to add as a chat contact"
msgstr "Cliquer pour ajouter aux contacts"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Ouvrir IM"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Erreur"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Authentification"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "L'authentification a échoué"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Cliquez pour afficher cette discussion"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Réduit(s)"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Cliquez pour afficher cette discussion"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Réduit(s)"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Message"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Erreur: la commande ne peut pas être exécutée"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Etes-vous sûr de vouloir supprimer les messages de ce salon ?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr "Changer le rôle de l'utilisateur en administrateur"
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Bannir l'utilisateur du salon"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
#, fuzzy
msgid "Change user role to occupant"
msgstr "Changer le rôle de l'utilisateur en participant"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Expulser l'utilisateur du salon"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "Écrire à la troisième personne"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr "Autoriser l'utilisateur à être membre"
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "Retirer le droit d'envoyer des messages"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Changer votre alias"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr "Changer le rôle de l'utilisateur en modérateur"
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "Accorder la propriété à ce salon"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr "Révoquer l'utilisateur des membres"
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Indiquer le sujet du salon"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "Autoriser les utilisateurs muets à poster des messages"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Annuler"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Une erreur est survenue lors de l'enregistrement du formulaire."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Ce salon nécessite un mot de passe."
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Mot de passe: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Soumettre"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Ce salon n'est pas anonyme"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Ce salon affiche maintenant les membres indisponibles"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Ce salon n'affiche pas les membres indisponibles"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Les paramètres du salon non liés à la confidentialité ont été modifiés"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Le logging du salon est activé"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Le logging du salon est désactivé"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Ce salon est maintenant non-anonyme"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Ce salon est maintenant semi-anonyme"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Ce salon est maintenant entièrement anonyme"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Un nouveau salon a été créé"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Vous avez été banni de ce salon"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Vous avez été expulsé de ce salon"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Vous avez été retiré de ce salon du fait d'un changement d'affiliation"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -425,7 +431,7 @@ msgstr ""
"Vous avez été retiré de ce salon parce que ce salon est devenu réservé aux "
"membres et vous n'êtes pas membre"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -443,97 +449,97 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s a été banni"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "%1$s a changé son nom"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s a été expulsé"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr ""
"%1$s a été supprimé à cause d'un changement d'affiliation"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s a été supprimé car il n'est pas membre"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Votre alias a été modifié automatiquement en: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "Votre alias a été modifié en: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "La raison indiquée est: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Vous n'êtes pas dans la liste des membres de ce salon"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Aucun alias n'a été indiqué"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Vous n'êtes pas autorisé à créer des salons"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Votre alias n'est pas conforme à la politique de ce salon"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Votre alias est déjà utilisé"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Ce salon n'existe pas encore"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Ce salon a atteint la limite maximale d'occupants"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Le sujet '%2$s' a été défini par %1$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Cet utilisateur est modérateur"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Cet utilisateur peut envoyer des messages dans ce salon"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Cet utilisateur ne peut PAS envoyer de messages dans ce salon"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Inviter"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Participants:"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "Vous vous apprêtez à inviter %1$s dans le salon \"%2$s\". "
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
@@ -541,110 +547,110 @@ msgstr ""
"Vous pouvez facultativement ajouter un message, expliquant la raison de "
"cette invitation."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Nom du salon"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Alias"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Serveur"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Rejoindre"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Afficher les salons"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Salons"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Aucun salon dans %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Salons dans %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Cliquer pour ouvrir ce salon"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Afficher davantage d'informations sur ce salon"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Description:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Participants:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Caractéristiques:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Nécessite une authentification"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Masqué"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Nécessite une invitation"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Modéré"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Non-anonyme"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Ouvrir un salon"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Salon permanent"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Public"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semi-anonyme"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Salon temporaire"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Non modéré"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s vous invite à rejoindre le salon: %2$s"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -653,41 +659,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "s'est déconnecté"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Rétablissement de la session encryptée"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Génération de la clé privée"
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Votre navigateur pourrait ne plus répondre"
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -703,19 +709,19 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "L'identité de cet utilisateur ne peut pas être vérifiée"
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "Échange de clé privée avec le contact"
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Vos messages ne sont plus cryptés"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
@@ -723,28 +729,28 @@ msgstr ""
"Vos messages sont maintenant cryptés mais l'identité de votre contact n'a "
"pas econre été véfifiée"
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr "L'identité de votre contact a été vérifiée"
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
"Votre contact a arrêté le cryptage de son côté, vous devriez le faire aussi"
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Votre message ne peut pas être envoyé"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Un message non crypté a été reçu"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Un message crypté illisible a été reçu"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -766,7 +772,7 @@ msgstr ""
"Si vous avez confirmé que les empreintes correspondent, cliquez OK, sinon "
"cliquez Annuler."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -780,32 +786,32 @@ msgstr ""
"Votre contact devra répondre à la même question et s'il fournit la même "
"réponse (sensible à la casse), son identité sera vérifiée."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Quelle est votre question de sécurité?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Quelle est la réponse à la question de sécurité?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Schéma d'authentification fourni non valide"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Vos messges ne sont pas cryptés. Cliquez ici pour activer le cryptage OTR"
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "Vos messges sont cryptés, mais votre contact n'a pas été vérifié"
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr "Vos messages sont cryptés et votre contact est vérifié"
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
@@ -813,27 +819,27 @@ msgstr ""
"Votre contact a fermé la session privée de son côté, vous devriez le faire "
"aussi"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Terminer la conversation cryptée"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Actualiser la conversation cryptée"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Démarrer une conversation cryptée"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Vérifier par empreintes de sécurité"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Vérifier par Question/Réponse"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Qu'est-ce qu'une conversation cryptée?"
@@ -843,19 +849,19 @@ msgstr "Qu'est-ce qu'une conversation cryptée?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "non crypté"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "non vérifié"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "vérifié"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "terminé"
@@ -990,35 +996,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Cliquez pour supprimer ce contact"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Cliquez pour accepter la demande de ce contact"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Cliquez pour refuser la demande de ce contact"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Cliquez pour discuter avec ce contact"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Êtes-vous sûr de vouloir supprimer ce contact?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Êtes-vous sûr de vouloir refuser la demande de ce contact?"
diff --git a/locale/he/LC_MESSAGES/converse.po b/locale/he/LC_MESSAGES/converse.po
index 284d7c6d5..fd3983f08 100644
--- a/locale/he/LC_MESSAGES/converse.po
+++ b/locale/he/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.8.8\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:21+0000\n"
"Last-Translator: GreenLunar \n"
"Language-Team: Rahut \n"
@@ -20,79 +20,85 @@ msgstr ""
"X-Language: he\n"
"X-Source-Language: en\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "הסר הודעות"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "לחץ כדי לשחזר את שיחה זו"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "הודעה אישית"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "אני"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "מקליד(ה) כעת"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "חדל(ה) להקליד"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "נעדר(ת)"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "הצג את תפריט זה"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "כתוב בגוף השלישי"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "הסר הודעות"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "האם אתה בטוח כי ברצונך לטהר את ההודעות מתוך תיבת שיחה זה?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr "כבר לא מקוון"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "עסוק(ה) כעת"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "טהר את כל ההודעות"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
#, fuzzy
msgid "Hide the list of occupants"
msgstr "הסתר רשימת משתתפים"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr "הכנס סמיילי"
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "התחל שיחה"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "אנשי קשר"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "כעת מתחבר"
@@ -148,7 +154,7 @@ msgstr "לחץ כדי לשנות את הודעת השיחה שלך"
msgid "Custom status"
msgstr "מצב מותאם"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "שמור"
@@ -225,208 +231,208 @@ msgstr "לא נמצאו משתמשים"
msgid "Click to add as a chat contact"
msgstr "לחץ כדי להוסיף בתור איש קשר שיחה"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "הפעל שיח"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
#, fuzzy
msgid "Attempting to reconnect"
msgstr "מנסה להתחבר בעוד 5 שניות"
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "שגיאה"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "כעת מאמת"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "אימות נכשל"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr "מצטערים, היתה שגיאה במהלך ניסיון הוספת "
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr "לקוח זה לא מתיר הרשמות נוכחות"
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "לחץ כדי לשחזר את שיחה זו"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "ממוזער"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "לחץ כדי לשחזר את שיחה זו"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "ממוזער"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "הודעה"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "שגיאה: לא היתה אפשרות לבצע פקודה"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "האם אתה בטוח כי ברצונך לטהר את ההודעות מתוך חדר זה?"
# שייכות
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr "שנה סינוף משתמש למנהל"
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "אסור משתמש מתוך חדר"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
#, fuzzy
msgid "Change user role to occupant"
msgstr "שנה תפקיד משתמש למשתתף"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "בעט משתמש מתוך חדר"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "כתוב בגוף שלישי"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr "הענק חברות למשתמש"
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "הסר יכולת משתמש לפרסם הודעות"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "שנה את השם כינוי שלך"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr "הענק תפקיד אחראי למשתמש"
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "הענק בעלות על חדר זה"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr "שלול חברות משתמש"
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "קבע נושא חדר"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "התר למשתמש מושתק לפרסם הודעות"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "ביטול"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "אירעה שגיאה במהלך ניסיון שמירת הטופס."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "חדר שיחה זה מצריך סיסמה"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "סיסמה: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "שלח"
# חדר זה אינו עלום
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "חדר זה אינו אנונימי"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "חדר זה כעת מציג חברים לא זמינים"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "חדר זה לא מציג חברים לא זמינים"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "תצורת חדר אשר לא-קשורה-בפרטיות שונתה"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "יומן חדר הינו מופעל כעת"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "יומן חדר הינו מנוטרל כעת"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "חדר זה אינו אנונימי כעת"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "חדר זה הינו אנונימי-למחצה כעת"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "חדר זה הינו אנונימי-לחלוטין כעת"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "חדר חדש נוצר"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "נאסרת מתוך חדר זה"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "נבעטת מתוך חדר זה"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "הוסרת מתוך חדר זה משום שינוי שיוך"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr "הוסרת מתוך חדר זה משום שהחדר שונה לחברים-בלבד ואינך במעמד של חבר"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -444,211 +450,211 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s נאסר(ה)"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "השם כינוי של%1$s השתנה"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s נבעט(ה)"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "%1$s הוסרה(ה) משום שינוי שיוך"
# היותו(ה)
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s הוסר(ה) משום אי הימצאות במסגרת מעמד של חבר"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "השם כינוי שלך שונה אוטומטית בשם: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "השם כינוי שלך שונה בשם: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "הסיבה שניתנה היא: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "אינך ברשימת החברים של חדר זה"
# אף שם כינוי לא צוין
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "לא צוין שום שם כינוי"
# אינך מורשה
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "אין לך רשות ליצור חדרים חדשים"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "השם כינוי שלך לא תואם את המדינויות של חדר זה"
# נלקח כבר
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "השם כינוי שלך הינו תפוס"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "חדר זה (עדיין) לא קיים"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "חדר זה הגיע לסף הנוכחים המרבי שלו"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "נושא חדר זה נקבע על ידי %1$s אל: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "משתמש זה הינו אחראי"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "משתמש זה מסוגל לשלוח הודעות בתוך חדר זה"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "משתמש זה ﬥﬡ מסוגל לשלוח הודעות בתוך חדר זה"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "הזמנה"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "נוכחים"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "אתה עומד להזמין את %1$s לחדר שיחה \"%2$s\". "
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr "באפשרותך להכליל הודעה, אשר מסבירה את הסיבה להזמנה."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "שם חדר"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "שם כינוי"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "שרת"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "הצטרף לחדר"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "הצג חדרים"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "חדרים"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "אין חדרים על %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "חדרים על %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "לחץ כדי לפתוח את חדר זה"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "הצג עוד מידע אודות חדר זה"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "תיאור:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "נוכחים:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "תכונות:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "מצריך אישור"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "נסתר"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "מצריך הזמנה"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "מבוקר"
# לא-עלום
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "לא-אנונימי"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "חדר פתוח"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "חדר צמיתה"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "פומבי"
# עלום-למחצה
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "אנונימי-למחצה"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "חדר זמני"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "לא מבוקר"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s הזמינך להצטרף לחדר שיחה: %2$s"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -656,41 +662,41 @@ msgstr "%1$s הזמינך להצטרף לחדר שיחה: %2$s, והשאיר א
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "כבר לא מקוון"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "בסס מחדש ישיבה מוצפנת"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "כעת מפיק מפתח פרטי."
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "הדפדפן שלך עשוי שלא להגיב."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -705,45 +711,45 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "לא היתה אפשרות לאמת את זהות משתמש זה."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "מחליף מפתח פרטי עם איש קשר."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "ההודעות שלך אינן מוצפנות עוד"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr "ההודעות שלך מוצפנות כעת אך זהות האיש קשר שלך טרם אומתה."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr "זהות האיש קשר שלך אומתה."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "האיש קשר סיים הצפנה בקצה שלהם, עליך לעשות זאת גם כן."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "ההודעה שלך לא היתה יכולה להישלח"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "אנחנו קיבלנו הודעה לא מוצפנת"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "אנחנו קיבלנו הודעה מוצפנת לא קריאה"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -764,7 +770,7 @@ msgstr ""
"היה ואימתת כי טביעות האצבע תואמות, לחץ אישור (OK), אחרת לחץ ביטול (Cancel)."
# הקצה השני
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -777,58 +783,58 @@ msgstr ""
"האיש קשר יתבקש עובר זאת לאותה שאלת אבטחה ואם אלו יקלידו את אותה התשובה "
"במדויק (case sensitive), זהותם תאומת."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "מהי שאלת האבטחה שלך?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "מהי התשובה לשאלת האבטחה?"
# תרשים
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "סופקה סכימת אימות שגויה"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr "ההודעות שלך אינן מוצפנות. לחץ כאן כדי לאפשר OTR."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "ההודעות שלך מוצפנות כעת, אך האיש קשר שלך טרם אומת."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr "ההודעות שלך מוצפנות כעת והאיש קשר שלך אומת."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "האיש קשר סגר את קצה ישיבה פרטית שלהם, עליך לעשות זאת גם כן"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "סיים ישיבה מוצפנת"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "רענן ישיבה מוצפנת"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "התחל ישיבה מוצפנת"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "אמת בעזרת טביעות אצבע"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "אמת בעזרת SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "מה זה?"
@@ -838,19 +844,19 @@ msgstr "מה זה?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "לא מוצפנת"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "לא מאומתת"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "מאומתת"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "מוגמרת"
@@ -983,35 +989,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "לחץ כדי להסיר את איש קשר זה"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "לחץ כדי לקבל את בקשת איש קשר זה"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "לחץ כדי לסרב את בקשת איש קשר זה"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "לחץ כדי לשוחח עם איש קשר זה"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr "שם"
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "האם אתה בטוח כי ברצונך להסיר את איש קשר זה?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr "מצטערים, היתה שגיאה במהלך ניסיון להסיר את "
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "האם אתה בטוח כי ברצונך לסרב את בקשת איש קשר זה?"
diff --git a/locale/hu/LC_MESSAGES/converse.po b/locale/hu/LC_MESSAGES/converse.po
index e2d8c366b..d8ff59576 100644
--- a/locale/hu/LC_MESSAGES/converse.po
+++ b/locale/hu/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.8.8\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:23+0000\n"
"Last-Translator: Meskó Balázs \n"
"Language-Team: Hungarian\n"
@@ -20,77 +20,83 @@ msgstr ""
"plural_forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.5\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Üzenetek törlése"
+
+#: src/converse-chatview.js:104
msgid "Close this chat box"
msgstr "A csevegés bezárása"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Személyes üzenet"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "Én"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "gépel..."
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "már nem gépel"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "távol van"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Mutasd a menüt"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Írjon egyes szám harmadik személyben"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Üzenetek törlése"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Törölni szeretné az eddigi üzeneteket?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr "kijelentkezett"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "elfoglalt"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Üzenetek törlése"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr "A résztvevők listájának elrejtése"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr "Hangulatjel beszúrása"
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "Hívás indítása"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Kapcsolatok"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Kapcsolódás"
@@ -145,7 +151,7 @@ msgstr "Saját státusz beállítása"
msgid "Custom status"
msgstr "Egyedi státusz"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Ment"
@@ -222,199 +228,199 @@ msgstr "Nincs felhasználó"
msgid "Click to add as a chat contact"
msgstr "Felvétel a csevegőpartnerek közé"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Csevegőablak"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
#, fuzzy
msgid "Attempting to reconnect"
msgstr "Újrakapcsolódás 5 másodperc múlva"
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Hiba"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Azonosítás"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Azonosítási hiba"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr "Sajnáljuk, hiba történt a hozzáadás során"
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr "Ez a kliens nem engedélyezi a jelenlét követését"
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "A csevegés bezárása"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "A csevegés minimalizálása"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "A csevegés visszaállítása"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Minimalizálva"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr "A csevegés minimalizálása"
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Üzenet"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Hiba: A parancs nem értelmezett"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr "Hiba: a \""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Törölni szeretné az üzeneteket ebből a szobából?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr "A felhasználó adminisztrátorrá tétele"
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Felhasználó kitíltása a csevegőszobából"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr "A felhasználó taggá tétele"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Felhasználó kiléptetése a csevegőszobából"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "Írjon egyes szám harmadik személyben"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr "Tagság megadása a felhasználónak"
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "A felhasználó nem küldhet üzeneteket"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Becenév módosítása"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr "Moderátori jog adása a felhasználónak"
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "A szoba tulajdonjogának megadása"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr "Tagság megvonása a felhasználótól"
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Csevegőszoba téma beállítása"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "Elnémított felhasználók is küldhetnek üzeneteket"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Mégsem"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Hiba történt az adatok mentése közben."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "A csevegőszobába belépéshez jelszó szükséges"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Jelszó: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Küldés"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Ez a szoba NEM névtelen"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Ez a szoba mutatja az elérhetetlen tagokat"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Ez a szoba nem mutatja az elérhetetlen tagokat"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "A szoba általános konfigurációja módosult"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "A szobába a belépés lehetséges"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "A szobába a belépés szünetel"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Ez a szoba most NEM névtelen"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Ez a szoba most félig névtelen"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Ez a szoba most teljesen névtelen"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Létrejött egy új csevegőszoba"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Ki lettél tíltva ebből a szobából"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Ki lettél dobva ebből a szobából"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Taglista módosítás miatt kiléptettünk a csevegőszobából"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -422,7 +428,7 @@ msgstr ""
"Kiléptettünk a csevegőszobából, mert mostantól csak a taglistán szereplők "
"lehetnek jelen"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -440,206 +446,206 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "A szobából kitíltva: %1$s"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "%1$s beceneve módosult"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "A szobából kidobva: %1$s"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "Taglista módosítás miatt a szobából kiléptetve: %1$s"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr ""
"A taglistán nem szerepel, így a szobából kiléptetve: %1$s"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "A beceneved módosításra került a következőre: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "A beceneved a következőre módosult: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "Az indok: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Nem szerepelsz a csevegőszoba taglistáján"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Nem lett megadva becenév"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Nem lehet új csevegőszobát létrehozni"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "A beceneved ütközik a csevegőszoba szabályzataival"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "A becenevedet már valaki használja"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Ez a szoba (még) nem létezik"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Ez a csevegőszoba elérte a maximális jelenlévők számát"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "A következő témát állította be %1$s: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Ez a felhasználó egy moderátor"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Ez a felhasználó küldhet üzenetet ebbe a szobába"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Ez a felhasználó NEM küldhet üzenetet ebbe a szobába"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Meghívás"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Jelenlevők"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "%1$s meghívott a(z) \"%2$s\" csevegőszobába. "
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr "Megadhat egy üzenet a meghívás okaként."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Szoba neve"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Becenév"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Szerver"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Csatlakozás"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Létező szobák"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Szobák"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Nincs csevegőszoba a(z) %1$s szerveren"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Csevegőszobák a(z) %1$s szerveren:"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Belépés a csevegőszobába"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "További információk a csevegőszobáról"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Leírás:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Jelenlevők:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Tulajdonságok:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Azonosítás szükséges"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Rejtett"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Meghívás szükséges"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderált"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "NEM névtelen"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Nyitott szoba"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Állandó szoba"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Nyílvános"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Félig névtelen"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Ideiglenes szoba"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Moderálatlan"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s meghívott a(z) %2$s csevegőszobába"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -647,41 +653,41 @@ msgstr "%1$s meghívott a(z) %2$s csevegőszobába. Indok: \"%3$s\""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "kijelentkezett"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Titkosított kapcsolat újraépítése"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Privát kulcs generálása"
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Előfordulhat, hogy a böngésző futása megáll."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -696,47 +702,47 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "A felhasználó ellenőrzése sikertelen."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "Privát kulcs cseréje..."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Az üzenetek mostantól már nem titkosítottak"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr ""
"Az üzenetek titikosítva vannak, de a csevegőpartnerét még nem hitelesítette."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr "A csevegőpartnere hitelesítve lett."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
"A csevegőpartnere kikapcsolta a titkosítást, így Önnek is ezt kellene tennie."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Az üzenet elküldése nem sikerült"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Titkosítatlan üzenet érkezett"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Visszafejthetetlen titkosított üzenet érkezett"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -757,7 +763,7 @@ msgstr ""
"Amennyiben az ujjlenyomatok biztosan egyeznek, klikkeljen az OK, ellenkező "
"esetben a Mégse gombra."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -770,57 +776,57 @@ msgstr ""
"Majd a csevegőpartnerének is megjelenik ez a kérdés. Végül ha a válaszok "
"azonosak lesznek (kis- nagybetű érzékeny), a partner hitelesítetté válik."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Mi legyen a biztonsági kérdés?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Mi a válasz a biztonsági kérdésre?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Érvénytelen hitelesítési séma."
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr "Az üzenetek titkosítatlanok. OTR titkosítás aktiválása."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "Az üzenetek titikosítottak, de a csevegőpartnere még nem hitelesített."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr "Az üzenetek titikosítottak és a csevegőpartnere hitelesített."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "A csevegőpartnere lezárta a magán beszélgetést"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Titkosított kapcsolat vége"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "A titkosított kapcsolat frissítése"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Titkosított beszélgetés indítása"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Ellenőrzés újjlenyomattal"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Ellenőrzés SMP-vel"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Mi ez?"
@@ -830,19 +836,19 @@ msgstr "Mi ez?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "titkosítatlan"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "nem hitelesített"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "hitelesített"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "befejezett"
@@ -978,35 +984,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Partner törlése"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Partner felvételének elfogadása"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Partner felvételének megtagadása"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Csevegés indítása ezzel a partnerünkkel"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr "Név"
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Valóban törölni szeretné a csevegőpartnerét?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr "Sajnáljuk, hiba történt a törlés során"
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Valóban elutasítja ezt a partnerkérelmet?"
diff --git a/locale/id/LC_MESSAGES/converse.po b/locale/id/LC_MESSAGES/converse.po
index 9d2af2474..2cfeb8605 100644
--- a/locale/id/LC_MESSAGES/converse.po
+++ b/locale/id/LC_MESSAGES/converse.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.7.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2014-01-25 21:30+0700\n"
"Last-Translator: Priyadi Iman Nurcahyo \n"
"Language-Team: Bahasa Indonesia\n"
@@ -17,82 +17,88 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Hapus pesan"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Klik untuk menghapus teman ini"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Pesan pribadi"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "saya"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr ""
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr ""
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
#, fuzzy
msgid "has gone away"
msgstr "Teman ini tidak di tempat"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Tampilkan menu ini"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Tulis ini menggunakan bahasa pihak ketiga"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Hapus pesan"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr ""
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
#, fuzzy
msgid "has gone offline"
msgstr "Teman ini tidak terhubung"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
#, fuzzy
msgid "is busy"
msgstr "sibuk"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
#, fuzzy
msgid "Clear all messages"
msgstr "Pesan pribadi"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Teman"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Menyambung"
@@ -150,7 +156,7 @@ msgstr "Klik untuk mengganti status"
msgid "Custom status"
msgstr "Status kustom"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Simpan"
@@ -228,204 +234,204 @@ msgstr "Pengguna tak ditemukan"
msgid "Click to add as a chat contact"
msgstr "Klik untuk menambahkan sebagai teman"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr ""
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Kesalahan"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Melakukan otentikasi"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Otentikasi gagal"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Klik untuk menghapus teman ini"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
msgid "Minimize this box"
msgstr ""
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
#, fuzzy
msgid "Click to restore this chat"
msgstr "Klik untuk menghapus teman ini"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr ""
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Pesan"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
#, fuzzy
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Anda bukan anggota dari ruangan ini"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
#, fuzzy
msgid "Ban user from room"
msgstr "Larang pengguna dari ruangan"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
#, fuzzy
msgid "Kick user from room"
msgstr "Tendang pengguna dari ruangan"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
#, fuzzy
msgid "Write in 3rd person"
msgstr "Tulis ini menggunakan bahasa pihak ketiga"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
#, fuzzy
msgid "Grant ownership of this room"
msgstr "Anda bukan anggota dari ruangan ini"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
#, fuzzy
msgid "Set room topic"
msgstr "Setel topik ruangan"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Batal"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Kesalahan terjadi saat menyimpan formulir ini."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Ruangan ini membutuhkan kata sandi"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Kata sandi: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Kirim"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Ruangan ini tidak anonim"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Ruangan ini menampilkan anggota yang tak tersedia"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Ruangan ini tidak menampilkan anggota yang tak tersedia"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Konfigurasi ruangan yang tak berhubungan dengan privasi telah diubah"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Pencatatan di ruangan ini sekarang dinyalakan"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Pencatatan di ruangan ini sekarang dimatikan"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Ruangan ini sekarang tak-anonim"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Ruangan ini sekarang semi-anonim"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Ruangan ini sekarang anonim"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Ruangan baru telah dibuat"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Anda telah dicekal dari ruangan ini"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Anda telah ditendang dari ruangan ini"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Anda telah dihapus dari ruangan ini karena perubahan afiliasi"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -433,7 +439,7 @@ msgstr ""
"Anda telah dihapus dari ruangan ini karena ruangan ini hanya terbuka untuk "
"anggota dan anda bukan anggota"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -451,210 +457,210 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s telah dicekal"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
#, fuzzy
msgid "%1$s's nickname has changed"
msgstr "%1$s telah dicekal"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s telah ditendang keluar"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "%1$s telah dihapus karena perubahan afiliasi"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s telah dihapus karena bukan anggota"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
#, fuzzy
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Nama panggilan anda telah diubah"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
#, fuzzy
msgid "Your nickname has been changed to: %1$s"
msgstr "Nama panggilan anda telah diubah"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Anda bukan anggota dari ruangan ini"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Nama panggilan belum ditentukan"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Anda tak diizinkan untuk membuat ruangan baru"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Nama panggilan anda tidak sesuai aturan ruangan ini"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Nama panggilan anda telah digunakan orang lain"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Ruangan ini belum dibuat"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Ruangan ini telah mencapai jumlah penghuni maksimum"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Topik diganti oleh %1$s menjadi: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Pengguna ini adalah moderator"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Pengguna ini dapat mengirim pesan di ruangan ini"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Pengguna ini tak dapat mengirim pesan di ruangan ini"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr ""
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
#, fuzzy
msgid "Occupants"
msgstr "Penghuni:"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Nama ruangan"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Nama panggilan"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Server"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
#, fuzzy
msgid "Join Room"
msgstr "Ikuti"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Perlihatkan ruangan"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Ruangan"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Tak ada ruangan di %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Ruangan di %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Klik untuk membuka ruangan ini"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Tampilkan informasi ruangan ini"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Keterangan:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Penghuni:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Fitur:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Membutuhkan otentikasi"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Tersembunyi"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Membutuhkan undangan"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Dimoderasi"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Tidak anonim"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Ruangan terbuka"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Ruangan permanen"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Umum"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semi-anonim"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Ruangan sementara"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Tak dimoderasi"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr ""
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -662,41 +668,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "Teman ini tidak terhubung"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Menyambung kembali sesi terenkripsi"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr ""
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr ""
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
#, fuzzy
msgid ""
"Authentication request from %1$s\n"
@@ -713,19 +719,19 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Tak dapat melakukan verifikasi identitas pengguna ini."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr ""
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Pesan anda tidak lagi terenkripsi"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
#, fuzzy
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
@@ -734,31 +740,31 @@ msgstr ""
"Pesan anda sekarang terenkripsi, namun identitas teman anda belum dapat "
"diverifikasi."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
#, fuzzy
msgid "Your contact's identify has been verified."
msgstr "Identitas teman anda telah diverifikasi."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
#, fuzzy
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
"Teman anda menghentikan percakapan terenkripsi, anda sebaiknya melakukan hal "
"yang sama."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Pesan anda tak dapat dikirim"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Kami menerima pesan terenkripsi"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Kami menerima pesan terenkripsi yang gagal dibaca"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -780,7 +786,7 @@ msgstr ""
"Jika anda bisa mengkonfirmasi sidik jadi cocok, klik Lanjutkan, jika tidak "
"klik Batal."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
#, fuzzy
msgid ""
"You will be prompted to provide a security question and then an answer to "
@@ -796,34 +802,34 @@ msgstr ""
"jawaban yang sama (huruf kapital diperhatikan), identitas mereka "
"diverifikasi."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Apakah pertanyaan keamanan anda?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Apa jawaban dari pertanyaan keamanan tersebut?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Skema otentikasi salah"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Pesan anda tak terenkripsi. Klik di sini untuk menyalakan enkripsi OTR."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
#, fuzzy
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "Pesan anda terenkripsi, tetapi teman anda belum diverifikasi."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
#, fuzzy
msgid "Your messages are encrypted and your contact verified."
msgstr "Pesan anda terenkripsi dan teman anda telah diverifikasi."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
#, fuzzy
msgid ""
"Your contact has closed their end of the private session, you should do the "
@@ -832,27 +838,27 @@ msgstr ""
"Teman anda telah mematikan sesi terenkripsi, dan anda juga sebaiknya "
"melakukan hal yang sama"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Sudahi percakapan terenkripsi"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Setel ulang percakapan terenkripsi"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Mulai sesi terenkripsi"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Verifikasi menggunakan sidik jari"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Verifikasi menggunakan SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Apakah ini?"
@@ -862,19 +868,19 @@ msgstr "Apakah ini?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "tak dienkripsi"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "tak diverifikasi"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "diverifikasi"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "selesai"
@@ -1005,38 +1011,38 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Klik untuk menghapus teman ini"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
#, fuzzy
msgid "Click to accept this contact request"
msgstr "Klik untuk menghapus teman ini"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
#, fuzzy
msgid "Click to decline this contact request"
msgstr "Klik untuk menghapus teman ini"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Klik untuk mulai perbinjangan dengan teman ini"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
#, fuzzy
msgid "Are you sure you want to remove this contact?"
msgstr "Klik untuk menghapus teman ini"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
#, fuzzy
msgid "Are you sure you want to decline this contact request?"
msgstr "Klik untuk menghapus teman ini"
diff --git a/locale/it/LC_MESSAGES/converse.po b/locale/it/LC_MESSAGES/converse.po
index fa4e39abc..d7b9558b6 100644
--- a/locale/it/LC_MESSAGES/converse.po
+++ b/locale/it/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:23+0000\n"
"Last-Translator: Fabio Bas \n"
"Language-Team: Italian\n"
@@ -21,78 +21,84 @@ msgstr ""
"plural_forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.4\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Rimuovi messaggi"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Clicca per ripristinare questa chat"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Messaggio personale"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "me"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "sta scrivendo"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "ha smesso di scrivere"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr ""
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Mostra questo menu"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Scrivi in terza persona"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Rimuovi messaggi"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr ""
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr ""
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "è occupato"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Pulisci tutti i messaggi"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Contatti"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Connessione in corso"
@@ -147,7 +153,7 @@ msgstr "Clicca per cambiare il tuo stato"
msgid "Custom status"
msgstr "Stato personalizzato"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Salva"
@@ -224,209 +230,209 @@ msgstr "Nessun utente trovato"
msgid "Click to add as a chat contact"
msgstr "Clicca per aggiungere il contatto alla chat"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Attiva/disattiva chat"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
#, fuzzy
msgid "Attempting to reconnect"
msgstr "Attendi riconversione in 5 secondi"
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Errore"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Autenticazione in corso"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Autenticazione fallita"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr "Si è verificato un errore durante il tentativo di aggiunta"
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr "Questo client non consente sottoscrizioni di presenza"
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Clicca per ripristinare questa chat"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Ridotto"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Clicca per ripristinare questa chat"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Ridotto"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Messaggio"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Sei sicuro di voler pulire i messaggi da questa stanza?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Bandisci utente dalla stanza"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Espelli utente dalla stanza"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "Scrivi in terza persona"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
#, fuzzy
msgid "Grant ownership of this room"
msgstr "Non sei nella lista dei membri di questa stanza"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Cambia oggetto della stanza"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Annulla"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Errore durante il salvataggio del modulo"
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Questa stanza richiede una password"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Password: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Invia"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Questa stanza non è anonima"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Questa stanza mostra i membri non disponibili al momento"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Questa stanza non mostra i membri non disponibili"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr ""
"Una configurazione della stanza non legata alla privacy è stata modificata"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "La registrazione è abilitata nella stanza"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "La registrazione è disabilitata nella stanza"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Questa stanza è non-anonima"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Questa stanza è semi-anonima"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Questa stanza è completamente-anonima"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Una nuova stanza è stata creata"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Sei stato bandito da questa stanza"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Sei stato espulso da questa stanza"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
"Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr ""
"Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -444,207 +450,207 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s è stato bandito"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "%1$s nickname è cambiato"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s è stato espulso"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr ""
"%1$s è stato rimosso a causa di un cambio di affiliazione"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s è stato rimosso in quanto non membro"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr ""
"Il tuo nickname è stato cambiato automaticamente in: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "Il tuo nickname è stato cambiato: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Non sei nella lista dei membri di questa stanza"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Nessun soprannome specificato"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Non ti è permesso creare nuove stanze"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Il tuo soprannome non è conforme alle regole di questa stanza"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Il tuo soprannome è già utilizzato"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Questa stanza non esiste (per ora)"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Questa stanza ha raggiunto il limite massimo di utenti"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Topic impostato da %1$s a: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Questo utente è un moderatore"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Questo utente può inviare messaggi in questa stanza"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Questo utente NON può inviare messaggi in questa stanza"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Invita"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Occupanti"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Nome stanza"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Soprannome"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Server"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Entra nella Stanza"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Mostra stanze"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Stanze"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Nessuna stanza su %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Stanze su %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Clicca per aprire questa stanza"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Mostra più informazioni su questa stanza"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Descrizione:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Utenti presenti:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Funzionalità:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Richiede autenticazione"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Nascosta"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Richiede un invito"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderata"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Non-anonima"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Stanza aperta"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Stanza permanente"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Pubblica"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semi-anonima"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Stanza temporanea"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Non moderata"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s ti ha invitato a partecipare a una chat room: %2$s"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -654,41 +660,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "Questo contatto è online"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr ""
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr ""
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr ""
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -698,45 +704,45 @@ msgid ""
"%2$s"
msgstr ""
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr ""
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr ""
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr ""
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr ""
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr ""
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr ""
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr ""
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr ""
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -749,7 +755,7 @@ msgid ""
"Cancel."
msgstr ""
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -758,57 +764,57 @@ msgid ""
"exact same answer (case sensitive), their identity will be verified."
msgstr ""
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr ""
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr ""
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr ""
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr ""
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr ""
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr ""
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr ""
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr ""
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr ""
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr ""
@@ -818,19 +824,19 @@ msgstr ""
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "non criptato"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "non verificato"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "verificato"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "finito"
@@ -965,35 +971,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Clicca per rimuovere questo contatto"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Clicca per accettare questa richiesta di contatto"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Clicca per rifiutare questa richiesta di contatto"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Clicca per parlare con questo contatto"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr "Nome"
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Sei sicuro di voler rimuovere questo contatto?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr "Si è verificato un errore durante il tentativo di rimozione"
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Sei sicuro dirifiutare questa richiesta di contatto?"
diff --git a/locale/ja/LC_MESSAGES/converse.po b/locale/ja/LC_MESSAGES/converse.po
index 5619af4d3..bfe3df238 100644
--- a/locale/ja/LC_MESSAGES/converse.po
+++ b/locale/ja/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2014-01-07 11:32+0900\n"
"Last-Translator: Mako N \n"
"Language-Team: Language JA\n"
@@ -17,82 +17,88 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "メッセージを削除"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "クリックしてこの相手先を削除"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "私信"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "私"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr ""
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr ""
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
#, fuzzy
msgid "has gone away"
msgstr "この相手先は離席中です"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "このメニューを表示"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "第三者に書く"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "メッセージを削除"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr ""
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
#, fuzzy
msgid "has gone offline"
msgstr "この相手先はオフラインです"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
#, fuzzy
msgid "is busy"
msgstr "取り込み中"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
#, fuzzy
msgid "Clear all messages"
msgstr "私信"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "相手先"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "接続中です"
@@ -150,7 +156,7 @@ msgstr "クリックして、在席状況を変更"
msgid "Custom status"
msgstr "独自の在席状況"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "保存"
@@ -228,204 +234,204 @@ msgstr "ユーザーが見つかりません"
msgid "Click to add as a chat contact"
msgstr "クリックしてチャットの相手先として追加"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr ""
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "エラー"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "認証中"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "認証に失敗"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "クリックしてこの相手先を削除"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
msgid "Minimize this box"
msgstr ""
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
#, fuzzy
msgid "Click to restore this chat"
msgstr "クリックしてこの相手先を削除"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr ""
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "メッセージ"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
#, fuzzy
msgid "Are you sure you want to clear the messages from this room?"
msgstr "この談話室のメンバー一覧にいません"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
#, fuzzy
msgid "Ban user from room"
msgstr "ユーザーを談話室から締め出す"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
#, fuzzy
msgid "Kick user from room"
msgstr "ユーザーを談話室から蹴り出す"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
#, fuzzy
msgid "Write in 3rd person"
msgstr "第三者に書く"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
#, fuzzy
msgid "Grant ownership of this room"
msgstr "この談話室のメンバー一覧にいません"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
#, fuzzy
msgid "Set room topic"
msgstr "談話室の話題を設定"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "キャンセル"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "フォームを保存する際にエラーが発生しました。"
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "この談話室にはパスワードが必要です"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "パスワード:"
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "送信"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "この談話室は非匿名です"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "この談話室はメンバー以外にも見えます"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "この談話室はメンバー以外には見えません"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "談話室の設定(プライバシーに無関係)が変更されました"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "談話室の記録を取りはじめます"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "談話室の記録を止めます"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "この談話室はただいま非匿名です"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "この談話室はただいま半匿名です"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "この談話室はただいま匿名です"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "新しい談話室が作成されました"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "この談話室から締め出されました"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "この談話室から蹴り出されました"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "分掌の変更のため、この談話室から削除されました"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -433,7 +439,7 @@ msgstr ""
"談話室がメンバー制に変更されました。メンバーではないため、この談話室から削除"
"されました"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -450,210 +456,210 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s を締め出しました"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
#, fuzzy
msgid "%1$s's nickname has changed"
msgstr "%1$s を締め出しました"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s を蹴り出しました"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "分掌の変更のため、%1$s を削除しました"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "メンバーでなくなったため、%1$s を削除しました"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
#, fuzzy
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "ニックネームを変更しました"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
#, fuzzy
msgid "Your nickname has been changed to: %1$s"
msgstr "ニックネームを変更しました"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "この談話室のメンバー一覧にいません"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "ニックネームがありません"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "新しい談話室を作成する権限がありません"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "ニックネームがこの談話室のポリシーに従っていません"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "ニックネームは既に使われています"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "この談話室は存在しません"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "この談話室は入室者数の上限に達しています"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "%1$s が話題を設定しました: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "このユーザーは司会者です"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "このユーザーはこの談話室で発言できます"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "このユーザーはこの談話室で発言できません"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr ""
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
#, fuzzy
msgid "Occupants"
msgstr "入室者:"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "談話室の名前"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "ニックネーム"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "サーバー"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
#, fuzzy
msgid "Join Room"
msgstr "入室"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "談話室一覧を見る"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "談話室"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "%1$s に談話室はありません"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "%1$s の談話室一覧"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "クリックしてこの談話室を開く"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "この談話室についての詳細を見る"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "説明: "
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "入室者:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "特徴:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "認証の要求"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "非表示"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "招待の要求"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "発言制限"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "非匿名"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "開放談話室"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "常設談話室"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "公開談話室"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "半匿名"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "臨時談話室"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "発言制限なし"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr ""
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -661,41 +667,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "この相手先はオフラインです"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "暗号化セッションの再接続"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr ""
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr ""
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
#, fuzzy
msgid ""
"Authentication request from %1$s\n"
@@ -711,19 +717,19 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "このユーザーの本人性を検証できませんでした。"
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr ""
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "メッセージはもう暗号化されません"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
#, fuzzy
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
@@ -731,29 +737,29 @@ msgid ""
msgstr ""
"メッセージは暗号化されますが、相手が本人であることは検証されていません。"
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
#, fuzzy
msgid "Your contact's identify has been verified."
msgstr "相手の本人性を検証しました。"
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
#, fuzzy
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "相手は、暗号化を終了しました。あなたもそれに合わせる必要があります。"
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "メッセージを送信できませんでした"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "暗号化されていないメッセージを受信しました"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "読めない暗号化メッセージを受信しました"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -774,7 +780,7 @@ msgstr ""
"確認して、鍵指紋が正しければ「OK」を、正しくなければ「キャンセル」をクリック"
"してください。"
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
#, fuzzy
msgid ""
"You will be prompted to provide a security question and then an answer to "
@@ -788,62 +794,62 @@ msgstr ""
"相手にも、同じ質問が表示され、正しく同じ答(大文字・小文字は区別されます)を入"
"力することで、本人性を検証します。"
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "秘密の質問はなんですか?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "秘密の質問の答はなんですか?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "認証の方式が正しくありません"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"メッセージは暗号化されません。OTR 暗号化を有効にするにはここをクリックしてく"
"ださい。"
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
#, fuzzy
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "メッセージは暗号化されますが、相手は検証されていません。"
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
#, fuzzy
msgid "Your messages are encrypted and your contact verified."
msgstr "メッセージは暗号化され、相手も検証されています。"
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
#, fuzzy
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "相手は私信を終了しました。あなたも同じようにしてください"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "暗号化された会話を終了"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "暗号化された会話をリフレッシュ"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "暗号化された会話を開始"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "鍵指紋で検証"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "SMP で検証"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "これは何ですか?"
@@ -853,19 +859,19 @@ msgstr "これは何ですか?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "暗号化されていません"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "検証されていません"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "検証されました"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "完了"
@@ -996,38 +1002,38 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "クリックしてこの相手先を削除"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
#, fuzzy
msgid "Click to accept this contact request"
msgstr "クリックしてこの相手先を削除"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
#, fuzzy
msgid "Click to decline this contact request"
msgstr "クリックしてこの相手先を削除"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "クリックしてこの相手先とチャット"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
#, fuzzy
msgid "Are you sure you want to remove this contact?"
msgstr "クリックしてこの相手先を削除"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
#, fuzzy
msgid "Are you sure you want to decline this contact request?"
msgstr "クリックしてこの相手先を削除"
diff --git a/locale/nb/LC_MESSAGES/converse.po b/locale/nb/LC_MESSAGES/converse.po
index 35da7069c..a1d7ecbe3 100644
--- a/locale/nb/LC_MESSAGES/converse.po
+++ b/locale/nb/LC_MESSAGES/converse.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse JS 0.8.6\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:23+0000\n"
"Last-Translator: Andreas Lorentsen \n"
"Language-Team: \n"
@@ -18,82 +18,88 @@ msgstr ""
"lang: nb\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Fjern meldinger"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Klikk for å gjenopprette denne samtalen"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Personlig melding"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "meg"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "skriver"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "har stoppet å skrive"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
#, fuzzy
msgid "has gone away"
msgstr "Kontakten er borte"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Viser denne menyen"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Skriv i tredjeperson"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Fjern meldinger"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Er du sikker på at du vil fjerne meldingene fra denne meldingsboksen?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
#, fuzzy
msgid "has gone offline"
msgstr "Kontakten er avlogget"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
#, fuzzy
msgid "is busy"
msgstr "opptatt"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Fjern alle meldinger"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
#, fuzzy
msgid "Hide the list of occupants"
msgstr "Skjul deltakerlisten"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "Start en samtale"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Kontakter"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Kobler til"
@@ -150,7 +156,7 @@ msgstr "Klikk for å endre din meldingsstatus"
msgid "Custom status"
msgstr "Personlig status"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Lagre"
@@ -227,200 +233,200 @@ msgstr "Ingen brukere funnet"
msgid "Click to add as a chat contact"
msgstr "Klikk for å legge til som meldingskontakt"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Endre chatten"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Feil"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Godkjenner"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Godkjenning mislyktes"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Klikk for å gjenopprette denne samtalen"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Minimert"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Klikk for å gjenopprette denne samtalen"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Minimert"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Melding"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Feil: kunne ikke utføre kommandoen"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Er du sikker på at du vil fjerne meldingene fra dette rommet?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Utesteng bruker fra rommet"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
#, fuzzy
msgid "Change user role to occupant"
msgstr "Skjul deltakerlisten"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Kast ut bruker fra rommet"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "Skriv i tredjeperson"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "Fjern brukerens muligheter til å skrive meldinger"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Endre ditt kallenavn"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
#, fuzzy
msgid "Grant ownership of this room"
msgstr "Du er ikke på medlemslisten til dette rommet"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Endre rommets emne"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "Tillat stumme brukere å skrive meldinger"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Avbryt"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "En feil skjedde under lagring av skjemaet."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Dette rommet krever et passord"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Passord:"
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Send"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Dette rommet er ikke anonymt"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Dette rommet viser nå utilgjengelige medlemmer"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Dette rommet viser ikke utilgjengelige medlemmer"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Ikke-personvernsrelatert romkonfigurasjon har blitt endret"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Romlogging er nå aktivert"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Romlogging er nå deaktivert"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Dette rommet er nå ikke-anonymt"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Dette rommet er nå semi-anonymt"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Dette rommet er nå totalt anonymt"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Et nytt rom har blitt opprettet"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Du har blitt utestengt fra dette rommet"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Du ble kastet ut av dette rommet"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Du har blitt fjernet fra dette rommet på grunn av en holdningsendring"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -428,7 +434,7 @@ msgstr ""
"Du har blitt fjernet fra dette rommet fordi rommet nå kun tillater "
"medlemmer, noe du ikke er."
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -446,209 +452,209 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s har blitt utestengt"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "%1$s sitt kallenavn er endret"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s ble kastet ut"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr ""
"%1$s har blitt fjernet på grunn av en holdningsendring"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr ""
"%1$s har blitt fjernet på grunn av at han/hun ikke er medlem"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Ditt kallenavn har blitt automatisk endret til %1$s "
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "Ditt kallenavn har blitt endret til %1$s "
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "Årsaken som er oppgitt er: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Du er ikke på medlemslisten til dette rommet"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Ingen kallenavn var spesifisert"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Du har ikke tillatelse til å opprette nye rom"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Ditt kallenavn er ikke i samsvar med rommets regler"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Kallenavnet er allerede tatt"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Dette rommet eksisterer ikke (enda)"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Dette rommet har nådd maksimalt antall brukere"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Emnet ble endret den %1$s til: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Denne brukeren er moderator"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Denne brukeren kan skrive meldinger i dette rommet"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Denne brukeren kan IKKE sende meldinger i dette rommet"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Invitér"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Brukere her:"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "Du er i ferd med å invitere %1$s til samtalerommet \"%2$s\". "
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
"Du kan eventuelt inkludere en melding og forklare årsaken til invitasjonen."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Romnavn"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Kallenavn"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Server"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
#, fuzzy
msgid "Join Room"
msgstr "Koble til"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Vis Rom"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Rom"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Ingen rom på %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Rom på %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Klikk for å åpne dette rommet"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Vis mer informasjon om dette rommet"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Beskrivelse:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Brukere her:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Egenskaper:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Krever Godkjenning"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Skjult"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Krever en invitasjon"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderert"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Ikke-Anonym"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Åpent Rom"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Permanent Rom"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Alle"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semi-anonymt"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Midlertidig Rom"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Umoderert"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s har invitert deg til å bli med i chatterommet: %2$s"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -658,41 +664,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "Kontakten er avlogget"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Gjenopptar kryptert økt"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Genererer privat nøkkel"
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Din nettleser kan bli uresponsiv"
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -708,19 +714,19 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Kunne ikke bekrefte denne brukerens identitet"
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "Bytter private nøkler med kontakt"
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Dine meldinger er ikke kryptert lenger."
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
@@ -728,28 +734,28 @@ msgstr ""
"Dine meldinger er nå krypterte, men identiteten til din kontakt har ikke "
"blitt verifisert."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr "Din kontakts identitet har blitt verifisert."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
"Din kontakt har avsluttet kryptering i sin ende, dette burde du også gjøre."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Beskjeden din kunne ikke sendes"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Vi mottok en ukryptert beskjed"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Vi mottok en uleselig melding"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -771,7 +777,7 @@ msgstr ""
"Om du har bekreftet at avtrykkene matcher, klikk OK. I motsatt fall, trykk "
"Avbryt."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -786,59 +792,59 @@ msgstr ""
"nøyaktig samme svaret (det er forskjell på små og store bokstaver), vil "
"identiteten verifiseres."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Hva er ditt Sikkerhetsspørsmål?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Hva er svaret på ditt Sikkerhetsspørsmål?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Du har vedlagt en ugyldig godkjenningsplan."
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Dine meldinger er ikke krypterte. Klikk her for å aktivere OTR-kryptering."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
"Dine meldinger er krypterte, men din kontakt har ikke blitt verifisert."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr "Dine meldinger er krypterte og din kontakt er verifisert."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "Din kontakt har avsluttet økten i sin ende, dette burde du også gjøre."
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Avslutt kryptert økt"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Last inn kryptert samtale på nytt"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Start en kryptert samtale"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Verifiser med Avtrykk"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Verifiser med SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Hva er dette?"
@@ -848,19 +854,19 @@ msgstr "Hva er dette?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "ukryptertß"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "uverifisert"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "verifisert"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "ferdig"
@@ -995,35 +1001,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Klikk for å fjerne denne kontakten"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Klikk for å Godta denne kontaktforespørselen"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Klikk for å avslå denne kontaktforespørselen"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Klikk for å chatte med denne kontakten"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Er du sikker på at du vil fjerne denne kontakten?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Er du sikker på at du vil avslå denne kontaktforespørselen?"
diff --git a/locale/nl/LC_MESSAGES/converse.po b/locale/nl/LC_MESSAGES/converse.po
index 62b34f7d9..4b075edbe 100644
--- a/locale/nl/LC_MESSAGES/converse.po
+++ b/locale/nl/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:21+0000\n"
"Last-Translator: Maarten Kling \n"
"Language-Team: Dutch\n"
@@ -20,84 +20,90 @@ msgstr ""
"lang: nl\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Verwijder bericht"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Klik om contact te verwijderen"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Persoonlijk bericht"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "ikzelf"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
#, fuzzy
msgid "is typing"
msgstr "%1$s is aan typen"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
#, fuzzy
msgid "has stopped typing"
msgstr "%1$s is aan typen"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
#, fuzzy
msgid "has gone away"
msgstr "Conact is afwezig"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Toon dit menu"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Schrijf in de 3de persoon"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Verwijder bericht"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr ""
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
#, fuzzy
msgid "has gone offline"
msgstr "Contact is offline"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
#, fuzzy
msgid "is busy"
msgstr "bezet"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
#, fuzzy
msgid "Clear all messages"
msgstr "Persoonlijk bericht"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Contacten"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Verbinden"
@@ -155,7 +161,7 @@ msgstr "Klik hier om status te wijzigen"
msgid "Custom status"
msgstr ""
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Opslaan"
@@ -233,210 +239,210 @@ msgstr "Geen gebruikers gevonden"
msgid "Click to add as a chat contact"
msgstr "Klik om contact toe te voegen"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr ""
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Error"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Authenticeren"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Authenticeren mislukt"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Klik om contact te verwijderen"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
msgid "Minimize this box"
msgstr ""
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
#, fuzzy
msgid "Click to restore this chat"
msgstr "Klik om contact te verwijderen"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr ""
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Bericht"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
#, fuzzy
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Je bent niet een gebruiker van deze room"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
#, fuzzy
msgid "Ban user from room"
msgstr "Ban gebruiker van chatroom"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
#, fuzzy
msgid "Kick user from room"
msgstr "Goei gebruiker uit chatroom"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
#, fuzzy
msgid "Write in 3rd person"
msgstr "Schrijf in de 3de persoon"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
#, fuzzy
msgid "Grant ownership of this room"
msgstr "Je bent niet een gebruiker van deze room"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
#, fuzzy
msgid "Set room topic"
msgstr "Zet chatroom topic"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Annuleren"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Een error tijdens het opslaan van het formulier."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Chatroom heeft een wachtwoord"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Wachtwoord: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Indienen"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Deze room is niet annoniem"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr ""
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr ""
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr ""
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr ""
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr ""
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Deze room is nu niet annoniem"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Deze room is nu semie annoniem"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Deze room is nu volledig annoniem"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Een nieuwe room is gemaakt"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Je bent verbannen uit deze room"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Je bent uit de room gegooid"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr ""
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -452,210 +458,210 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s is verbannen"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
#, fuzzy
msgid "%1$s's nickname has changed"
msgstr "%1$s is verbannen"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s has been kicked out"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr ""
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr ""
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
#, fuzzy
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Je nickname is veranderd"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
#, fuzzy
msgid "Your nickname has been changed to: %1$s"
msgstr "Je nickname is veranderd"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Je bent niet een gebruiker van deze room"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Geen nickname ingegeven"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Je bent niet toegestaan nieuwe rooms te maken"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Je nickname is niet conform policy"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Je nickname bestaat al"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Deze room bestaat niet"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Deze room heeft het maximale aantal gebruikers"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr ""
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Dit is een moderator"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Deze gebruiker kan berichten sturen in deze room"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Deze gebruiker kan NIET een bericht sturen in deze room"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr ""
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
#, fuzzy
msgid "Occupants"
msgstr "Deelnemers:"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Room naam"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Nickname"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Server"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
#, fuzzy
msgid "Join Room"
msgstr "Deelnemen"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Toon rooms"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Rooms"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Geen room op %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Room op %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Klik om room te openen"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Toon meer informatie over deze room"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Beschrijving"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Deelnemers:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Functies:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Verificatie vereist"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Verborgen"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Veriest een uitnodiging"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Gemodereerd"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Niet annoniem"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Open room"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Blijvend room"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Publiek"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semi annoniem"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Tijdelijke room"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Niet gemodereerd"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr ""
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -663,41 +669,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "Contact is offline"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Bezig versleutelde sessie te herstellen"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr ""
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr ""
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -707,48 +713,48 @@ msgid ""
"%2$s"
msgstr ""
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Niet kon de identiteit van deze gebruiker niet identificeren."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr ""
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Je berichten zijn niet meer encrypted"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
#, fuzzy
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr "Jou berichten zijn encrypted, maar je contact is niet geverifieerd."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
#, fuzzy
msgid "Your contact's identify has been verified."
msgstr "Jou contact is geverifieerd"
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
#, fuzzy
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "Jou contact heeft encryption aanstaan, je moet het zelfde doen."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Je bericht kon niet worden verzonden"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "We ontvingen een unencrypted bericht "
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "We ontvangen een onleesbaar unencrypted bericht"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -761,7 +767,7 @@ msgid ""
"Cancel."
msgstr ""
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -770,61 +776,61 @@ msgid ""
"exact same answer (case sensitive), their identity will be verified."
msgstr ""
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Wat is jou sericury vraag?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Wat is het antwoord op de security vraag?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr ""
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Jou bericht is niet encrypted. KLik hier om ORC encrytion aan te zetten."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
#, fuzzy
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "Jou berichten zijn encrypted, maar je contact is niet geverifieerd."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
#, fuzzy
msgid "Your messages are encrypted and your contact verified."
msgstr "Jou bericht is encrypted en jou contact is geverifieerd."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
#, fuzzy
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "Jou contact heeft encryption aanstaan, je moet het zelfde doen."
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Beeindig encrypted gesprek"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Ververs encrypted gesprek"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Start encrypted gesprek"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr ""
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr ""
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Wat is dit?"
@@ -834,19 +840,19 @@ msgstr "Wat is dit?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "ongecodeerde"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "niet geverifieerd"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "geverifieerd"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "klaar"
@@ -977,38 +983,38 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Klik om contact te verwijderen"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
#, fuzzy
msgid "Click to accept this contact request"
msgstr "Klik om contact te verwijderen"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
#, fuzzy
msgid "Click to decline this contact request"
msgstr "Klik om contact te verwijderen"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Klik om te chatten met contact"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
#, fuzzy
msgid "Are you sure you want to remove this contact?"
msgstr "Klik om contact te verwijderen"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
#, fuzzy
msgid "Are you sure you want to decline this contact request?"
msgstr "Klik om contact te verwijderen"
diff --git a/locale/pl/LC_MESSAGES/converse.po b/locale/pl/LC_MESSAGES/converse.po
index e50bd7b16..6faba37b5 100644
--- a/locale/pl/LC_MESSAGES/converse.po
+++ b/locale/pl/LC_MESSAGES/converse.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.9.6\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:22+0000\n"
"Last-Translator: Serge Victor \n"
"Language-Team: Polish\n"
@@ -19,80 +19,86 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Usuń wiadomość"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Kliknij aby powrócić do rozmowy"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Wiadomość osobista"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "ja"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "pisze"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "przestał pisać"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "uciekł"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Pokaż menu"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Pisz w trzeciej osobie"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Usuń wiadomość"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr ""
"Potwierdź czy rzeczywiście chcesz wyczyścić wiadomości z okienka rozmowy?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr "wyłączył się"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "zajęty"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Wyczyść wszystkie wiadomości"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
#, fuzzy
msgid "Hide the list of occupants"
msgstr "Ukryj listę rozmówców"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr "Wstaw uśmieszek"
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "Zadzwoń"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Kontakty"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Łączę się"
@@ -147,7 +153,7 @@ msgstr "Kliknij aby zmienić status rozmowy"
msgid "Custom status"
msgstr "Własny status"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Zachowaj"
@@ -224,199 +230,199 @@ msgstr "Nie znaleziono użytkowników"
msgid "Click to add as a chat contact"
msgstr "Kliknij aby dodać jako kontakt"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Przełącz rozmowę"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Błąd"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Autoryzacja"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Autoryzacja nie powiodła się"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr "Wystąpił błąd w czasie próby dodania "
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr "Klient nie umożliwia subskrybcji obecności"
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Kliknij aby powrócić do rozmowy"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Zminimalizowany"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Kliknij aby powrócić do rozmowy"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Zminimalizowany"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Wiadomość:"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Błąd: nie potrafię uruchomić polecenia"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr "Błąd: \""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Potwierdź czy rzeczywiście chcesz wyczyścić wiadomości z tego pokoju?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr "Przyznaj prawa administratora"
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Zablokuj dostępu do pokoju"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
#, fuzzy
msgid "Change user role to occupant"
msgstr "Zmień prawa dostępu na zwykłego uczestnika"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Wykop z pokoju"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "Pisz w trzeciej osobie"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr "Przyznaj członkowstwo "
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "Zablokuj człowiekowi możliwość rozmowy"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Zmień ksywkę"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr "Przyznaj prawa moderatora"
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "Uczyń właścicielem pokoju"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr "Usuń z listy członków"
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Ustaw temat pokoju"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "Pozwól uciszonemu człowiekowi na rozmowę"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Anuluj"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Wystąpił błąd w czasie próby zachowania formularza."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Pokój rozmów wymaga podania hasła"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Hasło:"
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Wyślij"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Pokój nie jest anonimowy"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Pokój pokazuje niedostępnych rozmówców"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Ten pokój nie wyświetla niedostępnych członków"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Ustawienia pokoju nie związane z prywatnością zostały zmienione"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Zostało włączone zapisywanie rozmów w pokoju"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Zostało wyłączone zapisywanie rozmów w pokoju"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Pokój stał się nieanonimowy"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Pokój stał się półanonimowy"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Pokój jest teraz w pełni anonimowy"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Został utworzony nowy pokój"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Jesteś niemile widziany w tym pokoju"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Zostałeś wykopany z pokoju"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Zostałeś usunięty z pokoju ze względu na zmianę przynależności"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -424,7 +430,7 @@ msgstr ""
"Zostałeś usunięty z pokoju ze względu na to, że pokój zmienił się na "
"wymagający członkowstwa, a ty nie jesteś członkiem"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -442,97 +448,97 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s został zbanowany"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "%1$s zmienił ksywkę"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s został wykopany"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "%1$s został usunięty z powodu zmiany przynależności"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr ""
"%1$s został usunięty ze względu na to, że nie jest członkiem"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Twoja ksywka została automatycznie zmieniona na: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "Twoja ksywka została zmieniona na: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "Podana przyczyna to: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Nie jesteś członkiem tego pokoju rozmów"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Nie podałeś ksywki"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Nie masz uprawnień do tworzenia nowych pokojów rozmów"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Twoja ksywka nie jest zgodna z regulaminem pokoju"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Twoja ksywka jest już w użyciu"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Ten pokój (jeszcze) nie istnieje"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Pokój przekroczył dozwoloną ilość rozmówców"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Temat ustawiony przez %1$s na: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Ten człowiek jest moderatorem"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Ten człowiek może rozmawiać w niejszym pokoju"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Ten człowiek nie może rozmawiać w niniejszym pokoju"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Zaproś"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Uczestników"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "Zamierzasz zaprosić %1$s do pokoju rozmów \"%2$s\". "
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
@@ -540,110 +546,110 @@ msgstr ""
"Masz opcjonalną możliwość dołączenia wiadomości, która wyjaśni przyczynę "
"zaproszenia."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Nazwa pokoju"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Ksywka"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Serwer"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Wejdź do pokoju"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Pokaż pokoje"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Pokoje"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Brak jest pokojów na %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Pokoje na %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Kliknij aby wejść do pokoju"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Pokaż więcej informacji o pokoju"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Opis:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Uczestnicy:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Możliwości:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Wymaga autoryzacji"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Ukryty"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Wymaga zaproszenia"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderowany"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Nieanonimowy"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Otwarty pokój"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Stały pokój"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Publiczny"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Półanonimowy"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Pokój tymczasowy"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Niemoderowany"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s zaprosił(a) cię do wejścia do pokoju rozmów %2$s"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -651,41 +657,41 @@ msgstr "%1$s zaprosił cię do pokoju: %2$s, podając następujący powód: \"%3
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "wyłączył się"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Przywrócenie sesji szyfrowanej"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Generuję klucz prywatny."
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Twoja przeglądarka może nieco zwolnić."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -700,19 +706,19 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Nie jestem w stanie zweryfikować tożsamości kontaktu."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "Wymieniam klucze szyfrujące z kontaktem."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Twoje wiadomości nie są już szyfrowane"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
@@ -720,27 +726,27 @@ msgstr ""
"Wiadomości są teraz szyfrowane, ale tożsamość kontaktu nie została "
"zweryfikowana."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr "Tożsamość kontaktu została zweryfikowana"
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "Kontakt zakończył sesję szyfrowaną, powinieneś zrobić to samo."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Twoja wiadomość nie została wysłana"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Otrzymaliśmy niezaszyfrowaną wiadomość"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Otrzymaliśmy nieczytelną zaszyfrowaną wiadomość"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -762,7 +768,7 @@ msgstr ""
"Jeśli odciski palców zostały potwierdzone, kliknij OK, w inny wypadku "
"kliknij Anuluj."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -776,59 +782,59 @@ msgstr ""
"jeśli udzieli tej samej odpowiedzi (ważna jest wielkość liter), tożsamość "
"zostanie zwerfikowana."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Jakie jest pytanie bezpieczeństwa?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Jaka jest odpowiedź na pytanie bezpieczeństwa?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Niewłaściwy schemat autoryzacji"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Twoje wiadomości nie są szyfrowane. Kliknij, aby uruchomić szyfrowanie OTR"
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
"Wiadomości są szyfrowane, ale tożsamość kontaktu nie została zweryfikowana."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr "Wiadomości są szyfrowane i tożsamość kontaktu została zweryfikowana."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "Kontakt zakończył prywatną rozmowę i ty zrób to samo"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Zakończ szyfrowaną rozmowę"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Odśwież szyfrowaną rozmowę"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Rozpocznij szyfrowaną rozmowę"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Zweryfikuj za pomocą odcisków palców"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Zweryfikuj za pomocą SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Co to jest?"
@@ -838,19 +844,19 @@ msgstr "Co to jest?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "nieszyfrowane"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "niezweryfikowane"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "zweryfikowane"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "zakończone"
@@ -986,35 +992,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Kliknij aby usunąć kontakt"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Klknij aby zaakceptować życzenie nawiązania kontaktu"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Kliknij aby odrzucić życzenie nawiązania kontaktu"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Kliknij aby porozmawiać z kontaktem"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr "Nazwa"
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Czy potwierdzasz zamiar usnunięcia tego kontaktu?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr "Wystąpił błąd w trakcie próby usunięcia "
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Czy potwierdzasz odrzucenie chęci nawiązania kontaktu?"
diff --git a/locale/pt_BR/LC_MESSAGES/converse.po b/locale/pt_BR/LC_MESSAGES/converse.po
index fa9bd4c6a..6aa780c73 100644
--- a/locale/pt_BR/LC_MESSAGES/converse.po
+++ b/locale/pt_BR/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.6.3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:23+0000\n"
"Last-Translator: Alan Meira \n"
"Language-Team: Brazilian Portuguese\n"
@@ -20,84 +20,90 @@ msgstr ""
"lang: pt_BR\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Remover mensagens"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Clique para remover o contato"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Mensagem pessoal"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "eu"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
#, fuzzy
msgid "is typing"
msgstr "%1$s está digitando"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
#, fuzzy
msgid "has stopped typing"
msgstr "%1$s está digitando"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
#, fuzzy
msgid "has gone away"
msgstr "Este contato está ausente"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Mostrar o menu"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Escrever em terceira pessoa"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Remover mensagens"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Tem certeza que deseja limpar as mensagens dessa caixa?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
#, fuzzy
msgid "has gone offline"
msgstr "Este contato está offline"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
#, fuzzy
msgid "is busy"
msgstr "ocupado"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
#, fuzzy
msgid "Clear all messages"
msgstr "Mensagem pessoal"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Contatos"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Conectando"
@@ -155,7 +161,7 @@ msgstr "Clique para mudar seu status no chat"
msgid "Custom status"
msgstr "Status customizado"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Salvar"
@@ -233,205 +239,205 @@ msgstr "Não foram encontrados usuários"
msgid "Click to add as a chat contact"
msgstr "Clique para adicionar como um contato do chat"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Alternar bate-papo"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Erro"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Autenticando"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Falha de autenticação"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Clique para remover o contato"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Minimizado"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
#, fuzzy
msgid "Click to restore this chat"
msgstr "Clique para remover o contato"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Minimizado"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Mensagem"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
#, fuzzy
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Você não é membro dessa sala"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
#, fuzzy
msgid "Ban user from room"
msgstr "Banir usuário do chat"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
#, fuzzy
msgid "Kick user from room"
msgstr "Expulsar usuário do chat"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
#, fuzzy
msgid "Write in 3rd person"
msgstr "Escrever em terceira pessoa"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
#, fuzzy
msgid "Grant ownership of this room"
msgstr "Você não é membro dessa sala"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
#, fuzzy
msgid "Set room topic"
msgstr "Definir tópico do chat"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Cancelar"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Ocorreu um erro enquanto tentava salvar o formulário"
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Esse chat precisa de senha"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Senha: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Enviar"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Essa sala não é anônima"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Agora esta sala mostra membros indisponíveis"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Essa sala não mostra membros indisponíveis"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Configuraçõs não relacionadas à privacidade mudaram"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "O log da sala está ativado"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "O log da sala está desativado"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Esse sala é não anônima"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Essa sala agora é semi anônima"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Essa sala agora é totalmente anônima"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Uma nova sala foi criada"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Você foi banido dessa sala"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Você foi expulso dessa sala"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Você foi removido da sala devido a uma mudança de associação"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -439,7 +445,7 @@ msgstr ""
"Você foi removido da sala porque ela foi mudada para somente membrose você "
"não é um membro"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -457,210 +463,210 @@ msgstr ""
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s foi banido"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
#, fuzzy
msgid "%1$s's nickname has changed"
msgstr "%1$s foi banido"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s foi expulso"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "%1$s foi removido por causa de troca de associação"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s foi removido por não ser um membro"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
#, fuzzy
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Seu apelido foi mudado"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
#, fuzzy
msgid "Your nickname has been changed to: %1$s"
msgstr "Seu apelido foi mudado"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Você não é membro dessa sala"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Você não escolheu um apelido "
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Você não tem permitição de criar novas salas"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Seu apelido não está de acordo com as regras da sala"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Seu apelido já foi escolhido"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "A sala não existe (ainda)"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "A sala atingiu o número máximo de ocupantes"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Topico definido por %1$s para: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Esse usuário é o moderador"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Esse usuário pode enviar mensagens nessa sala"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Esse usuário NÃO pode enviar mensagens nessa sala"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr ""
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
#, fuzzy
msgid "Occupants"
msgstr "Ocupantes:"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Nome da sala"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Apelido"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Server"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
#, fuzzy
msgid "Join Room"
msgstr "Entrar"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Mostar salas"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Salas"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Sem salas em %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Salas em %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "CLique para abrir a sala"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Mostrar mais informações nessa sala"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Descrição:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Ocupantes:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Recursos:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Requer autenticação"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Escondido"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Requer um convite"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Moderado"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Não anônimo"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Sala aberta"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Sala permanente"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Público"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Semi anônimo"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Sala temporária"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Sem moderação"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr ""
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -668,41 +674,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "Este contato está offline"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Reestabelecendo sessão criptografada"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Gerando chave-privada."
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Seu navegador pode parar de responder."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
#, fuzzy
msgid ""
"Authentication request from %1$s\n"
@@ -719,20 +725,20 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Não foi possível verificar a identidade deste usuário."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
#, fuzzy
msgid "Exchanging private key with contact."
msgstr "Trocando chave-privada com o contato."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Suas mensagens não estão mais criptografadas"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
#, fuzzy
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
@@ -741,29 +747,29 @@ msgstr ""
"Suas mensagens estão agora criptografadas mas a identidade do contatonão foi "
"confirmada."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
#, fuzzy
msgid "Your contact's identify has been verified."
msgstr "A identidade do contato foi verificada."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
#, fuzzy
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "Seu contato parou de usar criptografia, você deveria fazer o mesmo."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Sua mensagem não pode ser enviada"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Recebemos uma mensagem não-criptografada"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Recebemos uma mensagem não-criptografada ilegível"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -785,7 +791,7 @@ msgstr ""
"Se você tiver confirmado que as assinaturas conferem, clique OK, caso "
"contrário, clique Cancelar."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
#, fuzzy
msgid ""
"You will be prompted to provide a security question and then an answer to "
@@ -801,63 +807,63 @@ msgstr ""
"corretamente a mesma resposta (caso sensitivo), a identidade dele será "
"verificada."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Qual é a sua pergunta de segurança?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Qual é a resposta para a pergunta de segurança?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Schema de autenticação fornecido é inválido"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Suas mensagens não estão criptografadas. Clique aqui para habilitar "
"criptografia OTR."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
#, fuzzy
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr ""
"Suas mensagens estão criptografadas, mas seu contato não foi verificado."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
#, fuzzy
msgid "Your messages are encrypted and your contact verified."
msgstr "Suas mensagens estão criptografadas e seu contato verificado."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
#, fuzzy
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "Seu contato fechou a sessão privada, você deveria fazer o mesmo"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Finalizar conversa criptografada"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Atualizar conversa criptografada"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Iniciar conversa criptografada"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Verificar com assinatura digital"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Verificar com SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "O que é isso?"
@@ -867,19 +873,19 @@ msgstr "O que é isso?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "não-criptografado"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "não-verificado"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "verificado"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "finalizado"
@@ -1010,38 +1016,38 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Clique para remover o contato"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
#, fuzzy
msgid "Click to accept this contact request"
msgstr "Clique para remover o contato"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
#, fuzzy
msgid "Click to decline this contact request"
msgstr "Clique para remover o contato"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Clique para conversar com o contato"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
#, fuzzy
msgid "Are you sure you want to remove this contact?"
msgstr "Clique para remover o contato"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
#, fuzzy
msgid "Are you sure you want to decline this contact request?"
msgstr "Clique para remover o contato"
diff --git a/locale/ru/LC_MESSAGES/converse.po b/locale/ru/LC_MESSAGES/converse.po
index 08c43591f..2afd79276 100644
--- a/locale/ru/LC_MESSAGES/converse.po
+++ b/locale/ru/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.10\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:22+0000\n"
"Last-Translator: Laconic Team \n"
"Language-Team: Laconic Team \n"
@@ -17,77 +17,83 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.6\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Удалить сообщения"
+
+#: src/converse-chatview.js:104
msgid "Close this chat box"
msgstr "Закрыть это окно чата"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Ваше сообщение"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "Я"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "набирает текст"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "перестал набирать"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "отошёл"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Показать это меню"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Вписать третьего человека"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Удалить сообщения"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Вы уверены, что хотите очистить сообщения из окна чата?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr "вышел из сети"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "занят"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Очистить все сообщения"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr "Спрятать список участников"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr "Вставить смайлик"
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "Инициировать звонок"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Контакты"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Соединение"
@@ -142,7 +148,7 @@ msgstr "Изменить ваш статус"
msgid "Custom status"
msgstr "Произвольный статус"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Сохранить"
@@ -220,207 +226,207 @@ msgstr "Пользователи не найдены"
msgid "Click to add as a chat contact"
msgstr "Кликните, чтобы добавить контакт"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Включить чат"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
#, fuzzy
msgid "Attempting to reconnect"
msgstr "Попытка восстановить соединение через 5 секунд"
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Ошибка"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Авторизация"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Не удалось авторизоваться"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr "Возникла ошибка при добавлении "
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr "Программа не поддерживает уведомления о статусе"
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Закрыть это окно чата"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Свернуть окно чата"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Кликните, чтобы развернуть чат"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Свёрнуто"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr "Свернуть окно чата"
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Сообщение"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Ошибка: невозможно выполнить команду"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr "Ошибка: \""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Вы уверены, что хотите очистить сообщения из этого чата?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr "Дать права администратора"
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Забанить пользователя в этом чате."
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr "Изменить роль пользователя на \"участник\""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Удалить пользователя из чата."
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
#, fuzzy
msgid "Write in 3rd person"
msgstr "Вписать третьего"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr "Сделать пользователя участником"
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "Запретить отправку сообщений"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Изменить свой псевдоним"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr "Предоставить права модератора пользователю"
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "Предоставить права владельца на этот чат"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr "Отозвать членство пользователя"
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
#, fuzzy
msgid "Set room topic"
msgstr "Установить тему"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "Разрешить заглушенным пользователям отправлять сообщения"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Отменить"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "При сохранение формы произошла ошибка."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Для доступа в чат необходим пароль."
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Пароль: "
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Отправить"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Этот чат не анонимный"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Этот чат показывает недоступных собеседников"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Этот чат не показывает недоступных собеседников"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Изменились настройки чата, не относящиеся к приватности"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Протокол чата включен"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Протокол чата выключен"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Этот чат больше не анонимный"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Этот чат частично анонимный"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Этот чат стал полностью анонимный"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Появился новый чат"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Вам запрещено подключатся к этому чату"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Вас выкинули из чата"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Вас удалили из-за изменения прав"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr "Вы отключены от чата, потому что он теперь только для участников"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -436,208 +442,208 @@ msgstr "Вы отключены от этого чата, потому что с
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s забанен"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
#, fuzzy
msgid "%1$s's nickname has changed"
msgstr "%1$s сменил псевдоним"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s выкинут"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "%1$s удалён, потому что изменились права"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s удалён, потому что не участник"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Ваш псевдоним автоматически изменён на: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "Ваш псевдоним изменён на: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
#, fuzzy
msgid "The reason given is: \""
msgstr "Причина: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Вы не участник этого чата"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Вы не указали псевдоним"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Вы не имеете права создавать чаты"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Псевдоним запрещён правилами чата"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Этот псевдоним уже занят другим пользователем"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Этот чат не существует"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Чат достиг максимального количества участников"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Тема %2$s устатновлена %1$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Модератор"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Собеседник"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Пользователь не может посылать сообщения в этот чат"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Пригласить"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Участники:"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "Вы собираетесь пригласить %1$s в чат \"%2$s\". "
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
"Вы можете дополнительно вставить сообщение, объясняющее причину приглашения."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Имя чата"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Псевдоним"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Сервер"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Присоединться к чату"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Показать чаты"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Чаты"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Нет чатов %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Чаты %1$s:"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Зайти в чат"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Показать больше информации об этом чате"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Описание:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Участники:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Свойства:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Требуется авторизация"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Скрыто"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Требуется приглашение"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Модерируемая"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Не анонимная"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Открыть чат"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Постоянный чат"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Публичный"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Частично анонимный"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Временный чат"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Немодерируемый"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s пригласил вас в чат: %2$s"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -645,41 +651,41 @@ msgstr "%1$s пригласил вас в чат: %2$s, по следующей
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "вышел из сети"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Восстанавливается зашифрованная сессия"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Генерируется секретный ключ"
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Ваш браузер может зависнуть."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -695,19 +701,19 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Не удалось проверить подлинность этого пользователя."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "Обмен секретным ключом с контактом."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Ваши сообщения больше не шифруются"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
#, fuzzy
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
@@ -716,28 +722,28 @@ msgstr ""
"Ваши сообщения шифруются, но ваша учётная запись не проверена вашим "
"собеседником."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
#, fuzzy
msgid "Your contact's identify has been verified."
msgstr "Ваша учётная запись проверена вашим собеседником."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "Ваш контакт закончил шифрование у себя, вы должны сделать тоже самое."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Ваше сообщение не отправлено"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Вы получили незашифрованное сообщение"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Вы получили нечитаемое зашифрованное сообщение"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -758,7 +764,7 @@ msgstr ""
"Если вы удостоверились, что отпечатки совпадают, нажмите OK; если нет "
"нажмите Отмена"
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -771,61 +777,61 @@ msgstr ""
"Вашему контакту будет задан этот вопрос, и если ответы совпадут (с учётом "
"регистра), его подлинность будет подтверждена."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Введите секретный вопрос"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Ответ на секретный вопрос"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Некоррекная схема аутентификации"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Ваши сообщения не шифруются. Нажмите здесь, чтобы настроить шифрование."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
#, fuzzy
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "Ваши сообщения шифруются, но ваш контакт не проверен."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
#, fuzzy
msgid "Your messages are encrypted and your contact verified."
msgstr "Ваши сообщения шифруются и ваш контакт проверен."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
"Ваш контакт закрыл свою часть приватной сессии, вы должны сделать тоже самое."
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Закончить шифрованную беседу"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Обновить шифрованную беседу"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Начать шифрованный разговор"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Проверить при помощи отпечатков"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Проверить при помощи SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Что это?"
@@ -835,19 +841,19 @@ msgstr "Что это?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "не зашифровано"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "не проверено"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "проверено"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "закончено"
@@ -983,35 +989,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Удалить контакт"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Кликните, чтобы принять запрос этого контакта"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Кликните, чтобы отклонить запрос этого контакта"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Кликните, чтобы начать общение"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr "Имя"
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Вы уверены, что хотите удалить этот контакт?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr "Возникла ошибка при удалении "
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Вы уверены, что хотите отклонить запрос от этого контакта?"
diff --git a/locale/uk/LC_MESSAGES/converse.po b/locale/uk/LC_MESSAGES/converse.po
index 5a8ef5486..e6fec7ec6 100644
--- a/locale/uk/LC_MESSAGES/converse.po
+++ b/locale/uk/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.7.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:22+0000\n"
"Last-Translator: Andriy Kopystyansky \n"
"Language-Team: Ukrainian\n"
@@ -20,79 +20,85 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "Видалити повідомлення"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "Клацніть, щоб відновити цей чат"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "Персональна вісточка"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "я"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr "друкує"
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr "припинив друкувати"
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
msgid "has gone away"
msgstr "пішов геть"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "Показати це меню"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "Писати від третьої особи"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "Видалити повідомлення"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Ви впевнені, що хочете очистити повідомлення з цього вікна чату?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
msgid "has gone offline"
msgstr "тепер поза мережею"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
msgid "is busy"
msgstr "зайнятий"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
msgid "Clear all messages"
msgstr "Очистити всі повідомлення"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
#, fuzzy
msgid "Hide the list of occupants"
msgstr "Сховати список учасників"
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr "Почати виклик"
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "Контакти"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "Під'єднуюсь"
@@ -149,7 +155,7 @@ msgstr "Клацніть, щоб змінити статус в чаті"
msgid "Custom status"
msgstr "Власний статус"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "Зберегти"
@@ -226,199 +232,199 @@ msgstr "Жодного користувача не знайдено"
msgid "Click to add as a chat contact"
msgstr "Клацніть, щоб додати як чат-контакт"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "Включити чат"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "Помилка"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "Автентикуюсь"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "Автентикація невдала"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "Клацніть, щоб відновити цей чат"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "Мінімізовано"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
msgid "Click to restore this chat"
msgstr "Клацніть, щоб відновити цей чат"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "Мінімізовано"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "Повідомлення"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr "Помилка: Не можу виконати команду"
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Ви впевнені, що хочете очистити повідомлення з цієї кімнати?"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr "Призначити користувача адміністратором"
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
msgid "Ban user from room"
msgstr "Заблокувати і викинути з кімнати"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
#, fuzzy
msgid "Change user role to occupant"
msgstr "Зробити користувача учасником"
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
msgid "Kick user from room"
msgstr "Викинути з кімнати"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
msgid "Write in 3rd person"
msgstr "Писати в 3-й особі"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr "Надати членство користувачу"
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr "Забрати можливість слати повідомлення"
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr "Змінити Ваше прізвисько"
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr "Надати права модератора"
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
msgid "Grant ownership of this room"
msgstr "Передати у власність цю кімнату"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr "Забрати членство в користувача"
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
msgid "Set room topic"
msgstr "Встановити тему кімнати"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr "Дозволити безголосому користувачу слати повідомлення"
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "Відміна"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "Трапилася помилка при спробі зберегти форму."
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "Ця кімната вимагає пароль"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "Пароль:"
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "Надіслати"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "Ця кімната не є анонімною"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "Ця кімната вже показує недоступних учасників"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "Ця кімната не показує недоступних учасників"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "Змінено конфігурацію кімнати, не повязану з приватністю"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "Журналювання кімнати тепер ввімкнено"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "Журналювання кімнати тепер вимкнено"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "Ця кімната тепер не-анонімна"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "Ця кімната тепер напів-анонімна"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "Ця кімната тепер повністю анонімна"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "Створено нову кімнату"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "Вам заблокували доступ до цієї кімнати"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "Вас викинули з цієї кімнати"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "Вас видалено з кімнати у зв'язку зі змінами власності кімнати"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
@@ -426,7 +432,7 @@ msgstr ""
"Вас видалено з цієї кімнати, оскільки вона тепер вимагає членства, а Ви ним "
"не є її членом"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -442,206 +448,206 @@ msgstr "Вас видалено з цієї кімнати, тому що MUC (
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s заблоковано"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
msgid "%1$s's nickname has changed"
msgstr "Прізвисько %1$s змінено"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s було викинуто звідси"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "%1$s було видалено через зміни власності кімнати"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "%1$s було виделано через відсутність членства"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "Ваше прізвисько було автоматично змінене на: %1$s"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
msgid "Your nickname has been changed to: %1$s"
msgstr "Ваше прізвисько було змінене на: %1$s"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr "Причиною вказано: \""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "Ви не є у списку членів цієї кімнати"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "Не вказане прізвисько"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "Вам не дозволено створювати нові кімнати"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Ваше прізвисько не відповідає політиці кімнати"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "Таке прізвисько вже зайняте"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "Такої кімнати (поки) не існує"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "Ця кімната досягнула максимуму учасників"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "Тема встановлена %1$s: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "Цей користувач є модератором"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "Цей користувач може слати повідомлення в цій кімнаті"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "Цей користувач НЕ МОЖЕ слати повідомлення в цій кімнаті"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr "Запросіть"
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
msgid "Occupants"
msgstr "Учасники"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "Ви запрошуєте %1$s до чату \"%2$s\". "
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
"Ви можете опціонально додати повідомлення, щоб пояснити причину запрошення."
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "Назва кімнати"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "Прізвисько"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "Сервер"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
msgid "Join Room"
msgstr "Приєднатися до кімнати"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "Показати кімнати"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "Кімнати"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "Жодної кімнати на %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "Кімнати на %1$s"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "Клацніть, щоб увійти в цю кімнату"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "Показати більше інформації про цю кімату"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "Опис:"
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "Присутні:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "Особливості:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "Вимагає автентикації"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "Прихована"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "Вимагає запрошення"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "Модерована"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "Не-анонімні"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "Увійти в кімнату"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "Постійна кімната"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "Публічна"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "Напів-анонімна"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "Тимчасова кімната"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "Немодерована"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s запрошує вас приєднатись до чату: %2$s"
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -650,41 +656,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "тепер поза мережею"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "Перевстановлюю криптований сеанс"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "Генерація приватного ключа."
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "Ваш браузер може підвиснути."
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
msgid ""
"Authentication request from %1$s\n"
"\n"
@@ -700,47 +706,47 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "Не можу перевірити автентичність цього користувача."
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
msgid "Exchanging private key with contact."
msgstr "Обмін приватним ключем з контактом."
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "Ваші повідомлення більше не криптуються"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr ""
"Ваші повідомлення вже криптуються, але особа Вашого контакту не перевірена."
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
msgid "Your contact's identify has been verified."
msgstr "Особу Вашого контакту перевірено."
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
"Ваш контакт припинив криптування зі свого боку, Вам слід зробити те саме."
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "Ваше повідомлення не може бути надіслане"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "Ми отримали некриптоване повідомлення"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "Ми отримали нечитабельне криптоване повідомлення"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -761,7 +767,7 @@ msgstr ""
"Якщо Ви підтверджуєте відповідність відбитка, клацніть Гаразд, інакше "
"клацніть Відміна."
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
@@ -774,60 +780,60 @@ msgstr ""
"Потім Вашого контакта запитають те саме питання, і якщо вони введуть ту саму "
"відповідь (враховуючи регістр), їх особи будуть перевірені."
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "Яке Ваше таємне питання?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "Яка відповідь на таємне питання?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "Надана некоректна схема автентикації"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Ваші повідомлення не криптуються. Клацніть тут, щоб увімкнути OTR-"
"криптування."
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "Ваші повідомлення криптуються, але Ваш контакт не був перевірений."
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
msgid "Your messages are encrypted and your contact verified."
msgstr "Ваші повідомлення криптуються і Ваш контакт перевірено."
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
"Ваш контакт закрив зі свого боку приватну сесію, Вам слід зробити те ж саме"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "Завершити криптовану розмову"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "Оновити криптовану розмову"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "Почати криптовану розмову"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "Перевірити за відбитками"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "Перевірити за SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "Що це?"
@@ -837,19 +843,19 @@ msgstr "Що це?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "некриптовано"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "неперевірено"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "перевірено"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "завершено"
@@ -984,35 +990,35 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "Клацніть, щоб видалити цей контакт"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
msgid "Click to accept this contact request"
msgstr "Клацніть, щоб прийняти цей запит контакту"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
msgid "Click to decline this contact request"
msgstr "Клацніть, щоб відхилити цей запит контакту"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "Клацніть, щоб почати розмову з цим контактом"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
msgid "Are you sure you want to remove this contact?"
msgstr "Ви впевнені, що хочете видалити цей контакт?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
msgid "Are you sure you want to decline this contact request?"
msgstr "Ви впевнені, що хочете відхилити цей запит контакту?"
diff --git a/locale/zh/LC_MESSAGES/converse.po b/locale/zh/LC_MESSAGES/converse.po
index fe471b54a..f4a7ba7bb 100644
--- a/locale/zh/LC_MESSAGES/converse.po
+++ b/locale/zh/LC_MESSAGES/converse.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-24 08:43+0000\n"
+"POT-Creation-Date: 2016-06-20 19:17+0000\n"
"PO-Revision-Date: 2016-04-07 10:23+0000\n"
"Last-Translator: Huxisuz Hu \n"
"Language-Team: Language zh\n"
@@ -19,82 +19,88 @@ msgstr ""
"lang: zh\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
-#: src/converse-chatview.js:96
+#: src/converse-chatview.js:103 src/converse-headline.js:99
+#: src/converse-muc.js:239
+#, fuzzy
+msgid "You have unread messages"
+msgstr "移除消息"
+
+#: src/converse-chatview.js:104
#, fuzzy
msgid "Close this chat box"
msgstr "点击恢复聊天窗口"
-#: src/converse-chatview.js:97
+#: src/converse-chatview.js:105
msgid "Personal message"
msgstr "私信"
-#: src/converse-chatview.js:292
+#: src/converse-chatview.js:279
msgid "me"
msgstr "我"
-#: src/converse-chatview.js:330
+#: src/converse-chatview.js:317
msgid "is typing"
msgstr ""
-#: src/converse-chatview.js:333
+#: src/converse-chatview.js:320
msgid "has stopped typing"
msgstr ""
-#: src/converse-chatview.js:337 src/converse-chatview.js:554
-#: src/converse-notification.js:161
+#: src/converse-chatview.js:324 src/converse-chatview.js:570
+#: src/converse-notification.js:171
#, fuzzy
msgid "has gone away"
msgstr "对方离开"
-#: src/converse-chatview.js:424 src/converse-muc.js:388
+#: src/converse-chatview.js:438 src/converse-muc.js:412
msgid "Show this menu"
msgstr "显示此项菜单"
-#: src/converse-chatview.js:425
+#: src/converse-chatview.js:439
msgid "Write in the third person"
msgstr "以第三者身份写"
-#: src/converse-chatview.js:426 src/converse-muc.js:386
+#: src/converse-chatview.js:440 src/converse-muc.js:410
msgid "Remove messages"
msgstr "移除消息"
-#: src/converse-chatview.js:511
+#: src/converse-chatview.js:527
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "你确定清除此次的聊天记录吗?"
-#: src/converse-chatview.js:552 src/converse-notification.js:159
+#: src/converse-chatview.js:568 src/converse-notification.js:169
#, fuzzy
msgid "has gone offline"
msgstr "对方已下线"
-#: src/converse-chatview.js:556 src/converse-notification.js:163
+#: src/converse-chatview.js:572 src/converse-notification.js:173
#, fuzzy
msgid "is busy"
msgstr "忙碌"
-#: src/converse-chatview.js:599
+#: src/converse-chatview.js:615
#, fuzzy
msgid "Clear all messages"
msgstr "私信"
-#: src/converse-chatview.js:600
+#: src/converse-chatview.js:616
msgid "Hide the list of occupants"
msgstr ""
-#: src/converse-chatview.js:601
+#: src/converse-chatview.js:617
msgid "Insert a smiley"
msgstr ""
-#: src/converse-chatview.js:602
+#: src/converse-chatview.js:618
msgid "Start a call"
msgstr ""
-#: src/converse-controlbox.js:177 src/converse-core.js:573
-#: src/converse-core.js:619 src/converse-rosterview.js:58
+#: src/converse-controlbox.js:177 src/converse-core.js:627
+#: src/converse-core.js:673 src/converse-rosterview.js:58
msgid "Contacts"
msgstr "联系人"
-#: src/converse-controlbox.js:265 src/converse-core.js:477
+#: src/converse-controlbox.js:265 src/converse-core.js:489
msgid "Connecting"
msgstr "连接中"
@@ -152,7 +158,7 @@ msgstr "点击这里改变聊天状态"
msgid "Custom status"
msgstr "DIY状态"
-#: src/converse-controlbox.js:494 src/converse-muc.js:556
+#: src/converse-controlbox.js:494 src/converse-muc.js:580
msgid "Save"
msgstr "保存"
@@ -230,211 +236,211 @@ msgstr "未找到用户"
msgid "Click to add as a chat contact"
msgstr "点击添加为好友"
-#: src/converse-controlbox.js:682
+#: src/converse-controlbox.js:683
msgid "Toggle chat"
msgstr "折叠聊天窗口"
-#: src/converse-core.js:434
+#: src/converse-core.js:446
msgid "Attempting to reconnect"
msgstr ""
-#: src/converse-core.js:475
+#: src/converse-core.js:487
msgid "Error"
msgstr "错误"
-#: src/converse-core.js:479
+#: src/converse-core.js:491
msgid "Authenticating"
msgstr "验证中"
-#: src/converse-core.js:481 src/converse-core.js:482
+#: src/converse-core.js:493 src/converse-core.js:494
msgid "Authentication Failed"
msgstr "验证失败"
-#: src/converse-core.js:889
+#: src/converse-core.js:934
msgid "Sorry, there was an error while trying to add "
msgstr ""
-#: src/converse-core.js:1060
+#: src/converse-core.js:1105
msgid "This client does not allow presence subscriptions"
msgstr ""
-#: src/converse-headline.js:96
+#: src/converse-headline.js:100
#, fuzzy
msgid "Close this box"
msgstr "点击恢复聊天窗口"
-#: src/converse-headline.js:97
+#: src/converse-headline.js:101
#, fuzzy
msgid "Minimize this box"
msgstr "最小化的"
-#: src/converse-minimize.js:318
+#: src/converse-minimize.js:325
#, fuzzy
msgid "Click to restore this chat"
msgstr "点击恢复聊天窗口"
-#: src/converse-minimize.js:475
+#: src/converse-minimize.js:482
msgid "Minimized"
msgstr "最小化的"
-#: src/converse-minimize.js:491
+#: src/converse-minimize.js:498
msgid "Minimize this chat box"
msgstr ""
-#: src/converse-muc.js:214
+#: src/converse-muc.js:241
msgid "Message"
msgstr "信息"
-#: src/converse-muc.js:276
+#: src/converse-muc.js:302
msgid "Error: could not execute the command"
msgstr ""
-#: src/converse-muc.js:334
+#: src/converse-muc.js:358
msgid "Error: the \""
msgstr ""
-#: src/converse-muc.js:344
+#: src/converse-muc.js:368
#, fuzzy
msgid "Are you sure you want to clear the messages from this room?"
msgstr "您并非此房间成员"
-#: src/converse-muc.js:384
+#: src/converse-muc.js:408
msgid "Change user's affiliation to admin"
msgstr ""
-#: src/converse-muc.js:385
+#: src/converse-muc.js:409
#, fuzzy
msgid "Ban user from room"
msgstr "阻止此用户进入房间"
-#: src/converse-muc.js:387
+#: src/converse-muc.js:411
msgid "Change user role to occupant"
msgstr ""
-#: src/converse-muc.js:389
+#: src/converse-muc.js:413
#, fuzzy
msgid "Kick user from room"
msgstr "把用户踢出房间"
-#: src/converse-muc.js:390
+#: src/converse-muc.js:414
#, fuzzy
msgid "Write in 3rd person"
msgstr "以第三者身份写"
-#: src/converse-muc.js:391
+#: src/converse-muc.js:415
msgid "Grant membership to a user"
msgstr ""
-#: src/converse-muc.js:392
+#: src/converse-muc.js:416
msgid "Remove user's ability to post messages"
msgstr ""
-#: src/converse-muc.js:393
+#: src/converse-muc.js:417
msgid "Change your nickname"
msgstr ""
-#: src/converse-muc.js:394
+#: src/converse-muc.js:418
msgid "Grant moderator role to user"
msgstr ""
-#: src/converse-muc.js:395
+#: src/converse-muc.js:419
#, fuzzy
msgid "Grant ownership of this room"
msgstr "您并非此房间成员"
-#: src/converse-muc.js:396
+#: src/converse-muc.js:420
msgid "Revoke user's membership"
msgstr ""
-#: src/converse-muc.js:397
+#: src/converse-muc.js:421
#, fuzzy
msgid "Set room topic"
msgstr "设置房间主题"
-#: src/converse-muc.js:398
+#: src/converse-muc.js:422
msgid "Allow muted user to post messages"
msgstr ""
-#: src/converse-muc.js:557 src/converse-register.js:216
+#: src/converse-muc.js:581 src/converse-register.js:216
#: src/converse-register.js:331
msgid "Cancel"
msgstr "取消"
-#: src/converse-muc.js:600
+#: src/converse-muc.js:624
msgid "An error occurred while trying to save the form."
msgstr "保存表单是出错。"
-#: src/converse-muc.js:642
+#: src/converse-muc.js:666
msgid "This chatroom requires a password"
msgstr "此聊天室需要密码"
-#: src/converse-muc.js:643
+#: src/converse-muc.js:667
msgid "Password: "
msgstr "密码:"
-#: src/converse-muc.js:644
+#: src/converse-muc.js:668
msgid "Submit"
msgstr "发送"
-#: src/converse-muc.js:679
+#: src/converse-muc.js:703
msgid "This room is not anonymous"
msgstr "此为非匿名聊天室"
-#: src/converse-muc.js:680
+#: src/converse-muc.js:704
msgid "This room now shows unavailable members"
msgstr "此聊天室显示不可用用户"
-#: src/converse-muc.js:681
+#: src/converse-muc.js:705
msgid "This room does not show unavailable members"
msgstr "此聊天室不显示不可用用户"
-#: src/converse-muc.js:682
+#: src/converse-muc.js:706
msgid "Non-privacy-related room configuration has changed"
msgstr "此聊天室设置(非私密性)已改变"
-#: src/converse-muc.js:683
+#: src/converse-muc.js:707
msgid "Room logging is now enabled"
msgstr "聊天室聊天记录已启用"
-#: src/converse-muc.js:684
+#: src/converse-muc.js:708
msgid "Room logging is now disabled"
msgstr "聊天室聊天记录已禁用"
-#: src/converse-muc.js:685
+#: src/converse-muc.js:709
msgid "This room is now non-anonymous"
msgstr "此聊天室非匿名"
-#: src/converse-muc.js:686
+#: src/converse-muc.js:710
msgid "This room is now semi-anonymous"
msgstr "此聊天室半匿名"
-#: src/converse-muc.js:687
+#: src/converse-muc.js:711
msgid "This room is now fully-anonymous"
msgstr "此聊天室完全匿名"
-#: src/converse-muc.js:688
+#: src/converse-muc.js:712
msgid "A new room has been created"
msgstr "新聊天室已创建"
-#: src/converse-muc.js:692 src/converse-muc.js:790
+#: src/converse-muc.js:716 src/converse-muc.js:816
msgid "You have been banned from this room"
msgstr "您已被此聊天室禁止入内"
-#: src/converse-muc.js:693
+#: src/converse-muc.js:717
msgid "You have been kicked from this room"
msgstr "您已被踢出次房间"
-#: src/converse-muc.js:694
+#: src/converse-muc.js:718
msgid "You have been removed from this room because of an affiliation change"
msgstr "由于关系变化,您已被移除此房间"
-#: src/converse-muc.js:695
+#: src/converse-muc.js:719
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr "您已被移除此房间因为此房间更改为只允许成员加入,而您非成员"
-#: src/converse-muc.js:696
+#: src/converse-muc.js:720
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
@@ -450,210 +456,210 @@ msgstr "由于服务不可用,您已被移除此房间。"
#. * can then at least tell gettext to scan for it so that these
#. * strings are picked up by the translation machinery.
#.
-#: src/converse-muc.js:710
+#: src/converse-muc.js:734
msgid "%1$s has been banned"
msgstr "%1$s 已被禁止"
-#: src/converse-muc.js:711
+#: src/converse-muc.js:735
#, fuzzy
msgid "%1$s's nickname has changed"
msgstr "%1$s 已被禁止"
-#: src/converse-muc.js:712
+#: src/converse-muc.js:736
msgid "%1$s has been kicked out"
msgstr "%1$s 已被踢出"
-#: src/converse-muc.js:713
+#: src/converse-muc.js:737
msgid "%1$s has been removed because of an affiliation change"
msgstr "由于关系解除、%1$s 已被移除"
-#: src/converse-muc.js:714
+#: src/converse-muc.js:738
msgid "%1$s has been removed for not being a member"
msgstr "由于不是成员、%1$s 已被移除"
-#: src/converse-muc.js:718
+#: src/converse-muc.js:742
#, fuzzy
msgid "Your nickname has been automatically changed to: %1$s"
msgstr "您的昵称被更改了"
-#: src/converse-muc.js:719
+#: src/converse-muc.js:743
#, fuzzy
msgid "Your nickname has been changed to: %1$s"
msgstr "您的昵称被更改了"
-#: src/converse-muc.js:766 src/converse-muc.js:775
+#: src/converse-muc.js:790 src/converse-muc.js:799
msgid "The reason given is: \""
msgstr ""
-#: src/converse-muc.js:788
+#: src/converse-muc.js:814
msgid "You are not on the member list of this room"
msgstr "您并非此房间成员"
-#: src/converse-muc.js:794
+#: src/converse-muc.js:820
msgid "No nickname was specified"
msgstr "未指定昵称"
-#: src/converse-muc.js:798
+#: src/converse-muc.js:824
msgid "You are not allowed to create new rooms"
msgstr "您可此创建新房间了"
-#: src/converse-muc.js:800
+#: src/converse-muc.js:826
msgid "Your nickname doesn't conform to this room's policies"
msgstr "您的昵称不符合此房间标准"
-#: src/converse-muc.js:802
+#: src/converse-muc.js:828
msgid "Your nickname is already taken"
msgstr "您的昵称已被占用"
-#: src/converse-muc.js:805
+#: src/converse-muc.js:831
msgid "This room does not (yet) exist"
msgstr "此房间不存在"
-#: src/converse-muc.js:807
+#: src/converse-muc.js:833
#, fuzzy
msgid "This room has reached its maximum number of occupants"
msgstr "此房间人数已达上线"
-#: src/converse-muc.js:853
+#: src/converse-muc.js:861
msgid "Topic set by %1$s to: %2$s"
msgstr "%1$s 设置话题为: %2$s"
-#: src/converse-muc.js:905
+#: src/converse-muc.js:941
msgid "This user is a moderator"
msgstr "此用户是主持人"
-#: src/converse-muc.js:906
+#: src/converse-muc.js:942
msgid "This user can send messages in this room"
msgstr "此用户在这房间里可发消息"
-#: src/converse-muc.js:907
+#: src/converse-muc.js:943
msgid "This user can NOT send messages in this room"
msgstr "此用户不可在此房间发消息"
-#: src/converse-muc.js:935
+#: src/converse-muc.js:972
msgid "Invite"
msgstr ""
-#: src/converse-muc.js:936
+#: src/converse-muc.js:973
#, fuzzy
msgid "Occupants"
msgstr "成员:"
-#: src/converse-muc.js:1032
+#: src/converse-muc.js:1072
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr ""
-#: src/converse-muc.js:1033
+#: src/converse-muc.js:1073
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
-#: src/converse-muc.js:1075
+#: src/converse-muc.js:1115
msgid "Room name"
msgstr "聊天室名称"
-#: src/converse-muc.js:1076
+#: src/converse-muc.js:1116
msgid "Nickname"
msgstr "昵称"
-#: src/converse-muc.js:1077
+#: src/converse-muc.js:1117
msgid "Server"
msgstr "服务器"
-#: src/converse-muc.js:1078
+#: src/converse-muc.js:1118
#, fuzzy
msgid "Join Room"
msgstr "加入"
-#: src/converse-muc.js:1079
+#: src/converse-muc.js:1119
msgid "Show rooms"
msgstr "显示所有聊天室"
-#: src/converse-muc.js:1083
+#: src/converse-muc.js:1123
msgid "Rooms"
msgstr "聊天室"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
-#: src/converse-muc.js:1103
+#: src/converse-muc.js:1143
msgid "No rooms on %1$s"
msgstr "%1$s 上没有聊天室"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
-#: src/converse-muc.js:1117
+#: src/converse-muc.js:1157
msgid "Rooms on %1$s"
msgstr "%1$s 上的聊天室"
-#: src/converse-muc.js:1126
+#: src/converse-muc.js:1166
msgid "Click to open this room"
msgstr "打开聊天室"
-#: src/converse-muc.js:1127
+#: src/converse-muc.js:1167
msgid "Show more information on this room"
msgstr "显示次聊天室的更多信息"
-#: src/converse-muc.js:1199
+#: src/converse-muc.js:1239
msgid "Description:"
msgstr "描述: "
-#: src/converse-muc.js:1200
+#: src/converse-muc.js:1240
msgid "Occupants:"
msgstr "成员:"
-#: src/converse-muc.js:1201
+#: src/converse-muc.js:1241
msgid "Features:"
msgstr "特性:"
-#: src/converse-muc.js:1202
+#: src/converse-muc.js:1242
msgid "Requires authentication"
msgstr "需要验证"
-#: src/converse-muc.js:1203
+#: src/converse-muc.js:1243
msgid "Hidden"
msgstr "隐藏的"
-#: src/converse-muc.js:1204
+#: src/converse-muc.js:1244
msgid "Requires an invitation"
msgstr "需要被邀请"
-#: src/converse-muc.js:1205
+#: src/converse-muc.js:1245
msgid "Moderated"
msgstr "发言受限"
-#: src/converse-muc.js:1206
+#: src/converse-muc.js:1246
msgid "Non-anonymous"
msgstr "非匿名"
-#: src/converse-muc.js:1207
+#: src/converse-muc.js:1247
msgid "Open room"
msgstr "打开聊天室"
-#: src/converse-muc.js:1208
+#: src/converse-muc.js:1248
msgid "Permanent room"
msgstr "永久聊天室"
-#: src/converse-muc.js:1209
+#: src/converse-muc.js:1249
msgid "Public"
msgstr "公开的"
-#: src/converse-muc.js:1210
+#: src/converse-muc.js:1250
msgid "Semi-anonymous"
msgstr "半匿名"
-#: src/converse-muc.js:1211
+#: src/converse-muc.js:1251
msgid "Temporary room"
msgstr "临时聊天室"
-#: src/converse-muc.js:1212
+#: src/converse-muc.js:1252
msgid "Unmoderated"
msgstr "无发言限制"
-#: src/converse-muc.js:1289
+#: src/converse-muc.js:1329
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr ""
-#: src/converse-muc.js:1294
+#: src/converse-muc.js:1334
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
@@ -661,41 +667,41 @@ msgstr ""
#. XXX: 2nd check is workaround for Prosody which doesn't
#. give type "headline"
-#: src/converse-notification.js:126
+#: src/converse-notification.js:136
msgid "Notification from %1$s"
msgstr ""
-#: src/converse-notification.js:129 src/converse-notification.js:137
+#: src/converse-notification.js:139 src/converse-notification.js:147
msgid "%1$s says"
msgstr ""
-#: src/converse-notification.js:165
+#: src/converse-notification.js:175
#, fuzzy
msgid "has come online"
msgstr "对方已下线"
-#: src/converse-notification.js:180
+#: src/converse-notification.js:190
msgid "wants to be your contact"
msgstr ""
-#: src/converse-notification.js:188
+#: src/converse-notification.js:198
msgid "An error has occured"
msgstr ""
#. Verified that the passphrase is still the same
-#: src/converse-otr.js:158
+#: src/converse-otr.js:152
msgid "Re-establishing encrypted session"
msgstr "重新建立加密会话"
-#: src/converse-otr.js:170
+#: src/converse-otr.js:164
msgid "Generating private key."
msgstr "正在生成私钥"
-#: src/converse-otr.js:171
+#: src/converse-otr.js:165
msgid "Your browser might become unresponsive."
msgstr "您的浏览器可能会暂时无响应"
-#: src/converse-otr.js:207
+#: src/converse-otr.js:201
#, fuzzy
msgid ""
"Authentication request from %1$s\n"
@@ -711,49 +717,49 @@ msgstr ""
"\n"
"%2$s"
-#: src/converse-otr.js:216
+#: src/converse-otr.js:210
msgid "Could not verify this user's identify."
msgstr "无法验证对方信息。"
-#: src/converse-otr.js:256
+#: src/converse-otr.js:250
#, fuzzy
msgid "Exchanging private key with contact."
msgstr "正在与对方交换私钥"
-#: src/converse-otr.js:340
+#: src/converse-otr.js:337
msgid "Your messages are not encrypted anymore"
msgstr "您的消息将不再被加密"
-#: src/converse-otr.js:342
+#: src/converse-otr.js:339
#, fuzzy
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr "您的消息现已加密,但是对方身份尚未验证"
-#: src/converse-otr.js:344
+#: src/converse-otr.js:341
#, fuzzy
msgid "Your contact's identify has been verified."
msgstr "对方的身份已通过验证。"
-#: src/converse-otr.js:346
+#: src/converse-otr.js:343
#, fuzzy
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr "对方已结束加密,您也需要做同样的操作。"
-#: src/converse-otr.js:355
+#: src/converse-otr.js:352
msgid "Your message could not be sent"
msgstr "您的消息无法送出"
-#: src/converse-otr.js:358
+#: src/converse-otr.js:355
msgid "We received an unencrypted message"
msgstr "我们收到了一条未加密的信息"
-#: src/converse-otr.js:361
+#: src/converse-otr.js:358
msgid "We received an unreadable encrypted message"
msgstr "我们收到一条无法读取的信息"
-#: src/converse-otr.js:388
+#: src/converse-otr.js:385
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
@@ -773,7 +779,7 @@ msgstr ""
"\n"
"如果确认符合,请点击OK,否则点击取消"
-#: src/converse-otr.js:401
+#: src/converse-otr.js:398
#, fuzzy
msgid ""
"You will be prompted to provide a security question and then an answer to "
@@ -786,60 +792,60 @@ msgstr ""
"\n"
"对方需要回答相同的问题(区分大小写),如果答案一致,身份将被验证。"
-#: src/converse-otr.js:402
+#: src/converse-otr.js:399
msgid "What is your security question?"
msgstr "您的安全问题是?"
-#: src/converse-otr.js:404
+#: src/converse-otr.js:401
msgid "What is the answer to the security question?"
msgstr "此安全问题的答案是?"
-#: src/converse-otr.js:408
+#: src/converse-otr.js:405
msgid "Invalid authentication scheme provided"
msgstr "非法的认证方式"
-#: src/converse-otr.js:420
+#: src/converse-otr.js:417
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr "您的消息未加密。点击这里来启用OTR加密"
-#: src/converse-otr.js:422
+#: src/converse-otr.js:419
#, fuzzy
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "您的消息已加密,但对方未通过验证"
-#: src/converse-otr.js:424
+#: src/converse-otr.js:421
#, fuzzy
msgid "Your messages are encrypted and your contact verified."
msgstr "您的消息已加密,对方已验证。"
-#: src/converse-otr.js:426
+#: src/converse-otr.js:423
#, fuzzy
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr "对方已关闭私有会话,您也应该关闭"
-#: src/converse-otr.js:443
+#: src/converse-otr.js:440
msgid "End encrypted conversation"
msgstr "结束加密的会话"
-#: src/converse-otr.js:444
+#: src/converse-otr.js:441
msgid "Refresh encrypted conversation"
msgstr "刷新加密的会话"
-#: src/converse-otr.js:445
+#: src/converse-otr.js:442
msgid "Start encrypted conversation"
msgstr "开始加密的会话"
-#: src/converse-otr.js:446
+#: src/converse-otr.js:443
msgid "Verify with fingerprints"
msgstr "验证指纹"
-#: src/converse-otr.js:447
+#: src/converse-otr.js:444
msgid "Verify with SMP"
msgstr "验证SMP"
-#: src/converse-otr.js:448
+#: src/converse-otr.js:445
msgid "What's this?"
msgstr "这是什么?"
@@ -849,19 +855,19 @@ msgstr "这是什么?"
#. has been initialized and with it the i18n machinery. That's why
#. we do it here in the "initialize" method and not at the top of
#. the module.
-#: src/converse-otr.js:474
+#: src/converse-otr.js:471
msgid "unencrypted"
msgstr "未加密"
-#: src/converse-otr.js:475
+#: src/converse-otr.js:472
msgid "unverified"
msgstr "未验证"
-#: src/converse-otr.js:476
+#: src/converse-otr.js:473
msgid "verified"
msgstr "已验证"
-#: src/converse-otr.js:477
+#: src/converse-otr.js:474
msgid "finished"
msgstr "结束了"
@@ -992,38 +998,38 @@ msgstr ""
msgid "Extended Away"
msgstr ""
-#: src/converse-rosterview.js:576 src/converse-rosterview.js:597
+#: src/converse-rosterview.js:579 src/converse-rosterview.js:600
msgid "Click to remove this contact"
msgstr "点击移除联系人"
-#: src/converse-rosterview.js:584
+#: src/converse-rosterview.js:587
#, fuzzy
msgid "Click to accept this contact request"
msgstr "点击移除联系人"
-#: src/converse-rosterview.js:585
+#: src/converse-rosterview.js:588
#, fuzzy
msgid "Click to decline this contact request"
msgstr "点击移除联系人"
-#: src/converse-rosterview.js:596
+#: src/converse-rosterview.js:599
msgid "Click to chat with this contact"
msgstr "点击与对方交谈"
-#: src/converse-rosterview.js:598
+#: src/converse-rosterview.js:601
msgid "Name"
msgstr ""
-#: src/converse-rosterview.js:653
+#: src/converse-rosterview.js:656
#, fuzzy
msgid "Are you sure you want to remove this contact?"
msgstr "确定移除联系人吗?"
-#: src/converse-rosterview.js:664
+#: src/converse-rosterview.js:667
msgid "Sorry, there was an error while trying to remove "
msgstr ""
-#: src/converse-rosterview.js:683
+#: src/converse-rosterview.js:686
#, fuzzy
msgid "Are you sure you want to decline this contact request?"
msgstr "确定移除联系人吗?"
diff --git a/package.json b/package.json
index 5f548a3d9..58fa67f48 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "converse.js",
- "version": "1.0.2",
+ "version": "1.0.3",
"description": "Browser based XMPP instant messaging client",
"main": "main.js",
"directories": {