From c9ce440219c7493a7d827aea7a53578a3e979ac7 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Fri, 30 Mar 2018 14:37:05 +0200 Subject: [PATCH] Regenerated pot, po and json files --- dist/converse-no-dependencies.js | 835 +++++------ locale/af/LC_MESSAGES/converse.json | 2 +- locale/af/LC_MESSAGES/converse.po | 1564 +++++++++++---------- locale/ar/LC_MESSAGES/converse.json | 1 + locale/ar/LC_MESSAGES/converse.po | 1568 +++++++++++---------- locale/bg/LC_MESSAGES/converse.json | 2 +- locale/bg/LC_MESSAGES/converse.po | 1575 +++++++++++---------- locale/ca/LC_MESSAGES/converse.json | 2 +- locale/ca/LC_MESSAGES/converse.po | 1578 +++++++++++---------- locale/converse.pot | 1483 ++++++++++---------- locale/de/LC_MESSAGES/converse.json | 2 +- locale/de/LC_MESSAGES/converse.po | 1173 ++++++++-------- locale/es/LC_MESSAGES/converse.json | 2 +- locale/es/LC_MESSAGES/converse.po | 1592 +++++++++++---------- locale/eu/LC_MESSAGES/converse.json | 1 + locale/eu/LC_MESSAGES/converse.po | 1570 +++++++++++---------- locale/fr/LC_MESSAGES/converse.json | 2 +- locale/fr/LC_MESSAGES/converse.po | 1573 +++++++++++---------- locale/he/LC_MESSAGES/converse.json | 2 +- locale/he/LC_MESSAGES/converse.po | 1592 +++++++++++---------- locale/hu/LC_MESSAGES/converse.json | 2 +- locale/hu/LC_MESSAGES/converse.po | 1574 +++++++++++---------- locale/id/LC_MESSAGES/converse.json | 2 +- locale/id/LC_MESSAGES/converse.po | 1773 ++++++++++++------------ locale/it/LC_MESSAGES/converse.json | 2 +- locale/it/LC_MESSAGES/converse.po | 1571 +++++++++++---------- locale/ja/LC_MESSAGES/converse.json | 2 +- locale/ja/LC_MESSAGES/converse.po | 1175 +++++++++------- locale/nb/LC_MESSAGES/converse.json | 2 +- locale/nb/LC_MESSAGES/converse.po | 1569 +++++++++++---------- locale/nl/LC_MESSAGES/converse.json | 2 +- locale/nl/LC_MESSAGES/converse.po | 1575 +++++++++++---------- locale/pl/LC_MESSAGES/converse.json | 2 +- locale/pl/LC_MESSAGES/converse.po | 1170 ++++++++-------- locale/pt_BR/LC_MESSAGES/converse.json | 2 +- locale/pt_BR/LC_MESSAGES/converse.po | 1566 +++++++++++---------- locale/ru/LC_MESSAGES/converse.json | 2 +- locale/ru/LC_MESSAGES/converse.po | 1185 ++++++++-------- locale/tr/LC_MESSAGES/converse.json | 2 +- locale/tr/LC_MESSAGES/converse.po | 1483 ++++++++++---------- locale/uk/LC_MESSAGES/converse.json | 2 +- locale/uk/LC_MESSAGES/converse.po | 1577 +++++++++++---------- locale/zh_CN/LC_MESSAGES/converse.json | 2 +- locale/zh_CN/LC_MESSAGES/converse.po | 1545 +++++++++++---------- locale/zh_TW/LC_MESSAGES/converse.json | 2 +- locale/zh_TW/LC_MESSAGES/converse.po | 1620 +++++++++++----------- 46 files changed, 18777 insertions(+), 16751 deletions(-) create mode 100644 locale/ar/LC_MESSAGES/converse.json create mode 100644 locale/eu/LC_MESSAGES/converse.json diff --git a/dist/converse-no-dependencies.js b/dist/converse-no-dependencies.js index 6ed849e06..3dfebd238 100644 --- a/dist/converse-no-dependencies.js +++ b/dist/converse-no-dependencies.js @@ -8024,7 +8024,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat } } }, - removeFromRoster: function removeFromRoster(callback) { + removeFromRoster: function removeFromRoster(callback, errback) { /* Instruct the XMPP server to remove this contact from our roster * Parameters: * (Function) callback @@ -8038,7 +8038,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat subscription: "remove" }); - _converse.connection.sendIQ(iq, callback, callback); + _converse.connection.sendIQ(iq, callback, errback); return this; } @@ -17145,16 +17145,7 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat var result = confirm(__("Are you sure you want to remove this contact?")); if (result === true) { - var iq = $iq({ - type: 'set' - }).c('query', { - xmlns: Strophe.NS.ROSTER - }).c('item', { - jid: this.model.get('jid'), - subscription: "remove" - }); - - _converse.connection.sendIQ(iq, function (iq) { + this.model.removeFromRoster(function (iq) { _this.model.destroy(); _this.remove(); @@ -19564,6 +19555,105 @@ return __p }); //# sourceMappingURL=backbone.orderedlistview.js.map; +// Converse.js (A browser based XMPP chat client) +// http://conversejs.org +// +// This is the utilities module. +// +// Copyright (c) 2012-2017, Jan-Carel Brand +// Licensed under the Mozilla Public License (MPLv2) +// +/*global define, escape, Jed */ +(function (root, factory) { + define('muc-utils',["converse-core", "utils"], factory); +}(this, function (converse, u) { + "use strict"; + + const { Strophe, sizzle, _ } = converse.env; + + u.computeAffiliationsDelta = function computeAffiliationsDelta (exclude_existing, remove_absentees, new_list, old_list) { + /* Given two lists of objects with 'jid', 'affiliation' and + * 'reason' properties, return a new list containing + * those objects that are new, changed or removed + * (depending on the 'remove_absentees' boolean). + * + * The affiliations for new and changed members stay the + * same, for removed members, the affiliation is set to 'none'. + * + * The 'reason' property is not taken into account when + * comparing whether affiliations have been changed. + * + * Parameters: + * (Boolean) exclude_existing: Indicates whether JIDs from + * the new list which are also in the old list + * (regardless of affiliation) should be excluded + * from the delta. One reason to do this + * would be when you want to add a JID only if it + * doesn't have *any* existing affiliation at all. + * (Boolean) remove_absentees: Indicates whether JIDs + * from the old list which are not in the new list + * should be considered removed and therefore be + * included in the delta with affiliation set + * to 'none'. + * (Array) new_list: Array containing the new affiliations + * (Array) old_list: Array containing the old affiliations + */ + const new_jids = _.map(new_list, 'jid'); + const old_jids = _.map(old_list, 'jid'); + + // Get the new affiliations + let delta = _.map( + _.difference(new_jids, old_jids), + (jid) => new_list[_.indexOf(new_jids, jid)] + ); + if (!exclude_existing) { + // Get the changed affiliations + delta = delta.concat(_.filter(new_list, function (item) { + const idx = _.indexOf(old_jids, item.jid); + if (idx >= 0) { + return item.affiliation !== old_list[idx].affiliation; + } + return false; + })); + } + if (remove_absentees) { + // Get the removed affiliations + delta = delta.concat( + _.map( + _.difference(old_jids, new_jids), + (jid) => ({'jid': jid, 'affiliation': 'none'}) + ) + ); + } + return delta; + }; + + u.parseMemberListIQ = function parseMemberListIQ (iq) { + /* Given an IQ stanza with a member list, create an array of member + * objects. + */ + return _.map( + sizzle(`query[xmlns="${Strophe.NS.MUC_ADMIN}"] item`, iq), + (item) => ({ + 'jid': item.getAttribute('jid'), + 'affiliation': item.getAttribute('affiliation'), + }) + ); + }; + + u.marshallAffiliationIQs = function marshallAffiliationIQs () { + /* Marshall a list of IQ stanzas into a map of JIDs and + * affiliations. + * + * Parameters: + * Any amount of XMLElement objects, representing the IQ + * stanzas. + */ + return _.flatMap(arguments[0], u.parseMemberListIQ); + } + +})); + // Converse.js (A browser based XMPP chat client) // http://conversejs.org // @@ -19577,7 +19667,7 @@ return __p * specified in XEP-0045 Multi-user chat. */ (function (root, factory) { - define('converse-muc',["form-utils", "converse-core", "converse-chatview", "converse-disco", "backbone.overview", "backbone.orderedlistview", "backbone.vdomview"], factory); + define('converse-muc',["form-utils", "converse-core", "converse-chatview", "converse-disco", "backbone.overview", "backbone.orderedlistview", "backbone.vdomview", "muc-utils"], factory); })(this, function (u, converse) { "use strict"; @@ -19826,6 +19916,328 @@ return __p 'type': converse.CHATROOMS_TYPE }); }, + directInvite: function directInvite(recipient, reason) { + /* Send a direct invitation as per XEP-0249 + * + * Parameters: + * (String) recipient - JID of the person being invited + * (String) reason - Optional reason for the invitation + */ + if (this.get('membersonly')) { + // When inviting to a members-only room, we first add + // the person to the member list by giving them an + // affiliation of 'member' (if they're not affiliated + // already), otherwise they won't be able to join. + var map = {}; + map[recipient] = 'member'; + + var deltaFunc = _.partial(u.computeAffiliationsDelta, true, false); + + this.updateMemberLists([{ + 'jid': recipient, + 'affiliation': 'member', + 'reason': reason + }], ['member', 'owner', 'admin'], deltaFunc); + } + + var attrs = { + 'xmlns': 'jabber:x:conference', + 'jid': this.get('jid') + }; + + if (reason !== null) { + attrs.reason = reason; + } + + if (this.get('password')) { + attrs.password = this.get('password'); + } + + var invitation = $msg({ + from: _converse.connection.jid, + to: recipient, + id: _converse.connection.getUniqueId() + }).c('x', attrs); + + _converse.connection.send(invitation); + + _converse.emit('roomInviteSent', { + 'room': this, + 'recipient': recipient, + 'reason': reason + }); + }, + sendConfiguration: function sendConfiguration(config, callback, errback) { + /* Send an IQ stanza with the room configuration. + * + * Parameters: + * (Array) config: The room configuration + * (Function) callback: Callback upon succesful IQ response + * The first parameter passed in is IQ containing the + * room configuration. + * The second is the response IQ from the server. + * (Function) errback: Callback upon error IQ response + * The first parameter passed in is IQ containing the + * room configuration. + * The second is the response IQ from the server. + */ + var iq = $iq({ + to: this.get('jid'), + type: "set" + }).c("query", { + xmlns: Strophe.NS.MUC_OWNER + }).c("x", { + xmlns: Strophe.NS.XFORM, + type: "submit" + }); + + _.each(config || [], function (node) { + iq.cnode(node).up(); + }); + + callback = _.isUndefined(callback) ? _.noop : _.partial(callback, iq.nodeTree); + errback = _.isUndefined(errback) ? _.noop : _.partial(errback, iq.nodeTree); + return _converse.connection.sendIQ(iq, callback, errback); + }, + parseRoomFeatures: function parseRoomFeatures(iq) { + /* Parses an IQ stanza containing the room's features. + * + * See http://xmpp.org/extensions/xep-0045.html#disco-roominfo + * + * + * + * + * + * + * + * + * + * + */ + var features = { + 'features_fetched': true, + 'name': iq.querySelector('identity').getAttribute('name') + }; + + _.each(iq.querySelectorAll('feature'), function (field) { + var fieldname = field.getAttribute('var'); + + if (!fieldname.startsWith('muc_')) { + if (fieldname === Strophe.NS.MAM) { + features.mam_enabled = true; + } + + return; + } + + features[fieldname.replace('muc_', '')] = true; + }); + + var desc_field = iq.querySelector('field[var="muc#roominfo_description"] value'); + + if (!_.isNull(desc_field)) { + features.description = desc_field.textContent; + } + + this.save(features); + }, + requestMemberList: function requestMemberList(affiliation) { + var _this = this; + + /* Send an IQ stanza to the server, asking it for the + * member-list of this room. + * + * See: http://xmpp.org/extensions/xep-0045.html#modifymember + * + * Parameters: + * (String) affiliation: The specific member list to + * fetch. 'admin', 'owner' or 'member'. + * + * Returns: + * A promise which resolves once the list has been + * retrieved. + */ + return new Promise(function (resolve, reject) { + affiliation = affiliation || 'member'; + var iq = $iq({ + to: _this.get('jid'), + type: "get" + }).c("query", { + xmlns: Strophe.NS.MUC_ADMIN + }).c("item", { + 'affiliation': affiliation + }); + + _converse.connection.sendIQ(iq, resolve, reject); + }); + }, + setAffiliation: function setAffiliation(affiliation, members) { + /* Send IQ stanzas to the server to set an affiliation for + * the provided JIDs. + * + * See: http://xmpp.org/extensions/xep-0045.html#modifymember + * + * XXX: Prosody doesn't accept multiple JIDs' affiliations + * being set in one IQ stanza, so as a workaround we send + * a separate stanza for each JID. + * Related ticket: https://prosody.im/issues/issue/795 + * + * Parameters: + * (String) affiliation: The affiliation + * (Object) members: A map of jids, affiliations and + * optionally reasons. Only those entries with the + * same affiliation as being currently set will be + * considered. + * + * Returns: + * A promise which resolves and fails depending on the + * XMPP server response. + */ + members = _.filter(members, function (member) { + return (// We only want those members who have the right + // affiliation (or none, which implies the provided one). + _.isUndefined(member.affiliation) || member.affiliation === affiliation + ); + }); + + var promises = _.map(members, _.bind(this.sendAffiliationIQ, this, affiliation)); + + return Promise.all(promises); + }, + saveAffiliationAndRole: function saveAffiliationAndRole(pres) { + /* Parse the presence stanza for the current user's + * affiliation. + * + * Parameters: + * (XMLElement) pres: A stanza. + */ + var item = sizzle("x[xmlns=\"".concat(Strophe.NS.MUC_USER, "\"] item"), pres).pop(); + var is_self = pres.querySelector("status[code='110']"); + + if (is_self && !_.isNil(item)) { + var affiliation = item.getAttribute('affiliation'); + var role = item.getAttribute('role'); + + if (affiliation) { + this.save({ + 'affiliation': affiliation + }); + } + + if (role) { + this.save({ + 'role': role + }); + } + } + }, + sendAffiliationIQ: function sendAffiliationIQ(affiliation, member) { + var _this2 = this; + + /* Send an IQ stanza specifying an affiliation change. + * + * Paremeters: + * (String) affiliation: affiliation (could also be stored + * on the member object). + * (Object) member: Map containing the member's jid and + * optionally a reason and affiliation. + */ + return new Promise(function (resolve, reject) { + var iq = $iq({ + to: _this2.get('jid'), + type: "set" + }).c("query", { + xmlns: Strophe.NS.MUC_ADMIN + }).c("item", { + 'affiliation': member.affiliation || affiliation, + 'jid': member.jid + }); + + if (!_.isUndefined(member.reason)) { + iq.c("reason", member.reason); + } + + _converse.connection.sendIQ(iq, resolve, reject); + }); + }, + setAffiliations: function setAffiliations(members) { + /* Send IQ stanzas to the server to modify the + * affiliations in this room. + * + * See: http://xmpp.org/extensions/xep-0045.html#modifymember + * + * Parameters: + * (Object) members: A map of jids, affiliations and optionally reasons + * (Function) onSuccess: callback for a succesful response + * (Function) onError: callback for an error response + */ + var affiliations = _.uniq(_.map(members, 'affiliation')); + + _.each(affiliations, _.partial(this.setAffiliation.bind(this), _, members)); + }, + getJidsWithAffiliations: function getJidsWithAffiliations(affiliations) { + var _this3 = this; + + /* Returns a map of JIDs that have the affiliations + * as provided. + */ + if (_.isString(affiliations)) { + affiliations = [affiliations]; + } + + return new Promise(function (resolve, reject) { + var promises = _.map(affiliations, _.partial(_this3.requestMemberList.bind(_this3))); + + Promise.all(promises).then(_.flow(u.marshallAffiliationIQs, resolve), _.flow(u.marshallAffiliationIQs, resolve)); + }); + }, + updateMemberLists: function updateMemberLists(members, affiliations, deltaFunc) { + var _this4 = this; + + /* Fetch the lists of users with the given affiliations. + * Then compute the delta between those users and + * the passed in members, and if it exists, send the delta + * to the XMPP server to update the member list. + * + * Parameters: + * (Object) members: Map of member jids and affiliations. + * (String|Array) affiliation: An array of affiliations or + * a string if only one affiliation. + * (Function) deltaFunc: The function to compute the delta + * between old and new member lists. + * + * Returns: + * A promise which is resolved once the list has been + * updated or once it's been established there's no need + * to update the list. + */ + this.getJidsWithAffiliations(affiliations).then(function (old_members) { + _this4.setAffiliations(deltaFunc(members, old_members)); + }); + }, + checkForReservedNick: function checkForReservedNick(callback, errback) { + /* Use service-discovery to ask the XMPP server whether + * this user has a reserved nickname for this room. + * If so, we'll use that, otherwise we render the nickname form. + * + * Parameters: + * (Function) callback: Callback upon succesful IQ response + * (Function) errback: Callback upon error IQ response + */ + _converse.connection.sendIQ($iq({ + 'to': this.get('jid'), + 'from': _converse.connection.jid, + 'type': "get" + }).c("query", { + 'xmlns': Strophe.NS.DISCO_INFO, + 'node': 'x-roomuser-item' + }), callback, errback); + + return this; + }, isUserMentioned: function isUserMentioned(message) { /* Returns a boolean to indicate whether the current user * was mentioned in a message. @@ -19849,17 +20261,17 @@ return __p } if (u.isNewMessage(stanza) && this.newMessageWillBeHidden()) { - this.save({ + var settings = { 'num_unread_general': this.get('num_unread_general') + 1 - }); + }; if (this.isUserMentioned(body.textContent)) { - this.save({ - 'num_unread': this.get('num_unread') + 1 - }); + settings.num_unread = this.get('num_unread') + 1; _converse.incrementMsgCounter(); } + + this.save(settings); } }, clearUnreadMsgCounter: function clearUnreadMsgCounter() { @@ -20617,7 +21029,7 @@ return __p 'jid': bookmark.getAttribute('jid'), 'name': bookmark.getAttribute('name'), 'autojoin': bookmark.getAttribute('autojoin') === 'true', - 'nick': bookmark.querySelector('nick').textContent + 'nick': _.get(bookmark.querySelector('nick'), 'textContent') }); }); }, @@ -21757,7 +22169,7 @@ return __p define('tpl!chatarea', ['lodash'], function(_) {return function(o) { var __t, __p = '', __e = _.escape, __j = Array.prototype.join; function print() { __p += __j.call(arguments, '') } -__p += '
\n
\n
{ - affiliation = affiliation || 'member'; - const iq = $iq({to: chatroom_jid, type: "get"}) - .c("query", {xmlns: Strophe.NS.MUC_ADMIN}) - .c("item", {'affiliation': affiliation}); - _converse.connection.sendIQ(iq, resolve, reject); - }); - }, - - parseMemberListIQ (iq) { - /* Given an IQ stanza with a member list, create an array of member - * objects. - */ - return _.map( - sizzle(`query[xmlns="${Strophe.NS.MUC_ADMIN}"] item`, iq), - (item) => ({ - 'jid': item.getAttribute('jid'), - 'affiliation': item.getAttribute('affiliation'), - }) - ); - }, - - computeAffiliationsDelta (exclude_existing, remove_absentees, new_list, old_list) { - /* Given two lists of objects with 'jid', 'affiliation' and - * 'reason' properties, return a new list containing - * those objects that are new, changed or removed - * (depending on the 'remove_absentees' boolean). - * - * The affiliations for new and changed members stay the - * same, for removed members, the affiliation is set to 'none'. - * - * The 'reason' property is not taken into account when - * comparing whether affiliations have been changed. - * - * Parameters: - * (Boolean) exclude_existing: Indicates whether JIDs from - * the new list which are also in the old list - * (regardless of affiliation) should be excluded - * from the delta. One reason to do this - * would be when you want to add a JID only if it - * doesn't have *any* existing affiliation at all. - * (Boolean) remove_absentees: Indicates whether JIDs - * from the old list which are not in the new list - * should be considered removed and therefore be - * included in the delta with affiliation set - * to 'none'. - * (Array) new_list: Array containing the new affiliations - * (Array) old_list: Array containing the old affiliations - */ - const new_jids = _.map(new_list, 'jid'); - const old_jids = _.map(old_list, 'jid'); - - // Get the new affiliations - let delta = _.map( - _.difference(new_jids, old_jids), - (jid) => new_list[_.indexOf(new_jids, jid)] - ); - if (!exclude_existing) { - // Get the changed affiliations - delta = delta.concat(_.filter(new_list, function (item) { - const idx = _.indexOf(old_jids, item.jid); - if (idx >= 0) { - return item.affiliation !== old_list[idx].affiliation; - } - return false; - })); - } - if (remove_absentees) { - // Get the removed affiliations - delta = delta.concat( - _.map( - _.difference(old_jids, new_jids), - (jid) => ({'jid': jid, 'affiliation': 'none'}) - ) - ); - } - return delta; - }, - - sendAffiliationIQ (chatroom_jid, affiliation, member) { - /* Send an IQ stanza specifying an affiliation change. - * - * Paremeters: - * (String) chatroom_jid: JID of the relevant room - * (String) affiliation: affiliation (could also be stored - * on the member object). - * (Object) member: Map containing the member's jid and - * optionally a reason and affiliation. - */ - return new Promise((resolve, reject) => { - const iq = $iq({to: chatroom_jid, type: "set"}) - .c("query", {xmlns: Strophe.NS.MUC_ADMIN}) - .c("item", { - 'affiliation': member.affiliation || affiliation, - 'jid': member.jid - }); - if (!_.isUndefined(member.reason)) { - iq.c("reason", member.reason); - } - _converse.connection.sendIQ(iq, resolve, reject); - }); - }, - - setAffiliation (affiliation, members) { - /* Send IQ stanzas to the server to set an affiliation for - * the provided JIDs. - * - * See: http://xmpp.org/extensions/xep-0045.html#modifymember - * - * XXX: Prosody doesn't accept multiple JIDs' affiliations - * being set in one IQ stanza, so as a workaround we send - * a separate stanza for each JID. - * Related ticket: https://prosody.im/issues/issue/795 - * - * Parameters: - * (String) affiliation: The affiliation - * (Object) members: A map of jids, affiliations and - * optionally reasons. Only those entries with the - * same affiliation as being currently set will be - * considered. - * - * Returns: - * A promise which resolves and fails depending on the - * XMPP server response. - */ - members = _.filter(members, (member) => - // We only want those members who have the right - // affiliation (or none, which implies the provided - // one). - _.isUndefined(member.affiliation) || - member.affiliation === affiliation - ); - const promises = _.map( - members, - _.partial(this.sendAffiliationIQ, this.model.get('jid'), affiliation) - ); - return Promise.all(promises); - }, - - setAffiliations (members) { - /* Send IQ stanzas to the server to modify the - * affiliations in this room. - * - * See: http://xmpp.org/extensions/xep-0045.html#modifymember - * - * Parameters: - * (Object) members: A map of jids, affiliations and optionally reasons - * (Function) onSuccess: callback for a succesful response - * (Function) onError: callback for an error response - */ - const affiliations = _.uniq(_.map(members, 'affiliation')); - _.each(affiliations, _.partial(this.setAffiliation.bind(this), _, members)); - }, - - marshallAffiliationIQs () { - /* Marshall a list of IQ stanzas into a map of JIDs and - * affiliations. - * - * Parameters: - * Any amount of XMLElement objects, representing the IQ - * stanzas. - */ - return _.flatMap(arguments[0], this.parseMemberListIQ); - }, - - getJidsWithAffiliations (affiliations) { - /* Returns a map of JIDs that have the affiliations - * as provided. - */ - if (_.isString(affiliations)) { - affiliations = [affiliations]; - } - return new Promise((resolve, reject) => { - const promises = _.map( - affiliations, - _.partial(this.requestMemberList, this.model.get('jid')) - ); - - Promise.all(promises).then( - _.flow(this.marshallAffiliationIQs.bind(this), resolve), - _.flow(this.marshallAffiliationIQs.bind(this), resolve) - ); - }); - }, - - updateMemberLists (members, affiliations, deltaFunc) { - /* Fetch the lists of users with the given affiliations. - * Then compute the delta between those users and - * the passed in members, and if it exists, send the delta - * to the XMPP server to update the member list. - * - * Parameters: - * (Object) members: Map of member jids and affiliations. - * (String|Array) affiliation: An array of affiliations or - * a string if only one affiliation. - * (Function) deltaFunc: The function to compute the delta - * between old and new member lists. - * - * Returns: - * A promise which is resolved once the list has been - * updated or once it's been established there's no need - * to update the list. - */ - this.getJidsWithAffiliations(affiliations).then((old_members) => { - this.setAffiliations(deltaFunc(members, old_members)); - }); - }, - - directInvite (recipient, reason) { - /* Send a direct invitation as per XEP-0249 - * - * Parameters: - * (String) recipient - JID of the person being invited - * (String) reason - Optional reason for the invitation - */ - if (this.model.get('membersonly')) { - // When inviting to a members-only room, we first add - // the person to the member list by giving them an - // affiliation of 'member' (if they're not affiliated - // already), otherwise they won't be able to join. - const map = {}; map[recipient] = 'member'; - const deltaFunc = _.partial(this.computeAffiliationsDelta, true, false); - this.updateMemberLists( - [{'jid': recipient, 'affiliation': 'member', 'reason': reason}], - ['member', 'owner', 'admin'], - deltaFunc - ); - } - const attrs = { - 'xmlns': 'jabber:x:conference', - 'jid': this.model.get('jid') - }; - if (reason !== null) { attrs.reason = reason; } - if (this.model.get('password')) { attrs.password = this.model.get('password'); } - const invitation = $msg({ - from: _converse.connection.jid, - to: recipient, - id: _converse.connection.getUniqueId() - }).c('x', attrs); - _converse.connection.send(invitation); - _converse.emit('roomInviteSent', { - 'room': this, - 'recipient': recipient, - 'reason': reason - }); - }, - handleChatStateMessage (message) { /* Override the method on the ChatBoxView base class to * ignore notifications in groupchats. @@ -23248,14 +23399,14 @@ return __p switch (command) { case 'admin': if (!this.validateRoleChangeCommand(command, args)) { break; } - this.setAffiliation('admin', + this.model.setAffiliation('admin', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); break; case 'ban': if (!this.validateRoleChangeCommand(command, args)) { break; } - this.setAffiliation('outcast', + this.model.setAffiliation('outcast', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -23303,7 +23454,7 @@ return __p break; case 'member': if (!this.validateRoleChangeCommand(command, args)) { break; } - this.setAffiliation('member', + this.model.setAffiliation('member', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -23317,7 +23468,7 @@ return __p break; case 'owner': if (!this.validateRoleChangeCommand(command, args)) { break; } - this.setAffiliation('owner', + this.model.setAffiliation('owner', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -23330,7 +23481,7 @@ return __p break; case 'revoke': if (!this.validateRoleChangeCommand(command, args)) { break; } - this.setAffiliation('none', + this.model.setAffiliation('none', [{ 'jid': args[0], 'reason': args[1] }]).then(null, this.onCommandError.bind(this)); @@ -23439,7 +23590,8 @@ return __p */ nick = nick ? nick : this.model.get('nick'); if (!nick) { - return this.checkForReservedNick(); + this.checkForReservedNick(); + return this; } if (this.model.get('connection_status') === converse.ROOMSTATUS.ENTERED) { // We have restored a chat room from session storage, @@ -23553,29 +23705,6 @@ return __p ); }, - sendConfiguration(config, onSuccess, onError) { - /* Send an IQ stanza with the room configuration. - * - * Parameters: - * (Array) config: The room configuration - * (Function) onSuccess: Callback upon succesful IQ response - * The first parameter passed in is IQ containing the - * room configuration. - * The second is the response IQ from the server. - * (Function) onError: Callback upon error IQ response - * The first parameter passed in is IQ containing the - * room configuration. - * The second is the response IQ from the server. - */ - const iq = $iq({to: this.model.get('jid'), type: "set"}) - .c("query", {xmlns: Strophe.NS.MUC_OWNER}) - .c("x", {xmlns: Strophe.NS.XFORM, type: "submit"}); - _.each(config || [], function (node) { iq.cnode(node).up(); }); - onSuccess = _.isUndefined(onSuccess) ? _.noop : _.partial(onSuccess, iq.nodeTree); - onError = _.isUndefined(onError) ? _.noop : _.partial(onError, iq.nodeTree); - return _converse.connection.sendIQ(iq, onSuccess, onError); - }, - saveConfiguration (form) { /* Submit the room configuration form by sending an IQ * stanza to the server. @@ -23589,7 +23718,7 @@ return __p return new Promise((resolve, reject) => { const inputs = form ? sizzle(':input:not([type=button]):not([type=submit])', form) : [], configArray = _.map(inputs, u.webForm2xForm); - this.sendConfiguration(configArray, resolve, reject); + this.model.sendConfiguration(configArray, resolve, reject); this.closeForm(); }); }, @@ -23633,7 +23762,7 @@ return __p } configArray.push(field); if (!--count) { - that.sendConfiguration(configArray, resolve, reject); + that.model.sendConfiguration(configArray, resolve, reject); } }); }); @@ -23673,42 +23802,6 @@ return __p }); }, - parseRoomFeatures (iq) { - /* See http://xmpp.org/extensions/xep-0045.html#disco-roominfo - * - * - * - * - * - * - * - * - * - * - */ - const features = { - 'features_fetched': true, - 'name': iq.querySelector('identity').getAttribute('name') - } - _.each(iq.querySelectorAll('feature'), function (field) { - const fieldname = field.getAttribute('var'); - if (!fieldname.startsWith('muc_')) { - if (fieldname === Strophe.NS.MAM) { - features.mam_enabled = true; - } - return; - } - features[fieldname.replace('muc_', '')] = true; - }); - const desc_field = iq.querySelector('field[var="muc#roominfo_description"] value'); - if (!_.isNull(desc_field)) { - features.description = desc_field.textContent; - } - this.model.save(features); - }, getRoomFeatures () { /* Fetch the room disco info, parse it and then @@ -23718,7 +23811,7 @@ return __p _converse.connection.disco.info( this.model.get('jid'), null, - _.flow(this.parseRoomFeatures.bind(this), resolve), + _.flow(this.model.parseRoomFeatures.bind(this.model), resolve), () => { reject(new Error("Could not parse the room features")) }, 5000 ); @@ -23767,22 +23860,13 @@ return __p checkForReservedNick () { /* User service-discovery to ask the XMPP server whether * this user has a reserved nickname for this room. - * If so, we'll use that, otherwise we render the nickname - * form. + * If so, we'll use that, otherwise we render the nickname form. */ this.showSpinner(); - _converse.connection.sendIQ( - $iq({ - 'to': this.model.get('jid'), - 'from': _converse.connection.jid, - 'type': "get" - }).c("query", { - 'xmlns': Strophe.NS.DISCO_INFO, - 'node': 'x-roomuser-item' - }), + this.model.checkForReservedNick( this.onNickNameFound.bind(this), this.onNickNameNotFound.bind(this) - ); + ) return this; }, @@ -23946,27 +24030,6 @@ return __p return; }, - saveAffiliationAndRole (pres) { - /* Parse the presence stanza for the current user's - * affiliation. - * - * Parameters: - * (XMLElement) pres: A stanza. - */ - const item = sizzle(`x[xmlns="${Strophe.NS.MUC_USER}"] item`, pres).pop(); - const is_self = pres.querySelector("status[code='110']"); - if (is_self && !_.isNil(item)) { - const affiliation = item.getAttribute('affiliation'); - const role = item.getAttribute('role'); - if (affiliation) { - this.model.save({'affiliation': affiliation}); - } - if (role) { - this.model.save({'role': role}); - } - } - }, - parseXUserElement (x, stanza, is_self) { /* Parse the passed-in * element and construct a map containing relevant @@ -24250,7 +24313,7 @@ return __p * Parameters: * (XMLElement) pres: The stanza */ - this.saveAffiliationAndRole(pres); + this.model.saveAffiliationAndRole(pres); const locked_room = pres.querySelector("status[code='201']"); if (locked_room) { @@ -24715,7 +24778,7 @@ return __p suggestion.text.label, this.model.get('id')) ); if (reason !== null) { - this.chatroomview.directInvite(suggestion.text.value, reason); + this.chatroomview.model.directInvite(suggestion.text.value, reason); } const form = suggestion.target.form, error = form.querySelector('.pure-form-message.error'); diff --git a/locale/af/LC_MESSAGES/converse.json b/locale/af/LC_MESSAGES/converse.json index dcd0b2a11..d45ac44d2 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"},"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"],"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"],"Close this chat box":["Sluit hierdie kletskas"],"You have unread messages":["U het ongelese boodskappe"],"Personal message":["Persoonlike boodskap"],"Send":["Stuur"],"Optional hint":[""],"Clear all messages":["Vee alle boodskappe uit"],"Insert a smiley":["Voeg 'n emotikon by"],"Start a call":["Begin 'n oproep"],"me":["ek"],"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"],"has gone away":["het weggegaan"],"Remove messages":["Verwyder boodskappe"],"Write in the third person":["Skryf in die derde persoon"],"Show this menu":["Vertoon hierdie keuselys"],"Are you sure you want to clear the messages from this chat box?":["Is u seker u wil die boodskappe in hierdie kletskas uitvee?"],"Hide hidden message":[""],"has gone offline":["is nou aflyn"],"is busy":["is besig"],"Login":["Aanmelding"],"Jabber ID:":["Jabber ID:"],"Password:":["Wagwoord:"],"password":["wagwoord"],"Submit":["Dien in"],"Click here to log in anonymously":["Klik hier om anoniem aan te meld"],"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"],"Contacts":["Kontakte"],"Groups":["Groepe"],"My contacts":["My kontakte"],"Pending contacts":["Hangende kontakte"],"Contact requests":["Kontakversoeke"],"Ungrouped":["Ongegroepeer"],"Filter":["Filtreer"],"State":["Kletsstand"],"Any":["Enige"],"Unread":["Ongelees"],"Online":["Aangemeld"],"Chatty":["Geselserig"],"Busy":["Besig"],"Away":["Afwesig"],"Extended Away":["Weg vir langer"],"Offline":["Afgemeld"],"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 remove this contact?":["Is u seker u wil hierdie gespreksmaat verwyder?"],"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."],"Are you sure you want to decline this contact request?":["Is u seker dat u hierdie persoon se versoek wil afkeur?"],"I am %1$s":["Ek is %1$s"],"Click here to write a custom status message":["Klik hier om jou eie statusboodskap te skryf"],"Click to change your chat status":["Klik om jou klets-status te verander"],"Custom status":["Doelgemaakte status"],"Save":["Stoor"],"online":["aangemeld"],"busy":["besig"],"away for long":["vir lank afwesig"],"away":["afwesig"],"offline":["afgemeld"],"Username":["Gebruikersnaam"],"user@domain":["gebruiker@domein"],"Please enter a valid XMPP address":["Verskaf asseblief 'n geldige XMPP address"],"Log out":["Meld af"],"Click to add new chat contacts":["Klik om nuwe kletskontakte by te voeg"],"Add a contact":["Voeg 'n kontak by"],"Contact name":["Kontaknaam"],"Search":["Soek"],"e.g. user@example.org":["bv. gebruiker@voorbeeld.org"],"Add":["Voeg by"],"No users found":["Geen gebruikers gevind"],"Click to add as a chat contact":["Klik om as kletskontak by te voeg"],"Toggle chat":["Klets"],"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"],"Message":["Boodskap"],"Close and leave this room":["Sluit en verlaat hierdie kletskamer"],"Configure this room":["Konfigureer 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."],"Are you sure you want to clear the messages from this room?":["Is u seker dat u die boodskappe in hierdie kamer wil verwyder?"],"Error: could not execute the command":["Fout: kon nie die opdrag uitvoer nie"],"Change user's affiliation to admin":["Verander die gebruiker se affiliasie na admin"],"Ban user from room":["Verban gebruiker uit hierdie kletskamer"],"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"],"Cancel":["Kanseleer"],"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"],"Nickname":["Bynaam"],"Enter room":["Betree kletskamer"],"This chatroom requires a password":["Hiedie kletskamer benodig 'n wagwoord"],"Password: ":["Wagwoord: "],"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."],"Topic set by %1$s to: %2$s":["Onderwerp deur %1$s bygewerk na: %2$s"],"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."],"Occupants":["Deelnemers"],"Invite":["Nooi uit"],"Features":["Eienskappe"],"Hidden":["Verskuil"],"Message archiving":["Boodskap-argivering"],"Members only":["Slegs lede"],"Moderated":["Gemodereer"],"Non-anonymous":["Nie-anoniem"],"Open":["Oop kletskamer"],"Password protected":["Wagwoord"],"Persistent":["Blywend"],"Public":["Publiek"],"Semi-anonymous":["Deels anoniem"],"Temporary":["Tydelike kamer"],"Unmoderated":["Ongemodereer"],"This room is not publicly searchable":["Hierdie kletskamer is nie publiek opspoorbaar nie"],"Messages are archived on the server":["Boodskappe word op die bediener gestoor"],"This room is restricted to members only":["Hierdie kletskamer is slegs tot lede beperk"],"This room is being moderated":["Hierdie kletskamer word gemodereer"],"All other room occupants can see your XMPP username":["Alle ander deelnemers can u Jabber ID sien"],"Anyone can join this room":["Enige iemand kan hierdie kletskamer binnekom"],"This room requires a password before entry":["Hierdie kletskamer benodig 'n wagwoord"],"This room persists even if it's unoccupied":["Hierdie kletskamer bestaan voort selfs al is dit leeg"],"This room is publicly searchable":["Hierdie kletskamer is publiek opspoorbaar"],"Only moderators can see your XMPP username":["Slegs moderators kan u Jabber ID sien"],"This room will disappear once the last person leaves":["Hierdie kletskamer sal verdwyn sodra die laaste persoon dit verlaat"],"This room is not being moderated":["Hierdie kletskamer word nie gemodereer nie"],"This room does not require a password upon entry":["Hiedie kletskamer benodig nie 'n wagwoord nie"],"Please enter a valid XMPP username":["Verskaf asseblief 'n geldige XMPP adres"],"Room name":["Kamer naam"],"Server":["Bediener"],"Join Room":["Betree kletskamer"],"Show rooms":["Wys kletskamers"],"Rooms":["Kletskamers"],"Click to open this room":["Klik om hierdie kletskamer te open"],"Show more information on this room":["Wys meer inligting aangaande hierdie kletskamer"],"Description:":["Beskrywing:"],"Room Address (JID):":["Kletskameradres (JID):"],"Occupants:":["Deelnemers:"],"Features:":["Eienskappe:"],"Requires authentication":["Benodig magtiging"],"Requires an invitation":["Benodig 'n uitnodiging"],"Open room":["Oop kletskamer"],"Permanent room":["Permanente kamer"],"Temporary room":["Tydelike kamer"],"%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\""],"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?"],"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"],"Click to toggle the bookmarks list":["Klik om die boekmerklys te skakel"],"Bookmarks":["Kletskamerboekmerke"],"Click to toggle the rooms list":["Klik om die boekmerklys te skakel"],"Open Rooms":["Oop kletskamers"],"Are you sure you want to leave the room \"%1$s\"?":["Is u seker u wil die kletskaner \"%1$s\" verlaat?"],"Re-establishing encrypted session":["Herstel versleutelde sessie"],"Generating private key.":["Genereer private sleutel."],"Your browser might become unresponsive.":["U webblaaier mag tydelik onreageerbaar word."],"Authentication request from %1$s\n\nYour chat contact is attempting to verify your identity, by asking you the question below.\n\n%2$s":["Identiteitbevestigingsversoek van %1$s\n\nU gespreksmaat probeer om u identiteit te bevestig, deur die volgende vraag te vra \n\n%2$s"],"Could not verify this user's identify.":["Kon nie hierdie gebruiker se identitied bevestig nie."],"Exchanging private key with contact.":["Sleutels word met gespreksmaat uitgeruil."],"Your messages are not encrypted anymore":["U boodskappe is nie meer versleutel nie"],"Your messages are now encrypted but your contact's identity has not been verified.":["U boodskappe is nou versleutel maar u gespreksmaat se identiteit is nog onseker."],"Your contact's identify has been verified.":["U gespreksmaat se identiteit is bevestig."],"Your contact has ended encryption on their end, you should do the same.":["U gespreksmaat het versleuteling gestaak, u behoort nou dieselfde te doen."],"Your message could not be sent":["U boodskap kon nie gestuur word nie"],"We received an unencrypted message":["Ons het 'n onversleutelde boodskap ontvang"],"We received an unreadable encrypted message":["Ons het 'n onleesbare versleutelde boodskap ontvang"],"Here are the fingerprints, please confirm them with %1$s, outside of this chat.\n\nFingerprint for you, %2$s: %3$s\n\nFingerprint for %1$s: %4$s\n\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.":["Hier is die vingerafdrukke, bevestig hulle met %1$s, buite hierdie kletskanaal \n\nU vingerafdruk, %2$s: %3$s\n\nVingerafdruk vir %1$s: %4$s\n\nIndien u die vingerafdrukke bevestig het, klik OK, andersinds klik Kanselleer."],"You will be prompted to provide a security question and then an answer to that question.\n\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.":["Daar sal van u verwag word om 'n sekuriteitsvraag te stel, en dan ook die antwoord tot daardie vraag te verskaf.\n\nU gespreksmaat sal dan daardie vraag gestel word, en indien hulle presies dieselfde antwoord (lw. hoofletters tel) verskaf, sal hul identiteit bevestig wees."],"What is your security question?":["Wat is u sekuriteitsvraag?"],"What is the answer to the security question?":["Wat is die antwoord tot die sekuriteitsvraag?"],"Invalid authentication scheme provided":["Ongeldige verifikasiemetode verskaf"],"Your messages are not encrypted. Click here to enable OTR encryption.":["U boodskappe is nie versleutel nie. Klik hier om OTR versleuteling te aktiveer."],"Your messages are encrypted, but your contact has not been verified.":["U boodskappe is versleutel, maar u gespreksmaat se identiteit is not onseker."],"Your messages are encrypted and your contact verified.":["U boodskappe is versleutel en u gespreksmaat se identiteit bevestig."],"Your contact has closed their end of the private session, you should do the same":["U gespreksmaat het die private sessie gestaak. U behoort dieselfde te doen"],"End encrypted conversation":["Beëindig versleutelde gesprek"],"Refresh encrypted conversation":["Verfris versleutelde gesprek"],"Start encrypted conversation":["Begin versleutelde gesprek"],"Verify with fingerprints":["Bevestig met vingerafdrukke"],"Verify with SMP":["Bevestig met SMP"],"What's this?":["Wat is hierdie?"],"unencrypted":["nie-privaat"],"unverified":["onbevestig"],"verified":["privaat"],"finished":["afgesluit"],"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"]," 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."],"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"],"Minimize this chat box":["Minimeer hierdie kletskas"],"Click to restore this chat":["Klik om hierdie klets te herstel"],"Minimized":["Geminimaliseer"]}}} \ No newline at end of file +{"domain":"converse","locale_data":{"converse":{"":{"domain":"converse","plural_forms":"nplurals=2; plural=n != 1;","lang":"af"},"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"],"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"],"Close this chat box":["Sluit hierdie kletskas"],"You have unread messages":["U het ongelese boodskappe"],"Hidden message":["Verskuilde boodskap"],"Personal message":["Persoonlike boodskap"],"Send":["Stuur"],"Optional hint":[""],"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"],"Insert a smiley":["Voeg 'n emotikon by"],"Start a call":["Begin 'n oproep"],"Show hidden message":["Vertoon verskuilde boodskap"],"me":["ek"],"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"],"has gone away":["het weggegaan"],"Remove messages":["Verwyder boodskappe"],"Write in the third person":["Skryf in die derde persoon"],"Show this menu":["Vertoon hierdie keuselys"],"Are you sure you want to clear the messages from this chat box?":["Is u seker u wil die boodskappe in hierdie kletskas uitvee?"],"Hide hidden message":[""],"has gone offline":["is nou aflyn"],"is busy":["is besig"],"XMPP Username:":["XMPP Gebruikersnaam:"],"Password:":["Wagwoord:"],"password":["wagwoord"],"Submit":["Dien in"],"Click here to log in anonymously":["Klik hier om anoniem aan te meld"],"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"],"Contacts":["Kontakte"],"Groups":["Groepe"],"My contacts":["My kontakte"],"Pending contacts":["Hangende kontakte"],"Contact requests":["Kontakversoeke"],"Ungrouped":["Ongegroepeer"],"Contact name":["Kontaknaam"],"Optional nickname":[""],"XMPP Address":[""],"Add":["Voeg by"],"Please enter a valid XMPP address":["Verskaf asseblief 'n geldige XMPP address"],"Filter":["Filtreer"],"Filter by group name":[""],"Filter by status":[""],"Any":["Enige"],"Unread":["Ongelees"],"Online":["Aangemeld"],"Chatty":["Geselserig"],"Busy":["Besig"],"Away":["Afwesig"],"Extended Away":["Weg vir langer"],"Offline":["Afgemeld"],"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 remove this contact?":["Is u seker u wil hierdie gespreksmaat verwyder?"],"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."],"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"],"Your Profile":[""],"Close":[""],"Cancel":["Kanseleer"],"Custom status":["Doelgemaakte status"],"Save":["Stoor"],"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"],"Username":["Gebruikersnaam"],"user@domain":["gebruiker@domein"],"Toggle chat":["Klets"],"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"],"%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\""],"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?"],"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"],"Click to toggle the rooms list":["Klik om die boekmerklys te skakel"],"Open Rooms":["Oop kletskamers"],"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"],"name@conference.example.org":[""],"Message":["Boodskap"],"%1$s is no longer a moderator.":["%1$s is nie meer 'n moderator nie."],"%1$s has been given a voice again.":["%1$s het nou weer 'n stem."],"%1$s has been muted.":["%1$s is nou stemloos."],"%1$s is now a moderator.":["%1$s is nou 'n moderator."],"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."],"Are you sure you want to clear the messages from this room?":["Is u seker dat u die boodskappe in hierdie kamer wil verwyder?"],"Error: could not execute the command":["Fout: kon nie die opdrag uitvoer nie"],"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"],"Nickname":["Bynaam"],"Enter room":["Betree kletskamer"],"This chatroom requires a password":["Hiedie kletskamer benodig 'n wagwoord"],"Password: ":["Wagwoord: "],"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."],"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."],"Occupants":["Deelnemers"],"Invite":["Nooi uit"],"Features":["Eienskappe"],"Message archiving":["Boodskap-argivering"],"Members only":["Slegs lede"],"Open":["Oop kletskamer"],"Password protected":["Wagwoord"],"Persistent":["Blywend"],"Temporary":["Tydelike kamer"],"No password":["Geen wagwoord"],"This room is not publicly searchable":["Hierdie kletskamer is nie publiek opspoorbaar nie"],"Messages are archived on the server":["Boodskappe word op die bediener gestoor"],"This room is restricted to members only":["Hierdie kletskamer is slegs tot lede beperk"],"This room is being moderated":["Hierdie kletskamer word gemodereer"],"All other room occupants can see your XMPP username":["Alle ander deelnemers can u Jabber ID sien"],"Anyone can join this room":["Enige iemand kan hierdie kletskamer binnekom"],"This room requires a password before entry":["Hierdie kletskamer benodig 'n wagwoord"],"This room persists even if it's unoccupied":["Hierdie kletskamer bestaan voort selfs al is dit leeg"],"This room is publicly searchable":["Hierdie kletskamer is publiek opspoorbaar"],"Only moderators can see your XMPP username":["Slegs moderators kan u Jabber ID sien"],"This room will disappear once the last person leaves":["Hierdie kletskamer sal verdwyn sodra die laaste persoon dit verlaat"],"This room is not being moderated":["Hierdie kletskamer word nie gemodereer nie"],"This room does not require a password upon entry":["Hiedie kletskamer benodig nie 'n wagwoord nie"],"Please enter a valid XMPP username":["Verskaf asseblief 'n geldige XMPP adres"],"Re-establishing encrypted session":["Herstel versleutelde sessie"],"Generating private key.":["Genereer private sleutel."],"Your browser might become unresponsive.":["U webblaaier mag tydelik onreageerbaar word."],"Authentication request from %1$s\n\nYour chat contact is attempting to verify your identity, by asking you the question below.\n\n%2$s":["Identiteitbevestigingsversoek van %1$s\n\nU gespreksmaat probeer om u identiteit te bevestig, deur die volgende vraag te vra \n\n%2$s"],"Could not verify this user's identify.":["Kon nie hierdie gebruiker se identitied bevestig nie."],"Exchanging private key with contact.":["Sleutels word met gespreksmaat uitgeruil."],"Your messages are not encrypted anymore":["U boodskappe is nie meer versleutel nie"],"Your messages are now encrypted but your contact's identity has not been verified.":["U boodskappe is nou versleutel maar u gespreksmaat se identiteit is nog onseker."],"Your contact's identify has been verified.":["U gespreksmaat se identiteit is bevestig."],"Your contact has ended encryption on their end, you should do the same.":["U gespreksmaat het versleuteling gestaak, u behoort nou dieselfde te doen."],"Your message could not be sent":["U boodskap kon nie gestuur word nie"],"We received an unencrypted message":["Ons het 'n onversleutelde boodskap ontvang"],"We received an unreadable encrypted message":["Ons het 'n onleesbare versleutelde boodskap ontvang"],"Here are the fingerprints, please confirm them with %1$s, outside of this chat.\n\nFingerprint for you, %2$s: %3$s\n\nFingerprint for %1$s: %4$s\n\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.":["Hier is die vingerafdrukke, bevestig hulle met %1$s, buite hierdie kletskanaal \n\nU vingerafdruk, %2$s: %3$s\n\nVingerafdruk vir %1$s: %4$s\n\nIndien u die vingerafdrukke bevestig het, klik OK, andersinds klik Kanselleer."],"You will be prompted to provide a security question and then an answer to that question.\n\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.":["Daar sal van u verwag word om 'n sekuriteitsvraag te stel, en dan ook die antwoord tot daardie vraag te verskaf.\n\nU gespreksmaat sal dan daardie vraag gestel word, en indien hulle presies dieselfde antwoord (lw. hoofletters tel) verskaf, sal hul identiteit bevestig wees."],"What is your security question?":["Wat is u sekuriteitsvraag?"],"What is the answer to the security question?":["Wat is die antwoord tot die sekuriteitsvraag?"],"Invalid authentication scheme provided":["Ongeldige verifikasiemetode verskaf"],"Your messages are not encrypted. Click here to enable OTR encryption.":["U boodskappe is nie versleutel nie. Klik hier om OTR versleuteling te aktiveer."],"Your messages are encrypted, but your contact has not been verified.":["U boodskappe is versleutel, maar u gespreksmaat se identiteit is not onseker."],"Your messages are encrypted and your contact verified.":["U boodskappe is versleutel en u gespreksmaat se identiteit bevestig."],"Your contact has closed their end of the private session, you should do the same":["U gespreksmaat het die private sessie gestaak. U behoort dieselfde te doen"],"End encrypted conversation":["Beëindig versleutelde gesprek"],"Refresh encrypted conversation":["Verfris versleutelde gesprek"],"Start encrypted conversation":["Begin versleutelde gesprek"],"Verify with fingerprints":["Bevestig met vingerafdrukke"],"Verify with SMP":["Bevestig met SMP"],"What's this?":["Wat is hierdie?"],"unencrypted":["nie-privaat"],"unverified":["onbevestig"],"verified":["privaat"],"finished":["afgesluit"],"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"]," 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."],"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"],"Minimize this chat box":["Minimeer hierdie kletskas"],"Click to restore this chat":["Klik om hierdie klets te herstel"],"Minimized":["Geminimaliseer"]}}} \ No newline at end of file diff --git a/locale/af/LC_MESSAGES/converse.po b/locale/af/LC_MESSAGES/converse.po index 9682f0b4f..80236fc4c 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-02-14 16:51+0100\n" +"POT-Creation-Date: 2018-03-30 14:36+0200\n" "PO-Revision-Date: 2018-03-05 16:35+0100\n" "Last-Translator: JC Brand \n" "Language-Team: Afrikaans