Browse Source

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

Conflicts:
	converse.js
JC Brand 12 years ago
parent
commit
509b2c307c
45 changed files with 10485 additions and 1742 deletions
  1. 14 0
      .gitignore
  2. 31 23
      CHANGES.rst
  3. 20 0
      Gruntfile.js
  4. 0 251
      Libraries/jarnxmpp.core.handlers.js
  5. 632 0
      Libraries/jed.js
  6. 1 1
      Libraries/strophe.muc.js
  7. 17 35
      Makefile
  8. 9 1
      build.js
  9. 0 0
      converse.0.3.min.css
  10. 0 84
      converse.0.3.min.js
  11. 45 46
      converse.css
  12. 1321 1156
      converse.js
  13. 0 0
      converse.min.css
  14. 139 0
      converse.min.js
  15. BIN
      docs/doctrees/environment.pickle
  16. BIN
      docs/doctrees/index.doctree
  17. 194 21
      docs/html/_sources/index.txt
  18. 159 27
      docs/html/index.html
  19. BIN
      docs/html/objects.inv
  20. 0 0
      docs/html/searchindex.js
  21. 194 21
      docs/source/index.rst
  22. 47 31
      index.html
  23. 459 0
      locale/af/LC_MESSAGES/af.js
  24. 459 0
      locale/af/LC_MESSAGES/converse.json
  25. 488 0
      locale/af/LC_MESSAGES/converse.po
  26. 481 0
      locale/converse.pot
  27. 460 0
      locale/de/LC_MESSAGES/converse.json
  28. 489 0
      locale/de/LC_MESSAGES/converse.po
  29. 459 0
      locale/de/LC_MESSAGES/de.js
  30. 19 0
      locale/en/LC_MESSAGES/en.js
  31. 460 0
      locale/es/LC_MESSAGES/converse.json
  32. 493 0
      locale/es/LC_MESSAGES/converse.po
  33. 459 0
      locale/es/LC_MESSAGES/es.js
  34. 457 0
      locale/hu/LC_MESSAGES/converse.json
  35. 481 0
      locale/hu/LC_MESSAGES/converse.po
  36. 459 0
      locale/hu/LC_MESSAGES/hu.js
  37. 460 0
      locale/it/LC_MESSAGES/converse.json
  38. 489 0
      locale/it/LC_MESSAGES/converse.po
  39. 470 0
      locale/it/LC_MESSAGES/it.js
  40. 38 0
      locale/locales.js
  41. 1 3
      main.js
  42. 19 11
      mock.js
  43. 34 0
      package.json
  44. 9 9
      spec/ChatRoomSpec.js
  45. 19 22
      spec/MainSpec.js

+ 14 - 0
.gitignore

@@ -0,0 +1,14 @@
+*~
+*.mo
+*.kpf
+*.swp
+.*.cfg
+.hg/
+.bzr/
+.svn/
+.project
+.pydevproject
+node_modules
+
+# OSX
+.DS_Store

+ 31 - 23
CHANGES.rst

@@ -1,32 +1,40 @@
 Changelog
 Changelog
 =========
 =========
 
 
+0.5 (Unreleased)
+----------------
+- #22 Fixed compare operator in strophe.muc [sonata82]
+- #23 Add Italian translations [ctrlaltca]
+- #24 Add Spanish translations [macagua]
+- #25 Using span with css instead of img [matheus-morfi]
+- #26 Only the first minute digit shown in chatbox. [jcbrand]
+
+0.4 (2013-06-03)
+----------------
+
+- CSS tweaks: fixed overflowing text in status message and chatrooms list. [jcbrand]
+- Bugfix: Couldn't join chatroom when clicking from a list of rooms. [jcbrand]
+- Add better support for kicking or banning users from chatrooms. [jcbrand]
+- Fixed alignment of chat messages in Firefox. [jcbrand]
+- More intelligent fetching of vCards. [jcbrand]
+- Fixed a race condition bug. Make sure that the roster is populated before sending initial presence. [jcbrand]
+- Reconnect automatically when the connection drops. [jcbrand]
+- Add support for internationalization. [jcbrand]
+
 0.3 (2013-05-21)
 0.3 (2013-05-21)
 ----------------
 ----------------
 
 
-- Add vCard support 
+- Add vCard support [jcbrand]
-  [jcbrand]
+- Remember custom status messages upon reload. [jcbrand]
-- Remember custom status messages upon reload. 
+- Remove jquery-ui dependency. [jcbrand]
-  [jcbrand] 
+- Use backbone.localStorage to store the contacts roster, open chatboxes and chat messages. [jcbrand]
-- Remove jquery-ui dependency. 
+- Fixed user status handling, which wasn't 100% according to the spec. [jcbrand]
-  [jcbrand]
+- Separate messages according to day in chats. [jcbrand]
-- Use backbone.localStorage to store the contacts roster, open chatboxes and
+- Add support for specifying the BOSH bind URL as configuration setting. [jcbrand]
-  chat messages. 
+- #8 Improve the message counter to only increment when the window is not focused [witekdev]
-  [jcbrand]
+- Make fetching of list of chatrooms on a server a configuration option. [jcbrand]
-- Fixed user status handling, which wasn't 100% according to the spec. 
+- Use service discovery to show all available features on a room. [jcbrand]
-  [jcbrand]
+- Multi-user chatrooms are now configurable. [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)
 0.2 (2013-03-28)

+ 20 - 0
Gruntfile.js

@@ -0,0 +1,20 @@
+module.exports = function(grunt) {
+    grunt.initConfig({
+        jshint: {
+        options: {
+            trailing: true
+        },
+        target: {
+            src : [
+                'converse.js',
+                'mock.js',
+                'main.js',
+                'tests_main.js',
+                'spec/*.js'
+            ]
+        }
+        }
+    });
+    grunt.loadNpmTasks('grunt-contrib-jshint');
+    grunt.registerTask('default', ['jshint']);
+};

+ 0 - 251
Libraries/jarnxmpp.core.handlers.js

@@ -1,251 +0,0 @@
-/*global $:false, document:false, window:false, portal_url:false,
-$msg:false, Strophe:false, setTimeout:false, navigator:false, jarn:false, google:false, jarnxmpp:false, jQuery:false, sessionStorage:false, $iq:false, $pres:false, Image:false, */
-
-(function (jarnxmpp, $, portal_url) {
-
-    portal_url = portal_url || '';
-
-    jarnxmpp.Storage = {
-        storage: null,
-        init: function () {
-            try {
-                if ('sessionStorage' in window && window.sessionStorage !== null && JSON in window && window.JSON !== null) {
-                    jarnxmpp.Storage.storage = sessionStorage;
-                    if (!('_user_info' in jarnxmpp.Storage.storage)) {
-                        jarnxmpp.Storage.set('_user_info', {});
-                    }
-                    if (!('_vCards' in jarnxmpp.Storage.storage)) {
-                        jarnxmpp.Storage.set('_vCards', {});
-                    }
-                    if (!('_subscriptions' in jarnxmpp.Storage.storage)) {
-                        jarnxmpp.Storage.set('_subscriptions', null);
-                    }
-                }
-            } catch (e) {}
-        },
-
-        get: function (key) {
-            if (key in sessionStorage) {
-                return JSON.parse(sessionStorage[key]);
-            }
-            return null;
-        },
-
-        set: function (key, value) {
-            sessionStorage[key] = JSON.stringify(value);
-        },
-
-        xmppGet: function (key, callback) {
-            var stanza = $iq({type: 'get'})
-                .c('query', {xmlns: 'jabber:iq:private'})
-                .c('jarnxmpp', {xmlns: 'http://jarn.com/ns/jarnxmpp:prefs:' + key})
-                .tree();
-            jarnxmpp.connection.sendIQ(stanza, function success(result) {
-                callback($('jarnxmpp ' + 'value', result).first().text());
-            });
-        },
-
-        xmppSet: function (key, value) {
-            var stanza = $iq({type: 'set'})
-                .c('query', {xmlns: 'jabber:iq:private'})
-                .c('jarnxmpp', {xmlns: 'http://jarn.com/ns/jarnxmpp:prefs:' + key})
-                .c('value', value)
-                .tree();
-            jarnxmpp.connection.sendIQ(stanza);
-        }
-    };
-
-    jarnxmpp.Storage.init();
-
-    jarnxmpp.Presence = {
-        online: {},
-        _user_info: {},
-
-        onlineCount: function () {
-            var me = Strophe.getNodeFromJid(jarnxmpp.connection.jid),
-                counter = 0,
-                user;
-            for (user in jarnxmpp.Presence.online) {
-                if ((jarnxmpp.Presence.online.hasOwnProperty(user)) && user !== me) {
-                    counter += 1;
-                }
-            }
-            return counter;
-        },
-
-        getUserInfo: function (user_id, callback) {
-            // User info on browsers without storage
-            if (jarnxmpp.Storage.storage === null) {
-                if (user_id in jarnxmpp.Presence._user_info) {
-                    callback(jarnxmpp.Presence._user_info[user_id]);
-                } else {
-                    $.getJSON(portal_url + "/xmpp-userinfo?user_id=" + user_id, function (data) {
-                        jarnxmpp.Presence._user_info[user_id] = data;
-                        callback(data);
-                    });
-                }
-            } else {
-                var _user_info = jarnxmpp.Storage.get('_user_info');
-                if (user_id in _user_info) {
-                    callback(_user_info[user_id]);
-                } else {
-                    $.getJSON(portal_url + "/xmpp-userinfo?user_id=" + user_id, function (data) {
-                        _user_info[user_id] = data;
-                        jarnxmpp.Storage.set('_user_info', _user_info);
-                        callback(data);
-                    });
-                }
-            }
-        }
-    };
-
-    jarnxmpp.vCard = {
-
-        _vCards: {},
-
-        _getVCard: function (jid, callback) {
-            var stanza =
-                $iq({type: 'get', to: jid})
-                .c('vCard', {xmlns: 'vcard-temp'}).tree();
-            jarnxmpp.connection.sendIQ(stanza, function (data) {
-                var result = {};
-                $('vCard[xmlns="vcard-temp"]', data).children().each(function (idx, element) {
-                    result[element.nodeName] = element.textContent;
-                });
-                if (typeof (callback) !== 'undefined') {
-                    callback(result);
-                }
-            });
-        },
-
-        getVCard: function (jid, callback) {
-            jid = Strophe.getBareJidFromJid(jid);
-            if (jarnxmpp.Storage.storage === null) {
-                if (jid in jarnxmpp.vCard._vCards) {
-                    callback(jarnxmpp.vCard._vCards[jid]);
-                } else {
-                    jarnxmpp.vCard._getVCard(jid, function (result) {
-                        jarnxmpp.vCard._vCards[jid] = result;
-                        callback(result);
-                    });
-                }
-            } else {
-                var _vCards = jarnxmpp.Storage.get('_vCards');
-                if (jid in _vCards) {
-                    callback(_vCards[jid]);
-                } else {
-                    jarnxmpp.vCard._getVCard(jid, function (result) {
-                        _vCards[jid] = result;
-                        jarnxmpp.Storage.set('_vCards', _vCards);
-                        callback(result);
-                    });
-                }
-            }
-        },
-
-        setVCard: function (params, photoUrl) {
-            var key,
-                vCard = Strophe.xmlElement('vCard', [['xmlns', 'vcard-temp'], ['version', '2.0']]);
-            for (key in params) {
-                if (params.hasOwnProperty(key)) {
-                    vCard.appendChild(Strophe.xmlElement(key, [], params[key]));
-                }
-            }
-            var send = function () {
-                var stanza = $iq({type: 'set'}).cnode(vCard).tree();
-                jarnxmpp.connection.sendIQ(stanza);
-            };
-            if (typeof (photoUrl) === 'undefined') {
-                send();
-            } else {
-                jarnxmpp.vCard.getBase64Image(photoUrl, function (base64img) {
-                    base64img = base64img.replace(/^data:image\/png;base64,/, "");
-                    var photo = Strophe.xmlElement('PHOTO');
-                    photo.appendChild(Strophe.xmlElement('TYPE', [], 'image/png'));
-                    photo.appendChild(Strophe.xmlElement('BINVAL', [], base64img));
-                    vCard.appendChild(photo);
-                    send();
-                });
-            }
-        },
-
-        getBase64Image: function (url, callback) {
-            // Create the element, then draw it on a canvas to get the base64 data.
-            var img = new Image();
-            $(img).load(function () {
-                var canvas = document.createElement('canvas');
-                canvas.width = img.width;
-                canvas.height = img.height;
-                var ctx = canvas.getContext("2d");
-                ctx.drawImage(img, 0, 0);
-                callback(canvas.toDataURL('image/png'));
-            }).attr('src', url);
-        }
-    };
-
-    jarnxmpp.onConnect = function (status) {
-        if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
-            $(window).bind('beforeunload', function () {
-                $(document).trigger('jarnxmpp.disconnecting');
-                var presence = $pres({type: 'unavailable'});
-                jarnxmpp.connection.send(presence);
-                jarnxmpp.connection.disconnect();
-                jarnxmpp.connection.flush();
-            });
-            $(document).trigger('jarnxmpp.connected');
-        } else if (status === Strophe.Status.DISCONNECTED) {
-            $(document).trigger('jarnxmpp.disconnected');
-        }
-    };
-
-    jarnxmpp.rawInput = function (data) {
-        var event = jQuery.Event('jarnxmpp.dataReceived');
-        event.text = data;
-        $(document).trigger(event);
-    };
-
-    jarnxmpp.rawOutput = function (data) {
-        var event = jQuery.Event('jarnxmpp.dataSent');
-        event.text = data;
-        $(document).trigger(event);
-    };
-
-    $(document).bind('jarnxmpp.connected', function () {
-        // Logging
-        jarnxmpp.connection.rawInput = jarnxmpp.rawInput;
-        jarnxmpp.connection.rawOutput = jarnxmpp.rawOutput;
-    });
-
-    $(document).bind('jarnxmpp.disconnecting', function () {
-        if (jarnxmpp.Storage.storage !== null) {
-            jarnxmpp.Storage.set('online-count', jarnxmpp.Presence.onlineCount());
-        }
-    });
-
-    $(document).ready(function () {
-        var resource = jarnxmpp.Storage.get('xmppresource');
-        if (resource) {
-            data = {'resource': resource};
-        } else {
-            data = {};
-        }
-        $.ajax({
-            'url':portal_url + '/@@xmpp-loader',
-            'dataType': 'json',
-            'data': data,
-            'success': function (data) {
-                if (!(('rid' in data) && ('sid' in data) && ('BOSH_SERVICE' in data))) {
-                    return;
-                }
-                if (!resource) {
-                    jarnxmpp.Storage.set('xmppresource', Strophe.getResourceFromJid(data.jid));
-                }
-                jarnxmpp.BOSH_SERVICE = data.BOSH_SERVICE;
-                jarnxmpp.jid = data.jid;
-                jarnxmpp.connection = new Strophe.Connection(jarnxmpp.BOSH_SERVICE);
-                jarnxmpp.connection.attach(jarnxmpp.jid, data.sid, data.rid, jarnxmpp.onConnect);
-            }
-        });
-    });
-
-})(window.jarnxmpp = window.jarnxmpp || {}, jQuery, portal_url);

File diff suppressed because it is too large
+ 632 - 0
Libraries/jed.js


+ 1 - 1
Libraries/strophe.muc.js

@@ -180,7 +180,7 @@
                 xmlns: Strophe.NS.CLIENT
                 xmlns: Strophe.NS.CLIENT
             }).t(message);
             }).t(message);
             msg.up();
             msg.up();
-            if (html_message !== null) {
+            if (html_message != null) {
                 msg.c("html", {xmlns: Strophe.NS.XHTML_IM}).c("body", {xmlns: Strophe.NS.XHTML}).h(html_message);
                 msg.c("html", {xmlns: Strophe.NS.XHTML_IM}).c("body", {xmlns: Strophe.NS.XHTML}).h(html_message);
 
 
                 if (msg.node.childNodes.length === 0) {
                 if (msg.node.childNodes.length === 0) {

+ 17 - 35
Makefile

@@ -11,30 +11,31 @@ ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./d
 # the i18n builder cannot share the environment and doctrees with the others
 # the i18n builder cannot share the environment and doctrees with the others
 I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./docs/source
 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:
 help:
 	@echo "Please use \`make <target>' where <target> is one of"
 	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  release    to make a new minified release"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  html       to make standalone HTML files"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
 	@echo "  dirhtml    to make HTML files named index.html in directories"
 	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-	@echo "  pickle     to make pickle files"
+	@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 "  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 "  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 "  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 "  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: 
 release: 
 	r.js -o build.js
 	r.js -o build.js
@@ -57,11 +58,6 @@ singlehtml:
 	@echo
 	@echo
 	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
 	@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:
 json:
 	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
 	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
 	@echo
 	@echo
@@ -73,15 +69,6 @@ htmlhelp:
 	@echo "Build finished; now you can run HTML Help Workshop with the" \
 	@echo "Build finished; now you can run HTML Help Workshop with the" \
 	      ".hhp project file in $(BUILDDIR)/htmlhelp."
 	      ".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:
 devhelp:
 	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
 	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
 	@echo
 	@echo
@@ -114,11 +101,6 @@ text:
 	@echo
 	@echo
 	@echo "Build finished. The text files are in $(BUILDDIR)/text."
 	@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:
 texinfo:
 	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
 	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
 	@echo
 	@echo

+ 9 - 1
build.js

@@ -2,6 +2,14 @@
     baseUrl: ".",
     baseUrl: ".",
     paths: {
     paths: {
         "jquery": "Libraries/require-jquery",
         "jquery": "Libraries/require-jquery",
+        "jed": "Libraries/jed",
+        "locales": "locale/locales",
+        "af": "locale/af/LC_MESSAGES/af",
+        "en": "locale/en/LC_MESSAGES/en",
+        "de": "locale/de/LC_MESSAGES/de",
+        "es": "locale/es/LC_MESSAGES/es",
+        "hu": "locale/hu/LC_MESSAGES/hu",
+        "it": "locale/it/LC_MESSAGES/it",
         "sjcl": "Libraries/sjcl",
         "sjcl": "Libraries/sjcl",
         "tinysort": "Libraries/jquery.tinysort",
         "tinysort": "Libraries/jquery.tinysort",
         "underscore": "Libraries/underscore",
         "underscore": "Libraries/underscore",
@@ -14,5 +22,5 @@
         "strophe.disco": "Libraries/strophe.disco"
         "strophe.disco": "Libraries/strophe.disco"
     },
     },
     name: "main",
     name: "main",
-    out: "converse.0.3.min.js"
+    out: "converse.min.js"
 })
 })

File diff suppressed because it is too large
+ 0 - 0
converse.0.3.min.css


File diff suppressed because it is too large
+ 0 - 84
converse.0.3.min.js


+ 45 - 46
converse.css

@@ -15,29 +15,18 @@ span.spinner {
     display: block;
     display: block;
 }
 }
 
 
-span.spinner.hor_centered {
+span.spinner.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;
     position: absolute;
     top: 30%;
     top: 30%;
     left: 50%;
     left: 50%;
     margin: 0 0 0 -25%;
     margin: 0 0 0 -25%;
 }
 }
 
 
+span.spinner.hor_centered {
+    left: 40%;
+    position: absolute;
+}
+
 #chatpanel {
 #chatpanel {
     z-index: 99; /*--Keeps the panel on top of all other elements--*/
     z-index: 99; /*--Keeps the panel on top of all other elements--*/
     position: fixed;
     position: fixed;
@@ -87,7 +76,8 @@ img.centered {
 .chatroom .chat-body {
 .chatroom .chat-body {
     height: 272px;
     height: 272px;
     background-color: white;
     background-color: white;
-    border-radius: 4px;
+    border-bottom-right-radius: 4px;
+    border-bottom-left-radius: 4px;
 }
 }
 
 
 .chatroom .chat-area {
 .chatroom .chat-area {
@@ -173,31 +163,36 @@ ul.participant-list li.moderator {
     color:#666666;
     color:#666666;
 }
 }
 
 
+.chat-message-room,
+.chat-message-them,
 .chat-message-me {
 .chat-message-me {
     font-weight: bold;
     font-weight: bold;
-    color: #436976;
-}
-
-.chat-message-room {
-    font-weight: bold;
-    color: #4B7003;
-}
-
-.chat-message-them {
-    font-weight: bold;
-    color: #F62817;
     white-space: nowrap;
     white-space: nowrap;
     max-width: 100px;
     max-width: 100px;
     text-overflow: ellipsis;
     text-overflow: ellipsis;
     overflow: hidden;
     overflow: hidden;
     display: inline-block;
     display: inline-block;
+    float: left;
+    padding-right: 3px;
+}
+
+.chat-message-them {
+    color: #F62817;
+}
+
+.chat-message-me {
+    color: #436976;
+}
+
+.chat-message-room {
+    color: #4B7003;
 }
 }
 
 
-.chat-event, .chat-date, .chat-help {
+.chat-event, .chat-date, .chat-info {
     color: #808080;
     color: #808080;
 }
 }
 
 
-li.chat-help {
+li.chat-info {
     padding-left: 10px;
     padding-left: 10px;
 }
 }
 
 
@@ -262,7 +257,7 @@ div.chat-title {
 .chat-head-chatbox,
 .chat-head-chatbox,
 .chat-head-chatroom {
 .chat-head-chatroom {
     background: linear-gradient(top, rgba(206,220,231,1) 0%,rgba(89,106,114,1) 100%);
     background: linear-gradient(top, rgba(206,220,231,1) 0%,rgba(89,106,114,1) 100%);
-    height: 33px;
+    height: 35px;
     position: relative;
     position: relative;
 }
 }
 
 
@@ -304,6 +299,7 @@ dl.add-converse-contact {
     text-overflow: ellipsis;
     text-overflow: ellipsis;
     white-space: nowrap;
     white-space: nowrap;
     float: left;
     float: left;
+    width: 130px;
 }
 }
 
 
 #fancy-xmpp-status-select a.change-xmpp-status-message {
 #fancy-xmpp-status-select a.change-xmpp-status-message {
@@ -409,7 +405,8 @@ a.configure-chatroom-button {
 .chat-body p {
 .chat-body p {
     font-size: 14px;
     font-size: 14px;
     color: #666;
     color: #666;
-    margin: 5px;
+    padding: 5px;
+    margin: 0;
 }
 }
 
 
 .chatroom-form legend {
 .chatroom-form legend {
@@ -498,17 +495,12 @@ a.configure-chatroom-button {
     margin-top: 0.5em;
     margin-top: 0.5em;
 }
 }
 
 
-#available-chatrooms {
-    height: 183px;
-    overflow-y: auto;
-}
-
 #available-chatrooms dd {
 #available-chatrooms dd {
     overflow-x: hidden;
     overflow-x: hidden;
     text-overflow: ellipsis;
     text-overflow: ellipsis;
     white-space: nowrap;
     white-space: nowrap;
     display: inline-block;
     display: inline-block;
-    width: 170px;
+    width: 165px;
 }
 }
 
 
 #available-chatrooms dt,
 #available-chatrooms dt,
@@ -517,7 +509,7 @@ a.configure-chatroom-button {
     font-size: 13px;
     font-size: 13px;
     color: #666;
     color: #666;
     border: none;
     border: none;
-    padding: 0.3em 0.5em 0.3em 0.5em;
+    padding: 0em 0em 0.3em 0.5em;
     text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
     text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
 }
 }
 
 
@@ -530,7 +522,7 @@ dd.available-chatroom,
     font-weight: bold;
     font-weight: bold;
     border: none;
     border: none;
     display: block;
     display: block;
-    padding: 0 0.5em 0 0.5em;
+    padding: 0 0em 0 0.5em;
     color: #666;
     color: #666;
     text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
     text-shadow: 0 1px 0 rgba(250, 250, 250, 1);
 }
 }
@@ -546,6 +538,10 @@ li.room-info {
     margin-left: 5px;
     margin-left: 5px;
 }
 }
 
 
+div.room-info {
+    clear: left;
+}
+
 p.room-info {
 p.room-info {
     margin: 0;
     margin: 0;
     padding: 0;
     padding: 0;
@@ -556,13 +552,13 @@ p.room-info {
 a.room-info {
 a.room-info {
     background: url('images/information.png') no-repeat right top;
     background: url('images/information.png') no-repeat right top;
     width: 22px;
     width: 22px;
-    height: 22px;
     float: right;
     float: right;
     display: none;
     display: none;
+    clear: right;
 }
 }
 
 
 a.open-room {
 a.open-room {
-    display: inline-block;    
+    float: left;
     white-space: nowrap;
     white-space: nowrap;
     text-overflow: ellipsis;
     text-overflow: ellipsis;
     overflow-x: hidden;
     overflow-x: hidden;
@@ -667,13 +663,12 @@ form.set-xmpp-status {
 
 
 form.add-chatroom {
 form.add-chatroom {
     background: none;
     background: none;
-    padding: 0.5em;
+    padding: 3px;
 }
 }
 
 
 form.add-chatroom input[type=text] {
 form.add-chatroom input[type=text] {
-    width: 172px;
+    width: 95%;
     margin: 3px;
     margin: 3px;
-    padding: 1px;
 }
 }
 
 
 form.add-chatroom input[type=button],
 form.add-chatroom input[type=button],
@@ -748,6 +743,10 @@ div#settings {
     border-bottom-left-radius: 4px;
     border-bottom-left-radius: 4px;
 }
 }
 
 
+div#chatrooms {
+    overflow-y: auto;
+}
+
 form.sendXMPPMessage {
 form.sendXMPPMessage {
     background: white;
     background: white;
     border: 1px solid #999;
     border: 1px solid #999;

File diff suppressed because it is too large
+ 1321 - 1156
converse.js


File diff suppressed because it is too large
+ 0 - 0
converse.min.css


File diff suppressed because it is too large
+ 139 - 0
converse.min.js


BIN
docs/doctrees/environment.pickle


BIN
docs/doctrees/index.doctree


+ 194 - 21
docs/html/_sources/index.txt

@@ -15,22 +15,22 @@ Introduction
 ============
 ============
 
 
 Even though you can connect to public XMPP servers on the `conversejs.org`_
 Even though you can connect to public XMPP servers on the `conversejs.org`_
-website, *Converse.js* is not meant to be a "Software-as-a-service" (SaaS) 
+website, *Converse.js* is not really meant to be a "Software-as-a-service" (SaaS) 
 webchat.
 webchat.
 
 
 Instead, its goal is to provide the means for website owners to add a tightly
 Instead, its goal is to provide the means for website owners to add a tightly
 integrated instant messaging service to their own sites.
 integrated instant messaging service to their own sites.
 
 
 As a website owner, you are expected to host *Converse.js* yourself, and to do some legwork to
 As a website owner, you are expected to host *Converse.js* yourself, and to do some legwork to
-properly configure and integrated it into your site.
+properly configure and integrate it into your site.
 
 
 The benefit in doing this, is that your users have a much more streamlined and integrated
 The benefit in doing this, is that your users have a much more streamlined and integrated
 webchat experience and that you have control over the data. The latter being a
 webchat experience and that you have control over the data. The latter being a
 requirement for many sites dealing with sensitive information.
 requirement for many sites dealing with sensitive information.
 
 
 You'll need to set up your own XMPP server and in order to have
 You'll need to set up your own XMPP server and in order to have
-single-signon functionality, whereby users are authenticated once and stay
+`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
+logged in to XMPP upon page reload) you will also have to add some server-side
 code.
 code.
 
 
 The `What you will need`_ section has more information on all these
 The `What you will need`_ section has more information on all these
@@ -46,9 +46,12 @@ An XMPP/Jabber server
 *Converse.js* implements `XMPP`_ as its messaging protocol, and therefore needs
 *Converse.js* implements `XMPP`_ as its messaging protocol, and therefore needs
 to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).
 to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).
 
 
-You can either set up your own XMPP server, or use a public one. You can find a
+You can connect to public XMPP servers like ``jabber.org`` but if you want to
-list of public XMPP servers/providers on `xmpp.net`_ and a list of servers that
+have `Session Support`_ you'll have to set up your own XMPP server.
-you can set up yourself on `xmpp.org`_.
+
+You can find a list of public XMPP servers/providers on `xmpp.net`_ and a list of
+servers that you can set up yourself on `xmpp.org`_.
+
 
 
 Connection Manager
 Connection Manager
 ==================
 ==================
@@ -96,8 +99,10 @@ website. This will remove the need for any cross-domain XHR support.
 Server-side authentication
 Server-side authentication
 ==========================
 ==========================
 
 
-Session support (i.e. single site login)
+.. _`Session Support`:
-----------------------------------------
+
+Pre-binding and Single Session Support
+--------------------------------------
 
 
 It's possible to enable single-site login, whereby users already
 It's possible to enable single-site login, whereby users already
 authenticated in your website will also automatically be logged in on the chat server,
 authenticated in your website will also automatically be logged in on the chat server,
@@ -105,26 +110,81 @@ but this will require custom code on your server.
 
 
 Jack Moffitt has a great `blogpost`_ about this and even provides an `example Django application`_ to demonstrate it.
 Jack Moffitt has a great `blogpost`_ about this and even provides an `example Django application`_ to demonstrate it.
 
 
+.. Note::
+   If you want to enable single session support, make sure to pass **prebind: true**
+   when you call **converse.initialize** (see ./index.html).
+
+When you authenticate to the XMPP server on your backend, you'll receive two
+tokens, RID (request ID) and SID (session ID).
+
+These tokens then need to be passed back to the javascript running in your
+browser, where you will need them attach to the existing session.
+
+You can embed the RID and SID tokens in your HTML markup or you can do an
+XMLHttpRequest call to you server and ask it to return them for you.
+
+Below is one example of how this could work. An Ajax call is made to the
+relative URL **/prebind** and it expects to receive JSON data back.
+
+:: 
+
+    $.getJSON('/prebind', function (data) {
+            var connection = new Strophe.Connection(converse.bosh_service_url);
+            connection.attach(data.jid, data.sid, data.rid, function (status) {
+                if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
+                    converse.onConnected(connection)
+                } 
+            });
+        }
+    );
+
+**Here's what's happening:**
+
+The JSON data contains the user's JID (jabber ID), RID and SID. The URL to the
+BOSH connection manager is already set as a configuration setting on the
+*converse* object (see ./main.js), so we can reuse it from there.
+
+A new Strophe.Connection object is instantiated and then *attach* is called with
+the user's JID, the necessary tokens and a callback function.
+
+In the callback function, you call *converse.onConnected* together with the
+connection object.
+
 
 
 =========================================
 =========================================
 Quickstart (to get a demo up and running)
 Quickstart (to get a demo up and running)
 =========================================
 =========================================
 
 
-When you download a specific release of *Converse.js*, say for example version 0.3,
+When you download a specific release of *Converse.js* there will be two minified files inside the zip file.
-there will be two minified files inside the zip file.
 
 
-For version 0.3 they will be:
+* converse.min.js
+* converse.min.css
 
 
-* converse.0.3.min.js
+You can include these two files inside the *<head>* element of your website via the *script* and *link*
-* converse.0.3.min.css
-
-You can include these two files in your website via the *script* and *link*
 tags:
 tags:
 
 
 ::
 ::
 
 
-    <link rel="stylesheet" type="text/css" media="screen" href="converse.0.3.min.css">
+    <link rel="stylesheet" type="text/css" media="screen" href="converse.min.css">
-    <script src="converse.0.3.min.js"></script>
+    <script src="converse.min.js"></script>
+
+Then, at the bottom of your page, after the closing *</body>* element, put the
+following inline Javascript code:
+
+::
+
+    <script>
+        converse.initialize({
+            auto_list_rooms: false,
+            auto_subscribe: false,
+            bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
+            hide_muc_server: false,
+            i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported
+            prebind: false,
+            show_controlbox_by_default: true,
+            xhr_user_search: false
+        });
+    </script>
 
 
 The *index.html* file inside the Converse.js folder serves as a nice usable
 The *index.html* file inside the Converse.js folder serves as a nice usable
 example of this.
 example of this.
@@ -137,7 +197,7 @@ You'll most likely want to implement some kind of single-signon solution for
 your website, where users authenticate once in your website and then stay
 your website, where users authenticate once in your website and then stay
 logged into their XMPP session upon page reload.
 logged into their XMPP session upon page reload.
 
 
-For more info on this, read `Session support (i.e. single site login)`_.
+For more info on this, read: `Pre-binding and Single Session Support`_.
 
 
 You might also want to have more fine-grained control of what gets included in
 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
 the minified Javascript file. Read `Configuration`_ and `Minification`_ for more info on how to do
@@ -155,6 +215,9 @@ on your website.
 *Converse.js* is passed its configuration settings when you call its
 *Converse.js* is passed its configuration settings when you call its
 *initialize* method.
 *initialize* method.
 
 
+You'll most likely want to call the *initialize* method in your HTML page. For
+an example of how this is done, please see the bottom of the *./index.html* page.
+
 Please refer to the `Configuration variables`_ section below for info on
 Please refer to the `Configuration variables`_ section below for info on
 all the available configuration settings.
 all the available configuration settings.
 
 
@@ -243,6 +306,20 @@ have to write a Javascript snippet to attach to the set up connection::
 The backend must authenticate for you, and then return a SID (session ID) and
 The backend must authenticate for you, and then return a SID (session ID) and
 RID (Request ID), which you use when you attach to the connection.
 RID (Request ID), which you use when you attach to the connection.
 
 
+show_controlbox_by_default
+--------------------------
+
+Default = False
+
+The "controlbox" refers to the special chatbox containing your contacts roster,
+status widget, chatrooms and other controls.
+
+By default this box is hidden and can be toggled by clicking on any element in
+the page with class *toggle-online-users*.
+
+If this options is set to true, the controlbox will by default be shown upon
+page load.
+
 
 
 xhr_user_search
 xhr_user_search
 ---------------
 ---------------
@@ -257,8 +334,6 @@ There are two ways to add users.
 This setting enables the second mechanism, otherwise by default the first will
 This setting enables the second mechanism, otherwise by default the first will
 be used.
 be used.
 
 
-
-
 ============
 ============
 Minification
 Minification
 ============
 ============
@@ -299,6 +374,104 @@ CSS can be minimized with Yahoo's yuicompressor tool:
     yui-compressor --type=css converse.css -o converse.min.css
     yui-compressor --type=css converse.css -o converse.min.css
 
 
 
 
+============
+Translations
+============
+
+.. Note :: 
+   Translations take up a lot of space and will bloat your minified file.
+   At the time of writing, all the translations add about 50KB of extra data to
+   the minified javascript file. Therefore, make sure to only
+   include those languages that you intend to support and remove from
+   ./locale/locales.js those which you don't need. Remember to rebuild the
+   minified file afterwards.
+
+The gettext POT file located in ./locale/converse.pot is the template
+containing all translations and from which for each language an individual PO
+file is generated.
+
+The POT file contains all translateable strings extracted from converse.js.
+
+To make a user facing string translateable, wrap it in the double underscore helper
+function like so:
+
+::
+
+    __('This string will be translated at runtime');
+
+After adding the string, you'll need to regenerate the POT file, like so:
+
+::
+
+    make pot
+
+You can then create or update the PO file for a specific language by doing the following:
+
+::
+
+    msgmerge ./locale/af/LC_MESSAGES/converse.po ./locale/converse.pot -U
+
+This PO file is then what gets translated.
+
+If you've created a new PO file, please make sure to add the following
+attributes at the top of the file (under *Content-Transfer-Encoding*). They are
+required as configuration settings for Jed, the Javascript translations library
+that we're using.
+
+::
+
+    "domain: converse\n"
+    "lang: af\n"
+    "plural_forms: nplurals=2; plural=(n != 1);\n"
+    
+
+Unfortunately Jed cannot use the PO files directly. We have to generate from it 
+a file in JSON format and then put that in a .js file for the specific
+language.
+
+To generate JSON from a PO file, you'll need po2json for node.js. Run the
+following command to install it (npm being the node.js package manager):
+
+::
+
+    npm install po2json
+    
+You can then convert the translations into JSON format:
+
+::
+
+    po2json locale/af/LC_MESSAGES/converse.po locale/af/LC_MESSAGES/converse.json
+
+Now from converse.json paste the data as a value for the "locale_data" key in the
+object in the language's .js file.
+
+So, if you are for example translating into German (language code 'de'), you'll
+create or update the file ./locale/LC_MESSAGES/de.js with the following code:
+
+::
+
+    (function (root, factory) {
+        define("af", ['jed'], function () {
+            return factory(new Jed({
+                "domain": "converse",
+                "locale_data": {
+                    // Paste the JSON data from converse.json here
+                }
+            })
+        }
+    }(this, function (i18n) { 
+        return i18n; 
+    }));
+
+making sure to also paste the JSON data as value to the "locale_data" key.
+
+.. Note :: 
+    If you are adding translations for a new language that is not already supported,
+    you'll have to make one more edit in ./locale/locales.js to make sure the
+    language is loaded by require.js.
+
+Congratulations, you've now succesfully added your translations. Sorry for all
+those hoops you had to jump through.
 
 
 
 
 .. _`conversejs.org`: http://conversejs.org
 .. _`conversejs.org`: http://conversejs.org

+ 159 - 27
docs/html/index.html

@@ -73,7 +73,7 @@
 </ul>
 </ul>
 </li>
 </li>
 <li><a class="reference internal" href="#server-side-authentication" id="id6">Server-side authentication</a><ul>
 <li><a class="reference internal" href="#server-side-authentication" id="id6">Server-side authentication</a><ul>
-<li><a class="reference internal" href="#session-support-i-e-single-site-login" id="id7">Session support (i.e. single site login)</a></li>
+<li><a class="reference internal" href="#pre-binding-and-single-session-support" id="id7">Pre-binding and Single Session Support</a></li>
 </ul>
 </ul>
 </li>
 </li>
 </ul>
 </ul>
@@ -88,33 +88,35 @@
 <li><a class="reference internal" href="#fullname" id="id15">fullname</a></li>
 <li><a class="reference internal" href="#fullname" id="id15">fullname</a></li>
 <li><a class="reference internal" href="#hide-muc-server" id="id16">hide_muc_server</a></li>
 <li><a class="reference internal" href="#hide-muc-server" id="id16">hide_muc_server</a></li>
 <li><a class="reference internal" href="#prebind" id="id17">prebind</a></li>
 <li><a class="reference internal" href="#prebind" id="id17">prebind</a></li>
-<li><a class="reference internal" href="#xhr-user-search" id="id18">xhr_user_search</a></li>
+<li><a class="reference internal" href="#show-controlbox-by-default" id="id18">show_controlbox_by_default</a></li>
+<li><a class="reference internal" href="#xhr-user-search" id="id19">xhr_user_search</a></li>
 </ul>
 </ul>
 </li>
 </li>
 </ul>
 </ul>
 </li>
 </li>
-<li><a class="reference internal" href="#minification" id="id19">Minification</a><ul>
+<li><a class="reference internal" href="#minification" id="id20">Minification</a><ul>
-<li><a class="reference internal" href="#minifying-javascript" id="id20">Minifying Javascript</a></li>
+<li><a class="reference internal" href="#minifying-javascript" id="id21">Minifying Javascript</a></li>
-<li><a class="reference internal" href="#minifying-css" id="id21">Minifying CSS</a></li>
+<li><a class="reference internal" href="#minifying-css" id="id22">Minifying CSS</a></li>
 </ul>
 </ul>
 </li>
 </li>
+<li><a class="reference internal" href="#translations" id="id23">Translations</a></li>
 </ul>
 </ul>
 </div>
 </div>
 <div class="section" id="introduction">
 <div class="section" id="introduction">
 <h1><a class="toc-backref" href="#id1">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h1>
 <h1><a class="toc-backref" href="#id1">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h1>
 <p>Even though you can connect to public XMPP servers on the <a class="reference external" href="http://conversejs.org">conversejs.org</a>
 <p>Even though you can connect to public XMPP servers on the <a class="reference external" href="http://conversejs.org">conversejs.org</a>
-website, <em>Converse.js</em> is not meant to be a &#8220;Software-as-a-service&#8221; (SaaS)
+website, <em>Converse.js</em> is not really meant to be a &#8220;Software-as-a-service&#8221; (SaaS)
 webchat.</p>
 webchat.</p>
 <p>Instead, its goal is to provide the means for website owners to add a tightly
 <p>Instead, its goal is to provide the means for website owners to add a tightly
 integrated instant messaging service to their own sites.</p>
 integrated instant messaging service to their own sites.</p>
 <p>As a website owner, you are expected to host <em>Converse.js</em> yourself, and to do some legwork to
 <p>As a website owner, you are expected to host <em>Converse.js</em> yourself, and to do some legwork to
-properly configure and integrated it into your site.</p>
+properly configure and integrate it into your site.</p>
 <p>The benefit in doing this, is that your users have a much more streamlined and integrated
 <p>The benefit in doing this, is that your users have a much more streamlined and integrated
 webchat experience and that you have control over the data. The latter being a
 webchat experience and that you have control over the data. The latter being a
 requirement for many sites dealing with sensitive information.</p>
 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
 <p>You&#8217;ll need to set up your own XMPP server and in order to have
-single-signon functionality, whereby users are authenticated once and stay
+<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
+logged in to XMPP upon page reload) you will also have to add some server-side
 code.</p>
 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
 <p>The <a class="reference internal" href="#what-you-will-need">What you will need</a> section has more information on all these
 requirements.</p>
 requirements.</p>
@@ -125,9 +127,10 @@ requirements.</p>
 <h2><a class="toc-backref" href="#id3">An XMPP/Jabber server</a><a class="headerlink" href="#an-xmpp-jabber-server" title="Permalink to this headline"></a></h2>
 <h2><a class="toc-backref" href="#id3">An XMPP/Jabber server</a><a class="headerlink" href="#an-xmpp-jabber-server" title="Permalink to this headline"></a></h2>
 <p><em>Converse.js</em> implements <a class="reference external" href="https://en.wikipedia.org/wiki/Xmpp">XMPP</a> as its messaging protocol, and therefore needs
 <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>
 to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).</p>
-<p>You can either set up your own XMPP server, or use a public one. You can find a
+<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
-list of public XMPP servers/providers on <a class="reference external" href="http://xmpp.net">xmpp.net</a> and a list of servers that
+have <a class="reference internal" href="#session-support">Session Support</a> you&#8217;ll have to set up your own XMPP server.</p>
-you can set up yourself on <a class="reference external" href="http://xmpp.org/xmpp-software/servers/">xmpp.org</a>.</p>
+<p>You can find a list of public XMPP servers/providers on <a class="reference external" href="http://xmpp.net">xmpp.net</a> and a list of
+servers that you can set up yourself on <a class="reference external" href="http://xmpp.org/xmpp-software/servers/">xmpp.org</a>.</p>
 </div>
 </div>
 <div class="section" id="connection-manager">
 <div class="section" id="connection-manager">
 <h2><a class="toc-backref" href="#id4">Connection Manager</a><a class="headerlink" href="#connection-manager" title="Permalink to this headline"></a></h2>
 <h2><a class="toc-backref" href="#id4">Connection Manager</a><a class="headerlink" href="#connection-manager" title="Permalink to this headline"></a></h2>
@@ -164,28 +167,72 @@ website. This will remove the need for any cross-domain XHR support.</p>
 </div>
 </div>
 <div class="section" id="server-side-authentication">
 <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>
 <h2><a class="toc-backref" href="#id6">Server-side authentication</a><a class="headerlink" href="#server-side-authentication" title="Permalink to this headline"></a></h2>
-<div class="section" id="session-support-i-e-single-site-login">
+<div class="section" id="pre-binding-and-single-session-support">
-<h3><a class="toc-backref" href="#id7">Session support (i.e. single site login)</a><a class="headerlink" href="#session-support-i-e-single-site-login" title="Permalink to this headline"></a></h3>
+<span id="session-support"></span><h3><a class="toc-backref" href="#id7">Pre-binding and Single Session Support</a><a class="headerlink" href="#pre-binding-and-single-session-support" title="Permalink to this headline"></a></h3>
 <p>It&#8217;s possible to enable single-site login, whereby users already
 <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,
 authenticated in your website will also automatically be logged in on the chat server,
 but this will require custom code on your server.</p>
 but this will require custom code on your server.</p>
 <p>Jack Moffitt has a great <a class="reference external" href="http://metajack.im/2008/10/03/getting-attached-to-strophe">blogpost</a> about this and even provides an <a class="reference external" href="https://github.com/metajack/strophejs/tree/master/examples/attach">example Django application</a> to demonstrate it.</p>
 <p>Jack Moffitt has a great <a class="reference external" href="http://metajack.im/2008/10/03/getting-attached-to-strophe">blogpost</a> about this and even provides an <a class="reference external" href="https://github.com/metajack/strophejs/tree/master/examples/attach">example Django application</a> to demonstrate it.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">If you want to enable single session support, make sure to pass <strong>prebind: true</strong>
+when you call <strong>converse.initialize</strong> (see ./index.html).</p>
+</div>
+<p>When you authenticate to the XMPP server on your backend, you&#8217;ll receive two
+tokens, RID (request ID) and SID (session ID).</p>
+<p>These tokens then need to be passed back to the javascript running in your
+browser, where you will need them attach to the existing session.</p>
+<p>You can embed the RID and SID tokens in your HTML markup or you can do an
+XMLHttpRequest call to you server and ask it to return them for you.</p>
+<p>Below is one example of how this could work. An Ajax call is made to the
+relative URL <strong>/prebind</strong> and it expects to receive JSON data back.</p>
+<div class="highlight-python"><pre>$.getJSON('/prebind', function (data) {
+        var connection = new Strophe.Connection(converse.bosh_service_url);
+        connection.attach(data.jid, data.sid, data.rid, function (status) {
+            if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
+                converse.onConnected(connection)
+            }
+        });
+    }
+);</pre>
+</div>
+<p><strong>Here&#8217;s what&#8217;s happening:</strong></p>
+<p>The JSON data contains the user&#8217;s JID (jabber ID), RID and SID. The URL to the
+BOSH connection manager is already set as a configuration setting on the
+<em>converse</em> object (see ./main.js), so we can reuse it from there.</p>
+<p>A new Strophe.Connection object is instantiated and then <em>attach</em> is called with
+the user&#8217;s JID, the necessary tokens and a callback function.</p>
+<p>In the callback function, you call <em>converse.onConnected</em> together with the
+connection object.</p>
 </div>
 </div>
 </div>
 </div>
 </div>
 </div>
 <div class="section" id="quickstart-to-get-a-demo-up-and-running">
 <div class="section" id="quickstart-to-get-a-demo-up-and-running">
 <h1><a class="toc-backref" href="#id8">Quickstart (to get a demo up and running)</a><a class="headerlink" href="#quickstart-to-get-a-demo-up-and-running" title="Permalink to this headline"></a></h1>
 <h1><a class="toc-backref" href="#id8">Quickstart (to get a demo up and running)</a><a class="headerlink" href="#quickstart-to-get-a-demo-up-and-running" title="Permalink to this headline"></a></h1>
-<p>When you download a specific release of <em>Converse.js</em>, say for example version 0.3,
+<p>When you download a specific release of <em>Converse.js</em> there will be two minified files inside the zip file.</p>
-there will be two minified files inside the zip file.</p>
-<p>For version 0.3 they will be:</p>
 <ul class="simple">
 <ul class="simple">
-<li>converse.0.3.min.js</li>
+<li>converse.min.js</li>
-<li>converse.0.3.min.css</li>
+<li>converse.min.css</li>
 </ul>
 </ul>
-<p>You can include these two files in your website via the <em>script</em> and <em>link</em>
+<p>You can include these two files inside the <em>&lt;head&gt;</em> element of your website via the <em>script</em> and <em>link</em>
 tags:</p>
 tags:</p>
-<div class="highlight-python"><pre>&lt;link rel="stylesheet" type="text/css" media="screen" href="converse.0.3.min.css"&gt;
+<div class="highlight-python"><pre>&lt;link rel="stylesheet" type="text/css" media="screen" href="converse.min.css"&gt;
-&lt;script src="converse.0.3.min.js"&gt;&lt;/script&gt;</pre>
+&lt;script src="converse.min.js"&gt;&lt;/script&gt;</pre>
+</div>
+<p>Then, at the bottom of your page, after the closing <em>&lt;/body&gt;</em> element, put the
+following inline Javascript code:</p>
+<div class="highlight-python"><pre>&lt;script&gt;
+    converse.initialize({
+        auto_list_rooms: false,
+        auto_subscribe: false,
+        bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
+        hide_muc_server: false,
+        i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported
+        prebind: false,
+        show_controlbox_by_default: true,
+        xhr_user_search: false
+    });
+&lt;/script&gt;</pre>
 </div>
 </div>
 <p>The <em>index.html</em> file inside the Converse.js folder serves as a nice usable
 <p>The <em>index.html</em> file inside the Converse.js folder serves as a nice usable
 example of this.</p>
 example of this.</p>
@@ -195,7 +242,7 @@ practical.</p>
 <p>You&#8217;ll most likely want to implement some kind of single-signon solution for
 <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
 your website, where users authenticate once in your website and then stay
 logged into their XMPP session upon page reload.</p>
 logged into their XMPP session upon page reload.</p>
-<p>For more info on this, read <a class="reference internal" href="#session-support-i-e-single-site-login">Session support (i.e. single site login)</a>.</p>
+<p>For more info on this, read: <a class="reference internal" href="#pre-binding-and-single-session-support">Pre-binding and Single Session Support</a>.</p>
 <p>You might also want to have more fine-grained control of what gets included in
 <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
 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>
 that.</p>
@@ -207,6 +254,8 @@ you&#8217;ll want to configure <em>Converse.js</em> to suit your needs before yo
 on your website.</p>
 on your website.</p>
 <p><em>Converse.js</em> is passed its configuration settings when you call its
 <p><em>Converse.js</em> is passed its configuration settings when you call its
 <em>initialize</em> method.</p>
 <em>initialize</em> method.</p>
+<p>You&#8217;ll most likely want to call the <em>initialize</em> method in your HTML page. For
+an example of how this is done, please see the bottom of the <em>./index.html</em> page.</p>
 <p>Please refer to the <a class="reference internal" href="#configuration-variables">Configuration variables</a> section below for info on
 <p>Please refer to the <a class="reference internal" href="#configuration-variables">Configuration variables</a> section below for info on
 all the available configuration settings.</p>
 all the available configuration settings.</p>
 <p>After you have configured <em>Converse.js</em>, you&#8217;ll have to regenerate the minified
 <p>After you have configured <em>Converse.js</em>, you&#8217;ll have to regenerate the minified
@@ -273,8 +322,18 @@ have to write a Javascript snippet to attach to the set up connection:</p>
 <p>The backend must authenticate for you, and then return a SID (session ID) and
 <p>The backend must authenticate for you, and then return a SID (session ID) and
 RID (Request ID), which you use when you attach to the connection.</p>
 RID (Request ID), which you use when you attach to the connection.</p>
 </div>
 </div>
+<div class="section" id="show-controlbox-by-default">
+<h3><a class="toc-backref" href="#id18">show_controlbox_by_default</a><a class="headerlink" href="#show-controlbox-by-default" title="Permalink to this headline"></a></h3>
+<p>Default = False</p>
+<p>The &#8220;controlbox&#8221; refers to the special chatbox containing your contacts roster,
+status widget, chatrooms and other controls.</p>
+<p>By default this box is hidden and can be toggled by clicking on any element in
+the page with class <em>toggle-online-users</em>.</p>
+<p>If this options is set to true, the controlbox will by default be shown upon
+page load.</p>
+</div>
 <div class="section" id="xhr-user-search">
 <div class="section" id="xhr-user-search">
-<h3><a class="toc-backref" href="#id18">xhr_user_search</a><a class="headerlink" href="#xhr-user-search" title="Permalink to this headline"></a></h3>
+<h3><a class="toc-backref" href="#id19">xhr_user_search</a><a class="headerlink" href="#xhr-user-search" title="Permalink to this headline"></a></h3>
 <p>Default = False</p>
 <p>Default = False</p>
 <p>There are two ways to add users.</p>
 <p>There are two ways to add users.</p>
 <ul class="simple">
 <ul class="simple">
@@ -287,9 +346,9 @@ be used.</p>
 </div>
 </div>
 </div>
 </div>
 <div class="section" id="minification">
 <div class="section" id="minification">
-<h1><a class="toc-backref" href="#id19">Minification</a><a class="headerlink" href="#minification" title="Permalink to this headline"></a></h1>
+<h1><a class="toc-backref" href="#id20">Minification</a><a class="headerlink" href="#minification" title="Permalink to this headline"></a></h1>
 <div class="section" id="minifying-javascript">
 <div class="section" id="minifying-javascript">
-<h2><a class="toc-backref" href="#id20">Minifying Javascript</a><a class="headerlink" href="#minifying-javascript" title="Permalink to this headline"></a></h2>
+<h2><a class="toc-backref" href="#id21">Minifying Javascript</a><a class="headerlink" href="#minifying-javascript" title="Permalink to this headline"></a></h2>
 <p>We  use <a class="reference external" href="http://requirejs.org">require.js</a> to keep track of <em>Converse.js</em> and its dependencies and to
 <p>We  use <a class="reference external" href="http://requirejs.org">require.js</a> to keep track of <em>Converse.js</em> and its dependencies and to
 to bundle them together in a single minified file fit for deployment to a
 to bundle them together in a single minified file fit for deployment to a
 production site.</p>
 production site.</p>
@@ -305,11 +364,84 @@ manager, NPM.</p>
 <p>You can <a class="reference external" href="http://requirejs.org/docs/optimization.html">read more about require.js&#8217;s optimizer here</a>.</p>
 <p>You can <a class="reference external" href="http://requirejs.org/docs/optimization.html">read more about require.js&#8217;s optimizer here</a>.</p>
 </div>
 </div>
 <div class="section" id="minifying-css">
 <div class="section" id="minifying-css">
-<h2><a class="toc-backref" href="#id21">Minifying CSS</a><a class="headerlink" href="#minifying-css" title="Permalink to this headline"></a></h2>
+<h2><a class="toc-backref" href="#id22">Minifying CSS</a><a class="headerlink" href="#minifying-css" title="Permalink to this headline"></a></h2>
 <p>CSS can be minimized with Yahoo&#8217;s yuicompressor tool:</p>
 <p>CSS can be minimized with Yahoo&#8217;s yuicompressor tool:</p>
 <div class="highlight-python"><pre>yui-compressor --type=css converse.css -o converse.min.css</pre>
 <div class="highlight-python"><pre>yui-compressor --type=css converse.css -o converse.min.css</pre>
 </div>
 </div>
 </div>
 </div>
+</div>
+<div class="section" id="translations">
+<h1><a class="toc-backref" href="#id23">Translations</a><a class="headerlink" href="#translations" title="Permalink to this headline"></a></h1>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Translations take up a lot of space and will bloat your minified file.
+At the time of writing, all the translations add about 50KB of extra data to
+the minified javascript file. Therefore, make sure to only
+include those languages that you intend to support and remove from
+./locale/locales.js those which you don&#8217;t need. Remember to rebuild the
+minified file afterwards.</p>
+</div>
+<p>The gettext POT file located in ./locale/converse.pot is the template
+containing all translations and from which for each language an individual PO
+file is generated.</p>
+<p>The POT file contains all translateable strings extracted from converse.js.</p>
+<p>To make a user facing string translateable, wrap it in the double underscore helper
+function like so:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">__</span><span class="p">(</span><span class="s">&#39;This string will be translated at runtime&#39;</span><span class="p">);</span>
+</pre></div>
+</div>
+<p>After adding the string, you&#8217;ll need to regenerate the POT file, like so:</p>
+<div class="highlight-python"><pre>make pot</pre>
+</div>
+<p>You can then create or update the PO file for a specific language by doing the following:</p>
+<div class="highlight-python"><pre>msgmerge ./locale/af/LC_MESSAGES/converse.po ./locale/converse.pot -U</pre>
+</div>
+<p>This PO file is then what gets translated.</p>
+<p>If you&#8217;ve created a new PO file, please make sure to add the following
+attributes at the top of the file (under <em>Content-Transfer-Encoding</em>). They are
+required as configuration settings for Jed, the Javascript translations library
+that we&#8217;re using.</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="s">&quot;domain: converse</span><span class="se">\n</span><span class="s">&quot;</span>
+<span class="s">&quot;lang: af</span><span class="se">\n</span><span class="s">&quot;</span>
+<span class="s">&quot;plural_forms: nplurals=2; plural=(n != 1);</span><span class="se">\n</span><span class="s">&quot;</span>
+</pre></div>
+</div>
+<p>Unfortunately Jed cannot use the PO files directly. We have to generate from it
+a file in JSON format and then put that in a .js file for the specific
+language.</p>
+<p>To generate JSON from a PO file, you&#8217;ll need po2json for node.js. Run the
+following command to install it (npm being the node.js package manager):</p>
+<div class="highlight-python"><pre>npm install po2json</pre>
+</div>
+<p>You can then convert the translations into JSON format:</p>
+<div class="highlight-python"><pre>po2json locale/af/LC_MESSAGES/converse.po locale/af/LC_MESSAGES/converse.json</pre>
+</div>
+<p>Now from converse.json paste the data as a value for the &#8220;locale_data&#8221; key in the
+object in the language&#8217;s .js file.</p>
+<p>So, if you are for example translating into German (language code &#8216;de&#8217;), you&#8217;ll
+create or update the file ./locale/LC_MESSAGES/de.js with the following code:</p>
+<div class="highlight-python"><pre>(function (root, factory) {
+    define("af", ['jed'], function () {
+        return factory(new Jed({
+            "domain": "converse",
+            "locale_data": {
+                // Paste the JSON data from converse.json here
+            }
+        })
+    }
+}(this, function (i18n) {
+    return i18n;
+}));</pre>
+</div>
+<p>making sure to also paste the JSON data as value to the &#8220;locale_data&#8221; key.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">If you are adding translations for a new language that is not already supported,
+you&#8217;ll have to make one more edit in ./locale/locales.js to make sure the
+language is loaded by require.js.</p>
+</div>
+<p>Congratulations, you&#8217;ve now succesfully added your translations. Sorry for all
+those hoops you had to jump through.</p>
 </div>
 </div>
 
 
 
 

BIN
docs/html/objects.inv


File diff suppressed because it is too large
+ 0 - 0
docs/html/searchindex.js


+ 194 - 21
docs/source/index.rst

@@ -15,22 +15,22 @@ Introduction
 ============
 ============
 
 
 Even though you can connect to public XMPP servers on the `conversejs.org`_
 Even though you can connect to public XMPP servers on the `conversejs.org`_
-website, *Converse.js* is not meant to be a "Software-as-a-service" (SaaS) 
+website, *Converse.js* is not really meant to be a "Software-as-a-service" (SaaS) 
 webchat.
 webchat.
 
 
 Instead, its goal is to provide the means for website owners to add a tightly
 Instead, its goal is to provide the means for website owners to add a tightly
 integrated instant messaging service to their own sites.
 integrated instant messaging service to their own sites.
 
 
 As a website owner, you are expected to host *Converse.js* yourself, and to do some legwork to
 As a website owner, you are expected to host *Converse.js* yourself, and to do some legwork to
-properly configure and integrated it into your site.
+properly configure and integrate it into your site.
 
 
 The benefit in doing this, is that your users have a much more streamlined and integrated
 The benefit in doing this, is that your users have a much more streamlined and integrated
 webchat experience and that you have control over the data. The latter being a
 webchat experience and that you have control over the data. The latter being a
 requirement for many sites dealing with sensitive information.
 requirement for many sites dealing with sensitive information.
 
 
 You'll need to set up your own XMPP server and in order to have
 You'll need to set up your own XMPP server and in order to have
-single-signon functionality, whereby users are authenticated once and stay
+`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
+logged in to XMPP upon page reload) you will also have to add some server-side
 code.
 code.
 
 
 The `What you will need`_ section has more information on all these
 The `What you will need`_ section has more information on all these
@@ -46,9 +46,12 @@ An XMPP/Jabber server
 *Converse.js* implements `XMPP`_ as its messaging protocol, and therefore needs
 *Converse.js* implements `XMPP`_ as its messaging protocol, and therefore needs
 to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).
 to connect to an XMPP/Jabber server (Jabber is really just a synonym for XMPP).
 
 
-You can either set up your own XMPP server, or use a public one. You can find a
+You can connect to public XMPP servers like ``jabber.org`` but if you want to
-list of public XMPP servers/providers on `xmpp.net`_ and a list of servers that
+have `Session Support`_ you'll have to set up your own XMPP server.
-you can set up yourself on `xmpp.org`_.
+
+You can find a list of public XMPP servers/providers on `xmpp.net`_ and a list of
+servers that you can set up yourself on `xmpp.org`_.
+
 
 
 Connection Manager
 Connection Manager
 ==================
 ==================
@@ -96,8 +99,10 @@ website. This will remove the need for any cross-domain XHR support.
 Server-side authentication
 Server-side authentication
 ==========================
 ==========================
 
 
-Session support (i.e. single site login)
+.. _`Session Support`:
-----------------------------------------
+
+Pre-binding and Single Session Support
+--------------------------------------
 
 
 It's possible to enable single-site login, whereby users already
 It's possible to enable single-site login, whereby users already
 authenticated in your website will also automatically be logged in on the chat server,
 authenticated in your website will also automatically be logged in on the chat server,
@@ -105,26 +110,81 @@ but this will require custom code on your server.
 
 
 Jack Moffitt has a great `blogpost`_ about this and even provides an `example Django application`_ to demonstrate it.
 Jack Moffitt has a great `blogpost`_ about this and even provides an `example Django application`_ to demonstrate it.
 
 
+.. Note::
+   If you want to enable single session support, make sure to pass **prebind: true**
+   when you call **converse.initialize** (see ./index.html).
+
+When you authenticate to the XMPP server on your backend, you'll receive two
+tokens, RID (request ID) and SID (session ID).
+
+These tokens then need to be passed back to the javascript running in your
+browser, where you will need them attach to the existing session.
+
+You can embed the RID and SID tokens in your HTML markup or you can do an
+XMLHttpRequest call to you server and ask it to return them for you.
+
+Below is one example of how this could work. An Ajax call is made to the
+relative URL **/prebind** and it expects to receive JSON data back.
+
+:: 
+
+    $.getJSON('/prebind', function (data) {
+            var connection = new Strophe.Connection(converse.bosh_service_url);
+            connection.attach(data.jid, data.sid, data.rid, function (status) {
+                if ((status === Strophe.Status.ATTACHED) || (status === Strophe.Status.CONNECTED)) {
+                    converse.onConnected(connection)
+                } 
+            });
+        }
+    );
+
+**Here's what's happening:**
+
+The JSON data contains the user's JID (jabber ID), RID and SID. The URL to the
+BOSH connection manager is already set as a configuration setting on the
+*converse* object (see ./main.js), so we can reuse it from there.
+
+A new Strophe.Connection object is instantiated and then *attach* is called with
+the user's JID, the necessary tokens and a callback function.
+
+In the callback function, you call *converse.onConnected* together with the
+connection object.
+
 
 
 =========================================
 =========================================
 Quickstart (to get a demo up and running)
 Quickstart (to get a demo up and running)
 =========================================
 =========================================
 
 
-When you download a specific release of *Converse.js*, say for example version 0.3,
+When you download a specific release of *Converse.js* there will be two minified files inside the zip file.
-there will be two minified files inside the zip file.
 
 
-For version 0.3 they will be:
+* converse.min.js
+* converse.min.css
 
 
-* converse.0.3.min.js
+You can include these two files inside the *<head>* element of your website via the *script* and *link*
-* converse.0.3.min.css
-
-You can include these two files in your website via the *script* and *link*
 tags:
 tags:
 
 
 ::
 ::
 
 
-    <link rel="stylesheet" type="text/css" media="screen" href="converse.0.3.min.css">
+    <link rel="stylesheet" type="text/css" media="screen" href="converse.min.css">
-    <script src="converse.0.3.min.js"></script>
+    <script src="converse.min.js"></script>
+
+Then, at the bottom of your page, after the closing *</body>* element, put the
+following inline Javascript code:
+
+::
+
+    <script>
+        converse.initialize({
+            auto_list_rooms: false,
+            auto_subscribe: false,
+            bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
+            hide_muc_server: false,
+            i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported
+            prebind: false,
+            show_controlbox_by_default: true,
+            xhr_user_search: false
+        });
+    </script>
 
 
 The *index.html* file inside the Converse.js folder serves as a nice usable
 The *index.html* file inside the Converse.js folder serves as a nice usable
 example of this.
 example of this.
@@ -137,7 +197,7 @@ You'll most likely want to implement some kind of single-signon solution for
 your website, where users authenticate once in your website and then stay
 your website, where users authenticate once in your website and then stay
 logged into their XMPP session upon page reload.
 logged into their XMPP session upon page reload.
 
 
-For more info on this, read `Session support (i.e. single site login)`_.
+For more info on this, read: `Pre-binding and Single Session Support`_.
 
 
 You might also want to have more fine-grained control of what gets included in
 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
 the minified Javascript file. Read `Configuration`_ and `Minification`_ for more info on how to do
@@ -155,6 +215,9 @@ on your website.
 *Converse.js* is passed its configuration settings when you call its
 *Converse.js* is passed its configuration settings when you call its
 *initialize* method.
 *initialize* method.
 
 
+You'll most likely want to call the *initialize* method in your HTML page. For
+an example of how this is done, please see the bottom of the *./index.html* page.
+
 Please refer to the `Configuration variables`_ section below for info on
 Please refer to the `Configuration variables`_ section below for info on
 all the available configuration settings.
 all the available configuration settings.
 
 
@@ -243,6 +306,20 @@ have to write a Javascript snippet to attach to the set up connection::
 The backend must authenticate for you, and then return a SID (session ID) and
 The backend must authenticate for you, and then return a SID (session ID) and
 RID (Request ID), which you use when you attach to the connection.
 RID (Request ID), which you use when you attach to the connection.
 
 
+show_controlbox_by_default
+--------------------------
+
+Default = False
+
+The "controlbox" refers to the special chatbox containing your contacts roster,
+status widget, chatrooms and other controls.
+
+By default this box is hidden and can be toggled by clicking on any element in
+the page with class *toggle-online-users*.
+
+If this options is set to true, the controlbox will by default be shown upon
+page load.
+
 
 
 xhr_user_search
 xhr_user_search
 ---------------
 ---------------
@@ -257,8 +334,6 @@ There are two ways to add users.
 This setting enables the second mechanism, otherwise by default the first will
 This setting enables the second mechanism, otherwise by default the first will
 be used.
 be used.
 
 
-
-
 ============
 ============
 Minification
 Minification
 ============
 ============
@@ -299,6 +374,104 @@ CSS can be minimized with Yahoo's yuicompressor tool:
     yui-compressor --type=css converse.css -o converse.min.css
     yui-compressor --type=css converse.css -o converse.min.css
 
 
 
 
+============
+Translations
+============
+
+.. Note :: 
+   Translations take up a lot of space and will bloat your minified file.
+   At the time of writing, all the translations add about 50KB of extra data to
+   the minified javascript file. Therefore, make sure to only
+   include those languages that you intend to support and remove from
+   ./locale/locales.js those which you don't need. Remember to rebuild the
+   minified file afterwards.
+
+The gettext POT file located in ./locale/converse.pot is the template
+containing all translations and from which for each language an individual PO
+file is generated.
+
+The POT file contains all translateable strings extracted from converse.js.
+
+To make a user facing string translateable, wrap it in the double underscore helper
+function like so:
+
+::
+
+    __('This string will be translated at runtime');
+
+After adding the string, you'll need to regenerate the POT file, like so:
+
+::
+
+    make pot
+
+You can then create or update the PO file for a specific language by doing the following:
+
+::
+
+    msgmerge ./locale/af/LC_MESSAGES/converse.po ./locale/converse.pot -U
+
+This PO file is then what gets translated.
+
+If you've created a new PO file, please make sure to add the following
+attributes at the top of the file (under *Content-Transfer-Encoding*). They are
+required as configuration settings for Jed, the Javascript translations library
+that we're using.
+
+::
+
+    "domain: converse\n"
+    "lang: af\n"
+    "plural_forms: nplurals=2; plural=(n != 1);\n"
+    
+
+Unfortunately Jed cannot use the PO files directly. We have to generate from it 
+a file in JSON format and then put that in a .js file for the specific
+language.
+
+To generate JSON from a PO file, you'll need po2json for node.js. Run the
+following command to install it (npm being the node.js package manager):
+
+::
+
+    npm install po2json
+    
+You can then convert the translations into JSON format:
+
+::
+
+    po2json locale/af/LC_MESSAGES/converse.po locale/af/LC_MESSAGES/converse.json
+
+Now from converse.json paste the data as a value for the "locale_data" key in the
+object in the language's .js file.
+
+So, if you are for example translating into German (language code 'de'), you'll
+create or update the file ./locale/LC_MESSAGES/de.js with the following code:
+
+::
+
+    (function (root, factory) {
+        define("af", ['jed'], function () {
+            return factory(new Jed({
+                "domain": "converse",
+                "locale_data": {
+                    // Paste the JSON data from converse.json here
+                }
+            })
+        }
+    }(this, function (i18n) { 
+        return i18n; 
+    }));
+
+making sure to also paste the JSON data as value to the "locale_data" key.
+
+.. Note :: 
+    If you are adding translations for a new language that is not already supported,
+    you'll have to make one more edit in ./locale/locales.js to make sure the
+    language is loaded by require.js.
+
+Congratulations, you've now succesfully added your translations. Sorry for all
+those hoops you had to jump through.
 
 
 
 
 .. _`conversejs.org`: http://conversejs.org
 .. _`conversejs.org`: http://conversejs.org

+ 47 - 31
index.html

@@ -5,9 +5,9 @@
     <meta http-equiv="X-UA-Compatible" content="chrome=1" />
     <meta http-equiv="X-UA-Compatible" content="chrome=1" />
     <meta name="description" content="Converse.js: Open Source Browser-Based Instant Messaging" />
     <meta name="description" content="Converse.js: Open Source Browser-Based Instant Messaging" />
     <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">
     <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">
-    <link rel="stylesheet" type="text/css" media="screen" href="converse.0.3.min.css">
+    <link rel="stylesheet" type="text/css" media="screen" href="converse.css">
-    <script src="converse.0.3.min.js"></script>
+    <!-- <script src="converse.min.js"></script> -->
-    <!-- For development <script data-main="main" src="Libraries/require-jquery.js"></script> -->
+    <script data-main="main" src="Libraries/require-jquery.js"></script>
     <title>Converse.js</title>
     <title>Converse.js</title>
 </head>
 </head>
 
 
@@ -17,10 +17,10 @@
     <header class="inner">
     <header class="inner">
         <a id="forkme_banner" href="https://github.com/jcbrand/converse.js">View on GitHub</a>
         <a id="forkme_banner" href="https://github.com/jcbrand/converse.js">View on GitHub</a>
         <h1 id="project_title"><a href="http://conversejs.org">Converse.js</a></h1>
         <h1 id="project_title"><a href="http://conversejs.org">Converse.js</a></h1>
-        <h2 id="project_tagline">Browser-based Instant Messaging with Strophe.js and Backbone.js</h2>
+        <h2 id="project_tagline">An XMPP chat client for your website</h2>
         <section id="downloads">
         <section id="downloads">
-            <a class="zip_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.3.zip">Download the latest release as a .zip file</a>
+            <a class="zip_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.4.zip">Download the latest release as a .zip file</a>
-            <a class="tar_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.3.tar.gz">Download the latest release as a tar.gz file</a>
+            <a class="tar_download_link" href="https://github.com/jcbrand/converse.js/archive/v0.4.tar.gz">Download the latest release as a tar.gz file</a>
         </section>
         </section>
     </header>
     </header>
     </div>
     </div>
@@ -28,25 +28,27 @@
     <!-- MAIN CONTENT -->
     <!-- MAIN CONTENT -->
     <div id="main_content_wrap" class="outer">
     <div id="main_content_wrap" class="outer">
     <section id="main_content" class="inner">
     <section id="main_content" class="inner">
-    <p><strong>Converse.js</strong> is an open source, web based, <a href="http://xmpp.org" target="_blank">XMPP/Jabber</a> chat client, similar to 
-    <a href="https://www.facebook.com/sitetour/chat.php" target="_blank">Facebook chat</a>, but with added support for multi-user chatrooms.</p>
 
 
-    <p>It is a Javascript application that you can include in your
+    <p><strong>Converse.js</strong> is an open source, webchat client, that
-    website, thereby providing it with instant messaging functionality.</p>
+    runs in the browser and can be integrated into any website.</p>
 
 
-    <p>You will also need access to an XMPP/Jabber server. You can connect to any public, federated XMPP server, or you can set one up
+    <p>It's similar to <a href="https://www.facebook.com/sitetour/chat.php" target="_blank">Facebook chat</a>, but also supports multi-user chatrooms.</p>
-    yourself, thereby maintaining stricter privacy controls.</p>
 
 
-    <p>It's possible to enable single-site login, whereby users already
+    <p><em>Converse.js</em> can connect to any accessible <a href="http://xmpp.org" target="_blank">XMPP/Jabber</a> server, either from a public provider such as
-    authenticated in your website will also automatically be logged in on the chat server, but this will require custom code on your server.</p>
+    <a href="http://jabber.org">jabber.org</a>, or to one you have set up
+    yourself.</a>
+
+    <p>It's possible to enable single-site login, whereby users already authenticated in your website will also automatically be logged in on the chat server,
+    but you will have to pre-authenticate them on your server. You can refer to the <a href="/docs/html/index.html">documentation</a> for more
+    info.</p>
 
 
     <p>An <a href="http://github.com/collective/collective.xmpp.chat" target="_blank">add-on product</a> that does exactly this,
     <p>An <a href="http://github.com/collective/collective.xmpp.chat" target="_blank">add-on product</a> that does exactly this,
     already exists for the <a href="http://plone.org" target="_blank">Plone</a> CMS. Hopefully in the future more such add-ons will
     already exists for the <a href="http://plone.org" target="_blank">Plone</a> CMS. Hopefully in the future more such add-ons will
     be created for other platforms.
     be created for other platforms.
    </p>
    </p>
 
 
-    <p>If you have integrated Converse.js into any other CMS or framework,
+    <p>If you have integrated <em>Converse.js</em> into any other CMS or framework,
-    <a href="http://opkode.com/contact" target="_blank">please let me know</a> and I'll mention it on this page.</p>
+    <a href="http://opkode.com/contact.html" target="_blank">please let me know</a> and I'll mention it on this page.</p>
 
 
     <h2>Features</h2>
     <h2>Features</h2>
     <ul>
     <ul>
@@ -62,6 +64,7 @@
         <li>Custom status messages</li>
         <li>Custom status messages</li>
         <li>Typing notifications</li>
         <li>Typing notifications</li>
         <li>Third person messages (/me )</li>
         <li>Third person messages (/me )</li>
+        <li>i18n aware</li>
     </ul>
     </ul>
 
 
     <h2>Screencasts</h2>
     <h2>Screencasts</h2>
@@ -75,27 +78,20 @@
     </ul>
     </ul>
 
 
     <h2>Demo</h2>
     <h2>Demo</h2>
-    <p><a href="#" class="chat toggle-online-users">Click this link</a> or click the link on the bottom right corner of this page.</a></p>
+    <p>You can log in with any existing XMPP account. There is also a list of public XMPP providers on <a href="http://xmpp.net" target="_blank">xmpp.net</a>.</p>
-    <p>You can log in with any existing federated Jabber/XMPP account, or create a new one at any of these providers:
+    <p><em><strong>Note:</strong> currently the demo doesn't work in Internet Explorer older
-        <ul>
-            <li><a href="http://jabber.org" target="_blank">jabber.org</a></li>
-            <li><a href="https://jappix.com" target="_blank">jappix.com</a></li>
-        </ul>
-        There is also a list of public XMPP providers on <a href="xmpp.net" target="_blank">xmpp.net</a>.
-   </p>
-    <p><b>Note:</b> currently the demo doesn't work in Internet Explorer older
     than 10. This is due to lacking support for <a href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing">CORS</a>,
     than 10. This is due to lacking support for <a href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing">CORS</a>,
     a standard which enables cross-domain XmlHttpRequests. There are ways
     a standard which enables cross-domain XmlHttpRequests. There are ways
     around this, but it hasn't been a priority for me to implement them for
     around this, but it hasn't been a priority for me to implement them for
     this demo.
     this demo.
    </p>
    </p>
-
    <p>
    <p>
-    See <a href="/docs/html/index.html#overcoming-cross-domain-request-restrictions" target="_blank">here</a> for more information.
+        See <a href="/docs/html/index.html#overcoming-cross-domain-request-restrictions" target="_blank">here</a> for more information.
     </p>
     </p>
+    </em>
 
 
     <h3>Is it secure?</h3>
     <h3>Is it secure?</h3>
-    <p>Yes. In this demo <strong>Converse.js</strong> makes an
+    <p>Yes. In this demo <em>Converse.js</em> makes an
     <a href="https://en.wikipedia.org/wiki/Secure_Sockets_Layer" target="_blank">SSL</a> encrypted connection to a secure connection manager. 
     <a href="https://en.wikipedia.org/wiki/Secure_Sockets_Layer" target="_blank">SSL</a> encrypted connection to a secure connection manager. 
     The connection manager then uses SSL and <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> to connect to an XMPP server.</p>
     The connection manager then uses SSL and <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> to connect to an XMPP server.</p>
     That said, the developers don't assume any liability for any loss or damages as a result of using this software or demo. Use this demo at your own risk. 
     That said, the developers don't assume any liability for any loss or damages as a result of using this software or demo. Use this demo at your own risk. 
@@ -107,7 +103,7 @@
         establish an authenticated connection on the server side and then attach to
         establish an authenticated connection on the server side and then attach to
         this connection in your browser.
         this connection in your browser.
    </p>
    </p>
-    <p><strong>Converse.js</strong> already supports this usecase, but you'll have to do more manual work yourself.</p>
+    <p><em>Converse.js</em> already supports this usecase, but you'll have to do some integration work yourself.</p>
 
 
 
 
     <h2>Documentation</h2>
     <h2>Documentation</h2>
@@ -126,9 +122,10 @@
     <h2>Credits and Dependencies</h2>
     <h2>Credits and Dependencies</h2>
     <p><strong>Converse.js</strong> depends on a few third party libraries, including: 
     <p><strong>Converse.js</strong> depends on a few third party libraries, including: 
     <ul>
     <ul>
+        <li><a href="http://jquery.com" target="_blank">JQuery</a></li>
         <li><a href="http://strophe.im/strophejs" target="_blank">strophe.js</a></li>
         <li><a href="http://strophe.im/strophejs" target="_blank">strophe.js</a></li>
         <li><a href="http://backbonejs.org" target="_blank">backbone.js</a></li>
         <li><a href="http://backbonejs.org" target="_blank">backbone.js</a></li>
-        <li><a href="http://requirejs.org" target="_blank">require.js</a></li>
+        <li><a href="http://requirejs.org" target="_blank">require.js</a> (optional dependency)</li>
     </ul>
     </ul>
     </p>
     </p>
     <p>Some images were taken from <a href="http://plone.org" target="_blank">Plone</a> and the
     <p>Some images were taken from <a href="http://plone.org" target="_blank">Plone</a> and the
@@ -137,7 +134,12 @@
     <h2>Licence</h2>
     <h2>Licence</h2>
     <p><strong>Converse.js</strong> is released under both the <a href="http://opensource.org/licenses/mit-license.php" target="_blank">MIT</a> 
     <p><strong>Converse.js</strong> is released under both the <a href="http://opensource.org/licenses/mit-license.php" target="_blank">MIT</a> 
     and <a href="http://opensource.org/licenses/GPL-2.0" target="_blank">GPL</a> licenses.</p>
     and <a href="http://opensource.org/licenses/GPL-2.0" target="_blank">GPL</a> licenses.</p>
+
+    <h2>Contact</h2>
+    <p>My XMPP username is <strong>jc@opkode.im</strong>.</p>
+    <p>You can send me an email via this <a href="http://opkode.com/contact" target="_blank">contact form</a>.</p>
 </section>
 </section>
+
 </div>
 </div>
 
 
 <!-- FOOTER  -->
 <!-- FOOTER  -->
@@ -151,7 +153,7 @@
     <div id="collective-xmpp-chat-data"></div>
     <div id="collective-xmpp-chat-data"></div>
     <div id="toggle-controlbox">
     <div id="toggle-controlbox">
         <a href="#" class="chat toggle-online-users">
         <a href="#" class="chat toggle-online-users">
-            <strong class="conn-feedback">Click here to chat</strong> <strong style="display: none" id="online-count">(0)</strong>
+            <strong class="conn-feedback">Toggle chat</strong> <strong style="display: none" id="online-count">(0)</strong>
         </a>
         </a>
     </div>
     </div>
 </div>
 </div>
@@ -162,4 +164,18 @@
 </script>
 </script>
 <script type="text/javascript">try { var pageTracker = _gat._getTracker("UA-2128260-8"); pageTracker._trackPageview(); } catch(err) {}</script>
 <script type="text/javascript">try { var pageTracker = _gat._getTracker("UA-2128260-8"); pageTracker._trackPageview(); } catch(err) {}</script>
 </body>
 </body>
+<script>
+    require(["jquery", "converse"], function ($, converse) {
+        converse.initialize({
+            auto_list_rooms: false,
+            auto_subscribe: false,
+            bosh_service_url: 'https://bind.opkode.im', // Please use this connection manager only for testing purposes
+            hide_muc_server: false,
+            i18n: locales.en, // Refer to ./locale/locales.js to see which locales are supported
+            prebind: false,
+            show_controlbox_by_default: true,
+            xhr_user_search: false
+        });
+    });
+</script>
 </html>
 </html>

+ 459 - 0
locale/af/LC_MESSAGES/af.js

@@ -0,0 +1,459 @@
+(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; 
+}));

+ 459 - 0
locale/af/LC_MESSAGES/converse.json

@@ -0,0 +1,459 @@
+{
+   "converse": {
+      "": {
+         "Project-Id-Version": "Converse.js 0.4",
+         "Report-Msgid-Bugs-To": "",
+         "POT-Creation-Date": "2013-06-01 23:02+0200",
+         "PO-Revision-Date": "2013-06-02 13:26+0200",
+         "Last-Translator": "JC Brand <jc@opkode.com>",
+         "Language-Team": "Afrikaans",
+         "Language": "af",
+         "MIME-Version": "1.0",
+         "Content-Type": "text/plain; charset=ASCII",
+         "Content-Transfer-Encoding": "8bit",
+         "domain": "converse",
+         "lang": "af",
+         "plural_forms": "nplurals=2; plural=(n != 1);"
+      },
+      "Show this menu": [
+         null,
+         "Vertoon hierdie keuselys"
+      ],
+      "Write in the third person": [
+         null,
+         "Skryf in die derde persoon"
+      ],
+      "Remove messages": [
+         null,
+         "Verwyder boodskappe"
+      ],
+      "Personal message": [
+         null,
+         "Persoonlike boodskap"
+      ],
+      "Contacts": [
+         null,
+         "Kontakte"
+      ],
+      "Online": [
+         null,
+         "Aangemeld"
+      ],
+      "Busy": [
+         null,
+         "Besig"
+      ],
+      "Away": [
+         null,
+         "Afwesig"
+      ],
+      "Offline": [
+         null,
+         "Afgemeld"
+      ],
+      "Click to add new chat contacts": [
+         null,
+         "Kliek om nuwe kletskontakte by te voeg"
+      ],
+      "Add a contact": [
+         null,
+         "Voeg 'n kontak by"
+      ],
+      "Contact username": [
+         null,
+         "Konak gebruikersnaam"
+      ],
+      "Add": [
+         null,
+         "Voeg by"
+      ],
+      "Contact name": [
+         null,
+         "Kontaknaam"
+      ],
+      "Search": [
+         null,
+         "Soek"
+      ],
+      "No users found": [
+         null,
+         "Geen gebruikers gevind"
+      ],
+      "Click to add as a chat contact": [
+         null,
+         "Kliek om as kletskontak by te voeg"
+      ],
+      "Click to open this room": [
+         null,
+         "Kliek om hierdie kletskamer te open"
+      ],
+      "Show more information on this room": [
+         null,
+         "Wys meer inligting aangaande hierdie kletskamer"
+      ],
+      "Description:": [
+         null,
+         "Beskrywing:"
+      ],
+      "Occupants:": [
+         null,
+         "Deelnemers:"
+      ],
+      "Features:": [
+         null,
+         "Eienskappe:"
+      ],
+      "Requires authentication": [
+         null,
+         "Benodig magtiging"
+      ],
+      "Hidden": [
+         null,
+         "Verskuil"
+      ],
+      "Requires an invitation": [
+         null,
+         "Benodig 'n uitnodiging"
+      ],
+      "Moderated": [
+         null,
+         "Gemodereer"
+      ],
+      "Non-anonymous": [
+         null,
+         "Nie-anoniem"
+      ],
+      "Open room": [
+         null,
+         "Oop kletskamer"
+      ],
+      "Permanent room": [
+         null,
+         "Permanente kamer"
+      ],
+      "Public": [
+         null,
+         "Publiek"
+      ],
+      "Semi-anonymous": [
+         null,
+         "Deels anoniem"
+      ],
+      "Temporary room": [
+         null,
+         "Tydelike kamer"
+      ],
+      "Unmoderated": [
+         null,
+         "Ongemodereer"
+      ],
+      "Rooms": [
+         null,
+         "Kamers"
+      ],
+      "Room name": [
+         null,
+         "Kamer naam"
+      ],
+      "Nickname": [
+         null,
+         "Bynaam"
+      ],
+      "Server": [
+         null,
+         "Bediener"
+      ],
+      "Join": [
+         null,
+         "Sluit aan"
+      ],
+      "Show rooms": [
+         null,
+         "Wys kamers"
+      ],
+      "No rooms on %1$s": [
+         null,
+         "Geen kamers op %1$s"
+      ],
+      "Rooms on %1$s": [
+         null,
+         "Kamers op %1$s"
+      ],
+      "Set chatroom topic": [
+         null,
+         "Stel kletskamer onderwerp"
+      ],
+      "Kick user from chatroom": [
+         null,
+         "Skop gebruiker uit die kletskamer"
+      ],
+      "Ban user from chatroom": [
+         null,
+         "Verban gebruiker vanuit die kletskamer"
+      ],
+      "Message": [
+         null,
+         "Boodskap"
+      ],
+      "Save": [
+         null,
+         "Stoor"
+      ],
+      "Cancel": [
+         null,
+         "Kanseleer"
+      ],
+      "An error occurred while trying to save the form.": [
+         null,
+         "A fout het voorgekom terwyl probeer is om die vorm te stoor."
+      ],
+      "This chatroom requires a password": [
+         null,
+         "Hiedie kletskamer benodig 'n wagwoord"
+      ],
+      "Password: ": [
+         null,
+         "Wagwoord:"
+      ],
+      "Submit": [
+         null,
+         "Dien in"
+      ],
+      "This room is not anonymous": [
+         null,
+         "Hierdie vertrek is nie anoniem nie"
+      ],
+      "This room now shows unavailable members": [
+         null,
+         "Hierdie vertrek wys nou onbeskikbare lede"
+      ],
+      "This room does not show unavailable members": [
+         null,
+         "Hierdie vertrek wys nie onbeskikbare lede nie"
+      ],
+      "Non-privacy-related room configuration has changed": [
+         null,
+         "Nie-privaatheidverwante kamer instellings het verander"
+      ],
+      "Room logging is now enabled": [
+         null,
+         "Kamer log is nou aangeskakel"
+      ],
+      "Room logging is now disabled": [
+         null,
+         "Kamer log is nou afgeskakel"
+      ],
+      "This room is now non-anonymous": [
+         null,
+         "Hiedie kamer is nou nie anoniem nie"
+      ],
+      "This room is now semi-anonymous": [
+         null,
+         "Hierdie kamer is nou gedeeltelik anoniem"
+      ],
+      "This room is now fully-anonymous": [
+         null,
+         "Hierdie kamer is nou ten volle anoniem"
+      ],
+      "A new room has been created": [
+         null,
+         "'n Nuwe kamer is geskep"
+      ],
+      "Your nickname has been changed": [
+         null,
+         "Jou bynaam is verander"
+      ],
+      "<strong>%1$s</strong> has been banned": [
+         null,
+         "<strong>%1$s</strong> is verban"
+      ],
+      "<strong>%1$s</strong> has been kicked out": [
+         null,
+         "<strong>%1$s</strong> is uitgeskop"
+      ],
+      "<strong>%1$s</strong> has been removed because of an affiliation change": [
+         null,
+         "<strong>%1$s</strong> is verwyder a.g.v 'n verandering van affiliasie"
+      ],
+      "<strong>%1$s</strong> has been removed for not being a member": [
+         null,
+         "<strong>%1$s</strong> is nie 'n lid nie, en dus verwyder"
+      ],
+      "You have been banned from this room": [
+         null,
+         "Jy is uit die kamer verban"
+      ],
+      "You have been kicked from this room": [
+         null,
+         "Jy is uit die kamer geskop"
+      ],
+      "You have been removed from this room because of an affiliation change": [
+         null,
+         "Jy is vanuit die kamer verwyder a.g.v 'n verandering van affiliasie"
+      ],
+      "You have been removed from this room because the room has changed to members-only and you're not a member": [
+         null,
+         "Jy is vanuit die kamer verwyder omdat die kamer nou slegs tot lede beperk word en jy nie 'n lid is nie."
+      ],
+      "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+         null,
+         "Jy is van hierdie kamer verwyder aangesien die MUC (Multi-user chat) diens nou afgeskakel word."
+      ],
+      "You are not on the member list of this room": [
+         null,
+         "Jy is nie op die ledelys van hierdie kamer nie"
+      ],
+      "No nickname was specified": [
+         null,
+         "Geen bynaam verskaf nie"
+      ],
+      "You are not allowed to create new rooms": [
+         null,
+         "Jy word nie toegelaat om nog kamers te skep nie"
+      ],
+      "Your nickname doesn't conform to this room's policies": [
+         null,
+         "Jou bynaam voldoen nie aan die kamer se beleid nie"
+      ],
+      "Your nickname is already taken": [
+         null,
+         "Jou bynaam is reeds geneem"
+      ],
+      "This room does not (yet) exist": [
+         null,
+         "Hierdie kamer bestaan tans (nog) nie"
+      ],
+      "This room has reached it's maximum number of occupants": [
+         null,
+         "Hierdie kamer het sy maksimum aantal deelnemers bereik"
+      ],
+      "Topic set by %1$s to: %2$s": [
+         null,
+         "Onderwerp deur %1$s bygewerk na: %2$s"
+      ],
+      "This user is a moderator": [
+         null,
+         "Hierdie gebruiker is 'n moderator"
+      ],
+      "This user can send messages in this room": [
+         null,
+         "Hierdie gebruiker kan boodskappe na die kamer stuur"
+      ],
+      "This user can NOT send messages in this room": [
+         null,
+         "Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie"
+      ],
+      "Click to chat with this contact": [
+         null,
+         "Kliek om met hierdie kontak te klets"
+      ],
+      "Click to remove this contact": [
+         null,
+         "Kliek om hierdie kontak te verwyder"
+      ],
+      "Contact requests": [
+         null,
+         "Kontak versoeke"
+      ],
+      "My contacts": [
+         null,
+         "My kontakte"
+      ],
+      "Pending contacts": [
+         null,
+         "Hangende kontakte"
+      ],
+      "Custom status": [
+         null,
+         "Doelgemaakte status"
+      ],
+      "Click to change your chat status": [
+         null,
+         "Kliek om jou klets-status te verander"
+      ],
+      "Click here to write a custom status message": [
+         null,
+         "Kliek hier om jou eie statusboodskap te skryf"
+      ],
+      "online": [
+         null,
+         "aangemeld"
+      ],
+      "busy": [
+         null,
+         "besig"
+      ],
+      "away for long": [
+         null,
+         "vir lank afwesig"
+      ],
+      "away": [
+         null,
+         "afwesig"
+      ],
+      "I am %1$s": [
+         null,
+         "Ek is %1$s"
+      ],
+      "Sign in": [
+         null,
+         "Teken in"
+      ],
+      "XMPP/Jabber Username:": [
+         null,
+         "XMPP/Jabber Gebruikersnaam:"
+      ],
+      "Password:": [
+         null,
+         "Wagwoord"
+      ],
+      "Log In": [
+         null,
+         "Meld aan"
+      ],
+      "BOSH Service URL:": [
+         null,
+         "BOSH bediener URL"
+      ],
+      "Connected": [
+         null,
+         "Verbind"
+      ],
+      "Disconnected": [
+         null,
+         "Verbindung onderbreek"
+      ],
+      "Error": [
+         null,
+         "Fout"
+      ],
+      "Connecting": [
+         null,
+         "Verbind tans"
+      ],
+      "Connection Failed": [
+         null,
+         "Verbinding het gefaal"
+      ],
+      "Authenticating": [
+         null,
+         "Besig om te bekragtig"
+      ],
+      "Authentication Failed": [
+         null,
+         "Bekragtiging het gefaal"
+      ],
+      "Disconnecting": [
+         null,
+         "Onderbreek verbinding"
+      ],
+      "Attached": [
+         null,
+         "Geheg"
+      ],
+      "Online Contacts": [
+         null,
+         "Kontakte aangemeld"
+      ]
+   }
+}

+ 488 - 0
locale/af/LC_MESSAGES/converse.po

@@ -0,0 +1,488 @@
+# Afrikaans translations for Converse.js package.
+# Copyright (C) 2013 Jan-Carel Brand
+# This file is distributed under the same license as the Converse.js package.
+# JC Brand <jc@opkode.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Converse.js 0.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-06-01 23:02+0200\n"
+"PO-Revision-Date: 2013-06-02 13:26+0200\n"
+"Last-Translator: JC Brand <jc@opkode.com>\n"
+"Language-Team: Afrikaans\n"
+"Language: af\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"domain: converse\n"
+"lang: af\n"
+"plural_forms: nplurals=2; plural=(n != 1);\n"
+
+# The last three values are needed by Jed (a Javascript translations library)
+#: converse.js:397 converse.js:1128
+msgid "Show this menu"
+msgstr "Vertoon hierdie keuselys"
+
+#: converse.js:398 converse.js:1129
+msgid "Write in the third person"
+msgstr "Skryf in die derde persoon"
+
+#: converse.js:399 converse.js:1133
+msgid "Remove messages"
+msgstr "Verwyder boodskappe"
+
+#: converse.js:539
+msgid "Personal message"
+msgstr "Persoonlike boodskap"
+
+#: converse.js:613
+msgid "Contacts"
+msgstr "Kontakte"
+
+#: converse.js:618
+msgid "Online"
+msgstr "Aangemeld"
+
+#: converse.js:619
+msgid "Busy"
+msgstr "Besig"
+
+#: converse.js:620
+msgid "Away"
+msgstr "Afwesig"
+
+#: converse.js:621
+msgid "Offline"
+msgstr "Afgemeld"
+
+#: converse.js:628
+msgid "Click to add new chat contacts"
+msgstr "Kliek om nuwe kletskontakte by te voeg"
+
+#: converse.js:628
+msgid "Add a contact"
+msgstr "Voeg 'n kontak by"
+
+#: converse.js:637
+msgid "Contact username"
+msgstr "Konak gebruikersnaam"
+
+#: converse.js:638
+msgid "Add"
+msgstr "Voeg by"
+
+#: converse.js:646
+msgid "Contact name"
+msgstr "Kontaknaam"
+
+#: converse.js:647
+msgid "Search"
+msgstr "Soek"
+
+#: converse.js:682
+msgid "No users found"
+msgstr "Geen gebruikers gevind"
+
+#: converse.js:689
+msgid "Click to add as a chat contact"
+msgstr "Kliek om as kletskontak by te voeg"
+
+#: converse.js:753
+msgid "Click to open this room"
+msgstr "Kliek om hierdie kletskamer te open"
+
+#: converse.js:755
+msgid "Show more information on this room"
+msgstr "Wys meer inligting aangaande hierdie kletskamer"
+
+#: converse.js:760
+msgid "Description:"
+msgstr "Beskrywing:"
+
+#: converse.js:761
+msgid "Occupants:"
+msgstr "Deelnemers:"
+
+#: converse.js:762
+msgid "Features:"
+msgstr "Eienskappe:"
+
+#: converse.js:764
+msgid "Requires authentication"
+msgstr "Benodig magtiging"
+
+#: converse.js:767
+msgid "Hidden"
+msgstr "Verskuil"
+
+#: converse.js:770
+msgid "Requires an invitation"
+msgstr "Benodig 'n uitnodiging"
+
+#: converse.js:773
+msgid "Moderated"
+msgstr "Gemodereer"
+
+#: converse.js:776
+msgid "Non-anonymous"
+msgstr "Nie-anoniem"
+
+#: converse.js:779
+msgid "Open room"
+msgstr "Oop kletskamer"
+
+#: converse.js:782
+msgid "Permanent room"
+msgstr "Permanente kamer"
+
+#: converse.js:785
+msgid "Public"
+msgstr "Publiek"
+
+#: converse.js:788
+msgid "Semi-anonymous"
+msgstr "Deels anoniem"
+
+#: converse.js:791
+msgid "Temporary room"
+msgstr "Tydelike kamer"
+
+#: converse.js:794
+msgid "Unmoderated"
+msgstr "Ongemodereer"
+
+#: converse.js:800
+msgid "Rooms"
+msgstr "Kamers"
+
+#: converse.js:804
+msgid "Room name"
+msgstr "Kamer naam"
+
+#: converse.js:805
+msgid "Nickname"
+msgstr "Bynaam"
+
+#: converse.js:806
+msgid "Server"
+msgstr "Bediener"
+
+#: converse.js:807
+msgid "Join"
+msgstr "Sluit aan"
+
+#: converse.js:808
+msgid "Show rooms"
+msgstr "Wys kamers"
+
+#. For translators: %1$s is a variable and will be replaced with the XMPP server name
+#: converse.js:841
+msgid "No rooms on %1$s"
+msgstr "Geen kamers op %1$s"
+
+#. For translators: %1$s is a variable and will be
+#. replaced with the XMPP server name
+#: converse.js:856
+msgid "Rooms on %1$s"
+msgstr "Kamers op %1$s"
+
+#: converse.js:1130
+msgid "Set chatroom topic"
+msgstr "Stel kletskamer onderwerp"
+
+#: converse.js:1131
+msgid "Kick user from chatroom"
+msgstr "Skop gebruiker uit die kletskamer"
+
+#: converse.js:1132
+msgid "Ban user from chatroom"
+msgstr "Verban gebruiker vanuit die kletskamer"
+
+#: converse.js:1159
+msgid "Message"
+msgstr "Boodskap"
+
+#: converse.js:1273 converse.js:2318
+msgid "Save"
+msgstr "Stoor"
+
+#: converse.js:1274
+msgid "Cancel"
+msgstr "Kanseleer"
+
+#: converse.js:1321
+msgid "An error occurred while trying to save the form."
+msgstr "A fout het voorgekom terwyl probeer is om die vorm te stoor."
+
+#: converse.js:1367
+msgid "This chatroom requires a password"
+msgstr "Hiedie kletskamer benodig 'n wagwoord"
+
+#: converse.js:1368
+msgid "Password: "
+msgstr "Wagwoord:"
+
+#: converse.js:1369
+msgid "Submit"
+msgstr "Dien in"
+
+#: converse.js:1383
+msgid "This room is not anonymous"
+msgstr "Hierdie vertrek is nie anoniem nie"
+
+#: converse.js:1384
+msgid "This room now shows unavailable members"
+msgstr "Hierdie vertrek wys nou onbeskikbare lede"
+
+#: converse.js:1385
+msgid "This room does not show unavailable members"
+msgstr "Hierdie vertrek wys nie onbeskikbare lede nie"
+
+#: converse.js:1386
+msgid "Non-privacy-related room configuration has changed"
+msgstr "Nie-privaatheidverwante kamer instellings het verander"
+
+#: converse.js:1387
+msgid "Room logging is now enabled"
+msgstr "Kamer log is nou aangeskakel"
+
+#: converse.js:1388
+msgid "Room logging is now disabled"
+msgstr "Kamer log is nou afgeskakel"
+
+#: converse.js:1389
+msgid "This room is now non-anonymous"
+msgstr "Hiedie kamer is nou nie anoniem nie"
+
+#: converse.js:1390
+msgid "This room is now semi-anonymous"
+msgstr "Hierdie kamer is nou gedeeltelik anoniem"
+
+#: converse.js:1391
+msgid "This room is now fully-anonymous"
+msgstr "Hierdie kamer is nou ten volle anoniem"
+
+#: converse.js:1392
+msgid "A new room has been created"
+msgstr "'n Nuwe kamer is geskep"
+
+#: converse.js:1393
+msgid "Your nickname has been changed"
+msgstr "Jou bynaam is verander"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been banned
+#: converse.js:1400
+msgid "<strong>%1$s</strong> has been banned"
+msgstr "<strong>%1$s</strong> is verban"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been kicked out
+#: converse.js:1404
+msgid "<strong>%1$s</strong> has been kicked out"
+msgstr "<strong>%1$s</strong> is uitgeskop"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
+#: converse.js:1408
+msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
+msgstr "<strong>%1$s</strong> is verwyder a.g.v 'n verandering van affiliasie"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed for not being a member
+#: converse.js:1412
+msgid "<strong>%1$s</strong> has been removed for not being a member"
+msgstr "<strong>%1$s</strong> is nie 'n lid nie, en dus verwyder"
+
+#: converse.js:1416 converse.js:1478
+msgid "You have been banned from this room"
+msgstr "Jy is uit die kamer verban"
+
+#: converse.js:1417
+msgid "You have been kicked from this room"
+msgstr "Jy is uit die kamer geskop"
+
+#: converse.js:1418
+msgid "You have been removed from this room because of an affiliation change"
+msgstr "Jy is vanuit die kamer verwyder a.g.v 'n verandering van affiliasie"
+
+#: converse.js:1419
+msgid ""
+"You have been removed from this room because the room has changed to members-"
+"only and you're not a member"
+msgstr ""
+"Jy is vanuit die kamer verwyder omdat die kamer nou slegs tot lede beperk "
+"word en jy nie 'n lid is nie."
+
+#: converse.js:1420
+msgid ""
+"You have been removed from this room because the MUC (Multi-user chat) "
+"service is being shut down."
+msgstr ""
+"Jy is van hierdie kamer verwyder aangesien die MUC (Multi-user chat) diens "
+"nou afgeskakel word."
+
+#: converse.js:1476
+msgid "You are not on the member list of this room"
+msgstr "Jy is nie op die ledelys van hierdie kamer nie"
+
+#: converse.js:1482
+msgid "No nickname was specified"
+msgstr "Geen bynaam verskaf nie"
+
+#: converse.js:1486
+msgid "You are not allowed to create new rooms"
+msgstr "Jy word nie toegelaat om nog kamers te skep nie"
+
+#: converse.js:1488
+msgid "Your nickname doesn't conform to this room's policies"
+msgstr "Jou bynaam voldoen nie aan die kamer se beleid nie"
+
+#: converse.js:1490
+msgid "Your nickname is already taken"
+msgstr "Jou bynaam is reeds geneem"
+
+#: converse.js:1492
+msgid "This room does not (yet) exist"
+msgstr "Hierdie kamer bestaan tans (nog) nie"
+
+#: converse.js:1494
+msgid "This room has reached it's maximum number of occupants"
+msgstr "Hierdie kamer het sy maksimum aantal deelnemers bereik"
+
+#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
+#. Example: Topic set by JC Brand to: Hello World!
+#: converse.js:1571
+msgid "Topic set by %1$s to: %2$s"
+msgstr "Onderwerp deur %1$s bygewerk na: %2$s"
+
+#: converse.js:1587
+msgid "This user is a moderator"
+msgstr "Hierdie gebruiker is 'n moderator"
+
+#: converse.js:1590
+msgid "This user can send messages in this room"
+msgstr "Hierdie gebruiker kan boodskappe na die kamer stuur"
+
+#: converse.js:1593
+msgid "This user can NOT send messages in this room"
+msgstr "Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie"
+
+#: converse.js:1796
+msgid "Click to chat with this contact"
+msgstr "Kliek om met hierdie kontak te klets"
+
+#: converse.js:1797 converse.js:1801
+msgid "Click to remove this contact"
+msgstr "Kliek om hierdie kontak te verwyder"
+
+#: converse.js:2163
+msgid "Contact requests"
+msgstr "Kontak versoeke"
+
+#: converse.js:2164
+msgid "My contacts"
+msgstr "My kontakte"
+
+#: converse.js:2165
+msgid "Pending contacts"
+msgstr "Hangende kontakte"
+
+#: converse.js:2317
+msgid "Custom status"
+msgstr "Doelgemaakte status"
+
+#: converse.js:2323
+msgid "Click to change your chat status"
+msgstr "Kliek om jou klets-status te verander"
+
+#: converse.js:2326
+msgid "Click here to write a custom status message"
+msgstr "Kliek hier om jou eie statusboodskap te skryf"
+
+#: converse.js:2355 converse.js:2363
+msgid "online"
+msgstr "aangemeld"
+
+#: converse.js:2357
+msgid "busy"
+msgstr "besig"
+
+#: converse.js:2359
+msgid "away for long"
+msgstr "vir lank afwesig"
+
+#: converse.js:2361
+msgid "away"
+msgstr "afwesig"
+
+#. For translators: the %1$s part gets replaced with the status
+#. Example, I am online
+#: converse.js:2375 converse.js:2409
+msgid "I am %1$s"
+msgstr "Ek is %1$s"
+
+#: converse.js:2480
+msgid "Sign in"
+msgstr "Teken in"
+
+#: converse.js:2483
+msgid "XMPP/Jabber Username:"
+msgstr "XMPP/Jabber Gebruikersnaam:"
+
+#: converse.js:2485
+msgid "Password:"
+msgstr "Wagwoord"
+
+#: converse.js:2487
+msgid "Log In"
+msgstr "Meld aan"
+
+#: converse.js:2491
+msgid "BOSH Service URL:"
+msgstr "BOSH bediener URL"
+
+#: converse.js:2503
+msgid "Connected"
+msgstr "Verbind"
+
+#: converse.js:2507
+msgid "Disconnected"
+msgstr "Verbindung onderbreek"
+
+#: converse.js:2511
+msgid "Error"
+msgstr "Fout"
+
+#: converse.js:2513
+msgid "Connecting"
+msgstr "Verbind tans"
+
+#: converse.js:2516
+msgid "Connection Failed"
+msgstr "Verbinding het gefaal"
+
+#: converse.js:2518
+msgid "Authenticating"
+msgstr "Besig om te bekragtig"
+
+#: converse.js:2521
+msgid "Authentication Failed"
+msgstr "Bekragtiging het gefaal"
+
+#: converse.js:2523
+msgid "Disconnecting"
+msgstr "Onderbreek verbinding"
+
+#: converse.js:2525
+msgid "Attached"
+msgstr "Geheg"
+
+#: converse.js:2656
+msgid "Online Contacts"
+msgstr "Kontakte aangemeld"

+ 481 - 0
locale/converse.pot

@@ -0,0 +1,481 @@
+# 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 ""

+ 460 - 0
locale/de/LC_MESSAGES/converse.json

@@ -0,0 +1,460 @@
+{
+   "converse": {
+      "": {
+         "Project-Id-Version": "Converse.js 0.4",
+         "Report-Msgid-Bugs-To": "",
+         "POT-Creation-Date": "2013-06-01 23:03+0200",
+         "PO-Revision-Date": "2013-06-02 13:58+0200",
+         "Last-Translator": "JC Brand <jc@opkode.com>",
+         "Language-Team": "German",
+         "Language": "de",
+         "MIME-Version": "1.0",
+         "Content-Type": "text/plain; charset=ASCII",
+         "Content-Transfer-Encoding": "8bit",
+         "Plural-Forms": "nplurals=2; plural=(n != 1);",
+         "domain": "converse",
+         "lang": "de",
+         "plural_forms": "nplurals=2; plural=(n != 1);"
+      },
+      "Show this menu": [
+         null,
+         "Dieses Menü anzeigen"
+      ],
+      "Write in the third person": [
+         null,
+         "In der dritten Person schreiben"
+      ],
+      "Remove messages": [
+         null,
+         "Nachrichten entfernen"
+      ],
+      "Personal message": [
+         null,
+         "Persönliche Nachricht"
+      ],
+      "Contacts": [
+         null,
+         "Kontakte"
+      ],
+      "Online": [
+         null,
+         "Online"
+      ],
+      "Busy": [
+         null,
+         "Beschäfticht"
+      ],
+      "Away": [
+         null,
+         "Abwesend"
+      ],
+      "Offline": [
+         null,
+         "Abgemeldet"
+      ],
+      "Click to add new chat contacts": [
+         null,
+         "Klicken Sie, um einen neuen Kontakt hinzuzufügen"
+      ],
+      "Add a contact": [
+         null,
+         "Kontakte hinzufügen"
+      ],
+      "Contact username": [
+         null,
+         "Benutzername"
+      ],
+      "Add": [
+         null,
+         "Hinzufügen"
+      ],
+      "Contact name": [
+         null,
+         "Name des Kontakts"
+      ],
+      "Search": [
+         null,
+         "Suche"
+      ],
+      "No users found": [
+         null,
+         "Keine Benutzer gefunden"
+      ],
+      "Click to add as a chat contact": [
+         null,
+         "Hier klicken um als Kontakt hinzuzufügen"
+      ],
+      "Click to open this room": [
+         null,
+         "Hier klicken um diesen Raum zu öffnen"
+      ],
+      "Show more information on this room": [
+         null,
+         "Mehr Information über diesen Raum zeigen"
+      ],
+      "Description:": [
+         null,
+         "Beschreibung"
+      ],
+      "Occupants:": [
+         null,
+         "Teilnehmer"
+      ],
+      "Features:": [
+         null,
+         "Funktionen:"
+      ],
+      "Requires authentication": [
+         null,
+         "Authentifizierung erforderlich"
+      ],
+      "Hidden": [
+         null,
+         "Versteckt"
+      ],
+      "Requires an invitation": [
+         null,
+         "Einladung erforderlich"
+      ],
+      "Moderated": [
+         null,
+         "Moderiert"
+      ],
+      "Non-anonymous": [
+         null,
+         "Nicht anonym"
+      ],
+      "Open room": [
+         null,
+         "Offener Raum"
+      ],
+      "Permanent room": [
+         null,
+         "Dauerhafter Raum"
+      ],
+      "Public": [
+         null,
+         "Öffentlich"
+      ],
+      "Semi-anonymous": [
+         null,
+         "Teils anonym"
+      ],
+      "Temporary room": [
+         null,
+         "Vorübergehender Raum"
+      ],
+      "Unmoderated": [
+         null,
+         "Unmoderiert"
+      ],
+      "Rooms": [
+         null,
+         "Räume"
+      ],
+      "Room name": [
+         null,
+         "Raumname"
+      ],
+      "Nickname": [
+         null,
+         "Spitzname"
+      ],
+      "Server": [
+         null,
+         "Server"
+      ],
+      "Join": [
+         null,
+         "Beitreten"
+      ],
+      "Show rooms": [
+         null,
+         "Räume anzeigen"
+      ],
+      "No rooms on %1$s": [
+         null,
+         "Keine Räume auf %1$s"
+      ],
+      "Rooms on %1$s": [
+         null,
+         "Räume auf %1$s"
+      ],
+      "Set chatroom topic": [
+         null,
+         "Chatraum Thema festlegen"
+      ],
+      "Kick user from chatroom": [
+         null,
+         "Werfe einen Benutzer aus dem Raum."
+      ],
+      "Ban user from chatroom": [
+         null,
+         "Verbanne einen Benutzer aus dem Raum."
+      ],
+      "Message": [
+         null,
+         "Nachricht"
+      ],
+      "Save": [
+         null,
+         "Speichern"
+      ],
+      "Cancel": [
+         null,
+         "Abbrechen"
+      ],
+      "An error occurred while trying to save the form.": [
+         null,
+         "Beim Speichern der Formular is ein Fehler aufgetreten."
+      ],
+      "This chatroom requires a password": [
+         null,
+         "Passwort wird für die Anmeldung benötigt."
+      ],
+      "Password: ": [
+         null,
+         "Passwort: "
+      ],
+      "Submit": [
+         null,
+         "Einreichen"
+      ],
+      "This room is not anonymous": [
+         null,
+         "Dieser Raum ist nicht anonym"
+      ],
+      "This room now shows unavailable members": [
+         null,
+         "Dieser Raum zeigt jetzt unferfügbare Mitglieder"
+      ],
+      "This room does not show unavailable members": [
+         null,
+         "Dieser Raum zeigt nicht unverfügbare Mitglieder"
+      ],
+      "Non-privacy-related room configuration has changed": [
+         null,
+         "Die Konfiguration, die nicht auf die Privatsphäre bezogen ist, hat sich geändert"
+      ],
+      "Room logging is now enabled": [
+         null,
+         "Zukünftige Nachrichten dieses Raums werden protokolliert."
+      ],
+      "Room logging is now disabled": [
+         null,
+         "Zukünftige Nachrichten dieses Raums werden nicht protokolliert."
+      ],
+      "This room is now non-anonymous": [
+         null,
+         "Dieser Raum ist jetzt nicht anonym"
+      ],
+      "This room is now semi-anonymous": [
+         null,
+         "Dieser Raum ist jetzt teils anonym"
+      ],
+      "This room is now fully-anonymous": [
+         null,
+         "Dieser Raum ist jetzt anonym"
+      ],
+      "A new room has been created": [
+         null,
+         "Einen neuen Raum ist erstellen"
+      ],
+      "Your nickname has been changed": [
+         null,
+         "Spitzname festgelegen"
+      ],
+      "<strong>%1$s</strong> has been banned": [
+         null,
+         "<strong>%1$s</strong> ist verbannt"
+      ],
+      "<strong>%1$s</strong> has been kicked out": [
+         null,
+         "<strong>%1$s</strong> ist hinausgeworfen"
+      ],
+      "<strong>%1$s</strong> has been removed because of an affiliation change": [
+         null,
+         "<strong>%1$s</strong> wurde wegen einer Zugehörigkeitsänderung entfernt"
+      ],
+      "<strong>%1$s</strong> has been removed for not being a member": [
+         null,
+         "<strong>%1$s</strong> ist kein Mitglied und wurde daher entfernt"
+      ],
+      "You have been banned from this room": [
+         null,
+         "Sie sind aus diesem Raum verbannt worden"
+      ],
+      "You have been kicked from this room": [
+         null,
+         "Sie wurden aus diesem Raum hinausgeworfen"
+      ],
+      "You have been removed from this room because of an affiliation change": [
+         null,
+         "Sie wurden wegen einer Zugehörigkeitsänderung entfernt"
+      ],
+      "You have been removed from this room because the room has changed to members-only and you're not a member": [
+         null,
+         "Sie wurden aus diesem Raum entfernt da Sie kein Mitglied sind."
+      ],
+      "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+         null,
+         "Sie werden aus diesem Raum entfernt da der MUC (Muli-user chat) Dienst gerade abgeschalten wird."
+      ],
+      "You are not on the member list of this room": [
+         null,
+         "Sie sind nicht auf der Mitgliederliste dieses Raums"
+      ],
+      "No nickname was specified": [
+         null,
+         "Kein Spitzname festgelegt"
+      ],
+      "You are not allowed to create new rooms": [
+         null,
+         "Es ist Ihnen nicht erlaubt, neue Räume anzulegen"
+      ],
+      "Your nickname doesn't conform to this room's policies": [
+         null,
+         "Ungültiger Spitzname"
+      ],
+      "Your nickname is already taken": [
+         null,
+         "Ihre Spitzname existiert bereits."
+      ],
+      "This room does not (yet) exist": [
+         null,
+         "Dieser Raum existiert (noch) nicht"
+      ],
+      "This room has reached it's maximum number of occupants": [
+         null,
+         "Dieser Raum hat die maximale Mitgliederanzahl erreicht"
+      ],
+      "Topic set by %1$s to: %2$s": [
+         null,
+         "%1$s hat das Thema zu \"%2$s\" abgeändert"
+      ],
+      "This user is a moderator": [
+         null,
+         "Dieser Benutzer ist ein Moderator"
+      ],
+      "This user can send messages in this room": [
+         null,
+         "Dieser Benutzer kann Nachrichten in diesem Raum verschicken"
+      ],
+      "This user can NOT send messages in this room": [
+         null,
+         "Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"
+      ],
+      "Click to chat with this contact": [
+         null,
+         "Hier klicken um mit diesem Kontakt zu chatten"
+      ],
+      "Click to remove this contact": [
+         null,
+         "Hier klicken um diesen Kontakt zu entfernen"
+      ],
+      "Contact requests": [
+         null,
+         "Kontaktanfragen"
+      ],
+      "My contacts": [
+         null,
+         "Meine Kontakte"
+      ],
+      "Pending contacts": [
+         null,
+         "Unbestätigte Kontakte"
+      ],
+      "Custom status": [
+         null,
+         "Status-Nachricht"
+      ],
+      "Click to change your chat status": [
+         null,
+         "Klicken Sie, um ihrer Status to ändern"
+      ],
+      "Click here to write a custom status message": [
+         null,
+         "Klicken Sie hier, um ihrer Status-Nachricht to ändern"
+      ],
+      "online": [
+         null,
+         "online"
+      ],
+      "busy": [
+         null,
+         "beschäfticht"
+      ],
+      "away for long": [
+         null,
+         "länger abwesend"
+      ],
+      "away": [
+         null,
+         "abwesend"
+      ],
+      "I am %1$s": [
+         null,
+         "Ich bin %1$s"
+      ],
+      "Sign in": [
+         null,
+         "Anmelden"
+      ],
+      "XMPP/Jabber Username:": [
+         null,
+         "XMPP/Jabber Benutzername"
+      ],
+      "Password:": [
+         null,
+         "Passwort:"
+      ],
+      "Log In": [
+         null,
+         "Anmelden"
+      ],
+      "BOSH Service URL:": [
+         null,
+         "BOSH "
+      ],
+      "Connected": [
+         null,
+         "Verbunden"
+      ],
+      "Disconnected": [
+         null,
+         "Verbindung unterbrochen."
+      ],
+      "Error": [
+         null,
+         "Fehler"
+      ],
+      "Connecting": [
+         null,
+         "Verbindungsaufbau …"
+      ],
+      "Connection Failed": [
+         null,
+         "Entfernte Verbindung fehlgeschlagen"
+      ],
+      "Authenticating": [
+         null,
+         "Authentifizierung"
+      ],
+      "Authentication Failed": [
+         null,
+         "Authentifizierung gescheitert"
+      ],
+      "Disconnecting": [
+         null,
+         "Trenne Verbindung"
+      ],
+      "Attached": [
+         null,
+         "Angehängt"
+      ],
+      "Online Contacts": [
+         null,
+         "Online-Kontakte"
+      ]
+   }
+}

+ 489 - 0
locale/de/LC_MESSAGES/converse.po

@@ -0,0 +1,489 @@
+# German translations for Converse.js package.
+# Copyright (C) 2013 Jan-Carel Brand
+# This file is distributed under the same license as the Converse.js package.
+# JC Brand <jc@opkode.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Converse.js 0.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-06-01 23:03+0200\n"
+"PO-Revision-Date: 2013-06-02 13:58+0200\n"
+"Last-Translator: JC Brand <jc@opkode.com>\n"
+"Language-Team: German\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"domain: converse\n"
+"lang: de\n"
+"plural_forms: nplurals=2; plural=(n != 1);\n"
+
+#: converse.js:397 converse.js:1128
+msgid "Show this menu"
+msgstr "Dieses Menü anzeigen"
+
+#: converse.js:398 converse.js:1129
+msgid "Write in the third person"
+msgstr "In der dritten Person schreiben"
+
+#: converse.js:399 converse.js:1133
+msgid "Remove messages"
+msgstr "Nachrichten entfernen"
+
+#: converse.js:539
+msgid "Personal message"
+msgstr "Persönliche Nachricht"
+
+#: converse.js:613
+msgid "Contacts"
+msgstr "Kontakte"
+
+#: converse.js:618
+msgid "Online"
+msgstr "Online"
+
+#: converse.js:619
+msgid "Busy"
+msgstr "Beschäfticht"
+
+#: converse.js:620
+msgid "Away"
+msgstr "Abwesend"
+
+#: converse.js:621
+msgid "Offline"
+msgstr "Abgemeldet"
+
+#: converse.js:628
+msgid "Click to add new chat contacts"
+msgstr "Klicken Sie, um einen neuen Kontakt hinzuzufügen"
+
+#: converse.js:628
+msgid "Add a contact"
+msgstr "Kontakte hinzufügen"
+
+#: converse.js:637
+msgid "Contact username"
+msgstr "Benutzername"
+
+#: converse.js:638
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: converse.js:646
+msgid "Contact name"
+msgstr "Name des Kontakts"
+
+#: converse.js:647
+msgid "Search"
+msgstr "Suche"
+
+#: converse.js:682
+msgid "No users found"
+msgstr "Keine Benutzer gefunden"
+
+#: converse.js:689
+msgid "Click to add as a chat contact"
+msgstr "Hier klicken um als Kontakt hinzuzufügen"
+
+#: converse.js:753
+msgid "Click to open this room"
+msgstr "Hier klicken um diesen Raum zu öffnen"
+
+#: converse.js:755
+msgid "Show more information on this room"
+msgstr "Mehr Information über diesen Raum zeigen"
+
+#: converse.js:760
+msgid "Description:"
+msgstr "Beschreibung"
+
+#: converse.js:761
+msgid "Occupants:"
+msgstr "Teilnehmer"
+
+#: converse.js:762
+msgid "Features:"
+msgstr "Funktionen:"
+
+#: converse.js:764
+msgid "Requires authentication"
+msgstr "Authentifizierung erforderlich"
+
+#: converse.js:767
+msgid "Hidden"
+msgstr "Versteckt"
+
+#: converse.js:770
+msgid "Requires an invitation"
+msgstr "Einladung erforderlich"
+
+#: converse.js:773
+msgid "Moderated"
+msgstr "Moderiert"
+
+#: converse.js:776
+msgid "Non-anonymous"
+msgstr "Nicht anonym"
+
+#: converse.js:779
+msgid "Open room"
+msgstr "Offener Raum"
+
+#: converse.js:782
+msgid "Permanent room"
+msgstr "Dauerhafter Raum"
+
+#: converse.js:785
+msgid "Public"
+msgstr "Öffentlich"
+
+#: converse.js:788
+msgid "Semi-anonymous"
+msgstr "Teils anonym"
+
+#: converse.js:791
+msgid "Temporary room"
+msgstr "Vorübergehender Raum"
+
+#: converse.js:794
+msgid "Unmoderated"
+msgstr "Unmoderiert"
+
+#: converse.js:800
+msgid "Rooms"
+msgstr "Räume"
+
+#: converse.js:804
+msgid "Room name"
+msgstr "Raumname"
+
+#: converse.js:805
+msgid "Nickname"
+msgstr "Spitzname"
+
+#: converse.js:806
+msgid "Server"
+msgstr "Server"
+
+#: converse.js:807
+msgid "Join"
+msgstr "Beitreten"
+
+#: converse.js:808
+msgid "Show rooms"
+msgstr "Räume anzeigen"
+
+#. For translators: %1$s is a variable and will be replaced with the XMPP server name
+#: converse.js:841
+msgid "No rooms on %1$s"
+msgstr "Keine Räume auf %1$s"
+
+#. For translators: %1$s is a variable and will be
+#. replaced with the XMPP server name
+#: converse.js:856
+msgid "Rooms on %1$s"
+msgstr "Räume auf %1$s"
+
+#: converse.js:1130
+msgid "Set chatroom topic"
+msgstr "Chatraum Thema festlegen"
+
+#: converse.js:1131
+msgid "Kick user from chatroom"
+msgstr "Werfe einen Benutzer aus dem Raum."
+
+#: converse.js:1132
+msgid "Ban user from chatroom"
+msgstr "Verbanne einen Benutzer aus dem Raum."
+
+#: converse.js:1159
+msgid "Message"
+msgstr "Nachricht"
+
+#: converse.js:1273 converse.js:2318
+msgid "Save"
+msgstr "Speichern"
+
+#: converse.js:1274
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: converse.js:1321
+msgid "An error occurred while trying to save the form."
+msgstr "Beim Speichern der Formular is ein Fehler aufgetreten."
+
+#: converse.js:1367
+msgid "This chatroom requires a password"
+msgstr "Passwort wird für die Anmeldung benötigt."
+
+#: converse.js:1368
+msgid "Password: "
+msgstr "Passwort: "
+
+#: converse.js:1369
+msgid "Submit"
+msgstr "Einreichen"
+
+#: converse.js:1383
+msgid "This room is not anonymous"
+msgstr "Dieser Raum ist nicht anonym"
+
+#: converse.js:1384
+msgid "This room now shows unavailable members"
+msgstr "Dieser Raum zeigt jetzt unferfügbare Mitglieder"
+
+#: converse.js:1385
+msgid "This room does not show unavailable members"
+msgstr "Dieser Raum zeigt nicht unverfügbare Mitglieder"
+
+#: converse.js:1386
+msgid "Non-privacy-related room configuration has changed"
+msgstr "Die Konfiguration, die nicht auf die Privatsphäre bezogen ist, hat sich geändert"
+
+#: converse.js:1387
+msgid "Room logging is now enabled"
+msgstr ""
+"Zukünftige Nachrichten dieses Raums werden "
+"protokolliert."
+
+#: converse.js:1388
+msgid "Room logging is now disabled"
+msgstr ""
+"Zukünftige Nachrichten dieses Raums werden nicht "
+"protokolliert."
+
+#: converse.js:1389
+msgid "This room is now non-anonymous"
+msgstr "Dieser Raum ist jetzt nicht anonym"
+
+#: converse.js:1390
+msgid "This room is now semi-anonymous"
+msgstr "Dieser Raum ist jetzt teils anonym"
+
+#: converse.js:1391
+msgid "This room is now fully-anonymous"
+msgstr "Dieser Raum ist jetzt anonym"
+
+#: converse.js:1392
+msgid "A new room has been created"
+msgstr "Einen neuen Raum ist erstellen"
+
+#: converse.js:1393
+msgid "Your nickname has been changed"
+msgstr "Spitzname festgelegen"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been banned
+#: converse.js:1400
+msgid "<strong>%1$s</strong> has been banned"
+msgstr "<strong>%1$s</strong> ist verbannt"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been kicked out
+#: converse.js:1404
+msgid "<strong>%1$s</strong> has been kicked out"
+msgstr "<strong>%1$s</strong> ist hinausgeworfen"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
+#: converse.js:1408
+msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
+msgstr "<strong>%1$s</strong> wurde wegen einer Zugehörigkeitsänderung entfernt"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed for not being a member
+#: converse.js:1412
+msgid "<strong>%1$s</strong> has been removed for not being a member"
+msgstr "<strong>%1$s</strong> ist kein Mitglied und wurde daher entfernt"
+
+#: converse.js:1416 converse.js:1478
+msgid "You have been banned from this room"
+msgstr "Sie sind aus diesem Raum verbannt worden"
+
+#: converse.js:1417
+msgid "You have been kicked from this room"
+msgstr "Sie wurden aus diesem Raum hinausgeworfen"
+
+#: converse.js:1418
+msgid "You have been removed from this room because of an affiliation change"
+msgstr "Sie wurden wegen einer Zugehörigkeitsänderung entfernt"
+
+#: converse.js:1419
+msgid ""
+"You have been removed from this room because the room has changed to members-"
+"only and you're not a member"
+msgstr "Sie wurden aus diesem Raum entfernt da Sie kein Mitglied sind."
+
+#: converse.js:1420
+msgid ""
+"You have been removed from this room because the MUC (Multi-user chat) "
+"service is being shut down."
+msgstr "Sie werden aus diesem Raum entfernt da der MUC (Muli-user chat) Dienst "
+"gerade abgeschalten wird."
+
+#: converse.js:1476
+msgid "You are not on the member list of this room"
+msgstr "Sie sind nicht auf der Mitgliederliste dieses Raums"
+
+#: converse.js:1482
+msgid "No nickname was specified"
+msgstr "Kein Spitzname festgelegt"
+
+#: converse.js:1486
+msgid "You are not allowed to create new rooms"
+msgstr "Es ist Ihnen nicht erlaubt, neue Räume anzulegen"
+
+#: converse.js:1488
+msgid "Your nickname doesn't conform to this room's policies"
+msgstr "Ungültiger Spitzname"
+
+#: converse.js:1490
+msgid "Your nickname is already taken"
+msgstr "Ihre Spitzname existiert bereits."
+
+#: converse.js:1492
+msgid "This room does not (yet) exist"
+msgstr "Dieser Raum existiert (noch) nicht"
+
+#: converse.js:1494
+msgid "This room has reached it's maximum number of occupants"
+msgstr "Dieser Raum hat die maximale Mitgliederanzahl erreicht"
+
+#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
+#. Example: Topic set by JC Brand to: Hello World!
+#: converse.js:1571
+msgid "Topic set by %1$s to: %2$s"
+msgstr "%1$s hat das Thema zu \"%2$s\" abgeändert"
+
+#: converse.js:1587
+msgid "This user is a moderator"
+msgstr "Dieser Benutzer ist ein Moderator"
+
+#: converse.js:1590
+msgid "This user can send messages in this room"
+msgstr "Dieser Benutzer kann Nachrichten in diesem Raum verschicken"
+
+#: converse.js:1593
+msgid "This user can NOT send messages in this room"
+msgstr "Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"
+
+#: converse.js:1796
+msgid "Click to chat with this contact"
+msgstr "Hier klicken um mit diesem Kontakt zu chatten"
+
+#: converse.js:1797 converse.js:1801
+msgid "Click to remove this contact"
+msgstr "Hier klicken um diesen Kontakt zu entfernen"
+
+#: converse.js:2163
+msgid "Contact requests"
+msgstr "Kontaktanfragen"
+
+#: converse.js:2164
+msgid "My contacts"
+msgstr "Meine Kontakte"
+
+#: converse.js:2165
+msgid "Pending contacts"
+msgstr "Unbestätigte Kontakte"
+
+#: converse.js:2317
+msgid "Custom status"
+msgstr "Status-Nachricht"
+
+#: converse.js:2323
+msgid "Click to change your chat status"
+msgstr "Klicken Sie, um ihrer Status to ändern"
+
+#: converse.js:2326
+msgid "Click here to write a custom status message"
+msgstr "Klicken Sie hier, um ihrer Status-Nachricht to ändern"
+
+#: converse.js:2355 converse.js:2363
+msgid "online"
+msgstr "online"
+
+#: converse.js:2357
+msgid "busy"
+msgstr "beschäfticht"
+
+#: converse.js:2359
+msgid "away for long"
+msgstr "länger abwesend"
+
+#: converse.js:2361
+msgid "away"
+msgstr "abwesend"
+
+#. For translators: the %1$s part gets replaced with the status
+#. Example, I am online
+#: converse.js:2375 converse.js:2409
+msgid "I am %1$s"
+msgstr "Ich bin %1$s"
+
+#: converse.js:2480
+msgid "Sign in"
+msgstr "Anmelden"
+
+#: converse.js:2483
+msgid "XMPP/Jabber Username:"
+msgstr "XMPP/Jabber Benutzername"
+
+#: converse.js:2485
+msgid "Password:"
+msgstr "Passwort:"
+
+#: converse.js:2487
+msgid "Log In"
+msgstr "Anmelden"
+
+#: converse.js:2491
+msgid "BOSH Service URL:"
+msgstr "BOSH "
+
+#: converse.js:2503
+msgid "Connected"
+msgstr "Verbunden"
+
+#: converse.js:2507
+msgid "Disconnected"
+msgstr "Verbindung unterbrochen."
+
+#: converse.js:2511
+msgid "Error"
+msgstr "Fehler"
+
+#: converse.js:2513
+msgid "Connecting"
+msgstr "Verbindungsaufbau …"
+
+#: converse.js:2516
+msgid "Connection Failed"
+msgstr "Entfernte Verbindung fehlgeschlagen"
+
+#: converse.js:2518
+msgid "Authenticating"
+msgstr "Authentifizierung"
+
+#: converse.js:2521
+msgid "Authentication Failed"
+msgstr "Authentifizierung gescheitert"
+
+#: converse.js:2523
+msgid "Disconnecting"
+msgstr "Trenne Verbindung"
+
+#: converse.js:2525
+msgid "Attached"
+msgstr "Angehängt"
+
+#: converse.js:2656
+msgid "Online Contacts"
+msgstr "Online-Kontakte"

+ 459 - 0
locale/de/LC_MESSAGES/de.js

@@ -0,0 +1,459 @@
+(function (root, factory) {
+    define("de", ['jed'], function () {
+        var de = new Jed({
+            "domain": "converse",
+            "locale_data": {
+                "converse": {
+                    "": {
+                        "domain": "converse",
+                        "lang": "de",
+                        "plural_forms": "nplurals=2; plural=(n != 1);"
+                    },
+                    "Show this menu": [
+                        null,
+                        "Dieses Menü anzeigen"
+                    ],
+                    "Write in the third person": [
+                        null,
+                        "In der dritten Person schreiben"
+                    ],
+                    "Remove messages": [
+                        null,
+                        "Nachrichten entfernen"
+                    ],
+                    "Personal message": [
+                        null,
+                        "Persönliche Nachricht"
+                    ],
+                    "Contacts": [
+                        null,
+                        "Kontakte"
+                    ],
+                    "Online": [
+                        null,
+                        "Online"
+                    ],
+                    "Busy": [
+                        null,
+                        "Beschäfticht"
+                    ],
+                    "Away": [
+                        null,
+                        "Abwesend"
+                    ],
+                    "Offline": [
+                        null,
+                        "Abgemeldet"
+                    ],
+                    "Click to add new chat contacts": [
+                        null,
+                        "Klicken Sie, um einen neuen Kontakt hinzuzufügen"
+                    ],
+                    "Add a contact": [
+                        null,
+                        "Kontakte hinzufügen"
+                    ],
+                    "Contact username": [
+                        null,
+                        "Benutzername"
+                    ],
+                    "Add": [
+                        null,
+                        "Hinzufügen"
+                    ],
+                    "Contact name": [
+                        null,
+                        "Name des Kontakts"
+                    ],
+                    "Search": [
+                        null,
+                        "Suche"
+                    ],
+                    "No users found": [
+                        null,
+                        "Keine Benutzer gefunden"
+                    ],
+                    "Click to add as a chat contact": [
+                        null,
+                        "Hier klicken um als Kontakt hinzuzufügen"
+                    ],
+                    "Click to open this room": [
+                        null,
+                        "Hier klicken um diesen Raum zu öffnen"
+                    ],
+                    "Show more information on this room": [
+                        null,
+                        "Mehr Information über diesen Raum zeigen"
+                    ],
+                    "Description:": [
+                        null,
+                        "Beschreibung"
+                    ],
+                    "Occupants:": [
+                        null,
+                        "Teilnehmer"
+                    ],
+                    "Features:": [
+                        null,
+                        "Funktionen:"
+                    ],
+                    "Requires authentication": [
+                        null,
+                        "Authentifizierung erforderlich"
+                    ],
+                    "Hidden": [
+                        null,
+                        "Versteckt"
+                    ],
+                    "Requires an invitation": [
+                        null,
+                        "Einladung erforderlich"
+                    ],
+                    "Moderated": [
+                        null,
+                        "Moderiert"
+                    ],
+                    "Non-anonymous": [
+                        null,
+                        "Nicht anonym"
+                    ],
+                    "Open room": [
+                        null,
+                        "Offener Raum"
+                    ],
+                    "Permanent room": [
+                        null,
+                        "Dauerhafter Raum"
+                    ],
+                    "Public": [
+                        null,
+                        "Öffentlich"
+                    ],
+                    "Semi-anonymous": [
+                        null,
+                        "Teils anonym"
+                    ],
+                    "Temporary room": [
+                        null,
+                        "Vorübergehender Raum"
+                    ],
+                    "Unmoderated": [
+                        null,
+                        "Unmoderiert"
+                    ],
+                    "Rooms": [
+                        null,
+                        "Räume"
+                    ],
+                    "Room name": [
+                        null,
+                        "Raumname"
+                    ],
+                    "Nickname": [
+                        null,
+                        "Spitzname"
+                    ],
+                    "Server": [
+                        null,
+                        "Server"
+                    ],
+                    "Join": [
+                        null,
+                        "Beitreten"
+                    ],
+                    "Show rooms": [
+                        null,
+                        "Räume anzeigen"
+                    ],
+                    "No rooms on %1$s": [
+                        null,
+                        "Keine Räume auf %1$s"
+                    ],
+                    "Rooms on %1$s": [
+                        null,
+                        "Räume auf %1$s"
+                    ],
+                    "Set chatroom topic": [
+                        null,
+                        "Chatraum Thema festlegen"
+                    ],
+                    "Kick user from chatroom": [
+                        null,
+                        "Werfe einen Benutzer aus dem Raum."
+                    ],
+                    "Ban user from chatroom": [
+                        null,
+                        "Verbanne einen Benutzer aus dem Raum."
+                    ],
+                    "Message": [
+                        null,
+                        "Nachricht"
+                    ],
+                    "Save": [
+                        null,
+                        "Speichern"
+                    ],
+                    "Cancel": [
+                        null,
+                        "Abbrechen"
+                    ],
+                    "An error occurred while trying to save the form.": [
+                        null,
+                        "Beim Speichern der Formular is ein Fehler aufgetreten."
+                    ],
+                    "This chatroom requires a password": [
+                        null,
+                        "Passwort wird für die Anmeldung benötigt."
+                    ],
+                    "Password: ": [
+                        null,
+                        "Passwort: "
+                    ],
+                    "Submit": [
+                        null,
+                        "Einreichen"
+                    ],
+                    "This room is not anonymous": [
+                        null,
+                        "Dieser Raum ist nicht anonym"
+                    ],
+                    "This room now shows unavailable members": [
+                        null,
+                        "Dieser Raum zeigt jetzt unferfügbare Mitglieder"
+                    ],
+                    "This room does not show unavailable members": [
+                        null,
+                        "Dieser Raum zeigt nicht unverfügbare Mitglieder"
+                    ],
+                    "Non-privacy-related room configuration has changed": [
+                        null,
+                        "Die Konfiguration, die nicht auf die Privatsphäre bezogen ist, hat sich geändert"
+                    ],
+                    "Room logging is now enabled": [
+                        null,
+                        "Zukünftige Nachrichten dieses Raums werden protokolliert."
+                    ],
+                    "Room logging is now disabled": [
+                        null,
+                        "Zukünftige Nachrichten dieses Raums werden nicht protokolliert."
+                    ],
+                    "This room is now non-anonymous": [
+                        null,
+                        "Dieser Raum ist jetzt nicht anonym"
+                    ],
+                    "This room is now semi-anonymous": [
+                        null,
+                        "Dieser Raum ist jetzt teils anonym"
+                    ],
+                    "This room is now fully-anonymous": [
+                        null,
+                        "Dieser Raum ist jetzt anonym"
+                    ],
+                    "A new room has been created": [
+                        null,
+                        "Einen neuen Raum ist erstellen"
+                    ],
+                    "Your nickname has been changed": [
+                        null,
+                        "Spitzname festgelegen"
+                    ],
+                    "<strong>%1$s</strong> has been banned": [
+                        null,
+                        "<strong>%1$s</strong> ist verbannt"
+                    ],
+                    "<strong>%1$s</strong> has been kicked out": [
+                        null,
+                        "<strong>%1$s</strong> ist hinausgeworfen"
+                    ],
+                    "<strong>%1$s</strong> has been removed because of an affiliation change": [
+                        null,
+                        "<strong>%1$s</strong> wurde wegen einer Zugehörigkeitsänderung entfernt"
+                    ],
+                    "<strong>%1$s</strong> has been removed for not being a member": [
+                        null,
+                        "<strong>%1$s</strong> ist kein Mitglied und wurde daher entfernt"
+                    ],
+                    "You have been banned from this room": [
+                        null,
+                        "Sie sind aus diesem Raum verbannt worden"
+                    ],
+                    "You have been kicked from this room": [
+                        null,
+                        "Sie wurden aus diesem Raum hinausgeworfen"
+                    ],
+                    "You have been removed from this room because of an affiliation change": [
+                        null,
+                        "Sie wurden wegen einer Zugehörigkeitsänderung entfernt"
+                    ],
+                    "You have been removed from this room because the room has changed to members-only and you're not a member": [
+                        null,
+                        "Sie wurden aus diesem Raum entfernt da Sie kein Mitglied sind."
+                    ],
+                    "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+                        null,
+                        "Sie werden aus diesem Raum entfernt da der MUC (Muli-user chat) Dienst gerade abgeschalten wird."
+                    ],
+                    "You are not on the member list of this room": [
+                        null,
+                        "Sie sind nicht auf der Mitgliederliste dieses Raums"
+                    ],
+                    "No nickname was specified": [
+                        null,
+                        "Kein Spitzname festgelegt"
+                    ],
+                    "You are not allowed to create new rooms": [
+                        null,
+                        "Es ist Ihnen nicht erlaubt, neue Räume anzulegen"
+                    ],
+                    "Your nickname doesn't conform to this room's policies": [
+                        null,
+                        "Ungültiger Spitzname"
+                    ],
+                    "Your nickname is already taken": [
+                        null,
+                        "Ihre Spitzname existiert bereits."
+                    ],
+                    "This room does not (yet) exist": [
+                        null,
+                        "Dieser Raum existiert (noch) nicht"
+                    ],
+                    "This room has reached it's maximum number of occupants": [
+                        null,
+                        "Dieser Raum hat die maximale Mitgliederanzahl erreicht"
+                    ],
+                    "Topic set by %1$s to: %2$s": [
+                        null,
+                        "%1$s hat das Thema zu \"%2$s\" abgeändert"
+                    ],
+                    "This user is a moderator": [
+                        null,
+                        "Dieser Benutzer ist ein Moderator"
+                    ],
+                    "This user can send messages in this room": [
+                        null,
+                        "Dieser Benutzer kann Nachrichten in diesem Raum verschicken"
+                    ],
+                    "This user can NOT send messages in this room": [
+                        null,
+                        "Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"
+                    ],
+                    "Click to chat with this contact": [
+                        null,
+                        "Hier klicken um mit diesem Kontakt zu chatten"
+                    ],
+                    "Click to remove this contact": [
+                        null,
+                        "Hier klicken um diesen Kontakt zu entfernen"
+                    ],
+                    "Contact requests": [
+                        null,
+                        "Kontaktanfragen"
+                    ],
+                    "My contacts": [
+                        null,
+                        "Meine Kontakte"
+                    ],
+                    "Pending contacts": [
+                        null,
+                        "Unbestätigte Kontakte"
+                    ],
+                    "Custom status": [
+                        null,
+                        "Status-Nachricht"
+                    ],
+                    "Click to change your chat status": [
+                        null,
+                        "Klicken Sie, um ihrer Status to ändern"
+                    ],
+                    "Click here to write a custom status message": [
+                        null,
+                        "Klicken Sie hier, um ihrer Status-Nachricht to ändern"
+                    ],
+                    "online": [
+                        null,
+                        "online"
+                    ],
+                    "busy": [
+                        null,
+                        "beschäfticht"
+                    ],
+                    "away for long": [
+                        null,
+                        "länger abwesend"
+                    ],
+                    "away": [
+                        null,
+                        "abwesend"
+                    ],
+                    "I am %1$s": [
+                        null,
+                        "Ich bin %1$s"
+                    ],
+                    "Sign in": [
+                        null,
+                        "Anmelden"
+                    ],
+                    "XMPP/Jabber Username:": [
+                        null,
+                        "XMPP/Jabber Benutzername"
+                    ],
+                    "Password:": [
+                        null,
+                        "Passwort:"
+                    ],
+                    "Log In": [
+                        null,
+                        "Anmelden"
+                    ],
+                    "BOSH Service URL:": [
+                        null,
+                        "BOSH "
+                    ],
+                    "Connected": [
+                        null,
+                        "Verbunden"
+                    ],
+                    "Disconnected": [
+                        null,
+                        "Verbindung unterbrochen."
+                    ],
+                    "Error": [
+                        null,
+                        "Fehler"
+                    ],
+                    "Connecting": [
+                        null,
+                        "Verbindungsaufbau …"
+                    ],
+                    "Connection Failed": [
+                        null,
+                        "Entfernte Verbindung fehlgeschlagen"
+                    ],
+                    "Authenticating": [
+                        null,
+                        "Authentifizierung"
+                    ],
+                    "Authentication Failed": [
+                        null,
+                        "Authentifizierung gescheitert"
+                    ],
+                    "Disconnecting": [
+                        null,
+                        "Trenne Verbindung"
+                    ],
+                    "Attached": [
+                        null,
+                        "Angehängt"
+                    ],
+                    "Online Contacts": [
+                        null,
+                        "Online-Kontakte"
+                    ]
+                }
+            }
+        });
+        return factory(de);
+    });
+}(this, function (de) { 
+    return de; 
+}));

