Commit 509b2c30 authored by JC Brand's avatar JC Brand

Merge branch 'master' of github.com:jcbrand/converse.js

Conflicts:
	converse.js
parents d04a1aa1 eb9e5300
*~
*.mo
*.kpf
*.swp
.*.cfg
.hg/
.bzr/
.svn/
.project
.pydevproject
node_modules
# OSX
.DS_Store
Changelog
=========
0.5 (Unreleased)
----------------
- #22 Fixed compare operator in strophe.muc [sonata82]
- #23 Add Italian translations [ctrlaltca]
- #24 Add Spanish translations [macagua]
- #25 Using span with css instead of img [matheus-morfi]
- #26 Only the first minute digit shown in chatbox. [jcbrand]
0.4 (2013-06-03)
----------------
- CSS tweaks: fixed overflowing text in status message and chatrooms list. [jcbrand]
- Bugfix: Couldn't join chatroom when clicking from a list of rooms. [jcbrand]
- Add better support for kicking or banning users from chatrooms. [jcbrand]
- Fixed alignment of chat messages in Firefox. [jcbrand]
- More intelligent fetching of vCards. [jcbrand]
- Fixed a race condition bug. Make sure that the roster is populated before sending initial presence. [jcbrand]
- Reconnect automatically when the connection drops. [jcbrand]
- Add support for internationalization. [jcbrand]
0.3 (2013-05-21)
----------------
- Add vCard support
[jcbrand]
- Remember custom status messages upon reload.
[jcbrand]
- Remove jquery-ui dependency.
[jcbrand]
- Use backbone.localStorage to store the contacts roster, open chatboxes and
chat messages.
[jcbrand]
- Fixed user status handling, which wasn't 100% according to the spec.
[jcbrand]
- Separate messages according to day in chats.
[jcbrand]
- Add support for specifying the BOSH bind URL as configuration setting.
[jcbrand]
- Improve the message counter to only increment when the window is not focused
[witekdev]
- Make fetching of list of chatrooms on a server a configuration option.
[jcbrand]
- Use service discovery to show all available features on a room.
[jcbrand]
- Multi-user chatrooms are now configurable.
[jcbrand]
- Add vCard support [jcbrand]
- Remember custom status messages upon reload. [jcbrand]
- Remove jquery-ui dependency. [jcbrand]
- Use backbone.localStorage to store the contacts roster, open chatboxes and chat messages. [jcbrand]
- Fixed user status handling, which wasn't 100% according to the spec. [jcbrand]
- Separate messages according to day in chats. [jcbrand]
- Add support for specifying the BOSH bind URL as configuration setting. [jcbrand]
- #8 Improve the message counter to only increment when the window is not focused [witekdev]
- Make fetching of list of chatrooms on a server a configuration option. [jcbrand]
- Use service discovery to show all available features on a room. [jcbrand]
- Multi-user chatrooms are now configurable. [jcbrand]
0.2 (2013-03-28)
......
module.exports = function(grunt) {
grunt.initConfig({
jshint: {
options: {
trailing: true
},
target: {
src : [
'converse.js',
'mock.js',
'main.js',
'tests_main.js',
'spec/*.js'
]
}
}
});
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.registerTask('default', ['jshint']);
};
/*global $:false, document:false, window:false, portal_url:false,
$msg:false, Strophe:false, setTimeout:false, navigator:false, jarn:false, google:false, jarnxmpp:false, jQuery:false, sessionStorage:false, $iq:false, $pres:false, Image:false, */
(function (jarnxmpp, $, portal_url) {
portal_url = portal_url || '';
jarnxmpp.Storage = {
storage: null,
init: function () {
try {
if ('sessionStorage' in window && window.sessionStorage !== null && JSON in window && window.JSON !== null) {
jarnxmpp.Storage.storage = sessionStorage;
if (!('_user_info' in jarnxmpp.Storage.storage)) {
jarnxmpp.Storage.set('_user_info', {});
}
if (!('_vCards' in jarnxmpp.Storage.storage)) {
jarnxmpp.Storage.set('_vCards', {});
}
if (!('_subscriptions' in jarnxmpp.Storage.storage)) {
jarnxmpp.Storage.set('_subscriptions', null);
}
}
} catch (e) {}
},
get: function (key) {
if (key in sessionStorage) {
return JSON.parse(sessionStorage[key]);
}
return null;
},
set: function (key, value) {
sessionStorage[key] = JSON.stringify(value);
},
xmppGet: function (key, callback) {
var stanza = $iq({type: 'get'})
.c('query', {xmlns: 'jabber:iq:private'})
.c('jarnxmpp', {xmlns: 'http://jarn.com/ns/jarnxmpp:prefs:' + key})
.tree();
jarnxmpp.connection.sendIQ(stanza, function success(result) {
callback($('jarnxmpp ' + 'value', result).first().text());
});
},
xmppSet: function (key, value) {
var stanza = $iq({type: 'set'})
.c('query', {xmlns: 'jabber:iq:private'})
.c('jarnxmpp', {xmlns: 'http://jarn.com/ns/jarnxmpp:prefs:' + key})
.c('value', value)
.tree();
jarnxmpp.connection.sendIQ(stanza);
}
};
jarnxmpp.Storage.init();
jarnxmpp.Presence = {
online: {},
_user_info: {},
onlineCount: function () {
var me = Strophe.getNodeFromJid(jarnxmpp.connection.jid),
counter = 0,
user;
for (user in jarnxmpp.Presence.online) {
if ((jarnxmpp.Presence.online.hasOwnProperty(user)) && user !== me) {
counter += 1;
}
}
return counter;
},
getUserInfo: function (user_id, callback) {
// User info on browsers without storage
if (jarnxmpp.Storage.storage === null) {
if (user_id in jarnxmpp.Presence._user_info) {
callback(jarnxmpp.Presence._user_info[user_id]);
} else {
$.getJSON(portal_url + "/xmpp-userinfo?user_id=" + user_id, function (data) {
jarnxmpp.Presence._user_info[user_id] = data;
callback(data);
});
}
} else {
var _user_info = jarnxmpp.Storage.get('_user_info');
if (user_id in _user_info) {
callback(_user_info[user_id]);
} else {
$.getJSON(portal_url + "/xmpp-userinfo?user_id=" + user_id, function (data) {
_user_info[user_id] = data;
jarnxmpp.Storage.set('_user_info', _user_info);
callback(data);
});
}
}
}
};
jarnxmpp.vCard = {
_vCards: {},
_getVCard: function (jid, callback) {
var stanza =
$iq({type: 'get', to: jid})
.c('vCard', {xmlns: 'vcard-temp'}).tree();
jarnxmpp.connection.sendIQ(stanza, function (data) {
var result = {};
$('vCard[xmlns="vcard-temp"]', data).children().each(function (idx, element) {
result[element.nodeName] = element.textContent;
});
if (typeof (callback) !== 'undefined') {
callback(result);
}
});
},
getVCard: function (jid, callback) {
jid = Strophe.getBareJidFromJid(jid);
if (jarnxmpp.Storage.storage === null) {
if (jid in jarnxmpp.vCard._vCards) {
callback(jarnxmpp.vCard._vCards[jid]);
} else {
jarnxmpp.vCard._getVCard(jid, function (result) {
jarnxmpp.vCard._vCards[jid] = result;
callback(result);
});
}
} else {
var _vCards = jarnxmpp.Storage.get('_vCards');
if (jid in _vCards) {
callback(_vCards[jid]);
} else {
jarnxmpp.vCard._getVCard(jid, function (result) {
_vCards[jid] = result;
jarnxmpp.Storage.set('_vCards', _vCards);
callback(result);
});
}
}
},
setVCard: function (params, photoUrl) {
var key,
vCard = Strophe.xmlElement('vCard', [['xmlns', 'vcard-temp'], ['version', '2.0']]);
for (key in params) {
if (params.hasOwnProperty(key)) {
vCard.appendChild(Strophe.xmlElement(key, [], params[key]));
}
}
var send = function () {
var stanza = $iq({type: 'set'}).cnode(vCard).tree();
jarnxmpp.connection.sendIQ(stanza);
};
if (typeof (photoUrl) === 'undefined') {
send();
} else {
jarnxmpp.vCard.getBase64Image(photoUrl, function (base64img) {
base64img = base64img.replace(/^data:image\/png;base64,/, "");
var photo = Strophe.xmlElement('PHOTO');
photo.appendChild(Strophe.xmlElement('TYPE', [], 'image/png'));
photo.appendChild(Strophe.xmlElement('BINVAL', [], base64img));
vCard.appendChild(photo);
send();
});
}
},
getBase64Image: function (url, callback) {
// Create the element, then draw it on a canvas to get the base64 data.
var img = new Image();
$(img).load(function () {
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
callback(canvas.toDataURL('image/png'));
}).attr('src', url);
}
};
jarnxmpp.onConnect = function (status) {
if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
$(window).bind('beforeunload', function () {
$(document).trigger('jarnxmpp.disconnecting');
var presence = $pres({type: 'unavailable'});
jarnxmpp.connection.send(presence);
jarnxmpp.connection.disconnect();
jarnxmpp.connection.flush();
});
$(document).trigger('jarnxmpp.connected');
} else if (status === Strophe.Status.DISCONNECTED) {
$(document).trigger('jarnxmpp.disconnected');
}
};
jarnxmpp.rawInput = function (data) {
var event = jQuery.Event('jarnxmpp.dataReceived');
event.text = data;
$(document).trigger(event);
};
jarnxmpp.rawOutput = function (data) {
var event = jQuery.Event('jarnxmpp.dataSent');
event.text = data;
$(document).trigger(event);
};
$(document).bind('jarnxmpp.connected', function () {
// Logging
jarnxmpp.connection.rawInput = jarnxmpp.rawInput;
jarnxmpp.connection.rawOutput = jarnxmpp.rawOutput;
});
$(document).bind('jarnxmpp.disconnecting', function () {
if (jarnxmpp.Storage.storage !== null) {
jarnxmpp.Storage.set('online-count', jarnxmpp.Presence.onlineCount());
}
});
$(document).ready(function () {
var resource = jarnxmpp.Storage.get('xmppresource');
if (resource) {
data = {'resource': resource};
} else {
data = {};
}
$.ajax({
'url':portal_url + '/@@xmpp-loader',
'dataType': 'json',
'data': data,
'success': function (data) {
if (!(('rid' in data) && ('sid' in data) && ('BOSH_SERVICE' in data))) {
return;
}
if (!resource) {
jarnxmpp.Storage.set('xmppresource', Strophe.getResourceFromJid(data.jid));
}
jarnxmpp.BOSH_SERVICE = data.BOSH_SERVICE;
jarnxmpp.jid = data.jid;
jarnxmpp.connection = new Strophe.Connection(jarnxmpp.BOSH_SERVICE);
jarnxmpp.connection.attach(jarnxmpp.jid, data.sid, data.rid, jarnxmpp.onConnect);
}
});
});
})(window.jarnxmpp = window.jarnxmpp || {}, jQuery, portal_url);
/*
jed.js
v0.5.0beta
https://github.com/SlexAxton/Jed
-----------
A gettext compatible i18n library for modern JavaScript Applications
by Alex Sexton - AlexSexton [at] gmail - @SlexAxton
WTFPL license for use
Dojo CLA for contributions
Jed offers the entire applicable GNU gettext spec'd set of
functions, but also offers some nicer wrappers around them.
The api for gettext was written for a language with no function
overloading, so Jed allows a little more of that.
Many thanks to Joshua I. Miller - unrtst@cpan.org - who wrote
gettext.js back in 2008. I was able to vet a lot of my ideas
against his. I also made sure Jed passed against his tests
in order to offer easy upgrades -- jsgettext.berlios.de
*/
(function (root, undef) {
// Set up some underscore-style functions, if you already have
// underscore, feel free to delete this section, and use it
// directly, however, the amount of functions used doesn't
// warrant having underscore as a full dependency.
// Underscore 1.3.0 was used to port and is licensed
// under the MIT License by Jeremy Ashkenas.
var ArrayProto = Array.prototype,
ObjProto = Object.prototype,
slice = ArrayProto.slice,
hasOwnProp = ObjProto.hasOwnProperty,
nativeForEach = ArrayProto.forEach,
breaker = {};
// We're not using the OOP style _ so we don't need the
// extra level of indirection. This still means that you
// sub out for real `_` though.
var _ = {
forEach : function( obj, iterator, context ) {
var i, l, key;
if ( obj === null ) {
return;
}
if ( nativeForEach && obj.forEach === nativeForEach ) {
obj.forEach( iterator, context );
}
else if ( obj.length === +obj.length ) {
for ( i = 0, l = obj.length; i < l; i++ ) {
if ( i in obj && iterator.call( context, obj[i], i, obj ) === breaker ) {
return;
}
}
}
else {
for ( key in obj) {
if ( hasOwnProp.call( obj, key ) ) {
if ( iterator.call (context, obj[key], key, obj ) === breaker ) {
return;
}
}
}
}
},
extend : function( obj ) {
this.forEach( slice.call( arguments, 1 ), function ( source ) {
for ( var prop in source ) {
obj[prop] = source[prop];
}
});
return obj;
}
};
// END Miniature underscore impl
// Jed is a constructor function
var Jed = function ( options ) {
// Some minimal defaults
this.defaults = {
"locale_data" : {
"messages" : {
"" : {
"domain" : "messages",
"lang" : "en",
"plural_forms" : "nplurals=2; plural=(n != 1);"
}
// There are no default keys, though
}
},
// The default domain if one is missing
"domain" : "messages"
};
// Mix in the sent options with the default options
this.options = _.extend( {}, this.defaults, options );
this.textdomain( this.options.domain );
if ( options.domain && ! this.options.locale_data[ this.options.domain ] ) {
throw new Error('Text domain set to non-existent domain: `' + options.domain + '`');
}
};
// The gettext spec sets this character as the default
// delimiter for context lookups.
// e.g.: context\u0004key
// If your translation company uses something different,
// just change this at any time and it will use that instead.
Jed.context_delimiter = String.fromCharCode( 4 );
function getPluralFormFunc ( plural_form_string ) {
return Jed.PF.compile( plural_form_string || "nplurals=2; plural=(n != 1);");
}
function Chain( key, i18n ){
this._key = key;
this._i18n = i18n;
}
// Create a chainable api for adding args prettily
_.extend( Chain.prototype, {
onDomain : function ( domain ) {
this._domain = domain;
return this;
},
withContext : function ( context ) {
this._context = context;
return this;
},
ifPlural : function ( num, pkey ) {
this._val = num;
this._pkey = pkey;
return this;
},
fetch : function ( sArr ) {
if ( {}.toString.call( sArr ) != '[object Array]' ) {
sArr = [].slice.call(arguments);
}
return ( sArr && sArr.length ? Jed.sprintf : function(x){ return x; } )(
this._i18n.dcnpgettext(this._domain, this._context, this._key, this._pkey, this._val),
sArr
);
}
});
// Add functions to the Jed prototype.
// These will be the functions on the object that's returned
// from creating a `new Jed()`
// These seem redundant, but they gzip pretty well.
_.extend( Jed.prototype, {
// The sexier api start point
translate : function ( key ) {
return new Chain( key, this );
},
textdomain : function ( domain ) {
if ( ! domain ) {
return this._textdomain;
}
this._textdomain = domain;
},
gettext : function ( key ) {
return this.dcnpgettext.call( this, undef, undef, key );
},
dgettext : function ( domain, key ) {
return this.dcnpgettext.call( this, domain, undef, key );
},
dcgettext : function ( domain , key /*, category */ ) {
// Ignores the category anyways
return this.dcnpgettext.call( this, domain, undef, key );
},
ngettext : function ( skey, pkey, val ) {
return this.dcnpgettext.call( this, undef, undef, skey, pkey, val );
},
dngettext : function ( domain, skey, pkey, val ) {
return this.dcnpgettext.call( this, domain, undef, skey, pkey, val );
},
dcngettext : function ( domain, skey, pkey, val/*, category */) {
return this.dcnpgettext.call( this, domain, undef, skey, pkey, val );
},
pgettext : function ( context, key ) {
return this.dcnpgettext.call( this, undef, context, key );
},
dpgettext : function ( domain, context, key ) {
return this.dcnpgettext.call( this, domain, context, key );
},
dcpgettext : function ( domain, context, key/*, category */) {
return this.dcnpgettext.call( this, domain, context, key );
},
npgettext : function ( context, skey, pkey, val ) {
return this.dcnpgettext.call( this, undef, context, skey, pkey, val );
},
dnpgettext : function ( domain, context, skey, pkey, val ) {
return this.dcnpgettext.call( this, domain, context, skey, pkey, val );
},
// The most fully qualified gettext function. It has every option.
// Since it has every option, we can use it from every other method.
// This is the bread and butter.
// Technically there should be one more argument in this function for 'Category',
// but since we never use it, we might as well not waste the bytes to define it.
dcnpgettext : function ( domain, context, singular_key, plural_key, val ) {
// Set some defaults
plural_key = plural_key || singular_key;
// Use the global domain default if one
// isn't explicitly passed in
domain = domain || this._textdomain;
// Default the value to the singular case
val = typeof val == 'undefined' ? 1 : val;
var fallback;
// Handle special cases
// No options found
if ( ! this.options ) {
// There's likely something wrong, but we'll return the correct key for english
// We do this by instantiating a brand new Jed instance with the default set
// for everything that could be broken.
fallback = new Jed();
return fallback.dcnpgettext.call( fallback, undefined, undefined, singular_key, plural_key, val );
}
// No translation data provided
if ( ! this.options.locale_data ) {
throw new Error('No locale data provided.');
}
if ( ! this.options.locale_data[ domain ] ) {
throw new Error('Domain `' + domain + '` was not found.');
}
if ( ! this.options.locale_data[ domain ][ "" ] ) {
throw new Error('No locale meta information provided.');
}
// Make sure we have a truthy key. Otherwise we might start looking
// into the empty string key, which is the options for the locale
// data.
if ( ! singular_key ) {
throw new Error('No translation key found.');
}
// Handle invalid numbers, but try casting strings for good measure
if ( typeof val != 'number' ) {
val = parseInt( val, 10 );
if ( isNaN( val ) ) {
throw new Error('The number that was passed in is not a number.');
}
}
var key = context ? context + Jed.context_delimiter + singular_key : singular_key,
locale_data = this.options.locale_data,
dict = locale_data[ domain ],
pluralForms = dict[""].plural_forms || (locale_data.messages || this.defaults.locale_data.messages)[""].plural_forms,
val_idx = getPluralFormFunc(pluralForms)(val) + 1,
val_list,
res;
// Throw an error if a domain isn't found
if ( ! dict ) {
throw new Error('No domain named `' + domain + '` could be found.');
}
val_list = dict[ key ];
// If there is no match, then revert back to
// english style singular/plural with the keys passed in.
if ( ! val_list || val_idx >= val_list.length ) {
if (this.options.missing_key_callback) {
this.options.missing_key_callback(key);
}
res = [ null, singular_key, plural_key ];
return res[ getPluralFormFunc(pluralForms)( val ) + 1 ];
}
res = val_list[ val_idx ];
// This includes empty strings on purpose
if ( ! res ) {
res = [ null, singular_key, plural_key ];
return res[ getPluralFormFunc(pluralForms)( val ) + 1 ];
}
return res;
}
});
// We add in sprintf capabilities for post translation value interolation
// This is not internally used, so you can remove it if you have this
// available somewhere else, or want to use a different system.
// We _slightly_ modify the normal sprintf behavior to more gracefully handle
// undefined values.
/**
sprintf() for JavaScript 0.7-beta1
http://www.diveintojavascript.com/projects/javascript-sprintf
Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of sprintf() for JavaScript nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
var sprintf = (function() {
function get_type(variable) {
return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
}
function str_repeat(input, multiplier) {
for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
return output.join('');
}
var str_format = function() {
if (!str_format.cache.hasOwnProperty(arguments[0])) {
str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
}
return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
};
str_format.format = function(parse_tree, argv) {
var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
for (i = 0; i < tree_length; i++) {
node_type = get_type(parse_tree[i]);
if (node_type === 'string') {
output.push(parse_tree[i]);
}
else if (node_type === 'array') {
match = parse_tree[i]; // convenience purposes only
if (match[2]) { // keyword argument
arg = argv[cursor];
for (k = 0; k < match[2].length; k++) {
if (!arg.hasOwnProperty(match[2][k])) {
throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
}
arg = arg[match[2][k]];
}
}
else if (match[1]) { // positional argument (explicit)
arg = argv[match[1]];
}
else { // positional argument (implicit)
arg = argv[cursor++];
}
if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
}
// Jed EDIT
if ( typeof arg == 'undefined' || arg === null ) {
arg = '';
}
// Jed EDIT
switch (match[8]) {
case 'b': arg = arg.toString(2); break;
case 'c': arg = String.fromCharCode(arg); break;
case 'd': arg = parseInt(arg, 10); break;
case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
case 'o': arg = arg.toString(8); break;
case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
case 'u': arg = Math.abs(arg); break;
case 'x': arg = arg.toString(16); break;
case 'X': arg = arg.toString(16).toUpperCase(); break;
}
arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
pad_length = match[6] - String(arg).length;
pad = match[6] ? str_repeat(pad_character, pad_length) : '';
output.push(match[5] ? arg + pad : pad + arg);
}
}
return output.join('');
};
str_format.cache = {};
str_format.parse = function(fmt) {
var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
while (_fmt) {
if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
parse_tree.push(match[0]);
}
else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
parse_tree.push('%');
}
else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
if (match[2]) {
arg_names |= 1;
var field_list = [], replacement_field = match[2], field_match = [];
if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
}
else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
field_list.push(field_match[1]);
}
else {
throw('[sprintf] huh?');
}
}
}
else {
throw('[sprintf] huh?');
}
match[2] = field_list;
}
else {
arg_names |= 2;
}
if (arg_names === 3) {
throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
}
parse_tree.push(match);
}
else {
throw('[sprintf] huh?');
}
_fmt = _fmt.substring(match[0].length);
}
return parse_tree;
};
return str_format;
})();
var vsprintf = function(fmt, argv) {
argv.unshift(fmt);
return sprintf.apply(null, argv);
};
Jed.parse_plural = function ( plural_forms, n ) {
plural_forms = plural_forms.replace(/n/g, n);
return Jed.parse_expression(plural_forms);
};
Jed.sprintf = function ( fmt, args ) {
if ( {}.toString.call( args ) == '[object Array]' ) {
return vsprintf( fmt, [].slice.call(args) );
}
return sprintf.apply(this, [].slice.call(arguments) );
};
Jed.prototype.sprintf = function () {
return Jed.sprintf.apply(this, arguments);
};
// END sprintf Implementation
// Start the Plural forms section
// This is a full plural form expression parser. It is used to avoid
// running 'eval' or 'new Function' directly against the plural
// forms.
//
// This can be important if you get translations done through a 3rd
// party vendor. I encourage you to use this instead, however, I
// also will provide a 'precompiler' that you can use at build time
// to output valid/safe function representations of the plural form
// expressions. This means you can build this code out for the most
// part.
Jed.PF = {};
Jed.PF.parse = function ( p ) {
var plural_str = Jed.PF.extractPluralExpr( p );
return Jed.PF.parser.parse.call(Jed.PF.parser, plural_str);
};
Jed.PF.compile = function ( p ) {
// Handle trues and falses as 0 and 1
function imply( val ) {
return (val === true ? 1 : val ? val : 0);
}
var ast = Jed.PF.parse( p );
return function ( n ) {
return imply( Jed.PF.interpreter( ast )( n ) );
};
};
Jed.PF.interpreter = function ( ast ) {
return function ( n ) {
var res;
switch ( ast.type ) {
case 'GROUP':
return Jed.PF.interpreter( ast.expr )( n );
case 'TERNARY':
if ( Jed.PF.interpreter( ast.expr )( n ) ) {
return Jed.PF.interpreter( ast.truthy )( n );
}
return Jed.PF.interpreter( ast.falsey )( n );
case 'OR':
return Jed.PF.interpreter( ast.left )( n ) || Jed.PF.interpreter( ast.right )( n );
case 'AND':
return Jed.PF.interpreter( ast.left )( n ) && Jed.PF.interpreter( ast.right )( n );
case 'LT':
return Jed.PF.interpreter( ast.left )( n ) < Jed.PF.interpreter( ast.right )( n );
case 'GT':
return Jed.PF.interpreter( ast.left )( n ) > Jed.PF.interpreter( ast.right )( n );
case 'LTE':
return Jed.PF.interpreter( ast.left )( n ) <= Jed.PF.interpreter( ast.right )( n );
case 'GTE':
return Jed.PF.interpreter( ast.left )( n ) >= Jed.PF.interpreter( ast.right )( n );
case 'EQ':
return Jed.PF.interpreter( ast.left )( n ) == Jed.PF.interpreter( ast.right )( n );
case 'NEQ':
return Jed.PF.interpreter( ast.left )( n ) != Jed.PF.interpreter( ast.right )( n );
case 'MOD':
return Jed.PF.interpreter( ast.left )( n ) % Jed.PF.interpreter( ast.right )( n );
case 'VAR':
return n;
case 'NUM':
return ast.val;
default:
throw new Error("Invalid Token found.");
}
};
};
Jed.PF.extractPluralExpr = function ( p ) {
// trim first
p = p.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
if (! /;\s*$/.test(p)) {
p = p.concat(';');
}
var nplurals_re = /nplurals\=(\d+);/,
plural_re = /plural\=(.*);/,
nplurals_matches = p.match( nplurals_re ),
res = {},
plural_matches;
// Find the nplurals number
if ( nplurals_matches.length > 1 ) {
res.nplurals = nplurals_matches[1];
}
else {
throw new Error('nplurals not found in plural_forms string: ' + p );
}
// remove that data to get to the formula
p = p.replace( nplurals_re, "" );
plural_matches = p.match( plural_re );
if (!( plural_matches && plural_matches.length > 1 ) ) {
throw new Error('`plural` expression not found: ' + p);
}
return plural_matches[ 1 ];
};
/* Jison generated parser */
Jed.PF.parser = (function(){
var parser = {trace: function trace() { },
yy: {},
symbols_: {"error":2,"expressions":3,"e":4,"EOF":5,"?":6,":":7,"||":8,"&&":9,"<":10,"<=":11,">":12,">=":13,"!=":14,"==":15,"%":16,"(":17,")":18,"n":19,"NUMBER":20,"$accept":0,"$end":1},
terminals_: {2:"error",5:"EOF",6:"?",7:":",8:"||",9:"&&",10:"<",11:"<=",12:">",13:">=",14:"!=",15:"==",16:"%",17:"(",18:")",19:"n",20:"NUMBER"},
productions_: [0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]],
performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
var $0 = $$.length - 1;
switch (yystate) {
case 1: return { type : 'GROUP', expr: $$[$0-1] };
break;
case 2:this.$ = { type: 'TERNARY', expr: $$[$0-4], truthy : $$[$0-2], falsey: $$[$0] };
break;
case 3:this.$ = { type: "OR", left: $$[$0-2], right: $$[$0] };
break;
case 4:this.$ = { type: "AND", left: $$[$0-2], right: $$[$0] };
break;
case 5:this.$ = { type: 'LT', left: $$[$0-2], right: $$[$0] };
break;
case 6:this.$ = { type: 'LTE', left: $$[$0-2], right: $$[$0] };
break;
case 7:this.$ = { type: 'GT', left: $$[$0-2], right: $$[$0] };
break;
case 8:this.$ = { type: 'GTE', left: $$[$0-2], right: $$[$0] };
break;
case 9:this.$ = { type: 'NEQ', left: $$[$0-2], right: $$[$0] };
break;
case 10:this.$ = { type: 'EQ', left: $$[$0-2], right: $$[$0] };
break;
case 11:this.$ = { type: 'MOD', left: $$[$0-2], right: $$[$0] };
break;
case 12:this.$ = { type: 'GROUP', expr: $$[$0-1] };
break;
case 13:this.$ = { type: 'VAR' };
break;
case 14:this.$ = { type: 'NUM', val: Number(yytext) };
break;
}
},
table: [{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}],
defaultActions: {6:[2,1]},
parseError: function parseError(str, hash) {
throw new Error(str);
},
parse: function parse(input) {
var self = this,
stack = [0],
vstack = [null], // semantic value stack
lstack = [], // location stack
table = this.table,
yytext = '',
yylineno = 0,
yyleng = 0,
recovering = 0,
TERROR = 2,
EOF = 1;
//this.reductionCount = this.shiftCount = 0;
this.lexer.setInput(input);
this.lexer.yy = this.yy;
this.yy.lexer = this.lexer;
if (typeof this.lexer.yylloc == 'undefined')
this.lexer.yylloc = {};
var yyloc = this.lexer.yylloc;
lstack.push(yyloc);
if (typeof this.yy.parseError === 'function')
this.parseError = this.yy.parseError;
function popStack (n) {
stack.length = stack.length - 2*n;
vstack.length = vstack.length - n;
lstack.length = lstack.length - n;
}
function lex() {
var token;
token = self.lexer.lex() || 1; // $end = 1
// if token isn't its numeric value, convert
if (typeof token !== 'number') {
token = self.symbols_[token] || token;
}
return token;
}
var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected;
while (true) {
// retreive state number from top of stack
state = stack[stack.length-1];
// use default actions if available
if (this.defaultActions[state]) {
action = this.defaultActions[state];
} else {
if (symbol == null)
symbol = lex();
// read action for current state and first input
action = table[state] && table[state][symbol];
}
// handle parse error
_handle_error:
if (typeof action === 'undefined' || !action.length || !action[0]) {
if (!recovering) {
// Report error
expected = [];
for (p in table[state]) if (this.terminals_[p] && p > 2) {
expected.push("'"+this.terminals_[p]+"'");
}
var errStr = '';
if (this.lexer.showPosition) {
errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'";
} else {
errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " +
(symbol == 1 /*EOF*/ ? "end of input" :
("'"+(this.terminals_[symbol] || symbol)+"'"));
}
this.parseError(errStr,
{text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
}
// just recovered from another error
if (recovering == 3) {
if (symbol == EOF) {
throw new Error(errStr || 'Parsing halted.');
}
// discard current lookahead and grab another
yyleng = this.lexer.yyleng;
yytext = this.lexer.yytext;
yylineno = this.lexer.yylineno;
yyloc = this.lexer.yylloc;
symbol = lex();
}
// try to recover from error
while (1) {
// check for error recovery rule in this state
if ((TERROR.toString()) in table[state]) {
break;
}
if (state == 0) {
throw new Error(errStr || 'Parsing halted.');
}
popStack(1);
state = stack[stack.length-1];
}
preErrorSymbol = symbol; // save the lookahead token
symbol = TERROR; // insert generic error symbol as new lookahead
state = stack[stack.length-1];
action = table[state] && table[state][TERROR];
recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
}
// this shouldn't happen, unless resolve defaults are off
if (action[0] instanceof Array && action.length > 1) {
throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);
}
switch (action[0]) {
case 1: // shift
//this.shiftCount++;
stack.push(symbol);
vstack.push(this.lexer.yytext);
lstack.push(this.lexer.yylloc);
stack.push(action[1]); // push state
symbol = null;
if (!preErrorSymbol) { // normal execution/no error
yyleng = this.lexer.yyleng;
yytext = this.lexer.yytext;
yylineno = this.lexer.yylineno;
yyloc = this.lexer.yylloc;
if (recovering > 0)
recovering--;
} else { // error just occurred, resume old lookahead f/ before error
symbol = preErrorSymbol;
preErrorSymbol = null;
}
break;
case 2: // reduce
//this.reductionCount++;
len = this.productions_[action[1]][1];
// perform semantic action
yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
// default location, uses first token for firsts, last for lasts
yyval._$ = {
first_line: lstack[lstack.length-(len||1)].first_line,
last_line: lstack[lstack.length-1].last_line,
first_column: lstack[lstack.length-(len||1)].first_column,
last_column: lstack[lstack.length-1].last_column
};
r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
if (typeof r !== 'undefined') {
return r;
}
// pop off stack
if (len) {
stack = stack.slice(0,-1*len*2);
vstack = vstack.slice(0, -1*len);
lstack = lstack.slice(0, -1*len);
}
stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce)
vstack.push(yyval.$);
lstack.push(yyval._$);
// goto new state = table[STATE][NONTERMINAL]
newState = table[stack[stack.length-2]][stack[stack.length-1]];
stack.push(newState);
break;
case 3: // accept
return true;
}
}
return true;
}};/* Jison generated lexer */
var lexer = (function(){
var lexer = ({EOF:1,
parseError:function parseError(str, hash) {
if (this.yy.parseError) {
this.yy.parseError(str, hash);
} else {
throw new Error(str);
}
},
setInput:function (input) {
this._input = input;
this._more = this._less = this.done = false;
this.yylineno = this.yyleng = 0;
this.yytext = this.matched = this.match = '';
this.conditionStack = ['INITIAL'];
this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
return this;
},
input:function () {
var ch = this._input[0];
this.yytext+=ch;
this.yyleng++;
this.match+=ch;
this.matched+=ch;
var lines = ch.match(/\n/);
if (lines) this.yylineno++;
this._input = this._input.slice(1);
return ch;
},
unput:function (ch) {
this._input = ch + this._input;
return this;
},
more:function () {
this._more = true;
return this;
},
pastInput:function () {
var past = this.matched.substr(0, this.matched.length - this.match.length);
return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
},
upcomingInput:function () {
var next = this.match;
if (next.length < 20) {
next += this._input.substr(0, 20-next.length);
}
return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
},
showPosition:function () {
var pre = this.pastInput();
var c = new Array(pre.length + 1).join("-");
return pre + this.upcomingInput() + "\n" + c+"^";
},
next:function () {
if (this.done) {
return this.EOF;
}
if (!this._input) this.done = true;
var token,
match,
col,
lines;
if (!this._more) {
this.yytext = '';
this.match = '';
}
var rules = this._currentRules();
for (var i=0;i < rules.length; i++) {
match = this._input.match(this.rules[rules[i]]);
if (match) {
lines = match[0].match(/\n.*/g);
if (lines) this.yylineno += lines.length;
this.yylloc = {first_line: this.yylloc.last_line,
last_line: this.yylineno+1,
first_column: this.yylloc.last_column,
last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}
this.yytext += match[0];
this.match += match[0];
this.matches = match;
this.yyleng = this.yytext.length;
this._more = false;
this._input = this._input.slice(match[0].length);
this.matched += match[0];
token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]);
if (token) return token;
else return;
}
}
if (this._input === "") {
return this.EOF;
} else {
this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
{text: "", token: null, line: this.yylineno});
}
},
lex:function lex() {
var r = this.next();
if (typeof r !== 'undefined') {
return r;
} else {
return this.lex();
}
},
begin:function begin(condition) {
this.conditionStack.push(condition);
},
popState:function popState() {
return this.conditionStack.pop();
},
_currentRules:function _currentRules() {
return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
},
topState:function () {
return this.conditionStack[this.conditionStack.length-2];
},
pushState:function begin(condition) {
this.begin(condition);
}});
lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
var YYSTATE=YY_START;
switch($avoiding_name_collisions) {
case 0:/* skip whitespace */
break;
case 1:return 20
break;
case 2:return 19
break;
case 3:return 8
break;
case 4:return 9
break;
case 5:return 6
break;
case 6:return 7
break;
case 7:return 11
break;
case 8:return 13
break;
case 9:return 10
break;
case 10:return 12
break;
case 11:return 14
break;
case 12:return 15
break;
case 13:return 16
break;
case 14:return 17
break;
case 15:return 18
break;
case 16:return 5
break;
case 17:return 'INVALID'
break;
}
};
lexer.rules = [/^\s+/,/^[0-9]+(\.[0-9]+)?\b/,/^n\b/,/^\|\|/,/^&&/,/^\?/,/^:/,/^<=/,/^>=/,/^</,/^>/,/^!=/,/^==/,/^%/,/^\(/,/^\)/,/^$/,/^./];
lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"inclusive":true}};return lexer;})()
parser.lexer = lexer;
return parser;
})();
// End parser
// Handle node, amd, and global systems
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = Jed;
}
exports.Jed = Jed;
}
else {
if (typeof define === 'function' && define.amd) {
define('jed', function() {
return Jed;
});
}
// Leak a global regardless of module system
root['Jed'] = Jed;
}
})(this);
......@@ -180,7 +180,7 @@
xmlns: Strophe.NS.CLIENT
}).t(message);
msg.up();
if (html_message !== null) {
if (html_message != null) {
msg.c("html", {xmlns: Strophe.NS.XHTML_IM}).c("body", {xmlns: Strophe.NS.XHTML}).h(html_message);
if (msg.node.childNodes.length === 0) {
......
......@@ -11,30 +11,31 @@ 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: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
.PHONY: help clean html dirhtml singlehtml json htmlhelp devhelp epub latex latexpdf text changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " release to make a new minified release"
@echo " html to make standalone HTML files"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " epub to export the documentation to epub"
@echo " gettext to make PO message catalogs of the documentation"
@echo " html to make standalone HTML files of the documentation"
@echo " htmlhelp to make HTML files and a HTML help project from the documentation"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " pot generates a gettext POT file to be used for translations"
@echo " release to make a new minified release"
@echo " singlehtml to make a single large HTML file"
@echo " texinfo to make Texinfo files"
@echo " text to make text files"
pot:
xgettext --keyword=__ --keyword=translate --from-code=UTF-8 --output=locale/converse.pot converse.js --package-name=Converse.js --copyright-holder="Jan-Carel Brand" --package-version=0.4 -c --language="python";
release:
r.js -o build.js
......@@ -57,11 +58,6 @@ singlehtml:
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
......@@ -73,15 +69,6 @@ htmlhelp:
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/sphinx.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/sphinx.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
......@@ -114,11 +101,6 @@ text:
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
......
......@@ -2,6 +2,14 @@
baseUrl: ".",
paths: {
"jquery": "Libraries/require-jquery",
"jed": "Libraries/jed",
"locales": "locale/locales",
"af": "locale/af/LC_MESSAGES/af",
"en": "locale/en/LC_MESSAGES/en",
"de": "locale/de/LC_MESSAGES/de",
"es": "locale/es/LC_MESSAGES/es",
"hu": "locale/hu/LC_MESSAGES/hu",
"it": "locale/it/LC_MESSAGES/it",
"sjcl": "Libraries/sjcl",
"tinysort": "Libraries/jquery.tinysort",
"underscore": "Libraries/underscore",
......@@ -14,5 +22,5 @@
"strophe.disco": "Libraries/strophe.disco"
},
name: "main",
out: "converse.0.3.min.js"
out: "converse.min.js"
})
.hidden{display:none;}.locked{background:url(images/emblem-readonly.png) no-repeat right;padding-right:22px;}span.spinner{background:url(images/spinner.gif) no-repeat center;width:22px;height:22px;padding:0 2px 0 2px;display:block;}span.spinner.hor_centered{left:40%;position:absolute;}img.spinner{width:auto;border:none;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;margin:0;padding:0 5px 0 5px;}img.centered{position:absolute;top:30%;left:50%;margin:0 0 0 -25%;}#chatpanel{z-index:99;position:fixed;bottom:0;right:0;height:332px;width:auto;}#toggle-controlbox{position:fixed;font-size:80%;bottom:0;right:0;border-top-right-radius:4px;border-top-left-radius:4px;background:#e3e2e2;border:1px solid #c3c3c3;border-bottom:none;padding:.25em .5em;margin-right:1em;height:1.1em;}#connecting-to-chat{background:url(images/spinner.gif) no-repeat left;padding-left:1.4em;}.chat-head{color:#fff;margin:0;font-size:100%;border-top-right-radius:4px;border-top-left-radius:4px;padding:3px 0 3px 7px;}.chat-head-chatbox{background-color:#596a72;background-color:rgba(89,106,114,1);}.chat-head-chatroom{background-color:#2D617A;}.chatroom .chat-body{height:272px;background-color:white;border-radius:4px;}.chatroom .chat-area{float:left;width:200px;}.chatroom .chat{overflow:auto;height:400px;border:solid 1px #ccc;}.chatroom .participants{float:left;width:99px;height:272px;background-color:white;overflow:auto;border-right:1px solid #999;border-bottom:1px solid #999;border-bottom-right-radius:4px;}.participants ul.participant-list li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;font-size:12px;padding:.5em 0 0 .5em;cursor:default;}ul.participant-list li.moderator{color:#FE0007;}.chatroom form.sendXMPPMessage{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.chatroom .participant-list{list-style:none;}.chat-blink{background-color:#176689;border-right:1px solid #176689;border-left:1px solid #176689;}.chat-content{padding:.3em;font-size:13px;color:#333;height:193px;overflow-y:auto;border:1px solid #999;border-bottom:0;border-top:0;background-color:#fff;line-height:1.3em;}.chat-textarea{border:0;height:50px;}.chat-textarea-chatbox-selected{border:1px solid #578308;margin:0;}.chat-textarea-chatroom-selected{border:2px solid #2D617A;margin:0;}.chat-info{color:#666;}.chat-message-me{font-weight:bold;color:#436976;}.chat-message-room{font-weight:bold;color:#4B7003;}.chat-message-them{font-weight:bold;color:#F62817;white-space:nowrap;max-width:100px;text-overflow:ellipsis;overflow:hidden;display:inline-block;}.chat-event,.chat-date,.chat-help{color:#808080;}li.chat-help{padding-left:10px;}.chat-date{display:inline-block;padding-top:10px;}div#settings,div#chatrooms,div#login-dialog{height:272px;}p.not-implemented{margin-top:3em;margin-left:.3em;color:#808080;}div.delayed .chat-message-them{color:#FB5D50;}div.delayed .chat-message-me{color:#7EABBB;}input.error{border:1px solid red;}.conn-feedback.error{color:red;}.chat-message-error{color:#76797C;font-size:90%;font-weight:normal;}.chat-head .avatar{float:left;margin-right:6px;}div.chat-title{color:white;font-weight:bold;line-height:15px;display:block;margin-top:2px;margin-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:rgba(0,0,0,0.51) 0 -1px 0;height:1em;}.chat-head-chatbox,.chat-head-chatroom{background:linear-gradient(top,rgba(206,220,231,1) 0,rgba(89,106,114,1) 100%);height:33px;position:relative;}p.user-custom-message,p.chatroom-topic{font-size:80%;font-style:italic;height:1.3em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0;}.activated{display:block!important;}a.subscribe-to-user{padding-left:2em;font-weight:bold;}dl.add-converse-contact{margin:0 0 0 .5em;}.fancy-dropdown{border:1px solid #ddd;height:22px;}.fancy-dropdown a.choose-xmpp-status,.fancy-dropdown a.toggle-xmpp-contact-form{text-shadow:0 1px 0 rgba(255,255,255,1);padding-left:2em;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;float:left;}#fancy-xmpp-status-select a.change-xmpp-status-message{background:url('images/pencil_icon.png') no-repeat right 3px;float:right;clear:right;height:22px;}ul#found-users{padding:10px 0 5px 5px;border:0;}form.search-xmpp-contact{margin:0;padding-left:5px;padding:0 0 5px 5px;}form.search-xmpp-contact input{width:8em;}.oc-chat-head{margin:0;color:#FFF;border-top-right-radius:4px;border-top-left-radius:4px;height:35px;clear:right;background-color:#5390C8;padding:3px 0 0 0;}a.configure-chatroom-button,a.close-chatbox-button{margin-top:.2em;margin-right:.5em;cursor:pointer;float:right;width:12px;-moz-box-shadow:inset 0 1px 0 0 #fff;-webkit-box-shadow:inset 0 1px 0 0 #fff;box-shadow:inset 0 1px 0 0 #fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0.05,#fff),color-stop(1,#f6f6f6));background:-moz-linear-gradient(center top,#fff 5%,#f6f6f6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#f6f6f6');-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;border:1px solid #888;display:inline-block;color:#666!important;font-family:arial;font-size:12px;font-weight:bold;text-decoration:none;text-shadow:1px 1px 0 #fff;}a.configure-chatroom-button{padding:0 4px;background:#fff url('images/preferences-system.png') no-repeat center center;}.close-chatbox-button{padding:0 2px 0 6px;}.close-chatbox-button:hover{background:-webkit-gradient(linear,left top,left bottom,color-stop(0.05,#f6f6f6),color-stop(1,#fff));background:-moz-linear-gradient(center top,#f6f6f6 5%,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6',endColorstr='#ffffff');background-color:#f6f6f6;}.close-chatbox-button:active{position:relative;top:1px;}.oc-chat-content dt{margin:0;padding-top:.5em;}.chatroom-form-container{color:#666;padding:5px;height:262px;overflow-y:auto;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}.chatroom-form{background:white;font-size:12px;padding:0;}.chat-body p{font-size:14px;color:#666;margin:5px;}.chatroom-form legend{font-size:14px;font-weight:bold;margin-bottom:5px;}.chatroom-form label{font-weight:bold;display:block;clear:both;}.chatroom-form label input,.chatroom-form label select{float:right;}#converse-roster dd.odd{background-color:#DCEAC5;}#converse-roster dd.current-xmpp-contact{clear:both;}#converse-roster dd.current-xmpp-contact,#converse-roster dd.current-xmpp-contact:hover{background:url(images/user_online_panel.png) no-repeat 5px 2px;}#converse-roster dd.current-xmpp-contact.offline:hover,#converse-roster dd.current-xmpp-contact.unavailable:hover,#converse-roster dd.current-xmpp-contact.offline,#converse-roster dd.current-xmpp-contact.unavailable{background:url(images/user_offline_panel.png) no-repeat 5px 2px;}#converse-roster dd.current-xmpp-contact.dnd,#converse-roster dd.current-xmpp-contact.dnd:hover{background:url(images/user_busy_panel.png) no-repeat 5px 2px;}#converse-roster dd.current-xmpp-contact.xa,#converse-roster dd.current-xmpp-contact.xa:hover,#converse-roster dd.current-xmpp-contact.away,#converse-roster dd.current-xmpp-contact.away:hover{background:url(images/user_away_panel.png) no-repeat 5px 2px;}#converse-roster dd.requesting-xmpp-contact button{margin-left:.5em;}#converse-roster dd a,#converse-roster dd span{text-shadow:0 1px 0 rgba(250,250,250,1);display:inline-block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}#converse-roster dd a{margin-left:1.3em;}#converse-roster dd span{width:125px;}.remove-xmpp-contact-dialog .ui-dialog-buttonpane{border:none;}#converse-roster{height:200px;overflow-y:auto;overflow-x:hidden;width:100%;margin:0;position:relative;top:0;border:none;margin-top:.5em;}#available-chatrooms{height:183px;overflow-y:auto;}#available-chatrooms dd{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;width:170px;}#available-chatrooms dt,#converse-roster dt{font-weight:normal;font-size:13px;color:#666;border:none;padding:.3em .5em .3em .5em;text-shadow:0 1px 0 rgba(250,250,250,1);}#converse-roster dt{display:none;}dd.available-chatroom,#converse-roster dd{font-weight:bold;border:none;display:block;padding:0 .5em 0 .5em;color:#666;text-shadow:0 1px 0 rgba(250,250,250,1);}.room-info{font-size:11px;font-style:normal;font-weight:normal;}li.room-info{display:block;margin-left:5px;}p.room-info{margin:0;padding:0;display:block;white-space:normal;}a.room-info{background:url('images/information.png') no-repeat right top;width:22px;height:22px;float:right;display:none;}a.open-room{display:inline-block;white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden;}dd.available-chatroom:hover a.room-info{display:inline-block;}dd.available-chatroom:hover a.open-room{width:75%;}#converse-roster dd a.remove-xmpp-contact{background:url('images/delete_icon.png') no-repeat right top;padding:0 0 1em 0;float:right;width:22px;margin:0;display:none;}#converse-roster dd:hover a.remove-xmpp-contact{display:inline-block;}#converse-roster dd:hover a.open-chat{width:75%;}.chatbox,.chatroom{box-shadow:1px 1px 5px 1px rgba(0,0,0,0.4);display:none;float:right;margin-right:15px;z-index:20;border-radius:4px;}.chatbox{width:201px;}.chatroom{width:300px;height:311px;}.oc-chat-content{height:272px;width:199px;padding:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}.oc-chat-content dd{margin-left:0;margin-bottom:0;padding:1em;}.oc-chat-content dd.odd{background-color:#DCEAC5;}div#controlbox-panes{background:-moz-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-ms-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-o-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(255,255,255,1)),color-stop(100%,rgba(240,240,240,1)));background:-webkit-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background-color:white;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border:1px solid #999;width:199px;}form#converse-login{background:white;padding:2em 0 .3em .5em;}form#converse-login input{display:block;width:90%;}form#converse-login .login-submit{margin-top:1em;width:auto;}form.set-xmpp-status{background:none;padding:.5em 0 .5em .5em;}form.add-chatroom{background:none;padding:.5em;}form.add-chatroom input[type=text]{width:172px;margin:3px;padding:1px;}form.add-chatroom input[type=button],form.add-chatroom input[type=submit]{width:50%;}select#select-xmpp-status{float:right;margin-right:.5em;}.chat-head #controlbox-tabs{text-align:center;display:inline;overflow:hidden;font-size:12px;list-style-type:none;}.chat-head #controlbox-tabs li{float:left;list-style:none;padding-left:0;text-shadow:white 0 1px 0;width:40%;}ul#controlbox-tabs li a{display:block;font-size:12px;height:34px;line-height:34px;margin:0;text-align:center;text-decoration:none;border:1px solid #999;border-top-right-radius:4px;border-top-left-radius:4px;color:#666;text-shadow:0 1px 0 rgba(250,250,250,1);}.chat-head #controlbox-tabs li a:hover{color:black;}.chat-head #controlbox-tabs li a{background-color:white;box-shadow:inset 0 0 8px rgba(0,0,0,0.2);}ul#controlbox-tabs a.current,ul#controlbox-tabs a.current:hover{box-shadow:none;color:#000;border-bottom:0;height:35px;}div#users,div#chatrooms,div#login-dialog,div#settings{border:0;font-size:14px;width:199px;background-color:white;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}form.sendXMPPMessage{background:white;border:1px solid #999;padding:.5em;margin:0;position:relative;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;border-top-left-radius:0;border-top-right-radius:0;height:54px;}form#set-custom-xmpp-status{float:left;padding:0;}#set-custom-xmpp-status button{padding:1px 2px 1px 1px;}.chatbox dl.dropdown{margin-right:.5em;margin-bottom:0;background-color:#f0f0f0;}.chatbox .dropdown dd,.dropdown dt,.dropdown ul{margin:0;padding:0;}.chatbox .dropdown dd{position:relative;}input.custom-xmpp-status{width:138px;}form.add-xmpp-contact{background:none;padding:5px;}form.add-xmpp-contact input{width:125px;}.chatbox .dropdown dt a span{cursor:pointer;display:block;padding:5px;}.chatbox .dropdown dd ul{padding:5px 0 5px 0;list-style:none;position:absolute;left:0;top:0;border:1px solid #ddd;border-top:0;width:99%;z-index:21;background-color:#f0f0f0;}.chatbox .dropdown li{list-style:none;padding-left:0;}.set-xmpp-status .dropdown dd ul{z-index:22;}.chatbox .dropdown a{padding:3px 0 0 25px;display:block;height:22px;}.chatbox .dropdown a.toggle-xmpp-contact-form{background:url('images/add_icon.png') no-repeat 4px 2px;}.chatbox .dropdown a.online{background:url(images/user_online_panel.png) no-repeat 3px 4px;}.chatbox .dropdown a.offline{background:url(images/user_offline_panel.png) no-repeat 3px 4px;}.chatbox .dropdown a.dnd{background:url(images/user_busy_panel.png) no-repeat 3px 4px;}.chatbox .dropdown a.away{background:url(images/user_away_panel.png) no-repeat 3px 4px;}.chatbox .dropdown dd ul a:hover{background-color:#bed6e5;}
\ No newline at end of file
......@@ -15,29 +15,18 @@ span.spinner {
display: block;
}
span.spinner.hor_centered {
left: 40%;
position: absolute;
}
img.spinner {
width: auto;
border: none;
box-shadow: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
margin: 0;
padding: 0 5px 0 5px;
}
img.centered {
span.spinner.centered {
position: absolute;
top: 30%;
left: 50%;
margin: 0 0 0 -25%;
}
span.spinner.hor_centered {
left: 40%;
position: absolute;
}
#chatpanel {
z-index: 99; /*--Keeps the panel on top of all other elements--*/
position: fixed;
......@@ -87,7 +76,8 @@ img.centered {
.chatroom .chat-body {
height: 272px;
background-color: white;
border-radius: 4px;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
}
.chatroom .chat-area {
......@@ -173,31 +163,36 @@ ul.participant-list li.moderator {
color:#666666;
}
.chat-message-room,
.chat-message-them,
.chat-message-me {
font-weight: bold;
color: #436976;
}
.chat-message-room {
font-weight: bold;
color: #4B7003;
}
.chat-message-them {
font-weight: bold;
color: #F62817;
white-space: nowrap;
max-width: 100px;
text-overflow: ellipsis;
overflow: hidden;
display: inline-block;
float: left;
padding-right: 3px;
}
.chat-message-them {
color: #F62817;
}
.chat-message-me {
color: #436976;
}
.chat-message-room {
color: #4B7003;
}
.chat-event, .chat-date, .chat-help {
.chat-event, .chat-date, .chat-info {
color: #808080;
}
li.chat-help {
li.chat-info {
padding-left: 10px;
}
......@@ -262,7 +257,7 @@ div.chat-title {
.chat-head-chatbox,
.chat-head-chatroom {
background: linear-gradient(top, rgba(206,220,231,1) 0%,rgba(89,106,114,1) 100%);
height: 33px;
height: 35px;
position: relative;
}
......@@ -304,6 +299,7 @@ dl.add-converse-contact {
text-overflow: ellipsis;
white-space: nowrap;
float: left;
width: 130px;
}
#fancy-xmpp-status-select a.change-xmpp-status-message {
......@@ -409,7 +405,8 @@ a.configure-chatroom-button {
.chat-body p {
font-size: 14px;
color: #666;
margin: 5px;
padding: 5px;
margin: 0;
}
.chatroom-form legend {
......@@ -498,17 +495,12 @@ a.configure-chatroom-button {
margin-top: 0.5em;
}
#available-chatrooms {
height: 183px;
overflow-y: auto;
}
#available-chatrooms dd {
overflow-x: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: inline-block;
width: 170px;
width: 165px;
}
#available-chatrooms dt,
......@@ -517,7 +509,7 @@ a.configure-chatroom-button {
font-size: 13px;
color: #666;
border: none;
padding: 0.3em 0.5em 0.3em 0.5em;
padding: 0em 0em 0.3em 0.5em;
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
}
......@@ -530,7 +522,7 @@ dd.available-chatroom,
font-weight: bold;
border: none;
display: block;
padding: 0 0.5em 0 0.5em;
padding: 0 0em 0 0.5em;
color: #666;
text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
}
......@@ -546,6 +538,10 @@ li.room-info {
margin-left: 5px;
}
div.room-info {
clear: left;
}
p.room-info {
margin: 0;
padding: 0;
......@@ -556,13 +552,13 @@ p.room-info {
a.room-info {
background: url('images/information.png') no-repeat right top;
width: 22px;
height: 22px;
float: right;
display: none;
clear: right;
}
a.open-room {
display: inline-block;
float: left;
white-space: nowrap;
text-overflow: ellipsis;
overflow-x: hidden;
......@@ -667,13 +663,12 @@ form.set-xmpp-status {
form.add-chatroom {
background: none;
padding: 0.5em;
padding: 3px;
}
form.add-chatroom input[type=text] {
width: 172px;
width: 95%;
margin: 3px;
padding: 1px;
}
form.add-chatroom input[type=button],
......@@ -748,6 +743,10 @@ div#settings {
border-bottom-left-radius: 4px;
}
div#chatrooms {
overflow-y: auto;
}
form.sendXMPPMessage {
background: white;
border: 1px solid #999;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
.hidden{display:none;}.locked{background:url(images/emblem-readonly.png) no-repeat right;padding-right:22px;}span.spinner{background:url(images/spinner.gif) no-repeat center;width:22px;height:22px;padding:0 2px 0 2px;display:block;}span.spinner.centered{position:absolute;top:30%;left:50%;margin:0 0 0 -25%;}span.spinner.hor_centered{left:40%;position:absolute;}#chatpanel{z-index:99;position:fixed;bottom:0;right:0;height:332px;width:auto;}#toggle-controlbox{position:fixed;font-size:80%;bottom:0;right:0;border-top-right-radius:4px;border-top-left-radius:4px;background:#e3e2e2;border:1px solid #c3c3c3;border-bottom:none;padding:.25em .5em;margin-right:1em;height:1.1em;}#connecting-to-chat{background:url(images/spinner.gif) no-repeat left;padding-left:1.4em;}.chat-head{color:#fff;margin:0;font-size:100%;border-top-right-radius:4px;border-top-left-radius:4px;padding:3px 0 3px 7px;}.chat-head-chatbox{background-color:#596a72;background-color:rgba(89,106,114,1);}.chat-head-chatroom{background-color:#2D617A;}.chatroom .chat-body{height:272px;background-color:white;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}.chatroom .chat-area{float:left;width:200px;}.chatroom .chat{overflow:auto;height:400px;border:solid 1px #ccc;}.chatroom .participants{float:left;width:99px;height:272px;background-color:white;overflow:auto;border-right:1px solid #999;border-bottom:1px solid #999;border-bottom-right-radius:4px;}.participants ul.participant-list li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;font-size:12px;padding:.5em 0 0 .5em;cursor:default;}ul.participant-list li.moderator{color:#FE0007;}.chatroom form.sendXMPPMessage{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.chatroom .participant-list{list-style:none;}.chat-blink{background-color:#176689;border-right:1px solid #176689;border-left:1px solid #176689;}.chat-content{padding:.3em;font-size:13px;color:#333;height:193px;overflow-y:auto;border:1px solid #999;border-bottom:0;border-top:0;background-color:#fff;line-height:1.3em;}.chat-textarea{border:0;height:50px;}.chat-textarea-chatbox-selected{border:1px solid #578308;margin:0;}.chat-textarea-chatroom-selected{border:2px solid #2D617A;margin:0;}.chat-info{color:#666;}.chat-message-room,.chat-message-them,.chat-message-me{font-weight:bold;white-space:nowrap;max-width:100px;text-overflow:ellipsis;overflow:hidden;display:inline-block;float:left;padding-right:3px;}.chat-message-them{color:#F62817;}.chat-message-me{color:#436976;}.chat-message-room{color:#4B7003;}.chat-event,.chat-date,.chat-info{color:#808080;}li.chat-info{padding-left:10px;}.chat-date{display:inline-block;padding-top:10px;}div#settings,div#chatrooms,div#login-dialog{height:272px;}p.not-implemented{margin-top:3em;margin-left:.3em;color:#808080;}div.delayed .chat-message-them{color:#FB5D50;}div.delayed .chat-message-me{color:#7EABBB;}input.error{border:1px solid red;}.conn-feedback.error{color:red;}.chat-message-error{color:#76797C;font-size:90%;font-weight:normal;}.chat-head .avatar{float:left;margin-right:6px;}div.chat-title{color:white;font-weight:bold;line-height:15px;display:block;margin-top:2px;margin-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-shadow:rgba(0,0,0,0.51) 0 -1px 0;height:1em;}.chat-head-chatbox,.chat-head-chatroom{background:linear-gradient(top,rgba(206,220,231,1) 0,rgba(89,106,114,1) 100%);height:35px;position:relative;}p.user-custom-message,p.chatroom-topic{font-size:80%;font-style:italic;height:1.3em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0;}.activated{display:block!important;}a.subscribe-to-user{padding-left:2em;font-weight:bold;}dl.add-converse-contact{margin:0 0 0 .5em;}.fancy-dropdown{border:1px solid #ddd;height:22px;}.fancy-dropdown a.choose-xmpp-status,.fancy-dropdown a.toggle-xmpp-contact-form{text-shadow:0 1px 0 rgba(255,255,255,1);padding-left:2em;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;float:left;width:130px;}#fancy-xmpp-status-select a.change-xmpp-status-message{background:url('images/pencil_icon.png') no-repeat right 3px;float:right;clear:right;height:22px;}ul#found-users{padding:10px 0 5px 5px;border:0;}form.search-xmpp-contact{margin:0;padding-left:5px;padding:0 0 5px 5px;}form.search-xmpp-contact input{width:8em;}.oc-chat-head{margin:0;color:#FFF;border-top-right-radius:4px;border-top-left-radius:4px;height:35px;clear:right;background-color:#5390C8;padding:3px 0 0 0;}a.configure-chatroom-button,a.close-chatbox-button{margin-top:.2em;margin-right:.5em;cursor:pointer;float:right;width:12px;-moz-box-shadow:inset 0 1px 0 0 #fff;-webkit-box-shadow:inset 0 1px 0 0 #fff;box-shadow:inset 0 1px 0 0 #fff;background:-webkit-gradient(linear,left top,left bottom,color-stop(0.05,#fff),color-stop(1,#f6f6f6));background:-moz-linear-gradient(center top,#fff 5%,#f6f6f6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#f6f6f6');-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;border:1px solid #888;display:inline-block;color:#666!important;font-family:arial;font-size:12px;font-weight:bold;text-decoration:none;text-shadow:1px 1px 0 #fff;}a.configure-chatroom-button{padding:0 4px;background:#fff url('images/preferences-system.png') no-repeat center center;}.close-chatbox-button{padding:0 2px 0 6px;}.close-chatbox-button:hover{background:-webkit-gradient(linear,left top,left bottom,color-stop(0.05,#f6f6f6),color-stop(1,#fff));background:-moz-linear-gradient(center top,#f6f6f6 5%,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6',endColorstr='#ffffff');background-color:#f6f6f6;}.close-chatbox-button:active{position:relative;top:1px;}.oc-chat-content dt{margin:0;padding-top:.5em;}.chatroom-form-container{color:#666;padding:5px;height:262px;overflow-y:auto;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}.chatroom-form{background:white;font-size:12px;padding:0;}.chat-body p{font-size:14px;color:#666;padding:5px;margin:0;}.chatroom-form legend{font-size:14px;font-weight:bold;margin-bottom:5px;}.chatroom-form label{font-weight:bold;display:block;clear:both;}.chatroom-form label input,.chatroom-form label select{float:right;}#converse-roster dd.odd{background-color:#DCEAC5;}#converse-roster dd.current-xmpp-contact{clear:both;}#converse-roster dd.current-xmpp-contact,#converse-roster dd.current-xmpp-contact:hover{background:url(images/user_online_panel.png) no-repeat 5px 2px;}#converse-roster dd.current-xmpp-contact.offline:hover,#converse-roster dd.current-xmpp-contact.unavailable:hover,#converse-roster dd.current-xmpp-contact.offline,#converse-roster dd.current-xmpp-contact.unavailable{background:url(images/user_offline_panel.png) no-repeat 5px 2px;}#converse-roster dd.current-xmpp-contact.dnd,#converse-roster dd.current-xmpp-contact.dnd:hover{background:url(images/user_busy_panel.png) no-repeat 5px 2px;}#converse-roster dd.current-xmpp-contact.xa,#converse-roster dd.current-xmpp-contact.xa:hover,#converse-roster dd.current-xmpp-contact.away,#converse-roster dd.current-xmpp-contact.away:hover{background:url(images/user_away_panel.png) no-repeat 5px 2px;}#converse-roster dd.requesting-xmpp-contact button{margin-left:.5em;}#converse-roster dd a,#converse-roster dd span{text-shadow:0 1px 0 rgba(250,250,250,1);display:inline-block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}#converse-roster dd a{margin-left:1.3em;}#converse-roster dd span{width:125px;}.remove-xmpp-contact-dialog .ui-dialog-buttonpane{border:none;}#converse-roster{height:200px;overflow-y:auto;overflow-x:hidden;width:100%;margin:0;position:relative;top:0;border:none;margin-top:.5em;}#available-chatrooms dd{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;width:165px;}#available-chatrooms dt,#converse-roster dt{font-weight:normal;font-size:13px;color:#666;border:none;padding:0 0 .3em .5em;text-shadow:0 1px 0 rgba(250,250,250,1);}#converse-roster dt{display:none;}dd.available-chatroom,#converse-roster dd{font-weight:bold;border:none;display:block;padding:0 0 0 .5em;color:#666;text-shadow:0 1px 0 rgba(250,250,250,1);}.room-info{font-size:11px;font-style:normal;font-weight:normal;}li.room-info{display:block;margin-left:5px;}div.room-info{clear:left;}p.room-info{margin:0;padding:0;display:block;white-space:normal;}a.room-info{background:url('images/information.png') no-repeat right top;width:22px;float:right;display:none;clear:right;}a.open-room{float:left;white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden;}dd.available-chatroom:hover a.room-info{display:inline-block;}dd.available-chatroom:hover a.open-room{width:75%;}#converse-roster dd a.remove-xmpp-contact{background:url('images/delete_icon.png') no-repeat right top;padding:0 0 1em 0;float:right;width:22px;margin:0;display:none;}#converse-roster dd:hover a.remove-xmpp-contact{display:inline-block;}#converse-roster dd:hover a.open-chat{width:75%;}.chatbox,.chatroom{box-shadow:1px 1px 5px 1px rgba(0,0,0,0.4);display:none;float:right;margin-right:15px;z-index:20;border-radius:4px;}.chatbox{width:201px;}.chatroom{width:300px;height:311px;}.oc-chat-content{height:272px;width:199px;padding:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}.oc-chat-content dd{margin-left:0;margin-bottom:0;padding:1em;}.oc-chat-content dd.odd{background-color:#DCEAC5;}div#controlbox-panes{background:-moz-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-ms-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-o-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(255,255,255,1)),color-stop(100%,rgba(240,240,240,1)));background:-webkit-linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background:linear-gradient(top,rgba(255,255,255,1) 0,rgba(240,240,240,1) 100%);background-color:white;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border:1px solid #999;width:199px;}form#converse-login{background:white;padding:2em 0 .3em .5em;}form#converse-login input{display:block;width:90%;}form#converse-login .login-submit{margin-top:1em;width:auto;}form.set-xmpp-status{background:none;padding:.5em 0 .5em .5em;}form.add-chatroom{background:none;padding:3px;}form.add-chatroom input[type=text]{width:95%;margin:3px;}form.add-chatroom input[type=button],form.add-chatroom input[type=submit]{width:50%;}select#select-xmpp-status{float:right;margin-right:.5em;}.chat-head #controlbox-tabs{text-align:center;display:inline;overflow:hidden;font-size:12px;list-style-type:none;}.chat-head #controlbox-tabs li{float:left;list-style:none;padding-left:0;text-shadow:white 0 1px 0;width:40%;}ul#controlbox-tabs li a{display:block;font-size:12px;height:34px;line-height:34px;margin:0;text-align:center;text-decoration:none;border:1px solid #999;border-top-right-radius:4px;border-top-left-radius:4px;color:#666;text-shadow:0 1px 0 rgba(250,250,250,1);}.chat-head #controlbox-tabs li a:hover{color:black;}.chat-head #controlbox-tabs li a{background-color:white;box-shadow:inset 0 0 8px rgba(0,0,0,0.2);}ul#controlbox-tabs a.current,ul#controlbox-tabs a.current:hover{box-shadow:none;color:#000;border-bottom:0;height:35px;}div#users,div#chatrooms,div#login-dialog,div#settings{border:0;font-size:14px;width:199px;background-color:white;border-bottom-right-radius:4px;border-bottom-left-radius:4px;}div#chatrooms{overflow-y:auto;}form.sendXMPPMessage{background:white;border:1px solid #999;padding:.5em;margin:0;position:relative;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;border-top-left-radius:0;border-top-right-radius:0;height:54px;}form#set-custom-xmpp-status{float:left;padding:0;}#set-custom-xmpp-status button{padding:1px 2px 1px 1px;}.chatbox dl.dropdown{margin-right:.5em;margin-bottom:0;background-color:#f0f0f0;}.chatbox .dropdown dd,.dropdown dt,.dropdown ul{margin:0;padding:0;}.chatbox .dropdown dd{position:relative;}input.custom-xmpp-status{width:138px;}form.add-xmpp-contact{background:none;padding:5px;}form.add-xmpp-contact input{width:125px;}.chatbox .dropdown dt a span{cursor:pointer;display:block;padding:5px;}.chatbox .dropdown dd ul{padding:5px 0 5px 0;list-style:none;position:absolute;left:0;top:0;border:1px solid #ddd;border-top:0;width:99%;z-index:21;background-color:#f0f0f0;}.chatbox .dropdown li{list-style:none;padding-left:0;}.set-xmpp-status .dropdown dd ul{z-index:22;}.chatbox .dropdown a{padding:3px 0 0 25px;display:block;height:22px;}.chatbox .dropdown a.toggle-xmpp-contact-form{background:url('images/add_icon.png') no-repeat 4px 2px;}.chatbox .dropdown a.online{background:url(images/user_online_panel.png) no-repeat 3px 4px;}.chatbox .dropdown a.offline{background:url(images/user_offline_panel.png) no-repeat 3px 4px;}.chatbox .dropdown a.dnd{background:url(images/user_busy_panel.png) no-repeat 3px 4px;}.chatbox .dropdown a.away{background:url(images/user_away_panel.png) no-repeat 3px 4px;}.chatbox .dropdown dd ul a:hover{background-color:#bed6e5;}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -15,22 +15,22 @@ Introduction
============
Even though you can connect to public XMPP servers on the `conversejs.org`_
website, *Converse.js* is not meant to be a "Software-as-a-service" (SaaS)
website, *Converse.js* is not really meant to be a "Software-as-a-service" (SaaS)
webchat.
Instead, its goal is to provide the means for website owners to add a tightly
integrated instant messaging service to their own sites.
As a website owner, you are expected to host *Converse.js* yourself, and to do some legwork to
properly configure and integrated it into your site.
properly configure and integrate it into your site.
The benefit in doing this, is that your users have a much more streamlined and integrated
webchat experience and that you have control over the data. The latter being a
requirement for many sites dealing with sensitive information.
You'll need to set up your own XMPP server and in order to have
single-signon functionality, whereby users are authenticated once and stay
logged in to XMPP upon page reload, you will also have to add some server-side
`Session Support`_ (i.e. single-signon functionality whereby users are authenticated once and stay
logged in to XMPP upon page reload) you will also have to add some server-side
code.
The `What you will need`_ section has more information on all these
......@@ -46,9 +46,12 @@ An XMPP/Jabber server
*Converse.js* implements `XMPP`_ as its messaging protocol, and therefore needs
to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).
You can either set up your own XMPP server, or use a public one. You can find a
list of public XMPP servers/providers on `xmpp.net`_ and a list of servers that
you can set up yourself on `xmpp.org`_.
You can connect to public XMPP servers like ``jabber.org`` but if you want to
have `Session Support`_ you'll have to set up your own XMPP server.
You can find a list of public XMPP servers/providers on `xmpp.net`_ and a list of
servers that you can set up yourself on `xmpp.org`_.
Connection Manager
==================
......@@ -96,8 +99,10 @@ website. This will remove the need for any cross-domain XHR support.
Server-side authentication
==========================
Session support (i.e. single site login)
----------------------------------------
.. _`Session Support`:
Pre-binding and Single Session Support
--------------------------------------
It's possible to enable single-site login, whereby users already
authenticated in your website will also automatically be logged in on the chat server,
......@@ -105,26 +110,81 @@ but this will require custom code on your server.
Jack Moffitt has a great `blogpost`_ about this and even provides an `example Django application`_ to demonstrate it.
.. Note::
If you want to enable single session support, make sure to pass **prebind: true**
when you call **converse.initialize** (see ./index.html).
When you authenticate to the XMPP server on your backend, you'll receive two
tokens, RID (request ID) and SID (session ID).
These tokens then need to be passed back to the javascript running in your
browser, where you will need them attach to the existing session.
You can embed the RID and SID tokens in your HTML markup or you can do an
XMLHttpRequest call to you server and ask it to return them for you.
Below is one example of how this could work. An Ajax call is made to the
relative URL **/prebind** and it expects to receive JSON data back.
::
$.getJSON('/prebind', function (data) {
var connection = new Strophe.Connection(converse.bosh_service_url);
connection.attach(data.jid, data.sid, data.rid, function (status) {
if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
converse.onConnected(connection)
}
});
}
);
**Here's what's happening:**
The JSON data contains the user's JID (jabber ID), RID and SID. The URL to the
BOSH connection manager is already set as a configuration setting on the
*converse* object (see ./main.js), so we can reuse it from there.
A new Strophe.Connection object is instantiated and then *attach* is called with
the user's JID, the necessary tokens and a callback function.
In the callback function, you call *converse.onConnected* together with the
connection object.
=========================================
Quickstart (to get a demo up and running)
=========================================
When you download a specific release of *Converse.js*, say for example version 0.3,
there will be two minified files inside the zip file.
When you download a specific release of *Converse.js* there will be two minified files inside the zip file.
For version 0.3 they will be:
* converse.min.js
* converse.min.css
* converse.0.3.min.js
* converse.0.3.min.css
You can include these two files in your website via the *script* and *link*
You can include these two files inside the *<head>* element of your website via the *script* and *link*
tags:
::
<link rel="stylesheet" type="text/css" media="screen" href="converse.0.3.min.css">
<script src="converse.0.3.min.js"></script>
<link rel="stylesheet" type="text/css" media="screen" href="converse.min.css">
<script src="converse.min.js"></script>
Then, at the bottom of your page, after the closing *</body>* element, put the
following inline Javascript code:
::
<script>
converse.initialize({
auto_list_rooms: false,
auto_subscribe: false,
bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
hide_muc_server: false,
i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported
prebind: false,
show_controlbox_by_default: true,
xhr_user_search: false
});
</script>
The *index.html* file inside the Converse.js folder serves as a nice usable
example of this.
......@@ -137,7 +197,7 @@ You'll most likely want to implement some kind of single-signon solution for
your website, where users authenticate once in your website and then stay
logged into their XMPP session upon page reload.
For more info on this, read `Session support (i.e. single site login)`_.
For more info on this, read: `Pre-binding and Single Session Support`_.
You might also want to have more fine-grained control of what gets included in
the minified Javascript file. Read `Configuration`_ and `Minification`_ for more info on how to do
......@@ -155,6 +215,9 @@ on your website.
*Converse.js* is passed its configuration settings when you call its
*initialize* method.
You'll most likely want to call the *initialize* method in your HTML page. For
an example of how this is done, please see the bottom of the *./index.html* page.
Please refer to the `Configuration variables`_ section below for info on
all the available configuration settings.
......@@ -243,6 +306,20 @@ have to write a Javascript snippet to attach to the set up connection::
The backend must authenticate for you, and then return a SID (session ID) and
RID (Request ID), which you use when you attach to the connection.
show_controlbox_by_default
--------------------------
Default = False
The "controlbox" refers to the special chatbox containing your contacts roster,
status widget, chatrooms and other controls.
By default this box is hidden and can be toggled by clicking on any element in
the page with class *toggle-online-users*.
If this options is set to true, the controlbox will by default be shown upon
page load.
xhr_user_search
---------------
......@@ -257,8 +334,6 @@ There are two ways to add users.
This setting enables the second mechanism, otherwise by default the first will
be used.
============
Minification
============
......@@ -299,6 +374,104 @@ CSS can be minimized with Yahoo's yuicompressor tool:
yui-compressor --type=css converse.css -o converse.min.css
============
Translations
============
.. Note ::
Translations take up a lot of space and will bloat your minified file.
At the time of writing, all the translations add about 50KB of extra data to
the minified javascript file. Therefore, make sure to only
include those languages that you intend to support and remove from
./locale/locales.js those which you don't need. Remember to rebuild the
minified file afterwards.
The gettext POT file located in ./locale/converse.pot is the template
containing all translations and from which for each language an individual PO
file is generated.
The POT file contains all translateable strings extracted from converse.js.
To make a user facing string translateable, wrap it in the double underscore helper
function like so:
::
__('This string will be translated at runtime');
After adding the string, you'll need to regenerate the POT file, like so:
::
make pot
You can then create or update the PO file for a specific language by doing the following:
::
msgmerge ./locale/af/LC_MESSAGES/converse.po ./locale/converse.pot -U
This PO file is then what gets translated.
If you've created a new PO file, please make sure to add the following
attributes at the top of the file (under *Content-Transfer-Encoding*). They are
required as configuration settings for Jed, the Javascript translations library
that we're using.
::
"domain: converse\n"
"lang: af\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
Unfortunately Jed cannot use the PO files directly. We have to generate from it
a file in JSON format and then put that in a .js file for the specific
language.
To generate JSON from a PO file, you'll need po2json for node.js. Run the
following command to install it (npm being the node.js package manager):
::
npm install po2json
You can then convert the translations into JSON format:
::
po2json locale/af/LC_MESSAGES/converse.po locale/af/LC_MESSAGES/converse.json
Now from converse.json paste the data as a value for the "locale_data" key in the
object in the language's .js file.
So, if you are for example translating into German (language code 'de'), you'll
create or update the file ./locale/LC_MESSAGES/de.js with the following code:
::
(function (root, factory) {
define("af", ['jed'], function () {
return factory(new Jed({
"domain": "converse",
"locale_data": {
// Paste the JSON data from converse.json here
}
})
}
}(this, function (i18n) {
return i18n;
}));
making sure to also paste the JSON data as value to the "locale_data" key.
.. Note ::
If you are adding translations for a new language that is not already supported,
you'll have to make one more edit in ./locale/locales.js to make sure the
language is loaded by require.js.
Congratulations, you've now succesfully added your translations. Sorry for all
those hoops you had to jump through.
.. _`conversejs.org`: http://conversejs.org
......
......@@ -73,7 +73,7 @@
</ul>
</li>
<li><a class="reference internal" href="#server-side-authentication" id="id6">Server-side authentication</a><ul>
<li><a class="reference internal" href="#session-support-i-e-single-site-login" id="id7">Session support (i.e. single site login)</a></li>
<li><a class="reference internal" href="#pre-binding-and-single-session-support" id="id7">Pre-binding and Single Session Support</a></li>
</ul>
</li>
</ul>
......@@ -88,33 +88,35 @@
<li><a class="reference internal" href="#fullname" id="id15">fullname</a></li>
<li><a class="reference internal" href="#hide-muc-server" id="id16">hide_muc_server</a></li>
<li><a class="reference internal" href="#prebind" id="id17">prebind</a></li>
<li><a class="reference internal" href="#xhr-user-search" id="id18">xhr_user_search</a></li>
<li><a class="reference internal" href="#show-controlbox-by-default" id="id18">show_controlbox_by_default</a></li>
<li><a class="reference internal" href="#xhr-user-search" id="id19">xhr_user_search</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#minification" id="id19">Minification</a><ul>
<li><a class="reference internal" href="#minifying-javascript" id="id20">Minifying Javascript</a></li>
<li><a class="reference internal" href="#minifying-css" id="id21">Minifying CSS</a></li>
<li><a class="reference internal" href="#minification" id="id20">Minification</a><ul>
<li><a class="reference internal" href="#minifying-javascript" id="id21">Minifying Javascript</a></li>
<li><a class="reference internal" href="#minifying-css" id="id22">Minifying CSS</a></li>
</ul>
</li>
<li><a class="reference internal" href="#translations" id="id23">Translations</a></li>
</ul>
</div>
<div class="section" id="introduction">
<h1><a class="toc-backref" href="#id1">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h1>
<p>Even though you can connect to public XMPP servers on the <a class="reference external" href="http://conversejs.org">conversejs.org</a>
website, <em>Converse.js</em> is not meant to be a &#8220;Software-as-a-service&#8221; (SaaS)
website, <em>Converse.js</em> is not really meant to be a &#8220;Software-as-a-service&#8221; (SaaS)
webchat.</p>
<p>Instead, its goal is to provide the means for website owners to add a tightly
integrated instant messaging service to their own sites.</p>
<p>As a website owner, you are expected to host <em>Converse.js</em> yourself, and to do some legwork to
properly configure and integrated it into your site.</p>
properly configure and integrate it into your site.</p>
<p>The benefit in doing this, is that your users have a much more streamlined and integrated
webchat experience and that you have control over the data. The latter being a
requirement for many sites dealing with sensitive information.</p>
<p>You&#8217;ll need to set up your own XMPP server and in order to have
single-signon functionality, whereby users are authenticated once and stay
logged in to XMPP upon page reload, you will also have to add some server-side
<a class="reference internal" href="#session-support">Session Support</a> (i.e. single-signon functionality whereby users are authenticated once and stay
logged in to XMPP upon page reload) you will also have to add some server-side
code.</p>
<p>The <a class="reference internal" href="#what-you-will-need">What you will need</a> section has more information on all these
requirements.</p>
......@@ -125,9 +127,10 @@ requirements.</p>
<h2><a class="toc-backref" href="#id3">An XMPP/Jabber server</a><a class="headerlink" href="#an-xmpp-jabber-server" title="Permalink to this headline"></a></h2>
<p><em>Converse.js</em> implements <a class="reference external" href="https://en.wikipedia.org/wiki/Xmpp">XMPP</a> as its messaging protocol, and therefore needs
to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).</p>
<p>You can either set up your own XMPP server, or use a public one. You can find a
list of public XMPP servers/providers on <a class="reference external" href="http://xmpp.net">xmpp.net</a> and a list of servers that
you can set up yourself on <a class="reference external" href="http://xmpp.org/xmpp-software/servers/">xmpp.org</a>.</p>
<p>You can connect to public XMPP servers like <tt class="docutils literal"><span class="pre">jabber.org</span></tt> but if you want to
have <a class="reference internal" href="#session-support">Session Support</a> you&#8217;ll have to set up your own XMPP server.</p>
<p>You can find a list of public XMPP servers/providers on <a class="reference external" href="http://xmpp.net">xmpp.net</a> and a list of
servers that you can set up yourself on <a class="reference external" href="http://xmpp.org/xmpp-software/servers/">xmpp.org</a>.</p>
</div>
<div class="section" id="connection-manager">
<h2><a class="toc-backref" href="#id4">Connection Manager</a><a class="headerlink" href="#connection-manager" title="Permalink to this headline"></a></h2>
......@@ -164,28 +167,72 @@ website. This will remove the need for any cross-domain XHR support.</p>
</div>
<div class="section" id="server-side-authentication">
<h2><a class="toc-backref" href="#id6">Server-side authentication</a><a class="headerlink" href="#server-side-authentication" title="Permalink to this headline"></a></h2>
<div class="section" id="session-support-i-e-single-site-login">
<h3><a class="toc-backref" href="#id7">Session support (i.e. single site login)</a><a class="headerlink" href="#session-support-i-e-single-site-login" title="Permalink to this headline"></a></h3>
<div class="section" id="pre-binding-and-single-session-support">
<span id="session-support"></span><h3><a class="toc-backref" href="#id7">Pre-binding and Single Session Support</a><a class="headerlink" href="#pre-binding-and-single-session-support" title="Permalink to this headline"></a></h3>
<p>It&#8217;s possible to enable single-site login, whereby users already
authenticated in your website will also automatically be logged in on the chat server,
but this will require custom code on your server.</p>
<p>Jack Moffitt has a great <a class="reference external" href="http://metajack.im/2008/10/03/getting-attached-to-strophe">blogpost</a> about this and even provides an <a class="reference external" href="https://github.com/metajack/strophejs/tree/master/examples/attach">example Django application</a> to demonstrate it.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">If you want to enable single session support, make sure to pass <strong>prebind: true</strong>
when you call <strong>converse.initialize</strong> (see ./index.html).</p>
</div>
<p>When you authenticate to the XMPP server on your backend, you&#8217;ll receive two
tokens, RID (request ID) and SID (session ID).</p>
<p>These tokens then need to be passed back to the javascript running in your
browser, where you will need them attach to the existing session.</p>
<p>You can embed the RID and SID tokens in your HTML markup or you can do an
XMLHttpRequest call to you server and ask it to return them for you.</p>
<p>Below is one example of how this could work. An Ajax call is made to the
relative URL <strong>/prebind</strong> and it expects to receive JSON data back.</p>
<div class="highlight-python"><pre>$.getJSON('/prebind', function (data) {
var connection = new Strophe.Connection(converse.bosh_service_url);
connection.attach(data.jid, data.sid, data.rid, function (status) {
if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
converse.onConnected(connection)
}
});
}
);</pre>
</div>
<p><strong>Here&#8217;s what&#8217;s happening:</strong></p>
<p>The JSON data contains the user&#8217;s JID (jabber ID), RID and SID. The URL to the
BOSH connection manager is already set as a configuration setting on the
<em>converse</em> object (see ./main.js), so we can reuse it from there.</p>
<p>A new Strophe.Connection object is instantiated and then <em>attach</em> is called with
the user&#8217;s JID, the necessary tokens and a callback function.</p>
<p>In the callback function, you call <em>converse.onConnected</em> together with the
connection object.</p>
</div>
</div>
</div>
<div class="section" id="quickstart-to-get-a-demo-up-and-running">
<h1><a class="toc-backref" href="#id8">Quickstart (to get a demo up and running)</a><a class="headerlink" href="#quickstart-to-get-a-demo-up-and-running" title="Permalink to this headline"></a></h1>
<p>When you download a specific release of <em>Converse.js</em>, say for example version 0.3,
there will be two minified files inside the zip file.</p>
<p>For version 0.3 they will be:</p>
<p>When you download a specific release of <em>Converse.js</em> there will be two minified files inside the zip file.</p>
<ul class="simple">
<li>converse.0.3.min.js</li>
<li>converse.0.3.min.css</li>
<li>converse.min.js</li>
<li>converse.min.css</li>
</ul>
<p>You can include these two files in your website via the <em>script</em> and <em>link</em>
<p>You can include these two files inside the <em>&lt;head&gt;</em> element of your website via the <em>script</em> and <em>link</em>
tags:</p>
<div class="highlight-python"><pre>&lt;link rel="stylesheet" type="text/css" media="screen" href="converse.0.3.min.css"&gt;
&lt;script src="converse.0.3.min.js"&gt;&lt;/script&gt;</pre>
<div class="highlight-python"><pre>&lt;link rel="stylesheet" type="text/css" media="screen" href="converse.min.css"&gt;
&lt;script src="converse.min.js"&gt;&lt;/script&gt;</pre>
</div>
<p>Then, at the bottom of your page, after the closing <em>&lt;/body&gt;</em> element, put the
following inline Javascript code:</p>
<div class="highlight-python"><pre>&lt;script&gt;
converse.initialize({
auto_list_rooms: false,
auto_subscribe: false,
bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
hide_muc_server: false,
i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported
prebind: false,
show_controlbox_by_default: true,
xhr_user_search: false
});
&lt;/script&gt;</pre>
</div>
<p>The <em>index.html</em> file inside the Converse.js folder serves as a nice usable
example of this.</p>
......@@ -195,7 +242,7 @@ practical.</p>
<p>You&#8217;ll most likely want to implement some kind of single-signon solution for
your website, where users authenticate once in your website and then stay
logged into their XMPP session upon page reload.</p>
<p>For more info on this, read <a class="reference internal" href="#session-support-i-e-single-site-login">Session support (i.e. single site login)</a>.</p>
<p>For more info on this, read: <a class="reference internal" href="#pre-binding-and-single-session-support">Pre-binding and Single Session Support</a>.</p>
<p>You might also want to have more fine-grained control of what gets included in
the minified Javascript file. Read <a class="reference internal" href="#configuration">Configuration</a> and <a class="reference internal" href="#minification">Minification</a> for more info on how to do
that.</p>
......@@ -207,6 +254,8 @@ you&#8217;ll want to configure <em>Converse.js</em> to suit your needs before yo
on your website.</p>
<p><em>Converse.js</em> is passed its configuration settings when you call its
<em>initialize</em> method.</p>
<p>You&#8217;ll most likely want to call the <em>initialize</em> method in your HTML page. For
an example of how this is done, please see the bottom of the <em>./index.html</em> page.</p>
<p>Please refer to the <a class="reference internal" href="#configuration-variables">Configuration variables</a> section below for info on
all the available configuration settings.</p>
<p>After you have configured <em>Converse.js</em>, you&#8217;ll have to regenerate the minified
......@@ -273,8 +322,18 @@ have to write a Javascript snippet to attach to the set up connection:</p>
<p>The backend must authenticate for you, and then return a SID (session ID) and
RID (Request ID), which you use when you attach to the connection.</p>
</div>
<div class="section" id="show-controlbox-by-default">
<h3><a class="toc-backref" href="#id18">show_controlbox_by_default</a><a class="headerlink" href="#show-controlbox-by-default" title="Permalink to this headline"></a></h3>
<p>Default = False</p>
<p>The &#8220;controlbox&#8221; refers to the special chatbox containing your contacts roster,
status widget, chatrooms and other controls.</p>
<p>By default this box is hidden and can be toggled by clicking on any element in
the page with class <em>toggle-online-users</em>.</p>
<p>If this options is set to true, the controlbox will by default be shown upon
page load.</p>
</div>
<div class="section" id="xhr-user-search">
<h3><a class="toc-backref" href="#id18">xhr_user_search</a><a class="headerlink" href="#xhr-user-search" title="Permalink to this headline"></a></h3>
<h3><a class="toc-backref" href="#id19">xhr_user_search</a><a class="headerlink" href="#xhr-user-search" title="Permalink to this headline"></a></h3>
<p>Default = False</p>
<p>There are two ways to add users.</p>
<ul class="simple">
......@@ -287,9 +346,9 @@ be used.</p>
</div>
</div>
<div class="section" id="minification">
<h1><a class="toc-backref" href="#id19">Minification</a><a class="headerlink" href="#minification" title="Permalink to this headline"></a></h1>
<h1><a class="toc-backref" href="#id20">Minification</a><a class="headerlink" href="#minification" title="Permalink to this headline"></a></h1>
<div class="section" id="minifying-javascript">
<h2><a class="toc-backref" href="#id20">Minifying Javascript</a><a class="headerlink" href="#minifying-javascript" title="Permalink to this headline"></a></h2>
<h2><a class="toc-backref" href="#id21">Minifying Javascript</a><a class="headerlink" href="#minifying-javascript" title="Permalink to this headline"></a></h2>
<p>We use <a class="reference external" href="http://requirejs.org">require.js</a> to keep track of <em>Converse.js</em> and its dependencies and to
to bundle them together in a single minified file fit for deployment to a
production site.</p>
......@@ -305,11 +364,84 @@ manager, NPM.</p>
<p>You can <a class="reference external" href="http://requirejs.org/docs/optimization.html">read more about require.js&#8217;s optimizer here</a>.</p>
</div>
<div class="section" id="minifying-css">
<h2><a class="toc-backref" href="#id21">Minifying CSS</a><a class="headerlink" href="#minifying-css" title="Permalink to this headline"></a></h2>
<h2><a class="toc-backref" href="#id22">Minifying CSS</a><a class="headerlink" href="#minifying-css" title="Permalink to this headline"></a></h2>
<p>CSS can be minimized with Yahoo&#8217;s yuicompressor tool:</p>
<div class="highlight-python"><pre>yui-compressor --type=css converse.css -o converse.min.css</pre>
</div>
</div>
</div>
<div class="section" id="translations">
<h1><a class="toc-backref" href="#id23">Translations</a><a class="headerlink" href="#translations" title="Permalink to this headline"></a></h1>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Translations take up a lot of space and will bloat your minified file.
At the time of writing, all the translations add about 50KB of extra data to
the minified javascript file. Therefore, make sure to only
include those languages that you intend to support and remove from
./locale/locales.js those which you don&#8217;t need. Remember to rebuild the
minified file afterwards.</p>
</div>
<p>The gettext POT file located in ./locale/converse.pot is the template
containing all translations and from which for each language an individual PO
file is generated.</p>
<p>The POT file contains all translateable strings extracted from converse.js.</p>
<p>To make a user facing string translateable, wrap it in the double underscore helper
function like so:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">__</span><span class="p">(</span><span class="s">&#39;This string will be translated at runtime&#39;</span><span class="p">);</span>
</pre></div>
</div>
<p>After adding the string, you&#8217;ll need to regenerate the POT file, like so:</p>
<div class="highlight-python"><pre>make pot</pre>
</div>
<p>You can then create or update the PO file for a specific language by doing the following:</p>
<div class="highlight-python"><pre>msgmerge ./locale/af/LC_MESSAGES/converse.po ./locale/converse.pot -U</pre>
</div>
<p>This PO file is then what gets translated.</p>
<p>If you&#8217;ve created a new PO file, please make sure to add the following
attributes at the top of the file (under <em>Content-Transfer-Encoding</em>). They are
required as configuration settings for Jed, the Javascript translations library
that we&#8217;re using.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="s">&quot;domain: converse</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;lang: af</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;plural_forms: nplurals=2; plural=(n != 1);</span><span class="se">\n</span><span class="s">&quot;</span>
</pre></div>
</div>
<p>Unfortunately Jed cannot use the PO files directly. We have to generate from it
a file in JSON format and then put that in a .js file for the specific
language.</p>
<p>To generate JSON from a PO file, you&#8217;ll need po2json for node.js. Run the
following command to install it (npm being the node.js package manager):</p>
<div class="highlight-python"><pre>npm install po2json</pre>
</div>
<p>You can then convert the translations into JSON format:</p>
<div class="highlight-python"><pre>po2json locale/af/LC_MESSAGES/converse.po locale/af/LC_MESSAGES/converse.json</pre>
</div>
<p>Now from converse.json paste the data as a value for the &#8220;locale_data&#8221; key in the
object in the language&#8217;s .js file.</p>
<p>So, if you are for example translating into German (language code &#8216;de&#8217;), you&#8217;ll
create or update the file ./locale/LC_MESSAGES/de.js with the following code:</p>
<div class="highlight-python"><pre>(function (root, factory) {
define("af", ['jed'], function () {
return factory(new Jed({
"domain": "converse",
"locale_data": {
// Paste the JSON data from converse.json here
}
})
}
}(this, function (i18n) {
return i18n;
}));</pre>
</div>
<p>making sure to also paste the JSON data as value to the &#8220;locale_data&#8221; key.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">If you are adding translations for a new language that is not already supported,
you&#8217;ll have to make one more edit in ./locale/locales.js to make sure the
language is loaded by require.js.</p>
</div>
<p>Congratulations, you&#8217;ve now succesfully added your translations. Sorry for all
those hoops you had to jump through.</p>
</div>
......
No preview for this file type
Search.setIndex({objects:{},terms:{all:0,code:0,partial:0,queri:0,webchat:0,middl:0,depend:0,sensit:0,under:0,fals:0,mechan:0,jack:0,veri:0,list:0,pleas:0,prevent:0,second:0,pass:0,download:0,further:0,fullnam:0,even:0,index:0,what:0,hide:0,section:0,current:0,version:0,"new":0,net:0,method:0,here:0,box:0,great:0,convers:0,mysit:0,implement:0,via:0,extra:0,solut:0,href:0,auto_list_room:0,instal:0,zip:0,commun:0,two:0,websit:0,stylesheet:0,call:0,recommend:0,type:0,until:0,tightli:0,more:0,yahoo:0,must:0,room:0,setup:[],xhr:0,can:0,purpos:0,fetch:0,control:0,quickstart:0,share:0,tag:0,proprietari:0,explor:0,occup:0,end:0,goal:0,snippet:0,how:0,sid:0,instead:0,css:0,npm:0,regener:0,product:0,resourc:0,after:0,usabl:0,befor:0,data:0,demonstr:0,man:0,practic:0,bind:0,django:0,inform:0,order:0,xmpp:0,over:0,streamlin:0,write:0,jid:0,fit:0,pend:0,therefor:0,might:0,them:0,anim:0,"return":0,thei:0,initi:0,front:0,now:0,introduct:0,name:0,authent:0,ejabberd:0,each:0,side:0,mean:0,domain:0,realli:0,legwork:0,connect:0,variabl:0,open:0,content:0,rel:0,internet:0,proxi:0,insid:0,standard:0,standalon:0,releas:0,org:0,blogpost:0,keep:0,yui:0,first:0,origin:0,softwar:0,render:0,onc:0,lastnam:0,number:0,yourself:0,restrict:0,alreadi:0,owner:0,jabber:0,differ:0,script:0,messag:0,attach:0,attack:0,luckili:0,option:0,tool:0,specifi:0,compressor:0,part:0,exactli:0,than:0,serv:0,kind:0,provid:0,remov:0,bridg:0,toward:[],browser:0,sai:0,saa:0,modern:0,ani:0,packag:0,have:0,tabl:0,need:0,moffitt:0,bosh_service_url:0,prebind:0,min:0,latter:0,also:0,exampl:0,build:0,which:0,singl:0,sure:0,though:0,track:0,object:0,most:0,deploi:0,homepag:0,don:0,url:0,request:0,xdomainrequest:0,show:0,text:0,session:0,fine:0,find:0,onli:0,locat:0,firstnam:0,configur:0,apach:0,should:0,folder:0,meant:0,get:0,opkod:0,requir:0,enabl:0,"public":0,reload:0,integr:0,where:0,set:0,stroph:0,see:0,close:0,state:0,between:0,experi:0,hide_muc_serv:0,screen:0,javascript:0,job:0,bosh:0,cor:0,instant:0,shortliv:0,conversej:0,etc:0,grain:0,mani:0,login:0,com:0,load:0,backend:0,onconnect:0,json:0,much:0,besid:0,subscrib:0,minifi:0,togeth:0,present:0,multi:0,servic:0,plugin:0,chat:0,demo:0,auto_subscrib:0,site:0,rid:0,minim:0,media:0,make:0,minif:0,cross:0,same:0,html:0,signon:0,http:0,webserv:0,optim:0,upon:0,hand:0,user:0,xhr_user_search:0,recent:0,stateless:0,person:[],contact:0,wherebi:0,thi:0,choos:0,usual:0,protocol:0,just:0,web:0,xmlhttprequest:0,add:0,other:0,input:0,yuicompressor:0,match:0,applic:0,read:0,nginx:0,traffic:0,like:0,xss:0,success:0,specif:0,server:0,benefit:0,either:0,page:0,deal:0,some:0,back:0,deploy:0,overcom:0,refer:0,run:0,host:0,panel:0,src:0,about:0,controlbox:0,manag:0,act:0,own:0,automat:0,your:0,log:0,wai:0,support:0,custom:0,avail:0,start:[],includ:0,lot:0,suit:0,"function":0,properli:0,form:0,bundl:0,link:0,synonym:0,"true":0,longer:0,info:0,made:0,possibl:0,"default":0,below:0,otherwis:0,problem:0,expect:0,featur:0,creat:0,exist:0,file:0,want:0,when:0,detail:0,field:0,valid:0,test:0,you:0,nice:0,node:0,stai:0,requirej:0},objtypes:{},titles:["Introduction"],objnames:{},filenames:["index"]})
\ No newline at end of file
Search.setIndex({objects:{},terms:{all:0,code:0,partial:0,queri:0,webchat:0,follow:0,middl:0,depend:0,sensit:0,sorri:0,those:0,under:0,string:0,fals:0,mechan:0,jack:0,veri:0,list:0,pleas:0,prevent:0,past:0,second:0,pass:0,download:0,further:0,fullnam:0,click:0,even:0,index:0,what:0,hide:0,section:0,current:0,version:[],"new":0,net:0,"public":0,widget:0,gener:0,here:0,bodi:0,valu:0,box:0,convert:0,convers:0,mysit:0,fetch:0,implement:0,via:0,extra:0,apach:0,ask:0,href:0,org:0,auto_list_room:0,instal:0,from:0,zip:0,commun:0,doubl:0,two:0,websit:0,stylesheet:0,call:0,recommend:0,type:0,until:0,tightli:0,more:0,yahoo:0,must:0,room:0,setup:[],work:0,xhr:0,can:0,lc_messag:0,purpos:0,root:0,blogpost:0,control:0,quickstart:0,share:0,templat:0,tag:0,proprietari:0,explor:0,onlin:0,occup:0,end:0,goal:0,write:0,how:0,sid:0,instead:0,css:0,updat:0,npm:0,regener:0,product:0,resourc:0,after:0,usabl:0,befor:0,callback:0,underscor:0,data:0,demonstr:0,man:0,practic:0,bind:0,show_controlbox_by_default:0,django:0,inform:0,order:0,chatbox:0,xmpp:0,over:0,through:0,streamlin:0,snippet:0,jid:0,directli:0,fit:0,pend:0,hidden:0,therefor:0,might:0,them:0,anim:0,"return":0,thei:0,initi:0,front:0,now:0,introduct:0,name:0,edit:0,authent:0,token:0,ejabberd:0,each:0,side:0,mean:0,domain:0,individu:0,realli:0,legwork:0,connect:0,happen:0,extract:0,special:0,variabl:0,shown:0,space:0,open:0,content:0,rel:0,internet:0,plural:0,factori:0,po2json:0,proxi:0,insid:0,standard:0,standalon:0,ajax:0,put:0,succesfulli:0,afterward:0,could:0,success:0,keep:0,yui:0,first:0,origin:0,softwar:0,render:0,onc:0,hoop:0,lastnam:0,number:0,yourself:0,restrict:0,alreadi:0,done:0,owner:0,jabber:0,differ:0,script:0,top:0,messag:0,attach:0,attack:0,jed:0,luckili:0,option:0,tool:0,specifi:0,compressor:0,part:0,exactli:0,than:0,serv:0,jump:0,kind:0,bloat:0,provid:0,remov:0,bridg:0,toward:[],browser:0,pre:0,sai:[],saa:0,modern:0,ani:0,packag:0,have:0,tabl:0,need:0,moffitt:0,element:0,bosh_service_url:0,prebind:0,min:0,latter:0,note:0,also:0,contact:0,build:0,which:0,singl:0,sure:0,roster:0,track:0,object:0,most:0,deploi:0,homepag:0,"class":0,don:0,url:0,request:0,face:0,runtim:0,xdomainrequest:0,show:0,german:0,text:0,session:0,fine:0,find:0,onli:0,locat:0,just:0,configur:0,solut:0,should:0,folder:0,local:0,meant:0,get:0,opkod:0,cannot:0,deploy:0,requir:0,enabl:0,emb:0,method:0,reload:0,integr:0,contain:0,where:0,set:0,stroph:0,see:0,close:0,statu:0,state:0,reus:0,between:0,experi:0,hide_muc_serv:0,attribut:0,kei:0,screen:0,javascript:0,conjunct:[],job:0,bosh:0,cor:0,instant:0,shortliv:0,conversej:0,etc:0,grain:0,mani:0,login:0,com:0,load:0,instanti:0,pot:0,backend:0,creat:0,rebuild:0,json:0,much:0,besid:0,subscrib:0,msgmerg:0,great:0,minifi:0,togeth:0,i18n:0,present:0,multi:0,main:0,servic:0,plugin:0,defin:0,file:0,helper:0,demo:0,auto_subscrib:0,site:0,rid:0,minim:0,receiv:0,media:0,make:0,minif:0,cross:0,same:0,html:0,chatroom:0,signon:0,http:0,webserv:0,optim:0,upon:0,hand:0,"50kb":0,user:0,xhr_user_search:0,recent:0,stateless:0,markup:0,person:[],exampl:0,command:0,wherebi:0,thi:0,choos:0,usual:0,plural_form:0,protocol:0,firstnam:0,languag:0,web:0,xmlhttprequest:0,had:0,add:0,valid:0,input:0,yuicompressor:0,match:0,take:0,applic:0,format:0,read:0,nginx:0,traffic:0,xss:0,like:0,specif:0,server:0,benefit:0,necessari:0,either:0,page:0,deal:0,nplural:0,some:0,back:0,librari:0,bottom:0,though:0,overcom:0,refer:0,run:0,host:0,panel:0,src:0,about:0,obj:[],controlbox:0,unfortun:0,act:0,own:0,encod:0,automat:0,wrap:0,your:0,manag:0,log:0,wai:0,transfer:0,support:0,custom:0,avail:0,start:[],includ:0,lot:0,suit:0,"var":0,"function":0,head:0,properli:0,form:0,bundl:0,link:0,translat:0,synonym:0,inlin:0,"true":0,congratul:0,requirej:0,info:0,made:0,locale_data:0,possibl:0,"default":0,below:0,toggl:0,otherwis:0,problem:0,expect:0,featur:0,onconnect:0,"100kb":[],exist:0,chat:0,want:0,when:0,detail:0,gettext:0,field:0,other:0,rememb:0,test:0,you:0,nice:0,node:0,intend:0,releas:0,stai:0,lang:0,longer:0,getjson:0,time:0},objtypes:{},titles:["Introduction"],objnames:{},filenames:["index"]})
\ No newline at end of file
......@@ -15,22 +15,22 @@ Introduction
============
Even though you can connect to public XMPP servers on the `conversejs.org`_
website, *Converse.js* is not meant to be a "Software-as-a-service" (SaaS)
website, *Converse.js* is not really meant to be a "Software-as-a-service" (SaaS)
webchat.
Instead, its goal is to provide the means for website owners to add a tightly
integrated instant messaging service to their own sites.
As a website owner, you are expected to host *Converse.js* yourself, and to do some legwork to
properly configure and integrated it into your site.
properly configure and integrate it into your site.
The benefit in doing this, is that your users have a much more streamlined and integrated
webchat experience and that you have control over the data. The latter being a
requirement for many sites dealing with sensitive information.
You'll need to set up your own XMPP server and in order to have
single-signon functionality, whereby users are authenticated once and stay
logged in to XMPP upon page reload, you will also have to add some server-side
`Session Support`_ (i.e. single-signon functionality whereby users are authenticated once and stay
logged in to XMPP upon page reload) you will also have to add some server-side
code.
The `What you will need`_ section has more information on all these
......@@ -46,9 +46,12 @@ An XMPP/Jabber server
*Converse.js* implements `XMPP`_ as its messaging protocol, and therefore needs
to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).
You can either set up your own XMPP server, or use a public one. You can find a
list of public XMPP servers/providers on `xmpp.net`_ and a list of servers that
you can set up yourself on `xmpp.org`_.
You can connect to public XMPP servers like ``jabber.org`` but if you want to
have `Session Support`_ you'll have to set up your own XMPP server.
You can find a list of public XMPP servers/providers on `xmpp.net`_ and a list of
servers that you can set up yourself on `xmpp.org`_.
Connection Manager
==================
......@@ -96,8 +99,10 @@ website. This will remove the need for any cross-domain XHR support.
Server-side authentication
==========================
Session support (i.e. single site login)
----------------------------------------
.. _`Session Support`:
Pre-binding and Single Session Support
--------------------------------------
It's possible to enable single-site login, whereby users already
authenticated in your website will also automatically be logged in on the chat server,
......@@ -105,26 +110,81 @@ but this will require custom code on your server.
Jack Moffitt has a great `blogpost`_ about this and even provides an `example Django application`_ to demonstrate it.
.. Note::
If you want to enable single session support, make sure to pass **prebind: true**
when you call **converse.initialize** (see ./index.html).
When you authenticate to the XMPP server on your backend, you'll receive two
tokens, RID (request ID) and SID (session ID).
These tokens then need to be passed back to the javascript running in your
browser, where you will need them attach to the existing session.
You can embed the RID and SID tokens in your HTML markup or you can do an
XMLHttpRequest call to you server and ask it to return them for you.
Below is one example of how this could work. An Ajax call is made to the
relative URL **/prebind** and it expects to receive JSON data back.
::
$.getJSON('/prebind', function (data) {
var connection = new Strophe.Connection(converse.bosh_service_url);
connection.attach(data.jid, data.sid, data.rid, function (status) {
if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
converse.onConnected(connection)
}
});
}
);
**Here's what's happening:**
The JSON data contains the user's JID (jabber ID), RID and SID. The URL to the
BOSH connection manager is already set as a configuration setting on the
*converse* object (see ./main.js), so we can reuse it from there.
A new Strophe.Connection object is instantiated and then *attach* is called with
the user's JID, the necessary tokens and a callback function.
In the callback function, you call *converse.onConnected* together with the
connection object.
=========================================
Quickstart (to get a demo up and running)
=========================================
When you download a specific release of *Converse.js*, say for example version 0.3,
there will be two minified files inside the zip file.
When you download a specific release of *Converse.js* there will be two minified files inside the zip file.
For version 0.3 they will be:
* converse.min.js
* converse.min.css
* converse.0.3.min.js
* converse.0.3.min.css
You can include these two files in your website via the *script* and *link*
You can include these two files inside the *<head>* element of your website via the *script* and *link*
tags:
::
<link rel="stylesheet" type="text/css" media="screen" href="converse.0.3.min.css">
<script src="converse.0.3.min.js"></script>
<link rel="stylesheet" type="text/css" media="screen" href="converse.min.css">
<script src="converse.min.js"></script>
Then, at the bottom of your page, after the closing *</body>* element, put the
following inline Javascript code:
::
<script>
converse.initialize({
auto_list_rooms: false,
auto_subscribe: false,
bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
hide_muc_server: false,
i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported
prebind: false,
show_controlbox_by_default: true,
xhr_user_search: false
});
</script>
The *index.html* file inside the Converse.js folder serves as a nice usable
example of this.
......@@ -137,7 +197,7 @@ You'll most likely want to implement some kind of single-signon solution for
your website, where users authenticate once in your website and then stay
logged into their XMPP session upon page reload.
For more info on this, read `Session support (i.e. single site login)`_.
For more info on this, read: `Pre-binding and Single Session Support`_.
You might also want to have more fine-grained control of what gets included in
the minified Javascript file. Read `Configuration`_ and `Minification`_ for more info on how to do
......@@ -155,6 +215,9 @@ on your website.
*Converse.js* is passed its configuration settings when you call its
*initialize* method.
You'll most likely want to call the *initialize* method in your HTML page. For
an example of how this is done, please see the bottom of the *./index.html* page.
Please refer to the `Configuration variables`_ section below for info on
all the available configuration settings.
......@@ -243,6 +306,20 @@ have to write a Javascript snippet to attach to the set up connection::
The backend must authenticate for you, and then return a SID (session ID) and
RID (Request ID), which you use when you attach to the connection.
show_controlbox_by_default
--------------------------
Default = False
The "controlbox" refers to the special chatbox containing your contacts roster,
status widget, chatrooms and other controls.
By default this box is hidden and can be toggled by clicking on any element in
the page with class *toggle-online-users*.
If this options is set to true, the controlbox will by default be shown upon
page load.
xhr_user_search
---------------
......@@ -257,8 +334,6 @@ There are two ways to add users.
This setting enables the second mechanism, otherwise by default the first will
be used.
============
Minification
============
......@@ -299,6 +374,104 @@ CSS can be minimized with Yahoo's yuicompressor tool:
yui-compressor --type=css converse.css -o converse.min.css
============
Translations
============
.. Note ::
Translations take up a lot of space and will bloat your minified file.
At the time of writing, all the translations add about 50KB of extra data to
the minified javascript file. Therefore, make sure to only
include those languages that you intend to support and remove from
./locale/locales.js those which you don't need. Remember to rebuild the
minified file afterwards.
The gettext POT file located in ./locale/converse.pot is the template
containing all translations and from which for each language an individual PO
file is generated.
The POT file contains all translateable strings extracted from converse.js.
To make a user facing string translateable, wrap it in the double underscore helper
function like so:
::
__('This string will be translated at runtime');
After adding the string, you'll need to regenerate the POT file, like so:
::
make pot
You can then create or update the PO file for a specific language by doing the following:
::
msgmerge ./locale/af/LC_MESSAGES/converse.po ./locale/converse.pot -U
This PO file is then what gets translated.
If you've created a new PO file, please make sure to add the following
attributes at the top of the file (under *Content-Transfer-Encoding*). They are
required as configuration settings for Jed, the Javascript translations library
that we're using.
::
"domain: converse\n"
"lang: af\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
Unfortunately Jed cannot use the PO files directly. We have to generate from it
a file in JSON format and then put that in a .js file for the specific
language.
To generate JSON from a PO file, you'll need po2json for node.js. Run the
following command to install it (npm being the node.js package manager):
::
npm install po2json
You can then convert the translations into JSON format:
::
po2json locale/af/LC_MESSAGES/converse.po locale/af/LC_MESSAGES/converse.json
Now from converse.json paste the data as a value for the "locale_data" key in the
object in the language's .js file.
So, if you are for example translating into German (language code 'de'), you'll
create or update the file ./locale/LC_MESSAGES/de.js with the following code:
::
(function (root, factory) {
define("af", ['jed'], function () {
return factory(new Jed({
"domain": "converse",
"locale_data": {
// Paste the JSON data from converse.json here
}
})
}
}(this, function (i18n) {
return i18n;
}));
making sure to also paste the JSON data as value to the "locale_data" key.
.. Note ::
If you are adding translations for a new language that is not already supported,
you'll have to make one more edit in ./locale/locales.js to make sure the
language is loaded by require.js.
Congratulations, you've now succesfully added your translations. Sorry for all
those hoops you had to jump through.
.. _`conversejs.org`: http://conversejs.org
......
......@@ -5,9 +5,9 @@
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
<meta name="description" content="Converse.js: Open Source Browser-Based Instant Messaging" />
<link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">
<link rel="stylesheet" type="text/css" media="screen" href="converse.0.3.min.css">
<script src="converse.0.3.min.js"></script>
<!-- For development <script data-main="main" src="Libraries/require-jquery.js"></script> -->
<link rel="stylesheet" type="text/css" media="screen" href="converse.css">
<!-- <script src="converse.min.js"></script> -->
<script data-main="main" src="Libraries/require-jquery.js"></script>
<title>Converse.js</title>
</head>
......@@ -17,10 +17,10 @@
<header class="inner">
<a id="forkme_banner" href="https://github.com/jcbrand/converse.js">View on GitHub</a>
<h1 id="project_title"><a href="http://conversejs.org">Converse.js</a></h1>
<h2 id="project_tagline">Browser-based Instant Messaging with Strophe.js and Backbone.js</h2>
<h2 id="project_tagline">An XMPP chat client for your website</h2>
<section id="downloads">
<a class="zip_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.3.zip">Download the latest release as a .zip file</a>
<a class="tar_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.3.tar.gz">Download the latest release as a tar.gz file</a>
<a class="zip_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.4.zip">Download the latest release as a .zip file</a>
<a class="tar_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.4.tar.gz">Download the latest release as a tar.gz file</a>
</section>
</header>
</div>
......@@ -28,25 +28,27 @@
<!-- MAIN CONTENT -->
<div id="main_content_wrap" class="outer">
<section id="main_content" class="inner">
<p><strong>Converse.js</strong> is an open source, web based, <a href="http://xmpp.org" target="_blank">XMPP/Jabber</a> chat client, similar to
<a href="https://www.facebook.com/sitetour/chat.php" target="_blank">Facebook chat</a>, but with added support for multi-user chatrooms.</p>
<p>It is a Javascript application that you can include in your
website, thereby providing it with instant messaging functionality.</p>
<p><strong>Converse.js</strong> is an open source, webchat client, that
runs in the browser and can be integrated into any website.</p>
<p>You will also need access to an XMPP/Jabber server. You can connect to any public, federated XMPP server, or you can set one up
yourself, thereby maintaining stricter privacy controls.</p>
<p>It's similar to <a href="https://www.facebook.com/sitetour/chat.php" target="_blank">Facebook chat</a>, but also supports multi-user chatrooms.</p>
<p>It's possible to enable single-site login, whereby users already
authenticated in your website will also automatically be logged in on the chat server, but this will require custom code on your server.</p>
<p><em>Converse.js</em> can connect to any accessible <a href="http://xmpp.org" target="_blank">XMPP/Jabber</a> server, either from a public provider such as
<a href="http://jabber.org">jabber.org</a>, or to one you have set up
yourself.</a>
<p>It's possible to enable single-site login, whereby users already authenticated in your website will also automatically be logged in on the chat server,
but you will have to pre-authenticate them on your server. You can refer to the <a href="/docs/html/index.html">documentation</a> for more
info.</p>
<p>An <a href="http://github.com/collective/collective.xmpp.chat" target="_blank">add-on product</a> that does exactly this,
already exists for the <a href="http://plone.org" target="_blank">Plone</a> CMS. Hopefully in the future more such add-ons will
be created for other platforms.
</p>
<p>If you have integrated Converse.js into any other CMS or framework,
<a href="http://opkode.com/contact" target="_blank">please let me know</a> and I'll mention it on this page.</p>
<p>If you have integrated <em>Converse.js</em> into any other CMS or framework,
<a href="http://opkode.com/contact.html" target="_blank">please let me know</a> and I'll mention it on this page.</p>
<h2>Features</h2>
<ul>
......@@ -62,6 +64,7 @@
<li>Custom status messages</li>
<li>Typing notifications</li>
<li>Third person messages (/me )</li>
<li>i18n aware</li>
</ul>
<h2>Screencasts</h2>
......@@ -75,27 +78,20 @@
</ul>
<h2>Demo</h2>
<p><a href="#" class="chat toggle-online-users">Click this link</a> or click the link on the bottom right corner of this page.</a></p>
<p>You can log in with any existing federated Jabber/XMPP account, or create a new one at any of these providers:
<ul>
<li><a href="http://jabber.org" target="_blank">jabber.org</a></li>
<li><a href="https://jappix.com" target="_blank">jappix.com</a></li>
</ul>
There is also a list of public XMPP providers on <a href="xmpp.net" target="_blank">xmpp.net</a>.
</p>
<p><b>Note:</b> currently the demo doesn't work in Internet Explorer older
<p>You can log in with any existing XMPP account. There is also a list of public XMPP providers on <a href="http://xmpp.net" target="_blank">xmpp.net</a>.</p>
<p><em><strong>Note:</strong> currently the demo doesn't work in Internet Explorer older
than 10. This is due to lacking support for <a href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing">CORS</a>,
a standard which enables cross-domain XmlHttpRequests. There are ways
around this, but it hasn't been a priority for me to implement them for
this demo.
</p>
<p>
See <a href="/docs/html/index.html#overcoming-cross-domain-request-restrictions" target="_blank">here</a> for more information.
See <a href="/docs/html/index.html#overcoming-cross-domain-request-restrictions" target="_blank">here</a> for more information.
</p>
</em>
<h3>Is it secure?</h3>
<p>Yes. In this demo <strong>Converse.js</strong> makes an
<p>Yes. In this demo <em>Converse.js</em> makes an
<a href="https://en.wikipedia.org/wiki/Secure_Sockets_Layer" target="_blank">SSL</a> encrypted connection to a secure connection manager.
The connection manager then uses SSL and <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> to connect to an XMPP server.</p>
That said, the developers don't assume any liability for any loss or damages as a result of using this software or demo. Use this demo at your own risk.
......@@ -107,7 +103,7 @@
establish an authenticated connection on the server side and then attach to
this connection in your browser.
</p>
<p><strong>Converse.js</strong> already supports this usecase, but you'll have to do more manual work yourself.</p>
<p><em>Converse.js</em> already supports this usecase, but you'll have to do some integration work yourself.</p>
<h2>Documentation</h2>
......@@ -126,9 +122,10 @@
<h2>Credits and Dependencies</h2>
<p><strong>Converse.js</strong> depends on a few third party libraries, including:
<ul>
<li><a href="http://jquery.com" target="_blank">JQuery</a></li>
<li><a href="http://strophe.im/strophejs" target="_blank">strophe.js</a></li>
<li><a href="http://backbonejs.org" target="_blank">backbone.js</a></li>
<li><a href="http://requirejs.org" target="_blank">require.js</a></li>
<li><a href="http://requirejs.org" target="_blank">require.js</a> (optional dependency)</li>
</ul>
</p>
<p>Some images were taken from <a href="http://plone.org" target="_blank">Plone</a> and the
......@@ -137,7 +134,12 @@
<h2>Licence</h2>
<p><strong>Converse.js</strong> is released under both the <a href="http://opensource.org/licenses/mit-license.php" target="_blank">MIT</a>
and <a href="http://opensource.org/licenses/GPL-2.0" target="_blank">GPL</a> licenses.</p>
<h2>Contact</h2>
<p>My XMPP username is <strong>jc@opkode.im</strong>.</p>
<p>You can send me an email via this <a href="http://opkode.com/contact" target="_blank">contact form</a>.</p>
</section>
</div>
<!-- FOOTER -->
......@@ -151,7 +153,7 @@
<div id="collective-xmpp-chat-data"></div>
<div id="toggle-controlbox">
<a href="#" class="chat toggle-online-users">
<strong class="conn-feedback">Click here to chat</strong> <strong style="display: none" id="online-count">(0)</strong>
<strong class="conn-feedback">Toggle chat</strong> <strong style="display: none" id="online-count">(0)</strong>
</a>
</div>
</div>
......@@ -162,4 +164,18 @@
</script>
<script type="text/javascript">try { var pageTracker = _gat._getTracker("UA-2128260-8"); pageTracker._trackPageview(); } catch(err) {}</script>
</body>
<script>
require(["jquery", "converse"], function ($, converse) {
converse.initialize({
auto_list_rooms: false,
auto_subscribe: false,
bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
hide_muc_server: false,
i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported
prebind: false,
show_controlbox_by_default: true,
xhr_user_search: false
});
});
</script>
</html>
(function (root, factory) {
define("af", ['jed'], function () {
var af = new Jed({
"domain": "converse",
"locale_data": {
"converse": {
"": {
"domain": "converse",
"lang": "af",
"plural_forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
"Vertoon hierdie keuselys"
],
"Write in the third person": [
null,
"Skryf in die derde persoon"
],
"Remove messages": [
null,
"Verwyder boodskappe"
],
"Personal message": [
null,
"Persoonlike boodskap"
],
"Contacts": [
null,
"Kontakte"
],
"Online": [
null,
"Aanlyn"
],
"Busy": [
null,
"Besig"
],
"Away": [
null,
"Weg"
],
"Offline": [
null,
"Aflyn"
],
"Click to add new chat contacts": [
null,
"Kliek om nuwe kletskontakte by te voeg"
],
"Add a contact": [
null,
"Voeg 'n kontak by"
],
"Contact username": [
null,
"Konak gebruikersnaam"
],
"Add": [
null,
"Voeg by"
],
"Contact name": [
null,
"Kontaknaam"
],
"Search": [
null,
"Soek"
],
"No users found": [
null,
"Geen gebruikers gevind"
],
"Click to add as a chat contact": [
null,
"Kliek om as kletskontak by te voeg"
],
"Click to open this room": [
null,
"Kliek om hierdie kletskamer te open"
],
"Show more information on this room": [
null,
"Wys meer inligting aangaande hierdie kletskamer"
],
"Description:": [
null,
"Beskrywing:"
],
"Occupants:": [
null,
"Deelnemers:"
],
"Features:": [
null,
"Eienskappe:"
],
"Requires authentication": [
null,
"Benodig magtiging"
],
"Hidden": [
null,
"Verskuil"
],
"Requires an invitation": [
null,
"Benodig 'n uitnodiging"
],
"Moderated": [
null,
"Gemodereer"
],
"Non-anonymous": [
null,
"Nie-anoniem"
],
"Open room": [
null,
"Oop kletskamer"
],
"Permanent room": [
null,
"Permanente kamer"
],
"Public": [
null,
"Publiek"
],
"Semi-anonymous": [
null,
"Deels anoniem"
],
"Temporary room": [
null,
"Tydelike kamer"
],
"Unmoderated": [
null,
"Ongemodereer"
],
"Rooms": [
null,
"Kamers"
],
"Room name": [
null,
"Kamer naam"
],
"Nickname": [
null,
"Bynaam"
],
"Server": [
null,
"Bediener"
],
"Join": [
null,
"Sluit aan"
],
"Show rooms": [
null,
"Wys kamers"
],
"No rooms on %1$s": [
null,
"Geen kamers op %1$s"
],
"Rooms on %1$s": [
null,
"Kamers op %1$s"
],
"Set chatroom topic": [
null,
"Stel kletskamer onderwerp"
],
"Kick user from chatroom": [
null,
"Skop gebruiker uit die kletskamer"
],
"Ban user from chatroom": [
null,
"Verban gebruiker vanuit die kletskamer"
],
"Message": [
null,
"Boodskap"
],
"Save": [
null,
"Stoor"
],
"Cancel": [
null,
"Kanseleer"
],
"An error occurred while trying to save the form.": [
null,
"A fout het voorgekom terwyl probeer is om die vorm te stoor."
],
"This chatroom requires a password": [
null,
"Hiedie kletskamer benodig 'n wagwoord"
],
"Password: ": [
null,
"Wagwoord:"
],
"Submit": [
null,
"Dien in"
],
"This room is not anonymous": [
null,
"Hierdie vertrek is nie anoniem nie"
],
"This room now shows unavailable members": [
null,
"Hierdie vertrek wys nou onbeskikbare lede"
],
"This room does not show unavailable members": [
null,
"Hierdie vertrek wys nie onbeskikbare lede nie"
],
"Non-privacy-related room configuration has changed": [
null,
"Nie-privaatheidverwante kamer instellings het verander"
],
"Room logging is now enabled": [
null,
"Kamer log is nou aangeskakel"
],
"Room logging is now disabled": [
null,
"Kamer log is nou afgeskakel"
],
"This room is now non-anonymous": [
null,
"Hiedie kamer is nou nie anoniem nie"
],
"This room is now semi-anonymous": [
null,
"Hierdie kamer is nou gedeeltelik anoniem"
],
"This room is now fully-anonymous": [
null,
"Hierdie kamer is nou ten volle anoniem"
],
"A new room has been created": [
null,
"'n Nuwe kamer is geskep"
],
"Your nickname has been changed": [
null,
"Jou bynaam is verander"
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> is verban"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> is uitgeskop"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> is verwyder a.g.v 'n verandering van affiliasie"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> is nie 'n lid nie, en dus verwyder"
],
"You have been banned from this room": [
null,
"Jy is uit die kamer verban"
],
"You have been kicked from this room": [
null,
"Jy is uit die kamer geskop"
],
"You have been removed from this room because of an affiliation change": [
null,
"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": [
null,
"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.": [
null,
"Jy is van hierdie kamer verwyder aangesien die MUC (Multi-user chat) diens nou afgeskakel word."
],
"You are not on the member list of this room": [
null,
"Jy is nie op die ledelys van hierdie kamer nie"
],
"No nickname was specified": [
null,
"Geen bynaam verskaf nie"
],
"You are not allowed to create new rooms": [
null,
"Jy word nie toegelaat om nog kamers te skep nie"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Jou bynaam voldoen nie aan die kamer se beleid nie"
],
"Your nickname is already taken": [
null,
"Jou bynaam is reeds geneem"
],
"This room does not (yet) exist": [
null,
"Hierdie kamer bestaan tans (nog) nie"
],
"This room has reached it's maximum number of occupants": [
null,
"Hierdie kamer het sy maksimum aantal deelnemers bereik"
],
"Topic set by %1$s to: %2$s": [
null,
"Onderwerp deur %1$s bygewerk na: %2$s"
],
"This user is a moderator": [
null,
"Hierdie gebruiker is 'n moderator"
],
"This user can send messages in this room": [
null,
"Hierdie gebruiker kan boodskappe na die kamer stuur"
],
"This user can NOT send messages in this room": [
null,
"Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie"
],
"Click to chat with this contact": [
null,
"Kliek om met hierdie kontak te klets"
],
"Click to remove this contact": [
null,
"Kliek om hierdie kontak te verwyder"
],
"Contact requests": [
null,
"Kontak versoeke"
],
"My contacts": [
null,
"My kontakte"
],
"Pending contacts": [
null,
"Hangende kontakte"
],
"Custom status": [
null,
"Doelgemaakte status"
],
"Click to change your chat status": [
null,
"Kliek om jou klets-status te verander"
],
"Click here to write a custom status message": [
null,
"Kliek hier om jou eie statusboodskap te skryf"
],
"online": [
null,
"aanlyn"
],
"busy": [
null,
"besig"
],
"away for long": [
null,
"weg vir lank"
],
"away": [
null,
"weg"
],
"I am %1$s": [
null,
"Ek is %1$s"
],
"Sign in": [
null,
"Teken in"
],
"XMPP/Jabber Username:": [
null,
"XMPP/Jabber Gebruikersnaam:"
],
"Password:": [
null,
"Wagwoord"
],
"Log In": [
null,
"Meld aan"
],
"BOSH Service URL:": [
null,
"BOSH bediener URL"
],
"Connected": [
null,
"Verbind"
],
"Disconnected": [
null,
"Ontkoppel"
],
"Error": [
null,
"Fout"
],
"Connecting": [
null,
"Verbind tans"
],
"Connection Failed": [
null,
"Verbinding het gefaal"
],
"Authenticating": [
null,
"Besig om te bekragtig"
],
"Authentication Failed": [
null,
"Bekragtiging het gefaal"
],
"Disconnecting": [
null,
"Besig om te ontkoppel"
],
"Attached": [
null,
"Geheg"
],
"Online Contacts": [
null,
"Kontakte aanlyn"
]
}
}
});
return factory(af);
});
}(this, function (af) {
return af;
}));
{
"converse": {
"": {
"Project-Id-Version": "Converse.js 0.4",
"Report-Msgid-Bugs-To": "",
"POT-Creation-Date": "2013-06-01 23:02+0200",
"PO-Revision-Date": "2013-06-02 13:26+0200",
"Last-Translator": "JC Brand <jc@opkode.com>",
"Language-Team": "Afrikaans",
"Language": "af",
"MIME-Version": "1.0",
"Content-Type": "text/plain; charset=ASCII",
"Content-Transfer-Encoding": "8bit",
"domain": "converse",
"lang": "af",
"plural_forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
"Vertoon hierdie keuselys"
],
"Write in the third person": [
null,
"Skryf in die derde persoon"
],
"Remove messages": [
null,
"Verwyder boodskappe"
],
"Personal message": [
null,
"Persoonlike boodskap"
],
"Contacts": [
null,
"Kontakte"
],
"Online": [
null,
"Aangemeld"
],
"Busy": [
null,
"Besig"
],
"Away": [
null,
"Afwesig"
],
"Offline": [
null,
"Afgemeld"
],
"Click to add new chat contacts": [
null,
"Kliek om nuwe kletskontakte by te voeg"
],
"Add a contact": [
null,
"Voeg 'n kontak by"
],
"Contact username": [
null,
"Konak gebruikersnaam"
],
"Add": [
null,
"Voeg by"
],
"Contact name": [
null,
"Kontaknaam"
],
"Search": [
null,
"Soek"
],
"No users found": [
null,
"Geen gebruikers gevind"
],
"Click to add as a chat contact": [
null,
"Kliek om as kletskontak by te voeg"
],
"Click to open this room": [
null,
"Kliek om hierdie kletskamer te open"
],
"Show more information on this room": [
null,
"Wys meer inligting aangaande hierdie kletskamer"
],
"Description:": [
null,
"Beskrywing:"
],
"Occupants:": [
null,
"Deelnemers:"
],
"Features:": [
null,
"Eienskappe:"
],
"Requires authentication": [
null,
"Benodig magtiging"
],
"Hidden": [
null,
"Verskuil"
],
"Requires an invitation": [
null,
"Benodig 'n uitnodiging"
],
"Moderated": [
null,
"Gemodereer"
],
"Non-anonymous": [
null,
"Nie-anoniem"
],
"Open room": [
null,
"Oop kletskamer"
],
"Permanent room": [
null,
"Permanente kamer"
],
"Public": [
null,
"Publiek"
],
"Semi-anonymous": [
null,
"Deels anoniem"
],
"Temporary room": [
null,
"Tydelike kamer"
],
"Unmoderated": [
null,
"Ongemodereer"
],
"Rooms": [
null,
"Kamers"
],
"Room name": [
null,
"Kamer naam"
],
"Nickname": [
null,
"Bynaam"
],
"Server": [
null,
"Bediener"
],
"Join": [
null,
"Sluit aan"
],
"Show rooms": [
null,
"Wys kamers"
],
"No rooms on %1$s": [
null,
"Geen kamers op %1$s"
],
"Rooms on %1$s": [
null,
"Kamers op %1$s"
],
"Set chatroom topic": [
null,
"Stel kletskamer onderwerp"
],
"Kick user from chatroom": [
null,
"Skop gebruiker uit die kletskamer"
],
"Ban user from chatroom": [
null,
"Verban gebruiker vanuit die kletskamer"
],
"Message": [
null,
"Boodskap"
],
"Save": [
null,
"Stoor"
],
"Cancel": [
null,
"Kanseleer"
],
"An error occurred while trying to save the form.": [
null,
"A fout het voorgekom terwyl probeer is om die vorm te stoor."
],
"This chatroom requires a password": [
null,
"Hiedie kletskamer benodig 'n wagwoord"
],
"Password: ": [
null,
"Wagwoord:"
],
"Submit": [
null,
"Dien in"
],
"This room is not anonymous": [
null,
"Hierdie vertrek is nie anoniem nie"
],
"This room now shows unavailable members": [
null,
"Hierdie vertrek wys nou onbeskikbare lede"
],
"This room does not show unavailable members": [
null,
"Hierdie vertrek wys nie onbeskikbare lede nie"
],
"Non-privacy-related room configuration has changed": [
null,
"Nie-privaatheidverwante kamer instellings het verander"
],
"Room logging is now enabled": [
null,
"Kamer log is nou aangeskakel"
],
"Room logging is now disabled": [
null,
"Kamer log is nou afgeskakel"
],
"This room is now non-anonymous": [
null,
"Hiedie kamer is nou nie anoniem nie"
],
"This room is now semi-anonymous": [
null,
"Hierdie kamer is nou gedeeltelik anoniem"
],
"This room is now fully-anonymous": [
null,
"Hierdie kamer is nou ten volle anoniem"
],
"A new room has been created": [
null,
"'n Nuwe kamer is geskep"
],
"Your nickname has been changed": [
null,
"Jou bynaam is verander"
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> is verban"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> is uitgeskop"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> is verwyder a.g.v 'n verandering van affiliasie"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> is nie 'n lid nie, en dus verwyder"
],
"You have been banned from this room": [
null,
"Jy is uit die kamer verban"
],
"You have been kicked from this room": [
null,
"Jy is uit die kamer geskop"
],
"You have been removed from this room because of an affiliation change": [
null,
"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": [
null,
"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.": [
null,
"Jy is van hierdie kamer verwyder aangesien die MUC (Multi-user chat) diens nou afgeskakel word."
],
"You are not on the member list of this room": [
null,
"Jy is nie op die ledelys van hierdie kamer nie"
],
"No nickname was specified": [
null,
"Geen bynaam verskaf nie"
],
"You are not allowed to create new rooms": [
null,
"Jy word nie toegelaat om nog kamers te skep nie"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Jou bynaam voldoen nie aan die kamer se beleid nie"
],
"Your nickname is already taken": [
null,
"Jou bynaam is reeds geneem"
],
"This room does not (yet) exist": [
null,
"Hierdie kamer bestaan tans (nog) nie"
],
"This room has reached it's maximum number of occupants": [
null,
"Hierdie kamer het sy maksimum aantal deelnemers bereik"
],
"Topic set by %1$s to: %2$s": [
null,
"Onderwerp deur %1$s bygewerk na: %2$s"
],
"This user is a moderator": [
null,
"Hierdie gebruiker is 'n moderator"
],
"This user can send messages in this room": [
null,
"Hierdie gebruiker kan boodskappe na die kamer stuur"
],
"This user can NOT send messages in this room": [
null,
"Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie"
],
"Click to chat with this contact": [
null,
"Kliek om met hierdie kontak te klets"
],
"Click to remove this contact": [
null,
"Kliek om hierdie kontak te verwyder"
],
"Contact requests": [
null,
"Kontak versoeke"
],
"My contacts": [
null,
"My kontakte"
],
"Pending contacts": [
null,
"Hangende kontakte"
],
"Custom status": [
null,
"Doelgemaakte status"
],
"Click to change your chat status": [
null,
"Kliek om jou klets-status te verander"
],
"Click here to write a custom status message": [
null,
"Kliek hier om jou eie statusboodskap te skryf"
],
"online": [
null,
"aangemeld"
],
"busy": [
null,
"besig"
],
"away for long": [
null,
"vir lank afwesig"
],
"away": [
null,
"afwesig"
],
"I am %1$s": [
null,
"Ek is %1$s"
],
"Sign in": [
null,
"Teken in"
],
"XMPP/Jabber Username:": [
null,
"XMPP/Jabber Gebruikersnaam:"
],
"Password:": [
null,
"Wagwoord"
],
"Log In": [
null,
"Meld aan"
],
"BOSH Service URL:": [
null,
"BOSH bediener URL"
],
"Connected": [
null,
"Verbind"
],
"Disconnected": [
null,
"Verbindung onderbreek"
],
"Error": [
null,
"Fout"
],
"Connecting": [
null,
"Verbind tans"
],
"Connection Failed": [
null,
"Verbinding het gefaal"
],
"Authenticating": [
null,
"Besig om te bekragtig"
],
"Authentication Failed": [
null,
"Bekragtiging het gefaal"
],
"Disconnecting": [
null,
"Onderbreek verbinding"
],
"Attached": [
null,
"Geheg"
],
"Online Contacts": [
null,
"Kontakte aangemeld"
]
}
}
\ No newline at end of file
# Afrikaans translations for Converse.js package.
# Copyright (C) 2013 Jan-Carel Brand
# This file is distributed under the same license as the Converse.js package.
# JC Brand <jc@opkode.com>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 23:02+0200\n"
"PO-Revision-Date: 2013-06-02 13:26+0200\n"
"Last-Translator: JC Brand <jc@opkode.com>\n"
"Language-Team: Afrikaans\n"
"Language: af\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"domain: converse\n"
"lang: af\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
# The last three values are needed by Jed (a Javascript translations library)
#: converse.js:397 converse.js:1128
msgid "Show this menu"
msgstr "Vertoon hierdie keuselys"
#: converse.js:398 converse.js:1129
msgid "Write in the third person"
msgstr "Skryf in die derde persoon"
#: converse.js:399 converse.js:1133
msgid "Remove messages"
msgstr "Verwyder boodskappe"
#: converse.js:539
msgid "Personal message"
msgstr "Persoonlike boodskap"
#: converse.js:613
msgid "Contacts"
msgstr "Kontakte"
#: converse.js:618
msgid "Online"
msgstr "Aangemeld"
#: converse.js:619
msgid "Busy"
msgstr "Besig"
#: converse.js:620
msgid "Away"
msgstr "Afwesig"
#: converse.js:621
msgid "Offline"
msgstr "Afgemeld"
#: converse.js:628
msgid "Click to add new chat contacts"
msgstr "Kliek om nuwe kletskontakte by te voeg"
#: converse.js:628
msgid "Add a contact"
msgstr "Voeg 'n kontak by"
#: converse.js:637
msgid "Contact username"
msgstr "Konak gebruikersnaam"
#: converse.js:638
msgid "Add"
msgstr "Voeg by"
#: converse.js:646
msgid "Contact name"
msgstr "Kontaknaam"
#: converse.js:647
msgid "Search"
msgstr "Soek"
#: converse.js:682
msgid "No users found"
msgstr "Geen gebruikers gevind"
#: converse.js:689
msgid "Click to add as a chat contact"
msgstr "Kliek om as kletskontak by te voeg"
#: converse.js:753
msgid "Click to open this room"
msgstr "Kliek om hierdie kletskamer te open"
#: converse.js:755
msgid "Show more information on this room"
msgstr "Wys meer inligting aangaande hierdie kletskamer"
#: converse.js:760
msgid "Description:"
msgstr "Beskrywing:"
#: converse.js:761
msgid "Occupants:"
msgstr "Deelnemers:"
#: converse.js:762
msgid "Features:"
msgstr "Eienskappe:"
#: converse.js:764
msgid "Requires authentication"
msgstr "Benodig magtiging"
#: converse.js:767
msgid "Hidden"
msgstr "Verskuil"
#: converse.js:770
msgid "Requires an invitation"
msgstr "Benodig 'n uitnodiging"
#: converse.js:773
msgid "Moderated"
msgstr "Gemodereer"
#: converse.js:776
msgid "Non-anonymous"
msgstr "Nie-anoniem"
#: converse.js:779
msgid "Open room"
msgstr "Oop kletskamer"
#: converse.js:782
msgid "Permanent room"
msgstr "Permanente kamer"
#: converse.js:785
msgid "Public"
msgstr "Publiek"
#: converse.js:788
msgid "Semi-anonymous"
msgstr "Deels anoniem"
#: converse.js:791
msgid "Temporary room"
msgstr "Tydelike kamer"
#: converse.js:794
msgid "Unmoderated"
msgstr "Ongemodereer"
#: converse.js:800
msgid "Rooms"
msgstr "Kamers"
#: converse.js:804
msgid "Room name"
msgstr "Kamer naam"
#: converse.js:805
msgid "Nickname"
msgstr "Bynaam"
#: converse.js:806
msgid "Server"
msgstr "Bediener"
#: converse.js:807
msgid "Join"
msgstr "Sluit aan"
#: converse.js:808
msgid "Show rooms"
msgstr "Wys kamers"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:841
msgid "No rooms on %1$s"
msgstr "Geen kamers op %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
#: converse.js:856
msgid "Rooms on %1$s"
msgstr "Kamers op %1$s"
#: converse.js:1130
msgid "Set chatroom topic"
msgstr "Stel kletskamer onderwerp"
#: converse.js:1131
msgid "Kick user from chatroom"
msgstr "Skop gebruiker uit die kletskamer"
#: converse.js:1132
msgid "Ban user from chatroom"
msgstr "Verban gebruiker vanuit die kletskamer"
#: converse.js:1159
msgid "Message"
msgstr "Boodskap"
#: converse.js:1273 converse.js:2318
msgid "Save"
msgstr "Stoor"
#: converse.js:1274
msgid "Cancel"
msgstr "Kanseleer"
#: converse.js:1321
msgid "An error occurred while trying to save the form."
msgstr "A fout het voorgekom terwyl probeer is om die vorm te stoor."
#: converse.js:1367
msgid "This chatroom requires a password"
msgstr "Hiedie kletskamer benodig 'n wagwoord"
#: converse.js:1368
msgid "Password: "
msgstr "Wagwoord:"
#: converse.js:1369
msgid "Submit"
msgstr "Dien in"
#: converse.js:1383
msgid "This room is not anonymous"
msgstr "Hierdie vertrek is nie anoniem nie"
#: converse.js:1384
msgid "This room now shows unavailable members"
msgstr "Hierdie vertrek wys nou onbeskikbare lede"
#: converse.js:1385
msgid "This room does not show unavailable members"
msgstr "Hierdie vertrek wys nie onbeskikbare lede nie"
#: converse.js:1386
msgid "Non-privacy-related room configuration has changed"
msgstr "Nie-privaatheidverwante kamer instellings het verander"
#: converse.js:1387
msgid "Room logging is now enabled"
msgstr "Kamer log is nou aangeskakel"
#: converse.js:1388
msgid "Room logging is now disabled"
msgstr "Kamer log is nou afgeskakel"
#: converse.js:1389
msgid "This room is now non-anonymous"
msgstr "Hiedie kamer is nou nie anoniem nie"
#: converse.js:1390
msgid "This room is now semi-anonymous"
msgstr "Hierdie kamer is nou gedeeltelik anoniem"
#: converse.js:1391
msgid "This room is now fully-anonymous"
msgstr "Hierdie kamer is nou ten volle anoniem"
#: converse.js:1392
msgid "A new room has been created"
msgstr "'n Nuwe kamer is geskep"
#: converse.js:1393
msgid "Your nickname has been changed"
msgstr "Jou bynaam is verander"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been banned
#: converse.js:1400
msgid "<strong>%1$s</strong> has been banned"
msgstr "<strong>%1$s</strong> is verban"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been kicked out
#: converse.js:1404
msgid "<strong>%1$s</strong> has been kicked out"
msgstr "<strong>%1$s</strong> is uitgeskop"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
#: converse.js:1408
msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr "<strong>%1$s</strong> is verwyder a.g.v 'n verandering van affiliasie"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed for not being a member
#: converse.js:1412
msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr "<strong>%1$s</strong> is nie 'n lid nie, en dus verwyder"
#: converse.js:1416 converse.js:1478
msgid "You have been banned from this room"
msgstr "Jy is uit die kamer verban"
#: converse.js:1417
msgid "You have been kicked from this room"
msgstr "Jy is uit die kamer geskop"
#: converse.js:1418
msgid "You have been removed from this room because of an affiliation change"
msgstr "Jy is vanuit die kamer verwyder a.g.v 'n verandering van affiliasie"
#: converse.js:1419
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr ""
"Jy is vanuit die kamer verwyder omdat die kamer nou slegs tot lede beperk "
"word en jy nie 'n lid is nie."
#: converse.js:1420
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr ""
"Jy is van hierdie kamer verwyder aangesien die MUC (Multi-user chat) diens "
"nou afgeskakel word."
#: converse.js:1476
msgid "You are not on the member list of this room"
msgstr "Jy is nie op die ledelys van hierdie kamer nie"
#: converse.js:1482
msgid "No nickname was specified"
msgstr "Geen bynaam verskaf nie"
#: converse.js:1486
msgid "You are not allowed to create new rooms"
msgstr "Jy word nie toegelaat om nog kamers te skep nie"
#: converse.js:1488
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Jou bynaam voldoen nie aan die kamer se beleid nie"
#: converse.js:1490
msgid "Your nickname is already taken"
msgstr "Jou bynaam is reeds geneem"
#: converse.js:1492
msgid "This room does not (yet) exist"
msgstr "Hierdie kamer bestaan tans (nog) nie"
#: converse.js:1494
msgid "This room has reached it's maximum number of occupants"
msgstr "Hierdie kamer het sy maksimum aantal deelnemers bereik"
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1571
msgid "Topic set by %1$s to: %2$s"
msgstr "Onderwerp deur %1$s bygewerk na: %2$s"
#: converse.js:1587
msgid "This user is a moderator"
msgstr "Hierdie gebruiker is 'n moderator"
#: converse.js:1590
msgid "This user can send messages in this room"
msgstr "Hierdie gebruiker kan boodskappe na die kamer stuur"
#: converse.js:1593
msgid "This user can NOT send messages in this room"
msgstr "Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie"
#: converse.js:1796
msgid "Click to chat with this contact"
msgstr "Kliek om met hierdie kontak te klets"
#: converse.js:1797 converse.js:1801
msgid "Click to remove this contact"
msgstr "Kliek om hierdie kontak te verwyder"
#: converse.js:2163
msgid "Contact requests"
msgstr "Kontak versoeke"
#: converse.js:2164
msgid "My contacts"
msgstr "My kontakte"
#: converse.js:2165
msgid "Pending contacts"
msgstr "Hangende kontakte"
#: converse.js:2317
msgid "Custom status"
msgstr "Doelgemaakte status"
#: converse.js:2323
msgid "Click to change your chat status"
msgstr "Kliek om jou klets-status te verander"
#: converse.js:2326
msgid "Click here to write a custom status message"
msgstr "Kliek hier om jou eie statusboodskap te skryf"
#: converse.js:2355 converse.js:2363
msgid "online"
msgstr "aangemeld"
#: converse.js:2357
msgid "busy"
msgstr "besig"
#: converse.js:2359
msgid "away for long"
msgstr "vir lank afwesig"
#: converse.js:2361
msgid "away"
msgstr "afwesig"
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2375 converse.js:2409
msgid "I am %1$s"
msgstr "Ek is %1$s"
#: converse.js:2480
msgid "Sign in"
msgstr "Teken in"
#: converse.js:2483
msgid "XMPP/Jabber Username:"
msgstr "XMPP/Jabber Gebruikersnaam:"
#: converse.js:2485
msgid "Password:"
msgstr "Wagwoord"
#: converse.js:2487
msgid "Log In"
msgstr "Meld aan"
#: converse.js:2491
msgid "BOSH Service URL:"
msgstr "BOSH bediener URL"
#: converse.js:2503
msgid "Connected"
msgstr "Verbind"
#: converse.js:2507
msgid "Disconnected"
msgstr "Verbindung onderbreek"
#: converse.js:2511
msgid "Error"
msgstr "Fout"
#: converse.js:2513
msgid "Connecting"
msgstr "Verbind tans"
#: converse.js:2516
msgid "Connection Failed"
msgstr "Verbinding het gefaal"
#: converse.js:2518
msgid "Authenticating"
msgstr "Besig om te bekragtig"
#: converse.js:2521
msgid "Authentication Failed"
msgstr "Bekragtiging het gefaal"
#: converse.js:2523
msgid "Disconnecting"
msgstr "Onderbreek verbinding"
#: converse.js:2525
msgid "Attached"
msgstr "Geheg"
#: converse.js:2656
msgid "Online Contacts"
msgstr "Kontakte aangemeld"
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Jan-Carel Brand
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 23:03+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: converse.js:397 converse.js:1128
msgid "Show this menu"
msgstr ""
#: converse.js:398 converse.js:1129
msgid "Write in the third person"
msgstr ""
#: converse.js:399 converse.js:1133
msgid "Remove messages"
msgstr ""
#: converse.js:539
msgid "Personal message"
msgstr ""
#: converse.js:613
msgid "Contacts"
msgstr ""
#: converse.js:618
msgid "Online"
msgstr ""
#: converse.js:619
msgid "Busy"
msgstr ""
#: converse.js:620
msgid "Away"
msgstr ""
#: converse.js:621
msgid "Offline"
msgstr ""
#: converse.js:628
msgid "Click to add new chat contacts"
msgstr ""
#: converse.js:628
msgid "Add a contact"
msgstr ""
#: converse.js:637
msgid "Contact username"
msgstr ""
#: converse.js:638
msgid "Add"
msgstr ""
#: converse.js:646
msgid "Contact name"
msgstr ""
#: converse.js:647
msgid "Search"
msgstr ""
#: converse.js:682
msgid "No users found"
msgstr ""
#: converse.js:689
msgid "Click to add as a chat contact"
msgstr ""
#: converse.js:753
msgid "Click to open this room"
msgstr ""
#: converse.js:755
msgid "Show more information on this room"
msgstr ""
#: converse.js:760
msgid "Description:"
msgstr ""
#: converse.js:761
msgid "Occupants:"
msgstr ""
#: converse.js:762
msgid "Features:"
msgstr ""
#: converse.js:764
msgid "Requires authentication"
msgstr ""
#: converse.js:767
msgid "Hidden"
msgstr ""
#: converse.js:770
msgid "Requires an invitation"
msgstr ""
#: converse.js:773
msgid "Moderated"
msgstr ""
#: converse.js:776
msgid "Non-anonymous"
msgstr ""
#: converse.js:779
msgid "Open room"
msgstr ""
#: converse.js:782
msgid "Permanent room"
msgstr ""
#: converse.js:785
msgid "Public"
msgstr ""
#: converse.js:788
msgid "Semi-anonymous"
msgstr ""
#: converse.js:791
msgid "Temporary room"
msgstr ""
#: converse.js:794
msgid "Unmoderated"
msgstr ""
#: converse.js:800
msgid "Rooms"
msgstr ""
#: converse.js:804
msgid "Room name"
msgstr ""
#: converse.js:805
msgid "Nickname"
msgstr ""
#: converse.js:806
msgid "Server"
msgstr ""
#: converse.js:807
msgid "Join"
msgstr ""
#: converse.js:808
msgid "Show rooms"
msgstr ""
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:841
msgid "No rooms on %1$s"
msgstr ""
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
#: converse.js:856
msgid "Rooms on %1$s"
msgstr ""
#: converse.js:1130
msgid "Set chatroom topic"
msgstr ""
#: converse.js:1131
msgid "Kick user from chatroom"
msgstr ""
#: converse.js:1132
msgid "Ban user from chatroom"
msgstr ""
#: converse.js:1159
msgid "Message"
msgstr ""
#: converse.js:1273 converse.js:2318
msgid "Save"
msgstr ""
#: converse.js:1274
msgid "Cancel"
msgstr ""
#: converse.js:1321
msgid "An error occurred while trying to save the form."
msgstr ""
#: converse.js:1367
msgid "This chatroom requires a password"
msgstr ""
#: converse.js:1368
msgid "Password: "
msgstr ""
#: converse.js:1369
msgid "Submit"
msgstr ""
#: converse.js:1383
msgid "This room is not anonymous"
msgstr ""
#: converse.js:1384
msgid "This room now shows unavailable members"
msgstr ""
#: converse.js:1385
msgid "This room does not show unavailable members"
msgstr ""
#: converse.js:1386
msgid "Non-privacy-related room configuration has changed"
msgstr ""
#: converse.js:1387
msgid "Room logging is now enabled"
msgstr ""
#: converse.js:1388
msgid "Room logging is now disabled"
msgstr ""
#: converse.js:1389
msgid "This room is now non-anonymous"
msgstr ""
#: converse.js:1390
msgid "This room is now semi-anonymous"
msgstr ""
#: converse.js:1391
msgid "This room is now fully-anonymous"
msgstr ""
#: converse.js:1392
msgid "A new room has been created"
msgstr ""
#: converse.js:1393
msgid "Your nickname has been changed"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been banned
#: converse.js:1400
msgid "<strong>%1$s</strong> has been banned"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been kicked out
#: converse.js:1404
msgid "<strong>%1$s</strong> has been kicked out"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
#: converse.js:1408
msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed for not being a member
#: converse.js:1412
msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr ""
#: converse.js:1416 converse.js:1478
msgid "You have been banned from this room"
msgstr ""
#: converse.js:1417
msgid "You have been kicked from this room"
msgstr ""
#: converse.js:1418
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
#: converse.js:1419
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:1420
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr ""
#: converse.js:1476
msgid "You are not on the member list of this room"
msgstr ""
#: converse.js:1482
msgid "No nickname was specified"
msgstr ""
#: converse.js:1486
msgid "You are not allowed to create new rooms"
msgstr ""
#: converse.js:1488
msgid "Your nickname doesn't conform to this room's policies"
msgstr ""
#: converse.js:1490
msgid "Your nickname is already taken"
msgstr ""
#: converse.js:1492
msgid "This room does not (yet) exist"
msgstr ""
#: converse.js:1494
msgid "This room has reached it's maximum number of occupants"
msgstr ""
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1571
msgid "Topic set by %1$s to: %2$s"
msgstr ""
#: converse.js:1587
msgid "This user is a moderator"
msgstr ""
#: converse.js:1590
msgid "This user can send messages in this room"
msgstr ""
#: converse.js:1593
msgid "This user can NOT send messages in this room"
msgstr ""
#: converse.js:1796
msgid "Click to chat with this contact"
msgstr ""
#: converse.js:1797 converse.js:1801
msgid "Click to remove this contact"
msgstr ""
#: converse.js:2163
msgid "Contact requests"
msgstr ""
#: converse.js:2164
msgid "My contacts"
msgstr ""
#: converse.js:2165
msgid "Pending contacts"
msgstr ""
#: converse.js:2317
msgid "Custom status"
msgstr ""
#: converse.js:2323
msgid "Click to change your chat status"
msgstr ""
#: converse.js:2326
msgid "Click here to write a custom status message"
msgstr ""
#: converse.js:2355 converse.js:2363
msgid "online"
msgstr ""
#: converse.js:2357
msgid "busy"
msgstr ""
#: converse.js:2359
msgid "away for long"
msgstr ""
#: converse.js:2361
msgid "away"
msgstr ""
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2375 converse.js:2409
msgid "I am %1$s"
msgstr ""
#: converse.js:2480
msgid "Sign in"
msgstr ""
#: converse.js:2483
msgid "XMPP/Jabber Username:"
msgstr ""
#: converse.js:2485
msgid "Password:"
msgstr ""
#: converse.js:2487
msgid "Log In"
msgstr ""
#: converse.js:2491
msgid "BOSH Service URL:"
msgstr ""
#: converse.js:2503
msgid "Connected"
msgstr ""
#: converse.js:2507
msgid "Disconnected"
msgstr ""
#: converse.js:2511
msgid "Error"
msgstr ""
#: converse.js:2513
msgid "Connecting"
msgstr ""
#: converse.js:2516
msgid "Connection Failed"
msgstr ""
#: converse.js:2518
msgid "Authenticating"
msgstr ""
#: converse.js:2521
msgid "Authentication Failed"
msgstr ""
#: converse.js:2523
msgid "Disconnecting"
msgstr ""
#: converse.js:2525
msgid "Attached"
msgstr ""
#: converse.js:2656
msgid "Online Contacts"
msgstr ""
{
"converse": {
"": {
"Project-Id-Version": "Converse.js 0.4",
"Report-Msgid-Bugs-To": "",
"POT-Creation-Date": "2013-06-01 23:03+0200",
"PO-Revision-Date": "2013-06-02 13:58+0200",
"Last-Translator": "JC Brand <jc@opkode.com>",
"Language-Team": "German",
"Language": "de",
"MIME-Version": "1.0",
"Content-Type": "text/plain; charset=ASCII",
"Content-Transfer-Encoding": "8bit",
"Plural-Forms": "nplurals=2; plural=(n != 1);",
"domain": "converse",
"lang": "de",
"plural_forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
"Dieses Menü anzeigen"
],
"Write in the third person": [
null,
"In der dritten Person schreiben"
],
"Remove messages": [
null,
"Nachrichten entfernen"
],
"Personal message": [
null,
"Persönliche Nachricht"
],
"Contacts": [
null,
"Kontakte"
],
"Online": [
null,
"Online"
],
"Busy": [
null,
"Beschäfticht"
],
"Away": [
null,
"Abwesend"
],
"Offline": [
null,
"Abgemeldet"
],
"Click to add new chat contacts": [
null,
"Klicken Sie, um einen neuen Kontakt hinzuzufügen"
],
"Add a contact": [
null,
"Kontakte hinzufügen"
],
"Contact username": [
null,
"Benutzername"
],
"Add": [
null,
"Hinzufügen"
],
"Contact name": [
null,
"Name des Kontakts"
],
"Search": [
null,
"Suche"
],
"No users found": [
null,
"Keine Benutzer gefunden"
],
"Click to add as a chat contact": [
null,
"Hier klicken um als Kontakt hinzuzufügen"
],
"Click to open this room": [
null,
"Hier klicken um diesen Raum zu öffnen"
],
"Show more information on this room": [
null,
"Mehr Information über diesen Raum zeigen"
],
"Description:": [
null,
"Beschreibung"
],
"Occupants:": [
null,
"Teilnehmer"
],
"Features:": [
null,
"Funktionen:"
],
"Requires authentication": [
null,
"Authentifizierung erforderlich"
],
"Hidden": [
null,
"Versteckt"
],
"Requires an invitation": [
null,
"Einladung erforderlich"
],
"Moderated": [
null,
"Moderiert"
],
"Non-anonymous": [
null,
"Nicht anonym"
],
"Open room": [
null,
"Offener Raum"
],
"Permanent room": [
null,
"Dauerhafter Raum"
],
"Public": [
null,
"Öffentlich"
],
"Semi-anonymous": [
null,
"Teils anonym"
],
"Temporary room": [
null,
"Vorübergehender Raum"
],
"Unmoderated": [
null,
"Unmoderiert"
],
"Rooms": [
null,
"Räume"
],
"Room name": [
null,
"Raumname"
],
"Nickname": [
null,
"Spitzname"
],
"Server": [
null,
"Server"
],
"Join": [
null,
"Beitreten"
],
"Show rooms": [
null,
"Räume anzeigen"
],
"No rooms on %1$s": [
null,
"Keine Räume auf %1$s"
],
"Rooms on %1$s": [
null,
"Räume auf %1$s"
],
"Set chatroom topic": [
null,
"Chatraum Thema festlegen"
],
"Kick user from chatroom": [
null,
"Werfe einen Benutzer aus dem Raum."
],
"Ban user from chatroom": [
null,
"Verbanne einen Benutzer aus dem Raum."
],
"Message": [
null,
"Nachricht"
],
"Save": [
null,
"Speichern"
],
"Cancel": [
null,
"Abbrechen"
],
"An error occurred while trying to save the form.": [
null,
"Beim Speichern der Formular is ein Fehler aufgetreten."
],
"This chatroom requires a password": [
null,
"Passwort wird für die Anmeldung benötigt."
],
"Password: ": [
null,
"Passwort: "
],
"Submit": [
null,
"Einreichen"
],
"This room is not anonymous": [
null,
"Dieser Raum ist nicht anonym"
],
"This room now shows unavailable members": [
null,
"Dieser Raum zeigt jetzt unferfügbare Mitglieder"
],
"This room does not show unavailable members": [
null,
"Dieser Raum zeigt nicht unverfügbare Mitglieder"
],
"Non-privacy-related room configuration has changed": [
null,
"Die Konfiguration, die nicht auf die Privatsphäre bezogen ist, hat sich geändert"
],
"Room logging is now enabled": [
null,
"Zukünftige Nachrichten dieses Raums werden protokolliert."
],
"Room logging is now disabled": [
null,
"Zukünftige Nachrichten dieses Raums werden nicht protokolliert."
],
"This room is now non-anonymous": [
null,
"Dieser Raum ist jetzt nicht anonym"
],
"This room is now semi-anonymous": [
null,
"Dieser Raum ist jetzt teils anonym"
],
"This room is now fully-anonymous": [
null,
"Dieser Raum ist jetzt anonym"
],
"A new room has been created": [
null,
"Einen neuen Raum ist erstellen"
],
"Your nickname has been changed": [
null,
"Spitzname festgelegen"
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> ist verbannt"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> ist hinausgeworfen"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> wurde wegen einer Zugehörigkeitsänderung entfernt"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> ist kein Mitglied und wurde daher entfernt"
],
"You have been banned from this room": [
null,
"Sie sind aus diesem Raum verbannt worden"
],
"You have been kicked from this room": [
null,
"Sie wurden aus diesem Raum hinausgeworfen"
],
"You have been removed from this room because of an affiliation change": [
null,
"Sie wurden wegen einer Zugehörigkeitsänderung entfernt"
],
"You have been removed from this room because the room has changed to members-only and you're not a member": [
null,
"Sie wurden aus diesem Raum entfernt da Sie kein Mitglied sind."
],
"You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
null,
"Sie werden aus diesem Raum entfernt da der MUC (Muli-user chat) Dienst gerade abgeschalten wird."
],
"You are not on the member list of this room": [
null,
"Sie sind nicht auf der Mitgliederliste dieses Raums"
],
"No nickname was specified": [
null,
"Kein Spitzname festgelegt"
],
"You are not allowed to create new rooms": [
null,
"Es ist Ihnen nicht erlaubt, neue Räume anzulegen"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Ungültiger Spitzname"
],
"Your nickname is already taken": [
null,
"Ihre Spitzname existiert bereits."
],
"This room does not (yet) exist": [
null,
"Dieser Raum existiert (noch) nicht"
],
"This room has reached it's maximum number of occupants": [
null,
"Dieser Raum hat die maximale Mitgliederanzahl erreicht"
],
"Topic set by %1$s to: %2$s": [
null,
"%1$s hat das Thema zu \"%2$s\" abgeändert"
],
"This user is a moderator": [
null,
"Dieser Benutzer ist ein Moderator"
],
"This user can send messages in this room": [
null,
"Dieser Benutzer kann Nachrichten in diesem Raum verschicken"
],
"This user can NOT send messages in this room": [
null,
"Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"
],
"Click to chat with this contact": [
null,
"Hier klicken um mit diesem Kontakt zu chatten"
],
"Click to remove this contact": [
null,
"Hier klicken um diesen Kontakt zu entfernen"
],
"Contact requests": [
null,
"Kontaktanfragen"
],
"My contacts": [
null,
"Meine Kontakte"
],
"Pending contacts": [
null,
"Unbestätigte Kontakte"
],
"Custom status": [
null,
"Status-Nachricht"
],
"Click to change your chat status": [
null,
"Klicken Sie, um ihrer Status to ändern"
],
"Click here to write a custom status message": [
null,
"Klicken Sie hier, um ihrer Status-Nachricht to ändern"
],
"online": [
null,
"online"
],
"busy": [
null,
"beschäfticht"
],
"away for long": [
null,
"länger abwesend"
],
"away": [
null,
"abwesend"
],
"I am %1$s": [
null,
"Ich bin %1$s"
],
"Sign in": [
null,
"Anmelden"
],
"XMPP/Jabber Username:": [
null,
"XMPP/Jabber Benutzername"
],
"Password:": [
null,
"Passwort:"
],
"Log In": [
null,
"Anmelden"
],
"BOSH Service URL:": [
null,
"BOSH "
],
"Connected": [
null,
"Verbunden"
],
"Disconnected": [
null,
"Verbindung unterbrochen."
],
"Error": [
null,
"Fehler"
],
"Connecting": [
null,
"Verbindungsaufbau …"
],
"Connection Failed": [
null,
"Entfernte Verbindung fehlgeschlagen"
],
"Authenticating": [
null,
"Authentifizierung"
],
"Authentication Failed": [
null,
"Authentifizierung gescheitert"
],
"Disconnecting": [
null,
"Trenne Verbindung"
],
"Attached": [
null,
"Angehängt"
],
"Online Contacts": [
null,
"Online-Kontakte"
]
}
}
\ No newline at end of file
# German translations for Converse.js package.
# Copyright (C) 2013 Jan-Carel Brand
# This file is distributed under the same license as the Converse.js package.
# JC Brand <jc@opkode.com>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 23:03+0200\n"
"PO-Revision-Date: 2013-06-02 13:58+0200\n"
"Last-Translator: JC Brand <jc@opkode.com>\n"
"Language-Team: German\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"domain: converse\n"
"lang: de\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
#: converse.js:397 converse.js:1128
msgid "Show this menu"
msgstr "Dieses Menü anzeigen"
#: converse.js:398 converse.js:1129
msgid "Write in the third person"
msgstr "In der dritten Person schreiben"
#: converse.js:399 converse.js:1133
msgid "Remove messages"
msgstr "Nachrichten entfernen"
#: converse.js:539
msgid "Personal message"
msgstr "Persönliche Nachricht"
#: converse.js:613
msgid "Contacts"
msgstr "Kontakte"
#: converse.js:618
msgid "Online"
msgstr "Online"
#: converse.js:619
msgid "Busy"
msgstr "Beschäfticht"
#: converse.js:620
msgid "Away"
msgstr "Abwesend"
#: converse.js:621
msgid "Offline"
msgstr "Abgemeldet"
#: converse.js:628
msgid "Click to add new chat contacts"
msgstr "Klicken Sie, um einen neuen Kontakt hinzuzufügen"
#: converse.js:628
msgid "Add a contact"
msgstr "Kontakte hinzufügen"
#: converse.js:637
msgid "Contact username"
msgstr "Benutzername"
#: converse.js:638
msgid "Add"
msgstr "Hinzufügen"
#: converse.js:646
msgid "Contact name"
msgstr "Name des Kontakts"
#: converse.js:647
msgid "Search"
msgstr "Suche"
#: converse.js:682
msgid "No users found"
msgstr "Keine Benutzer gefunden"
#: converse.js:689
msgid "Click to add as a chat contact"
msgstr "Hier klicken um als Kontakt hinzuzufügen"
#: converse.js:753
msgid "Click to open this room"
msgstr "Hier klicken um diesen Raum zu öffnen"
#: converse.js:755
msgid "Show more information on this room"
msgstr "Mehr Information über diesen Raum zeigen"
#: converse.js:760
msgid "Description:"
msgstr "Beschreibung"
#: converse.js:761
msgid "Occupants:"
msgstr "Teilnehmer"
#: converse.js:762
msgid "Features:"
msgstr "Funktionen:"
#: converse.js:764
msgid "Requires authentication"
msgstr "Authentifizierung erforderlich"
#: converse.js:767
msgid "Hidden"
msgstr "Versteckt"
#: converse.js:770
msgid "Requires an invitation"
msgstr "Einladung erforderlich"
#: converse.js:773
msgid "Moderated"
msgstr "Moderiert"
#: converse.js:776
msgid "Non-anonymous"
msgstr "Nicht anonym"
#: converse.js:779
msgid "Open room"
msgstr "Offener Raum"
#: converse.js:782
msgid "Permanent room"
msgstr "Dauerhafter Raum"
#: converse.js:785
msgid "Public"
msgstr "Öffentlich"
#: converse.js:788
msgid "Semi-anonymous"
msgstr "Teils anonym"
#: converse.js:791
msgid "Temporary room"
msgstr "Vorübergehender Raum"
#: converse.js:794
msgid "Unmoderated"
msgstr "Unmoderiert"
#: converse.js:800
msgid "Rooms"
msgstr "Räume"
#: converse.js:804
msgid "Room name"
msgstr "Raumname"
#: converse.js:805
msgid "Nickname"
msgstr "Spitzname"
#: converse.js:806
msgid "Server"
msgstr "Server"
#: converse.js:807
msgid "Join"
msgstr "Beitreten"
#: converse.js:808
msgid "Show rooms"
msgstr "Räume anzeigen"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:841
msgid "No rooms on %1$s"
msgstr "Keine Räume auf %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
#: converse.js:856
msgid "Rooms on %1$s"
msgstr "Räume auf %1$s"
#: converse.js:1130
msgid "Set chatroom topic"
msgstr "Chatraum Thema festlegen"
#: converse.js:1131
msgid "Kick user from chatroom"
msgstr "Werfe einen Benutzer aus dem Raum."
#: converse.js:1132
msgid "Ban user from chatroom"
msgstr "Verbanne einen Benutzer aus dem Raum."
#: converse.js:1159
msgid "Message"
msgstr "Nachricht"
#: converse.js:1273 converse.js:2318
msgid "Save"
msgstr "Speichern"
#: converse.js:1274
msgid "Cancel"
msgstr "Abbrechen"
#: converse.js:1321
msgid "An error occurred while trying to save the form."
msgstr "Beim Speichern der Formular is ein Fehler aufgetreten."
#: converse.js:1367
msgid "This chatroom requires a password"
msgstr "Passwort wird für die Anmeldung benötigt."
#: converse.js:1368
msgid "Password: "
msgstr "Passwort: "
#: converse.js:1369
msgid "Submit"
msgstr "Einreichen"
#: converse.js:1383
msgid "This room is not anonymous"
msgstr "Dieser Raum ist nicht anonym"
#: converse.js:1384
msgid "This room now shows unavailable members"
msgstr "Dieser Raum zeigt jetzt unferfügbare Mitglieder"
#: converse.js:1385
msgid "This room does not show unavailable members"
msgstr "Dieser Raum zeigt nicht unverfügbare Mitglieder"
#: converse.js:1386
msgid "Non-privacy-related room configuration has changed"
msgstr "Die Konfiguration, die nicht auf die Privatsphäre bezogen ist, hat sich geändert"
#: converse.js:1387
msgid "Room logging is now enabled"
msgstr ""
"Zukünftige Nachrichten dieses Raums werden "
"protokolliert."
#: converse.js:1388
msgid "Room logging is now disabled"
msgstr ""
"Zukünftige Nachrichten dieses Raums werden nicht "
"protokolliert."
#: converse.js:1389
msgid "This room is now non-anonymous"
msgstr "Dieser Raum ist jetzt nicht anonym"
#: converse.js:1390
msgid "This room is now semi-anonymous"
msgstr "Dieser Raum ist jetzt teils anonym"
#: converse.js:1391
msgid "This room is now fully-anonymous"
msgstr "Dieser Raum ist jetzt anonym"
#: converse.js:1392
msgid "A new room has been created"
msgstr "Einen neuen Raum ist erstellen"
#: converse.js:1393
msgid "Your nickname has been changed"
msgstr "Spitzname festgelegen"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been banned
#: converse.js:1400
msgid "<strong>%1$s</strong> has been banned"
msgstr "<strong>%1$s</strong> ist verbannt"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been kicked out
#: converse.js:1404
msgid "<strong>%1$s</strong> has been kicked out"
msgstr "<strong>%1$s</strong> ist hinausgeworfen"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
#: converse.js:1408
msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr "<strong>%1$s</strong> wurde wegen einer Zugehörigkeitsänderung entfernt"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed for not being a member
#: converse.js:1412
msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr "<strong>%1$s</strong> ist kein Mitglied und wurde daher entfernt"
#: converse.js:1416 converse.js:1478
msgid "You have been banned from this room"
msgstr "Sie sind aus diesem Raum verbannt worden"
#: converse.js:1417
msgid "You have been kicked from this room"
msgstr "Sie wurden aus diesem Raum hinausgeworfen"
#: converse.js:1418
msgid "You have been removed from this room because of an affiliation change"
msgstr "Sie wurden wegen einer Zugehörigkeitsänderung entfernt"
#: converse.js:1419
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr "Sie wurden aus diesem Raum entfernt da Sie kein Mitglied sind."
#: converse.js:1420
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr "Sie werden aus diesem Raum entfernt da der MUC (Muli-user chat) Dienst "
"gerade abgeschalten wird."
#: converse.js:1476
msgid "You are not on the member list of this room"
msgstr "Sie sind nicht auf der Mitgliederliste dieses Raums"
#: converse.js:1482
msgid "No nickname was specified"
msgstr "Kein Spitzname festgelegt"
#: converse.js:1486
msgid "You are not allowed to create new rooms"
msgstr "Es ist Ihnen nicht erlaubt, neue Räume anzulegen"
#: converse.js:1488
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Ungültiger Spitzname"
#: converse.js:1490
msgid "Your nickname is already taken"
msgstr "Ihre Spitzname existiert bereits."
#: converse.js:1492
msgid "This room does not (yet) exist"
msgstr "Dieser Raum existiert (noch) nicht"
#: converse.js:1494
msgid "This room has reached it's maximum number of occupants"
msgstr "Dieser Raum hat die maximale Mitgliederanzahl erreicht"
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1571
msgid "Topic set by %1$s to: %2$s"
msgstr "%1$s hat das Thema zu \"%2$s\" abgeändert"
#: converse.js:1587
msgid "This user is a moderator"
msgstr "Dieser Benutzer ist ein Moderator"
#: converse.js:1590
msgid "This user can send messages in this room"
msgstr "Dieser Benutzer kann Nachrichten in diesem Raum verschicken"
#: converse.js:1593
msgid "This user can NOT send messages in this room"
msgstr "Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"
#: converse.js:1796
msgid "Click to chat with this contact"
msgstr "Hier klicken um mit diesem Kontakt zu chatten"
#: converse.js:1797 converse.js:1801
msgid "Click to remove this contact"
msgstr "Hier klicken um diesen Kontakt zu entfernen"
#: converse.js:2163
msgid "Contact requests"
msgstr "Kontaktanfragen"
#: converse.js:2164
msgid "My contacts"
msgstr "Meine Kontakte"
#: converse.js:2165
msgid "Pending contacts"
msgstr "Unbestätigte Kontakte"
#: converse.js:2317
msgid "Custom status"
msgstr "Status-Nachricht"
#: converse.js:2323
msgid "Click to change your chat status"
msgstr "Klicken Sie, um ihrer Status to ändern"
#: converse.js:2326
msgid "Click here to write a custom status message"
msgstr "Klicken Sie hier, um ihrer Status-Nachricht to ändern"
#: converse.js:2355 converse.js:2363
msgid "online"
msgstr "online"
#: converse.js:2357
msgid "busy"
msgstr "beschäfticht"
#: converse.js:2359
msgid "away for long"
msgstr "länger abwesend"
#: converse.js:2361
msgid "away"
msgstr "abwesend"
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2375 converse.js:2409
msgid "I am %1$s"
msgstr "Ich bin %1$s"
#: converse.js:2480
msgid "Sign in"
msgstr "Anmelden"
#: converse.js:2483
msgid "XMPP/Jabber Username:"
msgstr "XMPP/Jabber Benutzername"
#: converse.js:2485
msgid "Password:"
msgstr "Passwort:"
#: converse.js:2487
msgid "Log In"
msgstr "Anmelden"
#: converse.js:2491
msgid "BOSH Service URL:"
msgstr "BOSH "
#: converse.js:2503
msgid "Connected"
msgstr "Verbunden"
#: converse.js:2507
msgid "Disconnected"
msgstr "Verbindung unterbrochen."
#: converse.js:2511
msgid "Error"
msgstr "Fehler"
#: converse.js:2513
msgid "Connecting"
msgstr "Verbindungsaufbau …"
#: converse.js:2516
msgid "Connection Failed"
msgstr "Entfernte Verbindung fehlgeschlagen"
#: converse.js:2518
msgid "Authenticating"
msgstr "Authentifizierung"
#: converse.js:2521
msgid "Authentication Failed"
msgstr "Authentifizierung gescheitert"
#: converse.js:2523
msgid "Disconnecting"
msgstr "Trenne Verbindung"
#: converse.js:2525
msgid "Attached"
msgstr "Angehängt"
#: converse.js:2656
msgid "Online Contacts"
msgstr "Online-Kontakte"
(function (root, factory) {
define("de", ['jed'], function () {
var de = new Jed({
"domain": "converse",
"locale_data": {
"converse": {
"": {
"domain": "converse",
"lang": "de",
"plural_forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
"Dieses Menü anzeigen"
],
"Write in the third person": [
null,
"In der dritten Person schreiben"
],
"Remove messages": [
null,
"Nachrichten entfernen"
],
"Personal message": [
null,
"Persönliche Nachricht"
],
"Contacts": [
null,
"Kontakte"
],
"Online": [
null,
"Online"
],
"Busy": [
null,
"Beschäfticht"
],
"Away": [
null,
"Abwesend"
],
"Offline": [
null,
"Abgemeldet"
],
"Click to add new chat contacts": [
null,
"Klicken Sie, um einen neuen Kontakt hinzuzufügen"
],
"Add a contact": [
null,
"Kontakte hinzufügen"
],
"Contact username": [
null,
"Benutzername"
],
"Add": [
null,
"Hinzufügen"
],
"Contact name": [
null,
"Name des Kontakts"
],
"Search": [
null,
"Suche"
],
"No users found": [
null,
"Keine Benutzer gefunden"
],
"Click to add as a chat contact": [
null,
"Hier klicken um als Kontakt hinzuzufügen"
],
"Click to open this room": [
null,
"Hier klicken um diesen Raum zu öffnen"
],
"Show more information on this room": [
null,
"Mehr Information über diesen Raum zeigen"
],
"Description:": [
null,
"Beschreibung"
],
"Occupants:": [
null,
"Teilnehmer"
],
"Features:": [
null,
"Funktionen:"
],
"Requires authentication": [
null,
"Authentifizierung erforderlich"
],
"Hidden": [
null,
"Versteckt"
],
"Requires an invitation": [
null,
"Einladung erforderlich"
],
"Moderated": [
null,
"Moderiert"
],
"Non-anonymous": [
null,
"Nicht anonym"
],
"Open room": [
null,
"Offener Raum"
],
"Permanent room": [
null,
"Dauerhafter Raum"
],
"Public": [
null,
"Öffentlich"
],
"Semi-anonymous": [
null,
"Teils anonym"
],
"Temporary room": [
null,
"Vorübergehender Raum"
],
"Unmoderated": [
null,
"Unmoderiert"
],
"Rooms": [
null,
"Räume"
],
"Room name": [
null,
"Raumname"
],
"Nickname": [
null,
"Spitzname"
],
"Server": [
null,
"Server"
],
"Join": [
null,
"Beitreten"
],
"Show rooms": [
null,
"Räume anzeigen"
],
"No rooms on %1$s": [
null,
"Keine Räume auf %1$s"
],
"Rooms on %1$s": [
null,
"Räume auf %1$s"
],
"Set chatroom topic": [
null,
"Chatraum Thema festlegen"
],
"Kick user from chatroom": [
null,
"Werfe einen Benutzer aus dem Raum."
],
"Ban user from chatroom": [
null,
"Verbanne einen Benutzer aus dem Raum."
],
"Message": [
null,
"Nachricht"
],
"Save": [
null,
"Speichern"
],
"Cancel": [
null,
"Abbrechen"
],
"An error occurred while trying to save the form.": [
null,
"Beim Speichern der Formular is ein Fehler aufgetreten."
],
"This chatroom requires a password": [
null,
"Passwort wird für die Anmeldung benötigt."
],
"Password: ": [
null,
"Passwort: "
],
"Submit": [
null,
"Einreichen"
],
"This room is not anonymous": [
null,
"Dieser Raum ist nicht anonym"
],
"This room now shows unavailable members": [
null,
"Dieser Raum zeigt jetzt unferfügbare Mitglieder"
],
"This room does not show unavailable members": [
null,
"Dieser Raum zeigt nicht unverfügbare Mitglieder"
],
"Non-privacy-related room configuration has changed": [
null,
"Die Konfiguration, die nicht auf die Privatsphäre bezogen ist, hat sich geändert"
],
"Room logging is now enabled": [
null,
"Zukünftige Nachrichten dieses Raums werden protokolliert."
],
"Room logging is now disabled": [
null,
"Zukünftige Nachrichten dieses Raums werden nicht protokolliert."
],
"This room is now non-anonymous": [
null,
"Dieser Raum ist jetzt nicht anonym"
],
"This room is now semi-anonymous": [
null,
"Dieser Raum ist jetzt teils anonym"
],
"This room is now fully-anonymous": [
null,
"Dieser Raum ist jetzt anonym"
],
"A new room has been created": [
null,
"Einen neuen Raum ist erstellen"
],
"Your nickname has been changed": [
null,
"Spitzname festgelegen"
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> ist verbannt"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> ist hinausgeworfen"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> wurde wegen einer Zugehörigkeitsänderung entfernt"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> ist kein Mitglied und wurde daher entfernt"
],
"You have been banned from this room": [
null,
"Sie sind aus diesem Raum verbannt worden"
],
"You have been kicked from this room": [
null,
"Sie wurden aus diesem Raum hinausgeworfen"
],
"You have been removed from this room because of an affiliation change": [
null,
"Sie wurden wegen einer Zugehörigkeitsänderung entfernt"
],
"You have been removed from this room because the room has changed to members-only and you're not a member": [
null,
"Sie wurden aus diesem Raum entfernt da Sie kein Mitglied sind."
],
"You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
null,
"Sie werden aus diesem Raum entfernt da der MUC (Muli-user chat) Dienst gerade abgeschalten wird."
],
"You are not on the member list of this room": [
null,
"Sie sind nicht auf der Mitgliederliste dieses Raums"
],
"No nickname was specified": [
null,
"Kein Spitzname festgelegt"
],
"You are not allowed to create new rooms": [
null,
"Es ist Ihnen nicht erlaubt, neue Räume anzulegen"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Ungültiger Spitzname"
],
"Your nickname is already taken": [
null,
"Ihre Spitzname existiert bereits."
],
"This room does not (yet) exist": [
null,
"Dieser Raum existiert (noch) nicht"
],
"This room has reached it's maximum number of occupants": [
null,
"Dieser Raum hat die maximale Mitgliederanzahl erreicht"
],
"Topic set by %1$s to: %2$s": [
null,
"%1$s hat das Thema zu \"%2$s\" abgeändert"
],
"This user is a moderator": [
null,
"Dieser Benutzer ist ein Moderator"
],
"This user can send messages in this room": [
null,
"Dieser Benutzer kann Nachrichten in diesem Raum verschicken"
],
"This user can NOT send messages in this room": [
null,
"Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"
],
"Click to chat with this contact": [
null,
"Hier klicken um mit diesem Kontakt zu chatten"
],
"Click to remove this contact": [
null,
"Hier klicken um diesen Kontakt zu entfernen"
],
"Contact requests": [
null,
"Kontaktanfragen"
],
"My contacts": [
null,
"Meine Kontakte"
],
"Pending contacts": [
null,
"Unbestätigte Kontakte"
],
"Custom status": [
null,
"Status-Nachricht"
],
"Click to change your chat status": [
null,
"Klicken Sie, um ihrer Status to ändern"
],
"Click here to write a custom status message": [
null,
"Klicken Sie hier, um ihrer Status-Nachricht to ändern"
],
"online": [
null,
"online"
],
"busy": [
null,
"beschäfticht"
],
"away for long": [
null,
"länger abwesend"
],
"away": [
null,
"abwesend"
],
"I am %1$s": [
null,
"Ich bin %1$s"
],
"Sign in": [
null,
"Anmelden"
],
"XMPP/Jabber Username:": [
null,
"XMPP/Jabber Benutzername"
],
"Password:": [
null,
"Passwort:"
],
"Log In": [
null,
"Anmelden"
],
"BOSH Service URL:": [
null,
"BOSH "
],
"Connected": [
null,
"Verbunden"
],
"Disconnected": [
null,
"Verbindung unterbrochen."
],
"Error": [
null,
"Fehler"
],
"Connecting": [
null,
"Verbindungsaufbau …"
],
"Connection Failed": [
null,
"Entfernte Verbindung fehlgeschlagen"
],
"Authenticating": [
null,
"Authentifizierung"
],
"Authentication Failed": [
null,
"Authentifizierung gescheitert"
],
"Disconnecting": [
null,
"Trenne Verbindung"
],
"Attached": [
null,
"Angehängt"
],
"Online Contacts": [
null,
"Online-Kontakte"
]
}
}
});
return factory(de);
});
}(this, function (de) {
return de;
}));
(function (root, factory) {
define("en", ['jed'], function () {
var en = new Jed({
"domain": "converse",
"locale_data": {
"converse": {
"": {
"domain": "converse",
"lang": "en",
"plural_forms": "nplurals=2; plural=(n != 1);"
}
}
}
});
return factory(en);
});
}(this, function (en) {
return en;
}));
{
"converse": {
"": {
"Project-Id-Version": "Converse.js 0.4",
"Report-Msgid-Bugs-To": "",
"POT-Creation-Date": "2013-06-01 23:03+0200",
"PO-Revision-Date": "2013-07-22 18:13-0400",
"Last-Translator": "Leonardo J. Caballero G. <leonardocaballero@gmail.com>",
"Language-Team": "Spanish",
"Language": "es",
"MIME-Version": "1.0",
"Content-Type": "text/plain; charset=ASCII",
"Content-Transfer-Encoding": "8bit",
"Plural-Forms": "nplurals=2; plural=(n != 1);",
"domain": "converse",
"lang": "es",
"plural_forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
"Mostrar este menú"
],
"Write in the third person": [
null,
"Escribir en tercera persona"
],
"Remove messages": [
null,
"Eliminar mensajes"
],
"Personal message": [
null,
"Mensaje personal"
],
"Contacts": [
null,
"Contactos"
],
"Online": [
null,
"En linea"
],
"Busy": [
null,
"Ocupado"
],
"Away": [
null,
"Ausente"
],
"Offline": [
null,
"Desconectado"
],
"Click to add new chat contacts": [
null,
"Haga clic para agregar nuevos contactos al chat"
],
"Add a contact": [
null,
"Agregar un contacto"
],
"Contact username": [
null,
"Nombre de usuario de contacto"
],
"Add": [
null,
"Agregar"
],
"Contact name": [
null,
"Nombre de contacto"
],
"Search": [
null,
"Búsqueda"
],
"No users found": [
null,
"Sin usuarios encontrados"
],
"Click to add as a chat contact": [
null,
"Haga clic para agregar como un contacto de chat"
],
"Click to open this room": [
null,
"Haga clic para abrir esta sala"
],
"Show more information on this room": [
null,
"Mostrar mas información en esta sala"
],
"Description:": [
null,
"Descripción"
],
"Occupants:": [
null,
"Ocupantes:"
],
"Features:": [
null,
"Características:"
],
"Requires authentication": [
null,
"Autenticación requerida"
],
"Hidden": [
null,
"Oculto"
],
"Requires an invitation": [
null,
"Requiere una invitación"
],
"Moderated": [
null,
"Moderado"
],
"Non-anonymous": [
null,
"No usuario anónimo"
],
"Open room": [
null,
"Abrir sala"
],
"Permanent room": [
null,
"Sala permanente"
],
"Public": [
null,
"Publico"
],
"Semi-anonymous": [
null,
"Semi anónimo"
],
"Temporary room": [
null,
"Sala temporal"
],
"Unmoderated": [
null,
"Sin moderar"
],
"Rooms": [
null,
"Salas"
],
"Room name": [
null,
"Nombre de sala"
],
"Nickname": [
null,
"Apodo"
],
"Server": [
null,
"Servidor"
],
"Join": [
null,
"Unirse"
],
"Show rooms": [
null,
"Mostrar salas"
],
"No rooms on %1$s": [
null,
"Sin salas en %1$s"
],
"Rooms on %1$s": [
null,
"Salas en %1$s"
],
"Set chatroom topic": [
null,
"Defina tema de sala de chat"
],
"Kick user from chatroom": [
null,
"Expulsar usuario de sala de chat."
],
"Ban user from chatroom": [
null,
"Bloquear usuario de sala de chat."
],
"Message": [
null,
"Mensaje"
],
"Save": [
null,
"Guardar"
],
"Cancel": [
null,
"Cancelar"
],
"An error occurred while trying to save the form.": [
null,
"Un error ocurrido mientras trataba de guardar el formulario."
],
"This chatroom requires a password": [
null,
"Esta sala de chat requiere una contraseña."
],
"Password: ": [
null,
"Contraseña: "
],
"Submit": [
null,
"Enviar"
],
"This room is not anonymous": [
null,
"Esta sala no es para usuarios anónimos"
],
"This room now shows unavailable members": [
null,
"Esta sala ahora muestra los miembros no disponibles"
],
"This room does not show unavailable members": [
null,
"Esta sala no muestra los miembros no disponibles"
],
"Non-privacy-related room configuration has changed": [
null,
"Configuración de la sala para no relacionada con la privacidad ha sido cambiada"
],
"Room logging is now enabled": [
null,
"El registro de la sala ahora está habilitada"
],
"Room logging is now disabled": [
null,
"El registro de la sala ahora está deshabilitada"
],
"This room is now non-anonymous": [
null,
"Esta sala ahora es para los usuarios no anónimos"
],
"This room is now semi-anonymous": [
null,
"Esta sala ahora es para los usuarios semi-anónimos"
],
"This room is now fully-anonymous": [
null,
"Esta sala ahora es para los usuarios completamente-anónimos"
],
"A new room has been created": [
null,
"Una nueva sala ha sido creada"
],
"Your nickname has been changed": [
null,
"Su apodo ha sido cambiado"
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> ha sido prohibido"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> ha sido expulsado"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> ha sido eliminado debido a un cambio de afiliación"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> ha sido eliminado debido a que no es miembro"
],
"You have been banned from this room": [
null,
"Usted ha sido prohibido de esta sala"
],
"You have been kicked from this room": [
null,
"Usted ha sido expulsado de esta sala"
],
"You have been removed from this room because of an affiliation change": [
null,
"Usted ha sido eliminado de esta sala debido a un cambio de afiliación"
],
"You have been removed from this room because the room has changed to members-only and you're not a member": [
null,
"Usted ha sido eliminado de esta sala debido a que la sala cambio su configuración a solo-miembros y usted no es un miembro"
],
"You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
null,
"Usted ha sido eliminado de esta sala debido al servicio MUC (Multi-user chat) está apagado."
],
"You are not on the member list of this room": [
null,
"Usted no está en la lista de miembros de esta sala"
],
"No nickname was specified": [
null,
"Sin apodo especificado"
],
"You are not allowed to create new rooms": [
null,
"A usted no se le permite crear nuevas salas"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Su apodo no se ajusta a la política de esta sala"
],
"Your nickname is already taken": [
null,
"Su apodo ya ha sido tomando por otro usuario"
],
"This room does not (yet) exist": [
null,
"Esta sala (aún) no existe"
],
"This room has reached it's maximum number of occupants": [
null,
"Esta sala ha alcanzado su número máximo de ocupantes"
],
"Topic set by %1$s to: %2$s": [
null,
"Tema fijado por %1$s a: %2$s"
],
"This user is a moderator": [
null,
"Este usuario es un moderador"
],
"This user can send messages in this room": [
null,
"Este usuario puede enviar mensajes en esta sala"
],
"This user can NOT send messages in this room": [
null,
"Este usuario NO puede enviar mensajes en esta"
],
"Click to chat with this contact": [
null,
"Haga clic para conversar con este contacto"
],
"Click to remove this contact": [
null,
"Haga clic para eliminar este contacto"
],
"Contact requests": [
null,
"Solicitudes de contacto"
],
"My contacts": [
null,
"Mi contactos"
],
"Pending contacts": [
null,
"Contactos pendientes"
],
"Custom status": [
null,
"Personalice estatus"
],
"Click to change your chat status": [
null,
"Haga clic para cambiar su estatus de chat"
],
"Click here to write a custom status message": [
null,
"Haga clic para escribir un mensaje de estatus personalizado"
],
"online": [
null,
"en linea"
],
"busy": [
null,
"ocupado"
],
"away for long": [
null,
"lejos por mucho tiempo"
],
"away": [
null,
"ausente"
],
"I am %1$s": [
null,
"Yo soy %1$s"
],
"Sign in": [
null,
"Registro"
],
"XMPP/Jabber Username:": [
null,
"Nombre de usuario XMPP/Jabber"
],
"Password:": [
null,
"Contraseña:"
],
"Log In": [
null,
"Iniciar sesión"
],
"BOSH Service URL:": [
null,
"URL del servicio BOSH:"
],
"Connected": [
null,
"Conectado"
],
"Disconnected": [
null,
"Desconectado"
],
"Error": [
null,
"Error"
],
"Connecting": [
null,
"Conectando"
],
"Connection Failed": [
null,
"Conexión fallo"
],
"Authenticating": [
null,
"Autenticando"
],
"Authentication Failed": [
null,
"Autenticación fallo"
],
"Disconnecting": [
null,
"Desconectando"
],
"Attached": [
null,
"Adjuntado"
],
"Online Contacts": [
null,
"Contactos en linea"
]
}
}
# Spanish translations for Converse.js package.
# Copyright (C) 2013 Jan-Carel Brand
# This file is distributed under the same license as the Converse.js package.
# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2013.
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 23:03+0200\n"
"PO-Revision-Date: 2013-07-22 18:13-0400\n"
"Last-Translator: Leonardo J. Caballero G. <leonardocaballero@gmail.com>\n"
"Language-Team: ES <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
"Language: es\n"
"lang: es\n"
"Language-Code: es\n"
"Language-Name: Español\n"
"Preferred-Encodings: utf-8 latin1\n"
"Domain: converse\n"
"domain: converse\n"
"X-Is-Fallback-For: es-ar es-bo es-cl es-co es-cr es-do es-ec es-es es-sv es-gt es-hn es-mx es-ni es-pa es-py es-pe es-pr es-us es-uy es-ve\n"
#: converse.js:397
#: converse.js:1128
msgid "Show this menu"
msgstr "Mostrar este menú"
#: converse.js:398
#: converse.js:1129
msgid "Write in the third person"
msgstr "Escribir en tercera persona"
#: converse.js:399
#: converse.js:1133
msgid "Remove messages"
msgstr "Eliminar mensajes"
#: converse.js:539
msgid "Personal message"
msgstr "Mensaje personal"
#: converse.js:613
msgid "Contacts"
msgstr "Contactos"
#: converse.js:618
msgid "Online"
msgstr "En linea"
#: converse.js:619
msgid "Busy"
msgstr "Ocupado"
#: converse.js:620
msgid "Away"
msgstr "Ausente"
#: converse.js:621
msgid "Offline"
msgstr "Desconectado"
#: converse.js:628
msgid "Click to add new chat contacts"
msgstr "Haga clic para agregar nuevos contactos al chat"
#: converse.js:628
msgid "Add a contact"
msgstr "Agregar un contacto"
#: converse.js:637
msgid "Contact username"
msgstr "Nombre de usuario de contacto"
#: converse.js:638
msgid "Add"
msgstr "Agregar"
#: converse.js:646
msgid "Contact name"
msgstr "Nombre de contacto"
#: converse.js:647
msgid "Search"
msgstr "Búsqueda"
#: converse.js:682
msgid "No users found"
msgstr "Sin usuarios encontrados"
#: converse.js:689
msgid "Click to add as a chat contact"
msgstr "Haga clic para agregar como un contacto de chat"
#: converse.js:753
msgid "Click to open this room"
msgstr "Haga clic para abrir esta sala"
#: converse.js:755
msgid "Show more information on this room"
msgstr "Mostrar mas información en esta sala"
#: converse.js:760
msgid "Description:"
msgstr "Descripción"
#: converse.js:761
msgid "Occupants:"
msgstr "Ocupantes:"
#: converse.js:762
msgid "Features:"
msgstr "Características:"
#: converse.js:764
msgid "Requires authentication"
msgstr "Autenticación requerida"
#: converse.js:767
msgid "Hidden"
msgstr "Oculto"
#: converse.js:770
msgid "Requires an invitation"
msgstr "Requiere una invitación"
#: converse.js:773
msgid "Moderated"
msgstr "Moderado"
#: converse.js:776
msgid "Non-anonymous"
msgstr "No usuario anónimo"
#: converse.js:779
msgid "Open room"
msgstr "Abrir sala"
#: converse.js:782
msgid "Permanent room"
msgstr "Sala permanente"
#: converse.js:785
msgid "Public"
msgstr "Publico"
#: converse.js:788
msgid "Semi-anonymous"
msgstr "Semi anónimo"
#: converse.js:791
msgid "Temporary room"
msgstr "Sala temporal"
#: converse.js:794
msgid "Unmoderated"
msgstr "Sin moderar"
#: converse.js:800
msgid "Rooms"
msgstr "Salas"
#: converse.js:804
msgid "Room name"
msgstr "Nombre de sala"
#: converse.js:805
msgid "Nickname"
msgstr "Apodo"
#: converse.js:806
msgid "Server"
msgstr "Servidor"
#: converse.js:807
msgid "Join"
msgstr "Unirse"
#: converse.js:808
msgid "Show rooms"
msgstr "Mostrar salas"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:841
msgid "No rooms on %1$s"
msgstr "Sin salas en %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
#: converse.js:856
msgid "Rooms on %1$s"
msgstr "Salas en %1$s"
#: converse.js:1130
msgid "Set chatroom topic"
msgstr "Defina tema de sala de chat"
#: converse.js:1131
msgid "Kick user from chatroom"
msgstr "Expulsar usuario de sala de chat."
#: converse.js:1132
msgid "Ban user from chatroom"
msgstr "Prohibir usuario de sala de chat."
#: converse.js:1159
msgid "Message"
msgstr "Mensaje"
#: converse.js:1273
#: converse.js:2318
msgid "Save"
msgstr "Guardar"
#: converse.js:1274
msgid "Cancel"
msgstr "Cancelar"
#: converse.js:1321
msgid "An error occurred while trying to save the form."
msgstr "Un error ocurrido mientras trataba de guardar el formulario."
#: converse.js:1367
msgid "This chatroom requires a password"
msgstr "Esta sala de chat requiere una contraseña."
#: converse.js:1368
msgid "Password: "
msgstr "Contraseña: "
#: converse.js:1369
msgid "Submit"
msgstr "Enviar"
#: converse.js:1383
msgid "This room is not anonymous"
msgstr "Esta sala no es para usuarios anónimos"
#: converse.js:1384
msgid "This room now shows unavailable members"
msgstr "Esta sala ahora muestra los miembros no disponibles"
#: converse.js:1385
msgid "This room does not show unavailable members"
msgstr "Esta sala no muestra los miembros no disponibles"
#: converse.js:1386
msgid "Non-privacy-related room configuration has changed"
msgstr "Configuración de la sala para no relacionada con la privacidad ha sido cambiada"
#: converse.js:1387
msgid "Room logging is now enabled"
msgstr "El registro de la sala ahora está habilitada"
#: converse.js:1388
msgid "Room logging is now disabled"
msgstr "El registro de la sala ahora está deshabilitada"
#: converse.js:1389
msgid "This room is now non-anonymous"
msgstr "Esta sala ahora es para los usuarios no anónimos"
#: converse.js:1390
msgid "This room is now semi-anonymous"
msgstr "Esta sala ahora es para los usuarios semi-anónimos"
#: converse.js:1391
msgid "This room is now fully-anonymous"
msgstr "Esta sala ahora es para los usuarios completamente-anónimos"
#: converse.js:1392
msgid "A new room has been created"
msgstr "Una nueva sala ha sido creada"
#: converse.js:1393
msgid "Your nickname has been changed"
msgstr "Su apodo ha sido cambiado"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been banned
#: converse.js:1400
msgid "<strong>%1$s</strong> has been banned"
msgstr "<strong>%1$s</strong> ha sido prohibido"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been kicked out
#: converse.js:1404
msgid "<strong>%1$s</strong> has been kicked out"
msgstr "<strong>%1$s</strong> ha sido expulsado"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
#: converse.js:1408
msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr "<strong>%1$s</strong> ha sido eliminado debido a un cambio de afiliación"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed for not being a member
#: converse.js:1412
msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr "<strong>%1$s</strong> ha sido eliminado debido a que no es miembro"
#: converse.js:1416
#: converse.js:1478
msgid "You have been banned from this room"
msgstr "Usted ha sido prohibido de esta sala"
#: converse.js:1417
msgid "You have been kicked from this room"
msgstr "Usted ha sido expulsado de esta sala"
#: converse.js:1418
msgid "You have been removed from this room because of an affiliation change"
msgstr "Usted ha sido eliminado de esta sala debido a un cambio de afiliación"
#: converse.js:1419
msgid "You have been removed from this room because the room has changed to members-only and you're not a member"
msgstr "Usted ha sido eliminado de esta sala debido a que la sala cambio su configuración a solo-miembros y usted no es un miembro"
#: converse.js:1420
msgid "You have been removed from this room because the MUC (Multi-user chat) service is being shut down."
msgstr "Usted ha sido eliminado de esta sala debido al servicio MUC (Multi-user chat) está apagado."
#: converse.js:1476
msgid "You are not on the member list of this room"
msgstr "Usted no está en la lista de miembros de esta sala"
#: converse.js:1482
msgid "No nickname was specified"
msgstr "Sin apodo especificado"
#: converse.js:1486
msgid "You are not allowed to create new rooms"
msgstr "A usted no se le permite crear nuevas salas"
#: converse.js:1488
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Su apodo no se ajusta a la política de esta sala"
#: converse.js:1490
msgid "Your nickname is already taken"
msgstr "Su apodo ya ha sido tomando por otro usuario"
#: converse.js:1492
msgid "This room does not (yet) exist"
msgstr "Esta sala (aún) no existe"
#: converse.js:1494
msgid "This room has reached it's maximum number of occupants"
msgstr "Esta sala ha alcanzado su número máximo de ocupantes"
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1571
msgid "Topic set by %1$s to: %2$s"
msgstr "Tema fijado por %1$s a: %2$s"
#: converse.js:1587
msgid "This user is a moderator"
msgstr "Este usuario es un moderador"
#: converse.js:1590
msgid "This user can send messages in this room"
msgstr "Este usuario puede enviar mensajes en esta sala"
#: converse.js:1593
msgid "This user can NOT send messages in this room"
msgstr "Este usuario NO puede enviar mensajes en esta"
#: converse.js:1796
msgid "Click to chat with this contact"
msgstr "Haga clic para conversar con este contacto"
#: converse.js:1797
#: converse.js:1801
msgid "Click to remove this contact"
msgstr "Haga clic para eliminar este contacto"
#: converse.js:2163
msgid "Contact requests"
msgstr "Solicitudes de contacto"
#: converse.js:2164
msgid "My contacts"
msgstr "Mi contactos"
#: converse.js:2165
msgid "Pending contacts"
msgstr "Contactos pendientes"
#: converse.js:2317
msgid "Custom status"
msgstr "Personalice estatus"
#: converse.js:2323
msgid "Click to change your chat status"
msgstr "Haga clic para cambiar su estatus de chat"
#: converse.js:2326
msgid "Click here to write a custom status message"
msgstr "Haga clic para escribir un mensaje de estatus personalizado"
#: converse.js:2355
#: converse.js:2363
msgid "online"
msgstr "en linea"
#: converse.js:2357
msgid "busy"
msgstr "ocupado"
#: converse.js:2359
msgid "away for long"
msgstr "lejos por mucho tiempo"
#: converse.js:2361
msgid "away"
msgstr "ausente"
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2375
#: converse.js:2409
msgid "I am %1$s"
msgstr "Yo soy %1$s"
#: converse.js:2480
msgid "Sign in"
msgstr "Registro"
#: converse.js:2483
msgid "XMPP/Jabber Username:"
msgstr "Nombre de usuario XMPP/Jabber"
#: converse.js:2485
msgid "Password:"
msgstr "Contraseña:"
#: converse.js:2487
msgid "Log In"
msgstr "Iniciar sesión"
#: converse.js:2491
msgid "BOSH Service URL:"
msgstr "URL del servicio BOSH:"
#: converse.js:2503
msgid "Connected"
msgstr "Conectado"
#: converse.js:2507
msgid "Disconnected"
msgstr "Desconectado"
#: converse.js:2511
msgid "Error"
msgstr "Error"
#: converse.js:2513
msgid "Connecting"
msgstr "Conectando"
#: converse.js:2516
msgid "Connection Failed"
msgstr "Conexión fallo"
#: converse.js:2518
msgid "Authenticating"
msgstr "Autenticando"
#: converse.js:2521
msgid "Authentication Failed"
msgstr "Autenticación fallo"
#: converse.js:2523
msgid "Disconnecting"
msgstr "Desconectando"
#: converse.js:2525
msgid "Attached"
msgstr "Adjuntado"
#: converse.js:2656
msgid "Online Contacts"
msgstr "Contactos en linea"
(function (root, factory) {
define("es", ['jed'], function () {
var de = new Jed({
"domain": "converse",
"locale_data": {
"converse": {
"": {
"domain": "converse",
"lang": "es",
"plural_forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
"Mostrar este menú"
],
"Write in the third person": [
null,
"Escribir en tercera persona"
],
"Remove messages": [
null,
"Eliminar mensajes"
],
"Personal message": [
null,
"Mensaje personal"
],
"Contacts": [
null,
"Contactos"
],
"Online": [
null,
"En linea"
],
"Busy": [
null,
"Ocupado"
],
"Away": [
null,
"Ausente"
],
"Offline": [
null,
"Desconectado"
],
"Click to add new chat contacts": [
null,
"Haga clic para agregar nuevos contactos al chat"
],
"Add a contact": [
null,
"Agregar un contacto"
],
"Contact username": [
null,
"Nombre de usuario de contacto"
],
"Add": [
null,
"Agregar"
],
"Contact name": [
null,
"Nombre de contacto"
],
"Search": [
null,
"Búsqueda"
],
"No users found": [
null,
"Sin usuarios encontrados"
],
"Click to add as a chat contact": [
null,
"Haga clic para agregar como un contacto de chat"
],
"Click to open this room": [
null,
"Haga clic para abrir esta sala"
],
"Show more information on this room": [
null,
"Mostrar mas información en esta sala"
],
"Description:": [
null,
"Descripción"
],
"Occupants:": [
null,
"Ocupantes:"
],
"Features:": [
null,
"Características:"
],
"Requires authentication": [
null,
"Autenticación requerida"
],
"Hidden": [
null,
"Oculto"
],
"Requires an invitation": [
null,
"Requiere una invitación"
],
"Moderated": [
null,
"Moderado"
],
"Non-anonymous": [
null,
"No usuario anónimo"
],
"Open room": [
null,
"Abrir sala"
],
"Permanent room": [
null,
"Sala permanente"
],
"Public": [
null,
"Publico"
],
"Semi-anonymous": [
null,
"Semi anónimo"
],
"Temporary room": [
null,
"Sala temporal"
],
"Unmoderated": [
null,
"Sin moderar"
],
"Rooms": [
null,
"Salas"
],
"Room name": [
null,
"Nombre de sala"
],
"Nickname": [
null,
"Apodo"
],
"Server": [
null,
"Servidor"
],
"Join": [
null,
"Unirse"
],
"Show rooms": [
null,
"Mostrar salas"
],
"No rooms on %1$s": [
null,
"Sin salas en %1$s"
],
"Rooms on %1$s": [
null,
"Salas en %1$s"
],
"Set chatroom topic": [
null,
"Defina tema de sala de chat"
],
"Kick user from chatroom": [
null,
"Expulsar usuario de sala de chat."
],
"Ban user from chatroom": [
null,
"Prohibir usuario de sala de chat."
],
"Message": [
null,
"Mensaje"
],
"Save": [
null,
"Guardar"
],
"Cancel": [
null,
"Cancelar"
],
"An error occurred while trying to save the form.": [
null,
"Un error ocurrido mientras trataba de guardar el formulario."
],
"This chatroom requires a password": [
null,
"Esta sala de chat requiere una contraseña."
],
"Password: ": [
null,
"Contraseña: "
],
"Submit": [
null,
"Enviar"
],
"This room is not anonymous": [
null,
"Esta sala no es para usuarios anónimos"
],
"This room now shows unavailable members": [
null,
"Esta sala ahora muestra los miembros no disponibles"
],
"This room does not show unavailable members": [
null,
"Esta sala no muestra los miembros no disponibles"
],
"Non-privacy-related room configuration has changed": [
null,
"Configuración de la sala para no relacionada con la privacidad ha sido cambiada"
],
"Room logging is now enabled": [
null,
"El registro de la sala ahora está habilitada"
],
"Room logging is now disabled": [
null,
"El registro de la sala ahora está deshabilitada"
],
"This room is now non-anonymous": [
null,
"Esta sala ahora es para los usuarios no anónimos"
],
"This room is now semi-anonymous": [
null,
"Esta sala ahora es para los usuarios semi-anónimos"
],
"This room is now fully-anonymous": [
null,
"Esta sala ahora es para los usuarios completamente-anónimos"
],
"A new room has been created": [
null,
"Una nueva sala ha sido creada"
],
"Your nickname has been changed": [
null,
"Su apodo ha sido cambiado"
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> ha sido prohibido"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> ha sido expulsado"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> ha sido eliminado debido a un cambio de afiliación"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> ha sido eliminado debido a que no es miembro"
],
"You have been banned from this room": [
null,
"Usted ha sido prohibido de esta sala"
],
"You have been kicked from this room": [
null,
"Usted ha sido expulsado de esta sala"
],
"You have been removed from this room because of an affiliation change": [
null,
"Usted ha sido eliminado de esta sala debido a un cambio de afiliación"
],
"You have been removed from this room because the room has changed to members-only and you're not a member": [
null,
"Usted ha sido eliminado de esta sala debido a que la sala cambio su configuración a solo-miembros y usted no es un miembro"
],
"You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
null,
"Usted ha sido eliminado de esta sala debido al servicio MUC (Multi-user chat) está apagado."
],
"You are not on the member list of this room": [
null,
"Usted no está en la lista de miembros de esta sala"
],
"No nickname was specified": [
null,
"Sin apodo especificado"
],
"You are not allowed to create new rooms": [
null,
"A usted no se le permite crear nuevas salas"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Su apodo no se ajusta a la política de esta sala"
],
"Your nickname is already taken": [
null,
"Su apodo ya ha sido tomando por otro usuario"
],
"This room does not (yet) exist": [
null,
"Esta sala (aún) no existe"
],
"This room has reached it's maximum number of occupants": [
null,
"Esta sala ha alcanzado su número máximo de ocupantes"
],
"Topic set by %1$s to: %2$s": [
null,
"Tema fijado por %1$s a: %2$s"
],
"This user is a moderator": [
null,
"Este usuario es un moderador"
],
"This user can send messages in this room": [
null,
"Este usuario puede enviar mensajes en esta sala"
],
"This user can NOT send messages in this room": [
null,
"Este usuario NO puede enviar mensajes en esta"
],
"Click to chat with this contact": [
null,
"Haga clic para conversar con este contacto"
],
"Click to remove this contact": [
null,
"Haga clic para eliminar este contacto"
],
"Contact requests": [
null,
"Solicitudes de contacto"
],
"My contacts": [
null,
"Mi contactos"
],
"Pending contacts": [
null,
"Contactos pendientes"
],
"Custom status": [
null,
"Personalice estatus"
],
"Click to change your chat status": [
null,
"Haga clic para cambiar su estatus de chat"
],
"Click here to write a custom status message": [
null,
"Haga clic para escribir un mensaje de estatus personalizado"
],
"online": [
null,
"en linea"
],
"busy": [
null,
"ocupado"
],
"away for long": [
null,
"lejos por mucho tiempo"
],
"away": [
null,
"ausente"
],
"I am %1$s": [
null,
"Yo soy %1$s"
],
"Sign in": [
null,
"Registro"
],
"XMPP/Jabber Username:": [
null,
"Nombre de usuario XMPP/Jabber"
],
"Password:": [
null,
"Contraseña:"
],
"Log In": [
null,
"Iniciar sesión"
],
"BOSH Service URL:": [
null,
"URL del servicio BOSH:"
],
"Connected": [
null,
"Conectado"
],
"Disconnected": [
null,
"Desconectado"
],
"Error": [
null,
"Error"
],
"Connecting": [
null,
"Conectando"
],
"Connection Failed": [
null,
"Conexión fallo"
],
"Authenticating": [
null,
"Autenticando"
],
"Authentication Failed": [
null,
"Autenticación fallo"
],
"Disconnecting": [
null,
"Desconectando"
],
"Attached": [
null,
"Adjuntado"
],
"Online Contacts": [
null,
"Contactos en linea"
]
}
}
});
return factory(de);
});
}(this, function (de) {
return de;
}));
{
"converse": {
"": {
"Project-Id-Version": "Converse.js 0.4",
"Report-Msgid-Bugs-To": "",
"POT-Creation-Date": "2013-06-01 23:03+0200",
"PO-Revision-Date": "2013-06-02 19:45+0200",
"Last-Translator": "JC Brand <jc@opkode.com>",
"Language-Team": "Hungarian",
"Language": "hu",
"MIME-Version": "1.0",
"Content-Type": "text/plain; charset=ASCII",
"Content-Transfer-Encoding": "8bit",
"Plural-Forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
""
],
"Write in the third person": [
null,
""
],
"Remove messages": [
null,
""
],
"Personal message": [
null,
""
],
"Contacts": [
null,
""
],
"Online": [
null,
""
],
"Busy": [
null,
""
],
"Away": [
null,
""
],
"Offline": [
null,
""
],
"Click to add new chat contacts": [
null,
""
],
"Add a contact": [
null,
""
],
"Contact username": [
null,
""
],
"Add": [
null,
""
],
"Contact name": [
null,
""
],
"Search": [
null,
""
],
"No users found": [
null,
""
],
"Click to add as a chat contact": [
null,
""
],
"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,
""
],
"Rooms": [
null,
""
],
"Room name": [
null,
""
],
"Nickname": [
null,
""
],
"Server": [
null,
""
],
"Join": [
null,
""
],
"Show rooms": [
null,
""
],
"No rooms on %1$s": [
null,
""
],
"Rooms on %1$s": [
null,
""
],
"Set chatroom topic": [
null,
""
],
"Kick user from chatroom": [
null,
""
],
"Ban user from chatroom": [
null,
""
],
"Message": [
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,
""
],
"Your nickname has been changed": [
null,
""
],
"<strong>%1$s</strong> has been banned": [
null,
""
],
"<strong>%1$s</strong> has been kicked out": [
null,
""
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
""
],
"<strong>%1$s</strong> has been removed for not being a member": [
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,
""
],
"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,
""
],
"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,
""
],
"Click to chat with this contact": [
null,
""
],
"Click to remove this contact": [
null,
""
],
"Contact requests": [
null,
""
],
"My contacts": [
null,
""
],
"Pending contacts": [
null,
""
],
"Custom status": [
null,
""
],
"Click to change your chat status": [
null,
""
],
"Click here to write a custom status message": [
null,
""
],
"online": [
null,
""
],
"busy": [
null,
""
],
"away for long": [
null,
""
],
"away": [
null,
""
],
"I am %1$s": [
null,
""
],
"Sign in": [
null,
""
],
"XMPP/Jabber Username:": [
null,
""
],
"Password:": [
null,
""
],
"Log In": [
null,
""
],
"BOSH Service URL:": [
null,
""
],
"Connected": [
null,
""
],
"Disconnected": [
null,
""
],
"Error": [
null,
""
],
"Connecting": [
null,
""
],
"Connection Failed": [
null,
""
],
"Authenticating": [
null,
""
],
"Authentication Failed": [
null,
""
],
"Disconnecting": [
null,
""
],
"Attached": [
null,
""
],
"Online Contacts": [
null,
""
]
}
}
\ No newline at end of file
# Hungarian translations for Converse.js package.
# Copyright (C) 2013 Jan-Carel Brand
# This file is distributed under the same license as the Converse.js package.
# JC Brand <jc@opkode.com>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 23:03+0200\n"
"PO-Revision-Date: 2013-06-02 19:45+0200\n"
"Last-Translator: JC Brand <jc@opkode.com>\n"
"Language-Team: Hungarian\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: converse.js:397 converse.js:1128
msgid "Show this menu"
msgstr ""
#: converse.js:398 converse.js:1129
msgid "Write in the third person"
msgstr ""
#: converse.js:399 converse.js:1133
msgid "Remove messages"
msgstr ""
#: converse.js:539
msgid "Personal message"
msgstr ""
#: converse.js:613
msgid "Contacts"
msgstr ""
#: converse.js:618
msgid "Online"
msgstr ""
#: converse.js:619
msgid "Busy"
msgstr ""
#: converse.js:620
msgid "Away"
msgstr ""
#: converse.js:621
msgid "Offline"
msgstr ""
#: converse.js:628
msgid "Click to add new chat contacts"
msgstr ""
#: converse.js:628
msgid "Add a contact"
msgstr ""
#: converse.js:637
msgid "Contact username"
msgstr ""
#: converse.js:638
msgid "Add"
msgstr ""
#: converse.js:646
msgid "Contact name"
msgstr ""
#: converse.js:647
msgid "Search"
msgstr ""
#: converse.js:682
msgid "No users found"
msgstr ""
#: converse.js:689
msgid "Click to add as a chat contact"
msgstr ""
#: converse.js:753
msgid "Click to open this room"
msgstr ""
#: converse.js:755
msgid "Show more information on this room"
msgstr ""
#: converse.js:760
msgid "Description:"
msgstr ""
#: converse.js:761
msgid "Occupants:"
msgstr ""
#: converse.js:762
msgid "Features:"
msgstr ""
#: converse.js:764
msgid "Requires authentication"
msgstr ""
#: converse.js:767
msgid "Hidden"
msgstr ""
#: converse.js:770
msgid "Requires an invitation"
msgstr ""
#: converse.js:773
msgid "Moderated"
msgstr ""
#: converse.js:776
msgid "Non-anonymous"
msgstr ""
#: converse.js:779
msgid "Open room"
msgstr ""
#: converse.js:782
msgid "Permanent room"
msgstr ""
#: converse.js:785
msgid "Public"
msgstr ""
#: converse.js:788
msgid "Semi-anonymous"
msgstr ""
#: converse.js:791
msgid "Temporary room"
msgstr ""
#: converse.js:794
msgid "Unmoderated"
msgstr ""
#: converse.js:800
msgid "Rooms"
msgstr ""
#: converse.js:804
msgid "Room name"
msgstr ""
#: converse.js:805
msgid "Nickname"
msgstr ""
#: converse.js:806
msgid "Server"
msgstr ""
#: converse.js:807
msgid "Join"
msgstr ""
#: converse.js:808
msgid "Show rooms"
msgstr ""
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:841
msgid "No rooms on %1$s"
msgstr ""
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
#: converse.js:856
msgid "Rooms on %1$s"
msgstr ""
#: converse.js:1130
msgid "Set chatroom topic"
msgstr ""
#: converse.js:1131
msgid "Kick user from chatroom"
msgstr ""
#: converse.js:1132
msgid "Ban user from chatroom"
msgstr ""
#: converse.js:1159
msgid "Message"
msgstr ""
#: converse.js:1273 converse.js:2318
msgid "Save"
msgstr ""
#: converse.js:1274
msgid "Cancel"
msgstr ""
#: converse.js:1321
msgid "An error occurred while trying to save the form."
msgstr ""
#: converse.js:1367
msgid "This chatroom requires a password"
msgstr ""
#: converse.js:1368
msgid "Password: "
msgstr ""
#: converse.js:1369
msgid "Submit"
msgstr ""
#: converse.js:1383
msgid "This room is not anonymous"
msgstr ""
#: converse.js:1384
msgid "This room now shows unavailable members"
msgstr ""
#: converse.js:1385
msgid "This room does not show unavailable members"
msgstr ""
#: converse.js:1386
msgid "Non-privacy-related room configuration has changed"
msgstr ""
#: converse.js:1387
msgid "Room logging is now enabled"
msgstr ""
#: converse.js:1388
msgid "Room logging is now disabled"
msgstr ""
#: converse.js:1389
msgid "This room is now non-anonymous"
msgstr ""
#: converse.js:1390
msgid "This room is now semi-anonymous"
msgstr ""
#: converse.js:1391
msgid "This room is now fully-anonymous"
msgstr ""
#: converse.js:1392
msgid "A new room has been created"
msgstr ""
#: converse.js:1393
msgid "Your nickname has been changed"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been banned
#: converse.js:1400
msgid "<strong>%1$s</strong> has been banned"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been kicked out
#: converse.js:1404
msgid "<strong>%1$s</strong> has been kicked out"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
#: converse.js:1408
msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed for not being a member
#: converse.js:1412
msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr ""
#: converse.js:1416 converse.js:1478
msgid "You have been banned from this room"
msgstr ""
#: converse.js:1417
msgid "You have been kicked from this room"
msgstr ""
#: converse.js:1418
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
#: converse.js:1419
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:1420
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr ""
#: converse.js:1476
msgid "You are not on the member list of this room"
msgstr ""
#: converse.js:1482
msgid "No nickname was specified"
msgstr ""
#: converse.js:1486
msgid "You are not allowed to create new rooms"
msgstr ""
#: converse.js:1488
msgid "Your nickname doesn't conform to this room's policies"
msgstr ""
#: converse.js:1490
msgid "Your nickname is already taken"
msgstr ""
#: converse.js:1492
msgid "This room does not (yet) exist"
msgstr ""
#: converse.js:1494
msgid "This room has reached it's maximum number of occupants"
msgstr ""
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1571
msgid "Topic set by %1$s to: %2$s"
msgstr ""
#: converse.js:1587
msgid "This user is a moderator"
msgstr ""
#: converse.js:1590
msgid "This user can send messages in this room"
msgstr ""
#: converse.js:1593
msgid "This user can NOT send messages in this room"
msgstr ""
#: converse.js:1796
msgid "Click to chat with this contact"
msgstr ""
#: converse.js:1797 converse.js:1801
msgid "Click to remove this contact"
msgstr ""
#: converse.js:2163
msgid "Contact requests"
msgstr ""
#: converse.js:2164
msgid "My contacts"
msgstr ""
#: converse.js:2165
msgid "Pending contacts"
msgstr ""
#: converse.js:2317
msgid "Custom status"
msgstr ""
#: converse.js:2323
msgid "Click to change your chat status"
msgstr ""
#: converse.js:2326
msgid "Click here to write a custom status message"
msgstr ""
#: converse.js:2355 converse.js:2363
msgid "online"
msgstr ""
#: converse.js:2357
msgid "busy"
msgstr ""
#: converse.js:2359
msgid "away for long"
msgstr ""
#: converse.js:2361
msgid "away"
msgstr ""
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2375 converse.js:2409
msgid "I am %1$s"
msgstr ""
#: converse.js:2480
msgid "Sign in"
msgstr ""
#: converse.js:2483
msgid "XMPP/Jabber Username:"
msgstr ""
#: converse.js:2485
msgid "Password:"
msgstr ""
#: converse.js:2487
msgid "Log In"
msgstr ""
#: converse.js:2491
msgid "BOSH Service URL:"
msgstr ""
#: converse.js:2503
msgid "Connected"
msgstr ""
#: converse.js:2507
msgid "Disconnected"
msgstr ""
#: converse.js:2511
msgid "Error"
msgstr ""
#: converse.js:2513
msgid "Connecting"
msgstr ""
#: converse.js:2516
msgid "Connection Failed"
msgstr ""
#: converse.js:2518
msgid "Authenticating"
msgstr ""
#: converse.js:2521
msgid "Authentication Failed"
msgstr ""
#: converse.js:2523
msgid "Disconnecting"
msgstr ""
#: converse.js:2525
msgid "Attached"
msgstr ""
#: converse.js:2656
msgid "Online Contacts"
msgstr ""
(function (root, factory) {
define("hu", ['jed'], function () {
var hu = new Jed({
"domain": "converse",
"locale_data": {
"converse": {
"": {
"Content-Type": "text/plain; charset=ASCII",
"Content-Transfer-Encoding": "8bit",
"Plural-Forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
""
],
"Write in the third person": [
null,
""
],
"Remove messages": [
null,
""
],
"Personal message": [
null,
""
],
"Contacts": [
null,
""
],
"Online": [
null,
""
],
"Busy": [
null,
""
],
"Away": [
null,
""
],
"Offline": [
null,
""
],
"Click to add new chat contacts": [
null,
""
],
"Add a contact": [
null,
""
],
"Contact username": [
null,
""
],
"Add": [
null,
""
],
"Contact name": [
null,
""
],
"Search": [
null,
""
],
"No users found": [
null,
""
],
"Click to add as a chat contact": [
null,
""
],
"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,
""
],
"Rooms": [
null,
""
],
"Room name": [
null,
""
],
"Nickname": [
null,
""
],
"Server": [
null,
""
],
"Join": [
null,
""
],
"Show rooms": [
null,
""
],
"No rooms on %1$s": [
null,
""
],
"Rooms on %1$s": [
null,
""
],
"Set chatroom topic": [
null,
""
],
"Kick user from chatroom": [
null,
""
],
"Ban user from chatroom": [
null,
""
],
"Message": [
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,
""
],
"Your nickname has been changed": [
null,
""
],
"<strong>%1$s</strong> has been banned": [
null,
""
],
"<strong>%1$s</strong> has been kicked out": [
null,
""
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
""
],
"<strong>%1$s</strong> has been removed for not being a member": [
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,
""
],
"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,
""
],
"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,
""
],
"Click to chat with this contact": [
null,
""
],
"Click to remove this contact": [
null,
""
],
"Contact requests": [
null,
""
],
"My contacts": [
null,
""
],
"Pending contacts": [
null,
""
],
"Custom status": [
null,
""
],
"Click to change your chat status": [
null,
""
],
"Click here to write a custom status message": [
null,
""
],
"online": [
null,
""
],
"busy": [
null,
""
],
"away for long": [
null,
""
],
"away": [
null,
""
],
"I am %1$s": [
null,
""
],
"Sign in": [
null,
""
],
"XMPP/Jabber Username:": [
null,
""
],
"Password:": [
null,
""
],
"Log In": [
null,
""
],
"BOSH Service URL:": [
null,
""
],
"Connected": [
null,
""
],
"Disconnected": [
null,
""
],
"Error": [
null,
""
],
"Connecting": [
null,
""
],
"Connection Failed": [
null,
""
],
"Authenticating": [
null,
""
],
"Authentication Failed": [
null,
""
],
"Disconnecting": [
null,
""
],
"Attached": [
null,
""
],
"Online Contacts": [
null,
""
]
}
}
});
return factory(hu);
});
}(this, function (hu) {
return hu;
}));
{
"converse": {
"": {
"Project-Id-Version": "Converse.js 0.4",
"Report-Msgid-Bugs-To": "",
"POT-Creation-Date": "2013-07-20 23:03+0200",
"PO-Revision-Date": "2013-07-20 13:58+0200",
"Last-Translator": "Fabio Bas <ctrlaltca@gmail.com>",
"Language-Team": "Italian",
"Language": "it",
"MIME-Version": "1.0",
"Content-Type": "text/plain; charset=ASCII",
"Content-Transfer-Encoding": "8bit",
"Plural-Forms": "nplurals=2; plural=(n != 1);",
"domain": "converse",
"lang": "it",
"plural_forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
"Mostra questo menu"
],
"Write in the third person": [
null,
"Scrivi in terza persona"
],
"Remove messages": [
null,
"Rimuovi messaggi"
],
"Personal message": [
null,
"Messaggio personale"
],
"Contacts": [
null,
"Contatti"
],
"Online": [
null,
"In linea"
],
"Busy": [
null,
"Occupato"
],
"Away": [
null,
"Assente"
],
"Offline": [
null,
"Non in linea"
],
"Click to add new chat contacts": [
null,
"Clicca per aggiungere nuovi contatti alla chat"
],
"Add a contact": [
null,
"Aggiungi un contatto"
],
"Contact username": [
null,
"Nome utente del contatto"
],
"Add": [
null,
"Aggiungi"
],
"Contact name": [
null,
"Nome del contatto"
],
"Search": [
null,
"Cerca"
],
"No users found": [
null,
"Nessun utente trovato"
],
"Click to add as a chat contact": [
null,
"Clicca per aggiungere il contatto alla chat"
],
"Click to open this room": [
null,
"Clicca per aprire questa stanza"
],
"Show more information on this room": [
null,
"Mostra più informazioni su questa stanza"
],
"Description:": [
null,
"Descrizione:"
],
"Occupants:": [
null,
"Utenti presenti:"
],
"Features:": [
null,
"Funzionalità:"
],
"Requires authentication": [
null,
"Richiede autenticazione"
],
"Hidden": [
null,
"Nascosta"
],
"Requires an invitation": [
null,
"Richiede un invito"
],
"Moderated": [
null,
"Moderata"
],
"Non-anonymous": [
null,
"Non-anonima"
],
"Open room": [
null,
"Stanza aperta"
],
"Permanent room": [
null,
"Stanza permanente"
],
"Public": [
null,
"Pubblica"
],
"Semi-anonymous": [
null,
"Semi-anonima"
],
"Temporary room": [
null,
"Stanza temporanea"
],
"Unmoderated": [
null,
"Non moderata"
],
"Rooms": [
null,
"Stanze"
],
"Room name": [
null,
"Nome stanza"
],
"Nickname": [
null,
"Soprannome"
],
"Server": [
null,
"Server"
],
"Join": [
null,
"Entra"
],
"Show rooms": [
null,
"Mostra stanze"
],
"No rooms on %1$s": [
null,
"Nessuna stanza su %1$s"
],
"Rooms on %1$s": [
null,
"Stanze su %1$s"
],
"Set chatroom topic": [
null,
"Cambia oggetto della stanza"
],
"Kick user from chatroom": [
null,
"Espelli utente dalla stanza"
],
"Ban user from chatroom": [
null,
"Bandisci utente dalla stanza"
],
"Message": [
null,
"Messaggio"
],
"Save": [
null,
"Salva"
],
"Cancel": [
null,
"Annulla"
],
"An error occurred while trying to save the form.": [
null,
"Errore durante il salvataggio del modulo"
],
"This chatroom requires a password": [
null,
"Questa stanza richiede una password"
],
"Password: ": [
null,
"Password: "
],
"Submit": [
null,
"Invia"
],
"This room is not anonymous": [
null,
"Questa stanza non è anonima"
],
"This room now shows unavailable members": [
null,
"Questa stanza mostra i membri non disponibili al momento"
],
"This room does not show unavailable members": [
null,
"Questa stanza non mostra i membri non disponibili"
],
"Non-privacy-related room configuration has changed": [
null,
"Una configurazione della stanza non legata alla privacy è stata modificata"
],
"Room logging is now enabled": [
null,
"La registrazione è abilitata nella stanza"
],
"Room logging is now disabled": [
null,
"La registrazione è disabilitata nella stanza"
],
"This room is now non-anonymous": [
null,
"Questa stanza è non-anonima"
],
"This room is now semi-anonymous": [
null,
"Questa stanza è semi-anonima"
],
"This room is now fully-anonymous": [
null,
"Questa stanza è completamente-anonima"
],
"A new room has been created": [
null,
"Una nuova stanza è stata creata"
],
"Your nickname has been changed": [
null,
"Il tuo soprannome è stato cambiato"
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> è stato bandito"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> è stato espulso"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> è stato rimosso a causa di un cambio di affiliazione"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> è stato rimosso in quanto non membro"
],
"You have been banned from this room": [
null,
"Sei stato bandito da questa stanza"
],
"You have been kicked from this room": [
null,
"Sei stato espulso da questa stanza"
],
"You have been removed from this room because of an affiliation change": [
null,
"Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"
],
"You have been removed from this room because the room has changed to members-only and you're not a member": [
null,
"Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"
],
"You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
null,
"Sei stato rimosso da questa stanza poiché il servizio MUC (Chat multi utente) è in fase di spegnimento"
],
"You are not on the member list of this room": [
null,
"Non sei nella lista dei membri di questa stanza"
],
"No nickname was specified": [
null,
"Nessun soprannome specificato"
],
"You are not allowed to create new rooms": [
null,
"Non ti è permesso creare nuove stanze"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Il tuo soprannome non è conforme alle regole di questa stanza"
],
"Your nickname is already taken": [
null,
"Il tuo soprannome è già utilizzato"
],
"This room does not (yet) exist": [
null,
"Questa stanza non esiste (per ora)"
],
"This room has reached it's maximum number of occupants": [
null,
"Questa stanza ha raggiunto il limite massimo di utenti"
],
"Topic set by %1$s to: %2$s": [
null,
"Topic impostato da %1$s a: %2$s"
],
"This user is a moderator": [
null,
"Questo utente è un moderatore"
],
"This user can send messages in this room": [
null,
"Questo utente può inviare messaggi in questa stanza"
],
"This user can NOT send messages in this room": [
null,
"Questo utente NON può inviare messaggi in questa stanza"
],
"Click to chat with this contact": [
null,
"Clicca per parlare con questo contatto"
],
"Click to remove this contact": [
null,
"Clicca per rimuovere questo contatto"
],
"Contact requests": [
null,
"Richieste dei contatti"
],
"My contacts": [
null,
"I miei contatti"
],
"Pending contacts": [
null,
"Contatti in attesa"
],
"Custom status": [
null,
"Stato personalizzato"
],
"Click to change your chat status": [
null,
"Clicca per cambiare il tuo stato"
],
"Click here to write a custom status message": [
null,
"Clicca qui per scrivere un messaggio di stato personalizzato"
],
"online": [
null,
"in linea"
],
"busy": [
null,
"occupato"
],
"away for long": [
null,
"assente da molto"
],
"away": [
null,
"assente"
],
"I am %1$s": [
null,
"Sono %1$s"
],
"Sign in": [
null,
"Entra"
],
"XMPP/Jabber Username:": [
null,
"Nome utente:"
],
"Password:": [
null,
"Password:"
],
"Log In": [
null,
"Entra"
],
"BOSH Service URL:": [
null,
"Indirizzo servizio BOSH:"
],
"Connected": [
null,
"Connesso"
],
"Disconnected": [
null,
"Disconnesso"
],
"Error": [
null,
"Errore"
],
"Connecting": [
null,
"Connessione in corso"
],
"Connection Failed": [
null,
"Connessione fallita"
],
"Authenticating": [
null,
"Autenticazione in corso"
],
"Authentication Failed": [
null,
"Autenticazione fallita"
],
"Disconnecting": [
null,
"Disconnessione in corso"
],
"Attached": [
null,
"Allegato"
],
"Online Contacts": [
null,
"Contatti in linea"
]
}
}
\ No newline at end of file
# German translations for Converse.js package.
# Copyright (C) 2013 Jan-Carel Brand
# This file is distributed under the same license as the Converse.js package.
# JC Brand <jc@opkode.com>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-07-20 23:03+0200\n"
"PO-Revision-Date: 2013-07-20 18:53+0100\n"
"Last-Translator: Fabio Bas <ctrlaltca@gmail.com>\n"
"Language-Team: Italian\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"domain: converse\n"
"lang: it\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
#: converse.js:397
#: converse.js:1128
msgid "Show this menu"
msgstr "Mostra questo menu"
#: converse.js:398
#: converse.js:1129
msgid "Write in the third person"
msgstr "Scrivi in terza persona"
#: converse.js:399
#: converse.js:1133
msgid "Remove messages"
msgstr "Rimuovi messaggi"
#: converse.js:539
msgid "Personal message"
msgstr "Messaggio personale"
#: converse.js:613
msgid "Contacts"
msgstr "Contatti"
#: converse.js:618
msgid "Online"
msgstr "In linea"
#: converse.js:619
msgid "Busy"
msgstr "Occupato"
#: converse.js:620
msgid "Away"
msgstr "Assente"
#: converse.js:621
msgid "Offline"
msgstr "Non in linea"
#: converse.js:628
msgid "Click to add new chat contacts"
msgstr "Clicca per aggiungere nuovi contatti alla chat"
#: converse.js:628
msgid "Add a contact"
msgstr "Aggiungi contatti"
#: converse.js:637
msgid "Contact username"
msgstr "Nome utente del contatto"
#: converse.js:638
msgid "Add"
msgstr "Aggiungi"
#: converse.js:646
msgid "Contact name"
msgstr "Nome del contatto"
#: converse.js:647
msgid "Search"
msgstr "Cerca"
#: converse.js:682
msgid "No users found"
msgstr "Nessun utente trovato"
#: converse.js:689
msgid "Click to add as a chat contact"
msgstr "Clicca per aggiungere il contatto alla chat"
#: converse.js:753
msgid "Click to open this room"
msgstr "Clicca per aprire questa stanza"
#: converse.js:755
msgid "Show more information on this room"
msgstr "Mostra più informazioni su questa stanza"
#: converse.js:760
msgid "Description:"
msgstr "Descrizione:"
#: converse.js:761
msgid "Occupants:"
msgstr "Utenti presenti:"
#: converse.js:762
msgid "Features:"
msgstr "Funzionalità:"
#: converse.js:764
msgid "Requires authentication"
msgstr "Richiede autenticazione"
#: converse.js:767
msgid "Hidden"
msgstr "Nascosta"
#: converse.js:770
msgid "Requires an invitation"
msgstr "Richiede un invito"
#: converse.js:773
msgid "Moderated"
msgstr "Moderata"
#: converse.js:776
msgid "Non-anonymous"
msgstr "Non-anonima"
#: converse.js:779
msgid "Open room"
msgstr "Stanza aperta"
#: converse.js:782
msgid "Permanent room"
msgstr "Stanza permanente"
#: converse.js:785
msgid "Public"
msgstr "Pubblica"
#: converse.js:788
msgid "Semi-anonymous"
msgstr "Semi-anonima"
#: converse.js:791
msgid "Temporary room"
msgstr "Stanza temporanea"
#: converse.js:794
msgid "Unmoderated"
msgstr "Non moderata"
#: converse.js:800
msgid "Rooms"
msgstr "Stanze"
#: converse.js:804
msgid "Room name"
msgstr "Nome stanza"
#: converse.js:805
msgid "Nickname"
msgstr "Soprannome"
#: converse.js:806
msgid "Server"
msgstr "Server"
#: converse.js:807
msgid "Join"
msgstr "Entra"
#: converse.js:808
msgid "Show rooms"
msgstr "Mostra stanze"
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:841
msgid "No rooms on %1$s"
msgstr "Nessuna stanza su %1$s"
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
#: converse.js:856
msgid "Rooms on %1$s"
msgstr "Stanze su %1$s"
#: converse.js:1130
msgid "Set chatroom topic"
msgstr "Cambia oggetto della stanza"
#: converse.js:1131
msgid "Kick user from chatroom"
msgstr "Espelli utente dalla stanza"
#: converse.js:1132
msgid "Ban user from chatroom"
msgstr "Bandisci utente dalla stanza"
#: converse.js:1159
msgid "Message"
msgstr "Messaggio"
#: converse.js:1273
#: converse.js:2318
msgid "Save"
msgstr "Salva"
#: converse.js:1274
msgid "Cancel"
msgstr "Annulla"
#: converse.js:1321
msgid "An error occurred while trying to save the form."
msgstr "Errore durante il salvataggio del modulo"
#: converse.js:1367
msgid "This chatroom requires a password"
msgstr "Questa stanza richiede una password"
#: converse.js:1368
msgid "Password: "
msgstr "Password: "
#: converse.js:1369
msgid "Submit"
msgstr "Invia"
#: converse.js:1383
msgid "This room is not anonymous"
msgstr "Questa stanza non è anonima"
#: converse.js:1384
msgid "This room now shows unavailable members"
msgstr "Questa stanza mostra i membri non disponibili al momento"
#: converse.js:1385
msgid "This room does not show unavailable members"
msgstr "Questa stanza non mostra i membri non disponibili"
#: converse.js:1386
msgid "Non-privacy-related room configuration has changed"
msgstr "Una configurazione della stanza non legata alla privacy è stata modificata"
#: converse.js:1387
msgid "Room logging is now enabled"
msgstr "La registrazione è abilitata nella stanza"
#: converse.js:1388
msgid "Room logging is now disabled"
msgstr "La registrazione è disabilitata nella stanza"
#: converse.js:1389
msgid "This room is now non-anonymous"
msgstr "Questa stanza è non-anonima"
#: converse.js:1390
msgid "This room is now semi-anonymous"
msgstr "Questa stanza è semi-anonima"
#: converse.js:1391
msgid "This room is now fully-anonymous"
msgstr "Questa stanza è completamente-anonima"
#: converse.js:1392
msgid "A new room has been created"
msgstr "Una nuova stanza è stata creata"
#: converse.js:1393
msgid "Your nickname has been changed"
msgstr "Il tuo soprannome è stato cambiato"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been banned
#: converse.js:1400
msgid "<strong>%1$s</strong> has been banned"
msgstr "<strong>%1$s</strong> è stato bandito"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been kicked out
#: converse.js:1404
msgid "<strong>%1$s</strong> has been kicked out"
msgstr "<strong>%1$s</strong> è stato espulso"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
#: converse.js:1408
msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr "<strong>%1$s</strong> è stato rimosso a causa di un cambio di affiliazione"
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed for not being a member
#: converse.js:1412
msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr "<strong>%1$s</strong> è stato rimosso in quanto non membro"
#: converse.js:1416
#: converse.js:1478
msgid "You have been banned from this room"
msgstr "Sei stato bandito da questa stanza"
#: converse.js:1417
msgid "You have been kicked from this room"
msgstr "Sei stato espulso da questa stanza"
#: converse.js:1418
msgid "You have been removed from this room because of an affiliation change"
msgstr "Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"
#: converse.js:1419
msgid "You have been removed from this room because the room has changed to members-only and you're not a member"
msgstr "Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"
#: converse.js:1420
msgid "You have been removed from this room because the MUC (Multi-user chat) service is being shut down."
msgstr "Sei stato rimosso da questa stanza poiché il servizio MUC (Chat multi utente) è in fase di spegnimento"
#: converse.js:1476
msgid "You are not on the member list of this room"
msgstr "Non sei nella lista dei membri di questa stanza"
#: converse.js:1482
msgid "No nickname was specified"
msgstr "Nessun soprannome specificato"
#: converse.js:1486
msgid "You are not allowed to create new rooms"
msgstr "Non ti è permesso creare nuove stanze"
#: converse.js:1488
msgid "Your nickname doesn't conform to this room's policies"
msgstr "Il tuo soprannome non è conforme alle regole di questa stanza"
#: converse.js:1490
msgid "Your nickname is already taken"
msgstr "Il tuo soprannome è già utilizzato"
#: converse.js:1492
msgid "This room does not (yet) exist"
msgstr "Questa stanza non esiste (per ora)"
#: converse.js:1494
msgid "This room has reached it's maximum number of occupants"
msgstr "Questa stanza ha raggiunto il limite massimo di utenti"
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1571
msgid "Topic set by %1$s to: %2$s"
msgstr "Topic impostato da %1$s a: %2$s"
#: converse.js:1587
msgid "This user is a moderator"
msgstr "Questo utente è un moderatore"
#: converse.js:1590
msgid "This user can send messages in this room"
msgstr "Questo utente può inviare messaggi in questa stanza"
#: converse.js:1593
msgid "This user can NOT send messages in this room"
msgstr "Questo utente NON può inviare messaggi in questa stanza"
#: converse.js:1796
msgid "Click to chat with this contact"
msgstr "Clicca per parlare con questo contatto"
#: converse.js:1797
#: converse.js:1801
msgid "Click to remove this contact"
msgstr "Clicca per rimuovere questo contatto"
#: converse.js:2163
msgid "Contact requests"
msgstr "Richieste dei contatti"
#: converse.js:2164
msgid "My contacts"
msgstr "I miei contatti"
#: converse.js:2165
msgid "Pending contacts"
msgstr "Contatti in attesa"
#: converse.js:2317
msgid "Custom status"
msgstr "Stato personalizzato"
#: converse.js:2323
msgid "Click to change your chat status"
msgstr "Clicca per cambiare il tuo stato"
#: converse.js:2326
msgid "Click here to write a custom status message"
msgstr "Clicca qui per scrivere un messaggio di stato personalizzato"
#: converse.js:2355
#: converse.js:2363
msgid "online"
msgstr "in linea"
#: converse.js:2357
msgid "busy"
msgstr "occupato"
#: converse.js:2359
msgid "away for long"
msgstr "assente da molto"
#: converse.js:2361
msgid "away"
msgstr "assente"
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2375
#: converse.js:2409
msgid "I am %1$s"
msgstr "Sono %1$s"
#: converse.js:2480
msgid "Sign in"
msgstr "Accesso"
#: converse.js:2483
msgid "XMPP/Jabber Username:"
msgstr "Nome utente:"
#: converse.js:2485
msgid "Password:"
msgstr "Password:"
#: converse.js:2487
msgid "Log In"
msgstr "Entra"
#: converse.js:2491
msgid "BOSH Service URL:"
msgstr "Indirizzo servizio BOSH:"
#: converse.js:2503
msgid "Connected"
msgstr "Connesso"
#: converse.js:2507
msgid "Disconnected"
msgstr "Disconnesso"
#: converse.js:2511
msgid "Error"
msgstr "Errore"
#: converse.js:2513
msgid "Connecting"
msgstr "Connessione in corso"
#: converse.js:2516
msgid "Connection Failed"
msgstr "Connessione fallita"
#: converse.js:2518
msgid "Authenticating"
msgstr "Autenticazione in corso"
#: converse.js:2521
msgid "Authentication Failed"
msgstr "Autenticazione fallita"
#: converse.js:2523
msgid "Disconnecting"
msgstr "Disconnessione in corso"
#: converse.js:2525
msgid "Attached"
msgstr "Allegato"
#: converse.js:2656
msgid "Online Contacts"
msgstr "Contatti in linea"
(function (root, factory) {
define("it", ['jed'], function () {
var it = new Jed({
"domain": "converse",
"locale_data": {
"converse": {
"": {
"Project-Id-Version": "Converse.js 0.4",
"Report-Msgid-Bugs-To": "",
"POT-Creation-Date": "2013-07-20 23:03+0200",
"PO-Revision-Date": "2013-07-20 13:58+0200",
"Last-Translator": "Fabio Bas <ctrlaltca@gmail.com>",
"Language-Team": "Italian",
"Language": "it",
"MIME-Version": "1.0",
"Content-Type": "text/plain; charset=ASCII",
"Content-Transfer-Encoding": "8bit",
"Plural-Forms": "nplurals=2; plural=(n != 1);",
"domain": "converse",
"lang": "it",
"plural_forms": "nplurals=2; plural=(n != 1);"
},
"Show this menu": [
null,
"Mostra questo menu"
],
"Write in the third person": [
null,
"Scrivi in terza persona"
],
"Remove messages": [
null,
"Rimuovi messaggi"
],
"Personal message": [
null,
"Messaggio personale"
],
"Contacts": [
null,
"Contatti"
],
"Online": [
null,
"In linea"
],
"Busy": [
null,
"Occupato"
],
"Away": [
null,
"Assente"
],
"Offline": [
null,
"Non in linea"
],
"Click to add new chat contacts": [
null,
"Clicca per aggiungere nuovi contatti alla chat"
],
"Add a contact": [
null,
"Aggiungi un contatto"
],
"Contact username": [
null,
"Nome utente del contatto"
],
"Add": [
null,
"Aggiungi"
],
"Contact name": [
null,
"Nome del contatto"
],
"Search": [
null,
"Cerca"
],
"No users found": [
null,
"Nessun utente trovato"
],
"Click to add as a chat contact": [
null,
"Clicca per aggiungere il contatto alla chat"
],
"Click to open this room": [
null,
"Clicca per aprire questa stanza"
],
"Show more information on this room": [
null,
"Mostra più informazioni su questa stanza"
],
"Description:": [
null,
"Descrizione:"
],
"Occupants:": [
null,
"Utenti presenti:"
],
"Features:": [
null,
"Funzionalità:"
],
"Requires authentication": [
null,
"Richiede autenticazione"
],
"Hidden": [
null,
"Nascosta"
],
"Requires an invitation": [
null,
"Richiede un invito"
],
"Moderated": [
null,
"Moderata"
],
"Non-anonymous": [
null,
"Non-anonima"
],
"Open room": [
null,
"Stanza aperta"
],
"Permanent room": [
null,
"Stanza permanente"
],
"Public": [
null,
"Pubblica"
],
"Semi-anonymous": [
null,
"Semi-anonima"
],
"Temporary room": [
null,
"Stanza temporanea"
],
"Unmoderated": [
null,
"Non moderata"
],
"Rooms": [
null,
"Stanze"
],
"Room name": [
null,
"Nome stanza"
],
"Nickname": [
null,
"Soprannome"
],
"Server": [
null,
"Server"
],
"Join": [
null,
"Entra"
],
"Show rooms": [
null,
"Mostra stanze"
],
"No rooms on %1$s": [
null,
"Nessuna stanza su %1$s"
],
"Rooms on %1$s": [
null,
"Stanze su %1$s"
],
"Set chatroom topic": [
null,
"Cambia oggetto della stanza"
],
"Kick user from chatroom": [
null,
"Espelli utente dalla stanza"
],
"Ban user from chatroom": [
null,
"Bandisci utente dalla stanza"
],
"Message": [
null,
"Messaggio"
],
"Save": [
null,
"Salva"
],
"Cancel": [
null,
"Annulla"
],
"An error occurred while trying to save the form.": [
null,
"Errore durante il salvataggio del modulo"
],
"This chatroom requires a password": [
null,
"Questa stanza richiede una password"
],
"Password: ": [
null,
"Password: "
],
"Submit": [
null,
"Invia"
],
"This room is not anonymous": [
null,
"Questa stanza non è anonima"
],
"This room now shows unavailable members": [
null,
"Questa stanza mostra i membri non disponibili al momento"
],
"This room does not show unavailable members": [
null,
"Questa stanza non mostra i membri non disponibili"
],
"Non-privacy-related room configuration has changed": [
null,
"Una configurazione della stanza non legata alla privacy è stata modificata"
],
"Room logging is now enabled": [
null,
"La registrazione è abilitata nella stanza"
],
"Room logging is now disabled": [
null,
"La registrazione è disabilitata nella stanza"
],
"This room is now non-anonymous": [
null,
"Questa stanza è non-anonima"
],
"This room is now semi-anonymous": [
null,
"Questa stanza è semi-anonima"
],
"This room is now fully-anonymous": [
null,
"Questa stanza è completamente-anonima"
],
"A new room has been created": [
null,
"Una nuova stanza è stata creata"
],
"Your nickname has been changed": [
null,
"Il tuo soprannome è stato cambiato"
],
"<strong>%1$s</strong> has been banned": [
null,
"<strong>%1$s</strong> è stato bandito"
],
"<strong>%1$s</strong> has been kicked out": [
null,
"<strong>%1$s</strong> è stato espulso"
],
"<strong>%1$s</strong> has been removed because of an affiliation change": [
null,
"<strong>%1$s</strong> è stato rimosso a causa di un cambio di affiliazione"
],
"<strong>%1$s</strong> has been removed for not being a member": [
null,
"<strong>%1$s</strong> è stato rimosso in quanto non membro"
],
"You have been banned from this room": [
null,
"Sei stato bandito da questa stanza"
],
"You have been kicked from this room": [
null,
"Sei stato espulso da questa stanza"
],
"You have been removed from this room because of an affiliation change": [
null,
"Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"
],
"You have been removed from this room because the room has changed to members-only and you're not a member": [
null,
"Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"
],
"You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
null,
"Sei stato rimosso da questa stanza poiché il servizio MUC (Chat multi utente) è in fase di spegnimento"
],
"You are not on the member list of this room": [
null,
"Non sei nella lista dei membri di questa stanza"
],
"No nickname was specified": [
null,
"Nessun soprannome specificato"
],
"You are not allowed to create new rooms": [
null,
"Non ti è permesso creare nuove stanze"
],
"Your nickname doesn't conform to this room's policies": [
null,
"Il tuo soprannome non è conforme alle regole di questa stanza"
],
"Your nickname is already taken": [
null,
"Il tuo soprannome è già utilizzato"
],
"This room does not (yet) exist": [
null,
"Questa stanza non esiste (per ora)"
],
"This room has reached it's maximum number of occupants": [
null,
"Questa stanza ha raggiunto il limite massimo di utenti"
],
"Topic set by %1$s to: %2$s": [
null,
"Topic impostato da %1$s a: %2$s"
],
"This user is a moderator": [
null,
"Questo utente è un moderatore"
],
"This user can send messages in this room": [
null,
"Questo utente può inviare messaggi in questa stanza"
],
"This user can NOT send messages in this room": [
null,
"Questo utente NON può inviare messaggi in questa stanza"
],
"Click to chat with this contact": [
null,
"Clicca per parlare con questo contatto"
],
"Click to remove this contact": [
null,
"Clicca per rimuovere questo contatto"
],
"Contact requests": [
null,
"Richieste dei contatti"
],
"My contacts": [
null,
"I miei contatti"
],
"Pending contacts": [
null,
"Contatti in attesa"
],
"Custom status": [
null,
"Stato personalizzato"
],
"Click to change your chat status": [
null,
"Clicca per cambiare il tuo stato"
],
"Click here to write a custom status message": [
null,
"Clicca qui per scrivere un messaggio di stato personalizzato"
],
"online": [
null,
"in linea"
],
"busy": [
null,
"occupato"
],
"away for long": [
null,
"assente da molto"
],
"away": [
null,
"assente"
],
"I am %1$s": [
null,
"Sono %1$s"
],
"Sign in": [
null,
"Entra"
],
"XMPP/Jabber Username:": [
null,
"Nome utente:"
],
"Password:": [
null,
"Password:"
],
"Log In": [
null,
"Entra"
],
"BOSH Service URL:": [
null,
"Indirizzo servizio BOSH:"
],
"Connected": [
null,
"Connesso"
],
"Disconnected": [
null,
"Disconnesso"
],
"Error": [
null,
"Errore"
],
"Connecting": [
null,
"Connessione in corso"
],
"Connection Failed": [
null,
"Connessione fallita"
],
"Authenticating": [
null,
"Autenticazione in corso"
],
"Authentication Failed": [
null,
"Autenticazione fallita"
],
"Disconnecting": [
null,
"Disconnessione in corso"
],
"Attached": [
null,
"Allegato"
],
"Online Contacts": [
null,
"Contatti in linea"
]
}
}
});
return factory(it);
});
}(this, function (it) {
return it;
}));
\ No newline at end of file
/*
* This file specifies the language dependencies.
*
* Translations take up a lot of space and you are therefore advised to remove
* from here any languages that you don't need.
*/
(function (root, factory) {
require.config({
paths: {
"jed": "Libraries/jed",
"af": "locale/af/LC_MESSAGES/af",
"en": "locale/en/LC_MESSAGES/en",
"es": "locale/es/LC_MESSAGES/es",
"de": "locale/de/LC_MESSAGES/de",
"hu": "locale/hu/LC_MESSAGES/hu",
"it": "locale/it/LC_MESSAGES/it"
}
});
define("locales", [
'jed',
'af',
'en',
'es',
'de',
'hu',
"it"
], function (jed, af, en, es, de, hu, it) {
root.locales = {};
root.locales.af = af;
root.locales.en = en;
root.locales.es = es;
root.locales.de = de;
root.locales.hu = hu;
root.locales.it = it;
});
})(this);
require(["jquery", "converse"], function($, converse) {
converse.initialize({
bosh_service_url: 'https://bind.opkode.im' // Please use this connection manager only for testing purposes
});
window.converse = converse;
});
(function (root, factory) {
define("mock",
['converse'],
function() {
return factory();
define("mock",
['converse'],
function() {
return factory();
});
}(this, function (converse) {
var mock_connection = {
......@@ -10,10 +10,11 @@
'listRooms': function () {},
'join': function () {},
'leave': function () {},
'removeRoom': function () {}
'removeRoom': function () {},
'rooms': {}
},
'jid': 'dummy@localhost',
'addHandler': function (handler, ns, name, type, id, from, options) {
'addHandler': function (handler, ns, name, type, id, from, options) {
return function () {};
},
'send': function () {},
......@@ -25,15 +26,22 @@
'subscribe': function () {},
'registerCallback': function () {}
},
'vcard': {
'vcard': {
'get': function (callback, jid) {
var name = jid.split('@')[0].replace('.', ' ').split(' ');
var firstname = name[0].charAt(0).toUpperCase()+name[0].slice(1);
var lastname = name[1].charAt(0).toUpperCase()+name[1].slice(1);
var firstname, lastname;
if (!jid) {
jid = 'dummy@localhost';
firstname = 'Max';
lastname = 'Mustermann';
} else {
var name = jid.split('@')[0].replace('.', ' ').split(' ');
firstname = name[0].charAt(0).toUpperCase()+name[0].slice(1);
lastname = name[1].charAt(0).toUpperCase()+name[1].slice(1);
}
var fullname = firstname+' '+lastname;
var vcard = $iq().c('vCard').c('FN').t(fullname);
callback(vcard.tree());
}
}
},
'disco': {
'info': function () {},
......
{
"name": "converse.js",
"version": "0.5.0",
"description": "Browser based XMPP instant messaging client",
"main": "main.js",
"directories": {
"doc": "docs"
},
"scripts": {
"test": ""
},
"repository": {
"type": "git",
"url": "git://github.com/jcbrand/converse.js.git"
},
"keywords": [
"XMPP",
"Jabber",
"chat",
"messaging",
"chatrooms",
"webchat"
],
"author": "JC Brand",
"license": "MIT",
"bugs": {
"url": "https://github.com/jcbrand/converse.js/issues"
},
"devDependencies": {
"grunt-cli": "~0.1.9",
"grunt": "~0.4.1",
"grunt-contrib-jshint": "~0.6.0"
}
}
......@@ -147,7 +147,7 @@
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.renderPasswordForm).toHaveBeenCalled();
expect($chat_body.find('form.chatroom-form').length).toBe(1);
expect($chat_body.find('legend').text()).toBe('This chat room requires a password');
expect($chat_body.find('legend').text()).toBe('This chatroom requires a password');
});
}, converse));
......@@ -162,7 +162,7 @@
.c('registration-required').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderErrorMessage').andCallThrough();
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.$el.find('.chat-body p').text()).toBe('You are not on the member list of this room');
......@@ -179,7 +179,7 @@
.c('forbidden').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderErrorMessage').andCallThrough();
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.$el.find('.chat-body p').text()).toBe('You have been banned from this room');
......@@ -196,7 +196,7 @@
.c('jid-malformed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderErrorMessage').andCallThrough();
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.$el.find('.chat-body p').text()).toBe('No nickname was specified');
......@@ -213,7 +213,7 @@
.c('not-allowed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderErrorMessage').andCallThrough();
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.$el.find('.chat-body p').text()).toBe('You are not allowed to create new rooms');
......@@ -230,7 +230,7 @@
.c('not-acceptable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderErrorMessage').andCallThrough();
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.$el.find('.chat-body p').text()).toBe("Your nickname doesn't conform to this room's policies");
......@@ -247,7 +247,7 @@
.c('conflict').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderErrorMessage').andCallThrough();
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.$el.find('.chat-body p').text()).toBe("Your nickname is already taken");
......@@ -264,7 +264,7 @@
.c('item-not-found').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderErrorMessage').andCallThrough();
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.$el.find('.chat-body p').text()).toBe("This room does not (yet) exist");
......@@ -281,7 +281,7 @@
.c('service-unavailable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
var view = this.chatboxesview.views['problematic@muc.localhost'];
spyOn(converse.connection.muc, 'removeRoom');
spyOn(view, 'renderErrorMessage').andCallThrough();
spyOn(view, 'showErrorMessage').andCallThrough();
view.onChatRoomPresence(presence, {'nick': 'dummy'});
expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
expect(view.$el.find('.chat-body p').text()).toBe("This room has reached it's maximum number of occupants");
......
......@@ -54,7 +54,7 @@
expect($("div#controlbox").is(':visible')).toBe(true);
}, converse);
it("can be opened by clicking a DOM element with class 'toggle-online-users'", open_controlbox);
describe("The Status Widget", $.proxy(function () {
it("can be used to set the current user's chat status", $.proxy(function () {
var view = this.xmppstatusview;
......@@ -121,7 +121,7 @@
var i, t, is_last;
spyOn(this.rosterview, 'render').andCallThrough();
for (i=0; i<pend_names.length; i++) {
is_last = i==(pend_names.length-1);
is_last = i===(pend_names.length-1);
this.roster.create({
jid: pend_names[i].replace(' ','.').toLowerCase() + '@localhost',
subscription: 'none',
......@@ -129,7 +129,7 @@
fullname: pend_names[i],
is_last: is_last
});
// For performance reasons, the roster should only be shown once
// For performance reasons, the roster should only be shown once
// the last contact has been added.
if (is_last) {
expect(this.rosterview.$el.is(':visible')).toEqual(true);
......@@ -162,7 +162,7 @@
subscription: 'both',
ask: null,
fullname: cur_names[i],
is_last: i==(cur_names.length-1)
is_last: i===(cur_names.length-1)
});
expect(this.rosterview.render).toHaveBeenCalled();
// Check that they are sorted alphabetically
......@@ -291,7 +291,7 @@
subscription: 'none',
ask: 'request',
fullname: req_names[i],
is_last: i==(req_names.length-1)
is_last: i===(req_names.length-1)
});
expect(this.rosterview.render).toHaveBeenCalled();
// Check that they are sorted alphabetically
......@@ -335,7 +335,7 @@
expect(this.rosterview.removeRosterItem).toHaveBeenCalled();
expect(this.connection.roster.unauthorize).toHaveBeenCalled();
// There should now be one less contact
expect(this.roster.length).toEqual(num_contacts-1);
expect(this.roster.length).toEqual(num_contacts-1);
}, converse));
}, converse));
......@@ -368,7 +368,7 @@
afterEach($.proxy(function () {
// Contacts retrieved from localStorage have chat_status of
// "offline".
// "offline".
// In the next test suite, we need some online contacts, so
// we make some online now
for (i=0; i<5; i++) {
......@@ -456,7 +456,7 @@
expect(newchatboxes.length).toEqual(0);
// Lets open the controlbox again, purely for visual feedback
open_controlbox();
open_controlbox();
}, converse));
describe("A Chat Message", $.proxy(function () {
......@@ -465,14 +465,12 @@
var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
msg = $msg({
from: sender_jid,
to: this.connection.jid,
type: 'chat',
to: this.connection.jid,
type: 'chat',
id: (new Date()).getTime()
}).c('body').t(message).up()
.c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
spyOn(this, 'getVCard').andCallThrough();
// We don't already have an open chatbox for this user
expect(this.chatboxes.get(sender_jid)).not.toBeDefined();
......@@ -483,10 +481,6 @@
}, converse));
waits(500);
runs($.proxy(function () {
// Since we didn't already have an open chatbox, one
// will asynchronously created inside a callback to
// getVCard
expect(this.getVCard).toHaveBeenCalled();
// Check that the chatbox and its view now exist
var chatbox = this.chatboxes.get(sender_jid);
var chatboxview = this.chatboxesview.views[sender_jid];
......@@ -504,8 +498,11 @@
expect(msg_obj.get('delayed')).toEqual(false);
// Now check that the message appears inside the
// chatbox in the DOM
var txt = chatboxview.$el.find('.chat-content').find('.chat-message').find('.chat-message-content').text();
expect(txt).toEqual(message);
var $chat_content = chatboxview.$el.find('.chat-content');
var msg_txt = $chat_content.find('.chat-message').find('.chat-message-content').text();
expect(msg_txt).toEqual(message);
var sender_txt = $chat_content.find('span.chat-message-them').text();
expect(sender_txt.match(/^[0-9][0-9]:[0-9][0-9] /)).toBeTruthy();
}, converse));
}, converse));
......@@ -537,8 +534,8 @@
var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
msg = $msg({
from: sender_jid,
to: this.connection.jid,
type: 'chat',
to: this.connection.jid,
type: 'chat',
id: (new Date()).getTime()
}).c('body').t(message).up()
.c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
......@@ -566,8 +563,8 @@
var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
msg = $msg({
from: sender_jid,
to: this.connection.jid,
type: 'chat',
to: this.connection.jid,
type: 'chat',
id: (new Date()).getTime()
}).c('body').t(message).up()
.c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment