From 6424844a906f8e7d30d2f97f84270339ae90c4e6 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Sun, 22 Jul 2018 10:43:47 +0200 Subject: [PATCH] Updated translation files --- dist/converse-no-dependencies.js | 882 +++++++++++++++++-------- locale/af/LC_MESSAGES/converse.json | 2 +- locale/af/LC_MESSAGES/converse.po | 840 +++++++++++------------ locale/bg/LC_MESSAGES/converse.json | 2 +- locale/bg/LC_MESSAGES/converse.po | 834 ++++++++++++----------- locale/ca/LC_MESSAGES/converse.json | 2 +- locale/ca/LC_MESSAGES/converse.po | 835 ++++++++++++----------- locale/converse.pot | 827 ++++++++++++----------- locale/de/LC_MESSAGES/converse.json | 2 +- locale/de/LC_MESSAGES/converse.po | 836 ++++++++++++----------- locale/es/LC_MESSAGES/converse.json | 2 +- locale/es/LC_MESSAGES/converse.po | 834 ++++++++++++----------- locale/eu/LC_MESSAGES/converse.json | 2 +- locale/eu/LC_MESSAGES/converse.po | 838 ++++++++++++----------- locale/fr/LC_MESSAGES/converse.json | 2 +- locale/he/LC_MESSAGES/converse.json | 2 +- locale/he/LC_MESSAGES/converse.po | 835 ++++++++++++----------- locale/hu/LC_MESSAGES/converse.json | 2 +- locale/hu/LC_MESSAGES/converse.po | 839 ++++++++++++----------- locale/id/LC_MESSAGES/converse.json | 2 +- locale/id/LC_MESSAGES/converse.po | 845 +++++++++++------------ locale/it/LC_MESSAGES/converse.json | 2 +- locale/it/LC_MESSAGES/converse.po | 835 ++++++++++++----------- locale/ja/LC_MESSAGES/converse.json | 2 +- locale/ja/LC_MESSAGES/converse.po | 850 ++++++++++++------------ locale/lt/LC_MESSAGES/converse.json | 2 +- locale/lt/LC_MESSAGES/converse.po | 832 ++++++++++++----------- locale/nb/LC_MESSAGES/converse.json | 2 +- locale/nb/LC_MESSAGES/converse.po | 840 ++++++++++++----------- locale/nl/LC_MESSAGES/converse.json | 2 +- locale/nl_BE/LC_MESSAGES/converse.json | 2 +- locale/pl/LC_MESSAGES/converse.json | 2 +- locale/pl/LC_MESSAGES/converse.po | 835 ++++++++++++----------- locale/pt_BR/LC_MESSAGES/converse.json | 2 +- locale/pt_BR/LC_MESSAGES/converse.po | 837 +++++++++++------------ locale/ru/LC_MESSAGES/converse.json | 2 +- locale/ru/LC_MESSAGES/converse.po | 834 ++++++++++++----------- locale/tr/LC_MESSAGES/converse.json | 2 +- locale/tr/LC_MESSAGES/converse.po | 827 ++++++++++++----------- locale/uk/LC_MESSAGES/converse.json | 2 +- locale/uk/LC_MESSAGES/converse.po | 835 ++++++++++++----------- locale/zh_CN/LC_MESSAGES/converse.json | 2 +- locale/zh_CN/LC_MESSAGES/converse.po | 833 ++++++++++++----------- locale/zh_TW/LC_MESSAGES/converse.json | 2 +- locale/zh_TW/LC_MESSAGES/converse.po | 841 +++++++++++------------ 45 files changed, 9717 insertions(+), 8773 deletions(-) diff --git a/dist/converse-no-dependencies.js b/dist/converse-no-dependencies.js index 2a0c13134..c9175d2db 100644 --- a/dist/converse-no-dependencies.js +++ b/dist/converse-no-dependencies.js @@ -41357,6 +41357,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ utils = _converse$env.utils, _ = _converse$env._; var u = converse.env.utils; + Strophe.addNamespace('MESSAGE_CORRECT', 'urn:xmpp:message-correct:0'); converse.plugins.add('converse-chatboxes', { dependencies: ["converse-roster", "converse-vcard"], overrides: { @@ -41566,10 +41567,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }, false); xhr.onerror = function () { - var message = __('Sorry, could not succesfully upload your file.'); + var message; if (xhr.responseText) { - message += ' ' + __('Your server\'s response: "%1$s"', xhr.responseText); + message = __('Sorry, could not succesfully upload your file. Your server’s response: "%1$s"', xhr.responseText); + } else { + message = __('Sorry, could not succesfully upload your file.'); } _this3.save({ @@ -41637,6 +41640,26 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ getDisplayName: function getDisplayName() { return this.vcard.get('fullname') || this.get('jid'); }, + handleMessageCorrection: function handleMessageCorrection(stanza) { + var replace = sizzle("replace[xmlns=\"".concat(Strophe.NS.MESSAGE_CORRECT, "\"]"), stanza).pop(); + + if (replace) { + var msgid = replace && replace.getAttribute('id') || stanza.getAttribute('id'), + message = msgid && this.messages.findWhere({ + msgid: msgid + }), + older_versions = message.get('older_versions') || []; + older_versions.push(message.get('message')); + message.save({ + 'message': _converse.chatboxes.getMessageBody(stanza), + 'older_versions': older_versions, + 'edited': true + }); + return true; + } + + return false; + }, createMessageStanza: function createMessageStanza(message) { /* Given a _converse.Message Backbone.Model, return the XML * stanza that represents it. @@ -41648,7 +41671,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ 'from': _converse.connection.jid, 'to': this.get('jid'), 'type': this.get('message_type'), - 'id': message.get('msgid') + 'id': message.get('edited') && _converse.connection.getUniqueId() || message.get('msgid') }).c('body').t(message.get('message')).up().c(_converse.ACTIVE, { 'xmlns': Strophe.NS.CHATSTATES }).up(); @@ -41671,6 +41694,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }).c('url').t(message.get('message')).up(); } + if (message.get('edited')) { + stanza.c('replace', { + 'xmlns': Strophe.NS.MESSAGE_CORRECT, + 'id': message.get('msgid') + }).up(); + } + return stanza; }, sendMessageStanza: function sendMessageStanza(message) { @@ -41712,7 +41742,21 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * Parameters: * (Message) message - The chat message */ - this.sendMessageStanza(this.messages.create(attrs)); + var message = this.messages.findWhere('correcting'); + + if (message) { + var older_versions = message.get('older_versions') || []; + older_versions.push(message.get('message')); + message.save({ + 'message': attrs.message, + 'older_versions': older_versions, + 'edited': true, + 'correcting': false + }); + return this.sendMessageStanza(message); + } + + return this.sendMessageStanza(this.messages.create(attrs)); }, sendChatState: function sendChatState() { /* Sends a message with the status of the user in this chat session @@ -41770,22 +41814,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }); }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); }, - getMessageBody: function getMessageBody(message) { - var type = message.getAttribute('type'); - - if (type === 'error') { - var error = message.querySelector('error'); - return _.propertyOf(error.querySelector('text'))('textContent') || __('Sorry, an error occured:') + ' ' + error.innerHTML; - } else { - return _.propertyOf(message.querySelector('body'))('textContent'); - } - }, - getMessageAttributesFromStanza: function getMessageAttributesFromStanza(message, original_stanza) { + getMessageAttributesFromStanza: function getMessageAttributesFromStanza(stanza, original_stanza) { /* Parses a passed in message stanza and returns an object * of attributes. * * Parameters: - * (XMLElement) message - The message stanza + * (XMLElement) stanza - The message stanza * (XMLElement) delay - The node from the * stanza, if there was one. * (XMLElement) original_stanza - The original stanza, @@ -41797,21 +41831,21 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ archive = sizzle("result[xmlns=\"".concat(Strophe.NS.MAM, "\"]"), original_stanza).pop(), spoiler = sizzle("spoiler[xmlns=\"".concat(Strophe.NS.SPOILER, "\"]"), original_stanza).pop(), delay = sizzle("delay[xmlns=\"".concat(Strophe.NS.DELAY, "\"]"), original_stanza).pop(), - chat_state = message.getElementsByTagName(_converse.COMPOSING).length && _converse.COMPOSING || message.getElementsByTagName(_converse.PAUSED).length && _converse.PAUSED || message.getElementsByTagName(_converse.INACTIVE).length && _converse.INACTIVE || message.getElementsByTagName(_converse.ACTIVE).length && _converse.ACTIVE || message.getElementsByTagName(_converse.GONE).length && _converse.GONE; + chat_state = stanza.getElementsByTagName(_converse.COMPOSING).length && _converse.COMPOSING || stanza.getElementsByTagName(_converse.PAUSED).length && _converse.PAUSED || stanza.getElementsByTagName(_converse.INACTIVE).length && _converse.INACTIVE || stanza.getElementsByTagName(_converse.ACTIVE).length && _converse.ACTIVE || stanza.getElementsByTagName(_converse.GONE).length && _converse.GONE; var attrs = { 'chat_state': chat_state, 'is_archived': !_.isNil(archive), 'is_delayed': !_.isNil(delay), 'is_spoiler': !_.isNil(spoiler), - 'message': this.getMessageBody(message) || undefined, - 'msgid': message.getAttribute('id'), + 'message': _converse.chatboxes.getMessageBody(stanza) || undefined, + 'msgid': stanza.getAttribute('id'), 'time': delay ? delay.getAttribute('stamp') : moment().format(), - 'type': message.getAttribute('type') + 'type': stanza.getAttribute('type') }; if (attrs.type === 'groupchat') { - attrs.from = message.getAttribute('from'); + attrs.from = stanza.getAttribute('from'); attrs.nick = Strophe.unescapeNode(Strophe.getResourceFromJid(attrs.from)); if (attrs.from === this.get('nick')) { @@ -41820,7 +41854,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ attrs.sender = 'them'; } } else { - attrs.from = Strophe.getBareJidFromJid(message.getAttribute('from')); + attrs.from = Strophe.getBareJidFromJid(stanza.getAttribute('from')); if (attrs.from === _converse.bare_jid) { attrs.sender = 'me'; @@ -41831,7 +41865,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ } } - _.each(sizzle("x[xmlns=\"".concat(Strophe.NS.OUTOFBAND, "\"]"), message), function (xform) { + _.each(sizzle("x[xmlns=\"".concat(Strophe.NS.OUTOFBAND, "\"]"), stanza), function (xform) { attrs['oob_url'] = xform.querySelector('url').textContent; attrs['oob_desc'] = xform.querySelector('url').textContent; }); @@ -41952,24 +41986,34 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ chatbox.createMessage(message, message); return true; }, - onMessage: function onMessage(message) { + getMessageBody: function getMessageBody(stanza) { + /* Given a message stanza, return the text contained in its body. + */ + var type = stanza.getAttribute('type'); + + if (type === 'error') { + var error = stanza.querySelector('error'); + return _.propertyOf(error.querySelector('text'))('textContent') || __('Sorry, an error occurred:') + ' ' + error.innerHTML; + } else { + return _.propertyOf(stanza.querySelector('body'))('textContent'); + } + }, + onMessage: function onMessage(stanza) { /* Handler method for all incoming single-user chat "message" * stanzas. * * Parameters: - * (XMLElement) message - The incoming message stanza + * (XMLElement) stanza - The incoming message stanza */ - var from_jid = message.getAttribute('from'), - to_jid = message.getAttribute('to'); - var original_stanza = message, - to_resource = Strophe.getResourceFromJid(to_jid), - is_carbon = !_.isNull(message.querySelector("received[xmlns=\"".concat(Strophe.NS.CARBONS, "\"]"))); + var from_jid = stanza.getAttribute('from'), + to_jid = stanza.getAttribute('to'); + var to_resource = Strophe.getResourceFromJid(to_jid); if (_converse.filter_by_resource && to_resource && to_resource !== _converse.resource) { _converse.log("onMessage: Ignoring incoming message intended for a different resource: ".concat(to_jid), Strophe.LogLevel.INFO); return true; - } else if (utils.isHeadlineMessage(_converse, message)) { + } else if (utils.isHeadlineMessage(_converse, stanza)) { // XXX: Ideally we wouldn't have to check for headline // messages, but Prosody sends headline messages with the // wrong type ('chat'), so we need to filter them out here. @@ -41978,11 +42022,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ return true; } - var forwarded = message.querySelector('forwarded'); + var forwarded = stanza.querySelector('forwarded'), + original_stanza = stanza; if (!_.isNull(forwarded)) { - var forwarded_message = forwarded.querySelector('message'); - var forwarded_from = forwarded_message.getAttribute('from'); + var forwarded_message = forwarded.querySelector('message'), + forwarded_from = forwarded_message.getAttribute('from'), + is_carbon = !_.isNull(stanza.querySelector("received[xmlns=\"".concat(Strophe.NS.CARBONS, "\"]"))); if (is_carbon && Strophe.getBareJidFromJid(forwarded_from) !== from_jid) { // Prevent message forging via carbons @@ -41990,9 +42036,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ return true; } - message = forwarded_message; - from_jid = message.getAttribute('from'); - to_jid = message.getAttribute('to'); + stanza = forwarded_message; + from_jid = stanza.getAttribute('from'); + to_jid = stanza.getAttribute('to'); } var from_bare_jid = Strophe.getBareJidFromJid(from_jid), @@ -42011,19 +42057,18 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ var attrs = { 'fullname': _.get(_converse.api.contacts.get(contact_jid), 'attributes.fullname') }; - var chatbox = this.getChatBox(contact_jid, attrs, !_.isNull(message.querySelector('body'))), - msgid = message.getAttribute('id'); + var chatbox = this.getChatBox(contact_jid, attrs, !_.isNull(stanza.querySelector('body'))); - if (chatbox) { - var messages = msgid && chatbox.messages.findWhere({ + if (chatbox && !chatbox.handleMessageCorrection(stanza)) { + var msgid = stanza.getAttribute('id'), + message = msgid && chatbox.messages.findWhere({ msgid: msgid - }) || []; + }); - if (_.isEmpty(messages)) { - // Only create the message when we're sure it's not a - // duplicate + if (!message) { + // Only create the message when we're sure it's not a duplicate chatbox.incrementUnreadMsgCounter(original_stanza); - chatbox.createMessage(message, original_stanza); + chatbox.createMessage(stanza, original_stanza); } } @@ -42194,6 +42239,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }); _converse.on('addClientFeatures', function () { + _converse.api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT); + _converse.api.disco.own.features.add(Strophe.NS.HTTPUPLOAD); _converse.api.disco.own.features.add(Strophe.NS.OUTOFBAND); @@ -42312,11 +42359,11 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ // Copyright (c) 2012-2018, the Converse.js developers // Licensed under the Mozilla Public License (MPLv2) (function (root, factory) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! converse-core */ "./src/converse-core.js"), __webpack_require__(/*! bootstrap */ "./node_modules/bootstrap.native/dist/bootstrap-native-v4.js"), __webpack_require__(/*! emojione */ "./node_modules/emojione/lib/js/emojione.js"), __webpack_require__(/*! xss */ "./node_modules/xss/dist/xss.js"), __webpack_require__(/*! templates/action.html */ "./src/templates/action.html"), __webpack_require__(/*! templates/chatbox.html */ "./src/templates/chatbox.html"), __webpack_require__(/*! templates/chatbox_head.html */ "./src/templates/chatbox_head.html"), __webpack_require__(/*! templates/chatbox_message_form.html */ "./src/templates/chatbox_message_form.html"), __webpack_require__(/*! templates/emojis.html */ "./src/templates/emojis.html"), __webpack_require__(/*! templates/error_message.html */ "./src/templates/error_message.html"), __webpack_require__(/*! templates/help_message.html */ "./src/templates/help_message.html"), __webpack_require__(/*! templates/info.html */ "./src/templates/info.html"), __webpack_require__(/*! templates/new_day.html */ "./src/templates/new_day.html"), __webpack_require__(/*! templates/user_details_modal.html */ "./src/templates/user_details_modal.html"), __webpack_require__(/*! templates/toolbar_fileupload.html */ "./src/templates/toolbar_fileupload.html"), __webpack_require__(/*! templates/spinner.html */ "./src/templates/spinner.html"), __webpack_require__(/*! templates/spoiler_button.html */ "./src/templates/spoiler_button.html"), __webpack_require__(/*! templates/status_message.html */ "./src/templates/status_message.html"), __webpack_require__(/*! templates/toolbar.html */ "./src/templates/toolbar.html"), __webpack_require__(/*! converse-modal */ "./src/converse-modal.js"), __webpack_require__(/*! converse-chatboxes */ "./src/converse-chatboxes.js"), __webpack_require__(/*! converse-message-view */ "./src/converse-message-view.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! converse-core */ "./src/converse-core.js"), __webpack_require__(/*! bootstrap */ "./node_modules/bootstrap.native/dist/bootstrap-native-v4.js"), __webpack_require__(/*! emojione */ "./node_modules/emojione/lib/js/emojione.js"), __webpack_require__(/*! xss */ "./node_modules/xss/dist/xss.js"), __webpack_require__(/*! templates/chatbox.html */ "./src/templates/chatbox.html"), __webpack_require__(/*! templates/chatbox_head.html */ "./src/templates/chatbox_head.html"), __webpack_require__(/*! templates/chatbox_message_form.html */ "./src/templates/chatbox_message_form.html"), __webpack_require__(/*! templates/emojis.html */ "./src/templates/emojis.html"), __webpack_require__(/*! templates/error_message.html */ "./src/templates/error_message.html"), __webpack_require__(/*! templates/help_message.html */ "./src/templates/help_message.html"), __webpack_require__(/*! templates/info.html */ "./src/templates/info.html"), __webpack_require__(/*! templates/new_day.html */ "./src/templates/new_day.html"), __webpack_require__(/*! templates/user_details_modal.html */ "./src/templates/user_details_modal.html"), __webpack_require__(/*! templates/toolbar_fileupload.html */ "./src/templates/toolbar_fileupload.html"), __webpack_require__(/*! templates/spinner.html */ "./src/templates/spinner.html"), __webpack_require__(/*! templates/spoiler_button.html */ "./src/templates/spoiler_button.html"), __webpack_require__(/*! templates/status_message.html */ "./src/templates/status_message.html"), __webpack_require__(/*! templates/toolbar.html */ "./src/templates/toolbar.html"), __webpack_require__(/*! converse-modal */ "./src/converse-modal.js"), __webpack_require__(/*! converse-chatboxes */ "./src/converse-chatboxes.js"), __webpack_require__(/*! converse-message-view */ "./src/converse-message-view.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); -})(void 0, function (converse, bootstrap, emojione, xss, tpl_action, tpl_chatbox, tpl_chatbox_head, tpl_chatbox_message_form, tpl_emojis, tpl_error_message, tpl_help_message, tpl_info, tpl_new_day, tpl_user_details_modal, tpl_toolbar_fileupload, tpl_spinner, tpl_spoiler_button, tpl_status_message, tpl_toolbar) { +})(void 0, function (converse, bootstrap, emojione, xss, tpl_chatbox, tpl_chatbox_head, tpl_chatbox_message_form, tpl_emojis, tpl_error_message, tpl_help_message, tpl_info, tpl_new_day, tpl_user_details_modal, tpl_toolbar_fileupload, tpl_spinner, tpl_spoiler_button, tpl_status_message, tpl_toolbar) { "use strict"; var _converse$env = converse.env, @@ -42332,6 +42379,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ var u = converse.env.utils; var KEY = { ENTER: 13, + UP_ARROW: 38, + DOWN_ARROW: 40, FORWARD_SLASH: 47 }; converse.plugins.add('converse-chatview', { @@ -42585,6 +42634,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ // Leaky abstraction from MUC events: { 'change input.fileupload': 'onFileSelection', + 'click .chat-msg__action-edit': 'onMessageEditButtonClicked', 'click .chatbox-navback': 'showControlBox', 'click .close-chatbox-button': 'close', 'click .new-msgs-indicator': 'viewUnreadMessages', @@ -42597,8 +42647,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ 'click .toggle-smiley ul.emoji-picker li': 'insertEmoji', 'click .toggle-smiley': 'toggleEmojiMenu', 'click .upload-file': 'toggleFileUpload', - 'keypress .chat-textarea': 'keyPressed', - 'input .chat-textarea': 'inputChanged' + 'input .chat-textarea': 'inputChanged', + 'keydown .chat-textarea': 'keyPressed' }, initialize: function initialize() { this.initDebounced(); @@ -43006,18 +43056,18 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ date = moment(el.getAttribute('data-isodate')), next_el = el.nextElementSibling; - if (!u.hasClass('chat-action', el) && !u.hasClass('chat-action', previous_el) && previous_el.getAttribute('data-from') === from && date.isBefore(moment(previous_el.getAttribute('data-isodate')).add(10, 'minutes'))) { - u.addClass('chat-msg-followup', el); + if (!u.hasClass('chat-msg--action', el) && !u.hasClass('chat-msg--action', previous_el) && previous_el.getAttribute('data-from') === from && date.isBefore(moment(previous_el.getAttribute('data-isodate')).add(10, 'minutes'))) { + u.addClass('chat-msg--followup', el); } if (!next_el) { return; } - if (!u.hasClass('chat-action', 'el') && next_el.getAttribute('data-from') === from && moment(next_el.getAttribute('data-isodate')).isBefore(date.add(10, 'minutes'))) { - u.addClass('chat-msg-followup', next_el); + if (!u.hasClass('chat-msg--action', 'el') && next_el.getAttribute('data-from') === from && moment(next_el.getAttribute('data-isodate')).isBefore(date.add(10, 'minutes'))) { + u.addClass('chat-msg--followup', next_el); } else { - u.removeClass('chat-msg-followup', next_el); + u.removeClass('chat-msg--followup', next_el); } }, showMessage: function showMessage(message) { @@ -43063,6 +43113,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ */ this.showMessage(message); + if (message.get('correcting')) { + this.insertIntoTextArea(message.get('message'), true); + } + _converse.emit('messageAdded', { 'message': message, 'chatbox': this.model @@ -43157,14 +43211,99 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ keyPressed: function keyPressed(ev) { /* Event handler for when a key is pressed in a chat box textarea. */ - if (ev.keyCode === KEY.ENTER && !ev.shiftKey) { + if (ev.shiftKey) { + return; + } + + if (ev.keyCode === KEY.ENTER) { this.onFormSubmitted(ev); + } else if (ev.keyCode === KEY.UP_ARROW && !ev.target.selectionEnd) { + this.editEarlierMessage(); + } else if (ev.keyCode === KEY.DOWN_ARROW && ev.target.selectionEnd === ev.target.value.length) { + this.editLaterMessage(); } else if (ev.keyCode !== KEY.FORWARD_SLASH && this.model.get('chat_state') !== _converse.COMPOSING) { // Set chat state to composing if keyCode is not a forward-slash // (which would imply an internal command and not a message). this.setChatState(_converse.COMPOSING); } }, + getOwnMessages: function getOwnMessages() { + return f(this.model.messages.filter({ + 'sender': 'me' + })); + }, + onMessageEditButtonClicked: function onMessageEditButtonClicked(ev) { + var idx = this.model.messages.findLastIndex('correcting'), + currently_correcting = idx >= 0 ? this.model.messages.at(idx) : null, + message_el = u.ancestor(ev.target, '.chat-msg'), + message = this.model.messages.findWhere({ + 'msgid': message_el.getAttribute('data-msgid') + }); + + if (currently_correcting !== message) { + if (!_.isNil(currently_correcting)) { + currently_correcting.save('correcting', false); + } + + message.save('correcting', true); + this.insertIntoTextArea(message.get('message'), true); + } else { + message.save('correcting', false); + this.insertIntoTextArea('', true); + } + }, + editLaterMessage: function editLaterMessage() { + var message; + var idx = this.model.messages.findLastIndex('correcting'); + + if (idx >= 0) { + this.model.messages.at(idx).save('correcting', false); + + while (idx < this.model.messages.length - 1) { + idx += 1; + var candidate = this.model.messages.at(idx); + + if (candidate.get('sender') === 'me' && candidate.get('message')) { + message = candidate; + break; + } + } + } + + if (message) { + this.insertIntoTextArea(message.get('message'), true); + message.save('correcting', true); + } else { + this.insertIntoTextArea('', true); + } + }, + editEarlierMessage: function editEarlierMessage() { + var message; + var idx = this.model.messages.findLastIndex('correcting'); + + if (idx >= 0) { + this.model.messages.at(idx).save('correcting', false); + + while (idx > 0) { + idx -= 1; + var candidate = this.model.messages.at(idx); + + if (candidate.get('sender') === 'me' && candidate.get('message')) { + message = candidate; + break; + } + } + } + + message = message || this.getOwnMessages().findLast(function (msg) { + return msg.get('message'); + }); + + if (message) { + this.insertIntoTextArea(message.get('message'), true); + message.save('correcting', true); + } + }, inputChanged: function inputChanged(ev) { ev.target.style.height = 'auto'; // Fixes weirdness @@ -43187,15 +43326,22 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ return this; }, insertIntoTextArea: function insertIntoTextArea(value) { - var textbox_el = this.el.querySelector('.chat-textarea'); - var existing = textbox_el.value; + var replace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var textarea = this.el.querySelector('.chat-textarea'); - if (existing && existing[existing.length - 1] !== ' ') { - existing = existing + ' '; + if (replace) { + textarea.value = value; + } else { + var existing = textarea.value; + + if (existing && existing[existing.length - 1] !== ' ') { + existing = existing + ' '; + } + + textarea.value = existing + value + ' '; } - textbox_el.value = existing + value + ' '; - textbox_el.focus(); + textarea.focus(); }, createEmojiPicker: function createEmojiPicker() { if (_.isUndefined(_converse.emojipicker)) { @@ -43264,13 +43410,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ if (u.isVisible(this.el)) { if (show === 'offline') { - text = fullname + ' ' + __('has gone offline'); + text = __('%1$s has gone offline', fullname); } else if (show === 'away') { - text = fullname + ' ' + __('has gone away'); + text = __('%1$s has gone away', fullname); } else if (show === 'dnd') { - text = fullname + ' ' + __('is busy'); + text = __('%1$s is busy', fullname); } else if (show === 'online') { - text = fullname + ' ' + __('is online'); + text = __('%1$s is online', fullname); } if (text) { @@ -43652,8 +43798,6 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ _converse.api.promises.add('controlboxInitialized'); - var LABEL_CONTACTS = __('Contacts'); - _converse.addControlBox = function () { return _converse.chatboxes.add({ id: 'controlbox', @@ -43722,7 +43866,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ insertRoster: function insertRoster() { var _this = this; + if (_converse.authentication === _converse.ANONYMOUS) { + return; + } /* Place the rosterview inside the "Contacts" panel. */ + + _converse.api.waitUntil('rosterViewInitialized').then(function () { return _this.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el); }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); @@ -43927,7 +44076,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ var jid = form_data.get('jid'); if (_converse.locked_domain) { - jid = Strophe.escapeNode(jid) + '@' + _converse.locked_domain; + var last_part = '@' + _converse.locked_domain; + + if (jid.endsWith(last_part)) { + jid = jid.substr(0, jid.length - last_part.length); + } + + jid = Strophe.escapeNode(jid) + last_part; } else if (_converse.default_domain && !_.includes(jid, '@')) { jid = jid + '@' + _converse.default_domain; } @@ -44353,6 +44508,10 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde } }; + _converse.isSingleton = function () { + return _.includes(['mobile', 'fullscreen', 'embedded'], _converse.view_mode); + }; + _converse.router = new Backbone.Router(); _converse.initialize = function (settings, callback) { @@ -44867,7 +45026,7 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde }); this.connection.addHandler(function (iq) { if (iq.querySelectorAll('error').length > 0) { - _converse.log('An error occured while trying to enable message carbons.', Strophe.LogLevel.ERROR); + _converse.log('An error occurred while trying to enable message carbons.', Strophe.LogLevel.WARN); } else { _this2.session.save({ 'carbons_enabled': true @@ -47318,11 +47477,11 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ // Copyright (c) 2013-2018, the Converse.js developers // Licensed under the Mozilla Public License (MPLv2) (function (root, factory) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! converse-core */ "./src/converse-core.js"), __webpack_require__(/*! xss */ "./node_modules/xss/dist/xss.js"), __webpack_require__(/*! emojione */ "./node_modules/emojione/lib/js/emojione.js"), __webpack_require__(/*! filesize */ "./node_modules/filesize/lib/filesize.js"), __webpack_require__(/*! templates/action.html */ "./src/templates/action.html"), __webpack_require__(/*! templates/csn.html */ "./src/templates/csn.html"), __webpack_require__(/*! templates/file_progress.html */ "./src/templates/file_progress.html"), __webpack_require__(/*! templates/info.html */ "./src/templates/info.html"), __webpack_require__(/*! templates/message.html */ "./src/templates/message.html"), __webpack_require__(/*! templates/spoiler_message.html */ "./src/templates/spoiler_message.html")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! converse-core */ "./src/converse-core.js"), __webpack_require__(/*! xss */ "./node_modules/xss/dist/xss.js"), __webpack_require__(/*! emojione */ "./node_modules/emojione/lib/js/emojione.js"), __webpack_require__(/*! filesize */ "./node_modules/filesize/lib/filesize.js"), __webpack_require__(/*! templates/csn.html */ "./src/templates/csn.html"), __webpack_require__(/*! templates/file_progress.html */ "./src/templates/file_progress.html"), __webpack_require__(/*! templates/info.html */ "./src/templates/info.html"), __webpack_require__(/*! templates/message.html */ "./src/templates/message.html"), __webpack_require__(/*! templates/message_versions_modal.html */ "./src/templates/message_versions_modal.html")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); -})(void 0, function (converse, xss, emojione, filesize, tpl_action, tpl_csn, tpl_file_progress, tpl_info, tpl_message, tpl_spoiler_message) { +})(void 0, function (converse, xss, emojione, filesize, tpl_csn, tpl_file_progress, tpl_info, tpl_message, tpl_message_versions_modal) { "use strict"; var _converse$env = converse.env, @@ -47365,9 +47524,21 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ img.src = img_src; } }); + _converse.MessageVersionsModal = _converse.BootstrapModal.extend({ + toHTML: function toHTML() { + return tpl_message_versions_modal(_.extend(this.model.toJSON(), { + '__': __ + })); + } + }); _converse.MessageView = _converse.ViewWithAvatar.extend({ + events: { + 'click .chat-msg__edit-modal': 'showMessageVersionsModal' + }, initialize: function initialize() { this.model.vcard.on('change', this.render, this); + this.model.on('change:correcting', this.onMessageCorrection, this); + this.model.on('change:message', this.render, this); this.model.on('change:progress', this.renderFileUploadProgresBar, this); this.model.on('change:type', this.render, this); this.model.on('change:upload', this.render, this); @@ -47375,7 +47546,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ this.render(); }, render: function render() { - var is_followup = u.hasClass('chat-msg-followup', this.el); + var is_followup = u.hasClass('chat-msg--followup', this.el); var msg; if (this.model.isOnlyChatStateNotification()) { @@ -47389,11 +47560,23 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ } if (is_followup) { - u.addClass('chat-msg-followup', this.el); + u.addClass('chat-msg--followup', this.el); } return this.el; }, + onMessageCorrection: function onMessageCorrection() { + var _this = this; + + this.render(); + + if (!this.model.get('correcting') && this.model.changed.message) { + this.el.addEventListener('animationend', function () { + return u.removeClass('onload', _this.el); + }); + u.addClass('onload', this.el); + } + }, replaceElement: function replaceElement(msg) { if (!_.isNil(this.el.parentElement)) { this.el.parentElement.replaceChild(msg, this.el); @@ -47403,22 +47586,15 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ return this.el; }, renderChatMessage: function renderChatMessage() { - var _this = this; + var _this2 = this; - var template, - text = this.model.get('message'); - - if (this.isMeCommand()) { - template = tpl_action; - text = this.model.get('message').replace(/^\/me/, ''); - } else { - template = this.model.get('is_spoiler') ? tpl_spoiler_message : tpl_message; - } - - var moment_time = moment(this.model.get('time')), + var is_me_message = this.isMeCommand(), + moment_time = moment(this.model.get('time')), role = this.model.vcard.get('role'), roles = role ? role.split(',') : []; - var msg = u.stringToElement(template(_.extend(this.model.toJSON(), { + var msg = u.stringToElement(tpl_message(_.extend(this.model.toJSON(), { + '__': __, + 'is_me_message': is_me_message, 'roles': roles, 'pretty_time': moment_time.format(_converse.time_format), 'time': moment_time.format(), @@ -47429,10 +47605,16 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ var url = this.model.get('oob_url'); if (url) { - msg.querySelector('.chat-msg-media').innerHTML = _.flow(_.partial(u.renderFileURL, _converse), _.partial(u.renderMovieURL, _converse), _.partial(u.renderAudioURL, _converse), _.partial(u.renderImageURL, _converse))(url); + msg.querySelector('.chat-msg__media').innerHTML = _.flow(_.partial(u.renderFileURL, _converse), _.partial(u.renderMovieURL, _converse), _.partial(u.renderAudioURL, _converse), _.partial(u.renderImageURL, _converse))(url); } - var msg_content = msg.querySelector('.chat-msg-text'); + var text = this.model.get('message'); + + if (is_me_message) { + text = text.replace(/^\/me/, ''); + } + + var msg_content = msg.querySelector('.chat-msg__text'); if (text !== url) { text = xss.filterXSS(text, { @@ -47442,7 +47624,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ } u.renderImageURLs(_converse, msg_content).then(function () { - _this.model.collection.trigger('rendered'); + _this2.model.collection.trigger('rendered'); }); this.replaceElement(msg); @@ -47468,16 +47650,16 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ if (this.model.get('sender') === 'me') { text = __('Typing from another device'); } else { - text = name + ' ' + __('is typing'); + text = __('%1$s is typing', name); } } else if (this.model.get('chat_state') === _converse.PAUSED) { if (this.model.get('sender') === 'me') { text = __('Stopped typing on the other device'); } else { - text = name + ' ' + __('has stopped typing'); + text = __('%1$s has stopped typing', name); } } else if (this.model.get('chat_state') === _converse.GONE) { - text = name + ' ' + __('has gone away'); + text = __('%1$s has gone away', name); } else { return; } @@ -47496,6 +47678,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ this.replaceElement(msg); this.renderAvatar(); }, + showMessageVersionsModal: function showMessageVersionsModal(ev) { + ev.preventDefault(); + + if (_.isUndefined(this.model.message_versions_modal)) { + this.model.message_versions_modal = new _converse.MessageVersionsModal({ + 'model': this.model + }); + } + + this.model.message_versions_modal.show(ev); + }, isMeCommand: function isMeCommand() { var text = this.model.get('message'); @@ -47521,6 +47714,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ } } + if (this.model.get('correcting')) { + extra_classes += ' correcting'; + } + return extra_classes; } }); @@ -48244,11 +48441,11 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ // Copyright (c) 2012-2018, the Converse.js developers // Licensed under the Mozilla Public License (MPLv2) (function (root, factory) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! converse-core */ "./src/converse-core.js"), __webpack_require__(/*! utils/muc */ "./src/utils/muc.js"), __webpack_require__(/*! templates/add_chatroom_modal.html */ "./src/templates/add_chatroom_modal.html"), __webpack_require__(/*! templates/chatarea.html */ "./src/templates/chatarea.html"), __webpack_require__(/*! templates/chatroom.html */ "./src/templates/chatroom.html"), __webpack_require__(/*! templates/chatroom_details_modal.html */ "./src/templates/chatroom_details_modal.html"), __webpack_require__(/*! templates/chatroom_disconnect.html */ "./src/templates/chatroom_disconnect.html"), __webpack_require__(/*! templates/chatroom_features.html */ "./src/templates/chatroom_features.html"), __webpack_require__(/*! templates/chatroom_form.html */ "./src/templates/chatroom_form.html"), __webpack_require__(/*! templates/chatroom_head.html */ "./src/templates/chatroom_head.html"), __webpack_require__(/*! templates/chatroom_invite.html */ "./src/templates/chatroom_invite.html"), __webpack_require__(/*! templates/chatroom_nickname_form.html */ "./src/templates/chatroom_nickname_form.html"), __webpack_require__(/*! templates/chatroom_password_form.html */ "./src/templates/chatroom_password_form.html"), __webpack_require__(/*! templates/chatroom_sidebar.html */ "./src/templates/chatroom_sidebar.html"), __webpack_require__(/*! templates/chatroom_toolbar.html */ "./src/templates/chatroom_toolbar.html"), __webpack_require__(/*! templates/info.html */ "./src/templates/info.html"), __webpack_require__(/*! templates/list_chatrooms_modal.html */ "./src/templates/list_chatrooms_modal.html"), __webpack_require__(/*! templates/occupant.html */ "./src/templates/occupant.html"), __webpack_require__(/*! templates/room_description.html */ "./src/templates/room_description.html"), __webpack_require__(/*! templates/room_item.html */ "./src/templates/room_item.html"), __webpack_require__(/*! templates/room_panel.html */ "./src/templates/room_panel.html"), __webpack_require__(/*! templates/rooms_results.html */ "./src/templates/rooms_results.html"), __webpack_require__(/*! templates/spinner.html */ "./src/templates/spinner.html"), __webpack_require__(/*! awesomplete */ "awesomplete"), __webpack_require__(/*! converse-modal */ "./src/converse-modal.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! converse-core */ "./src/converse-core.js"), __webpack_require__(/*! utils/muc */ "./src/utils/muc.js"), __webpack_require__(/*! xss */ "./node_modules/xss/dist/xss.js"), __webpack_require__(/*! templates/add_chatroom_modal.html */ "./src/templates/add_chatroom_modal.html"), __webpack_require__(/*! templates/chatarea.html */ "./src/templates/chatarea.html"), __webpack_require__(/*! templates/chatroom.html */ "./src/templates/chatroom.html"), __webpack_require__(/*! templates/chatroom_details_modal.html */ "./src/templates/chatroom_details_modal.html"), __webpack_require__(/*! templates/chatroom_disconnect.html */ "./src/templates/chatroom_disconnect.html"), __webpack_require__(/*! templates/chatroom_features.html */ "./src/templates/chatroom_features.html"), __webpack_require__(/*! templates/chatroom_form.html */ "./src/templates/chatroom_form.html"), __webpack_require__(/*! templates/chatroom_head.html */ "./src/templates/chatroom_head.html"), __webpack_require__(/*! templates/chatroom_invite.html */ "./src/templates/chatroom_invite.html"), __webpack_require__(/*! templates/chatroom_nickname_form.html */ "./src/templates/chatroom_nickname_form.html"), __webpack_require__(/*! templates/chatroom_password_form.html */ "./src/templates/chatroom_password_form.html"), __webpack_require__(/*! templates/chatroom_sidebar.html */ "./src/templates/chatroom_sidebar.html"), __webpack_require__(/*! templates/chatroom_toolbar.html */ "./src/templates/chatroom_toolbar.html"), __webpack_require__(/*! templates/info.html */ "./src/templates/info.html"), __webpack_require__(/*! templates/list_chatrooms_modal.html */ "./src/templates/list_chatrooms_modal.html"), __webpack_require__(/*! templates/occupant.html */ "./src/templates/occupant.html"), __webpack_require__(/*! templates/room_description.html */ "./src/templates/room_description.html"), __webpack_require__(/*! templates/room_item.html */ "./src/templates/room_item.html"), __webpack_require__(/*! templates/room_panel.html */ "./src/templates/room_panel.html"), __webpack_require__(/*! templates/rooms_results.html */ "./src/templates/rooms_results.html"), __webpack_require__(/*! templates/spinner.html */ "./src/templates/spinner.html"), __webpack_require__(/*! awesomplete */ "awesomplete"), __webpack_require__(/*! converse-modal */ "./src/converse-modal.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); -})(void 0, function (converse, muc_utils, tpl_add_chatroom_modal, tpl_chatarea, tpl_chatroom, tpl_chatroom_details_modal, tpl_chatroom_disconnect, tpl_chatroom_features, tpl_chatroom_form, tpl_chatroom_head, tpl_chatroom_invite, tpl_chatroom_nickname_form, tpl_chatroom_password_form, tpl_chatroom_sidebar, tpl_chatroom_toolbar, tpl_info, tpl_list_chatrooms_modal, tpl_occupant, tpl_room_description, tpl_room_item, tpl_room_panel, tpl_rooms_results, tpl_spinner, Awesomplete) { +})(void 0, function (converse, muc_utils, xss, tpl_add_chatroom_modal, tpl_chatarea, tpl_chatroom, tpl_chatroom_details_modal, tpl_chatroom_disconnect, tpl_chatroom_features, tpl_chatroom_form, tpl_chatroom_head, tpl_chatroom_invite, tpl_chatroom_nickname_form, tpl_chatroom_password_form, tpl_chatroom_sidebar, tpl_chatroom_toolbar, tpl_info, tpl_list_chatrooms_modal, tpl_occupant, tpl_room_description, tpl_room_item, tpl_room_panel, tpl_rooms_results, tpl_spinner, Awesomplete) { "use strict"; var _converse$env = converse.env, @@ -48681,6 +48878,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ return tpl_chatroom_details_modal(_.extend(this.model.toJSON(), { '_': _, '__': __, + 'topic': u.addHyperlinks(xss.filterXSS(_.get(this.model.get('subject'), 'text'), { + 'whiteList': {} + })), 'display_name': __('Groupchat info for %1$s', this.model.getDisplayName()), 'num_occupants': this.model.occupants.length })); @@ -48709,7 +48909,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ 'click .toggle-smiley ul.emoji-picker li': 'insertEmoji', 'click .toggle-smiley': 'toggleEmojiMenu', 'click .upload-file': 'toggleFileUpload', - 'keypress .chat-textarea': 'keyPressed', + 'keydown .chat-textarea': 'keyPressed', 'input .chat-textarea': 'inputChanged' }, initialize: function initialize() { @@ -49271,7 +49471,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ fieldset_el.insertAdjacentHTML('beforeend', "".concat(title, "")); if (instructions && instructions !== title) { - fieldset_el.insertAdjacentHTML('beforeend', "

".concat(instructions, "

")); + fieldset_el.insertAdjacentHTML('beforeend', "

".concat(instructions, "

")); } _.each(fields, function (field) { @@ -51090,30 +51290,33 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde stanza = forwarded.querySelector('message'); } - var jid = stanza.getAttribute('from'), - resource = Strophe.getResourceFromJid(jid), - sender = resource && Strophe.unescapeNode(resource) || '', - subject = _.propertyOf(stanza.querySelector('subject'))('textContent'); - if (this.isDuplicate(stanza, original_stanza)) { return; } - if (subject) { - u.safeSave(this, { - 'subject': { - 'author': sender, - 'text': subject - } - }); - } + var jid = stanza.getAttribute('from'), + resource = Strophe.getResourceFromJid(jid), + sender = resource && Strophe.unescapeNode(resource) || ''; - if (sender === '') { - return; - } + if (!this.handleMessageCorrection(stanza)) { + var subject = _.propertyOf(stanza.querySelector('subject'))('textContent'); - this.incrementUnreadMsgCounter(original_stanza); - this.createMessage(stanza, original_stanza); + if (subject) { + u.safeSave(this, { + 'subject': { + 'author': sender, + 'text': subject + } + }); + } + + if (sender === '') { + return; + } + + this.incrementUnreadMsgCounter(original_stanza); + this.createMessage(stanza, original_stanza); + } if (sender !== this.get('nick')) { // We only emit an event if it's not our own message @@ -51305,6 +51508,10 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde _.each(_.difference(old_jids, jids), function (removed_jid) { // Remove absent occupants who've been removed from // the members lists. + if (removed_jid === _converse.bare_jid) { + return; + } + var occupant = _this10.findOccupant({ 'jid': removed_jid }); @@ -53390,7 +53597,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * * NB: These plugins need to have already been loaded via require.js. */ - dependencies: ["converse-controlbox", "converse-muc", "converse-bookmarks"], + dependencies: ["converse-singleton", "converse-controlbox", "converse-muc", "converse-bookmarks"], initialize: function initialize() { /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. @@ -53414,6 +53621,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ _converse.chatboxes.on('add', this.onChatBoxAdded, this); + _converse.chatboxes.on('change:hidden', this.onChatBoxChanged, this); + _converse.chatboxes.on('change:bookmarked', this.onChatBoxChanged, this); _converse.chatboxes.on('change:name', this.onChatBoxChanged, this); @@ -53456,12 +53665,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }); _converse.RoomsListElementView = Backbone.VDOMView.extend({ events: { - 'click a.room-info': 'showRoomDetailsModal' + 'click .room-info': 'showRoomDetailsModal' }, initialize: function initialize() { this.model.on('destroy', this.remove, this); this.model.on('remove', this.remove, this); this.model.on('change:bookmarked', this.render, this); + this.model.on('change:hidden', this.render, this); this.model.on('change:name', this.render, this); this.model.on('change:num_unread', this.render, this); this.model.on('change:num_unread_general', this.render, this); @@ -53473,6 +53683,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ // supported by the XMPP server. So we can use it // as a check for support (other ways of checking are async). 'allow_bookmarks': _converse.allow_bookmarks && _converse.bookmarks, + 'currently_open': _converse.isSingleton() && !this.model.get('hidden'), 'info_leave_room': __('Leave this groupchat'), 'info_remove_bookmark': __('Unbookmark this groupchat'), 'info_add_bookmark': __('Bookmark this groupchat'), @@ -53512,7 +53723,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ events: { 'click .add-bookmark': 'addBookmark', 'click .close-room': 'closeRoom', - 'click .rooms-toggle': 'toggleRoomsList', + 'click .list-toggle': 'toggleRoomsList', 'click .remove-bookmark': 'removeBookmark', 'click .open-room': 'openRoom' }, @@ -53905,6 +54116,7 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde 'jid': bare_jid, 'user_id': Strophe.getNodeFromJid(jid) }, attributes)); + this.setChatBox(); this.presence.on('change:show', function () { return _converse.emit('contactPresenceChanged', _this); }); @@ -53912,6 +54124,15 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde return _this.trigger('presenceChanged'); }); }, + setChatBox: function setChatBox() { + var chatbox = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + chatbox = chatbox || _converse.chatboxes.get(this.get('jid')); + + if (chatbox) { + this.chatbox = chatbox; + this.chatbox.on('change:hidden', this.render, this); + } + }, getDisplayName: function getDisplayName() { return this.vcard.get('fullname') || this.get('jid'); }, @@ -54139,7 +54360,7 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde * (String) name - The name of that user * (Array of Strings) groups - Any roster groups the user might belong to * (Function) callback - A function to call once the IQ is returned - * (Function) errback - A function to call if an error occured + * (Function) errback - A function to call if an error occurred */ name = _.isEmpty(name) ? jid : name; var iq = $iq({ @@ -54546,6 +54767,22 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde /********** Event Handlers *************/ + function updateUnreadCounter(chatbox) { + var contact = _converse.roster.findWhere({ + 'jid': chatbox.get('jid') + }); + + if (!_.isUndefined(contact)) { + contact.save({ + 'num_unread': chatbox.get('num_unread') + }); + } + } + + _converse.api.listen.on('chatBoxesInitialized', function () { + _converse.chatboxes.on('change:num_unread', updateUnreadCounter); + }); + _converse.api.listen.on('beforeTearDown', _converse.unregisterPresenceHandler()); _converse.api.listen.on('afterTearDown', function () { @@ -54714,8 +54951,6 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ 'away': __('This contact is away') }; - var LABEL_CONTACTS = __('Contacts'); - var LABEL_GROUPS = __('Groups'); var HEADER_CURRENT_CONTACTS = __('My contacts'); @@ -54995,7 +55230,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }); _converse.RosterContactView = Backbone.NativeView.extend({ tagName: 'li', - className: 'd-flex hidden controlbox-padded', + className: 'list-item d-flex hidden controlbox-padded', events: { "click .accept-xmpp-request": "acceptRequest", "click .decline-xmpp-request": "declineRequest", @@ -55004,6 +55239,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }, initialize: function initialize() { this.model.on("change", this.render, this); + this.model.on("highlight", this.highlight, this); this.model.on("destroy", this.remove, this); this.model.on("open", this.openChat, this); this.model.on("remove", this.remove, this); @@ -55018,11 +55254,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ return this; } - var item = this.model, - ask = item.get('ask'), - show = item.presence.get('show'), - requesting = item.get('requesting'), - subscription = item.get('subscription'); + var ask = this.model.get('ask'), + show = this.model.presence.get('show'), + requesting = this.model.get('requesting'), + subscription = this.model.get('subscription'); var classes_to_remove = ['current-xmpp-contact', 'pending-xmpp-contact', 'requesting-xmpp-contact'].concat(_.keys(STATUSES)); _.each(classes_to_remove, function (cls) { @@ -55033,6 +55268,19 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ this.el.classList.add(show); this.el.setAttribute('data-status', show); + this.highlight(); + + if (_converse.isSingleton()) { + var chatbox = _converse.chatboxes.get(this.model.get('jid')); + + if (chatbox) { + if (chatbox.get('hidden')) { + this.el.classList.remove('open'); + } else { + this.el.classList.add('open'); + } + } + } if (ask === 'subscribe' || subscription === 'from') { /* ask === 'subscribe' @@ -55046,18 +55294,18 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * * So in both cases the user is a "pending" contact. */ - var display_name = item.getDisplayName(); + var display_name = this.model.getDisplayName(); this.el.classList.add('pending-xmpp-contact'); - this.el.innerHTML = tpl_pending_contact(_.extend(item.toJSON(), { + this.el.innerHTML = tpl_pending_contact(_.extend(this.model.toJSON(), { 'display_name': display_name, 'desc_remove': __('Click to remove %1$s as a contact', display_name), 'allow_chat_pending_contacts': _converse.allow_chat_pending_contacts })); } else if (requesting === true) { - var _display_name = item.getDisplayName(); + var _display_name = this.model.getDisplayName(); this.el.classList.add('requesting-xmpp-contact'); - this.el.innerHTML = tpl_requesting_contact(_.extend(item.toJSON(), { + this.el.innerHTML = tpl_requesting_contact(_.extend(this.model.toJSON(), { 'display_name': _display_name, 'desc_accept': __("Click to accept the contact request from %1$s", _display_name), 'desc_decline': __("Click to decline the contact request from %1$s", _display_name), @@ -55067,11 +55315,26 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ this.el.classList.add('current-xmpp-contact'); this.el.classList.remove(_.without(['both', 'to'], subscription)[0]); this.el.classList.add(subscription); - this.renderRosterItem(item); + this.renderRosterItem(this.model); } return this; }, + highlight: function highlight() { + /* If appropriate, highlight the contact (by adding the 'open' class). + */ + if (_converse.isSingleton()) { + var chatbox = _converse.chatboxes.get(this.model.get('jid')); + + if (chatbox) { + if (chatbox.get('hidden')) { + this.el.classList.remove('open'); + } else { + this.el.classList.add('open'); + } + } + } + }, renderRosterItem: function renderRosterItem(item) { var status_icon = 'fa-times-circle'; var show = item.presence.get('show') || 'offline'; @@ -55550,18 +55813,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ this.updateFilter(); }, updateChatBox: function updateChatBox(contact) { - var chatbox = _converse.chatboxes.get(contact.get('jid')), - changes = {}; - - if (!chatbox) { + if (!this.model.chatbox) { return this; } + var changes = {}; + if (_.has(contact.changed, 'status')) { changes.status = contact.get('status'); } - chatbox.save(changes); + this.model.chatbox.save(changes); return this; }, getGroup: function getGroup(name) { @@ -55614,26 +55876,26 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }); /* -------- Event Handlers ----------- */ - function updateUnreadCounter(chatbox) { - var contact = _.head(_converse.roster.where({ - 'jid': chatbox.get('jid') - })); - - if (!_.isUndefined(contact)) { - contact.save({ - 'num_unread': chatbox.get('num_unread') - }); - } - } - _converse.api.listen.on('chatBoxesInitialized', function () { - _converse.chatboxes.on('change:num_unread', updateUnreadCounter); + _converse.chatboxes.on('change:hidden', function (chatbox) { + var contact = _converse.roster.findWhere({ + 'jid': chatbox.get('jid') + }); + + if (!_.isUndefined(contact)) { + contact.trigger('highlight', contact); + } + }); }); function initRoster() { /* Create an instance of RosterView once the RosterGroups * collection has been created (in converse-core.js) */ + if (_converse.authentication === _converse.ANONYMOUS) { + return; + } + _converse.rosterview = new _converse.RosterView({ 'model': _converse.rostergroups }); @@ -55723,7 +55985,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ return true; } - if (_.includes(['mobile', 'fullscreen', 'embedded'], _converse.view_mode)) { + if (_converse.isSingleton()) { var any_chats_visible = _converse.chatboxes.filter(function (cb) { return cb.get('id') != 'controlbox'; }).filter(function (cb) { @@ -55741,7 +56003,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }, createChatBox: function createChatBox(jid, attrs) { /* Make sure new chat boxes are hidden by default. */ - if (_.includes(['mobile', 'fullscreen', 'embedded'], this.__super__._converse.view_mode)) { + var _converse = this.__super__._converse; + + if (_converse.isSingleton()) { attrs = attrs || {}; attrs.hidden = true; } @@ -55751,7 +56015,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }, ChatBoxView: { shouldShowOnTextMessage: function shouldShowOnTextMessage() { - if (_.includes(['mobile', 'fullscreen', 'embedded'], this.__super__._converse.view_mode)) { + var _converse = this.__super__._converse; + + if (_converse.isSingleton()) { return false; } else { return this.__super__.shouldShowOnTextMessage.apply(this, arguments); @@ -55762,7 +56028,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * time. So before opening a chat, we make sure all other * chats are hidden. */ - if (_.includes(['mobile', 'fullscreen', 'embedded'], this.__super__._converse.view_mode)) { + var _converse = this.__super__._converse; + + if (_converse.isSingleton()) { _.each(this.__super__._converse.chatboxviews.xget(this.model.get('id')), hideChat); this.model.set('hidden', false); @@ -55773,7 +56041,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }, ChatRoomView: { show: function show(focus) { - if (_.includes(['mobile', 'fullscreen', 'embedded'], this.__super__._converse.view_mode)) { + var _converse = this.__super__._converse; + + if (_converse.isSingleton()) { _.each(this.__super__._converse.chatboxviews.xget(this.model.get('id')), hideChat); this.model.set('hidden', false); @@ -56312,30 +56582,6 @@ if (!String.prototype.trim) { /***/ }), -/***/ "./src/templates/action.html": -/*!***********************************!*\ - !*** ./src/templates/action.html ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var _ = {escape:__webpack_require__(/*! ./node_modules/lodash/escape.js */ "./node_modules/lodash/escape.js")}; -module.exports = function(o) { -var __t, __p = '', __e = _.escape; -__p += '\n
\n \n **' + -__e(o.username) + -'\n \n

\n
\n'; -return __p -}; - -/***/ }), - /***/ "./src/templates/add_chatroom_modal.html": /*!***********************************************!*\ !*** ./src/templates/add_chatroom_modal.html ***! @@ -56489,13 +56735,13 @@ __p += ' hidden '; } ; __p += '" data-room-jid="' + __e(o.jid) + -'">\n \n ' + __e(o.name) + -'\n  \n  \n\n'; return __p }; @@ -56526,7 +56768,7 @@ var _ = {escape:__webpack_require__(/*! ./node_modules/lodash/escape.js */ "./no module.exports = function(o) { var __t, __p = '', __e = _.escape, __j = Array.prototype.join; function print() { __p += __j.call(arguments, '') } -__p += '\n\n \n \n \n \n \n\n'; return __p }; @@ -57605,7 +57849,7 @@ __p += '\n
\n \n
\n Uploading file: ' + +'">\n \n
\n Uploading file: ' + __e(o.file.name) + ', ' + __e(o.filesize) + @@ -57659,18 +57903,23 @@ return __p var _ = {escape:__webpack_require__(/*! ./node_modules/lodash/escape.js */ "./node_modules/lodash/escape.js")}; module.exports = function(o) { -var __t, __p = '', __e = _.escape; -__p += '\n\n\n'; +'\n
\n'; return __p }; @@ -57687,13 +57936,21 @@ var _ = {escape:__webpack_require__(/*! ./node_modules/lodash/escape.js */ "./no module.exports = function(o) { var __t, __p = '', __e = _.escape, __j = Array.prototype.join; function print() { __p += __j.call(arguments, '') } -__p += '\n
' + __e(o.label_group) + -'
\n
    \n '; - if (o.type !== 'headline') { ; -__p += '\n \n '; + if (o.type !== 'headline' && !o.is_me_message) { ; +__p += '\n \n '; } ; -__p += '\n
    \n \n ' + +__p += '\n
    \n \n '; + if (o.is_me_message) { ; +__p += ''; + } ; +__p += '\n '; + if (o.is_me_message) { ; +__p += '**'; + }; ; +__p += __e(o.username) + '\n '; o.roles.forEach(function (role) { ; @@ -58077,11 +58358,86 @@ __p += ' ' + __e(role) + ' '; }); ; -__p += '\n \n \n \n \n
    \n
    \n
    \n'; +''; + } ; +__p += '\n \n '; + if (!o.is_me_message) { ; +__p += '
    '; + } ; +__p += '\n '; + if (o.edited) { ; +__p += ' '; + } ; +__p += '\n '; + if (!o.is_me_message) { ; +__p += '
    '; + } ; +__p += '\n '; + if (o.is_spoiler) { ; +__p += '\n
    \n ' + +__e(o.spoiler_hint) + +'\n ' + +__e(o.label_show) + +'\n
    \n '; + } ; +__p += '\n
    \n
    \n '; + if (!o.is_me_message) { ; +__p += '
    '; + } ; +__p += '\n '; + if (o.type !== 'headline' && !o.is_me_message && o.sender === 'me') { ; +__p += '\n
    \n \n
    \n '; + } ; +__p += '\n\n '; + if (!o.is_me_message) { ; +__p += '
    '; + } ; +__p += '\n
\n
\n'; +return __p +}; + +/***/ }), + +/***/ "./src/templates/message_versions_modal.html": +/*!***************************************************!*\ + !*** ./src/templates/message_versions_modal.html ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _ = {escape:__webpack_require__(/*! ./node_modules/lodash/escape.js */ "./node_modules/lodash/escape.js")}; +module.exports = function(o) { +var __t, __p = '', __e = _.escape, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +__p += '\n\n'; return __p }; @@ -58473,7 +58829,7 @@ __e(o.__("Account Registration:")) + __e(o.domain) + '\n

' + __e(o.title) + -'

\n

' + +'

\n

' + __e(o.instructions) + '

\n\n\n
\n \n \n'; if (o.num_unread) { ; @@ -58748,21 +59108,15 @@ __p += '\n ' + __e( o.num_unread ) + '\n'; } ; -__p += '\n' + __e(o.name || o.jid) + -'\n\n \n\n'; +'\n\n'; if (o.allow_bookmarks) { ; -__p += '\n \n\n'; +'" href="#"> \n\n \n\n\n'; return __p }; @@ -58946,7 +59306,7 @@ var _ = {escape:__webpack_require__(/*! ./node_modules/lodash/escape.js */ "./no module.exports = function(o) { var __t, __p = '', __e = _.escape, __j = Array.prototype.join; function print() { __p += __j.call(arguments, '') } -__p += '\n\n'; if (o.allow_contact_removal) { ; -__p += '\n\n'; } ; @@ -59068,36 +59428,6 @@ return __p /***/ }), -/***/ "./src/templates/spoiler_message.html": -/*!********************************************!*\ - !*** ./src/templates/spoiler_message.html ***! - \********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var _ = {escape:__webpack_require__(/*! ./node_modules/lodash/escape.js */ "./node_modules/lodash/escape.js")}; -module.exports = function(o) { -var __t, __p = '', __e = _.escape; -__p += '\n
\n \n
\n \n ' + -__e(o.username) + -'\n ' + -__e(o.pretty_time) + -'\n \n
\n ' + -__e(o.spoiler_hint) + -'\n ' + -__e(o.label_show) + -'\n
\n \n
\n
\n'; -return __p -}; - -/***/ }), - /***/ "./src/templates/status_message.html": /*!*******************************************!*\ !*** ./src/templates/status_message.html ***! @@ -59604,6 +59934,10 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde return string.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); }; + u.escapeURL = function (url) { + return encodeURI(decodeURI(url)).replace(/[!'()]/g, escape).replace(/\*/g, "%2A"); + }; + u.addHyperlinks = function (text) { return URI.withinString(text, function (url) { var uri = new URI(url); @@ -59613,8 +59947,8 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde url = 'http://' + url; } - url = encodeURI(decodeURI(url)).replace(/[!'()]/g, escape).replace(/\*/g, "%2A"); - return "").concat(u.escapeHTML(uri.readable()), ""); + url = u.escapeHTML(u.escapeURL(url)); + return "").concat(u.escapeHTML(uri.readable()), ""); }); }; @@ -59659,7 +59993,7 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde return tpl_file({ 'url': url, - 'label_download': __('Download: "%1$s', filename) + 'label_download': __('Download "%1$s"', filename) }); }; @@ -60259,6 +60593,14 @@ function _instanceof(left, right) { if (right != null && typeof Symbol !== "unde return result; }; + u.getUniqueId = function () { + return 'xxxxxxxx-xxxx'.replace(/[x]/g, function (c) { + var r = Math.random() * 16 | 0, + v = c === 'x' ? r : r & 0x3 | 0x8; + return v.toString(16); + }); + }; + return u; }); @@ -60353,6 +60695,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }); return tpl_form_select({ + 'id': u.getUniqueId(), 'name': field.getAttribute('var'), 'label': field.getAttribute('label'), 'options': options.join(''), @@ -60372,8 +60715,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }); } else if (field.getAttribute('type') === 'boolean') { return tpl_form_checkbox({ + 'id': u.getUniqueId(), 'name': field.getAttribute('var'), - 'type': XFORM_TYPE_MAP[field.getAttribute('type')], 'label': field.getAttribute('label') || '', 'checked': _.get(field.querySelector('value'), 'textContent') === "1" && 'checked="1"' || '', 'required': !_.isNil(field.querySelector('required')) @@ -60394,6 +60737,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ }); } else { return tpl_form_input({ + 'id': u.getUniqueId(), 'label': field.getAttribute('label') || '', 'name': field.getAttribute('var'), 'placeholder': null, diff --git a/locale/af/LC_MESSAGES/converse.json b/locale/af/LC_MESSAGES/converse.json index ce226526e..b228ca2f5 100644 --- a/locale/af/LC_MESSAGES/converse.json +++ b/locale/af/LC_MESSAGES/converse.json @@ -1 +1 @@ -{"domain":"converse","locale_data":{"converse":{"":{"domain":"converse","plural_forms":"nplurals=2; plural=n != 1;","lang":"af"},"Bookmark this room":["Boekmerk hierdie kletskamer"],"The name for this bookmark:":["Die naam vir hierdie boekmerk:"],"Would you like this room to be automatically joined upon startup?":["Moet hierdie kletskamer outomaties betree word tydens aanmelding?"],"What should your nickname for this room be?":["Wat sal u bynaam vir hierdie kletskamer wees?"],"Save":["Stoor"],"Cancel":["Kanseleer"],"Are you sure you want to remove the bookmark \"%1$s\"?":["Is u seker u wil die boekmerk \"%1$s\" verwyder?"],"Sorry, something went wrong while trying to save your bookmark.":["Jammer, 'n fout het voorgekom tydens storing van u boekmerk."],"Leave this room":["Verlaat hierdie kletskamer"],"Remove this bookmark":["Verwyder hierdie boekmerk"],"Unbookmark this room":["Verwyder die boekmerk"],"Show more information on this room":["Wys meer inligting aangaande hierdie kletskamer"],"Click to open this room":["Klik om hierdie kletskamer te open"],"Click to toggle the bookmarks list":["Klik om die boekmerklys te skakel"],"Bookmarks":["Kletskamerboekmerke"],"Sorry, could not determine file upload URL.":[""],"Sorry, could not determine upload URL.":[""],"Sorry, could not succesfully upload your file.":[""],"Your server's response: \"%1$s\"":[""],"Sorry, looks like file upload is not supported by your server.":[""],"The size of your file, %1$s, exceeds the maximum allowed by your server, which is %2$s.":[""],"Sorry, an error occured:":[""],"Close this chat box":["Sluit hierdie kletskas"],"The User's Profile Image":[""],"Close":[""],"Email":[""],"Nickname":["Bynaam"],"Refresh":[""],"Role":[""],"URL":[""],"Are you sure you want to remove this contact?":["Is u seker u wil hierdie gespreksmaat verwyder?"],"Error":[""],"Sorry, there was an error while trying to remove %1$s as a contact.":["Jammer, 'n fout het voorgekom tydens die verwydering van %1$s as 'n kontak."],"You have unread messages":["U het ongelese boodskappe"],"Hidden message":["Verskuilde boodskap"],"Personal message":["Persoonlike boodskap"],"Send":["Stuur"],"Optional hint":[""],"Choose a file to send":[""],"Click to write as a normal (non-spoiler) message":["Klik om 'n gewone (nie-verskuilde) boodskap te skryf"],"Click to write your message as a spoiler":["Klik om 'n verskuilde boodskap te skryf"],"Clear all messages":["Vee alle boodskappe uit"],"Start a call":["Begin 'n oproep"],"Remove messages":["Verwyder boodskappe"],"Write in the third person":["Skryf in die derde persoon"],"Show this menu":["Vertoon hierdie keuselys"],"has gone offline":["is nou aflyn"],"has gone away":["het weggegaan"],"is busy":["is besig"],"Contacts":["Kontakte"],"Username":["Gebruikersnaam"],"user@domain":["gebruiker@domein"],"Please enter a valid XMPP address":["Verskaf asseblief 'n geldige XMPP address"],"Toggle chat":["Klets"],"The connection has dropped, attempting to reconnect.":["Die konneksie is onderbreek, probeer tans tans om te herkonnekteer."],"An error occurred while connecting to the chat server.":["A fout het voorgekom tydens verbinding met die kletsbediener."],"Your Jabber ID and/or password is incorrect. Please try again.":["U Jabber ID en/of wagwoord is verkeerd. Probeer asseblief weer."],"The XMPP server did not offer a supported authentication mechanism":["Die XMPP bediener het nie 'n bruikbare verifikasiemeganisme aangebied nie"],"Typing from another device":["Tik tans op 'n ander toestel"],"is typing":["tik tans"],"Stopped typing on the other device":["Het opgehou tik op 'n ander toestel"],"has stopped typing":["het opgehou tik"],"Minimize this chat box":["Minimeer hierdie kletskas"],"Click to restore this chat":["Klik om hierdie klets te herstel"],"Minimized":["Geminimaliseer"],"This room is not anonymous":["Hierdie vertrek is nie anoniem nie"],"This room now shows unavailable members":["Hierdie vertrek wys nou onbeskikbare lede"],"This room does not show unavailable members":["Hierdie vertrek wys nie onbeskikbare lede nie"],"The room configuration has changed":["Die kamer instellings het verander"],"Room logging is now enabled":["Kamer log is nou aangeskakel"],"Room logging is now disabled":["Kamer log is nou afgeskakel"],"This room is now no longer anonymous":["Hiedie kamer is nie meer anoniem nie"],"This room is now semi-anonymous":["Hierdie kamer is nou gedeeltelik anoniem"],"This room is now fully-anonymous":["Hierdie kamer is nou ten volle anoniem"],"A new room has been created":["'n Nuwe kamer is geskep"],"You have been banned from this room":["Jy is uit die kamer verban"],"You have been kicked from this room":["Jy is uit die kamer geskop"],"You have been removed from this room because of an affiliation change":["Jy is vanuit die kamer verwyder a.g.v 'n verandering van affiliasie"],"You have been removed from this room because the room has changed to members-only and you're not a member":["Jy is vanuit die kamer verwyder omdat die kamer nou slegs tot lede beperk word en jy nie 'n lid is nie"],"You have been removed from this room because the MUC (Multi-user chat) service is being shut down":["U is van hierdie kamer verwyder aangesien die MUC (Multi-user chat) diens nou afgeskakel word."],"%1$s has been banned":["%1$s is verban"],"%1$s's nickname has changed":["%1$s se bynaam het verander"],"%1$s has been kicked out":["%1$s is uitgeskop"],"%1$s has been removed because of an affiliation change":["%1$s is verwyder a.g.v 'n verandering van affiliasie"],"%1$s has been removed for not being a member":["%1$s is nie 'n lid nie, en dus verwyder"],"Your nickname has been automatically set to %1$s":["U bynaam is outomaties gestel na %1$s"],"Your nickname has been changed to %1$s":["U bynaam is verander na %1$s"],"Description:":["Beskrywing:"],"Room Address (JID):":["Kletskameradres (JID):"],"Occupants:":["Deelnemers:"],"Features:":["Eienskappe:"],"Requires authentication":["Benodig magtiging"],"Hidden":["Verskuil"],"Requires an invitation":["Benodig 'n uitnodiging"],"Moderated":["Gemodereer"],"Non-anonymous":["Nie-anoniem"],"Open room":["Oop kletskamer"],"Permanent room":["Permanente kamer"],"Public":["Publiek"],"Semi-anonymous":["Deels anoniem"],"Temporary room":["Tydelike kamer"],"Unmoderated":["Ongemodereer"],"Query for Chatrooms":[""],"Show rooms":["Wys kletskamers"],"No rooms found":["Geen kletskamers gevind"],"Optional nickname":[""],"name@conference.example.org":[""],"Message":["Boodskap"],"Close and leave this room":["Verlaat en sluit hierdie kletskamer"],"Configure this room":["Verstel hierdie kletskamer"],"Hide the list of occupants":["Verskuil die lys van deelnemers"],"Error: the \"%1$s\" command takes two arguments, the user's nickname and optionally a reason.":["Fout: die \"%1$s\" opdrag neem twee argumente, die gebruiker se bynaam en opsioneel daarby 'n rede."],"Sorry, an error happened while running the command. Check your browser's developer console for details.":[""],"Change user's affiliation to admin":["Verander die gebruiker se affiliasie na admin"],"Ban user from room":["Verban gebruiker uit hierdie kletskamer"],"Change user role to participant":["Verander gebruiker se rol na lid"],"Kick user from room":["Skop gebruiker uit hierdie kletskamer"],"Write in 3rd person":["Skryf in die derde persoon"],"Grant membership to a user":["Verleen lidmaatskap aan 'n gebruiker"],"Remove user's ability to post messages":["Verwyder gebruiker se vermoë om boodskappe te plaas"],"Change your nickname":["Verander u bynaam"],"Grant moderator role to user":["Verleen moderator rol aan gebruiker"],"Grant ownership of this room":["Verleen eienaarskap van hierdie kamer"],"Revoke user's membership":["Herroep gebruiker se lidmaatskap"],"Set room subject":["Stel onderwerp vir kletskamer"],"Set room subject (alias for /subject)":["Verskaf kamer onderwerp (alias vir /subject)"],"Allow muted user to post messages":["Laat stilgemaakte gebruiker toe om weer boodskappe te plaas"],"The nickname you chose is reserved or currently in use, please choose a different one.":["Die bynaam wat u gekies het is gereserveer of tans in gebruik, kies asb. 'n ander een."],"Please choose your nickname":["Kies asb. u bynaam"],"Enter room":["Betree kletskamer"],"This chatroom requires a password":["Hiedie kletskamer benodig 'n wagwoord"],"Password: ":["Wagwoord: "],"Submit":["Dien in"],"This action was done by %1$s.":["Hierdie aksie is uitgevoer deur %1$s."],"The reason given is: \"%1$s\".":["Die gegewe rede is: \"%1$s\"."],"You are not on the member list of this room.":["Jy is nie op die ledelys van hierdie kamer nie."],"You have been banned from this room.":["Jy is uit die kamer verban."],"No nickname was specified.":["Geen bynaam verskaf nie."],"You are not allowed to create new rooms.":["Jy word nie toegelaat om nog kletskamers te skep nie."],"Your nickname doesn't conform to this room's policies.":["Jou bynaam voldoen nie aan die kamer se beleid nie."],"This room does not (yet) exist.":["Hierdie kamer bestaan tans (nog) nie."],"This room has reached its maximum number of occupants.":["Hierdie kletskamer het sy maksimum aantal deelnemers bereik."],"Remote server not found":[""],"Add a new room":[""],"Click to mention %1$s in your message.":["Klik om %1$s in u boodskap te noem "],"This user is a moderator.":["Hierdie gebruiker is 'n moderator."],"This user can send messages in this room.":["Hierdie gebruiker kan boodskappe na die kamer stuur."],"This user can NOT send messages in this room.":["Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie."],"Visitor":[""],"Owner":[""],"Admin":[""],"Occupants":["Deelnemers"],"Invite":["Nooi uit"],"Please enter a valid XMPP username":["Verskaf asseblief 'n geldige XMPP adres"],"%1$s has invited you to join a chat room: %2$s":["%1$s het u uitgenooi om die kletskamer %2$s te besoek"],"%1$s has invited you to join a chat room: %2$s, and left the following reason: \"%3$s\"":["%1$s het u uitgenooi om die kletskamer %2$s te besoek, en het die volgende rede verskaf: \"%3$s\""],"Notification from %1$s":["Kennisgewing van %1$s"],"%1$s says":["%1$s sê"],"has come online":["het aanlyn gekom"],"wants to be your contact":["wil jou kontak wees"],"Log in with %1$s":[""],"Your Profile":[""],"Use commas to separate multiple roles. Your roles are shown next to your name on your chat messages.":[""],"Your avatar image":[""],"You can check your browser's developer console for any error output.":[""],"Away":["Afwesig"],"Busy":["Besig"],"Custom status":["Doelgemaakte status"],"Offline":["Afgemeld"],"Online":["Aangemeld"],"I am %1$s":["Ek is %1$s"],"Change settings":[""],"Click to change your chat status":["Klik om jou klets-status te verander"],"Log out":["Meld af"],"Your profile":[""],"online":["aangemeld"],"busy":["besig"],"away for long":["vir lank afwesig"],"away":["afwesig"],"offline":["afgemeld"]," e.g. conversejs.org":[" bv. conversejs.org"],"Fetch registration form":["Laai die registrasie form"],"Tip: A list of public XMPP providers is available":["Wenk: A lys van publieke XMPP-verskaffers is beskikbaar"],"here":["hier"],"Sorry, we're unable to connect to your chosen provider.":["Jammer, ons kon nie 'n verbinding met die gekose verskaffer opstel nie."],"Sorry, the given provider does not support in band account registration. Please try with a different provider.":["Jammer, die gekose verskaffer ondersteun nie in-band registrasie nie.Probeer weer met 'n ander verskaffer."],"Now logging you in":["U word nou aangemeld"],"Registered successfully":["Suksesvol geregistreer"],"The provider rejected your registration attempt. Please check the values you entered for correctness.":["Die verskaffer het u registrasieversoek verwerp. Kontrolleer asb. jou gegewe waardes vir korrektheid."],"Click to toggle the rooms list":["Klik om die boekmerklys te skakel"],"Open Rooms":["Oop kletskamers"],"Sorry, there was an error while trying to add %1$s as a contact.":["Jammer, 'n fout het voorgekom tydens die byvoeging van %1$s as 'n kontak."],"This client does not allow presence subscriptions":["Hierdie klient laat nie beskikbaarheidsinskrywings toe nie"],"Click to hide these contacts":["Klik om hierdie kontakte te verskuil"],"This contact is busy":["Hierdie persoon is besig"],"This contact is online":["Hierdie persoon is aanlyn"],"This contact is offline":["Hierdie persoon is aflyn"],"This contact is unavailable":["Hierdie persoon is onbeskikbaar"],"This contact is away for an extended period":["Hierdie persoon is vir lank afwesig"],"This contact is away":["Hierdie persoon is afwesig"],"Groups":["Groepe"],"My contacts":["My kontakte"],"Pending contacts":["Hangende kontakte"],"Contact requests":["Kontakversoeke"],"Ungrouped":["Ongegroepeer"],"Contact name":["Kontaknaam"],"XMPP Address":[""],"Add":["Voeg by"],"Filter":["Filtreer"],"Filter by group name":[""],"Filter by status":[""],"Any":["Enige"],"Unread":["Ongelees"],"Chatty":["Geselserig"],"Extended Away":["Weg vir langer"],"Click to remove %1$s as a contact":["Klik om %1$s as 'n kontak te verwyder"],"Click to accept the contact request from %1$s":["Klik om die kontakversoek van %1$s te aanvaar"],"Click to decline the contact request from %1$s":["Klik om kontakversoek van %1$s te weier"],"Are you sure you want to decline this contact request?":["Is u seker dat u hierdie persoon se versoek wil afkeur?"],"Add a contact":["Voeg 'n kontak by"],"Topic":[""],"Topic author":[""],"Features":["Eienskappe"],"Password protected":["Wagwoord"],"This room requires a password before entry":["Hierdie kletskamer benodig 'n wagwoord"],"This room does not require a password upon entry":["Hiedie kletskamer benodig nie 'n wagwoord nie"],"This room is not publicly searchable":["Hierdie kletskamer is nie publiek opspoorbaar nie"],"This room is publicly searchable":["Hierdie kletskamer is publiek opspoorbaar"],"Members only":["Slegs lede"],"Open":["Oop kletskamer"],"Anyone can join this room":["Enige iemand kan hierdie kletskamer binnekom"],"Persistent":["Blywend"],"This room persists even if it's unoccupied":["Hierdie kletskamer bestaan voort selfs al is dit leeg"],"Temporary":["Tydelike kamer"],"This room will disappear once the last person leaves":["Hierdie kletskamer sal verdwyn sodra die laaste persoon dit verlaat"],"All other room occupants can see your XMPP username":["Alle ander deelnemers can u Jabber ID sien"],"Only moderators can see your XMPP username":["Slegs moderators kan u Jabber ID sien"],"This room is being moderated":["Hierdie kletskamer word gemodereer"],"This room is not being moderated":["Hierdie kletskamer word nie gemodereer nie"],"Message archiving":["Boodskap-argivering"],"Messages are archived on the server":["Boodskappe word op die bediener gestoor"],"No password":["Geen wagwoord"],"XMPP Username:":["XMPP Gebruikersnaam:"],"Password:":["Wagwoord:"],"password":["wagwoord"],"This is a trusted device":[""],"To improve performance, we cache your data in this browser. Uncheck this box if this is a public computer or if you want your data to be deleted when you log out. It's important that you explicitly log out, otherwise not all cached data might be deleted.":[""],"Click here to log in anonymously":["Klik hier om anoniem aan te meld"],"Don't have a chat account?":["Geen kletsrekening nie?"],"Create an account":["Skep 'n rekening"],"Create your account":["Skep u rekening"],"Please enter the XMPP provider to register with:":["Verskaf asseblief die XMPP verskaffer om mee te registreer:"],"Already have a chat account?":["Het u reeds 'n kletsrekening?"],"Log in here":["Meld hier aan"],"Account Registration:":["Registreer 'n rekening:"],"Register":["Registreer"],"Choose a different provider":["Kies 'n ander verskaffer"],"Hold tight, we're fetching the registration form…":["Wag 'n bietjie, ons gaan haal die registrasievorm"],"Download":["Laai af"],"Download: \"%1$s":[""],"Download video file":[""],"Download audio file":[""]}}} \ No newline at end of file +{"domain":"converse","locale_data":{"converse":{"":{"domain":"converse","plural_forms":"nplurals=2; plural=n != 1;","lang":"af"},"The name for this bookmark:":["Die naam vir hierdie boekmerk:"],"Save":["Stoor"],"Cancel":["Kanseleer"],"Are you sure you want to remove the bookmark \"%1$s\"?":["Is u seker u wil die boekmerk \"%1$s\" verwyder?"],"Sorry, something went wrong while trying to save your bookmark.":["Jammer, 'n fout het voorgekom tydens storing van u boekmerk."],"Remove this bookmark":["Verwyder hierdie boekmerk"],"Click to toggle the bookmarks list":["Klik om die boekmerklys te skakel"],"Bookmarks":["Kletskamerboekmerke"],"Sorry, could not determine file upload URL.":[""],"Sorry, could not determine upload URL.":[""],"Sorry, could not succesfully upload your file. Your server’s response: \"%1$s\"":[""],"Sorry, could not succesfully upload your file.":[""],"Sorry, looks like file upload is not supported by your server.":[""],"The size of your file, %1$s, exceeds the maximum allowed by your server, which is %2$s.":[""],"Sorry, an error occurred:":[""],"Close this chat box":["Sluit hierdie kletskas"],"The User's Profile Image":[""],"Close":[""],"Email":[""],"Nickname":["Bynaam"],"Refresh":[""],"Role":[""],"URL":[""],"Are you sure you want to remove this contact?":["Is u seker u wil hierdie gespreksmaat verwyder?"],"Error":[""],"Sorry, there was an error while trying to remove %1$s as a contact.":["Jammer, 'n fout het voorgekom tydens die verwydering van %1$s as 'n kontak."],"You have unread messages":["U het ongelese boodskappe"],"Hidden message":["Verskuilde boodskap"],"Personal message":["Persoonlike boodskap"],"Send":["Stuur"],"Optional hint":[""],"Choose a file to send":[""],"Click to write as a normal (non-spoiler) message":["Klik om 'n gewone (nie-verskuilde) boodskap te skryf"],"Click to write your message as a spoiler":["Klik om 'n verskuilde boodskap te skryf"],"Clear all messages":["Vee alle boodskappe uit"],"Start a call":["Begin 'n oproep"],"Remove messages":["Verwyder boodskappe"],"Write in the third person":["Skryf in die derde persoon"],"Show this menu":["Vertoon hierdie keuselys"],"Username":["Gebruikersnaam"],"user@domain":["gebruiker@domein"],"Please enter a valid XMPP address":["Verskaf asseblief 'n geldige XMPP address"],"Toggle chat":["Klets"],"The connection has dropped, attempting to reconnect.":["Die konneksie is onderbreek, probeer tans tans om te herkonnekteer."],"An error occurred while connecting to the chat server.":["A fout het voorgekom tydens verbinding met die kletsbediener."],"Your Jabber ID and/or password is incorrect. Please try again.":["U Jabber ID en/of wagwoord is verkeerd. Probeer asseblief weer."],"The XMPP server did not offer a supported authentication mechanism":["Die XMPP bediener het nie 'n bruikbare verifikasiemeganisme aangebied nie"],"Typing from another device":["Tik tans op 'n ander toestel"],"Stopped typing on the other device":["Het opgehou tik op 'n ander toestel"],"Minimize this chat box":["Minimeer hierdie kletskas"],"Click to restore this chat":["Klik om hierdie klets te herstel"],"Minimized":["Geminimaliseer"],"%1$s has been banned":["%1$s is verban"],"%1$s's nickname has changed":["%1$s se bynaam het verander"],"%1$s has been kicked out":["%1$s is uitgeskop"],"%1$s has been removed because of an affiliation change":["%1$s is verwyder a.g.v 'n verandering van affiliasie"],"%1$s has been removed for not being a member":["%1$s is nie 'n lid nie, en dus verwyder"],"Your nickname has been automatically set to %1$s":["U bynaam is outomaties gestel na %1$s"],"Your nickname has been changed to %1$s":["U bynaam is verander na %1$s"],"Description:":["Beskrywing:"],"Features:":["Eienskappe:"],"Requires authentication":["Benodig magtiging"],"Hidden":["Verskuil"],"Requires an invitation":["Benodig 'n uitnodiging"],"Moderated":["Gemodereer"],"Non-anonymous":["Nie-anoniem"],"Open":["Oop kletskamer"],"Public":["Publiek"],"Semi-anonymous":["Deels anoniem"],"Temporary":["Tydelike kamer"],"Unmoderated":["Ongemodereer"],"Show rooms":["Wys kletskamers"],"No rooms found":["Geen kletskamers gevind"],"Optional nickname":[""],"name@conference.example.org":[""],"Message":["Boodskap"],"Error: the \"%1$s\" command takes two arguments, the user's nickname and optionally a reason.":["Fout: die \"%1$s\" opdrag neem twee argumente, die gebruiker se bynaam en opsioneel daarby 'n rede."],"Sorry, an error happened while running the command. Check your browser's developer console for details.":[""],"Change user's affiliation to admin":["Verander die gebruiker se affiliasie na admin"],"Change user role to participant":["Verander gebruiker se rol na lid"],"Write in 3rd person":["Skryf in die derde persoon"],"Grant membership to a user":["Verleen lidmaatskap aan 'n gebruiker"],"Remove user's ability to post messages":["Verwyder gebruiker se vermoë om boodskappe te plaas"],"Change your nickname":["Verander u bynaam"],"Grant moderator role to user":["Verleen moderator rol aan gebruiker"],"Revoke user's membership":["Herroep gebruiker se lidmaatskap"],"Allow muted user to post messages":["Laat stilgemaakte gebruiker toe om weer boodskappe te plaas"],"The nickname you chose is reserved or currently in use, please choose a different one.":["Die bynaam wat u gekies het is gereserveer of tans in gebruik, kies asb. 'n ander een."],"Please choose your nickname":["Kies asb. u bynaam"],"Password: ":["Wagwoord: "],"Submit":["Dien in"],"This action was done by %1$s.":["Hierdie aksie is uitgevoer deur %1$s."],"The reason given is: \"%1$s\".":["Die gegewe rede is: \"%1$s\"."],"No nickname was specified.":["Geen bynaam verskaf nie."],"You are not allowed to create new rooms.":["Jy word nie toegelaat om nog kletskamers te skep nie."],"Remote server not found":[""],"Add a new room":[""],"Click to mention %1$s in your message.":["Klik om %1$s in u boodskap te noem "],"This user is a moderator.":["Hierdie gebruiker is 'n moderator."],"Visitor":[""],"Owner":[""],"Admin":[""],"Participants":[""],"Invite":["Nooi uit"],"Please enter a valid XMPP username":["Verskaf asseblief 'n geldige XMPP adres"],"%1$s has invited you to join a chat room: %2$s":["%1$s het u uitgenooi om die kletskamer %2$s te besoek"],"%1$s has invited you to join a chat room: %2$s, and left the following reason: \"%3$s\"":["%1$s het u uitgenooi om die kletskamer %2$s te besoek, en het die volgende rede verskaf: \"%3$s\""],"Notification from %1$s":["Kennisgewing van %1$s"],"%1$s says":["%1$s sê"],"has gone offline":["is nou aflyn"],"has gone away":["het weggegaan"],"is busy":["is besig"],"has come online":["het aanlyn gekom"],"wants to be your contact":["wil jou kontak wees"],"Log in with %1$s":[""],"Your Profile":[""],"Use commas to separate multiple roles. Your roles are shown next to your name on your chat messages.":[""],"Your avatar image":[""],"You can check your browser's developer console for any error output.":[""],"Away":["Afwesig"],"Busy":["Besig"],"Custom status":["Doelgemaakte status"],"Offline":["Afgemeld"],"Online":["Aangemeld"],"I am %1$s":["Ek is %1$s"],"Change settings":[""],"Click to change your chat status":["Klik om jou klets-status te verander"],"Log out":["Meld af"],"Your profile":[""],"online":["aangemeld"],"busy":["besig"],"away for long":["vir lank afwesig"],"away":["afwesig"],"offline":["afgemeld"]," e.g. conversejs.org":[" bv. conversejs.org"],"Fetch registration form":["Laai die registrasie form"],"Tip: A list of public XMPP providers is available":["Wenk: A lys van publieke XMPP-verskaffers is beskikbaar"],"here":["hier"],"Sorry, we're unable to connect to your chosen provider.":["Jammer, ons kon nie 'n verbinding met die gekose verskaffer opstel nie."],"Sorry, the given provider does not support in band account registration. Please try with a different provider.":["Jammer, die gekose verskaffer ondersteun nie in-band registrasie nie.Probeer weer met 'n ander verskaffer."],"Now logging you in":["U word nou aangemeld"],"Registered successfully":["Suksesvol geregistreer"],"The provider rejected your registration attempt. Please check the values you entered for correctness.":["Die verskaffer het u registrasieversoek verwerp. Kontrolleer asb. jou gegewe waardes vir korrektheid."],"Open Groupchats":[""],"Sorry, there was an error while trying to add %1$s as a contact.":["Jammer, 'n fout het voorgekom tydens die byvoeging van %1$s as 'n kontak."],"This client does not allow presence subscriptions":["Hierdie klient laat nie beskikbaarheidsinskrywings toe nie"],"Click to hide these contacts":["Klik om hierdie kontakte te verskuil"],"This contact is busy":["Hierdie persoon is besig"],"This contact is online":["Hierdie persoon is aanlyn"],"This contact is offline":["Hierdie persoon is aflyn"],"This contact is unavailable":["Hierdie persoon is onbeskikbaar"],"This contact is away for an extended period":["Hierdie persoon is vir lank afwesig"],"This contact is away":["Hierdie persoon is afwesig"],"Groups":["Groepe"],"My contacts":["My kontakte"],"Pending contacts":["Hangende kontakte"],"Contact requests":["Kontakversoeke"],"Ungrouped":["Ongegroepeer"],"Contact name":["Kontaknaam"],"XMPP Address":[""],"Add":["Voeg by"],"Filter":["Filtreer"],"Filter by group name":[""],"Filter by status":[""],"Any":["Enige"],"Unread":["Ongelees"],"Chatty":["Geselserig"],"Extended Away":["Weg vir langer"],"Click to remove %1$s as a contact":["Klik om %1$s as 'n kontak te verwyder"],"Click to accept the contact request from %1$s":["Klik om die kontakversoek van %1$s te aanvaar"],"Click to decline the contact request from %1$s":["Klik om kontakversoek van %1$s te weier"],"Are you sure you want to decline this contact request?":["Is u seker dat u hierdie persoon se versoek wil afkeur?"],"Contacts":["Kontakte"],"Add a contact":["Voeg 'n kontak by"],"Topic":[""],"Topic author":[""],"Features":["Eienskappe"],"Password protected":["Wagwoord"],"This room requires a password before entry":["Hierdie kletskamer benodig 'n wagwoord"],"This room does not require a password upon entry":["Hiedie kletskamer benodig nie 'n wagwoord nie"],"This room is not publicly searchable":["Hierdie kletskamer is nie publiek opspoorbaar nie"],"This room is publicly searchable":["Hierdie kletskamer is publiek opspoorbaar"],"Members only":["Slegs lede"],"Anyone can join this room":["Enige iemand kan hierdie kletskamer binnekom"],"Persistent":["Blywend"],"This room persists even if it's unoccupied":["Hierdie kletskamer bestaan voort selfs al is dit leeg"],"This room will disappear once the last person leaves":["Hierdie kletskamer sal verdwyn sodra die laaste persoon dit verlaat"],"All other room occupants can see your XMPP username":["Alle ander deelnemers can u Jabber ID sien"],"Only moderators can see your XMPP username":["Slegs moderators kan u Jabber ID sien"],"This room is being moderated":["Hierdie kletskamer word gemodereer"],"This room is not being moderated":["Hierdie kletskamer word nie gemodereer nie"],"Message archiving":["Boodskap-argivering"],"Messages are archived on the server":["Boodskappe word op die bediener gestoor"],"No password":["Geen wagwoord"],"XMPP Username:":["XMPP Gebruikersnaam:"],"Password:":["Wagwoord:"],"password":["wagwoord"],"This is a trusted device":[""],"To improve performance, we cache your data in this browser. Uncheck this box if this is a public computer or if you want your data to be deleted when you log out. It's important that you explicitly log out, otherwise not all cached data might be deleted.":[""],"Click here to log in anonymously":["Klik hier om anoniem aan te meld"],"Don't have a chat account?":["Geen kletsrekening nie?"],"Create an account":["Skep 'n rekening"],"Create your account":["Skep u rekening"],"Please enter the XMPP provider to register with:":["Verskaf asseblief die XMPP verskaffer om mee te registreer:"],"Already have a chat account?":["Het u reeds 'n kletsrekening?"],"Log in here":["Meld hier aan"],"Account Registration:":["Registreer 'n rekening:"],"Register":["Registreer"],"Choose a different provider":["Kies 'n ander verskaffer"],"Hold tight, we're fetching the registration form…":["Wag 'n bietjie, ons gaan haal die registrasievorm"],"Download":["Laai af"],"Download video file":[""],"Download audio file":[""]}}} \ No newline at end of file diff --git a/locale/af/LC_MESSAGES/converse.po b/locale/af/LC_MESSAGES/converse.po index 33db4b965..263dff8d3 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: 2018-07-02 16:28+0200\n" +"POT-Creation-Date: 2018-07-22 10:43+0200\n" "PO-Revision-Date: 2018-07-02 11:29+0200\n" "Last-Translator: JC Brand \n" "Language-Team: Afrikaans