+ 19 - 0
locale/en/LC_MESSAGES/en.js

@@ -0,0 +1,19 @@
+(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;
+}));

+ 460 - 0
locale/es/LC_MESSAGES/converse.json

@@ -0,0 +1,460 @@
+{
+   "converse": {
+      "": {
+         "Project-Id-Version": "Converse.js 0.4",
+         "Report-Msgid-Bugs-To": "",
+         "POT-Creation-Date": "2013-06-01 23:03+0200",
+         "PO-Revision-Date": "2013-07-22 18:13-0400",
+         "Last-Translator": "Leonardo J. Caballero G. <leonardocaballero@gmail.com>",
+         "Language-Team": "Spanish",
+         "Language": "es",
+         "MIME-Version": "1.0",
+         "Content-Type": "text/plain; charset=ASCII",
+         "Content-Transfer-Encoding": "8bit",
+         "Plural-Forms": "nplurals=2; plural=(n != 1);",
+         "domain": "converse",
+         "lang": "es",
+         "plural_forms": "nplurals=2; plural=(n != 1);"
+      },
+      "Show this menu": [
+         null,
+         "Mostrar este menú"
+      ],
+      "Write in the third person": [
+         null,
+         "Escribir en tercera persona"
+      ],
+      "Remove messages": [
+         null,
+         "Eliminar mensajes"
+      ],
+      "Personal message": [
+         null,
+         "Mensaje personal"
+      ],
+      "Contacts": [
+         null,
+         "Contactos"
+      ],
+      "Online": [
+         null,
+         "En linea"
+      ],
+      "Busy": [
+         null,
+         "Ocupado"
+      ],
+      "Away": [
+         null,
+         "Ausente"
+      ],
+      "Offline": [
+         null,
+         "Desconectado"
+      ],
+      "Click to add new chat contacts": [
+         null,
+         "Haga clic para agregar nuevos contactos al chat"
+      ],
+      "Add a contact": [
+         null,
+         "Agregar un contacto"
+      ],
+      "Contact username": [
+         null,
+         "Nombre de usuario de contacto"
+      ],
+      "Add": [
+         null,
+         "Agregar"
+      ],
+      "Contact name": [
+         null,
+         "Nombre de contacto"
+      ],
+      "Search": [
+         null,
+         "Búsqueda"
+      ],
+      "No users found": [
+         null,
+         "Sin usuarios encontrados"
+      ],
+      "Click to add as a chat contact": [
+         null,
+         "Haga clic para agregar como un contacto de chat"
+      ],
+      "Click to open this room": [
+         null,
+         "Haga clic para abrir esta sala"
+      ],
+      "Show more information on this room": [
+         null,
+         "Mostrar mas información en esta sala"
+      ],
+      "Description:": [
+         null,
+         "Descripción"
+      ],
+      "Occupants:": [
+         null,
+         "Ocupantes:"
+      ],
+      "Features:": [
+         null,
+         "Características:"
+      ],
+      "Requires authentication": [
+         null,
+         "Autenticación requerida"
+      ],
+      "Hidden": [
+         null,
+         "Oculto"
+      ],
+      "Requires an invitation": [
+         null,
+         "Requiere una invitación"
+      ],
+      "Moderated": [
+         null,
+         "Moderado"
+      ],
+      "Non-anonymous": [
+         null,
+         "No usuario anónimo"
+      ],
+      "Open room": [
+         null,
+         "Abrir sala"
+      ],
+      "Permanent room": [
+         null,
+         "Sala permanente"
+      ],
+      "Public": [
+         null,
+         "Publico"
+      ],
+      "Semi-anonymous": [
+         null,
+         "Semi anónimo"
+      ],
+      "Temporary room": [
+         null,
+         "Sala temporal"
+      ],
+      "Unmoderated": [
+         null,
+         "Sin moderar"
+      ],
+      "Rooms": [
+         null,
+         "Salas"
+      ],
+      "Room name": [
+         null,
+         "Nombre de sala"
+      ],
+      "Nickname": [
+         null,
+         "Apodo"
+      ],
+      "Server": [
+         null,
+         "Servidor"
+      ],
+      "Join": [
+         null,
+         "Unirse"
+      ],
+      "Show rooms": [
+         null,
+         "Mostrar salas"
+      ],
+      "No rooms on %1$s": [
+         null,
+         "Sin salas en %1$s"
+      ],
+      "Rooms on %1$s": [
+         null,
+         "Salas en %1$s"
+      ],
+      "Set chatroom topic": [
+         null,
+         "Defina tema de sala de chat"
+      ],
+      "Kick user from chatroom": [
+         null,
+         "Expulsar usuario de sala de chat."
+      ],
+      "Ban user from chatroom": [
+         null,
+         "Bloquear usuario de sala de chat."
+      ],
+      "Message": [
+         null,
+         "Mensaje"
+      ],
+      "Save": [
+         null,
+         "Guardar"
+      ],
+      "Cancel": [
+         null,
+         "Cancelar"
+      ],
+      "An error occurred while trying to save the form.": [
+         null,
+         "Un error ocurrido mientras trataba de guardar el formulario."
+      ],
+      "This chatroom requires a password": [
+         null,
+         "Esta sala de chat requiere una contraseña."
+      ],
+      "Password: ": [
+         null,
+         "Contraseña: "
+      ],
+      "Submit": [
+         null,
+         "Enviar"
+      ],
+      "This room is not anonymous": [
+         null,
+         "Esta sala no es para usuarios anónimos"
+      ],
+      "This room now shows unavailable members": [
+         null,
+         "Esta sala ahora muestra los miembros no disponibles"
+      ],
+      "This room does not show unavailable members": [
+         null,
+         "Esta sala no muestra los miembros no disponibles"
+      ],
+      "Non-privacy-related room configuration has changed": [
+         null,
+         "Configuración de la sala para no relacionada con la privacidad ha sido cambiada"
+      ],
+      "Room logging is now enabled": [
+         null,
+         "El registro de la sala ahora está habilitada"
+      ],
+      "Room logging is now disabled": [
+         null,
+         "El registro de la sala ahora está deshabilitada"
+      ],
+      "This room is now non-anonymous": [
+         null,
+         "Esta sala ahora es para los usuarios no anónimos"
+      ],
+      "This room is now semi-anonymous": [
+         null,
+         "Esta sala ahora es para los usuarios semi-anónimos"
+      ],
+      "This room is now fully-anonymous": [
+         null,
+         "Esta sala ahora es para los usuarios completamente-anónimos"
+      ],
+      "A new room has been created": [
+         null,
+         "Una nueva sala ha sido creada"
+      ],
+      "Your nickname has been changed": [
+         null,
+         "Su apodo ha sido cambiado"
+      ],
+      "<strong>%1$s</strong> has been banned": [
+         null,
+         "<strong>%1$s</strong> ha sido prohibido"
+      ],
+      "<strong>%1$s</strong> has been kicked out": [
+         null,
+         "<strong>%1$s</strong> ha sido expulsado"
+      ],
+      "<strong>%1$s</strong> has been removed because of an affiliation change": [
+         null,
+         "<strong>%1$s</strong> ha sido eliminado debido a un cambio de afiliación"
+      ],
+      "<strong>%1$s</strong> has been removed for not being a member": [
+         null,
+         "<strong>%1$s</strong> ha sido eliminado debido a que no es miembro"
+      ],
+      "You have been banned from this room": [
+         null,
+         "Usted ha sido prohibido de esta sala"
+      ],
+      "You have been kicked from this room": [
+         null,
+         "Usted ha sido expulsado de esta sala"
+      ],
+      "You have been removed from this room because of an affiliation change": [
+         null,
+         "Usted ha sido eliminado de esta sala debido a un cambio de afiliación"
+      ],
+      "You have been removed from this room because the room has changed to members-only and you're not a member": [
+         null,
+         "Usted ha sido eliminado de esta sala debido a que la sala cambio su configuración a solo-miembros y usted no es un miembro"
+      ],
+      "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+         null,
+         "Usted ha sido eliminado de esta sala debido al servicio MUC (Multi-user chat) está apagado."
+      ],
+      "You are not on the member list of this room": [
+         null,
+         "Usted no está en la lista de miembros de esta sala"
+      ],
+      "No nickname was specified": [
+         null,
+         "Sin apodo especificado"
+      ],
+      "You are not allowed to create new rooms": [
+         null,
+         "A usted no se le permite crear nuevas salas"
+      ],
+      "Your nickname doesn't conform to this room's policies": [
+         null,
+         "Su apodo no se ajusta a la política de esta sala"
+      ],
+      "Your nickname is already taken": [
+         null,
+         "Su apodo ya ha sido tomando por otro usuario"
+      ],
+      "This room does not (yet) exist": [
+         null,
+         "Esta sala (aún) no existe"
+      ],
+      "This room has reached it's maximum number of occupants": [
+         null,
+         "Esta sala ha alcanzado su número máximo de ocupantes"
+      ],
+      "Topic set by %1$s to: %2$s": [
+         null,
+         "Tema fijado por %1$s a: %2$s"
+      ],
+      "This user is a moderator": [
+         null,
+         "Este usuario es un moderador"
+      ],
+      "This user can send messages in this room": [
+         null,
+         "Este usuario puede enviar mensajes en esta sala"
+      ],
+      "This user can NOT send messages in this room": [
+         null,
+         "Este usuario NO puede enviar mensajes en esta"
+      ],
+      "Click to chat with this contact": [
+         null,
+         "Haga clic para conversar con este contacto"
+      ],
+      "Click to remove this contact": [
+         null,
+         "Haga clic para eliminar este contacto"
+      ],
+      "Contact requests": [
+         null,
+         "Solicitudes de contacto"
+      ],
+      "My contacts": [
+         null,
+         "Mi contactos"
+      ],
+      "Pending contacts": [
+         null,
+         "Contactos pendientes"
+      ],
+      "Custom status": [
+         null,
+         "Personalice estatus"
+      ],
+      "Click to change your chat status": [
+         null,
+         "Haga clic para cambiar su estatus de chat"
+      ],
+      "Click here to write a custom status message": [
+         null,
+         "Haga clic para escribir un mensaje de estatus personalizado"
+      ],
+      "online": [
+         null,
+         "en linea"
+      ],
+      "busy": [
+         null,
+         "ocupado"
+      ],
+      "away for long": [
+         null,
+         "lejos por mucho tiempo"
+      ],
+      "away": [
+         null,
+         "ausente"
+      ],
+      "I am %1$s": [
+         null,
+         "Yo soy %1$s"
+      ],
+      "Sign in": [
+         null,
+         "Registro"
+      ],
+      "XMPP/Jabber Username:": [
+         null,
+         "Nombre de usuario XMPP/Jabber"
+      ],
+      "Password:": [
+         null,
+         "Contraseña:"
+      ],
+      "Log In": [
+         null,
+         "Iniciar sesión"
+      ],
+      "BOSH Service URL:": [
+         null,
+         "URL del servicio BOSH:"
+      ],
+      "Connected": [
+         null,
+         "Conectado"
+      ],
+      "Disconnected": [
+         null,
+         "Desconectado"
+      ],
+      "Error": [
+         null,
+         "Error"
+      ],
+      "Connecting": [
+         null,
+         "Conectando"
+      ],
+      "Connection Failed": [
+         null,
+         "Conexión fallo"
+      ],
+      "Authenticating": [
+         null,
+         "Autenticando"
+      ],
+      "Authentication Failed": [
+         null,
+         "Autenticación fallo"
+      ],
+      "Disconnecting": [
+         null,
+         "Desconectando"
+      ],
+      "Attached": [
+         null,
+         "Adjuntado"
+      ],
+      "Online Contacts": [
+         null,
+         "Contactos en linea"
+      ]
+   }
+}

