Commit 6464acff authored by JC Brand's avatar JC Brand

Merge branch 'master' into gh-pages

parents 4f03f43e 6f126db8
......@@ -4,39 +4,29 @@ Changelog
0.4 (Unreleased)
----------------
- CSS tweaks: fixed overflowing text in status message and chatrooms list.
[jcbrand]
- Bugfix: Cannot join chatroom when clicking from a list of rooms.
[jcbrand]
- Add better support for kicking or banning users from chatrooms.
[jcbrand]
- 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]
- 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)
......
/*
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);
(function (root, factory) {
define("locales", [
'jed',
'af',
'en'
], function (jed, af, en) {
root.locales = {};
root.locales.af = af;
root.locales.en = en;
});
})(this);
......@@ -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,10 @@
baseUrl: ".",
paths: {
"jquery": "Libraries/require-jquery",
"jed": "Libraries/jed",
"locales": "Libraries/locales",
"af": "locale/af/LC_MESSAGES/af",
"en": "locale/en/LC_MESSAGES/en",
"sjcl": "Libraries/sjcl",
"tinysort": "Libraries/jquery.tinysort",
"underscore": "Libraries/underscore",
......
......@@ -174,24 +174,29 @@ 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-info {
......@@ -263,7 +268,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;
}
......
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.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-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-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-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: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;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
.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-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.
......@@ -29,7 +29,7 @@ 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
`Session support`_ (i.e. single-signon functionality whereby users are authenticated once and stay
`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.
......@@ -47,7 +47,7 @@ An XMPP/Jabber server
to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).
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.
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`_.
......@@ -99,7 +99,7 @@ website. This will remove the need for any cross-domain XHR support.
Server-side authentication
==========================
Session support
Session Support
---------------
It's possible to enable single-site login, whereby users already
......@@ -140,7 +140,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`_.
For more info on this, read `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
......@@ -260,8 +260,6 @@ There are two ways to add users.
This setting enables the second mechanism, otherwise by default the first will
be used.
============
Minification
============
......@@ -302,6 +300,91 @@ CSS can be minimized with Yahoo's yuicompressor tool:
yui-compressor --type=css converse.css -o converse.min.css
============
Translations
============
The gettext POT file located in ./locales/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 ./locales/af/LC_MESSAGES/converse.po ./locales/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 locales/af/LC_MESSAGES/converse.po locales/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.
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" id="id7">Session support</a></li>
<li><a class="reference internal" href="#session-support" id="id7">Session Support</a></li>
</ul>
</li>
</ul>
......@@ -98,6 +98,7 @@
<li><a class="reference internal" href="#minifying-css" id="id21">Minifying CSS</a></li>
</ul>
</li>
<li><a class="reference internal" href="#translations" id="id22">Translations</a></li>
</ul>
</div>
<div class="section" id="introduction">
......@@ -113,7 +114,7 @@ properly configure and integrate it into your site.</p>
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
<a class="reference internal" href="#session-support">Session support</a> (i.e. single-signon functionality whereby users are authenticated once and stay
<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
......@@ -126,7 +127,7 @@ requirements.</p>
<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 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>
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>
......@@ -166,7 +167,7 @@ website. This will remove the need for any cross-domain XHR support.</p>
<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">
<h3><a class="toc-backref" href="#id7">Session support</a><a class="headerlink" href="#session-support" title="Permalink to this headline"></a></h3>
<h3><a class="toc-backref" href="#id7">Session Support</a><a class="headerlink" href="#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>
......@@ -196,7 +197,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">Session support</a>.</p>
<p>For more info on this, read <a class="reference internal" href="#session-support">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>
......@@ -311,6 +312,64 @@ manager, NPM.</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="#id22">Translations</a><a class="headerlink" href="#translations" title="Permalink to this headline"></a></h1>
<p>The gettext POT file located in ./locales/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 ./locales/af/LC_MESSAGES/converse.po ./locales/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="p">,</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 locales/af/LC_MESSAGES/converse.po locales/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>
<p>Congratulations, you&#8217;ve now succesfully added your translations. Sorry for all
those hoops you had to jump through.</p>
</div>
......
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,even:0,index:0,what:0,hide:0,section:0,current:0,version:0,"new":0,net:0,"public":0,gener:0,here:0,valu:0,box:0,convert:0,convers:0,mysit:0,implement:0,via:0,extra:0,apach:0,releas: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:[],xhr:0,can:0,lc_messag:0,purpos:0,root:0,fetch:0,control:0,quickstart:0,share:0,templat:0,tag:0,proprietari:0,explor: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,underscor:0,data:0,demonstr:0,man:0,practic:0,bind:0,django:0,inform:0,order:0,xmpp:0,over:0,through:0,streamlin:0,snippet:0,jid:0,directli: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,individu:0,realli:0,legwork:0,connect:0,extract:0,variabl:0,open:0,content:0,rel:0,internet:0,plural:0,factori:0,po2json:0,proxi:0,insid:0,standard:0,standalon:0,put:0,succesfulli:0,blogpost: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,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,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,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,requir:0,enabl:0,method:0,reload:0,integr:0,contain:0,where:0,set:0,stroph:0,see:0,close:0,state:0,between:0,experi:0,hide_muc_serv:0,attribut:0,kei: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,pot:0,backend:0,creat:0,json:0,much:0,besid:0,subscrib:0,msgmerg:0,great:0,minifi:0,togeth:0,i18n:0,present:0,multi:0,servic:0,plugin:0,defin:0,file:0,helper: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,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,applic:0,format: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,nplural:0,some:0,back:0,librari:0,deploy:0,overcom:0,refer:0,run:0,host:0,panel:0,src:0,about:0,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,"function":0,properli:0,form:0,bundl:0,link:0,translat:0,synonym:0,"true":0,congratul:0,requirej:0,info:0,made:0,locale_data:0,possibl:0,"default":0,below:0,otherwis:0,problem:0,expect:0,featur:0,onconnect:0,exist:0,chat:0,want:0,when:0,detail:0,gettext:0,field:0,other:0,test:0,you:0,nice:0,node:0,stai:0,lang:0,longer:0},objtypes:{},titles:["Introduction"],objnames:{},filenames:["index"]})
\ No newline at end of file
......@@ -260,8 +260,6 @@ There are two ways to add users.
This setting enables the second mechanism, otherwise by default the first will
be used.
============
Minification
============
......@@ -302,6 +300,91 @@ CSS can be minimized with Yahoo's yuicompressor tool:
yui-compressor --type=css converse.css -o converse.min.css
============
Translations
============
The gettext POT file located in ./locales/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 ./locales/af/LC_MESSAGES/converse.po ./locales/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 locales/af/LC_MESSAGES/converse.po locales/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.
Congratulations, you've now succesfully added your translations. Sorry for all
those hoops you had to jump through.
.. _`conversejs.org`: http://conversejs.org
......
......@@ -62,6 +62,7 @@
<li>Custom status messages</li>
<li>Typing notifications</li>
<li>Third person messages (/me )</li>
<li>i18n aware</li>
</ul>
<h2>Screencasts</h2>
......
(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;
}));
# 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-01 23:03+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 "Aanlyn"
#: converse.js:619
msgid "Busy"
msgstr "Besig"
#: converse.js:620
msgid "Away"
msgstr "Weg"
#: converse.js:621
msgid "Offline"
msgstr "Aflyn"
#: 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 "aanlyn"
#: converse.js:2357
msgid "busy"
msgstr "besig"
#: converse.js:2359
msgid "away for long"
msgstr "weg vir lank"
#: converse.js:2361
msgid "away"
msgstr "weg"
#. 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 "Ontkoppel"
#: 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 "Besig om te ontkoppel"
#: converse.js:2525
msgid "Attached"
msgstr "Geheg"
#: converse.js:2656
msgid "Online Contacts"
msgstr "Kontakte aanlyn"
# 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 ""
# 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 10:36+0200\n"
"PO-Revision-Date: 2013-06-01 10:48+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"
#: converse.js:416 converse.js:1141
msgid "Show this menu"
msgstr ""
#: converse.js:417 converse.js:1142
msgid "Write in the third person"
msgstr ""
#: converse.js:418 converse.js:1146
msgid "Remove messages"
msgstr ""
#: converse.js:558
msgid "Personal message"
msgstr ""
#: converse.js:632
msgid "Contacts"
msgstr ""
#: converse.js:637
msgid "Online"
msgstr ""
#: converse.js:638
msgid "Busy"
msgstr ""
#: converse.js:639
msgid "Away"
msgstr ""
#: converse.js:640
msgid "Offline"
msgstr ""
#: converse.js:647
msgid "Click to add new chat contacts"
msgstr ""
#: converse.js:647
msgid "Add a contact"
msgstr ""
#: converse.js:656
msgid "Contact username"
msgstr ""
#: converse.js:657
msgid "Add"
msgstr ""
#: converse.js:665
msgid "Contact name"
msgstr ""
#: converse.js:666
msgid "Search"
msgstr ""
#: converse.js:701
msgid "No users found"
msgstr ""
#: converse.js:708
msgid "Click to add as a chat contact"
msgstr ""
#: converse.js:772
msgid "Click to open this room"
msgstr ""
#: converse.js:774
msgid "Show more information on this room"
msgstr ""
#: converse.js:779
msgid "Description:"
msgstr ""
#: converse.js:780
msgid "Occupants:"
msgstr ""
#: converse.js:781
msgid "Features:"
msgstr ""
#: converse.js:783
msgid "Requires authentication"
msgstr ""
#: converse.js:786
msgid "Hidden"
msgstr ""
#: converse.js:789
msgid "Requires an invitation"
msgstr ""
#: converse.js:792
msgid "Moderated"
msgstr ""
#: converse.js:795
msgid "Non-anonymous"
msgstr ""
#: converse.js:798
msgid "Open room"
msgstr ""
#: converse.js:801
msgid "Permanent room"
msgstr ""
#: converse.js:804
msgid "Public"
msgstr ""
#: converse.js:807
msgid "Semi-anonymous"
msgstr ""
#: converse.js:810
msgid "Temporary room"
msgstr ""
#: converse.js:813
msgid "Unmoderated"
msgstr ""
#: converse.js:819
msgid "Rooms"
msgstr ""
#: converse.js:823
msgid "Room name"
msgstr ""
#: converse.js:824
msgid "Nickname"
msgstr ""
#: converse.js:825
msgid "Server"
msgstr ""
#: converse.js:826
msgid "Join"
msgstr ""
#: converse.js:827
msgid "Show rooms"
msgstr ""
#: converse.js:1143
msgid "Set chatroom topic"
msgstr ""
#: converse.js:1144
msgid "Kick user from chatroom"
msgstr ""
#: converse.js:1145
msgid "Ban user from chatroom"
msgstr ""
#: converse.js:1172
msgid "Message"
msgstr ""
#: converse.js:1286 converse.js:2321
msgid "Save"
msgstr ""
#: converse.js:1287
msgid "Cancel"
msgstr ""
#: converse.js:1334
msgid "An error occurred while trying to save the form."
msgstr ""
#: converse.js:1380
msgid "This chat room requires a password"
msgstr ""
#: converse.js:1381
msgid "Password: "
msgstr ""
#: converse.js:1382
msgid "Submit"
msgstr ""
#: converse.js:1396
msgid "This room is not anonymous"
msgstr ""
#: converse.js:1397
msgid "This room now shows unavailable members"
msgstr ""
#: converse.js:1398
msgid "This room does not show unavailable members"
msgstr ""
#: converse.js:1399
msgid "Non-privacy-related room configuration has changed"
msgstr ""
#: converse.js:1400
msgid "Room logging is now enabled"
msgstr ""
#: converse.js:1401
msgid "Room logging is now disabled"
msgstr ""
#: converse.js:1402
msgid "This room is now non-anonymous"
msgstr ""
#: converse.js:1403
msgid "This room is now semi-anonymous"
msgstr ""
#: converse.js:1404
msgid "This room is now fully-anonymous"
msgstr ""
#: converse.js:1405
msgid "A new room has been created"
msgstr ""
#: converse.js:1406
msgid "Your nickname has been changed"
msgstr ""
#: converse.js:1410
msgid " has been banned"
msgstr ""
#: converse.js:1411
msgid " has been kicked out"
msgstr ""
#: converse.js:1412
msgid " has been removed because of an affiliation change"
msgstr ""
#: converse.js:1413
msgid " has been removed for not being a member"
msgstr ""
#: converse.js:1417 converse.js:1480
msgid "You have been banned from this room"
msgstr ""
#: converse.js:1418
msgid "You have been kicked from this room"
msgstr ""
#: converse.js:1419
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
#: converse.js:1420
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:1421
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr ""
#: converse.js:1478
msgid "You are not on the member list of this room"
msgstr ""
#: converse.js:1484
msgid "No nickname was specified"
msgstr ""
#: converse.js:1488
msgid "You are not allowed to create new rooms"
msgstr ""
#: converse.js:1490
msgid "Your nickname doesn't conform to this room's policies"
msgstr ""
#: converse.js:1492
msgid "Your nickname is already taken"
msgstr ""
#: converse.js:1494
msgid "This room does not (yet) exist"
msgstr ""
#: converse.js:1496
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:1573
msgid "Topic set by %1$s to: %2$s"
msgstr ""
#: converse.js:1589
msgid "This user is a moderator"
msgstr ""
#: converse.js:1592
msgid "This user can send messages in this room"
msgstr ""
#: converse.js:1595
msgid "This user can NOT send messages in this room"
msgstr ""
#: converse.js:1799
msgid "Click to chat with this contact"
msgstr ""
#: converse.js:1800 converse.js:1804
msgid "Click to remove this contact"
msgstr ""
#: converse.js:2166
msgid "Contact requests"
msgstr ""
#: converse.js:2167
msgid "My contacts"
msgstr ""
#: converse.js:2168
msgid "Pending contacts"
msgstr ""
#: converse.js:2320
msgid "Custom status"
msgstr ""
#: converse.js:2326
msgid "Click to change your chat status"
msgstr ""
#: converse.js:2329
msgid "Click here to write a custom status message"
msgstr ""
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2376 converse.js:2410
msgid "I am %1$s"
msgstr ""
#: converse.js:2481
msgid "Sign in"
msgstr ""
#: converse.js:2484
msgid "XMPP/Jabber Username:"
msgstr ""
#: converse.js:2486
msgid "Password:"
msgstr ""
#: converse.js:2488
msgid "Log In"
msgstr ""
#: converse.js:2492
msgid "BOSH Service URL:"
msgstr ""
#: converse.js:2504
msgid "Connected"
msgstr ""
#: converse.js:2508
msgid "Disconnected"
msgstr ""
#: converse.js:2512
msgid "Error"
msgstr ""
#: converse.js:2514
msgid "Connecting"
msgstr ""
#: converse.js:2517
msgid "Connection Failed"
msgstr ""
#: converse.js:2519
msgid "Authenticating"
msgstr ""
#: converse.js:2522
msgid "Authentication Failed"
msgstr ""
#: converse.js:2524
msgid "Disconnecting"
msgstr ""
#: converse.js:2526
msgid "Attached"
msgstr ""
#: converse.js:2657
msgid "Online Contacts"
msgstr ""
(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;
}));
# Dutch 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 10:36+0200\n"
"PO-Revision-Date: 2013-06-01 10:48+0200\n"
"Last-Translator: JC Brand <jc@opkode.com>\n"
"Language-Team: Dutch\n"
"Language: nl\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:416 converse.js:1141
msgid "Show this menu"
msgstr ""
#: converse.js:417 converse.js:1142
msgid "Write in the third person"
msgstr ""
#: converse.js:418 converse.js:1146
msgid "Remove messages"
msgstr ""
#: converse.js:558
msgid "Personal message"
msgstr ""
#: converse.js:632
msgid "Contacts"
msgstr ""
#: converse.js:637
msgid "Online"
msgstr ""
#: converse.js:638
msgid "Busy"
msgstr ""
#: converse.js:639
msgid "Away"
msgstr ""
#: converse.js:640
msgid "Offline"
msgstr ""
#: converse.js:647
msgid "Click to add new chat contacts"
msgstr ""
#: converse.js:647
msgid "Add a contact"
msgstr ""
#: converse.js:656
msgid "Contact username"
msgstr ""
#: converse.js:657
msgid "Add"
msgstr ""
#: converse.js:665
msgid "Contact name"
msgstr ""
#: converse.js:666
msgid "Search"
msgstr ""
#: converse.js:701
msgid "No users found"
msgstr ""
#: converse.js:708
msgid "Click to add as a chat contact"
msgstr ""
#: converse.js:772
msgid "Click to open this room"
msgstr ""
#: converse.js:774
msgid "Show more information on this room"
msgstr ""
#: converse.js:779
msgid "Description:"
msgstr ""
#: converse.js:780
msgid "Occupants:"
msgstr ""
#: converse.js:781
msgid "Features:"
msgstr ""
#: converse.js:783
msgid "Requires authentication"
msgstr ""
#: converse.js:786
msgid "Hidden"
msgstr ""
#: converse.js:789
msgid "Requires an invitation"
msgstr ""
#: converse.js:792
msgid "Moderated"
msgstr ""
#: converse.js:795
msgid "Non-anonymous"
msgstr ""
#: converse.js:798
msgid "Open room"
msgstr ""
#: converse.js:801
msgid "Permanent room"
msgstr ""
#: converse.js:804
msgid "Public"
msgstr ""
#: converse.js:807
msgid "Semi-anonymous"
msgstr ""
#: converse.js:810
msgid "Temporary room"
msgstr ""
#: converse.js:813
msgid "Unmoderated"
msgstr ""
#: converse.js:819
msgid "Rooms"
msgstr ""
#: converse.js:823
msgid "Room name"
msgstr ""
#: converse.js:824
msgid "Nickname"
msgstr ""
#: converse.js:825
msgid "Server"
msgstr ""
#: converse.js:826
msgid "Join"
msgstr ""
#: converse.js:827
msgid "Show rooms"
msgstr ""
#: converse.js:1143
msgid "Set chatroom topic"
msgstr ""
#: converse.js:1144
msgid "Kick user from chatroom"
msgstr ""
#: converse.js:1145
msgid "Ban user from chatroom"
msgstr ""
#: converse.js:1172
msgid "Message"
msgstr ""
#: converse.js:1286 converse.js:2321
msgid "Save"
msgstr ""
#: converse.js:1287
msgid "Cancel"
msgstr ""
#: converse.js:1334
msgid "An error occurred while trying to save the form."
msgstr ""
#: converse.js:1380
msgid "This chat room requires a password"
msgstr ""
#: converse.js:1381
msgid "Password: "
msgstr ""
#: converse.js:1382
msgid "Submit"
msgstr ""
#: converse.js:1396
msgid "This room is not anonymous"
msgstr ""
#: converse.js:1397
msgid "This room now shows unavailable members"
msgstr ""
#: converse.js:1398
msgid "This room does not show unavailable members"
msgstr ""
#: converse.js:1399
msgid "Non-privacy-related room configuration has changed"
msgstr ""
#: converse.js:1400
msgid "Room logging is now enabled"
msgstr ""
#: converse.js:1401
msgid "Room logging is now disabled"
msgstr ""
#: converse.js:1402
msgid "This room is now non-anonymous"
msgstr ""
#: converse.js:1403
msgid "This room is now semi-anonymous"
msgstr ""
#: converse.js:1404
msgid "This room is now fully-anonymous"
msgstr ""
#: converse.js:1405
msgid "A new room has been created"
msgstr ""
#: converse.js:1406
msgid "Your nickname has been changed"
msgstr ""
#: converse.js:1410
msgid " has been banned"
msgstr ""
#: converse.js:1411
msgid " has been kicked out"
msgstr ""
#: converse.js:1412
msgid " has been removed because of an affiliation change"
msgstr ""
#: converse.js:1413
msgid " has been removed for not being a member"
msgstr ""
#: converse.js:1417 converse.js:1480
msgid "You have been banned from this room"
msgstr ""
#: converse.js:1418
msgid "You have been kicked from this room"
msgstr ""
#: converse.js:1419
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
#: converse.js:1420
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:1421
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr ""
#: converse.js:1478
msgid "You are not on the member list of this room"
msgstr ""
#: converse.js:1484
msgid "No nickname was specified"
msgstr ""
#: converse.js:1488
msgid "You are not allowed to create new rooms"
msgstr ""
#: converse.js:1490
msgid "Your nickname doesn't conform to this room's policies"
msgstr ""
#: converse.js:1492
msgid "Your nickname is already taken"
msgstr ""
#: converse.js:1494
msgid "This room does not (yet) exist"
msgstr ""
#: converse.js:1496
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:1573
msgid "Topic set by %1$s to: %2$s"
msgstr ""
#: converse.js:1589
msgid "This user is a moderator"
msgstr ""
#: converse.js:1592
msgid "This user can send messages in this room"
msgstr ""
#: converse.js:1595
msgid "This user can NOT send messages in this room"
msgstr ""
#: converse.js:1799
msgid "Click to chat with this contact"
msgstr ""
#: converse.js:1800 converse.js:1804
msgid "Click to remove this contact"
msgstr ""
#: converse.js:2166
msgid "Contact requests"
msgstr ""
#: converse.js:2167
msgid "My contacts"
msgstr ""
#: converse.js:2168
msgid "Pending contacts"
msgstr ""
#: converse.js:2320
msgid "Custom status"
msgstr ""
#: converse.js:2326
msgid "Click to change your chat status"
msgstr ""
#: converse.js:2329
msgid "Click here to write a custom status message"
msgstr ""
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2376 converse.js:2410
msgid "I am %1$s"
msgstr ""
#: converse.js:2481
msgid "Sign in"
msgstr ""
#: converse.js:2484
msgid "XMPP/Jabber Username:"
msgstr ""
#: converse.js:2486
msgid "Password:"
msgstr ""
#: converse.js:2488
msgid "Log In"
msgstr ""
#: converse.js:2492
msgid "BOSH Service URL:"
msgstr ""
#: converse.js:2504
msgid "Connected"
msgstr ""
#: converse.js:2508
msgid "Disconnected"
msgstr ""
#: converse.js:2512
msgid "Error"
msgstr ""
#: converse.js:2514
msgid "Connecting"
msgstr ""
#: converse.js:2517
msgid "Connection Failed"
msgstr ""
#: converse.js:2519
msgid "Authenticating"
msgstr ""
#: converse.js:2522
msgid "Authentication Failed"
msgstr ""
#: converse.js:2524
msgid "Disconnecting"
msgstr ""
#: converse.js:2526
msgid "Attached"
msgstr ""
#: converse.js:2657
msgid "Online Contacts"
msgstr ""
......@@ -28,9 +28,16 @@
},
'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());
......
......@@ -471,8 +471,6 @@
}).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];
......
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