Merge branch 'master' into roster_refactor

Conflicts:
	locale/en/LC_MESSAGES/converse.po
This commit is contained in:
JC Brand 2015-05-01 12:37:43 +02:00
commit 34630693b7
46 changed files with 6344 additions and 4054 deletions

1
.gitignore vendored
View File

@ -21,6 +21,7 @@ Backbone.Overview
tags
stamp-npm
stamp-bower
stamp-bundler
# Sphinx
docs/html

View File

@ -6,7 +6,8 @@ PHANTOMJS ?= ./node_modules/.bin/phantomjs
SPHINXBUILD ?= ./bin/sphinx-build
SPHINXOPTS =
PO2JSON ?= ./node_modules/.bin/po2json
SASS ?= sass
SASS ?= ./.bundle/bin/sass
BUNDLE ?= ./.bundle/bin/bundle
GRUNT ?= ./node_modules/.bin/grunt
HTTPSERVE ?= ./node_modules/.bin/http-server
@ -15,31 +16,34 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./d
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./docs/source
.PHONY: all help clean html epub changes linkcheck gettext po pot po2json merge release css minjs build
all: dev
.PHONY: all help clean html epub changes linkcheck gettext po pot po2json merge release css minjs build dev-ruby
help:
@echo "Please use \`make <target>' where <target> is one of the following"
@echo " build create minified builds containing converse.js and all its dependencies"
@echo " changes make an overview of all changed/added/deprecated items added to the documentation"
@echo " css generate CSS from the Sass files"
@echo " dev set up the development environment"
@echo " epub export the documentation to epub"
@echo " gettext make PO message catalogs of the documentation"
@echo " html make standalone HTML files of the documentation"
@echo " linkcheck check all documentation external links for integrity"
@echo " cssmin minify the CSS files"
@echo " po generate gettext PO files for each i18n language"
@echo " po2json generate JSON files from the language PO files"
@echo " pot generate a gettext POT file to be used for translations"
@echo " release make a new minified release"
@echo " serve serve this directory via a webserver on port 8000"
@echo "Please use \`make <target>' where <target> is one of the following:"
@echo ""
@echo " all A synonym for 'make dev'."
@echo " build Create minified builds of converse.js and all its dependencies."
@echo " changes Make an overview of all changed/added/deprecated items added to the documentation."
@echo " css Generate CSS from the Sass files."
@echo " cssmin Minify the CSS files."
@echo " dev Set up the development environment. To force a fresh start, run 'make clean' first."
@echo " epub Export the documentation to epub."
@echo " gettext Make PO message catalogs of the documentation."
@echo " html Make standalone HTML files of the documentation."
@echo " linkcheck Check all documentation external links for integrity."
@echo " po Generate gettext PO files for each i18n language."
@echo " po2json Generate JSON files from the language PO files."
@echo " pot Generate a gettext POT file to be used for translations."
@echo " release Make a new minified release."
@echo " serve Serve this directory via a webserver on port 8000."
@echo " watch Tells Sass to watch the .scss files for changes and then automatically update the CSS files."
all: dev
########################################################################
## Miscellaneous
serve: dev
serve: stamp-npm
$(HTTPSERVE) -p 8000
########################################################################
@ -84,28 +88,34 @@ stamp-bower: stamp-npm bower.json
$(BOWER) install
touch stamp-bower
clean::
rm -f stamp-npm stamp-bower
rm -rf node_modules components
stamp-bundler:
mkdir -p .bundle
gem install --user bundler --bindir .bundle/bin
$(BUNDLE) install --path .bundle --binstubs .bundle/bin
touch stamp-bundler
dev: clean
npm install
$(BOWER) update;
bundle install --path=~/
clean::
rm -f stamp-npm stamp-bower stamp-bundler
rm -rf node_modules components .bundle
dev: stamp-bower stamp-bundler
########################################################################
## Builds
css::
$(SASS) sass/converse.scss > css/converse.css
css:: dev-ruby
$(SASS) -I .bundle/bin sass/converse.scss css/converse.css
watch:: dev-ruby
$(SASS) --watch -I .bundle/bin sass/converse.scss:css/converse.css
jsmin:
./node_modules/requirejs/bin/r.js -o src/build.js && ./node_modules/requirejs/bin/r.js -o src/build-no-locales-no-otr.js && ./node_modules/requirejs/bin/r.js -o src/build-no-otr.js && ./node_modules/requirejs/bin/r.js -o src/build-website.js
cssmin:
cssmin: stamp-npm
$(GRUNT) cssmin
build::
build:: stamp-npm
$(GRUNT) jst
$(GRUNT) minify

View File

@ -33,7 +33,7 @@ It has the following features:
* Messages appear in all connnected chat clients `XEP 280 <http://xmpp.org/extensions/xep-0280.html>`_
* Typing and chat state notifications `XEP 85 <http://xmpp.org/extensions/xep-0085.html>`_
* Third person messages (/me )
* Translated into 15 languages
* Translated into 16 languages
* Off-the-record encryption
-----------

View File