+ 493 - 0
locale/es/LC_MESSAGES/converse.po

@@ -0,0 +1,493 @@
+# Spanish translations for Converse.js package.
+# Copyright (C) 2013 Jan-Carel Brand
+# This file is distributed under the same license as the Converse.js package.
+# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: Converse.js 0.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-06-01 23:03+0200\n"
+"PO-Revision-Date: 2013-07-22 18:13-0400\n"
+"Last-Translator: Leonardo J. Caballero G. <leonardocaballero@gmail.com>\n"
+"Language-Team: ES <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"plural_forms: nplurals=2; plural=(n != 1);\n"
+"Language: es\n"
+"lang: es\n"
+"Language-Code: es\n"
+"Language-Name: Español\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: converse\n"
+"domain: converse\n"
+"X-Is-Fallback-For: es-ar es-bo es-cl es-co es-cr es-do es-ec es-es es-sv es-gt es-hn es-mx es-ni es-pa es-py es-pe es-pr es-us es-uy es-ve\n"
+
+#: converse.js:397
+#: converse.js:1128
+msgid "Show this menu"
+msgstr "Mostrar este menú"
+
+#: converse.js:398
+#: converse.js:1129
+msgid "Write in the third person"
+msgstr "Escribir en tercera persona"
+
+#: converse.js:399
+#: converse.js:1133
+msgid "Remove messages"
+msgstr "Eliminar mensajes"
+
+#: converse.js:539
+msgid "Personal message"
+msgstr "Mensaje personal"
+
+#: converse.js:613
+msgid "Contacts"
+msgstr "Contactos"
+
+#: converse.js:618
+msgid "Online"
+msgstr "En linea"
+
+#: converse.js:619
+msgid "Busy"
+msgstr "Ocupado"
+
+#: converse.js:620
+msgid "Away"
+msgstr "Ausente"
+
+#: converse.js:621
+msgid "Offline"
+msgstr "Desconectado"
+
+#: converse.js:628
+msgid "Click to add new chat contacts"
+msgstr "Haga clic para agregar nuevos contactos al chat"
+
+#: converse.js:628
+msgid "Add a contact"
+msgstr "Agregar un contacto"
+
+#: converse.js:637
+msgid "Contact username"
+msgstr "Nombre de usuario de contacto"
+
+#: converse.js:638
+msgid "Add"
+msgstr "Agregar"
+
+#: converse.js:646
+msgid "Contact name"
+msgstr "Nombre de contacto"
+
+#: converse.js:647
+msgid "Search"
+msgstr "Búsqueda"
+
+#: converse.js:682
+msgid "No users found"
+msgstr "Sin usuarios encontrados"
+
+#: converse.js:689
+msgid "Click to add as a chat contact"
+msgstr "Haga clic para agregar como un contacto de chat"
+
+#: converse.js:753
+msgid "Click to open this room"
+msgstr "Haga clic para abrir esta sala"
+
+#: converse.js:755
+msgid "Show more information on this room"
+msgstr "Mostrar mas información en esta sala"
+
+#: converse.js:760
+msgid "Description:"
+msgstr "Descripción"
+
+#: converse.js:761
+msgid "Occupants:"
+msgstr "Ocupantes:"
+
+#: converse.js:762
+msgid "Features:"
+msgstr "Características:"
+
+#: converse.js:764
+msgid "Requires authentication"
+msgstr "Autenticación requerida"
+
+#: converse.js:767
+msgid "Hidden"
+msgstr "Oculto"
+
+#: converse.js:770
+msgid "Requires an invitation"
+msgstr "Requiere una invitación"
+
+#: converse.js:773
+msgid "Moderated"
+msgstr "Moderado"
+
+#: converse.js:776
+msgid "Non-anonymous"
+msgstr "No usuario anónimo"
+
+#: converse.js:779
+msgid "Open room"
+msgstr "Abrir sala"
+
+#: converse.js:782
+msgid "Permanent room"
+msgstr "Sala permanente"
+
+#: converse.js:785
+msgid "Public"
+msgstr "Publico"
+
+#: converse.js:788
+msgid "Semi-anonymous"
+msgstr "Semi anónimo"
+
+#: converse.js:791
+msgid "Temporary room"
+msgstr "Sala temporal"
+
+#: converse.js:794
+msgid "Unmoderated"
+msgstr "Sin moderar"
+
+#: converse.js:800
+msgid "Rooms"
+msgstr "Salas"
+
+#: converse.js:804
+msgid "Room name"
+msgstr "Nombre de sala"
+
+#: converse.js:805
+msgid "Nickname"
+msgstr "Apodo"
+
+#: converse.js:806
+msgid "Server"
+msgstr "Servidor"
+
+#: converse.js:807
+msgid "Join"
+msgstr "Unirse"
+
+#: converse.js:808
+msgid "Show rooms"
+msgstr "Mostrar salas"
+
+#. For translators: %1$s is a variable and will be replaced with the XMPP server name
+#: converse.js:841
+msgid "No rooms on %1$s"
+msgstr "Sin salas en %1$s"
+
+#. For translators: %1$s is a variable and will be
+#. replaced with the XMPP server name
+#: converse.js:856
+msgid "Rooms on %1$s"
+msgstr "Salas en %1$s"
+
+#: converse.js:1130
+msgid "Set chatroom topic"
+msgstr "Defina tema de sala de chat"
+
+#: converse.js:1131
+msgid "Kick user from chatroom"
+msgstr "Expulsar usuario de sala de chat."
+
+#: converse.js:1132
+msgid "Ban user from chatroom"
+msgstr "Prohibir usuario de sala de chat."
+
+#: converse.js:1159
+msgid "Message"
+msgstr "Mensaje"
+
+#: converse.js:1273
+#: converse.js:2318
+msgid "Save"
+msgstr "Guardar"
+
+#: converse.js:1274
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: converse.js:1321
+msgid "An error occurred while trying to save the form."
+msgstr "Un error ocurrido mientras trataba de guardar el formulario."
+
+#: converse.js:1367
+msgid "This chatroom requires a password"
+msgstr "Esta sala de chat requiere una contraseña."
+
+#: converse.js:1368
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: converse.js:1369
+msgid "Submit"
+msgstr "Enviar"
+
+#: converse.js:1383
+msgid "This room is not anonymous"
+msgstr "Esta sala no es para usuarios anónimos"
+
+#: converse.js:1384
+msgid "This room now shows unavailable members"
+msgstr "Esta sala ahora muestra los miembros no disponibles"
+
+#: converse.js:1385
+msgid "This room does not show unavailable members"
+msgstr "Esta sala no muestra los miembros no disponibles"
+
+#: converse.js:1386
+msgid "Non-privacy-related room configuration has changed"
+msgstr "Configuración de la sala para no relacionada con la privacidad ha sido cambiada"
+
+#: converse.js:1387
+msgid "Room logging is now enabled"
+msgstr "El registro de la sala ahora está habilitada"
+
+#: converse.js:1388
+msgid "Room logging is now disabled"
+msgstr "El registro de la sala ahora está deshabilitada"
+
+#: converse.js:1389
+msgid "This room is now non-anonymous"
+msgstr "Esta sala ahora es para los usuarios no anónimos"
+
+#: converse.js:1390
+msgid "This room is now semi-anonymous"
+msgstr "Esta sala ahora es para los usuarios semi-anónimos"
+
+#: converse.js:1391
+msgid "This room is now fully-anonymous"
+msgstr "Esta sala ahora es para los usuarios completamente-anónimos"
+
+#: converse.js:1392
+msgid "A new room has been created"
+msgstr "Una nueva sala ha sido creada"
+
+#: converse.js:1393
+msgid "Your nickname has been changed"
+msgstr "Su apodo ha sido cambiado"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been banned
+#: converse.js:1400
+msgid "<strong>%1$s</strong> has been banned"
+msgstr "<strong>%1$s</strong> ha sido prohibido"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been kicked out
+#: converse.js:1404
+msgid "<strong>%1$s</strong> has been kicked out"
+msgstr "<strong>%1$s</strong> ha sido expulsado"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
+#: converse.js:1408
+msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
+msgstr "<strong>%1$s</strong> ha sido eliminado debido a un cambio de afiliación"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed for not being a member
+#: converse.js:1412
+msgid "<strong>%1$s</strong> has been removed for not being a member"
+msgstr "<strong>%1$s</strong> ha sido eliminado debido a que no es miembro"
+
+#: converse.js:1416
+#: converse.js:1478
+msgid "You have been banned from this room"
+msgstr "Usted ha sido prohibido de esta sala"
+
+#: converse.js:1417
+msgid "You have been kicked from this room"
+msgstr "Usted ha sido expulsado de esta sala"
+
+#: converse.js:1418
+msgid "You have been removed from this room because of an affiliation change"
+msgstr "Usted ha sido eliminado de esta sala debido a un cambio de afiliación"
+
+#: converse.js:1419
+msgid "You have been removed from this room because the room has changed to members-only and you're not a member"
+msgstr "Usted ha sido eliminado de esta sala debido a que la sala cambio su configuración a solo-miembros y usted no es un miembro"
+
+#: converse.js:1420
+msgid "You have been removed from this room because the MUC (Multi-user chat) service is being shut down."
+msgstr "Usted ha sido eliminado de esta sala debido al servicio MUC (Multi-user chat) está apagado."
+
+#: converse.js:1476
+msgid "You are not on the member list of this room"
+msgstr "Usted no está en la lista de miembros de esta sala"
+
+#: converse.js:1482
+msgid "No nickname was specified"
+msgstr "Sin apodo especificado"
+
+#: converse.js:1486
+msgid "You are not allowed to create new rooms"
+msgstr "A usted no se le permite crear nuevas salas"
+
+#: converse.js:1488
+msgid "Your nickname doesn't conform to this room's policies"
+msgstr "Su apodo no se ajusta a la política de esta sala"
+
+#: converse.js:1490
+msgid "Your nickname is already taken"
+msgstr "Su apodo ya ha sido tomando por otro usuario"
+
+#: converse.js:1492
+msgid "This room does not (yet) exist"
+msgstr "Esta sala (aún) no existe"
+
+#: converse.js:1494
+msgid "This room has reached it's maximum number of occupants"
+msgstr "Esta sala ha alcanzado su número máximo de ocupantes"
+
+#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
+#. Example: Topic set by JC Brand to: Hello World!
+#: converse.js:1571
+msgid "Topic set by %1$s to: %2$s"
+msgstr "Tema fijado por %1$s a: %2$s"
+
+#: converse.js:1587
+msgid "This user is a moderator"
+msgstr "Este usuario es un moderador"
+
+#: converse.js:1590
+msgid "This user can send messages in this room"
+msgstr "Este usuario puede enviar mensajes en esta sala"
+
+#: converse.js:1593
+msgid "This user can NOT send messages in this room"
+msgstr "Este usuario NO puede enviar mensajes en esta"
+
+#: converse.js:1796
+msgid "Click to chat with this contact"
+msgstr "Haga clic para conversar con este contacto"
+
+#: converse.js:1797
+#: converse.js:1801
+msgid "Click to remove this contact"
+msgstr "Haga clic para eliminar este contacto"
+
+#: converse.js:2163
+msgid "Contact requests"
+msgstr "Solicitudes de contacto"
+
+#: converse.js:2164
+msgid "My contacts"
+msgstr "Mi contactos"
+
+#: converse.js:2165
+msgid "Pending contacts"
+msgstr "Contactos pendientes"
+
+#: converse.js:2317
+msgid "Custom status"
+msgstr "Personalice estatus"
+
+#: converse.js:2323
+msgid "Click to change your chat status"
+msgstr "Haga clic para cambiar su estatus de chat"
+
+#: converse.js:2326
+msgid "Click here to write a custom status message"
+msgstr "Haga clic para escribir un mensaje de estatus personalizado"
+
+#: converse.js:2355
+#: converse.js:2363
+msgid "online"
+msgstr "en linea"
+
+#: converse.js:2357
+msgid "busy"
+msgstr "ocupado"
+
+#: converse.js:2359
+msgid "away for long"
+msgstr "lejos por mucho tiempo"
+
+#: converse.js:2361
+msgid "away"
+msgstr "ausente"
+
+#. For translators: the %1$s part gets replaced with the status
+#. Example, I am online
+#: converse.js:2375
+#: converse.js:2409
+msgid "I am %1$s"
+msgstr "Yo soy %1$s"
+
+#: converse.js:2480
+msgid "Sign in"
+msgstr "Registro"
+
+#: converse.js:2483
+msgid "XMPP/Jabber Username:"
+msgstr "Nombre de usuario XMPP/Jabber"
+
+#: converse.js:2485
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: converse.js:2487
+msgid "Log In"
+msgstr "Iniciar sesión"
+
+#: converse.js:2491
+msgid "BOSH Service URL:"
+msgstr "URL del servicio BOSH:"
+
+#: converse.js:2503
+msgid "Connected"
+msgstr "Conectado"
+
+#: converse.js:2507
+msgid "Disconnected"
+msgstr "Desconectado"
+
+#: converse.js:2511
+msgid "Error"
+msgstr "Error"
+
+#: converse.js:2513
+msgid "Connecting"
+msgstr "Conectando"
+
+#: converse.js:2516
+msgid "Connection Failed"
+msgstr "Conexión fallo"
+
+#: converse.js:2518
+msgid "Authenticating"
+msgstr "Autenticando"
+
+#: converse.js:2521
+msgid "Authentication Failed"
+msgstr "Autenticación fallo"
+
+#: converse.js:2523
+msgid "Disconnecting"
+msgstr "Desconectando"
+
+#: converse.js:2525
+msgid "Attached"
+msgstr "Adjuntado"
+
+#: converse.js:2656
+msgid "Online Contacts"
+msgstr "Contactos en linea"
+

