From 598e29c9103df7c5a91daae7b9428628e2d3e4d9 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Mon, 20 Jun 2016 19:11:43 +0000 Subject: [PATCH] New release: 1.0.3 --- bower.json | 4 +- dist/converse-mobile.js | 4778 +++++++++++++------------ dist/converse-no-dependencies.js | 1084 +++--- dist/converse.js | 4793 ++++++++++++++------------ dist/templates.js | 19 +- docs/CHANGES.md | 4 +- docs/source/conf.py | 4 +- locale/af/LC_MESSAGES/converse.po | 336 +- locale/ca/LC_MESSAGES/converse.po | 336 +- locale/converse.pot | 335 +- locale/de/LC_MESSAGES/converse.po | 336 +- locale/en/LC_MESSAGES/converse.po | 336 +- locale/es/LC_MESSAGES/converse.po | 336 +- locale/fr/LC_MESSAGES/converse.po | 336 +- locale/he/LC_MESSAGES/converse.po | 336 +- locale/hu/LC_MESSAGES/converse.po | 336 +- locale/id/LC_MESSAGES/converse.po | 336 +- locale/it/LC_MESSAGES/converse.po | 336 +- locale/ja/LC_MESSAGES/converse.po | 336 +- locale/nb/LC_MESSAGES/converse.po | 336 +- locale/nl/LC_MESSAGES/converse.po | 336 +- locale/pl/LC_MESSAGES/converse.po | 336 +- locale/pt_BR/LC_MESSAGES/converse.po | 336 +- locale/ru/LC_MESSAGES/converse.po | 336 +- locale/uk/LC_MESSAGES/converse.po | 336 +- locale/zh/LC_MESSAGES/converse.po | 336 +- package.json | 2 +- 27 files changed, 8981 insertions(+), 8090 deletions(-) diff --git a/bower.json b/bower.json index d790632f1..3ad07ad67 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "converse.js", "description": "Web-based XMPP/Jabber chat client written in javascript", - "version": "1.0.2", + "version": "1.0.3", "license": "MPL-2.0", "devDependencies": { "jasmine": "https://github.com/jcbrand/jasmine.git#1_3_x", @@ -25,7 +25,7 @@ "bootstrap": "~3.2.0", "fontawesome": "~4.1.0", "typeahead.js": "https://raw.githubusercontent.com/jcbrand/typeahead.js/eedfb10505dd3a20123d1fafc07c1352d83f0ab3/dist/typeahead.jquery.js", - "strophejs": "1.2.5", + "strophejs": "1.2.7", "strophejs-plugins": "https://github.com/strophe/strophejs-plugins.git#amd", "bourbon": "~4.2.6" }, diff --git a/dist/converse-mobile.js b/dist/converse-mobile.js index 50b4c64fc..de0821753 100644 --- a/dist/converse-mobile.js +++ b/dist/converse-mobile.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 '; if (show_toolbar) { __p+='\n
    \n '; } @@ -24590,7 +24539,9 @@ __p+='\n '+ if (url) { __p+='\n \n '; } -__p+='\n \n

    \n \n

    \n
    \n '; +__p+='\n
    \n

    \n \n

    \n
    \n \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('
      \n
      \n
      \n \n '; if (show_textarea) { __p+='\n \n '; if (show_toolbar) { @@ -1081,9 +1085,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'; } @@ -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 '; if (show_toolbar) { __p+='\n
          \n '; } @@ -24590,7 +24539,9 @@ __p+='\n '+ if (url) { __p+='\n \n '; } -__p+='\n
          \n

          \n \n

          \n
          \n '; +__p+='\n
          \n

          \n \n

          \n
          \n \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('
            \n
            \n
            \n \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": {