@ -1,7 +1,7 @@
{
"name": "converse.js",
"description": "Web-based XMPP/Jabber chat client written in javascript",
"version": "0.9.2",
"version": "0.9.3",
"license": "MPL",
"devDependencies": {
"jasmine": "https://github.com/jcbrand/jasmine.git#1_3_x",

View File

@ -10784,7 +10784,7 @@ define('jquery-private',['jquery'], function (jq) {
java, location, Components, FileUtils */
define('text',['module'], function (module) {
'use strict';
var text, fs, Cc, Ci, xpcIsWindows,
progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],
@ -11165,7 +11165,7 @@ define('text',['module'], function (module) {
return text;
});
// Underscore.js 1.8.2
// Underscore.js 1.8.3
// http://underscorejs.org
// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Underscore may be freely distributed under the MIT license.
@ -11222,7 +11222,7 @@ define('text',['module'], function (module) {
}
// Current version.
_.VERSION = '1.8.2';
_.VERSION = '1.8.3';
// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
@ -11289,12 +11289,20 @@ define('text',['module'], function (module) {
return result;
};
var property = function(key) {
return function(obj) {
return obj == null ? void 0 : obj[key];
};
};
// Helper for collection methods to determine whether a collection
// should be iterated as an array or as an object
// Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
var getLength = property('length');
var isArrayLike = function(collection) {
var length = collection && collection.length;
var length = getLength(collection);
return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
};
@ -11419,11 +11427,12 @@ define('text',['module'], function (module) {
return false;
};
// Determine if the array or object contains a given value (using `===`).
// Determine if the array or object contains a given item (using `===`).
// Aliased as `includes` and `include`.
_.contains = _.includes = _.include = function(obj, target, fromIndex) {
_.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
if (!isArrayLike(obj)) obj = _.values(obj);
return _.indexOf(obj, target, typeof fromIndex == 'number' && fromIndex) >= 0;
if (typeof fromIndex != 'number' || guard) fromIndex = 0;
return _.indexOf(obj, item, fromIndex) >= 0;
};
// Invoke a method (with arguments) on every item in a collection.
@ -11647,7 +11656,7 @@ define('text',['module'], function (module) {
// Internal implementation of a recursive `flatten` function.
var flatten = function(input, shallow, strict, startIndex) {
var output = [], idx = 0;
for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
var value = input[i];
if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
//flatten current level of array or arguments object
@ -11678,7 +11687,6 @@ define('text',['module'], function (module) {
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted, iteratee, context) {
if (array == null) return [];
if (!_.isBoolean(isSorted)) {
context = iteratee;
iteratee = isSorted;
@ -11687,7 +11695,7 @@ define('text',['module'], function (module) {
if (iteratee != null) iteratee = cb(iteratee, context);
var result = [];
var seen = [];
for (var i = 0, length = array.length; i < length; i++) {
for (var i = 0, length = getLength(array); i < length; i++) {
var value = array[i],
computed = iteratee ? iteratee(value, i, array) : value;
if (isSorted) {
@ -11714,10 +11722,9 @@ define('text',['module'], function (module) {
// Produce an array that contains every item shared between all the
// passed-in arrays.
_.intersection = function(array) {
if (array == null) return [];
var result = [];
var argsLength = arguments.length;
for (var i = 0, length = array.length; i < length; i++) {
for (var i = 0, length = getLength(array); i < length; i++) {
var item = array[i];
if (_.contains(result, item)) continue;
for (var j = 1; j < argsLength; j++) {
@ -11746,7 +11753,7 @@ define('text',['module'], function (module) {
// Complement of _.zip. Unzip accepts an array of arrays and groups
// each array's elements on shared indices
_.unzip = function(array) {
var length = array && _.max(array, 'length').length || 0;
var length = array && _.max(array, getLength).length || 0;
var result = Array(length);
for (var index = 0; index < length; index++) {
@ -11760,7 +11767,7 @@ define('text',['module'], function (module) {
// the corresponding values.
_.object = function(list, values) {
var result = {};
for (var i = 0, length = list && list.length; i < length; i++) {
for (var i = 0, length = getLength(list); i < length; i++) {
if (values) {
result[list[i]] = values[i];
} else {
@ -11770,42 +11777,11 @@ define('text',['module'], function (module) {
return result;
};
// Return the position of the first occurrence of an item in an array,
// or -1 if the item is not included in the array.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
var i = 0, length = array && array.length;
if (typeof isSorted == 'number') {
i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
} else if (isSorted && length) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
if (item !== item) {
return _.findIndex(slice.call(array, i), _.isNaN);
}
for (; i < length; i++) if (array[i] === item) return i;
return -1;
};
_.lastIndexOf = function(array, item, from) {
var idx = array ? array.length : 0;
if (typeof from == 'number') {
idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
}
if (item !== item) {
return _.findLastIndex(slice.call(array, 0, idx), _.isNaN);
}
while (--idx >= 0) if (array[idx] === item) return idx;
return -1;
};
// Generator function to create the findIndex and findLastIndex functions
function createIndexFinder(dir) {
function createPredicateIndexFinder(dir) {
return function(array, predicate, context) {
predicate = cb(predicate, context);
var length = array != null && array.length;
var length = getLength(array);
var index = dir > 0 ? 0 : length - 1;
for (; index >= 0 && index < length; index += dir) {
if (predicate(array[index], index, array)) return index;
@ -11815,16 +11791,15 @@ define('text',['module'], function (module) {
}
// Returns the first index on an array-like that passes a predicate test
_.findIndex = createIndexFinder(1);
_.findLastIndex = createIndexFinder(-1);
_.findIndex = createPredicateIndexFinder(1);
_.findLastIndex = createPredicateIndexFinder(-1);
// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iteratee, context) {
iteratee = cb(iteratee, context, 1);
var value = iteratee(obj);
var low = 0, high = array.length;
var low = 0, high = getLength(array);
while (low < high) {
var mid = Math.floor((low + high) / 2);
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
@ -11832,11 +11807,43 @@ define('text',['module'], function (module) {
return low;
};
// Generator function to create the indexOf and lastIndexOf functions
function createIndexFinder(dir, predicateFind, sortedIndex) {
return function(array, item, idx) {
var i = 0, length = getLength(array);
if (typeof idx == 'number') {
if (dir > 0) {
i = idx >= 0 ? idx : Math.max(idx + length, i);
} else {
length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
}
} else if (sortedIndex && idx && length) {
idx = sortedIndex(array, item);
return array[idx] === item ? idx : -1;
}
if (item !== item) {
idx = predicateFind(slice.call(array, i, length), _.isNaN);
return idx >= 0 ? idx + i : -1;
}
for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
if (array[idx] === item) return idx;
}
return -1;
};
}
// Return the position of the first occurrence of an item in an array,
// or -1 if the item is not included in the array.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
_.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
if (stop == null) {
stop = start || 0;
start = 0;
}
@ -12215,6 +12222,15 @@ define('text',['module'], function (module) {
// Fill in a given object with default properties.
_.defaults = createAssigner(_.allKeys, true);
// Creates an object that inherits from the given prototype object.
// If additional properties are provided then they will be added to the
// created object.
_.create = function(prototype, props) {
var result = baseCreate(prototype);
if (props) _.extendOwn(result, props);
return result;
};
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
@ -12443,11 +12459,7 @@ define('text',['module'], function (module) {
_.noop = function(){};
_.property = function(key) {
return function(obj) {
return obj == null ? void 0 : obj[key];
};
};
_.property = property;
// Generates a function for a given object that returns a given property.
_.propertyOf = function(obj) {
@ -12736,7 +12748,7 @@ define('text',['module'], function (module) {
/*global define: false */
define('tpl',['text', 'underscore'], function (text, _) {
'use strict';
var buildMap = {},
buildTemplateSource = "define('{pluginName}!{moduleName}', function () { return {source}; });\n";
@ -13186,7 +13198,9 @@ __p+='\n ';
if (required) {
__p+=' class="required" ';
}
__p+=' />\n <span>'+
__p+=' />\n <span title="'+
((__t=(domain))==null?'':__t)+
'">'+
((__t=(domain))==null?'':__t)+
'</span>\n</div>\n';
}
@ -13223,13 +13237,35 @@ return __p;
define('tpl!login_panel', [],function () { return function(obj){
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
with(obj||{}){
__p+='<form id="converse-login" method="post">\n <label>'+
__p+='<form id="converse-login" method="post">\n ';
if (auto_login) {
__p+='\n <span class="spinner login-submit"/>\n ';
}
__p+='\n ';
if (!auto_login) {
__p+='\n ';
if (authentication == LOGIN) {
__p+='\n <label>'+
((__t=(label_username))==null?'':__t)+
'</label>\n <input type="email" name="jid" placeholder="user@server">\n <label>'+
'</label>\n <input name="jid" placeholder="user@server">\n <label>'+
((__t=(label_password))==null?'':__t)+
'</label>\n <input type="password" name="password" placeholder="password">\n <input class="submit" type="submit" value="'+
((__t=(label_login))==null?'':__t)+
'">\n <span class="conn-feedback"></span>\n</form>\n';
'">\n <span class="conn-feedback"></span>\n ';
}
__p+='\n ';
if (authentication == ANONYMOUS) {
__p+='\n <input type="submit" class="submit login-anon" value="'+
((__t=(label_anon_login))==null?'':__t)+
'"/>\n ';
}
__p+='\n ';
if (authentication == PREBIND) {
__p+='\n <p>Disconnected.</p>\n ';
}
__p+='\n ';
}
__p+='\n</form>\n';
}
return __p;
}; });
@ -14922,7 +14958,7 @@ return parser;
root.utils = factory(jQuery, templates);
}
}(this, function ($, templates, locales) {
"use strict";
var XFORM_TYPE_MAP = {
'text-private': 'password',
@ -25591,7 +25627,7 @@ return Backbone.BrowserStorage;
factory(_, Backbone);
}
}(this, function (_, Backbone) {
"use strict";
var Overview = Backbone.Overview = function (options) {
/* An Overview is a View that contains and keeps track of sub-views.
* Kind of like what a Collection is to a Model.
@ -25649,7 +25685,7 @@ return Backbone.BrowserStorage;
factory(jQuery, root);
}
}(this, function(jQuery, window) {
"use strict";
var matched, browser;
@ -25812,7 +25848,7 @@ return Backbone.BrowserStorage;
}
}(this, function($, window) {
var _ = function() {
"use strict";
return {
isMsie: function() {
return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
@ -25942,7 +25978,7 @@ return Backbone.BrowserStorage;
};
}();
var css = function() {
"use strict";
var css = {
wrapper: {
position: "relative",
@ -26004,7 +26040,7 @@ return Backbone.BrowserStorage;
return css;
}();
var EventBus = function() {
"use strict";
var namespace = "typeahead:";
function EventBus(o) {
if (!o || !o.el) {
@ -26021,7 +26057,7 @@ return Backbone.BrowserStorage;
return EventBus;
}();
var EventEmitter = function() {
"use strict";
var splitter = /\s+/, nextTick = getNextTick();
return {
onSync: onSync,
@ -26111,7 +26147,7 @@ return Backbone.BrowserStorage;
}
}();
var highlight = function(doc) {
"use strict";
var defaults = {
node: null,
pattern: null,
@ -26163,7 +26199,7 @@ return Backbone.BrowserStorage;
}
}(window.document);
var Input = function() {
"use strict";
var specialKeyCodeMap;
specialKeyCodeMap = {
9: "tab",
@ -26358,7 +26394,7 @@ return Backbone.BrowserStorage;
}
}();
var Dataset = function() {
"use strict";
var datasetKey = "ttDataset", valueKey = "ttValue", datumKey = "ttDatum";
function Dataset(o) {
o = o || {};
@ -26492,7 +26528,7 @@ return Backbone.BrowserStorage;
}
}();
var Dropdown = function() {
"use strict";
function Dropdown(o) {
var that = this, onSuggestionClick, onSuggestionMouseEnter, onSuggestionMouseLeave;
o = o || {};
@ -26652,7 +26688,7 @@ return Backbone.BrowserStorage;
}
}();
var Typeahead = function() {
"use strict";
var attrsKey = "ttAttrs";
function Typeahead(o) {
var $menu, $input, $hint;
@ -26899,7 +26935,7 @@ return Backbone.BrowserStorage;
}
}();
(function() {
"use strict";
var old, typeaheadKey, methods;
old = $.fn.typeahead;
typeaheadKey = "ttTypeahead";
@ -27061,7 +27097,7 @@ define("converse-dependencies", [
);
}
}(this, function (templates, $, $iq, $msg, $pres, $build, DSA, OTR, Strophe, _, moment, utils, b64_sha1) {
//
// "use strict";
// Cannot use this due to Safari bug.
// See https://github.com/jcbrand/converse.js/issues/196
if (typeof console === "undefined" || typeof console.log === "undefined") {
@ -27182,6 +27218,7 @@ define("converse-dependencies", [
Strophe.addNamespace('MUC_ROOMCONF', Strophe.NS.MUC + "#roomconfig");
Strophe.addNamespace('MUC_USER', Strophe.NS.MUC + "#user");
Strophe.addNamespace('REGISTER', 'jabber:iq:register');
Strophe.addNamespace('ROSTERX', 'http://jabber.org/protocol/rosterx');
Strophe.addNamespace('XFORM', 'jabber:x:data');
// Add Strophe Statuses
@ -27196,6 +27233,10 @@ define("converse-dependencies", [
// Constants
// ---------
var LOGIN = "login";
var ANONYMOUS = "anonymous";
var PREBIND = "prebind";
var UNENCRYPTED = 0;
var UNVERIFIED= 1;
var VERIFIED= 2;
@ -27254,6 +27295,7 @@ define("converse-dependencies", [
allow_registration: true,
animate: true,
auto_list_rooms: false,
auto_login: false, // Currently only used in connection with anonymous login
auto_reconnect: false,
auto_subscribe: false,
bosh_service_url: undefined, // The BOSH connection manager URL.
@ -27270,7 +27312,10 @@ define("converse-dependencies", [
message_carbons: false,
no_trimming: false, // Set to true for phantomjs tests (where browser apparently has no width)
play_sounds: false,
prebind: false,
sounds_path: '/sounds/',
password: undefined,
authentication: 'login', // Available values are "login", "prebind", "anonymous".
prebind: false, // XXX: Deprecated, use "authentication" instead.
prebind_url: null,
providers_link: 'https://xmpp.net/directory.php', // Link to XMPP providers shown on registration page
rid: undefined,
@ -27298,6 +27343,16 @@ define("converse-dependencies", [
// Allow only whitelisted configuration attributes to be overwritten
_.extend(this, _.pick(settings, Object.keys(this.default_settings)));
// BBB
if (this.prebind === true) { this.authentication = PREBIND; }
if (this.authentication === ANONYMOUS) {
if (!this.jid) {
throw("Config Error: you need to provide the server's domain via the " +
"'jid' option when using anonymous authentication.");
}
}
if (settings.visible_toolbar_buttons) {
_.extend(
this.visible_toolbar_buttons,
@ -27363,11 +27418,11 @@ define("converse-dependencies", [
this.playNotification = function () {
var audio;
if (converse.play_sounds && typeof Audio !== "undefined"){
audio = new Audio("sounds/msg_received.ogg");
audio = new Audio(converse.sounds_path+"msg_received.ogg");
if (audio.canPlayType('/audio/ogg')) {
audio.play();
} else {
audio = new Audio("/sounds/msg_received.mp3");
audio = new Audio(converse.sounds_path+"msg_received.mp3");
audio.play();
}
}
@ -27445,7 +27500,7 @@ define("converse-dependencies", [
this.reconnect = function () {
converse.giveFeedback(__('Reconnecting'), 'error');
if (!converse.prebind) {
if (converse.authentication !== "prebind") {
this.connection.connect(
this.connection.jid,
this.connection.pass,
@ -27704,7 +27759,7 @@ define("converse-dependencies", [
this.OTR = Backbone.Model.extend({
// A model for managing OTR settings.
getSessionPassphrase: function () {
if (converse.prebind) {
if (converse.authentication === 'prebind') {
var key = b64_sha1(converse.connection.jid),
pass = window.sessionStorage[key];
if (typeof pass === 'undefined') {
@ -28504,6 +28559,7 @@ define("converse-dependencies", [
},
updateVCard: function () {
if (!this.use_vcards) { return; }
var jid = this.model.get('jid'),
contact = converse.roster.get(jid);
if ((contact) && (!contact.get('vcard_updated'))) {
@ -28712,7 +28768,7 @@ define("converse-dependencies", [
$('<li class="found-user"></li>')
.append(
$('<a class="subscribe-to-user" href="#" title="'+__('Click to add as a chat contact')+'"></a>')
.attr('data-recipient', Strophe.escapeNode(obj.id)+'@'+converse.domain)
.attr('data-recipient', Strophe.getNodeFromJid(obj.id)+"@"+Strophe.getDomainFromJid(obj.id))
.text(obj.fullname)
)
);
@ -28744,8 +28800,7 @@ define("converse-dependencies", [
},
addContact: function (jid, name) {
name = _.isEmpty(name)? jid: name;
converse.connection.roster.add(jid, name, [], function (iq) {
converse.connection.roster.add(jid, _.isEmpty(name)? jid: name, [], function (iq) {
converse.connection.roster.subscribe(jid, null, converse.xmppstatus.get('fullname'));
});
}
@ -29014,7 +29069,7 @@ define("converse-dependencies", [
converse.features.on('add', this.featureAdded, this);
// Features could have been added before the controlbox was
// initialized. Currently we're only interested in MUC
var feature = converse.features.findWhere({'var': 'http://jabber.org/protocol/muc'});
var feature = converse.features.findWhere({'var': Strophe.NS.MUC});
if (feature) {
this.featureAdded(feature);
}
@ -29143,7 +29198,7 @@ define("converse-dependencies", [
},
featureAdded: function (feature) {
if ((feature.get('var') == 'http://jabber.org/protocol/muc') && (converse.allow_muc)) {
if ((feature.get('var') == Strophe.NS.MUC) && (converse.allow_muc)) {
this.roomspanel.model.save({muc_domain: feature.get('from')});
var $server= this.$el.find('input.new-chatroom-server');
if (! $server.is(':focus')) {
@ -30092,7 +30147,13 @@ define("converse-dependencies", [
var contact_jid, $forwarded, $received, $sent,
msgid = $message.attr('id'),
chatbox, resource, roster_item,
message_from = $message.attr('from');
message_from = $message.attr('from'),
message_to = $message.attr('to');
if(!_.contains([converse.connection.jid, converse.bare_jid], message_to)) {
// Ignore messages sent to a different resource
return true;
}
if (message_from === converse.connection.jid) {
// FIXME: Forwarded messages should be sent to specific resources,
// not broadcasted
@ -30153,13 +30214,6 @@ define("converse-dependencies", [
});
}
if (msgid && chatbox.messages.findWhere({msgid: msgid})) {
// FIXME: There's still a bug here..
// If a duplicate message is received just after the chat
// box was closed, then it'll open again (due to it being
// created here above), with no new messages.
// The solution is mostly likely to not let chat boxes show
// automatically when they are created, but to require
// "show" to be called explicitly.
return true; // We already have this message stored.
}
if (!this.isOnlyChatStateNotification($message) && from !== converse.bare_jid) {
@ -30975,7 +31029,7 @@ define("converse-dependencies", [
if (contact.showInRoster()) {
if (this.model.get('state') === CLOSED) {
if (view.$el[0].style.display !== "none") { view.$el.hide(); }
if (this.$el[0].style.display === "none") { this.$el.show(); }
if (!this.$el.is(':visible')) { this.$el.show(); }
} else {
if (this.$el[0].style.display !== "block") { this.show(); }
}
@ -31000,10 +31054,12 @@ define("converse-dependencies", [
},
show: function () {
// FIXME: There's a bug here, if show_only_online_users is true
// Possible solution, get the group, call _.each and check
// showInRoster
this.$el.nextUntil('dt').addBack().show();
this.$el.show();
_.each(this.getAll(), function (contactView) {
if (contactView.model.showInRoster()) {
contactView.$el.show();
}
});
},
hide: function () {
@ -31321,7 +31377,8 @@ define("converse-dependencies", [
t += $(msg).find('item').length*250;
return true;
},
'http://jabber.org/protocol/rosterx', 'message', null);
Strophe.NS.ROSTERX, 'message', null
);
},
registerPresenceHandler: function () {
@ -31716,7 +31773,7 @@ define("converse-dependencies", [
* feature-providing Models, not here
*/
converse.connection.disco.addFeature(Strophe.NS.CHATSTATES);
converse.connection.disco.addFeature('http://jabber.org/protocol/rosterx'); // Limited support
converse.connection.disco.addFeature(Strophe.NS.ROSTERX); // Limited support
converse.connection.disco.addFeature('jabber:x:conference');
converse.connection.disco.addFeature('urn:xmpp:carbons:2');
converse.connection.disco.addFeature(Strophe.NS.VCARD);
@ -31959,7 +32016,7 @@ define("converse-dependencies", [
*/
var $form= this.$('form'),
$stanza = $(stanza),
$fields;
$fields, $input;
$form.empty().append(converse.templates.registration_form({
'domain': this.domain,
'title': this.title,
@ -31967,17 +32024,28 @@ define("converse-dependencies", [
}));
if (this.form_type == 'xform') {
$fields = $stanza.find('field');
_.each($fields, $.proxy(function (field) {
_.each($fields, function (field) {
$form.append(utils.xForm2webForm.bind(this, $(field), $stanza));
}, this));
}.bind(this));
} else {
// Show fields
_.each(Object.keys(this.fields), $.proxy(function (key) {
if (key == "username") {
$input = templates.form_username({
domain: ' @'+this.domain,
name: key,
type: "text",
label: key,
value: '',
required: 1
});
} else {
$form.append('<label>'+key+'</label>');
var $input = $('<input placeholder="'+key+'" name="'+key+'"></input>');
$input = $('<input placeholder="'+key+'" name="'+key+'"></input>');
if (key === 'password' || key === 'email') {
$input.attr('type', key);
}
}
$form.append($input);
}, this));
// Show urls
@ -32052,13 +32120,19 @@ define("converse-dependencies", [
return;
}
var $inputs = $(ev.target).find(':input:not([type=button]):not([type=submit])'),
iq = $iq({type: "set"})
.c("query", {xmlns:Strophe.NS.REGISTER})
.c("x", {xmlns: Strophe.NS.XFORM, type: 'submit'});
iq = $iq({type: "set"}).c("query", {xmlns:Strophe.NS.REGISTER});
if (this.form_type == 'xform') {
iq.c("x", {xmlns: Strophe.NS.XFORM, type: 'submit'});
$inputs.each(function () {
iq.cnode(utils.webForm2xForm(this)).up();
});
} else {
$inputs.each(function () {
var $input = $(this);
iq.c($input.attr('name'), {}, $input.val());
});
}
converse.connection._addSysHandler(this._onRegisterIQ.bind(this), null, "iq", null, null);
converse.connection.send(iq);
this.setFields(iq.tree());
@ -32168,8 +32242,14 @@ define("converse-dependencies", [
initialize: function (cfg) {
cfg.$parent.html(this.$el.html(
converse.templates.login_panel({
'LOGIN': LOGIN,
'ANONYMOUS': ANONYMOUS,
'PREBIND': PREBIND,
'auto_login': converse.auto_login,
'authentication': converse.authentication,
'label_username': __('XMPP Username:'),
'label_password': __('Password:'),
'label_anon_login': __('Click here to log in anonymously'),
'label_login': __('Log In')
})
));
@ -32187,8 +32267,12 @@ define("converse-dependencies", [
authenticate: function (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); }
var $form = $(ev.target),
$jid_input = $form.find('input[name=jid]'),
var $form = $(ev.target);
if (converse.authentication === ANONYMOUS) {
this.connect($form, converse.jid, null);
return;
}
var $jid_input = $form.find('input[name=jid]'),
jid = $jid_input.val(),
$pw_input = $form.find('input[name=password]'),
password = $pw_input.val(),
@ -32217,13 +32301,16 @@ define("converse-dependencies", [
},
connect: function ($form, jid, password) {
var resource;
if ($form) {
$form.find('input[type=submit]').hide().after('<span class="spinner login-submit"/>');
}
var resource = Strophe.getResourceFromJid(jid);
if (jid) {
resource = Strophe.getResourceFromJid(jid);
if (!resource) {
jid += '/converse.js-' + Math.floor(Math.random()*139749825).toString();
}
}
converse.connection.connect(jid, password, converse.onConnect);
},
@ -32355,7 +32442,7 @@ define("converse-dependencies", [
rid = this.session.get('rid');
sid = this.session.get('sid');
jid = this.session.get('jid');
if (this.prebind) {
if (this.authentication === "prebind") {
if (!this.jid) {
throw new Error("initConnection: when using 'keepalive' with 'prebind, you must supply the JID of the current user.");
}
@ -32373,11 +32460,23 @@ define("converse-dependencies", [
if (rid && sid && jid) {
this.session.save({rid: rid}); // The RID needs to be increased with each request.
this.connection.attach(jid, sid, rid, this.onConnect);
} else if (this.auto_login) {
if (!this.jid) {
throw new Error("initConnection: If you use auto_login, you also need to provide a jid value");
}
if (this.authentication === ANONYMOUS) {
this.connection.connect(this.jid, null, this.onConnect);
} else if (this.authentication === LOGIN) {
if (!this.password) {
throw new Error("initConnection: If you use auto_login and "+
"authentication='login' then you also need to provide a password.");
}
this.connection.connect(this.jid, this.password, this.onConnect);
}
}
// Prebind without keepalive
} else if (this.prebind) {
}
} else if (this.authentication == "prebind") {
// prebind is used without keepalive
if (this.jid && this.sid && this.rid) {
this.connection.attach(this.jid, this.sid, this.rid, this.onConnect);
} else {
@ -32531,7 +32630,6 @@ define("converse-dependencies", [
converse.connection.roster.add(jid, _.isEmpty(name)? jid: name, [], function (iq) {
converse.connection.roster.subscribe(jid, null, converse.xmppstatus.get('fullname'));
});
return true;
}
},
'chats': {
@ -32751,6 +32849,7 @@ require.config({
"pl": "locale/pl/LC_MESSAGES/converse.json",
"pt_BR": "locale/pt_BR/LC_MESSAGES/converse.json",
"ru": "locale/ru/LC_MESSAGES/converse.json",
"uk": "locale/uk/LC_MESSAGES/converse.json",
"zh": "locale/zh/LC_MESSAGES/converse.json",
// Templates

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -441,7 +441,9 @@ __p += '\n ';
if (required) { ;
__p += ' class="required" ';
} ;
__p += ' />\n <span>' +
__p += ' />\n <span title="' +
((__t = (domain)) == null ? '' : __t) +
'">' +
((__t = (domain)) == null ? '' : __t) +
'</span>\n</div>\n';
@ -479,15 +481,38 @@ return __p
this["templates"]["login_panel"] = function(obj) {
obj || (obj = {});
var __t, __p = '', __e = _.escape;
var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
function print() { __p += __j.call(arguments, '') }
with (obj) {
__p += '<form id="converse-login" method="post">\n <label>' +
__p += '<form id="converse-login" method="post">\n ';
if (auto_login) { ;
__p += '\n <span class="spinner login-submit"/>\n ';
} ;
__p += '\n ';
if (!auto_login) { ;
__p += '\n ';
if (authentication == LOGIN) { ;
__p += '\n <label>' +
((__t = (label_username)) == null ? '' : __t) +
'</label>\n <input type="email" name="jid" placeholder="user@server">\n <label>' +
'</label>\n <input name="jid" placeholder="user@server">\n <label>' +
((__t = (label_password)) == null ? '' : __t) +
'</label>\n <input type="password" name="password" placeholder="password">\n <input class="submit" type="submit" value="' +
((__t = (label_login)) == null ? '' : __t) +
'">\n <span class="conn-feedback"></span>\n</form>\n';
'">\n <span class="conn-feedback"></span>\n ';
} ;
__p += '\n ';
if (authentication == ANONYMOUS) { ;
__p += '\n <input type="submit" class="submit login-anon" value="' +
((__t = (label_anon_login)) == null ? '' : __t) +
'"/>\n ';
} ;
__p += '\n ';
if (authentication == PREBIND) { ;
__p += '\n <p>Disconnected.</p>\n ';
} ;
__p += '\n ';
} ;
__p += '\n</form>\n';
}
return __p

View File

@ -1260,3 +1260,5 @@
margin-left: 0;
cursor: n-resize;
z-index: 20; }
/*# sourceMappingURL=converse.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,12 +1,13 @@
Changelog
=========
0.9.3 (Undefined)
-----------------
0.9.3 (2015-05-01)
------------------
* Add the ability to log in anonymously. [jcbrand]
* Add the ability to log in automatically. [jcbrand]
* Remove ``type=email`` from JID field in login form. Resulting validation error confuses people. [jcbrand]
* Add Ukranian translations [Andriy Kopystyansky]
* #344 Enable the path to the sound files to be configured [thierrytiti and jcbrand]
* #370 Unable to register a new user to ejabberd 2.1.11. [gbonvehi]
* #372 Some offline users have a visible empty <dd> in the roster. [floriancargoet]

View File

@ -48,9 +48,9 @@ copyright = u'2014, JC Brand'
# built documents.
#
# The short X.Y version.
version = '0.9.2'
version = '0.9.3'
# The full version, including alpha/beta/rc tags.
release = '0.9.2'
release = '0.9.3'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View File

@ -34,6 +34,9 @@ Also make sure you have ``Git`` installed. `Details <http://git-scm.com/book/en/
.. note::
Windows users should use Chocolatey as recommended above.:
.. note::
Debian & Ubuntu users : apt-get install git npm nodejs-legacy
Once you have *Node.js* and *git* installed, run the following command inside the Converse.js
directory:

View File

@ -151,7 +151,7 @@
<li>Custom status messages</li>
<li>Typing notifications</li>
<li>Third person messages (/me )</li>
<li>Translated into 15 languages</li>
<li>Translated into 16 languages</li>
<li>Off-the-record encryption
</ul>
</div>

View File

@ -8,7 +8,7 @@
},
" e.g. conversejs.org": [
null,
""
"bv. conversejs.org"
],
"unencrypted": [
null,
@ -16,7 +16,7 @@
],
"unverified": [
null,
"ongeverifieer"
"onbevestig"
],
"verified": [
null,
@ -50,6 +50,10 @@
null,
"Hierdie persoon is afwesig"
],
"Click to hide these contacts": [
null,
"Kliek om hierdie kontakte te verskuil"
],
"My contacts": [
null,
"My kontakte"
@ -108,11 +112,11 @@
],
"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": [
null,
"Verifieeringsversoek van %1$s\n\nU gespreksmaat probeer om u identiteit te verifieer, deur die volgende vraag te vra \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.": [
null,
"Kon nie hierdie gebruiker se identitied verifieer nie."
"Kon nie hierdie gebruiker se identitied bevestig nie."
],
"Exchanging private key with contact.": [
null,
@ -138,6 +142,10 @@
null,
"het opgehou tik"
],
"has gone away": [
null,
"het weggegaan"
],
"Show this menu": [
null,
"Vertoon hierdie keuselys"
@ -172,7 +180,7 @@
],
"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.": [
null,
"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 geverifieer wees."
"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?": [
null,
@ -186,6 +194,14 @@
null,
"Ongeldige verifikasiemetode verskaf"
],
"has gone offline": [
null,
"is nou aflyn"
],
"is busy": [
null,
"is besig"
],
"Your messages are not encrypted anymore": [
null,
"U boodskappe is nie meer versleutel nie"
@ -196,7 +212,7 @@
],
"Your contact's identify has been verified.": [
null,
"U gespreksmaat se identiteit is geverifieer."
"U gespreksmaat se identiteit is bevestig."
],
"Your contact has ended encryption on their end, you should do the same.": [
null,
@ -212,7 +228,7 @@
],
"Your messages are encrypted and your contact verified.": [
null,
"U boodskappe is versleutel en u gespreksmaat se identiteit geverifieer."
"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": [
null,
@ -244,11 +260,11 @@
],
"Verify with fingerprints": [
null,
"Verifieer met vingerafdrukke"
"Bevestig met vingerafdrukke"
],
"Verify with SMP": [
null,
"Verifieer met SMP"
"Bevestig met SMP"
],
"What's this?": [
null,
@ -270,6 +286,10 @@
null,
"Afgemeld"
],
"Log out": [
null,
"Meld af"
],
"Contact name": [
null,
"Kontaknaam"
@ -314,6 +334,10 @@
null,
"Bediener"
],
"Join Room": [
null,
"Betree kamer"
],
"Show rooms": [
null,
"Wys kamers"
@ -438,6 +462,10 @@
null,
"Verban gebruiker uit hierdie kletskamer"
],
"Change user role to participant": [
null,
"Verander gebruikersrol na deelnemer"
],
"Kick user from room": [
null,
"Skop gebruiker uit hierdie kletskamer"
@ -448,7 +476,7 @@
],
"Grant membership to a user": [
null,
""
"Verleen lidmaatskap aan 'n gebruiker"
],
"Remove user's ability to post messages": [
null,
@ -460,11 +488,15 @@
],
"Grant moderator role to user": [
null,
""
"Verleen moderator rol aan gebruiker"
],
"Grant ownership of this room": [
null,
"Verleen eienaarskap van hierdie kamer"
],
"Revoke user's membership": [
null,
""
"Herroep gebruiker se lidmaatskap"
],
"Set room topic": [
null,
@ -562,6 +594,10 @@
null,
"<strong>%1$s</strong> is verban"
],
"<strong>%1$s</strong>'s nickname has changed": [
null,
"<strong>%1$s</strong> se bynaam het verander"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> is uitgeskop"
@ -638,6 +674,14 @@
null,
"Kliek om hierdie kontak te verwyder"
],
"Click to accept this contact request": [
null,
"Kliek om hierdie kontakversoek te aanvaar"
],
"Click to decline this contact request": [
null,
"Kliek om hierdie kontakversoek te weier"
],
"Click to chat with this contact": [
null,
"Kliek om met hierdie kontak te klets"
@ -742,6 +786,10 @@
null,
"Wagwoord"
],
"Click here to log in anonymously": [
null,
"Kliek hier om anoniem aan te meld"
],
"Log In": [
null,
"Meld aan"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -9,23 +9,23 @@
},
" e.g. conversejs.org": [
null,
""
"z. B. conversejs.org"
],
"unencrypted": [
null,
""
"unverschlüsselt"
],
"unverified": [
null,
""
"unbestätigt"
],
"verified": [
null,
""
"bestätigt"
],
"finished": [
null,
""
"erledigt"
],
"This contact is busy": [
null,
@ -51,6 +51,10 @@
null,
"Dieser Kontakt ist abwesend"
],
"Click to hide these contacts": [
null,
"Hier klicken um diesen Kontakte zu verstecken"
],
"My contacts": [
null,
"Meine Kontakte"
@ -391,6 +395,10 @@
null,
""
],
"Occupants": [
null,
"Teilnehmer"
],
"You are about to invite %1$s to the chat room \"%2$s\". ": [
null,
""
@ -411,10 +419,22 @@
null,
""
],
"Ban user from room": [
null,
"Verbanne einen Benutzer aus dem Raum."
],
"Change user role to participant": [
null,
""
],
"Kick user from room": [
null,
"Werfe einen Benutzer aus dem Raum."
],
"Write in 3rd person": [
null,
"In der dritten Person schreiben"
],
"Grant membership to a user": [
null,
""
@ -435,6 +455,10 @@
null,
""
],
"Set room topic": [
null,
"Chatraum Thema festlegen"
],
"Allow muted user to post messages": [
null,
""
@ -673,12 +697,16 @@
],
"Return": [
null,
""
"Zurück"
],
"The provider rejected your registration attempt. ": [
null,
""
],
"XMPP Username:": [
null,
"XMPP Benutzername"
],
"Password:": [
null,
"Passwort:"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,804 @@
{
"domain": "converse",
"locale_data": {
"converse": {
"": {
"domain": "converse",
"plural_forms": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",
"lang": "uk"
},
" e.g. conversejs.org": [
null,
" напр. conversejs.org"
],
"unencrypted": [
null,
"некриптовано"
],
"unverified": [
null,
"неперевірено"
],
"verified": [
null,
"перевірено"
],
"finished": [
null,
"завершено"
],
"This contact is busy": [
null,
"Цей контакт зайнятий"
],
"This contact is online": [
null,
"Цей контакт на зв'язку"
],
"This contact is offline": [
null,
"Цей контакт поза мережею"
],
"This contact is unavailable": [
null,
"Цей контакт недоступний"
],
"This contact is away for an extended period": [
null,
"Цей контакт відсутній тривалий час"
],
"This contact is away": [
null,
"Цей контакт відсутній"
],
"Click to hide these contacts": [
null,
"Клацніть, щоб приховати ці контакти"
],
"My contacts": [
null,
"Мої контакти"
],
"Pending contacts": [
null,
"Контакти в очікуванні"
],
"Contact requests": [
null,
"Запити контакту"
],
"Ungrouped": [
null,
"Негруповані"
],
"Contacts": [
null,
"Контакти"
],
"Groups": [
null,
"Групи"
],
"Reconnecting": [
null,
"Перепід'єднуюсь"
],
"Error": [
null,
"Помилка"
],
"Connecting": [
null,
"Під'єднуюсь"
],
"Authenticating": [
null,
"Автентикуюсь"
],
"Authentication Failed": [
null,
"Автентикація невдала"
],
"Re-establishing encrypted session": [
null,
"Перевстановлюю криптований сеанс"
],
"Generating private key.": [
null,
"Генерація приватного ключа."
],
"Your browser might become unresponsive.": [
null,
"Ваш браузер може підвиснути."
],
"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": [
null,
"Запит автентикації від %1$s\n\nВаш контакт в чаті намагається встановити Вашу особу і просить відповісти на питання нижче.\n\n%2$s"
],
"Could not verify this user's identify.": [
null,
"Не можу перевірити автентичність цього користувача."
],
"Exchanging private key with contact.": [
null,
"Обмін приватним ключем з контактом."
],
"Personal message": [
null,
"Персональна вісточка"
],
"Are you sure you want to clear the messages from this room?": [
null,
"Ви впевнені, що хочете очистити повідомлення з цієї кімнати?"
],
"me": [
null,
"я"
],
"is typing": [
null,
"друкує"
],
"has stopped typing": [
null,
"припинив друкувати"
],
"has gone away": [
null,
"пішов геть"
],
"Show this menu": [
null,
"Показати це меню"
],
"Write in the third person": [
null,
"Писати від третьої особи"
],
"Remove messages": [
null,
"Видалити повідомлення"
],
"Are you sure you want to clear the messages from this chat box?": [
null,
"Ви впевнені, що хочете очистити повідомлення з цього вікна чату?"
],
"Your message could not be sent": [
null,
"Ваше повідомлення не може бути надіслане"
],
"We received an unencrypted message": [
null,
"Ми отримали некриптоване повідомлення"
],
"We received an unreadable encrypted message": [
null,
"Ми отримали нечитабельне криптоване повідомлення"
],
"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.": [
null,
"Ось відбитки, будь-ласка, підтвердіть їх з %1$s, за межами цього чату.\n\nВідбиток для Вас, %2$s: %3$s\n\nВідбиток для %1$s: %4$s\n\nЯкщо Ви підтверджуєте відповідність відбитка, клацніть Гаразд, інакше клацніть Відміна."
],
"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.": [
null,
"Вас запитають таємне питання і відповідь на нього.\n\nПотім Вашого контакта запитають те саме питання, і якщо вони введуть ту саму відповідь (враховуючи регістр), їх особи будуть перевірені."
],
"What is your security question?": [
null,
"Яке Ваше таємне питання?"
],
"What is the answer to the security question?": [
null,
"Яка відповідь на таємне питання?"
],
"Invalid authentication scheme provided": [
null,
"Надана некоректна схема автентикації"
],
"has gone offline": [
null,
"тепер поза мережею"
],
"is busy": [
null,
"зайнятий"
],
"Your messages are not encrypted anymore": [
null,
"Ваші повідомлення більше не криптуються"
],
"Your messages are now encrypted but your contact's identity has not been verified.": [
null,
"Ваші повідомлення вже криптуються, але особа Вашого контакту не перевірена."
],
"Your contact's identify has been verified.": [
null,
"Особу Вашого контакту перевірено."
],
"Your contact has ended encryption on their end, you should do the same.": [
null,
"Ваш контакт припинив криптування зі свого боку, Вам слід зробити те саме."
],
"Your messages are not encrypted. Click here to enable OTR encryption.": [
null,
"Ваші повідомлення не криптуються. Клацніть тут, щоб увімкнути OTR-криптування."
],
"Your messages are encrypted, but your contact has not been verified.": [
null,
"Ваші повідомлення криптуються, але Ваш контакт не був перевірений."
],
"Your messages are encrypted and your contact verified.": [
null,
"Ваші повідомлення криптуються і Ваш контакт перевірено."
],
"Your contact has closed their end of the private session, you should do the same": [
null,
"Ваш контакт закрив зі свого боку приватну сесію, Вам слід зробити те ж саме"
],
"Clear all messages": [
null,
"Очистити всі повідомлення"
],
"End encrypted conversation": [
null,
"Завершити криптовану розмову"
],
"Hide the list of participants": [
null,
"Сховати список учасників"
],
"Refresh encrypted conversation": [
null,
"Оновити криптовану розмову"
],
"Start a call": [
null,
"Почати виклик"
],
"Start encrypted conversation": [
null,
"Почати криптовану розмову"
],
"Verify with fingerprints": [
null,
"Перевірити за відбитками"
],
"Verify with SMP": [
null,
"Перевірити за SMP"
],
"What's this?": [
null,
"Що це?"
],
"Online": [
null,
"На зв'язку"
],
"Busy": [
null,
"Зайнятий"
],
"Away": [
null,
"Далеко"
],
"Offline": [
null,
"Поза мережею"
],
"Log out": [
null,
"Вийти"
],
"Contact name": [
null,
"Назва контакту"
],
"Search": [
null,
"Пошук"
],
"Contact username": [
null,
"Логін контакту"
],
"Add": [
null,
"Додати"
],
"Click to add new chat contacts": [
null,
"Клацніть, щоб додати нові контакти до чату"
],
"Add a contact": [
null,
"Додати контакт"
],
"No users found": [
null,
"Жодного користувача не знайдено"
],
"Click to add as a chat contact": [
null,
"Клацніть, щоб додати як чат-контакт"
],
"Room name": [
null,
"Назва кімнати"
],
"Nickname": [
null,
"Прізвисько"
],
"Server": [
null,
"Сервер"
],
"Join Room": [
null,
"Приєднатися до кімнати"
],
"Show rooms": [
null,
"Показати кімнати"
],
"Rooms": [
null,
"Кімнати"
],
"No rooms on %1$s": [
null,
"Жодної кімнати на %1$s"
],
"Rooms on %1$s": [
null,
"Кімнати на %1$s"
],
"Click to open this room": [
null,
"Клацніть, щоб увійти в цю кімнату"
],
"Show more information on this room": [
null,
"Показати більше інформації про цю кімату"
],
"Description:": [
null,
"Опис:"
],
"Occupants:": [
null,
"Присутні:"
],
"Features:": [
null,
"Особливості:"
],
"Requires authentication": [
null,
"Вимагає автентикації"
],
"Hidden": [
null,
"Прихована"
],
"Requires an invitation": [
null,
"Вимагає запрошення"
],
"Moderated": [
null,
"Модерована"
],
"Non-anonymous": [
null,
"Не-анонімні"
],
"Open room": [
null,
"Увійти в кімнату"
],
"Permanent room": [
null,
"Постійна кімната"
],
"Public": [
null,
"Публічна"
],
"Semi-anonymous": [
null,
"Напів-анонімна"
],
"Temporary room": [
null,
"Тимчасова кімната"
],
"Unmoderated": [
null,
"Немодерована"
],
"This user is a moderator": [
null,
"Цей користувач є модератором"
],
"This user can send messages in this room": [
null,
"Цей користувач може слати повідомлення в цій кімнаті"
],
"This user can NOT send messages in this room": [
null,
"Цей користувач НЕ МОЖЕ слати повідомлення в цій кімнаті"
],
"Invite...": [
null,
"Запросіть..."
],
"Occupants": [
null,
"Учасники"
],
"You are about to invite %1$s to the chat room \"%2$s\". ": [
null,
"Ви запрошуєте %1$s до чату \"%2$s\". "
],
"You may optionally include a message, explaining the reason for the invitation.": [
null,
"Ви можете опціонально додати повідомлення, щоб пояснити причину запрошення."
],
"Message": [
null,
"Повідомлення"
],
"Error: could not execute the command": [
null,
"Помилка: Не можу виконати команду"
],
"Change user's affiliation to admin": [
null,
"Призначити користувача адміністратором"
],
"Ban user from room": [
null,
"Заблокувати і викинути з кімнати"
],
"Change user role to participant": [
null,
"Зробити користувача учасником"
],
"Kick user from room": [
null,
"Викинути з кімнати"
],
"Write in 3rd person": [
null,
"Писати в 3-й особі"
],
"Grant membership to a user": [
null,
"Надати членство користувачу"
],
"Remove user's ability to post messages": [
null,
"Забрати можливість слати повідомлення"
],
"Change your nickname": [
null,
"Змінити Ваше прізвисько"
],
"Grant moderator role to user": [
null,
"Надати права модератора"
],
"Grant ownership of this room": [
null,
"Передати у власність цю кімнату"
],
"Revoke user's membership": [
null,
"Забрати членство в користувача"
],
"Set room topic": [
null,
"Встановити тему кімнати"
],
"Allow muted user to post messages": [
null,
"Дозволити безголосому користувачу слати повідомлення"
],
"Save": [
null,
"Зберегти"
],
"Cancel": [
null,
"Відміна"
],
"An error occurred while trying to save the form.": [
null,
"Трапилася помилка при спробі зберегти форму."
],
"This chatroom requires a password": [
null,
"Ця кімната вимагає пароль"
],
"Password: ": [
null,
"Пароль:"
],
"Submit": [
null,
"Надіслати"
],
"This room is not anonymous": [
null,
"Ця кімната не є анонімною"
],
"This room now shows unavailable members": [
null,
"Ця кімната вже показує недоступних учасників"
],
"This room does not show unavailable members": [
null,
"Ця кімната не показує недоступних учасників"
],
"Non-privacy-related room configuration has changed": [
null,
"Змінено конфігурацію кімнати, не повязану з приватністю"
],
"Room logging is now enabled": [
null,
"Журналювання кімнати тепер ввімкнено"
],
"Room logging is now disabled": [
null,
"Журналювання кімнати тепер вимкнено"
],
"This room is now non-anonymous": [
null,
"Ця кімната тепер не-анонімна"
],
"This room is now semi-anonymous": [
null,
"Ця кімната тепер напів-анонімна"
],
"This room is now fully-anonymous": [
null,
"Ця кімната тепер повністю анонімна"
],
"A new room has been created": [
null,
"Створено нову кімнату"
],
"You have been banned from this room": [
null,
"Вам заблокували доступ до цієї кімнати"
],
"You have been kicked from this room": [
null,
"Вас викинули з цієї кімнати"
],
"You have been removed from this room because of an affiliation change": [
null,
"Вас видалено з кімнати у зв'язку зі змінами власності кімнати"
],
"You have been removed from this room because the room has changed to members-only and you're not a member": [
null,
"Вас видалено з цієї кімнати, оскільки вона тепер вимагає членства, а Ви ним не є її членом"
],
"You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
null,
"Вас видалено з цієї кімнати, тому що MUC (Чат-сервіс) припиняє роботу."
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> заблоковано"
],
"<strong>%1$s</strong>'s nickname has changed": [
null,
"Прізвисько <strong>%1$s</strong> змінено"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> було викинуто звідси"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> було видалено через зміни власності кімнати"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> було виделано через відсутність членства"
],
"Your nickname has been automatically changed to: <strong>%1$s</strong>": [
null,
"Ваше прізвисько було автоматично змінене на: <strong>%1$s</strong>"
],
"Your nickname has been changed to: <strong>%1$s</strong>": [
null,
"Ваше прізвисько було змінене на: <strong>%1$s</strong>"
],
"The reason given is: \"": [
null,
"Причиною вказано: \""
],
"You are not on the member list of this room": [
null,
"Ви не є у списку членів цієї кімнати"
],
"No nickname was specified": [
null,
"Не вказане прізвисько"
],
"You are not allowed to create new rooms": [
null,
"Вам не дозволено створювати нові кімнати"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Ваше прізвисько не відповідає політиці кімнати"
],
"Your nickname is already taken": [
null,
"Таке прізвисько вже зайняте"
],
"This room does not (yet) exist": [
null,
"Такої кімнати (поки) не існує"
],
"This room has reached it's maximum number of occupants": [
null,
"Ця кімната досягнула максимуму учасників"
],
"Topic set by %1$s to: %2$s": [
null,
"Тема встановлена %1$s: %2$s"
],
"%1$s has invited you to join a chat room: %2$s": [
null,
"%1$s запрошує вас приєднатись до чату: %2$s"
],
"%1$s has invited you to join a chat room: %2$s, and left the following reason: \"%3$s\"": [
null,
"%1$s запрошує Вас приєднатись до чату: %2$s, аргументує ось як: \"%3$s\""
],
"Click to restore this chat": [
null,
"Клацніть, щоб відновити цей чат"
],
"Minimized": [
null,
"Мінімізовано"
],
"Click to remove this contact": [
null,
"Клацніть, щоб видалити цей контакт"
],
"Click to accept this contact request": [
null,
"Клацніть, щоб прийняти цей запит контакту"
],
"Click to decline this contact request": [
null,
"Клацніть, щоб відхилити цей запит контакту"
],
"Click to chat with this contact": [
null,
"Клацніть, щоб почати розмову з цим контактом"
],
"Are you sure you want to remove this contact?": [
null,
"Ви впевнені, що хочете видалити цей контакт?"
],
"Are you sure you want to decline this contact request?": [
null,
"Ви впевнені, що хочете відхилити цей запит контакту?"
],
"Type to filter": [
null,
"Друкуйте для фільтру"
],
"I am %1$s": [
null,
"Я %1$s"
],
"Click here to write a custom status message": [
null,
"Клацніть тут, щоб створити власний статус"
],
"Click to change your chat status": [
null,
"Клацніть, щоб змінити статус в чаті"
],
"Custom status": [
null,
"Власний статус"
],
"online": [
null,
"на зв'язку"
],
"busy": [
null,
"зайнятий"
],
"away for long": [
null,
"давно відсутній"
],
"away": [
null,
"відсутній"
],
"Your XMPP provider's domain name:": [
null,
"Домен Вашого провайдера XMPP:"
],
"Fetch registration form": [
null,
"Отримати форму реєстрації"
],
"Tip: A list of public XMPP providers is available": [
null,
"Порада: доступний перелік публічних XMPP-провайдерів"
],
"here": [
null,
"тут"
],
"Register": [
null,
"Реєстрація"
],
"Sorry, the given provider does not support in band account registration. Please try with a different provider.": [
null,
"Вибачте, вказаний провайдер не підтримує реєстрації онлайн. Спробуйте іншого провайдера."
],
"Requesting a registration form from the XMPP server": [
null,
"Запитую форму реєстрації з XMPP сервера"
],
"Something went wrong while establishing a connection with \"%1$s\". Are you sure it exists?": [
null,
"Щось пішло не так при встановленні зв'язку з \"%1$s\". Ви впевнені, що такий існує?"
],
"Now logging you in": [
null,
"Входимо"
],
"Registered successfully": [
null,
"Успішно зареєстровано"
],
"Return": [
null,
"Вернутися"
],
"The provider rejected your registration attempt. ": [
null,
"Провайдер відхилив Вашу спробу реєстрації."
],
"XMPP Username:": [
null,
"XMPP адреса:"
],
"Password:": [
null,
"Пароль:"
],
"Log In": [
null,
"Ввійти"
],
"Sign in": [
null,
"Вступити"
],
"Toggle chat": [
null,
"Включити чат"
]
}
}
}

View File

@ -0,0 +1,890 @@
# Ukrainian translations for Converse.js package.
# Copyright (C) 2015 Jan-Carel Brand
# This file is distributed under the same license as the Converse.js package.
# Andriy Kopystyansky <anri@polynet.lviv.ua>, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.7.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-05-01 12:26+0200\n"
"PO-Revision-Date: 2015-04-28 13:39+0200\n"
"Last-Translator: Andriy Kopystyansky <anri@polynet.lviv.ua>\n"
"Language-Team: Ukrainian\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"domain: converse\n"
"lang: uk\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: converse.js:254
msgid " e.g. conversejs.org"
msgstr " напр. conversejs.org"
#: converse.js:331
msgid "unencrypted"
msgstr "некриптовано"
#: converse.js:332
msgid "unverified"
msgstr "неперевірено"
#: converse.js:333
msgid "verified"
msgstr "перевірено"
#: converse.js:334
msgid "finished"
msgstr "завершено"
#: converse.js:337
msgid "This contact is busy"
msgstr "Цей контакт зайнятий"
#: converse.js:338
msgid "This contact is online"
msgstr "Цей контакт на зв'язку"
#: converse.js:339
msgid "This contact is offline"
msgstr "Цей контакт поза мережею"
#: converse.js:340
msgid "This contact is unavailable"
msgstr "Цей контакт недоступний"
#: converse.js:341
msgid "This contact is away for an extended period"
msgstr "Цей контакт відсутній тривалий час"
#: converse.js:342
msgid "This contact is away"
msgstr "Цей контакт відсутній"
#: converse.js:344
msgid "Click to hide these contacts"
msgstr "Клацніть, щоб приховати ці контакти"
#: converse.js:346
msgid "My contacts"
msgstr "Мої контакти"
#: converse.js:347
msgid "Pending contacts"
msgstr "Контакти в очікуванні"
#: converse.js:348
msgid "Contact requests"
msgstr "Запити контакту"
#: converse.js:349
msgid "Ungrouped"
msgstr "Негруповані"
#: converse.js:351 converse.js:648 converse.js:691
msgid "Contacts"
msgstr "Контакти"
#: converse.js:352
msgid "Groups"
msgstr "Групи"
#: converse.js:452
msgid "Reconnecting"
msgstr "Перепід'єднуюсь"
#: converse.js:495
msgid "Error"
msgstr "Помилка"
#: converse.js:497
msgid "Connecting"
msgstr "Під'єднуюсь"
#: converse.js:499
msgid "Authenticating"
msgstr "Автентикуюсь"
#: converse.js:501 converse.js:502
msgid "Authentication Failed"
msgstr "Автентикація невдала"
#: converse.js:807
msgid "Re-establishing encrypted session"
msgstr "Перевстановлюю криптований сеанс"
#: converse.js:819
msgid "Generating private key."
msgstr "Генерація приватного ключа."
#: converse.js:820
msgid "Your browser might become unresponsive."
msgstr "Ваш браузер може підвиснути."
#: converse.js:855
msgid ""
"Authentication request from %1$s\n"
"\n"
"Your chat contact is attempting to verify your identity, by asking you the "
"question below.\n"
"\n"
"%2$s"
msgstr ""
"Запит автентикації від %1$s\n"
"\n"
"Ваш контакт в чаті намагається встановити Вашу особу і просить відповісти на "
"питання нижче.\n"
"\n"
"%2$s"
#: converse.js:864
msgid "Could not verify this user's identify."
msgstr "Не можу перевірити автентичність цього користувача."
#: converse.js:903
msgid "Exchanging private key with contact."
msgstr "Обмін приватним ключем з контактом."
#: converse.js:1049
msgid "Personal message"
msgstr "Персональна вісточка"
#: converse.js:1081
msgid "Are you sure you want to clear the messages from this room?"
msgstr "Ви впевнені, що хочете очистити повідомлення з цієї кімнати?"
#: converse.js:1103
msgid "me"
msgstr "я"
#: converse.js:1158
msgid "is typing"
msgstr "друкує"
#: converse.js:1161
msgid "has stopped typing"
msgstr "припинив друкувати"
#: converse.js:1167 converse.js:1447
msgid "has gone away"
msgstr "пішов геть"
#: converse.js:1212 converse.js:2531
msgid "Show this menu"
msgstr "Показати це меню"
#: converse.js:1213
msgid "Write in the third person"
msgstr "Писати від третьої особи"
#: converse.js:1214 converse.js:2529
msgid "Remove messages"
msgstr "Видалити повідомлення"
#: converse.js:1340
msgid "Are you sure you want to clear the messages from this chat box?"
msgstr "Ви впевнені, що хочете очистити повідомлення з цього вікна чату?"
#: converse.js:1375
msgid "Your message could not be sent"
msgstr "Ваше повідомлення не може бути надіслане"
#: converse.js:1378
msgid "We received an unencrypted message"
msgstr "Ми отримали некриптоване повідомлення"
#: converse.js:1381
msgid "We received an unreadable encrypted message"
msgstr "Ми отримали нечитабельне криптоване повідомлення"
#: converse.js:1407
msgid ""
"Here are the fingerprints, please confirm them with %1$s, outside of this "
"chat.\n"
"\n"
"Fingerprint for you, %2$s: %3$s\n"
"\n"
"Fingerprint for %1$s: %4$s\n"
"\n"
"If you have confirmed that the fingerprints match, click OK, otherwise click "
"Cancel."
msgstr ""
"Ось відбитки, будь-ласка, підтвердіть їх з %1$s, за межами цього чату.\n"
"\n"
"Відбиток для Вас, %2$s: %3$s\n"
"\n"
"Відбиток для %1$s: %4$s\n"
"\n"
"Якщо Ви підтверджуєте відповідність відбитка, клацніть Гаразд, інакше "
"клацніть Відміна."
#: converse.js:1420
msgid ""
"You will be prompted to provide a security question and then an answer to "
"that question.\n"
"\n"
"Your contact will then be prompted the same question and if they type the "
"exact same answer (case sensitive), their identity will be verified."
msgstr ""
"Вас запитають таємне питання і відповідь на нього.\n"
"\n"
"Потім Вашого контакта запитають те саме питання, і якщо вони введуть ту саму "
"відповідь (враховуючи регістр), їх особи будуть перевірені."
#: converse.js:1421
msgid "What is your security question?"
msgstr "Яке Ваше таємне питання?"
#: converse.js:1423
msgid "What is the answer to the security question?"
msgstr "Яка відповідь на таємне питання?"
#: converse.js:1427
msgid "Invalid authentication scheme provided"
msgstr "Надана некоректна схема автентикації"
#: converse.js:1445
msgid "has gone offline"
msgstr "тепер поза мережею"
#: converse.js:1449
msgid "is busy"
msgstr "зайнятий"
#: converse.js:1537
msgid "Your messages are not encrypted anymore"
msgstr "Ваші повідомлення більше не криптуються"
#: converse.js:1539
msgid ""
"Your messages are now encrypted but your contact's identity has not been "
"verified."
msgstr ""
"Ваші повідомлення вже криптуються, але особа Вашого контакту не перевірена."
#: converse.js:1541
msgid "Your contact's identify has been verified."
msgstr "Особу Вашого контакту перевірено."
#: converse.js:1543
msgid "Your contact has ended encryption on their end, you should do the same."
msgstr ""
"Ваш контакт припинив криптування зі свого боку, Вам слід зробити те саме."
#: converse.js:1552
msgid "Your messages are not encrypted. Click here to enable OTR encryption."
msgstr ""
"Ваші повідомлення не криптуються. Клацніть тут, щоб увімкнути OTR-"
"криптування."
#: converse.js:1554
msgid "Your messages are encrypted, but your contact has not been verified."
msgstr "Ваші повідомлення криптуються, але Ваш контакт не був перевірений."
#: converse.js:1556
msgid "Your messages are encrypted and your contact verified."
msgstr "Ваші повідомлення криптуються і Ваш контакт перевірено."
#: converse.js:1558
msgid ""
"Your contact has closed their end of the private session, you should do the "
"same"
msgstr ""
"Ваш контакт закрив зі свого боку приватну сесію, Вам слід зробити те ж саме"
#: converse.js:1568
msgid "Clear all messages"
msgstr "Очистити всі повідомлення"
#: converse.js:1569
msgid "End encrypted conversation"
msgstr "Завершити криптовану розмову"
#: converse.js:1570
msgid "Hide the list of participants"
msgstr "Сховати список учасників"
#: converse.js:1571
msgid "Refresh encrypted conversation"
msgstr "Оновити криптовану розмову"
#: converse.js:1572
msgid "Start a call"
msgstr "Почати виклик"
#: converse.js:1573
msgid "Start encrypted conversation"
msgstr "Почати криптовану розмову"
#: converse.js:1574
msgid "Verify with fingerprints"
msgstr "Перевірити за відбитками"
#: converse.js:1575
msgid "Verify with SMP"
msgstr "Перевірити за SMP"
#: converse.js:1576
msgid "What's this?"
msgstr "Що це?"
#: converse.js:1668
msgid "Online"
msgstr "На зв'язку"
#: converse.js:1669
msgid "Busy"
msgstr "Зайнятий"
#: converse.js:1670
msgid "Away"
msgstr "Далеко"
#: converse.js:1671
msgid "Offline"
msgstr "Поза мережею"
#: converse.js:1672
msgid "Log out"
msgstr "Вийти"
#: converse.js:1678
msgid "Contact name"
msgstr "Назва контакту"
#: converse.js:1679
msgid "Search"
msgstr "Пошук"
#: converse.js:1683
msgid "Contact username"
msgstr "Логін контакту"
#: converse.js:1684
msgid "Add"
msgstr "Додати"
#: converse.js:1689
msgid "Click to add new chat contacts"
msgstr "Клацніть, щоб додати нові контакти до чату"
#: converse.js:1690
msgid "Add a contact"
msgstr "Додати контакт"
#: converse.js:1714
msgid "No users found"
msgstr "Жодного користувача не знайдено"
#: converse.js:1720
msgid "Click to add as a chat contact"
msgstr "Клацніть, щоб додати як чат-контакт"
#: converse.js:1784
msgid "Room name"
msgstr "Назва кімнати"
#: converse.js:1785
msgid "Nickname"
msgstr "Прізвисько"
#: converse.js:1786
msgid "Server"
msgstr "Сервер"
#: converse.js:1787
msgid "Join Room"
msgstr "Приєднатися до кімнати"
#: converse.js:1788
msgid "Show rooms"
msgstr "Показати кімнати"
#: converse.js:1792
msgid "Rooms"
msgstr "Кімнати"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:1812
msgid "No rooms on %1$s"
msgstr "Жодної кімнати на %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
#: converse.js:1827
msgid "Rooms on %1$s"
msgstr "Кімнати на %1$s"
#: converse.js:1836
msgid "Click to open this room"
msgstr "Клацніть, щоб увійти в цю кімнату"
#: converse.js:1837
msgid "Show more information on this room"
msgstr "Показати більше інформації про цю кімату"
#: converse.js:1909
msgid "Description:"
msgstr "Опис:"
#: converse.js:1910
msgid "Occupants:"
msgstr "Присутні:"
#: converse.js:1911
msgid "Features:"
msgstr "Особливості:"
#: converse.js:1912
msgid "Requires authentication"
msgstr "Вимагає автентикації"
#: converse.js:1913
msgid "Hidden"
msgstr "Прихована"
#: converse.js:1914
msgid "Requires an invitation"
msgstr "Вимагає запрошення"
#: converse.js:1915
msgid "Moderated"
msgstr "Модерована"
#: converse.js:1916
msgid "Non-anonymous"
msgstr "Не-анонімні"
#: converse.js:1917
msgid "Open room"
msgstr "Увійти в кімнату"
#: converse.js:1918
msgid "Permanent room"
msgstr "Постійна кімната"
#: converse.js:1919
msgid "Public"
msgstr "Публічна"
#: converse.js:1920
msgid "Semi-anonymous"
msgstr "Напів-анонімна"
#: converse.js:1921
msgid "Temporary room"
msgstr "Тимчасова кімната"
#: converse.js:1922
msgid "Unmoderated"
msgstr "Немодерована"
#: converse.js:2191
msgid "This user is a moderator"
msgstr "Цей користувач є модератором"
#: converse.js:2192
msgid "This user can send messages in this room"
msgstr "Цей користувач може слати повідомлення в цій кімнаті"
#: converse.js:2193
msgid "This user can NOT send messages in this room"
msgstr "Цей користувач НЕ МОЖЕ слати повідомлення в цій кімнаті"
#: converse.js:2221
msgid "Invite..."
msgstr "Запросіть..."
#: converse.js:2222
msgid "Occupants"
msgstr "Учасники"
#: converse.js:2318
msgid "You are about to invite %1$s to the chat room \"%2$s\". "
msgstr "Ви запрошуєте %1$s до чату \"%2$s\". "
#: converse.js:2319
msgid ""
"You may optionally include a message, explaining the reason for the "
"invitation."
msgstr ""
"Ви можете опціонально додати повідомлення, щоб пояснити причину запрошення."
#: converse.js:2400
msgid "Message"
msgstr "Повідомлення"
#: converse.js:2452
msgid "Error: could not execute the command"
msgstr "Помилка: Не можу виконати команду"
#: converse.js:2527
msgid "Change user's affiliation to admin"
msgstr "Призначити користувача адміністратором"
#: converse.js:2528
msgid "Ban user from room"
msgstr "Заблокувати і викинути з кімнати"
#: converse.js:2530
msgid "Change user role to participant"
msgstr "Зробити користувача учасником"
#: converse.js:2532
msgid "Kick user from room"
msgstr "Викинути з кімнати"
#: converse.js:2533
msgid "Write in 3rd person"
msgstr "Писати в 3-й особі"
#: converse.js:2534
msgid "Grant membership to a user"
msgstr "Надати членство користувачу"
#: converse.js:2535
msgid "Remove user's ability to post messages"
msgstr "Забрати можливість слати повідомлення"
#: converse.js:2536
msgid "Change your nickname"
msgstr "Змінити Ваше прізвисько"
#: converse.js:2537
msgid "Grant moderator role to user"
msgstr "Надати права модератора"
#: converse.js:2538
msgid "Grant ownership of this room"
msgstr "Передати у власність цю кімнату"
#: converse.js:2539
msgid "Revoke user's membership"
msgstr "Забрати членство в користувача"
#: converse.js:2540
msgid "Set room topic"
msgstr "Встановити тему кімнати"
#: converse.js:2541
msgid "Allow muted user to post messages"
msgstr "Дозволити безголосому користувачу слати повідомлення"
#: converse.js:2686 converse.js:4629
msgid "Save"
msgstr "Зберегти"
#: converse.js:2687 converse.js:4894 converse.js:5009
msgid "Cancel"
msgstr "Відміна"
#: converse.js:2730
msgid "An error occurred while trying to save the form."
msgstr "Трапилася помилка при спробі зберегти форму."
#: converse.js:2777
msgid "This chatroom requires a password"
msgstr "Ця кімната вимагає пароль"
#: converse.js:2778
msgid "Password: "
msgstr "Пароль:"
#: converse.js:2779
msgid "Submit"
msgstr "Надіслати"
#: converse.js:2814
msgid "This room is not anonymous"
msgstr "Ця кімната не є анонімною"
#: converse.js:2815
msgid "This room now shows unavailable members"
msgstr "Ця кімната вже показує недоступних учасників"
#: converse.js:2816
msgid "This room does not show unavailable members"
msgstr "Ця кімната не показує недоступних учасників"
#: converse.js:2817
msgid "Non-privacy-related room configuration has changed"
msgstr "Змінено конфігурацію кімнати, не повязану з приватністю"
#: converse.js:2818
msgid "Room logging is now enabled"
msgstr "Журналювання кімнати тепер ввімкнено"
#: converse.js:2819
msgid "Room logging is now disabled"
msgstr "Журналювання кімнати тепер вимкнено"
#: converse.js:2820
msgid "This room is now non-anonymous"
msgstr "Ця кімната тепер не-анонімна"
#: converse.js:2821
msgid "This room is now semi-anonymous"
msgstr "Ця кімната тепер напів-анонімна"
#: converse.js:2822
msgid "This room is now fully-anonymous"
msgstr "Ця кімната тепер повністю анонімна"
#: converse.js:2823
msgid "A new room has been created"
msgstr "Створено нову кімнату"
#: converse.js:2827 converse.js:2926
msgid "You have been banned from this room"
msgstr "Вам заблокували доступ до цієї кімнати"
#: converse.js:2828
msgid "You have been kicked from this room"
msgstr "Вас викинули з цієї кімнати"
#: converse.js:2829
msgid "You have been removed from this room because of an affiliation change"
msgstr "Вас видалено з кімнати у зв'язку зі змінами власності кімнати"
#: converse.js:2830
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr ""
"Вас видалено з цієї кімнати, оскільки вона тепер вимагає членства, а Ви ним "
"не є її членом"
#: converse.js:2831
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr "Вас видалено з цієї кімнати, тому що MUC (Чат-сервіс) припиняє роботу."
#: converse.js:2845
msgid "<strong>%1$s</strong> has been banned"
msgstr "<strong>%1$s</strong> заблоковано"
#: converse.js:2846
msgid "<strong>%1$s</strong>'s nickname has changed"
msgstr "Прізвисько <strong>%1$s</strong> змінено"
#: converse.js:2847
msgid "<strong>%1$s</strong> has been kicked out"
msgstr "<strong>%1$s</strong> було викинуто звідси"
#: converse.js:2848
msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr "<strong>%1$s</strong> було видалено через зміни власності кімнати"
#: converse.js:2849
msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr "<strong>%1$s</strong> було виделано через відсутність членства"
#: converse.js:2853
msgid "Your nickname has been automatically changed to: <strong>%1$s</strong>"
msgstr "Ваше прізвисько було автоматично змінене на: <strong>%1$s</strong>"
#: converse.js:2854
msgid "Your nickname has been changed to: <strong>%1$s</strong>"
msgstr "Ваше прізвисько було змінене на: <strong>%1$s</strong>"
#: converse.js:2902 converse.js:2912
msgid "The reason given is: \""
msgstr "Причиною вказано: \""
#: converse.js:2924
msgid "You are not on the member list of this room"
msgstr "Ви не є у списку членів цієї кімнати"
#: converse.js:2930
msgid "No nickname was specified"
msgstr "Не вказане прізвисько"
#: converse.js:2934
msgid "You are not allowed to create new rooms"
msgstr "Вам не дозволено створювати нові кімнати"
#: converse.js:2936
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Ваше прізвисько не відповідає політиці кімнати"
#: converse.js:2940
msgid "Your nickname is already taken"
msgstr "Таке прізвисько вже зайняте"
#: converse.js:2942
msgid "This room does not (yet) exist"
msgstr "Такої кімнати (поки) не існує"
#: converse.js:2944
msgid "This room has reached it's maximum number of occupants"
msgstr "Ця кімната досягнула максимуму учасників"
#: converse.js:2988
msgid "Topic set by %1$s to: %2$s"
msgstr "Тема встановлена %1$s: %2$s"
#: converse.js:3066
msgid "%1$s has invited you to join a chat room: %2$s"
msgstr "%1$s запрошує вас приєднатись до чату: %2$s"
#: converse.js:3070
msgid ""
"%1$s has invited you to join a chat room: %2$s, and left the following "
"reason: \"%3$s\""
msgstr ""
"%1$s запрошує Вас приєднатись до чату: %2$s, аргументує ось як: \"%3$s\""
#: converse.js:3339
msgid "Click to restore this chat"
msgstr "Клацніть, щоб відновити цей чат"
#: converse.js:3481
msgid "Minimized"
msgstr "Мінімізовано"
#: converse.js:3582 converse.js:3600
msgid "Click to remove this contact"
msgstr "Клацніть, щоб видалити цей контакт"
#: converse.js:3589
msgid "Click to accept this contact request"
msgstr "Клацніть, щоб прийняти цей запит контакту"
#: converse.js:3590
msgid "Click to decline this contact request"
msgstr "Клацніть, щоб відхилити цей запит контакту"
#: converse.js:3599
msgid "Click to chat with this contact"
msgstr "Клацніть, щоб почати розмову з цим контактом"
#: converse.js:3616
msgid "Are you sure you want to remove this contact?"
msgstr "Ви впевнені, що хочете видалити цей контакт?"
#: converse.js:3639
msgid "Are you sure you want to decline this contact request?"
msgstr "Ви впевнені, що хочете відхилити цей запит контакту?"
#: converse.js:4166
msgid "Type to filter"
msgstr "Друкуйте для фільтру"
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:4600 converse.js:4673
msgid "I am %1$s"
msgstr "Я %1$s"
#: converse.js:4602 converse.js:4678
msgid "Click here to write a custom status message"
msgstr "Клацніть тут, щоб створити власний статус"
#: converse.js:4603 converse.js:4679
msgid "Click to change your chat status"
msgstr "Клацніть, щоб змінити статус в чаті"
#: converse.js:4628
msgid "Custom status"
msgstr "Власний статус"
#: converse.js:4656 converse.js:4664
msgid "online"
msgstr "на зв'язку"
#: converse.js:4658
msgid "busy"
msgstr "зайнятий"
#: converse.js:4660
msgid "away for long"
msgstr "давно відсутній"
#: converse.js:4662
msgid "away"
msgstr "відсутній"
#: converse.js:4779
msgid "Your XMPP provider's domain name:"
msgstr "Домен Вашого провайдера XMPP:"
#: converse.js:4780
msgid "Fetch registration form"
msgstr "Отримати форму реєстрації"
#: converse.js:4781
msgid "Tip: A list of public XMPP providers is available"
msgstr "Порада: доступний перелік публічних XMPP-провайдерів"
#: converse.js:4782
msgid "here"
msgstr "тут"
#: converse.js:4787 converse.js:5007
msgid "Register"
msgstr "Реєстрація"
#: converse.js:4834
msgid ""
"Sorry, the given provider does not support in band account registration. "
"Please try with a different provider."
msgstr ""
"Вибачте, вказаний провайдер не підтримує реєстрації онлайн. Спробуйте іншого "
"провайдера."
#: converse.js:4895
msgid "Requesting a registration form from the XMPP server"
msgstr "Запитую форму реєстрації з XMPP сервера"
#: converse.js:4930
msgid ""
"Something went wrong while establishing a connection with \"%1$s\". Are you "
"sure it exists?"
msgstr ""
"Щось пішло не так при встановленні зв'язку з \"%1$s\". Ви впевнені, що такий "
"існує?"
#: converse.js:4949
msgid "Now logging you in"
msgstr "Входимо"
#: converse.js:4953
msgid "Registered successfully"
msgstr "Успішно зареєстровано"
#: converse.js:5012
msgid "Return"
msgstr "Вернутися"
#: converse.js:5044
msgid "The provider rejected your registration attempt. "
msgstr "Провайдер відхилив Вашу спробу реєстрації."
#: converse.js:5200
msgid "XMPP Username:"
msgstr "XMPP адреса:"
#: converse.js:5201
msgid "Password:"
msgstr "Пароль:"
#: converse.js:5202
#, fuzzy
msgid "Click here to log in anonymously"
msgstr "Ця кімната не є анонімною"
#: converse.js:5203
msgid "Log In"
msgstr "Ввійти"
#: converse.js:5210
msgid "Sign in"
msgstr "Вступити"
#: converse.js:5291
msgid "Toggle chat"
msgstr "Включити чат"

File diff suppressed because it is too large Load Diff

View File

@ -79,6 +79,7 @@ require.config({
"pl": "locale/pl/LC_MESSAGES/converse.json",
"pt_BR": "locale/pt_BR/LC_MESSAGES/converse.json",
"ru": "locale/ru/LC_MESSAGES/converse.json",
"uk": "locale/uk/LC_MESSAGES/converse.json",
"zh": "locale/zh/LC_MESSAGES/converse.json",
// Templates

View File

@ -1,6 +1,6 @@
{
"name": "converse.js",
"version": "0.9.2",
"version": "0.9.3",
"description": "Browser based XMPP instant messaging client",
"main": "main.js",
"directories": {

View File

@ -21,6 +21,7 @@
'text!pl',
'text!pt_BR',
'text!ru',
'text!uk',
'text!zh'
], function ($, Jed) {
root.locales = {
@ -39,7 +40,8 @@
'pl': arguments[14],
'pt-br': arguments[15],
'ru': arguments[16],
'zh': arguments[17]
'uk': arguments[17],
'zh': arguments[18]
};
return root.locales;
});