+ 459 - 0
locale/es/LC_MESSAGES/es.js

@@ -0,0 +1,459 @@
+(function (root, factory) {
+    define("es", ['jed'], function () {
+        var de = new Jed({
+            "domain": "converse",
+            "locale_data": {
+                "converse": {
+                    "": {
+                        "domain": "converse",
+                        "lang": "es",
+                        "plural_forms": "nplurals=2; plural=(n != 1);"
+                    },
+                    "Show this menu": [
+                        null,
+                        "Mostrar este menú"
+                    ],
+                    "Write in the third person": [
+                        null,
+                        "Escribir en tercera persona"
+                    ],
+                    "Remove messages": [
+                        null,
+                        "Eliminar mensajes"
+                    ],
+                    "Personal message": [
+                        null,
+                        "Mensaje personal"
+                    ],
+                    "Contacts": [
+                        null,
+                        "Contactos"
+                    ],
+                    "Online": [
+                        null,
+                        "En linea"
+                    ],
+                    "Busy": [
+                        null,
+                        "Ocupado"
+                    ],
+                    "Away": [
+                        null,
+                        "Ausente"
+                    ],
+                    "Offline": [
+                        null,
+                        "Desconectado"
+                    ],
+                    "Click to add new chat contacts": [
+                        null,
+                        "Haga clic para agregar nuevos contactos al chat"
+                    ],
+                    "Add a contact": [
+                        null,
+                        "Agregar un contacto"
+                    ],
+                    "Contact username": [
+                        null,
+                        "Nombre de usuario de contacto"
+                    ],
+                    "Add": [
+                        null,
+                        "Agregar"
+                    ],
+                    "Contact name": [
+                        null,
+                        "Nombre de contacto"
+                    ],
+                    "Search": [
+                        null,
+                        "Búsqueda"
+                    ],
+                    "No users found": [
+                        null,
+                        "Sin usuarios encontrados"
+                    ],
+                    "Click to add as a chat contact": [
+                        null,
+                        "Haga clic para agregar como un contacto de chat"
+                    ],
+                    "Click to open this room": [
+                        null,
+                        "Haga clic para abrir esta sala"
+                    ],
+                    "Show more information on this room": [
+                        null,
+                        "Mostrar mas información en esta sala"
+                    ],
+                    "Description:": [
+                        null,
+                        "Descripción"
+                    ],
+                    "Occupants:": [
+                        null,
+                        "Ocupantes:"
+                    ],
+                    "Features:": [
+                        null,
+                        "Características:"
+                    ],
+                    "Requires authentication": [
+                        null,
+                        "Autenticación requerida"
+                    ],
+                    "Hidden": [
+                        null,
+                        "Oculto"
+                    ],
+                    "Requires an invitation": [
+                        null,
+                        "Requiere una invitación"
+                    ],
+                    "Moderated": [
+                        null,
+                        "Moderado"
+                    ],
+                    "Non-anonymous": [
+                        null,
+                        "No usuario anónimo"
+                    ],
+                    "Open room": [
+                        null,
+                        "Abrir sala"
+                    ],
+                    "Permanent room": [
+                        null,
+                        "Sala permanente"
+                    ],
+                    "Public": [
+                        null,
+                        "Publico"
+                    ],
+                    "Semi-anonymous": [
+                        null,
+                        "Semi anónimo"
+                    ],
+                    "Temporary room": [
+                        null,
+                        "Sala temporal"
+                    ],
+                    "Unmoderated": [
+                        null,
+                        "Sin moderar"
+                    ],
+                    "Rooms": [
+                        null,
+                        "Salas"
+                    ],
+                    "Room name": [
+                        null,
+                        "Nombre de sala"
+                    ],
+                    "Nickname": [
+                        null,
+                        "Apodo"
+                    ],
+                    "Server": [
+                        null,
+                        "Servidor"
+                    ],
+                    "Join": [
+                        null,
+                        "Unirse"
+                    ],
+                    "Show rooms": [
+                        null,
+                        "Mostrar salas"
+                    ],
+                    "No rooms on %1$s": [
+                        null,
+                        "Sin salas en %1$s"
+                    ],
+                    "Rooms on %1$s": [
+                        null,
+                        "Salas en %1$s"
+                    ],
+                    "Set chatroom topic": [
+                        null,
+                        "Defina tema de sala de chat"
+                    ],
+                    "Kick user from chatroom": [
+                        null,
+                        "Expulsar usuario de sala de chat."
+                    ],
+                    "Ban user from chatroom": [
+                        null,
+                        "Prohibir usuario de sala de chat."
+                    ],
+                    "Message": [
+                        null,
+                        "Mensaje"
+                    ],
+                    "Save": [
+                        null,
+                        "Guardar"
+                    ],
+                    "Cancel": [
+                        null,
+                        "Cancelar"
+                    ],
+                    "An error occurred while trying to save the form.": [
+                        null,
+                        "Un error ocurrido mientras trataba de guardar el formulario."
+                    ],
+                    "This chatroom requires a password": [
+                        null,
+                        "Esta sala de chat requiere una contraseña."
+                    ],
+                    "Password: ": [
+                        null,
+                        "Contraseña: "
+                    ],
+                    "Submit": [
+                        null,
+                        "Enviar"
+                    ],
+                    "This room is not anonymous": [
+                        null,
+                        "Esta sala no es para usuarios anónimos"
+                    ],
+                    "This room now shows unavailable members": [
+                        null,
+                        "Esta sala ahora muestra los miembros no disponibles"
+                    ],
+                    "This room does not show unavailable members": [
+                        null,
+                        "Esta sala no muestra los miembros no disponibles"
+                    ],
+                    "Non-privacy-related room configuration has changed": [
+                        null,
+                        "Configuración de la sala para no relacionada con la privacidad ha sido cambiada"
+                    ],
+                    "Room logging is now enabled": [
+                        null,
+                        "El registro de la sala ahora está habilitada"
+                    ],
+                    "Room logging is now disabled": [
+                        null,
+                        "El registro de la sala ahora está deshabilitada"
+                    ],
+                    "This room is now non-anonymous": [
+                        null,
+                        "Esta sala ahora es para los usuarios no anónimos"
+                    ],
+                    "This room is now semi-anonymous": [
+                        null,
+                        "Esta sala ahora es para los usuarios semi-anónimos"
+                    ],
+                    "This room is now fully-anonymous": [
+                        null,
+                        "Esta sala ahora es para los usuarios completamente-anónimos"
+                    ],
+                    "A new room has been created": [
+                        null,
+                        "Una nueva sala ha sido creada"
+                    ],
+                    "Your nickname has been changed": [
+                        null,
+                        "Su apodo ha sido cambiado"
+                    ],
+                    "<strong>%1$s</strong> has been banned": [
+                        null,
+                        "<strong>%1$s</strong> ha sido prohibido"
+                    ],
+                    "<strong>%1$s</strong> has been kicked out": [
+                        null,
+                        "<strong>%1$s</strong> ha sido expulsado"
+                    ],
+                    "<strong>%1$s</strong> has been removed because of an affiliation change": [
+                        null,
+                        "<strong>%1$s</strong> ha sido eliminado debido a un cambio de afiliación"
+                    ],
+                    "<strong>%1$s</strong> has been removed for not being a member": [
+                        null,
+                        "<strong>%1$s</strong> ha sido eliminado debido a que no es miembro"
+                    ],
+                    "You have been banned from this room": [
+                        null,
+                        "Usted ha sido prohibido de esta sala"
+                    ],
+                    "You have been kicked from this room": [
+                        null,
+                        "Usted ha sido expulsado de esta sala"
+                    ],
+                    "You have been removed from this room because of an affiliation change": [
+                        null,
+                        "Usted ha sido eliminado de esta sala debido a un cambio de afiliación"
+                    ],
+                    "You have been removed from this room because the room has changed to members-only and you're not a member": [
+                        null,
+                        "Usted ha sido eliminado de esta sala debido a que la sala cambio su configuración a solo-miembros y usted no es un miembro"
+                    ],
+                    "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+                        null,
+                        "Usted ha sido eliminado de esta sala debido al servicio MUC (Multi-user chat) está apagado."
+                    ],
+                    "You are not on the member list of this room": [
+                        null,
+                        "Usted no está en la lista de miembros de esta sala"
+                    ],
+                    "No nickname was specified": [
+                        null,
+                        "Sin apodo especificado"
+                    ],
+                    "You are not allowed to create new rooms": [
+                        null,
+                        "A usted no se le permite crear nuevas salas"
+                    ],
+                    "Your nickname doesn't conform to this room's policies": [
+                        null,
+                        "Su apodo no se ajusta a la política de esta sala"
+                    ],
+                    "Your nickname is already taken": [
+                        null,
+                        "Su apodo ya ha sido tomando por otro usuario"
+                    ],
+                    "This room does not (yet) exist": [
+                        null,
+                        "Esta sala (aún) no existe"
+                    ],
+                    "This room has reached it's maximum number of occupants": [
+                        null,
+                        "Esta sala ha alcanzado su número máximo de ocupantes"
+                    ],
+                    "Topic set by %1$s to: %2$s": [
+                        null,
+                        "Tema fijado por %1$s a: %2$s"
+                    ],
+                    "This user is a moderator": [
+                        null,
+                        "Este usuario es un moderador"
+                    ],
+                    "This user can send messages in this room": [
+                        null,
+                        "Este usuario puede enviar mensajes en esta sala"
+                    ],
+                    "This user can NOT send messages in this room": [
+                        null,
+                        "Este usuario NO puede enviar mensajes en esta"
+                    ],
+                    "Click to chat with this contact": [
+                        null,
+                        "Haga clic para conversar con este contacto"
+                    ],
+                    "Click to remove this contact": [
+                        null,
+                        "Haga clic para eliminar este contacto"
+                    ],
+                    "Contact requests": [
+                        null,
+                        "Solicitudes de contacto"
+                    ],
+                    "My contacts": [
+                        null,
+                        "Mi contactos"
+                    ],
+                    "Pending contacts": [
+                        null,
+                        "Contactos pendientes"
+                    ],
+                    "Custom status": [
+                        null,
+                        "Personalice estatus"
+                    ],
+                    "Click to change your chat status": [
+                        null,
+                        "Haga clic para cambiar su estatus de chat"
+                    ],
+                    "Click here to write a custom status message": [
+                        null,
+                        "Haga clic para escribir un mensaje de estatus personalizado"
+                    ],
+                    "online": [
+                        null,
+                        "en linea"
+                    ],
+                    "busy": [
+                        null,
+                        "ocupado"
+                    ],
+                    "away for long": [
+                        null,
+                        "lejos por mucho tiempo"
+                    ],
+                    "away": [
+                        null,
+                        "ausente"
+                    ],
+                    "I am %1$s": [
+                        null,
+                        "Yo soy %1$s"
+                    ],
+                    "Sign in": [
+                        null,
+                        "Registro"
+                    ],
+                    "XMPP/Jabber Username:": [
+                        null,
+                        "Nombre de usuario XMPP/Jabber"
+                    ],
+                    "Password:": [
+                        null,
+                        "Contraseña:"
+                    ],
+                    "Log In": [
+                        null,
+                        "Iniciar sesión"
+                    ],
+                    "BOSH Service URL:": [
+                        null,
+                        "URL del servicio BOSH:"
+                    ],
+                    "Connected": [
+                        null,
+                        "Conectado"
+                    ],
+                    "Disconnected": [
+                        null,
+                        "Desconectado"
+                    ],
+                    "Error": [
+                        null,
+                        "Error"
+                    ],
+                    "Connecting": [
+                        null,
+                        "Conectando"
+                    ],
+                    "Connection Failed": [
+                        null,
+                        "Conexión fallo"
+                    ],
+                    "Authenticating": [
+                        null,
+                        "Autenticando"
+                    ],
+                    "Authentication Failed": [
+                        null,
+                        "Autenticación fallo"
+                    ],
+                    "Disconnecting": [
+                        null,
+                        "Desconectando"
+                    ],
+                    "Attached": [
+                        null,
+                        "Adjuntado"
+                    ],
+                    "Online Contacts": [
+                        null,
+                        "Contactos en linea"
+                    ]
+                }
+            }
+        });
+        return factory(de);
+    });
+}(this, function (de) { 
+    return de; 
+}));

+ 457 - 0
locale/hu/LC_MESSAGES/converse.json

@@ -0,0 +1,457 @@
+{
+   "converse": {
+      "": {
+         "Project-Id-Version": "Converse.js 0.4",
+         "Report-Msgid-Bugs-To": "",
+         "POT-Creation-Date": "2013-06-01 23:03+0200",
+         "PO-Revision-Date": "2013-06-02 19:45+0200",
+         "Last-Translator": "JC Brand <jc@opkode.com>",
+         "Language-Team": "Hungarian",
+         "Language": "hu",
+         "MIME-Version": "1.0",
+         "Content-Type": "text/plain; charset=ASCII",
+         "Content-Transfer-Encoding": "8bit",
+         "Plural-Forms": "nplurals=2; plural=(n != 1);"
+      },
+      "Show this menu": [
+         null,
+         ""
+      ],
+      "Write in the third person": [
+         null,
+         ""
+      ],
+      "Remove messages": [
+         null,
+         ""
+      ],
+      "Personal message": [
+         null,
+         ""
+      ],
+      "Contacts": [
+         null,
+         ""
+      ],
+      "Online": [
+         null,
+         ""
+      ],
+      "Busy": [
+         null,
+         ""
+      ],
+      "Away": [
+         null,
+         ""
+      ],
+      "Offline": [
+         null,
+         ""
+      ],
+      "Click to add new chat contacts": [
+         null,
+         ""
+      ],
+      "Add a contact": [
+         null,
+         ""
+      ],
+      "Contact username": [
+         null,
+         ""
+      ],
+      "Add": [
+         null,
+         ""
+      ],
+      "Contact name": [
+         null,
+         ""
+      ],
+      "Search": [
+         null,
+         ""
+      ],
+      "No users found": [
+         null,
+         ""
+      ],
+      "Click to add as a chat contact": [
+         null,
+         ""
+      ],
+      "Click to open this room": [
+         null,
+         ""
+      ],
+      "Show more information on this room": [
+         null,
+         ""
+      ],
+      "Description:": [
+         null,
+         ""
+      ],
+      "Occupants:": [
+         null,
+         ""
+      ],
+      "Features:": [
+         null,
+         ""
+      ],
+      "Requires authentication": [
+         null,
+         ""
+      ],
+      "Hidden": [
+         null,
+         ""
+      ],
+      "Requires an invitation": [
+         null,
+         ""
+      ],
+      "Moderated": [
+         null,
+         ""
+      ],
+      "Non-anonymous": [
+         null,
+         ""
+      ],
+      "Open room": [
+         null,
+         ""
+      ],
+      "Permanent room": [
+         null,
+         ""
+      ],
+      "Public": [
+         null,
+         ""
+      ],
+      "Semi-anonymous": [
+         null,
+         ""
+      ],
+      "Temporary room": [
+         null,
+         ""
+      ],
+      "Unmoderated": [
+         null,
+         ""
+      ],
+      "Rooms": [
+         null,
+         ""
+      ],
+      "Room name": [
+         null,
+         ""
+      ],
+      "Nickname": [
+         null,
+         ""
+      ],
+      "Server": [
+         null,
+         ""
+      ],
+      "Join": [
+         null,
+         ""
+      ],
+      "Show rooms": [
+         null,
+         ""
+      ],
+      "No rooms on %1$s": [
+         null,
+         ""
+      ],
+      "Rooms on %1$s": [
+         null,
+         ""
+      ],
+      "Set chatroom topic": [
+         null,
+         ""
+      ],
+      "Kick user from chatroom": [
+         null,
+         ""
+      ],
+      "Ban user from chatroom": [
+         null,
+         ""
+      ],
+      "Message": [
+         null,
+         ""
+      ],
+      "Save": [
+         null,
+         ""
+      ],
+      "Cancel": [
+         null,
+         ""
+      ],
+      "An error occurred while trying to save the form.": [
+         null,
+         ""
+      ],
+      "This chatroom requires a password": [
+         null,
+         ""
+      ],
+      "Password: ": [
+         null,
+         ""
+      ],
+      "Submit": [
+         null,
+         ""
+      ],
+      "This room is not anonymous": [
+         null,
+         ""
+      ],
+      "This room now shows unavailable members": [
+         null,
+         ""
+      ],
+      "This room does not show unavailable members": [
+         null,
+         ""
+      ],
+      "Non-privacy-related room configuration has changed": [
+         null,
+         ""
+      ],
+      "Room logging is now enabled": [
+         null,
+         ""
+      ],
+      "Room logging is now disabled": [
+         null,
+         ""
+      ],
+      "This room is now non-anonymous": [
+         null,
+         ""
+      ],
+      "This room is now semi-anonymous": [
+         null,
+         ""
+      ],
+      "This room is now fully-anonymous": [
+         null,
+         ""
+      ],
+      "A new room has been created": [
+         null,
+         ""
+      ],
+      "Your nickname has been changed": [
+         null,
+         ""
+      ],
+      "<strong>%1$s</strong> has been banned": [
+         null,
+         ""
+      ],
+      "<strong>%1$s</strong> has been kicked out": [
+         null,
+         ""
+      ],
+      "<strong>%1$s</strong> has been removed because of an affiliation change": [
+         null,
+         ""
+      ],
+      "<strong>%1$s</strong> has been removed for not being a member": [
+         null,
+         ""
+      ],
+      "You have been banned from this room": [
+         null,
+         ""
+      ],
+      "You have been kicked from this room": [
+         null,
+         ""
+      ],
+      "You have been removed from this room because of an affiliation change": [
+         null,
+         ""
+      ],
+      "You have been removed from this room because the room has changed to members-only and you're not a member": [
+         null,
+         ""
+      ],
+      "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+         null,
+         ""
+      ],
+      "You are not on the member list of this room": [
+         null,
+         ""
+      ],
+      "No nickname was specified": [
+         null,
+         ""
+      ],
+      "You are not allowed to create new rooms": [
+         null,
+         ""
+      ],
+      "Your nickname doesn't conform to this room's policies": [
+         null,
+         ""
+      ],
+      "Your nickname is already taken": [
+         null,
+         ""
+      ],
+      "This room does not (yet) exist": [
+         null,
+         ""
+      ],
+      "This room has reached it's maximum number of occupants": [
+         null,
+         ""
+      ],
+      "Topic set by %1$s to: %2$s": [
+         null,
+         ""
+      ],
+      "This user is a moderator": [
+         null,
+         ""
+      ],
+      "This user can send messages in this room": [
+         null,
+         ""
+      ],
+      "This user can NOT send messages in this room": [
+         null,
+         ""
+      ],
+      "Click to chat with this contact": [
+         null,
+         ""
+      ],
+      "Click to remove this contact": [
+         null,
+         ""
+      ],
+      "Contact requests": [
+         null,
+         ""
+      ],
+      "My contacts": [
+         null,
+         ""
+      ],
+      "Pending contacts": [
+         null,
+         ""
+      ],
+      "Custom status": [
+         null,
+         ""
+      ],
+      "Click to change your chat status": [
+         null,
+         ""
+      ],
+      "Click here to write a custom status message": [
+         null,
+         ""
+      ],
+      "online": [
+         null,
+         ""
+      ],
+      "busy": [
+         null,
+         ""
+      ],
+      "away for long": [
+         null,
+         ""
+      ],
+      "away": [
+         null,
+         ""
+      ],
+      "I am %1$s": [
+         null,
+         ""
+      ],
+      "Sign in": [
+         null,
+         ""
+      ],
+      "XMPP/Jabber Username:": [
+         null,
+         ""
+      ],
+      "Password:": [
+         null,
+         ""
+      ],
+      "Log In": [
+         null,
+         ""
+      ],
+      "BOSH Service URL:": [
+         null,
+         ""
+      ],
+      "Connected": [
+         null,
+         ""
+      ],
+      "Disconnected": [
+         null,
+         ""
+      ],
+      "Error": [
+         null,
+         ""
+      ],
+      "Connecting": [
+         null,
+         ""
+      ],
+      "Connection Failed": [
+         null,
+         ""
+      ],
+      "Authenticating": [
+         null,
+         ""
+      ],
+      "Authentication Failed": [
+         null,
+         ""
+      ],
+      "Disconnecting": [
+         null,
+         ""
+      ],
+      "Attached": [
+         null,
+         ""
+      ],
+      "Online Contacts": [
+         null,
+         ""
+      ]
+   }
+}

+ 481 - 0
locale/hu/LC_MESSAGES/converse.po

@@ -0,0 +1,481 @@
+# Hungarian translations for Converse.js package.
+# Copyright (C) 2013 Jan-Carel Brand
+# This file is distributed under the same license as the Converse.js package.
+# JC Brand <jc@opkode.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Converse.js 0.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-06-01 23:03+0200\n"
+"PO-Revision-Date: 2013-06-02 19:45+0200\n"
+"Last-Translator: JC Brand <jc@opkode.com>\n"
+"Language-Team: Hungarian\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: converse.js:397 converse.js:1128
+msgid "Show this menu"
+msgstr ""
+
+#: converse.js:398 converse.js:1129
+msgid "Write in the third person"
+msgstr ""
+
+#: converse.js:399 converse.js:1133
+msgid "Remove messages"
+msgstr ""
+
+#: converse.js:539
+msgid "Personal message"
+msgstr ""
+
+#: converse.js:613
+msgid "Contacts"
+msgstr ""
+
+#: converse.js:618
+msgid "Online"
+msgstr ""
+
+#: converse.js:619
+msgid "Busy"
+msgstr ""
+
+#: converse.js:620
+msgid "Away"
+msgstr ""
+
+#: converse.js:621
+msgid "Offline"
+msgstr ""
+
+#: converse.js:628
+msgid "Click to add new chat contacts"
+msgstr ""
+
+#: converse.js:628
+msgid "Add a contact"
+msgstr ""
+
+#: converse.js:637
+msgid "Contact username"
+msgstr ""
+
+#: converse.js:638
+msgid "Add"
+msgstr ""
+
+#: converse.js:646
+msgid "Contact name"
+msgstr ""
+
+#: converse.js:647
+msgid "Search"
+msgstr ""
+
+#: converse.js:682
+msgid "No users found"
+msgstr ""
+
+#: converse.js:689
+msgid "Click to add as a chat contact"
+msgstr ""
+
+#: converse.js:753
+msgid "Click to open this room"
+msgstr ""
+
+#: converse.js:755
+msgid "Show more information on this room"
+msgstr ""
+
+#: converse.js:760
+msgid "Description:"
+msgstr ""
+
+#: converse.js:761
+msgid "Occupants:"
+msgstr ""
+
+#: converse.js:762
+msgid "Features:"
+msgstr ""
+
+#: converse.js:764
+msgid "Requires authentication"
+msgstr ""
+
+#: converse.js:767
+msgid "Hidden"
+msgstr ""
+
+#: converse.js:770
+msgid "Requires an invitation"
+msgstr ""
+
+#: converse.js:773
+msgid "Moderated"
+msgstr ""
+
+#: converse.js:776
+msgid "Non-anonymous"
+msgstr ""
+
+#: converse.js:779
+msgid "Open room"
+msgstr ""
+
+#: converse.js:782
+msgid "Permanent room"
+msgstr ""
+
+#: converse.js:785
+msgid "Public"
+msgstr ""
+
+#: converse.js:788
+msgid "Semi-anonymous"
+msgstr ""
+
+#: converse.js:791
+msgid "Temporary room"
+msgstr ""
+
+#: converse.js:794
+msgid "Unmoderated"
+msgstr ""
+
+#: converse.js:800
+msgid "Rooms"
+msgstr ""
+
+#: converse.js:804
+msgid "Room name"
+msgstr ""
+
+#: converse.js:805
+msgid "Nickname"
+msgstr ""
+
+#: converse.js:806
+msgid "Server"
+msgstr ""
+
+#: converse.js:807
+msgid "Join"
+msgstr ""
+
+#: converse.js:808
+msgid "Show rooms"
+msgstr ""
+
+#. For translators: %1$s is a variable and will be replaced with the XMPP server name
+#: converse.js:841
+msgid "No rooms on %1$s"
+msgstr ""
+
+#. For translators: %1$s is a variable and will be
+#. replaced with the XMPP server name
+#: converse.js:856
+msgid "Rooms on %1$s"
+msgstr ""
+
+#: converse.js:1130
+msgid "Set chatroom topic"
+msgstr ""
+
+#: converse.js:1131
+msgid "Kick user from chatroom"
+msgstr ""
+
+#: converse.js:1132
+msgid "Ban user from chatroom"
+msgstr ""
+
+#: converse.js:1159
+msgid "Message"
+msgstr ""
+
+#: converse.js:1273 converse.js:2318
+msgid "Save"
+msgstr ""
+
+#: converse.js:1274
+msgid "Cancel"
+msgstr ""
+
+#: converse.js:1321
+msgid "An error occurred while trying to save the form."
+msgstr ""
+
+#: converse.js:1367
+msgid "This chatroom requires a password"
+msgstr ""
+
+#: converse.js:1368
+msgid "Password: "
+msgstr ""
+
+#: converse.js:1369
+msgid "Submit"
+msgstr ""
+
+#: converse.js:1383
+msgid "This room is not anonymous"
+msgstr ""
+
+#: converse.js:1384
+msgid "This room now shows unavailable members"
+msgstr ""
+
+#: converse.js:1385
+msgid "This room does not show unavailable members"
+msgstr ""
+
+#: converse.js:1386
+msgid "Non-privacy-related room configuration has changed"
+msgstr ""
+
+#: converse.js:1387
+msgid "Room logging is now enabled"
+msgstr ""
+
+#: converse.js:1388
+msgid "Room logging is now disabled"
+msgstr ""
+
+#: converse.js:1389
+msgid "This room is now non-anonymous"
+msgstr ""
+
+#: converse.js:1390
+msgid "This room is now semi-anonymous"
+msgstr ""
+
+#: converse.js:1391
+msgid "This room is now fully-anonymous"
+msgstr ""
+
+#: converse.js:1392
+msgid "A new room has been created"
+msgstr ""
+
+#: converse.js:1393
+msgid "Your nickname has been changed"
+msgstr ""
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been banned
+#: converse.js:1400
+msgid "<strong>%1$s</strong> has been banned"
+msgstr ""
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been kicked out
+#: converse.js:1404
+msgid "<strong>%1$s</strong> has been kicked out"
+msgstr ""
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
+#: converse.js:1408
+msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
+msgstr ""
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed for not being a member
+#: converse.js:1412
+msgid "<strong>%1$s</strong> has been removed for not being a member"
+msgstr ""
+
+#: converse.js:1416 converse.js:1478
+msgid "You have been banned from this room"
+msgstr ""
+
+#: converse.js:1417
+msgid "You have been kicked from this room"
+msgstr ""
+
+#: converse.js:1418
+msgid "You have been removed from this room because of an affiliation change"
+msgstr ""
+
+#: converse.js:1419
+msgid ""
+"You have been removed from this room because the room has changed to members-"
+"only and you're not a member"
+msgstr ""
+
+#: converse.js:1420
+msgid ""
+"You have been removed from this room because the MUC (Multi-user chat) "
+"service is being shut down."
+msgstr ""
+
+#: converse.js:1476
+msgid "You are not on the member list of this room"
+msgstr ""
+
+#: converse.js:1482
+msgid "No nickname was specified"
+msgstr ""
+
+#: converse.js:1486
+msgid "You are not allowed to create new rooms"
+msgstr ""
+
+#: converse.js:1488
+msgid "Your nickname doesn't conform to this room's policies"
+msgstr ""
+
+#: converse.js:1490
+msgid "Your nickname is already taken"
+msgstr ""
+
+#: converse.js:1492
+msgid "This room does not (yet) exist"
+msgstr ""
+
+#: converse.js:1494
+msgid "This room has reached it's maximum number of occupants"
+msgstr ""
+
+#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
+#. Example: Topic set by JC Brand to: Hello World!
+#: converse.js:1571
+msgid "Topic set by %1$s to: %2$s"
+msgstr ""
+
+#: converse.js:1587
+msgid "This user is a moderator"
+msgstr ""
+
+#: converse.js:1590
+msgid "This user can send messages in this room"
+msgstr ""
+
+#: converse.js:1593
+msgid "This user can NOT send messages in this room"
+msgstr ""
+
+#: converse.js:1796
+msgid "Click to chat with this contact"
+msgstr ""
+
+#: converse.js:1797 converse.js:1801
+msgid "Click to remove this contact"
+msgstr ""
+
+#: converse.js:2163
+msgid "Contact requests"
+msgstr ""
+
+#: converse.js:2164
+msgid "My contacts"
+msgstr ""
+
+#: converse.js:2165
+msgid "Pending contacts"
+msgstr ""
+
+#: converse.js:2317
+msgid "Custom status"
+msgstr ""
+
+#: converse.js:2323
+msgid "Click to change your chat status"
+msgstr ""
+
+#: converse.js:2326
+msgid "Click here to write a custom status message"
+msgstr ""
+
+#: converse.js:2355 converse.js:2363
+msgid "online"
+msgstr ""
+
+#: converse.js:2357
+msgid "busy"
+msgstr ""
+
+#: converse.js:2359
+msgid "away for long"
+msgstr ""
+
+#: converse.js:2361
+msgid "away"
+msgstr ""
+
+#. For translators: the %1$s part gets replaced with the status
+#. Example, I am online
+#: converse.js:2375 converse.js:2409
+msgid "I am %1$s"
+msgstr ""
+
+#: converse.js:2480
+msgid "Sign in"
+msgstr ""
+
+#: converse.js:2483
+msgid "XMPP/Jabber Username:"
+msgstr ""
+
+#: converse.js:2485
+msgid "Password:"
+msgstr ""
+
+#: converse.js:2487
+msgid "Log In"
+msgstr ""
+
+#: converse.js:2491
+msgid "BOSH Service URL:"
+msgstr ""
+
+#: converse.js:2503
+msgid "Connected"
+msgstr ""
+
+#: converse.js:2507
+msgid "Disconnected"
+msgstr ""
+
+#: converse.js:2511
+msgid "Error"
+msgstr ""
+
+#: converse.js:2513
+msgid "Connecting"
+msgstr ""
+
+#: converse.js:2516
+msgid "Connection Failed"
+msgstr ""
+
+#: converse.js:2518
+msgid "Authenticating"
+msgstr ""
+
+#: converse.js:2521
+msgid "Authentication Failed"
+msgstr ""
+
+#: converse.js:2523
+msgid "Disconnecting"
+msgstr ""
+
+#: converse.js:2525
+msgid "Attached"
+msgstr ""
+
+#: converse.js:2656
+msgid "Online Contacts"
+msgstr ""

+ 459 - 0
locale/hu/LC_MESSAGES/hu.js

@@ -0,0 +1,459 @@
+(function (root, factory) {
+    define("hu", ['jed'], function () {
+        var hu = new Jed({
+            "domain": "converse",
+            "locale_data": {
+                "converse": {
+                    "": {
+                        "Content-Type": "text/plain; charset=ASCII",
+                        "Content-Transfer-Encoding": "8bit",
+                        "Plural-Forms": "nplurals=2; plural=(n != 1);"
+                    },
+                    "Show this menu": [
+                        null,
+                        ""
+                    ],
+                    "Write in the third person": [
+                        null,
+                        ""
+                    ],
+                    "Remove messages": [
+                        null,
+                        ""
+                    ],
+                    "Personal message": [
+                        null,
+                        ""
+                    ],
+                    "Contacts": [
+                        null,
+                        ""
+                    ],
+                    "Online": [
+                        null,
+                        ""
+                    ],
+                    "Busy": [
+                        null,
+                        ""
+                    ],
+                    "Away": [
+                        null,
+                        ""
+                    ],
+                    "Offline": [
+                        null,
+                        ""
+                    ],
+                    "Click to add new chat contacts": [
+                        null,
+                        ""
+                    ],
+                    "Add a contact": [
+                        null,
+                        ""
+                    ],
+                    "Contact username": [
+                        null,
+                        ""
+                    ],
+                    "Add": [
+                        null,
+                        ""
+                    ],
+                    "Contact name": [
+                        null,
+                        ""
+                    ],
+                    "Search": [
+                        null,
+                        ""
+                    ],
+                    "No users found": [
+                        null,
+                        ""
+                    ],
+                    "Click to add as a chat contact": [
+                        null,
+                        ""
+                    ],
+                    "Click to open this room": [
+                        null,
+                        ""
+                    ],
+                    "Show more information on this room": [
+                        null,
+                        ""
+                    ],
+                    "Description:": [
+                        null,
+                        ""
+                    ],
+                    "Occupants:": [
+                        null,
+                        ""
+                    ],
+                    "Features:": [
+                        null,
+                        ""
+                    ],
+                    "Requires authentication": [
+                        null,
+                        ""
+                    ],
+                    "Hidden": [
+                        null,
+                        ""
+                    ],
+                    "Requires an invitation": [
+                        null,
+                        ""
+                    ],
+                    "Moderated": [
+                        null,
+                        ""
+                    ],
+                    "Non-anonymous": [
+                        null,
+                        ""
+                    ],
+                    "Open room": [
+                        null,
+                        ""
+                    ],
+                    "Permanent room": [
+                        null,
+                        ""
+                    ],
+                    "Public": [
+                        null,
+                        ""
+                    ],
+                    "Semi-anonymous": [
+                        null,
+                        ""
+                    ],
+                    "Temporary room": [
+                        null,
+                        ""
+                    ],
+                    "Unmoderated": [
+                        null,
+                        ""
+                    ],
+                    "Rooms": [
+                        null,
+                        ""
+                    ],
+                    "Room name": [
+                        null,
+                        ""
+                    ],
+                    "Nickname": [
+                        null,
+                        ""
+                    ],
+                    "Server": [
+                        null,
+                        ""
+                    ],
+                    "Join": [
+                        null,
+                        ""
+                    ],
+                    "Show rooms": [
+                        null,
+                        ""
+                    ],
+                    "No rooms on %1$s": [
+                        null,
+                        ""
+                    ],
+                    "Rooms on %1$s": [
+                        null,
+                        ""
+                    ],
+                    "Set chatroom topic": [
+                        null,
+                        ""
+                    ],
+                    "Kick user from chatroom": [
+                        null,
+                        ""
+                    ],
+                    "Ban user from chatroom": [
+                        null,
+                        ""
+                    ],
+                    "Message": [
+                        null,
+                        ""
+                    ],
+                    "Save": [
+                        null,
+                        ""
+                    ],
+                    "Cancel": [
+                        null,
+                        ""
+                    ],
+                    "An error occurred while trying to save the form.": [
+                        null,
+                        ""
+                    ],
+                    "This chatroom requires a password": [
+                        null,
+                        ""
+                    ],
+                    "Password: ": [
+                        null,
+                        ""
+                    ],
+                    "Submit": [
+                        null,
+                        ""
+                    ],
+                    "This room is not anonymous": [
+                        null,
+                        ""
+                    ],
+                    "This room now shows unavailable members": [
+                        null,
+                        ""
+                    ],
+                    "This room does not show unavailable members": [
+                        null,
+                        ""
+                    ],
+                    "Non-privacy-related room configuration has changed": [
+                        null,
+                        ""
+                    ],
+                    "Room logging is now enabled": [
+                        null,
+                        ""
+                    ],
+                    "Room logging is now disabled": [
+                        null,
+                        ""
+                    ],
+                    "This room is now non-anonymous": [
+                        null,
+                        ""
+                    ],
+                    "This room is now semi-anonymous": [
+                        null,
+                        ""
+                    ],
+                    "This room is now fully-anonymous": [
+                        null,
+                        ""
+                    ],
+                    "A new room has been created": [
+                        null,
+                        ""
+                    ],
+                    "Your nickname has been changed": [
+                        null,
+                        ""
+                    ],
+                    "<strong>%1$s</strong> has been banned": [
+                        null,
+                        ""
+                    ],
+                    "<strong>%1$s</strong> has been kicked out": [
+                        null,
+                        ""
+                    ],
+                    "<strong>%1$s</strong> has been removed because of an affiliation change": [
+                        null,
+                        ""
+                    ],
+                    "<strong>%1$s</strong> has been removed for not being a member": [
+                        null,
+                        ""
+                    ],
+                    "You have been banned from this room": [
+                        null,
+                        ""
+                    ],
+                    "You have been kicked from this room": [
+                        null,
+                        ""
+                    ],
+                    "You have been removed from this room because of an affiliation change": [
+                        null,
+                        ""
+                    ],
+                    "You have been removed from this room because the room has changed to members-only and you're not a member": [
+                        null,
+                        ""
+                    ],
+                    "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+                        null,
+                        ""
+                    ],
+                    "You are not on the member list of this room": [
+                        null,
+                        ""
+                    ],
+                    "No nickname was specified": [
+                        null,
+                        ""
+                    ],
+                    "You are not allowed to create new rooms": [
+                        null,
+                        ""
+                    ],
+                    "Your nickname doesn't conform to this room's policies": [
+                        null,
+                        ""
+                    ],
+                    "Your nickname is already taken": [
+                        null,
+                        ""
+                    ],
+                    "This room does not (yet) exist": [
+                        null,
+                        ""
+                    ],
+                    "This room has reached it's maximum number of occupants": [
+                        null,
+                        ""
+                    ],
+                    "Topic set by %1$s to: %2$s": [
+                        null,
+                        ""
+                    ],
+                    "This user is a moderator": [
+                        null,
+                        ""
+                    ],
+                    "This user can send messages in this room": [
+                        null,
+                        ""
+                    ],
+                    "This user can NOT send messages in this room": [
+                        null,
+                        ""
+                    ],
+                    "Click to chat with this contact": [
+                        null,
+                        ""
+                    ],
+                    "Click to remove this contact": [
+                        null,
+                        ""
+                    ],
+                    "Contact requests": [
+                        null,
+                        ""
+                    ],
+                    "My contacts": [
+                        null,
+                        ""
+                    ],
+                    "Pending contacts": [
+                        null,
+                        ""
+                    ],
+                    "Custom status": [
+                        null,
+                        ""
+                    ],
+                    "Click to change your chat status": [
+                        null,
+                        ""
+                    ],
+                    "Click here to write a custom status message": [
+                        null,
+                        ""
+                    ],
+                    "online": [
+                        null,
+                        ""
+                    ],
+                    "busy": [
+                        null,
+                        ""
+                    ],
+                    "away for long": [
+                        null,
+                        ""
+                    ],
+                    "away": [
+                        null,
+                        ""
+                    ],
+                    "I am %1$s": [
+                        null,
+                        ""
+                    ],
+                    "Sign in": [
+                        null,
+                        ""
+                    ],
+                    "XMPP/Jabber Username:": [
+                        null,
+                        ""
+                    ],
+                    "Password:": [
+                        null,
+                        ""
+                    ],
+                    "Log In": [
+                        null,
+                        ""
+                    ],
+                    "BOSH Service URL:": [
+                        null,
+                        ""
+                    ],
+                    "Connected": [
+                        null,
+                        ""
+                    ],
+                    "Disconnected": [
+                        null,
+                        ""
+                    ],
+                    "Error": [
+                        null,
+                        ""
+                    ],
+                    "Connecting": [
+                        null,
+                        ""
+                    ],
+                    "Connection Failed": [
+                        null,
+                        ""
+                    ],
+                    "Authenticating": [
+                        null,
+                        ""
+                    ],
+                    "Authentication Failed": [
+                        null,
+                        ""
+                    ],
+                    "Disconnecting": [
+                        null,
+                        ""
+                    ],
+                    "Attached": [
+                        null,
+                        ""
+                    ],
+                    "Online Contacts": [
+                        null,
+                        ""
+                    ]
+                }
+            }
+        });
+        return factory(hu);
+    });
+}(this, function (hu) { 
+    return hu; 
+}));

+ 460 - 0
locale/it/LC_MESSAGES/converse.json

@@ -0,0 +1,460 @@
+{
+   "converse": {
+      "": {
+         "Project-Id-Version": "Converse.js 0.4",
+         "Report-Msgid-Bugs-To": "",
+         "POT-Creation-Date": "2013-07-20 23:03+0200",
+         "PO-Revision-Date": "2013-07-20 13:58+0200",
+         "Last-Translator": "Fabio Bas <ctrlaltca@gmail.com>",
+         "Language-Team": "Italian",
+         "Language": "it",
+         "MIME-Version": "1.0",
+         "Content-Type": "text/plain; charset=ASCII",
+         "Content-Transfer-Encoding": "8bit",
+         "Plural-Forms": "nplurals=2; plural=(n != 1);",
+         "domain": "converse",
+         "lang": "it",
+         "plural_forms": "nplurals=2; plural=(n != 1);"
+      },
+      "Show this menu": [
+         null,
+         "Mostra questo menu"
+      ],
+      "Write in the third person": [
+         null,
+         "Scrivi in terza persona"
+      ],
+      "Remove messages": [
+         null,
+         "Rimuovi messaggi"
+      ],
+      "Personal message": [
+         null,
+         "Messaggio personale"
+      ],
+      "Contacts": [
+         null,
+         "Contatti"
+      ],
+      "Online": [
+         null,
+         "In linea"
+      ],
+      "Busy": [
+         null,
+         "Occupato"
+      ],
+      "Away": [
+         null,
+         "Assente"
+      ],
+      "Offline": [
+         null,
+         "Non in linea"
+      ],
+      "Click to add new chat contacts": [
+         null,
+         "Clicca per aggiungere nuovi contatti alla chat"
+      ],
+      "Add a contact": [
+         null,
+         "Aggiungi un contatto"
+      ],
+      "Contact username": [
+         null,
+         "Nome utente del contatto"
+      ],
+      "Add": [
+         null,
+         "Aggiungi"
+      ],
+      "Contact name": [
+         null,
+         "Nome del contatto"
+      ],
+      "Search": [
+         null,
+         "Cerca"
+      ],
+      "No users found": [
+         null,
+         "Nessun utente trovato"
+      ],
+      "Click to add as a chat contact": [
+         null,
+         "Clicca per aggiungere il contatto alla chat"
+      ],
+      "Click to open this room": [
+         null,
+         "Clicca per aprire questa stanza"
+      ],
+      "Show more information on this room": [
+         null,
+         "Mostra più informazioni su questa stanza"
+      ],
+      "Description:": [
+         null,
+         "Descrizione:"
+      ],
+      "Occupants:": [
+         null,
+         "Utenti presenti:"
+      ],
+      "Features:": [
+         null,
+         "Funzionalità:"
+      ],
+      "Requires authentication": [
+         null,
+         "Richiede autenticazione"
+      ],
+      "Hidden": [
+         null,
+         "Nascosta"
+      ],
+      "Requires an invitation": [
+         null,
+         "Richiede un invito"
+      ],
+      "Moderated": [
+         null,
+         "Moderata"
+      ],
+      "Non-anonymous": [
+         null,
+         "Non-anonima"
+      ],
+      "Open room": [
+         null,
+         "Stanza aperta"
+      ],
+      "Permanent room": [
+         null,
+         "Stanza permanente"
+      ],
+      "Public": [
+         null,
+         "Pubblica"
+      ],
+      "Semi-anonymous": [
+         null,
+         "Semi-anonima"
+      ],
+      "Temporary room": [
+         null,
+         "Stanza temporanea"
+      ],
+      "Unmoderated": [
+         null,
+         "Non moderata"
+      ],
+      "Rooms": [
+         null,
+         "Stanze"
+      ],
+      "Room name": [
+         null,
+         "Nome stanza"
+      ],
+      "Nickname": [
+         null,
+         "Soprannome"
+      ],
+      "Server": [
+         null,
+         "Server"
+      ],
+      "Join": [
+         null,
+         "Entra"
+      ],
+      "Show rooms": [
+         null,
+         "Mostra stanze"
+      ],
+      "No rooms on %1$s": [
+         null,
+         "Nessuna stanza su %1$s"
+      ],
+      "Rooms on %1$s": [
+         null,
+         "Stanze su %1$s"
+      ],
+      "Set chatroom topic": [
+         null,
+         "Cambia oggetto della stanza"
+      ],
+      "Kick user from chatroom": [
+         null,
+         "Espelli utente dalla stanza"
+      ],
+      "Ban user from chatroom": [
+         null,
+         "Bandisci utente dalla stanza"
+      ],
+      "Message": [
+         null,
+         "Messaggio"
+      ],
+      "Save": [
+         null,
+         "Salva"
+      ],
+      "Cancel": [
+         null,
+         "Annulla"
+      ],
+      "An error occurred while trying to save the form.": [
+         null,
+         "Errore durante il salvataggio del modulo"
+      ],
+      "This chatroom requires a password": [
+         null,
+         "Questa stanza richiede una password"
+      ],
+      "Password: ": [
+         null,
+         "Password: "
+      ],
+      "Submit": [
+         null,
+         "Invia"
+      ],
+      "This room is not anonymous": [
+         null,
+         "Questa stanza non è anonima"
+      ],
+      "This room now shows unavailable members": [
+         null,
+         "Questa stanza mostra i membri non disponibili al momento"
+      ],
+      "This room does not show unavailable members": [
+         null,
+         "Questa stanza non mostra i membri non disponibili"
+      ],
+      "Non-privacy-related room configuration has changed": [
+         null,
+         "Una configurazione della stanza non legata alla privacy è stata modificata"
+      ],
+      "Room logging is now enabled": [
+         null,
+         "La registrazione è abilitata nella stanza"
+      ],
+      "Room logging is now disabled": [
+         null,
+         "La registrazione è disabilitata nella stanza"
+      ],
+      "This room is now non-anonymous": [
+         null,
+         "Questa stanza è non-anonima"
+      ],
+      "This room is now semi-anonymous": [
+         null,
+         "Questa stanza è semi-anonima"
+      ],
+      "This room is now fully-anonymous": [
+         null,
+         "Questa stanza è completamente-anonima"
+      ],
+      "A new room has been created": [
+         null,
+         "Una nuova stanza è stata creata"
+      ],
+      "Your nickname has been changed": [
+         null,
+         "Il tuo soprannome è stato cambiato"
+      ],
+      "<strong>%1$s</strong> has been banned": [
+         null,
+         "<strong>%1$s</strong> è stato bandito"
+      ],
+      "<strong>%1$s</strong> has been kicked out": [
+         null,
+         "<strong>%1$s</strong> è stato espulso"
+      ],
+      "<strong>%1$s</strong> has been removed because of an affiliation change": [
+         null,
+         "<strong>%1$s</strong> è stato rimosso a causa di un cambio di affiliazione"
+      ],
+      "<strong>%1$s</strong> has been removed for not being a member": [
+         null,
+         "<strong>%1$s</strong> è stato rimosso in quanto non membro"
+      ],
+      "You have been banned from this room": [
+         null,
+         "Sei stato bandito da questa stanza"
+      ],
+      "You have been kicked from this room": [
+         null,
+         "Sei stato espulso da questa stanza"
+      ],
+      "You have been removed from this room because of an affiliation change": [
+         null,
+         "Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"
+      ],
+      "You have been removed from this room because the room has changed to members-only and you're not a member": [
+         null,
+         "Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"
+      ],
+      "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+         null,
+         "Sei stato rimosso da questa stanza poiché il servizio MUC (Chat multi utente) è in fase di spegnimento"
+      ],
+      "You are not on the member list of this room": [
+         null,
+         "Non sei nella lista dei membri di questa stanza"
+      ],
+      "No nickname was specified": [
+         null,
+         "Nessun soprannome specificato"
+      ],
+      "You are not allowed to create new rooms": [
+         null,
+         "Non ti è permesso creare nuove stanze"
+      ],
+      "Your nickname doesn't conform to this room's policies": [
+         null,
+         "Il tuo soprannome non è conforme alle regole di questa stanza"
+      ],
+      "Your nickname is already taken": [
+         null,
+         "Il tuo soprannome è già utilizzato"
+      ],
+      "This room does not (yet) exist": [
+         null,
+         "Questa stanza non esiste (per ora)"
+      ],
+      "This room has reached it's maximum number of occupants": [
+         null,
+         "Questa stanza ha raggiunto il limite massimo di utenti"
+      ],
+      "Topic set by %1$s to: %2$s": [
+         null,
+         "Topic impostato da %1$s a: %2$s"
+      ],
+      "This user is a moderator": [
+         null,
+         "Questo utente è un moderatore"
+      ],
+      "This user can send messages in this room": [
+         null,
+         "Questo utente può inviare messaggi in questa stanza"
+      ],
+      "This user can NOT send messages in this room": [
+         null,
+         "Questo utente NON può inviare messaggi in questa stanza"
+      ],
+      "Click to chat with this contact": [
+         null,
+         "Clicca per parlare con questo contatto"
+      ],
+      "Click to remove this contact": [
+         null,
+         "Clicca per rimuovere questo contatto"
+      ],
+      "Contact requests": [
+         null,
+         "Richieste dei contatti"
+      ],
+      "My contacts": [
+         null,
+         "I miei contatti"
+      ],
+      "Pending contacts": [
+         null,
+         "Contatti in attesa"
+      ],
+      "Custom status": [
+         null,
+         "Stato personalizzato"
+      ],
+      "Click to change your chat status": [
+         null,
+         "Clicca per cambiare il tuo stato"
+      ],
+      "Click here to write a custom status message": [
+         null,
+         "Clicca qui per scrivere un messaggio di stato personalizzato"
+      ],
+      "online": [
+         null,
+         "in linea"
+      ],
+      "busy": [
+         null,
+         "occupato"
+      ],
+      "away for long": [
+         null,
+         "assente da molto"
+      ],
+      "away": [
+         null,
+         "assente"
+      ],
+      "I am %1$s": [
+         null,
+         "Sono %1$s"
+      ],
+      "Sign in": [
+         null,
+         "Entra"
+      ],
+      "XMPP/Jabber Username:": [
+         null,
+         "Nome utente:"
+      ],
+      "Password:": [
+         null,
+         "Password:"
+      ],
+      "Log In": [
+         null,
+         "Entra"
+      ],
+      "BOSH Service URL:": [
+         null,
+         "Indirizzo servizio BOSH:"
+      ],
+      "Connected": [
+         null,
+         "Connesso"
+      ],
+      "Disconnected": [
+         null,
+         "Disconnesso"
+      ],
+      "Error": [
+         null,
+         "Errore"
+      ],
+      "Connecting": [
+         null,
+         "Connessione in corso"
+      ],
+      "Connection Failed": [
+         null,
+         "Connessione fallita"
+      ],
+      "Authenticating": [
+         null,
+         "Autenticazione in corso"
+      ],
+      "Authentication Failed": [
+         null,
+         "Autenticazione fallita"
+      ],
+      "Disconnecting": [
+         null,
+         "Disconnessione in corso"
+      ],
+      "Attached": [
+         null,
+         "Allegato"
+      ],
+      "Online Contacts": [
+         null,
+         "Contatti in linea"
+      ]
+   }
+}

+ 489 - 0
locale/it/LC_MESSAGES/converse.po

@@ -0,0 +1,489 @@
+# German translations for Converse.js package.
+# Copyright (C) 2013 Jan-Carel Brand
+# This file is distributed under the same license as the Converse.js package.
+# JC Brand <jc@opkode.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Converse.js 0.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-20 23:03+0200\n"
+"PO-Revision-Date: 2013-07-20 18:53+0100\n"
+"Last-Translator: Fabio Bas <ctrlaltca@gmail.com>\n"
+"Language-Team: Italian\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"domain: converse\n"
+"lang: it\n"
+"plural_forms: nplurals=2; plural=(n != 1);\n"
+
+#: converse.js:397
+#: converse.js:1128
+msgid "Show this menu"
+msgstr "Mostra questo menu"
+
+#: converse.js:398
+#: converse.js:1129
+msgid "Write in the third person"
+msgstr "Scrivi in terza persona"
+
+#: converse.js:399
+#: converse.js:1133
+msgid "Remove messages"
+msgstr "Rimuovi messaggi"
+
+#: converse.js:539
+msgid "Personal message"
+msgstr "Messaggio personale"
+
+#: converse.js:613
+msgid "Contacts"
+msgstr "Contatti"
+
+#: converse.js:618
+msgid "Online"
+msgstr "In linea"
+
+#: converse.js:619
+msgid "Busy"
+msgstr "Occupato"
+
+#: converse.js:620
+msgid "Away"
+msgstr "Assente"
+
+#: converse.js:621
+msgid "Offline"
+msgstr "Non in linea"
+
+#: converse.js:628
+msgid "Click to add new chat contacts"
+msgstr "Clicca per aggiungere nuovi contatti alla chat"
+
+#: converse.js:628
+msgid "Add a contact"
+msgstr "Aggiungi contatti"
+
+#: converse.js:637
+msgid "Contact username"
+msgstr "Nome utente del contatto"
+
+#: converse.js:638
+msgid "Add"
+msgstr "Aggiungi"
+
+#: converse.js:646
+msgid "Contact name"
+msgstr "Nome del contatto"
+
+#: converse.js:647
+msgid "Search"
+msgstr "Cerca"
+
+#: converse.js:682
+msgid "No users found"
+msgstr "Nessun utente trovato"
+
+#: converse.js:689
+msgid "Click to add as a chat contact"
+msgstr "Clicca per aggiungere il contatto alla chat"
+
+#: converse.js:753
+msgid "Click to open this room"
+msgstr "Clicca per aprire questa stanza"
+
+#: converse.js:755
+msgid "Show more information on this room"
+msgstr "Mostra più informazioni su questa stanza"
+
+#: converse.js:760
+msgid "Description:"
+msgstr "Descrizione:"
+
+#: converse.js:761
+msgid "Occupants:"
+msgstr "Utenti presenti:"
+
+#: converse.js:762
+msgid "Features:"
+msgstr "Funzionalità:"
+
+#: converse.js:764
+msgid "Requires authentication"
+msgstr "Richiede autenticazione"
+
+#: converse.js:767
+msgid "Hidden"
+msgstr "Nascosta"
+
+#: converse.js:770
+msgid "Requires an invitation"
+msgstr "Richiede un invito"
+
+#: converse.js:773
+msgid "Moderated"
+msgstr "Moderata"
+
+#: converse.js:776
+msgid "Non-anonymous"
+msgstr "Non-anonima"
+
+#: converse.js:779
+msgid "Open room"
+msgstr "Stanza aperta"
+
+#: converse.js:782
+msgid "Permanent room"
+msgstr "Stanza permanente"
+
+#: converse.js:785
+msgid "Public"
+msgstr "Pubblica"
+
+#: converse.js:788
+msgid "Semi-anonymous"
+msgstr "Semi-anonima"
+
+#: converse.js:791
+msgid "Temporary room"
+msgstr "Stanza temporanea"
+
+#: converse.js:794
+msgid "Unmoderated"
+msgstr "Non moderata"
+
+#: converse.js:800
+msgid "Rooms"
+msgstr "Stanze"
+
+#: converse.js:804
+msgid "Room name"
+msgstr "Nome stanza"
+
+#: converse.js:805
+msgid "Nickname"
+msgstr "Soprannome"
+
+#: converse.js:806
+msgid "Server"
+msgstr "Server"
+
+#: converse.js:807
+msgid "Join"
+msgstr "Entra"
+
+#: converse.js:808
+msgid "Show rooms"
+msgstr "Mostra stanze"
+
+#. For translators: %1$s is a variable and will be replaced with the XMPP server name
+#: converse.js:841
+msgid "No rooms on %1$s"
+msgstr "Nessuna stanza su %1$s"
+
+#. For translators: %1$s is a variable and will be
+#. replaced with the XMPP server name
+#: converse.js:856
+msgid "Rooms on %1$s"
+msgstr "Stanze su %1$s"
+
+#: converse.js:1130
+msgid "Set chatroom topic"
+msgstr "Cambia oggetto della stanza"
+
+#: converse.js:1131
+msgid "Kick user from chatroom"
+msgstr "Espelli utente dalla stanza"
+
+#: converse.js:1132
+msgid "Ban user from chatroom"
+msgstr "Bandisci utente dalla stanza"
+
+#: converse.js:1159
+msgid "Message"
+msgstr "Messaggio"
+
+#: converse.js:1273
+#: converse.js:2318
+msgid "Save"
+msgstr "Salva"
+
+#: converse.js:1274
+msgid "Cancel"
+msgstr "Annulla"
+
+#: converse.js:1321
+msgid "An error occurred while trying to save the form."
+msgstr "Errore durante il salvataggio del modulo"
+
+#: converse.js:1367
+msgid "This chatroom requires a password"
+msgstr "Questa stanza richiede una password"
+
+#: converse.js:1368
+msgid "Password: "
+msgstr "Password: "
+
+#: converse.js:1369
+msgid "Submit"
+msgstr "Invia"
+
+#: converse.js:1383
+msgid "This room is not anonymous"
+msgstr "Questa stanza non è anonima"
+
+#: converse.js:1384
+msgid "This room now shows unavailable members"
+msgstr "Questa stanza mostra i membri non disponibili al momento"
+
+#: converse.js:1385
+msgid "This room does not show unavailable members"
+msgstr "Questa stanza non mostra i membri non disponibili"
+
+#: converse.js:1386
+msgid "Non-privacy-related room configuration has changed"
+msgstr "Una configurazione della stanza non legata alla privacy è stata modificata"
+
+#: converse.js:1387
+msgid "Room logging is now enabled"
+msgstr "La registrazione è abilitata nella stanza"
+
+#: converse.js:1388
+msgid "Room logging is now disabled"
+msgstr "La registrazione è disabilitata nella stanza"
+
+#: converse.js:1389
+msgid "This room is now non-anonymous"
+msgstr "Questa stanza è non-anonima"
+
+#: converse.js:1390
+msgid "This room is now semi-anonymous"
+msgstr "Questa stanza è semi-anonima"
+
+#: converse.js:1391
+msgid "This room is now fully-anonymous"
+msgstr "Questa stanza è completamente-anonima"
+
+#: converse.js:1392
+msgid "A new room has been created"
+msgstr "Una nuova stanza è stata creata"
+
+#: converse.js:1393
+msgid "Your nickname has been changed"
+msgstr "Il tuo soprannome è stato cambiato"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been banned
+#: converse.js:1400
+msgid "<strong>%1$s</strong> has been banned"
+msgstr "<strong>%1$s</strong> è stato bandito"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been kicked out
+#: converse.js:1404
+msgid "<strong>%1$s</strong> has been kicked out"
+msgstr "<strong>%1$s</strong> è stato espulso"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
+#: converse.js:1408
+msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
+msgstr "<strong>%1$s</strong> è stato rimosso a causa di un cambio di affiliazione"
+
+#. For translations: %1$s will be replaced with the user's nickname
+#. Don't translate "strong"
+#. Example: <strong>jcbrand</strong> has been removed for not being a member
+#: converse.js:1412
+msgid "<strong>%1$s</strong> has been removed for not being a member"
+msgstr "<strong>%1$s</strong> è stato rimosso in quanto non membro"
+
+#: converse.js:1416
+#: converse.js:1478
+msgid "You have been banned from this room"
+msgstr "Sei stato bandito da questa stanza"
+
+#: converse.js:1417
+msgid "You have been kicked from this room"
+msgstr "Sei stato espulso da questa stanza"
+
+#: converse.js:1418
+msgid "You have been removed from this room because of an affiliation change"
+msgstr "Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"
+
+#: converse.js:1419
+msgid "You have been removed from this room because the room has changed to members-only and you're not a member"
+msgstr "Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"
+
+#: converse.js:1420
+msgid "You have been removed from this room because the MUC (Multi-user chat) service is being shut down."
+msgstr "Sei stato rimosso da questa stanza poiché il servizio MUC (Chat multi utente) è in fase di spegnimento"
+
+#: converse.js:1476
+msgid "You are not on the member list of this room"
+msgstr "Non sei nella lista dei membri di questa stanza"
+
+#: converse.js:1482
+msgid "No nickname was specified"
+msgstr "Nessun soprannome specificato"
+
+#: converse.js:1486
+msgid "You are not allowed to create new rooms"
+msgstr "Non ti è permesso creare nuove stanze"
+
+#: converse.js:1488
+msgid "Your nickname doesn't conform to this room's policies"
+msgstr "Il tuo soprannome non è conforme alle regole di questa stanza"
+
+#: converse.js:1490
+msgid "Your nickname is already taken"
+msgstr "Il tuo soprannome è già utilizzato"
+
+#: converse.js:1492
+msgid "This room does not (yet) exist"
+msgstr "Questa stanza non esiste (per ora)"
+
+#: converse.js:1494
+msgid "This room has reached it's maximum number of occupants"
+msgstr "Questa stanza ha raggiunto il limite massimo di utenti"
+
+#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
+#. Example: Topic set by JC Brand to: Hello World!
+#: converse.js:1571
+msgid "Topic set by %1$s to: %2$s"
+msgstr "Topic impostato da %1$s a: %2$s"
+
+#: converse.js:1587
+msgid "This user is a moderator"
+msgstr "Questo utente è un moderatore"
+
+#: converse.js:1590
+msgid "This user can send messages in this room"
+msgstr "Questo utente può inviare messaggi in questa stanza"
+
+#: converse.js:1593
+msgid "This user can NOT send messages in this room"
+msgstr "Questo utente NON può inviare messaggi in questa stanza"
+
+#: converse.js:1796
+msgid "Click to chat with this contact"
+msgstr "Clicca per parlare con questo contatto"
+
+#: converse.js:1797
+#: converse.js:1801
+msgid "Click to remove this contact"
+msgstr "Clicca per rimuovere questo contatto"
+
+#: converse.js:2163
+msgid "Contact requests"
+msgstr "Richieste dei contatti"
+
+#: converse.js:2164
+msgid "My contacts"
+msgstr "I miei contatti"
+
+#: converse.js:2165
+msgid "Pending contacts"
+msgstr "Contatti in attesa"
+
+#: converse.js:2317
+msgid "Custom status"
+msgstr "Stato personalizzato"
+
+#: converse.js:2323
+msgid "Click to change your chat status"
+msgstr "Clicca per cambiare il tuo stato"
+
+#: converse.js:2326
+msgid "Click here to write a custom status message"
+msgstr "Clicca qui per scrivere un messaggio di stato personalizzato"
+
+#: converse.js:2355
+#: converse.js:2363
+msgid "online"
+msgstr "in linea"
+
+#: converse.js:2357
+msgid "busy"
+msgstr "occupato"
+
+#: converse.js:2359
+msgid "away for long"
+msgstr "assente da molto"
+
+#: converse.js:2361
+msgid "away"
+msgstr "assente"
+
+#. For translators: the %1$s part gets replaced with the status
+#. Example, I am online
+#: converse.js:2375
+#: converse.js:2409
+msgid "I am %1$s"
+msgstr "Sono %1$s"
+
+#: converse.js:2480
+msgid "Sign in"
+msgstr "Accesso"
+
+#: converse.js:2483
+msgid "XMPP/Jabber Username:"
+msgstr "Nome utente:"
+
+#: converse.js:2485
+msgid "Password:"
+msgstr "Password:"
+
+#: converse.js:2487
+msgid "Log In"
+msgstr "Entra"
+
+#: converse.js:2491
+msgid "BOSH Service URL:"
+msgstr "Indirizzo servizio BOSH:"
+
+#: converse.js:2503
+msgid "Connected"
+msgstr "Connesso"
+
+#: converse.js:2507
+msgid "Disconnected"
+msgstr "Disconnesso"
+
+#: converse.js:2511
+msgid "Error"
+msgstr "Errore"
+
+#: converse.js:2513
+msgid "Connecting"
+msgstr "Connessione in corso"
+
+#: converse.js:2516
+msgid "Connection Failed"
+msgstr "Connessione fallita"
+
+#: converse.js:2518
+msgid "Authenticating"
+msgstr "Autenticazione in corso"
+
+#: converse.js:2521
+msgid "Authentication Failed"
+msgstr "Autenticazione fallita"
+
+#: converse.js:2523
+msgid "Disconnecting"
+msgstr "Disconnessione in corso"
+
+#: converse.js:2525
+msgid "Attached"
+msgstr "Allegato"
+
+#: converse.js:2656
+msgid "Online Contacts"
+msgstr "Contatti in linea"
+

+ 470 - 0
locale/it/LC_MESSAGES/it.js

@@ -0,0 +1,470 @@
+(function (root, factory) {
+    define("it", ['jed'], function () {
+        var it = new Jed({
+            "domain": "converse",
+            "locale_data": {
+               "converse": {
+                  "": {
+                     "Project-Id-Version": "Converse.js 0.4",
+                     "Report-Msgid-Bugs-To": "",
+                     "POT-Creation-Date": "2013-07-20 23:03+0200",
+                     "PO-Revision-Date": "2013-07-20 13:58+0200",
+                     "Last-Translator": "Fabio Bas <ctrlaltca@gmail.com>",
+                     "Language-Team": "Italian",
+                     "Language": "it",
+                     "MIME-Version": "1.0",
+                     "Content-Type": "text/plain; charset=ASCII",
+                     "Content-Transfer-Encoding": "8bit",
+                     "Plural-Forms": "nplurals=2; plural=(n != 1);",
+                     "domain": "converse",
+                     "lang": "it",
+                     "plural_forms": "nplurals=2; plural=(n != 1);"
+                  },
+                  "Show this menu": [
+                     null,
+                     "Mostra questo menu"
+                  ],
+                  "Write in the third person": [
+                     null,
+                     "Scrivi in terza persona"
+                  ],
+                  "Remove messages": [
+                     null,
+                     "Rimuovi messaggi"
+                  ],
+                  "Personal message": [
+                     null,
+                     "Messaggio personale"
+                  ],
+                  "Contacts": [
+                     null,
+                     "Contatti"
+                  ],
+                  "Online": [
+                     null,
+                     "In linea"
+                  ],
+                  "Busy": [
+                     null,
+                     "Occupato"
+                  ],
+                  "Away": [
+                     null,
+                     "Assente"
+                  ],
+                  "Offline": [
+                     null,
+                     "Non in linea"
+                  ],
+                  "Click to add new chat contacts": [
+                     null,
+                     "Clicca per aggiungere nuovi contatti alla chat"
+                  ],
+                  "Add a contact": [
+                     null,
+                     "Aggiungi un contatto"
+                  ],
+                  "Contact username": [
+                     null,
+                     "Nome utente del contatto"
+                  ],
+                  "Add": [
+                     null,
+                     "Aggiungi"
+                  ],
+                  "Contact name": [
+                     null,
+                     "Nome del contatto"
+                  ],
+                  "Search": [
+                     null,
+                     "Cerca"
+                  ],
+                  "No users found": [
+                     null,
+                     "Nessun utente trovato"
+                  ],
+                  "Click to add as a chat contact": [
+                     null,
+                     "Clicca per aggiungere il contatto alla chat"
+                  ],
+                  "Click to open this room": [
+                     null,
+                     "Clicca per aprire questa stanza"
+                  ],
+                  "Show more information on this room": [
+                     null,
+                     "Mostra più informazioni su questa stanza"
+                  ],
+                  "Description:": [
+                     null,
+                     "Descrizione:"
+                  ],
+                  "Occupants:": [
+                     null,
+                     "Utenti presenti:"
+                  ],
+                  "Features:": [
+                     null,
+                     "Funzionalità:"
+                  ],
+                  "Requires authentication": [
+                     null,
+                     "Richiede autenticazione"
+                  ],
+                  "Hidden": [
+                     null,
+                     "Nascosta"
+                  ],
+                  "Requires an invitation": [
+                     null,
+                     "Richiede un invito"
+                  ],
+                  "Moderated": [
+                     null,
+                     "Moderata"
+                  ],
+                  "Non-anonymous": [
+                     null,
+                     "Non-anonima"
+                  ],
+                  "Open room": [
+                     null,
+                     "Stanza aperta"
+                  ],
+                  "Permanent room": [
+                     null,
+                     "Stanza permanente"
+                  ],
+                  "Public": [
+                     null,
+                     "Pubblica"
+                  ],
+                  "Semi-anonymous": [
+                     null,
+                     "Semi-anonima"
+                  ],
+                  "Temporary room": [
+                     null,
+                     "Stanza temporanea"
+                  ],
+                  "Unmoderated": [
+                     null,
+                     "Non moderata"
+                  ],
+                  "Rooms": [
+                     null,
+                     "Stanze"
+                  ],
+                  "Room name": [
+                     null,
+                     "Nome stanza"
+                  ],
+                  "Nickname": [
+                     null,
+                     "Soprannome"
+                  ],
+                  "Server": [
+                     null,
+                     "Server"
+                  ],
+                  "Join": [
+                     null,
+                     "Entra"
+                  ],
+                  "Show rooms": [
+                     null,
+                     "Mostra stanze"
+                  ],
+                  "No rooms on %1$s": [
+                     null,
+                     "Nessuna stanza su %1$s"
+                  ],
+                  "Rooms on %1$s": [
+                     null,
+                     "Stanze su %1$s"
+                  ],
+                  "Set chatroom topic": [
+                     null,
+                     "Cambia oggetto della stanza"
+                  ],
+                  "Kick user from chatroom": [
+                     null,
+                     "Espelli utente dalla stanza"
+                  ],
+                  "Ban user from chatroom": [
+                     null,
+                     "Bandisci utente dalla stanza"
+                  ],
+                  "Message": [
+                     null,
+                     "Messaggio"
+                  ],
+                  "Save": [
+                     null,
+                     "Salva"
+                  ],
+                  "Cancel": [
+                     null,
+                     "Annulla"
+                  ],
+                  "An error occurred while trying to save the form.": [
+                     null,
+                     "Errore durante il salvataggio del modulo"
+                  ],
+                  "This chatroom requires a password": [
+                     null,
+                     "Questa stanza richiede una password"
+                  ],
+                  "Password: ": [
+                     null,
+                     "Password: "
+                  ],
+                  "Submit": [
+                     null,
+                     "Invia"
+                  ],
+                  "This room is not anonymous": [
+                     null,
+                     "Questa stanza non è anonima"
+                  ],
+                  "This room now shows unavailable members": [
+                     null,
+                     "Questa stanza mostra i membri non disponibili al momento"
+                  ],
+                  "This room does not show unavailable members": [
+                     null,
+                     "Questa stanza non mostra i membri non disponibili"
+                  ],
+                  "Non-privacy-related room configuration has changed": [
+                     null,
+                     "Una configurazione della stanza non legata alla privacy è stata modificata"
+                  ],
+                  "Room logging is now enabled": [
+                     null,
+                     "La registrazione è abilitata nella stanza"
+                  ],
+                  "Room logging is now disabled": [
+                     null,
+                     "La registrazione è disabilitata nella stanza"
+                  ],
+                  "This room is now non-anonymous": [
+                     null,
+                     "Questa stanza è non-anonima"
+                  ],
+                  "This room is now semi-anonymous": [
+                     null,
+                     "Questa stanza è semi-anonima"
+                  ],
+                  "This room is now fully-anonymous": [
+                     null,
+                     "Questa stanza è completamente-anonima"
+                  ],
+                  "A new room has been created": [
+                     null,
+                     "Una nuova stanza è stata creata"
+                  ],
+                  "Your nickname has been changed": [
+                     null,
+                     "Il tuo soprannome è stato cambiato"
+                  ],
+                  "<strong>%1$s</strong> has been banned": [
+                     null,
+                     "<strong>%1$s</strong> è stato bandito"
+                  ],
+                  "<strong>%1$s</strong> has been kicked out": [
+                     null,
+                     "<strong>%1$s</strong> è stato espulso"
+                  ],
+                  "<strong>%1$s</strong> has been removed because of an affiliation change": [
+                     null,
+                     "<strong>%1$s</strong> è stato rimosso a causa di un cambio di affiliazione"
+                  ],
+                  "<strong>%1$s</strong> has been removed for not being a member": [
+                     null,
+                     "<strong>%1$s</strong> è stato rimosso in quanto non membro"
+                  ],
+                  "You have been banned from this room": [
+                     null,
+                     "Sei stato bandito da questa stanza"
+                  ],
+                  "You have been kicked from this room": [
+                     null,
+                     "Sei stato espulso da questa stanza"
+                  ],
+                  "You have been removed from this room because of an affiliation change": [
+                     null,
+                     "Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"
+                  ],
+                  "You have been removed from this room because the room has changed to members-only and you're not a member": [
+                     null,
+                     "Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"
+                  ],
+                  "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [
+                     null,
+                     "Sei stato rimosso da questa stanza poiché il servizio MUC (Chat multi utente) è in fase di spegnimento"
+                  ],
+                  "You are not on the member list of this room": [
+                     null,
+                     "Non sei nella lista dei membri di questa stanza"
+                  ],
+                  "No nickname was specified": [
+                     null,
+                     "Nessun soprannome specificato"
+                  ],
+                  "You are not allowed to create new rooms": [
+                     null,
+                     "Non ti è permesso creare nuove stanze"
+                  ],
+                  "Your nickname doesn't conform to this room's policies": [
+                     null,
+                     "Il tuo soprannome non è conforme alle regole di questa stanza"
+                  ],
+                  "Your nickname is already taken": [
+                     null,
+                     "Il tuo soprannome è già utilizzato"
+                  ],
+                  "This room does not (yet) exist": [
+                     null,
+                     "Questa stanza non esiste (per ora)"
+                  ],
+                  "This room has reached it's maximum number of occupants": [
+                     null,
+                     "Questa stanza ha raggiunto il limite massimo di utenti"
+                  ],
+                  "Topic set by %1$s to: %2$s": [
+                     null,
+                     "Topic impostato da %1$s a: %2$s"
+                  ],
+                  "This user is a moderator": [
+                     null,
+                     "Questo utente è un moderatore"
+                  ],
+                  "This user can send messages in this room": [
+                     null,
+                     "Questo utente può inviare messaggi in questa stanza"
+                  ],
+                  "This user can NOT send messages in this room": [
+                     null,
+                     "Questo utente NON può inviare messaggi in questa stanza"
+                  ],
+                  "Click to chat with this contact": [
+                     null,
+                     "Clicca per parlare con questo contatto"
+                  ],
+                  "Click to remove this contact": [
+                     null,
+                     "Clicca per rimuovere questo contatto"
+                  ],
+                  "Contact requests": [
+                     null,
+                     "Richieste dei contatti"
+                  ],
+                  "My contacts": [
+                     null,
+                     "I miei contatti"
+                  ],
+                  "Pending contacts": [
+                     null,
+                     "Contatti in attesa"
+                  ],
+                  "Custom status": [
+                     null,
+                     "Stato personalizzato"
+                  ],
+                  "Click to change your chat status": [
+                     null,
+                     "Clicca per cambiare il tuo stato"
+                  ],
+                  "Click here to write a custom status message": [
+                     null,
+                     "Clicca qui per scrivere un messaggio di stato personalizzato"
+                  ],
+                  "online": [
+                     null,
+                     "in linea"
+                  ],
+                  "busy": [
+                     null,
+                     "occupato"
+                  ],
+                  "away for long": [
+                     null,
+                     "assente da molto"
+                  ],
+                  "away": [
+                     null,
+                     "assente"
+                  ],
+                  "I am %1$s": [
+                     null,
+                     "Sono %1$s"
+                  ],
+                  "Sign in": [
+                     null,
+                     "Entra"
+                  ],
+                  "XMPP/Jabber Username:": [
+                     null,
+                     "Nome utente:"
+                  ],
+                  "Password:": [
+                     null,
+                     "Password:"
+                  ],
+                  "Log In": [
+                     null,
+                     "Entra"
+                  ],
+                  "BOSH Service URL:": [
+                     null,
+                     "Indirizzo servizio BOSH:"
+                  ],
+                  "Connected": [
+                     null,
+                     "Connesso"
+                  ],
+                  "Disconnected": [
+                     null,
+                     "Disconnesso"
+                  ],
+                  "Error": [
+                     null,
+                     "Errore"
+                  ],
+                  "Connecting": [
+                     null,
+                     "Connessione in corso"
+                  ],
+                  "Connection Failed": [
+                     null,
+                     "Connessione fallita"
+                  ],
+                  "Authenticating": [
+                     null,
+                     "Autenticazione in corso"
+                  ],
+                  "Authentication Failed": [
+                     null,
+                     "Autenticazione fallita"
+                  ],
+                  "Disconnecting": [
+                     null,
+                     "Disconnessione in corso"
+                  ],
+                  "Attached": [
+                     null,
+                     "Allegato"
+                  ],
+                  "Online Contacts": [
+                     null,
+                     "Contatti in linea"
+                  ]
+               }
+            }
+        });
+        return factory(it);
+    });
+}(this, function (it) { 
+    return it; 
+}));

+ 38 - 0
locale/locales.js

@@ -0,0 +1,38 @@
+/*
+ * This file specifies the language dependencies.
+ *
+ * Translations take up a lot of space and you are therefore advised to remove
+ * from here any languages that you don't need.
+ */
+
+(function (root, factory) {
+    require.config({
+        paths: {
+            "jed": "Libraries/jed",
+            "af": "locale/af/LC_MESSAGES/af",
+            "en": "locale/en/LC_MESSAGES/en",
+            "es": "locale/es/LC_MESSAGES/es",
+            "de": "locale/de/LC_MESSAGES/de",
+            "hu": "locale/hu/LC_MESSAGES/hu",
+            "it": "locale/it/LC_MESSAGES/it"
+        }
+    });
+
+    define("locales", [
+        'jed',
+        'af',
+        'en',
+        'es',
+        'de',
+        'hu',
+        "it"
+        ], function (jed, af, en, es, de, hu, it) {
+            root.locales = {};
+            root.locales.af = af;
+            root.locales.en = en;
+            root.locales.es = es;
+            root.locales.de = de;
+            root.locales.hu = hu;
+            root.locales.it = it;
+        });
+})(this);

+ 1 - 3
main.js

@@ -1,5 +1,3 @@
 require(["jquery", "converse"], function($, converse) {
 require(["jquery", "converse"], function($, converse) {
-    converse.initialize({
+    window.converse = converse;
-        bosh_service_url: 'https://bind.opkode.im' // Please use this connection manager only for testing purposes
-    });
 });
 });

+ 19 - 11
mock.js

@@ -1,8 +1,8 @@
 (function (root, factory) {
 (function (root, factory) {
-    define("mock", 
+    define("mock",
-        ['converse'], 
+        ['converse'],
-        function() { 
+        function() {
-            return factory(); 
+            return factory();
         });
         });
 }(this, function (converse) {
 }(this, function (converse) {
     var mock_connection = {
     var mock_connection = {
@@ -10,10 +10,11 @@
             'listRooms': function () {},
             'listRooms': function () {},
             'join': function () {},
             'join': function () {},
             'leave': function () {},
             'leave': function () {},
-            'removeRoom': function () {}
+            'removeRoom': function () {},
+            'rooms': {}
         },
         },
         'jid': 'dummy@localhost',
         'jid': 'dummy@localhost',
-        'addHandler': function (handler, ns, name, type, id, from, options) { 
+        'addHandler': function (handler, ns, name, type, id, from, options) {
             return function () {};
             return function () {};
         },
         },
         'send': function () {},
         'send': function () {},
@@ -25,15 +26,22 @@
             'subscribe': function () {},
             'subscribe': function () {},
             'registerCallback': function () {}
             'registerCallback': function () {}
         },
         },
-        'vcard': { 
+        'vcard': {
             'get': function (callback, jid) {
             'get': function (callback, jid) {
-                var name = jid.split('@')[0].replace('.', ' ').split(' ');
+                var firstname, lastname;
-                var firstname = name[0].charAt(0).toUpperCase()+name[0].slice(1);
+                if (!jid) {
-                var lastname = name[1].charAt(0).toUpperCase()+name[1].slice(1);
+                    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 fullname = firstname+' '+lastname;
                 var vcard = $iq().c('vCard').c('FN').t(fullname);
                 var vcard = $iq().c('vCard').c('FN').t(fullname);
                 callback(vcard.tree());
                 callback(vcard.tree());
-            } 
+            }
         },
         },
         'disco': {
         'disco': {
             'info': function () {},
             'info': function () {},

+ 34 - 0
package.json

@@ -0,0 +1,34 @@
+{
+  "name": "converse.js",
+  "version": "0.5.0",
+  "description": "Browser based XMPP instant messaging client",
+  "main": "main.js",
+  "directories": {
+    "doc": "docs"
+  },
+  "scripts": {
+    "test": ""
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/jcbrand/converse.js.git"
+  },
+  "keywords": [
+    "XMPP",
+    "Jabber",
+    "chat",
+    "messaging",
+    "chatrooms",
+    "webchat"
+  ],
+  "author": "JC Brand",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/jcbrand/converse.js/issues"
+  },
+  "devDependencies": {
+    "grunt-cli": "~0.1.9",
+    "grunt": "~0.4.1",
+    "grunt-contrib-jshint": "~0.6.0"
+  }
+}

+ 9 - 9
spec/ChatRoomSpec.js

@@ -147,7 +147,7 @@
                     expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                     expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                     expect(view.renderPasswordForm).toHaveBeenCalled();
                     expect(view.renderPasswordForm).toHaveBeenCalled();
                     expect($chat_body.find('form.chatroom-form').length).toBe(1);
                     expect($chat_body.find('form.chatroom-form').length).toBe(1);
-                    expect($chat_body.find('legend').text()).toBe('This chat room requires a password');
+                    expect($chat_body.find('legend').text()).toBe('This chatroom requires a password');
                 });
                 });
             }, converse));
             }, converse));
 
 
@@ -162,7 +162,7 @@
                     .c('registration-required').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                     .c('registration-required').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 spyOn(converse.connection.muc, 'removeRoom');
                 spyOn(converse.connection.muc, 'removeRoom');
-                spyOn(view, 'renderErrorMessage').andCallThrough();
+                spyOn(view, 'showErrorMessage').andCallThrough();
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(view.$el.find('.chat-body p').text()).toBe('You are not on the member list of this room');
                 expect(view.$el.find('.chat-body p').text()).toBe('You are not on the member list of this room');
@@ -179,7 +179,7 @@
                     .c('forbidden').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                     .c('forbidden').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 spyOn(converse.connection.muc, 'removeRoom');
                 spyOn(converse.connection.muc, 'removeRoom');
-                spyOn(view, 'renderErrorMessage').andCallThrough();
+                spyOn(view, 'showErrorMessage').andCallThrough();
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(view.$el.find('.chat-body p').text()).toBe('You have been banned from this room');
                 expect(view.$el.find('.chat-body p').text()).toBe('You have been banned from this room');
@@ -196,7 +196,7 @@
                     .c('jid-malformed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                     .c('jid-malformed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 spyOn(converse.connection.muc, 'removeRoom');
                 spyOn(converse.connection.muc, 'removeRoom');
-                spyOn(view, 'renderErrorMessage').andCallThrough();
+                spyOn(view, 'showErrorMessage').andCallThrough();
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(view.$el.find('.chat-body p').text()).toBe('No nickname was specified');
                 expect(view.$el.find('.chat-body p').text()).toBe('No nickname was specified');
@@ -213,7 +213,7 @@
                     .c('not-allowed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                     .c('not-allowed').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 spyOn(converse.connection.muc, 'removeRoom');
                 spyOn(converse.connection.muc, 'removeRoom');
-                spyOn(view, 'renderErrorMessage').andCallThrough();
+                spyOn(view, 'showErrorMessage').andCallThrough();
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(view.$el.find('.chat-body p').text()).toBe('You are not allowed to create new rooms');
                 expect(view.$el.find('.chat-body p').text()).toBe('You are not allowed to create new rooms');
@@ -230,7 +230,7 @@
                     .c('not-acceptable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                     .c('not-acceptable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 spyOn(converse.connection.muc, 'removeRoom');
                 spyOn(converse.connection.muc, 'removeRoom');
-                spyOn(view, 'renderErrorMessage').andCallThrough();
+                spyOn(view, 'showErrorMessage').andCallThrough();
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(view.$el.find('.chat-body p').text()).toBe("Your nickname doesn't conform to this room's policies");
                 expect(view.$el.find('.chat-body p').text()).toBe("Your nickname doesn't conform to this room's policies");
@@ -247,7 +247,7 @@
                     .c('conflict').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                     .c('conflict').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 spyOn(converse.connection.muc, 'removeRoom');
                 spyOn(converse.connection.muc, 'removeRoom');
-                spyOn(view, 'renderErrorMessage').andCallThrough();
+                spyOn(view, 'showErrorMessage').andCallThrough();
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(view.$el.find('.chat-body p').text()).toBe("Your nickname is already taken");
                 expect(view.$el.find('.chat-body p').text()).toBe("Your nickname is already taken");
@@ -264,7 +264,7 @@
                     .c('item-not-found').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                     .c('item-not-found').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 spyOn(converse.connection.muc, 'removeRoom');
                 spyOn(converse.connection.muc, 'removeRoom');
-                spyOn(view, 'renderErrorMessage').andCallThrough();
+                spyOn(view, 'showErrorMessage').andCallThrough();
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(view.$el.find('.chat-body p').text()).toBe("This room does not (yet) exist");
                 expect(view.$el.find('.chat-body p').text()).toBe("This room does not (yet) exist");
@@ -281,7 +281,7 @@
                     .c('service-unavailable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                     .c('service-unavailable').attrs({xmlns:'urn:ietf:params:xml:ns:xmpp-stanzas'}).nodeTree;
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 var view = this.chatboxesview.views['problematic@muc.localhost'];
                 spyOn(converse.connection.muc, 'removeRoom');
                 spyOn(converse.connection.muc, 'removeRoom');
-                spyOn(view, 'renderErrorMessage').andCallThrough();
+                spyOn(view, 'showErrorMessage').andCallThrough();
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 view.onChatRoomPresence(presence, {'nick': 'dummy'});
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(converse.connection.muc.removeRoom).toHaveBeenCalled();
                 expect(view.$el.find('.chat-body p').text()).toBe("This room has reached it's maximum number of occupants");
                 expect(view.$el.find('.chat-body p').text()).toBe("This room has reached it's maximum number of occupants");

+ 19 - 22
spec/MainSpec.js

@@ -54,7 +54,7 @@
                 expect($("div#controlbox").is(':visible')).toBe(true);
                 expect($("div#controlbox").is(':visible')).toBe(true);
             }, converse);
             }, converse);
             it("can be opened by clicking a DOM element with class 'toggle-online-users'", open_controlbox);
             it("can be opened by clicking a DOM element with class 'toggle-online-users'", open_controlbox);
-            
+
             describe("The Status Widget", $.proxy(function () {
             describe("The Status Widget", $.proxy(function () {
                 it("can be used to set the current user's chat status", $.proxy(function () {
                 it("can be used to set the current user's chat status", $.proxy(function () {
                     var view = this.xmppstatusview;
                     var view = this.xmppstatusview;
@@ -121,7 +121,7 @@
                     var i, t, is_last;
                     var i, t, is_last;
                     spyOn(this.rosterview, 'render').andCallThrough();
                     spyOn(this.rosterview, 'render').andCallThrough();
                     for (i=0; i<pend_names.length; i++) {
                     for (i=0; i<pend_names.length; i++) {
-                        is_last = i==(pend_names.length-1);
+                        is_last = i===(pend_names.length-1);
                         this.roster.create({
                         this.roster.create({
                             jid: pend_names[i].replace(' ','.').toLowerCase() + '@localhost',
                             jid: pend_names[i].replace(' ','.').toLowerCase() + '@localhost',
                             subscription: 'none',
                             subscription: 'none',
@@ -129,7 +129,7 @@
                             fullname: pend_names[i],
                             fullname: pend_names[i],
                             is_last: is_last
                             is_last: is_last
                         });
                         });
-                        // For performance reasons, the roster should only be shown once 
+                        // For performance reasons, the roster should only be shown once
                         // the last contact has been added.
                         // the last contact has been added.
                         if (is_last) {
                         if (is_last) {
                             expect(this.rosterview.$el.is(':visible')).toEqual(true);
                             expect(this.rosterview.$el.is(':visible')).toEqual(true);
@@ -162,7 +162,7 @@
                             subscription: 'both',
                             subscription: 'both',
                             ask: null,
                             ask: null,
                             fullname: cur_names[i],
                             fullname: cur_names[i],
-                            is_last: i==(cur_names.length-1)
+                            is_last: i===(cur_names.length-1)
                         });
                         });
                         expect(this.rosterview.render).toHaveBeenCalled();
                         expect(this.rosterview.render).toHaveBeenCalled();
                         // Check that they are sorted alphabetically
                         // Check that they are sorted alphabetically
@@ -291,7 +291,7 @@
                             subscription: 'none',
                             subscription: 'none',
                             ask: 'request',
                             ask: 'request',
                             fullname: req_names[i],
                             fullname: req_names[i],
-                            is_last: i==(req_names.length-1)
+                            is_last: i===(req_names.length-1)
                         });
                         });
                         expect(this.rosterview.render).toHaveBeenCalled();
                         expect(this.rosterview.render).toHaveBeenCalled();
                         // Check that they are sorted alphabetically
                         // Check that they are sorted alphabetically
@@ -335,7 +335,7 @@
                     expect(this.rosterview.removeRosterItem).toHaveBeenCalled();
                     expect(this.rosterview.removeRosterItem).toHaveBeenCalled();
                     expect(this.connection.roster.unauthorize).toHaveBeenCalled();
                     expect(this.connection.roster.unauthorize).toHaveBeenCalled();
                     // There should now be one less contact
                     // There should now be one less contact
-                    expect(this.roster.length).toEqual(num_contacts-1); 
+                    expect(this.roster.length).toEqual(num_contacts-1);
                 }, converse));
                 }, converse));
             }, converse));
             }, converse));
 
 
@@ -368,7 +368,7 @@
 
 
                 afterEach($.proxy(function () {
                 afterEach($.proxy(function () {
                     // Contacts retrieved from localStorage have chat_status of
                     // Contacts retrieved from localStorage have chat_status of
-                    // "offline". 
+                    // "offline".
                     // In the next test suite, we need some online contacts, so
                     // In the next test suite, we need some online contacts, so
                     // we make some online now
                     // we make some online now
                     for (i=0; i<5; i++) {
                     for (i=0; i<5; i++) {
@@ -456,7 +456,7 @@
                 expect(newchatboxes.length).toEqual(0);
                 expect(newchatboxes.length).toEqual(0);
 
 
                 // Lets open the controlbox again, purely for visual feedback
                 // Lets open the controlbox again, purely for visual feedback
-                open_controlbox(); 
+                open_controlbox();
             }, converse));
             }, converse));
 
 
             describe("A Chat Message", $.proxy(function () {
             describe("A Chat Message", $.proxy(function () {
@@ -465,14 +465,12 @@
                     var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
                     var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
                         msg = $msg({
                         msg = $msg({
                             from: sender_jid,
                             from: sender_jid,
-                            to: this.connection.jid, 
+                            to: this.connection.jid,
-                            type: 'chat', 
+                            type: 'chat',
                             id: (new Date()).getTime()
                             id: (new Date()).getTime()
                         }).c('body').t(message).up()
                         }).c('body').t(message).up()
                           .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                           .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
 
 
-                    spyOn(this, 'getVCard').andCallThrough();
-
                     // We don't already have an open chatbox for this user
                     // We don't already have an open chatbox for this user
                     expect(this.chatboxes.get(sender_jid)).not.toBeDefined();
                     expect(this.chatboxes.get(sender_jid)).not.toBeDefined();
 
 
@@ -483,10 +481,6 @@
                     }, converse));
                     }, converse));
                     waits(500);
                     waits(500);
                     runs($.proxy(function () {
                     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
                         // Check that the chatbox and its view now exist
                         var chatbox = this.chatboxes.get(sender_jid);
                         var chatbox = this.chatboxes.get(sender_jid);
                         var chatboxview = this.chatboxesview.views[sender_jid];
                         var chatboxview = this.chatboxesview.views[sender_jid];
@@ -504,8 +498,11 @@
                         expect(msg_obj.get('delayed')).toEqual(false);
                         expect(msg_obj.get('delayed')).toEqual(false);
                         // Now check that the message appears inside the
                         // Now check that the message appears inside the
                         // chatbox in the DOM
                         // chatbox in the DOM
-                        var txt = chatboxview.$el.find('.chat-content').find('.chat-message').find('.chat-message-content').text();
+                        var $chat_content = chatboxview.$el.find('.chat-content');
-                        expect(txt).toEqual(message);
+                        var msg_txt = $chat_content.find('.chat-message').find('.chat-message-content').text();
+                        expect(msg_txt).toEqual(message);
+                        var sender_txt = $chat_content.find('span.chat-message-them').text();
+                        expect(sender_txt.match(/^[0-9][0-9]:[0-9][0-9] /)).toBeTruthy();
                     }, converse));
                     }, converse));
                 }, converse));
                 }, converse));
 
 
@@ -537,8 +534,8 @@
                 var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
                 var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
                     msg = $msg({
                     msg = $msg({
                         from: sender_jid,
                         from: sender_jid,
-                        to: this.connection.jid, 
+                        to: this.connection.jid,
-                        type: 'chat', 
+                        type: 'chat',
                         id: (new Date()).getTime()
                         id: (new Date()).getTime()
                     }).c('body').t(message).up()
                     }).c('body').t(message).up()
                       .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                       .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
@@ -566,8 +563,8 @@
                 var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
                 var sender_jid = cur_names[0].replace(' ','.').toLowerCase() + '@localhost';
                     msg = $msg({
                     msg = $msg({
                         from: sender_jid,
                         from: sender_jid,
-                        to: this.connection.jid, 
+                        to: this.connection.jid,
-                        type: 'chat', 
+                        type: 'chat',
                         id: (new Date()).getTime()
                         id: (new Date()).getTime()
                     }).c('body').t(message).up()
                     }).c('body').t(message).up()
                       .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();
                       .c('active', {'xmlns': 'http://jabber.org/protocol/chatstates'}).tree();

Some files were not shown because too many files changed in this diff