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

Merge branch 'master' into gh-pages

parents 4f03f43e 6f126db8
...@@ -4,39 +4,29 @@ Changelog ...@@ -4,39 +4,29 @@ Changelog
0.4 (Unreleased) 0.4 (Unreleased)
---------------- ----------------
- CSS tweaks: fixed overflowing text in status message and chatrooms list. - CSS tweaks: fixed overflowing text in status message and chatrooms list. [jcbrand]
[jcbrand] - Bugfix: Couldn't join chatroom when clicking from a list of rooms. [jcbrand]
- Bugfix: Cannot join chatroom when clicking from a list of rooms. - Add better support for kicking or banning users from chatrooms. [jcbrand]
[jcbrand] - Fixed alignment of chat messages in Firefox. [jcbrand]
- Add better support for kicking or banning users from chatrooms. - More intelligent fetching of vCards. [jcbrand]
[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. - 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)
......
This diff is collapsed.
(function (root, factory) {
define("locales", [
'jed',
'af',
'en'
], function (jed, af, en) {
root.locales = {};
root.locales.af = af;
root.locales.en = en;
});
})(this);
...@@ -11,30 +11,31 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./d ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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
......
...@@ -2,6 +2,10 @@ ...@@ -2,6 +2,10 @@
baseUrl: ".", baseUrl: ".",
paths: { paths: {
"jquery": "Libraries/require-jquery", "jquery": "Libraries/require-jquery",
"jed": "Libraries/jed",
"locales": "Libraries/locales",
"af": "locale/af/LC_MESSAGES/af",
"en": "locale/en/LC_MESSAGES/en",
"sjcl": "Libraries/sjcl", "sjcl": "Libraries/sjcl",
"tinysort": "Libraries/jquery.tinysort", "tinysort": "Libraries/jquery.tinysort",
"underscore": "Libraries/underscore", "underscore": "Libraries/underscore",
......
...@@ -174,24 +174,29 @@ ul.participant-list li.moderator { ...@@ -174,24 +174,29 @@ 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-info { .chat-event, .chat-date, .chat-info {
...@@ -263,7 +268,7 @@ div.chat-title { ...@@ -263,7 +268,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;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -29,7 +29,7 @@ webchat experience and that you have control over the data. The latter being a ...@@ -29,7 +29,7 @@ webchat experience and that you have control over the data. The latter being a
requirement for many sites dealing with sensitive information. 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
`Session support`_ (i.e. single-signon functionality whereby users are authenticated once and stay `Session Support`_ (i.e. single-signon functionality whereby users are authenticated once and stay
logged in to XMPP upon page reload) you will also have to add some server-side logged in to XMPP upon page reload) you will also have to add some server-side
code. code.
...@@ -47,7 +47,7 @@ An XMPP/Jabber server ...@@ -47,7 +47,7 @@ An XMPP/Jabber server
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 connect to public XMPP servers like ``jabber.org`` but if you want to You can connect to public XMPP servers like ``jabber.org`` but if you want to
have `Session support`_ you'll have to set up your own XMPP server. have `Session Support`_ you'll have to set up your own XMPP server.
You can find a list of public XMPP servers/providers on `xmpp.net`_ and a list of 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`_. servers that you can set up yourself on `xmpp.org`_.
...@@ -99,7 +99,7 @@ website. This will remove the need for any cross-domain XHR support. ...@@ -99,7 +99,7 @@ website. This will remove the need for any cross-domain XHR support.
Server-side authentication Server-side authentication
========================== ==========================
Session support Session Support
--------------- ---------------
It's possible to enable single-site login, whereby users already It's possible to enable single-site login, whereby users already
...@@ -140,7 +140,7 @@ You'll most likely want to implement some kind of single-signon solution for ...@@ -140,7 +140,7 @@ You'll most likely want to implement some kind of single-signon solution for
your website, where users authenticate once in your website and then stay 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`_. For more info on this, read `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
...@@ -260,8 +260,6 @@ There are two ways to add users. ...@@ -260,8 +260,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
============ ============
...@@ -302,6 +300,91 @@ CSS can be minimized with Yahoo's yuicompressor tool: ...@@ -302,6 +300,91 @@ 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
============
The gettext POT file located in ./locales/converse.pot is the template
containing all translations and from which for each language an individual PO
file is generated.
The POT file contains all translateable strings extracted from converse.js.
To make a user facing string translateable, wrap it in the double underscore helper
function like so:
::
__('This string will be translated at runtime');
After adding the string, you'll need to regenerate the POT file, like so:
::
make pot
You can then create or update the PO file for a specific language by doing the following:
::
msgmerge ./locales/af/LC_MESSAGES/converse.po ./locales/converse.pot -U
This PO file is then what gets translated.
If you've created a new PO file, please make sure to add the following
attributes at the top of the file (under *Content-Transfer-Encoding*). They are
required as configuration settings for Jed, the Javascript translations library
that we're using.
::
"domain: converse\n"
"lang: af\n",
"plural_forms: nplurals=2; plural=(n != 1);\n"
Unfortunately Jed cannot use the PO files directly. We have to generate from it
a file in JSON format and then put that in a .js file for the specific
language.
To generate JSON from a PO file, you'll need po2json for node.js. Run the
following command to install it (npm being the node.js package manager):
::
npm install po2json
You can then convert the translations into JSON format:
::
po2json locales/af/LC_MESSAGES/converse.po locales/af/LC_MESSAGES/converse.json
Now from converse.json paste the data as a value for the "locale_data" key in the
object in the language's .js file.
So, if you are for example translating into German (language code 'de'), you'll
create or update the file ./locale/LC_MESSAGES/de.js with the following code:
::
(function (root, factory) {
define("af", ['jed'], function () {
return factory(new Jed({
"domain": "converse",
"locale_data": {
// Paste the JSON data from converse.json here
}
})
}
}(this, function (i18n) {
return i18n;
}));
making sure to also paste the JSON data as value to the "locale_data" key.
Congratulations, you've now succesfully added your translations. Sorry for all
those hoops you had to jump through.
.. _`conversejs.org`: http://conversejs.org .. _`conversejs.org`: http://conversejs.org
......
...@@ -73,7 +73,7 @@ ...@@ -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" id="id7">Session support</a></li> <li><a class="reference internal" href="#session-support" id="id7">Session Support</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
...@@ -98,6 +98,7 @@ ...@@ -98,6 +98,7 @@
<li><a class="reference internal" href="#minifying-css" id="id21">Minifying CSS</a></li> <li><a class="reference internal" href="#minifying-css" id="id21">Minifying CSS</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#translations" id="id22">Translations</a></li>
</ul> </ul>
</div> </div>
<div class="section" id="introduction"> <div class="section" id="introduction">
...@@ -113,7 +114,7 @@ properly configure and integrate it into your site.</p> ...@@ -113,7 +114,7 @@ properly configure and integrate it into your site.</p>
webchat experience and that you have control over the data. The latter being a 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
<a class="reference internal" href="#session-support">Session support</a> (i.e. single-signon functionality whereby users are authenticated once and stay <a class="reference internal" href="#session-support">Session Support</a> (i.e. single-signon functionality whereby users are authenticated once and stay
logged in to XMPP upon page reload) you will also have to add some server-side 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
...@@ -126,7 +127,7 @@ requirements.</p> ...@@ -126,7 +127,7 @@ requirements.</p>
<p><em>Converse.js</em> implements <a class="reference external" href="https://en.wikipedia.org/wiki/Xmpp">XMPP</a> as its messaging protocol, and therefore needs <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 connect to public XMPP servers like <tt class="docutils literal"><span class="pre">jabber.org</span></tt> but if you want to <p>You can connect to public XMPP servers like <tt class="docutils literal"><span class="pre">jabber.org</span></tt> but if you want to
have <a class="reference internal" href="#session-support">Session support</a> you&#8217;ll have to set up your own XMPP server.</p> have <a class="reference internal" href="#session-support">Session Support</a> you&#8217;ll have to set up your own XMPP server.</p>
<p>You can find a list of public XMPP servers/providers on <a class="reference external" href="http://xmpp.net">xmpp.net</a> and a list of <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> 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>
...@@ -166,7 +167,7 @@ website. This will remove the need for any cross-domain XHR support.</p> ...@@ -166,7 +167,7 @@ website. This will remove the need for any cross-domain XHR support.</p>
<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"> <div class="section" id="session-support">
<h3><a class="toc-backref" href="#id7">Session support</a><a class="headerlink" href="#session-support" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id7">Session Support</a><a class="headerlink" href="#session-support" title="Permalink to this headline"></a></h3>
<p>It&#8217;s possible to enable single-site login, whereby users already <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>
...@@ -196,7 +197,7 @@ practical.</p> ...@@ -196,7 +197,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">Session support</a>.</p> <p>For more info on this, read <a class="reference internal" href="#session-support">Session Support</a>.</p>
<p>You might also want to have more fine-grained control of what gets included in <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>
...@@ -311,6 +312,64 @@ manager, NPM.</p> ...@@ -311,6 +312,64 @@ manager, NPM.</p>
<div class="highlight-python"><pre>yui-compressor --type=css converse.css -o converse.min.css</pre> <div 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="#id22">Translations</a><a class="headerlink" href="#translations" title="Permalink to this headline"></a></h1>
<p>The gettext POT file located in ./locales/converse.pot is the template
containing all translations and from which for each language an individual PO
file is generated.</p>
<p>The POT file contains all translateable strings extracted from converse.js.</p>
<p>To make a user facing string translateable, wrap it in the double underscore helper
function like so:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">__</span><span class="p">(</span><span class="s">&#39;This string will be translated at runtime&#39;</span><span class="p">);</span>
</pre></div>
</div>
<p>After adding the string, you&#8217;ll need to regenerate the POT file, like so:</p>
<div class="highlight-python"><pre>make pot</pre>
</div>
<p>You can then create or update the PO file for a specific language by doing the following:</p>
<div class="highlight-python"><pre>msgmerge ./locales/af/LC_MESSAGES/converse.po ./locales/converse.pot -U</pre>
</div>
<p>This PO file is then what gets translated.</p>
<p>If you&#8217;ve created a new PO file, please make sure to add the following
attributes at the top of the file (under <em>Content-Transfer-Encoding</em>). They are
required as configuration settings for Jed, the Javascript translations library
that we&#8217;re using.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="s">&quot;domain: converse</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;lang: af</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span>
<span class="s">&quot;plural_forms: nplurals=2; plural=(n != 1);</span><span class="se">\n</span><span class="s">&quot;</span>
</pre></div>
</div>
<p>Unfortunately Jed cannot use the PO files directly. We have to generate from it
a file in JSON format and then put that in a .js file for the specific
language.</p>
<p>To generate JSON from a PO file, you&#8217;ll need po2json for node.js. Run the
following command to install it (npm being the node.js package manager):</p>
<div class="highlight-python"><pre>npm install po2json</pre>
</div>
<p>You can then convert the translations into JSON format:</p>
<div class="highlight-python"><pre>po2json locales/af/LC_MESSAGES/converse.po locales/af/LC_MESSAGES/converse.json</pre>
</div>
<p>Now from converse.json paste the data as a value for the &#8220;locale_data&#8221; key in the
object in the language&#8217;s .js file.</p>
<p>So, if you are for example translating into German (language code &#8216;de&#8217;), you&#8217;ll
create or update the file ./locale/LC_MESSAGES/de.js with the following code:</p>
<div class="highlight-python"><pre>(function (root, factory) {
define("af", ['jed'], function () {
return factory(new Jed({
"domain": "converse",
"locale_data": {
// Paste the JSON data from converse.json here
}
})
}
}(this, function (i18n) {
return i18n;
}));</pre>
</div>
<p>making sure to also paste the JSON data as value to the &#8220;locale_data&#8221; key.</p>
<p>Congratulations, you&#8217;ve now succesfully added your translations. Sorry for all
those hoops you had to jump through.</p>
</div> </div>
......
Search.setIndex({objects:{},terms:{all:0,code:0,partial:0,queri:0,webchat:0,middl:0,depend:0,sensit:0,under:0,fals:0,mechan:0,jack:0,veri:0,list:0,pleas:0,prevent:0,second:0,pass:0,download:0,further:0,fullnam:0,even:0,index:0,what:0,hide:0,section:0,current:0,version:0,"new":0,net:0,method:0,here:0,box:0,great:0,convers:0,mysit:0,implement:0,via:0,extra:0,solut:0,href:0,auto_list_room:0,instal:0,zip:0,commun:0,two:0,websit:0,stylesheet:0,call:0,recommend:0,type:0,until:0,tightli:0,more:0,yahoo:0,must:0,room:0,setup:[],xhr:0,can:0,purpos:0,fetch:0,control:0,quickstart:0,share:0,tag:0,proprietari:0,explor:0,occup:0,end:0,goal:0,snippet:0,how:0,sid:0,instead:0,css:0,npm:0,regener:0,product:0,resourc:0,after:0,usabl:0,befor:0,data:0,demonstr:0,man:0,practic:0,bind:0,django:0,inform:0,order:0,xmpp:0,over:0,streamlin:0,write:0,jid:0,fit:0,pend:0,therefor:0,might:0,them:0,anim:0,"return":0,thei:0,initi:0,front:0,now:0,introduct:0,name:0,authent:0,ejabberd:0,each:0,side:0,mean:0,domain:0,realli:0,legwork:0,connect:0,variabl:0,open:0,content:0,rel:0,internet:0,proxi:0,insid:0,standard:0,standalon:0,releas:0,org:0,blogpost:0,keep:0,yui:0,first:0,origin:0,softwar:0,render:0,onc:0,lastnam:0,number:0,yourself:0,restrict:0,alreadi:0,owner:0,jabber:0,differ:0,script:0,messag:0,attach:0,attack:0,luckili:0,option:0,tool:0,specifi:0,compressor:0,part:0,exactli:0,than:0,serv:0,kind:0,provid:0,remov:0,bridg:0,toward:[],browser:0,sai:0,saa:0,modern:0,ani:0,packag:0,have:0,tabl:0,need:0,moffitt:0,bosh_service_url:0,prebind:0,min:0,latter:0,also:0,exampl:0,build:0,which:0,singl:0,sure:0,though:0,track:0,object:0,most:0,deploi:0,homepag:0,don:0,url:0,request:0,xdomainrequest:0,show:0,text:0,session:0,fine:0,find:0,onli:0,locat:0,firstnam:0,configur:0,apach:0,should:0,folder:0,meant:0,get:0,opkod:0,requir:0,enabl:0,"public":0,reload:0,integr:0,where:0,set:0,stroph:0,see:0,close:0,state:0,between:0,experi:0,hide_muc_serv:0,screen:0,javascript:0,job:0,bosh:0,cor:0,instant:0,shortliv:0,conversej:0,etc:0,grain:0,mani:0,login:0,com:0,load:0,backend:0,onconnect:0,json:0,much:0,besid:0,subscrib:0,minifi:0,togeth:0,present:0,multi:0,servic:0,plugin:0,chat:0,demo:0,auto_subscrib:0,site:0,rid:0,minim:0,media:0,make:0,minif:0,cross:0,same:0,html:0,signon:0,http:0,webserv:0,optim:0,upon:0,hand:0,user:0,xhr_user_search:0,recent:0,stateless:0,person:[],contact:0,wherebi:0,thi:0,choos:0,usual:0,protocol:0,just:0,web:0,xmlhttprequest:0,add:0,other:0,input:0,yuicompressor:0,match:0,applic:0,read:0,nginx:0,traffic:0,like:0,xss:0,success:0,specif:0,server:0,benefit:0,either:0,page:0,deal:0,some:0,back:0,deploy:0,overcom:0,refer:0,run:0,host:0,panel:0,src:0,about:0,controlbox:0,manag:0,act:0,own:0,automat:0,your:0,log:0,wai:0,support:0,custom:0,avail:0,start:[],includ:0,lot:0,suit:0,"function":0,properli:0,form:0,bundl:0,link:0,synonym:0,"true":0,longer:0,info:0,made:0,possibl:0,"default":0,below:0,otherwis:0,problem:0,expect:0,featur:0,creat:0,exist:0,file:0,want:0,when:0,detail:0,field:0,valid:0,test:0,you:0,nice:0,node:0,stai:0,requirej:0},objtypes:{},titles:["Introduction"],objnames:{},filenames:["index"]}) Search.setIndex({objects:{},terms:{all:0,code:0,partial:0,queri:0,webchat:0,follow:0,middl:0,depend:0,sensit:0,sorri:0,those:0,under:0,string:0,fals:0,mechan:0,jack:0,veri:0,list:0,pleas:0,prevent:0,past:0,second:0,pass:0,download:0,further:0,fullnam:0,even:0,index:0,what:0,hide:0,section:0,current:0,version:0,"new":0,net:0,"public":0,gener:0,here:0,valu:0,box:0,convert:0,convers:0,mysit:0,implement:0,via:0,extra:0,apach:0,releas:0,href:0,org:0,auto_list_room:0,instal:0,from:0,zip:0,commun:0,doubl:0,two:0,websit:0,stylesheet:0,call:0,recommend:0,type:0,until:0,tightli:0,more:0,yahoo:0,must:0,room:0,setup:[],xhr:0,can:0,lc_messag:0,purpos:0,root:0,fetch:0,control:0,quickstart:0,share:0,templat:0,tag:0,proprietari:0,explor:0,occup:0,end:0,goal:0,write:0,how:0,sid:0,instead:0,css:0,updat:0,npm:0,regener:0,product:0,resourc:0,after:0,usabl:0,befor:0,underscor:0,data:0,demonstr:0,man:0,practic:0,bind:0,django:0,inform:0,order:0,xmpp:0,over:0,through:0,streamlin:0,snippet:0,jid:0,directli:0,fit:0,pend:0,therefor:0,might:0,them:0,anim:0,"return":0,thei:0,initi:0,front:0,now:0,introduct:0,name:0,authent:0,ejabberd:0,each:0,side:0,mean:0,domain:0,individu:0,realli:0,legwork:0,connect:0,extract:0,variabl:0,open:0,content:0,rel:0,internet:0,plural:0,factori:0,po2json:0,proxi:0,insid:0,standard:0,standalon:0,put:0,succesfulli:0,blogpost:0,keep:0,yui:0,first:0,origin:0,softwar:0,render:0,onc:0,hoop:0,lastnam:0,number:0,yourself:0,restrict:0,alreadi:0,owner:0,jabber:0,differ:0,script:0,top:0,messag:0,attach:0,attack:0,jed:0,luckili:0,option:0,tool:0,specifi:0,compressor:0,part:0,exactli:0,than:0,serv:0,jump:0,kind:0,provid:0,remov:0,bridg:0,toward:[],browser:0,sai:0,saa:0,modern:0,ani:0,packag:0,have:0,tabl:0,need:0,moffitt:0,bosh_service_url:0,prebind:0,min:0,latter:0,also:0,exampl:0,build:0,which:0,singl:0,sure:0,though:0,track:0,object:0,most:0,deploi:0,homepag:0,don:0,url:0,request:0,face:0,runtim:0,xdomainrequest:0,show:0,german:0,text:0,session:0,fine:0,find:0,onli:0,locat:0,just:0,configur:0,solut:0,should:0,folder:0,local:0,meant:0,get:0,opkod:0,cannot:0,requir:0,enabl:0,method:0,reload:0,integr:0,contain:0,where:0,set:0,stroph:0,see:0,close:0,state:0,between:0,experi:0,hide_muc_serv:0,attribut:0,kei:0,screen:0,javascript:0,job:0,bosh:0,cor:0,instant:0,shortliv:0,conversej:0,etc:0,grain:0,mani:0,login:0,com:0,load:0,pot:0,backend:0,creat:0,json:0,much:0,besid:0,subscrib:0,msgmerg:0,great:0,minifi:0,togeth:0,i18n:0,present:0,multi:0,servic:0,plugin:0,defin:0,file:0,helper:0,demo:0,auto_subscrib:0,site:0,rid:0,minim:0,media:0,make:0,minif:0,cross:0,same:0,html:0,signon:0,http:0,webserv:0,optim:0,upon:0,hand:0,user:0,xhr_user_search:0,recent:0,stateless:0,person:[],contact:0,command:0,wherebi:0,thi:0,choos:0,usual:0,plural_form:0,protocol:0,firstnam:0,languag:0,web:0,xmlhttprequest:0,had:0,add:0,valid:0,input:0,yuicompressor:0,match:0,applic:0,format:0,read:0,nginx:0,traffic:0,like:0,xss:0,success:0,specif:0,server:0,benefit:0,either:0,page:0,deal:0,nplural:0,some:0,back:0,librari:0,deploy:0,overcom:0,refer:0,run:0,host:0,panel:0,src:0,about:0,controlbox:0,unfortun:0,act:0,own:0,encod:0,automat:0,wrap:0,your:0,manag:0,log:0,wai:0,transfer:0,support:0,custom:0,avail:0,start:[],includ:0,lot:0,suit:0,"function":0,properli:0,form:0,bundl:0,link:0,translat:0,synonym:0,"true":0,congratul:0,requirej:0,info:0,made:0,locale_data:0,possibl:0,"default":0,below:0,otherwis:0,problem:0,expect:0,featur:0,onconnect:0,exist:0,chat:0,want:0,when:0,detail:0,gettext:0,field:0,other:0,test:0,you:0,nice:0,node:0,stai:0,lang:0,longer:0},objtypes:{},titles:["Introduction"],objnames:{},filenames:["index"]})
\ No newline at end of file \ No newline at end of file
...@@ -260,8 +260,6 @@ There are two ways to add users. ...@@ -260,8 +260,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
============ ============
...@@ -302,6 +300,91 @@ CSS can be minimized with Yahoo's yuicompressor tool: ...@@ -302,6 +300,91 @@ 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
============
The gettext POT file located in ./locales/converse.pot is the template
containing all translations and from which for each language an individual PO
file is generated.
The POT file contains all translateable strings extracted from converse.js.
To make a user facing string translateable, wrap it in the double underscore helper
function like so:
::
__('This string will be translated at runtime');
After adding the string, you'll need to regenerate the POT file, like so:
::
make pot
You can then create or update the PO file for a specific language by doing the following:
::
msgmerge ./locales/af/LC_MESSAGES/converse.po ./locales/converse.pot -U
This PO file is then what gets translated.
If you've created a new PO file, please make sure to add the following
attributes at the top of the file (under *Content-Transfer-Encoding*). They are
required as configuration settings for Jed, the Javascript translations library
that we're using.
::
"domain: converse\n"
"lang: af\n"
"plural_forms: nplurals=2; plural=(n != 1);\n"
Unfortunately Jed cannot use the PO files directly. We have to generate from it
a file in JSON format and then put that in a .js file for the specific
language.
To generate JSON from a PO file, you'll need po2json for node.js. Run the
following command to install it (npm being the node.js package manager):
::
npm install po2json
You can then convert the translations into JSON format:
::
po2json locales/af/LC_MESSAGES/converse.po locales/af/LC_MESSAGES/converse.json
Now from converse.json paste the data as a value for the "locale_data" key in the
object in the language's .js file.
So, if you are for example translating into German (language code 'de'), you'll
create or update the file ./locale/LC_MESSAGES/de.js with the following code:
::
(function (root, factory) {
define("af", ['jed'], function () {
return factory(new Jed({
"domain": "converse",
"locale_data": {
// Paste the JSON data from converse.json here
}
})
}
}(this, function (i18n) {
return i18n;
}));
making sure to also paste the JSON data as value to the "locale_data" key.
Congratulations, you've now succesfully added your translations. Sorry for all
those hoops you had to jump through.
.. _`conversejs.org`: http://conversejs.org .. _`conversejs.org`: http://conversejs.org
......
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,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>
......
This diff is collapsed.
This diff is collapsed.
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Jan-Carel Brand
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 23:03+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: converse.js:397 converse.js:1128
msgid "Show this menu"
msgstr ""
#: converse.js:398 converse.js:1129
msgid "Write in the third person"
msgstr ""
#: converse.js:399 converse.js:1133
msgid "Remove messages"
msgstr ""
#: converse.js:539
msgid "Personal message"
msgstr ""
#: converse.js:613
msgid "Contacts"
msgstr ""
#: converse.js:618
msgid "Online"
msgstr ""
#: converse.js:619
msgid "Busy"
msgstr ""
#: converse.js:620
msgid "Away"
msgstr ""
#: converse.js:621
msgid "Offline"
msgstr ""
#: converse.js:628
msgid "Click to add new chat contacts"
msgstr ""
#: converse.js:628
msgid "Add a contact"
msgstr ""
#: converse.js:637
msgid "Contact username"
msgstr ""
#: converse.js:638
msgid "Add"
msgstr ""
#: converse.js:646
msgid "Contact name"
msgstr ""
#: converse.js:647
msgid "Search"
msgstr ""
#: converse.js:682
msgid "No users found"
msgstr ""
#: converse.js:689
msgid "Click to add as a chat contact"
msgstr ""
#: converse.js:753
msgid "Click to open this room"
msgstr ""
#: converse.js:755
msgid "Show more information on this room"
msgstr ""
#: converse.js:760
msgid "Description:"
msgstr ""
#: converse.js:761
msgid "Occupants:"
msgstr ""
#: converse.js:762
msgid "Features:"
msgstr ""
#: converse.js:764
msgid "Requires authentication"
msgstr ""
#: converse.js:767
msgid "Hidden"
msgstr ""
#: converse.js:770
msgid "Requires an invitation"
msgstr ""
#: converse.js:773
msgid "Moderated"
msgstr ""
#: converse.js:776
msgid "Non-anonymous"
msgstr ""
#: converse.js:779
msgid "Open room"
msgstr ""
#: converse.js:782
msgid "Permanent room"
msgstr ""
#: converse.js:785
msgid "Public"
msgstr ""
#: converse.js:788
msgid "Semi-anonymous"
msgstr ""
#: converse.js:791
msgid "Temporary room"
msgstr ""
#: converse.js:794
msgid "Unmoderated"
msgstr ""
#: converse.js:800
msgid "Rooms"
msgstr ""
#: converse.js:804
msgid "Room name"
msgstr ""
#: converse.js:805
msgid "Nickname"
msgstr ""
#: converse.js:806
msgid "Server"
msgstr ""
#: converse.js:807
msgid "Join"
msgstr ""
#: converse.js:808
msgid "Show rooms"
msgstr ""
#. For translators: %1$s is a variable and will be replaced with the XMPP server name
#: converse.js:841
msgid "No rooms on %1$s"
msgstr ""
#. For translators: %1$s is a variable and will be
#. replaced with the XMPP server name
#: converse.js:856
msgid "Rooms on %1$s"
msgstr ""
#: converse.js:1130
msgid "Set chatroom topic"
msgstr ""
#: converse.js:1131
msgid "Kick user from chatroom"
msgstr ""
#: converse.js:1132
msgid "Ban user from chatroom"
msgstr ""
#: converse.js:1159
msgid "Message"
msgstr ""
#: converse.js:1273 converse.js:2318
msgid "Save"
msgstr ""
#: converse.js:1274
msgid "Cancel"
msgstr ""
#: converse.js:1321
msgid "An error occurred while trying to save the form."
msgstr ""
#: converse.js:1367
msgid "This chatroom requires a password"
msgstr ""
#: converse.js:1368
msgid "Password: "
msgstr ""
#: converse.js:1369
msgid "Submit"
msgstr ""
#: converse.js:1383
msgid "This room is not anonymous"
msgstr ""
#: converse.js:1384
msgid "This room now shows unavailable members"
msgstr ""
#: converse.js:1385
msgid "This room does not show unavailable members"
msgstr ""
#: converse.js:1386
msgid "Non-privacy-related room configuration has changed"
msgstr ""
#: converse.js:1387
msgid "Room logging is now enabled"
msgstr ""
#: converse.js:1388
msgid "Room logging is now disabled"
msgstr ""
#: converse.js:1389
msgid "This room is now non-anonymous"
msgstr ""
#: converse.js:1390
msgid "This room is now semi-anonymous"
msgstr ""
#: converse.js:1391
msgid "This room is now fully-anonymous"
msgstr ""
#: converse.js:1392
msgid "A new room has been created"
msgstr ""
#: converse.js:1393
msgid "Your nickname has been changed"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been banned
#: converse.js:1400
msgid "<strong>%1$s</strong> has been banned"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been kicked out
#: converse.js:1404
msgid "<strong>%1$s</strong> has been kicked out"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed because of an affiliasion change
#: converse.js:1408
msgid "<strong>%1$s</strong> has been removed because of an affiliation change"
msgstr ""
#. For translations: %1$s will be replaced with the user's nickname
#. Don't translate "strong"
#. Example: <strong>jcbrand</strong> has been removed for not being a member
#: converse.js:1412
msgid "<strong>%1$s</strong> has been removed for not being a member"
msgstr ""
#: converse.js:1416 converse.js:1478
msgid "You have been banned from this room"
msgstr ""
#: converse.js:1417
msgid "You have been kicked from this room"
msgstr ""
#: converse.js:1418
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
#: converse.js:1419
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr ""
#: converse.js:1420
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr ""
#: converse.js:1476
msgid "You are not on the member list of this room"
msgstr ""
#: converse.js:1482
msgid "No nickname was specified"
msgstr ""
#: converse.js:1486
msgid "You are not allowed to create new rooms"
msgstr ""
#: converse.js:1488
msgid "Your nickname doesn't conform to this room's policies"
msgstr ""
#: converse.js:1490
msgid "Your nickname is already taken"
msgstr ""
#: converse.js:1492
msgid "This room does not (yet) exist"
msgstr ""
#: converse.js:1494
msgid "This room has reached it's maximum number of occupants"
msgstr ""
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1571
msgid "Topic set by %1$s to: %2$s"
msgstr ""
#: converse.js:1587
msgid "This user is a moderator"
msgstr ""
#: converse.js:1590
msgid "This user can send messages in this room"
msgstr ""
#: converse.js:1593
msgid "This user can NOT send messages in this room"
msgstr ""
#: converse.js:1796
msgid "Click to chat with this contact"
msgstr ""
#: converse.js:1797 converse.js:1801
msgid "Click to remove this contact"
msgstr ""
#: converse.js:2163
msgid "Contact requests"
msgstr ""
#: converse.js:2164
msgid "My contacts"
msgstr ""
#: converse.js:2165
msgid "Pending contacts"
msgstr ""
#: converse.js:2317
msgid "Custom status"
msgstr ""
#: converse.js:2323
msgid "Click to change your chat status"
msgstr ""
#: converse.js:2326
msgid "Click here to write a custom status message"
msgstr ""
#: converse.js:2355 converse.js:2363
msgid "online"
msgstr ""
#: converse.js:2357
msgid "busy"
msgstr ""
#: converse.js:2359
msgid "away for long"
msgstr ""
#: converse.js:2361
msgid "away"
msgstr ""
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2375 converse.js:2409
msgid "I am %1$s"
msgstr ""
#: converse.js:2480
msgid "Sign in"
msgstr ""
#: converse.js:2483
msgid "XMPP/Jabber Username:"
msgstr ""
#: converse.js:2485
msgid "Password:"
msgstr ""
#: converse.js:2487
msgid "Log In"
msgstr ""
#: converse.js:2491
msgid "BOSH Service URL:"
msgstr ""
#: converse.js:2503
msgid "Connected"
msgstr ""
#: converse.js:2507
msgid "Disconnected"
msgstr ""
#: converse.js:2511
msgid "Error"
msgstr ""
#: converse.js:2513
msgid "Connecting"
msgstr ""
#: converse.js:2516
msgid "Connection Failed"
msgstr ""
#: converse.js:2518
msgid "Authenticating"
msgstr ""
#: converse.js:2521
msgid "Authentication Failed"
msgstr ""
#: converse.js:2523
msgid "Disconnecting"
msgstr ""
#: converse.js:2525
msgid "Attached"
msgstr ""
#: converse.js:2656
msgid "Online Contacts"
msgstr ""
# German translations for Converse.js package.
# Copyright (C) 2013 Jan-Carel Brand
# This file is distributed under the same license as the Converse.js package.
# JC Brand <jc@opkode.com>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 10:36+0200\n"
"PO-Revision-Date: 2013-06-01 10:48+0200\n"
"Last-Translator: JC Brand <jc@opkode.com>\n"
"Language-Team: German\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: converse.js:416 converse.js:1141
msgid "Show this menu"
msgstr ""
#: converse.js:417 converse.js:1142
msgid "Write in the third person"
msgstr ""
#: converse.js:418 converse.js:1146
msgid "Remove messages"
msgstr ""
#: converse.js:558
msgid "Personal message"
msgstr ""
#: converse.js:632
msgid "Contacts"
msgstr ""
#: converse.js:637
msgid "Online"
msgstr ""
#: converse.js:638
msgid "Busy"
msgstr ""
#: converse.js:639
msgid "Away"
msgstr ""
#: converse.js:640
msgid "Offline"
msgstr ""
#: converse.js:647
msgid "Click to add new chat contacts"
msgstr ""
#: converse.js:647
msgid "Add a contact"
msgstr ""
#: converse.js:656
msgid "Contact username"
msgstr ""
#: converse.js:657
msgid "Add"
msgstr ""
#: converse.js:665
msgid "Contact name"
msgstr ""
#: converse.js:666
msgid "Search"
msgstr ""
#: converse.js:701
msgid "No users found"
msgstr ""
#: converse.js:708
msgid "Click to add as a chat contact"
msgstr ""
#: converse.js:772
msgid "Click to open this room"
msgstr ""
#: converse.js:774
msgid "Show more information on this room"
msgstr ""
#: converse.js:779
msgid "Description:"
msgstr ""
#: converse.js:780
msgid "Occupants:"
msgstr ""
#: converse.js:781
msgid "Features:"
msgstr ""
#: converse.js:783
msgid "Requires authentication"
msgstr ""
#: converse.js:786
msgid "Hidden"
msgstr ""
#: converse.js:789
msgid "Requires an invitation"
msgstr ""
#: converse.js:792
msgid "Moderated"
msgstr ""
#: converse.js:795
msgid "Non-anonymous"
msgstr ""
#: converse.js:798
msgid "Open room"
msgstr ""
#: converse.js:801
msgid "Permanent room"
msgstr ""
#: converse.js:804
msgid "Public"
msgstr ""
#: converse.js:807
msgid "Semi-anonymous"
msgstr ""
#: converse.js:810
msgid "Temporary room"
msgstr ""
#: converse.js:813
msgid "Unmoderated"
msgstr ""
#: converse.js:819
msgid "Rooms"
msgstr ""
#: converse.js:823
msgid "Room name"
msgstr ""
#: converse.js:824
msgid "Nickname"
msgstr ""
#: converse.js:825
msgid "Server"
msgstr ""
#: converse.js:826
msgid "Join"
msgstr ""
#: converse.js:827
msgid "Show rooms"
msgstr ""
#: converse.js:1143
msgid "Set chatroom topic"
msgstr ""
#: converse.js:1144
msgid "Kick user from chatroom"
msgstr ""
#: converse.js:1145
msgid "Ban user from chatroom"
msgstr ""
#: converse.js:1172
msgid "Message"
msgstr ""
#: converse.js:1286 converse.js:2321
msgid "Save"
msgstr ""
#: converse.js:1287
msgid "Cancel"
msgstr ""
#: converse.js:1334
msgid "An error occurred while trying to save the form."
msgstr ""
#: converse.js:1380
msgid "This chat room requires a password"
msgstr ""
#: converse.js:1381
msgid "Password: "
msgstr ""
#: converse.js:1382
msgid "Submit"
msgstr ""
#: converse.js:1396
msgid "This room is not anonymous"
msgstr ""
#: converse.js:1397
msgid "This room now shows unavailable members"
msgstr ""
#: converse.js:1398
msgid "This room does not show unavailable members"
msgstr ""
#: converse.js:1399
msgid "Non-privacy-related room configuration has changed"
msgstr ""
#: converse.js:1400
msgid "Room logging is now enabled"
msgstr ""
#: converse.js:1401
msgid "Room logging is now disabled"
msgstr ""
#: converse.js:1402
msgid "This room is now non-anonymous"
msgstr ""
#: converse.js:1403
msgid "This room is now semi-anonymous"
msgstr ""
#: converse.js:1404
msgid "This room is now fully-anonymous"
msgstr ""
#: converse.js:1405
msgid "A new room has been created"
msgstr ""
#: converse.js:1406
msgid "Your nickname has been changed"
msgstr ""
#: converse.js:1410
msgid " has been banned"
msgstr ""
#: converse.js:1411
msgid " has been kicked out"
msgstr ""
#: converse.js:1412
msgid " has been removed because of an affiliation change"
msgstr ""
#: converse.js:1413
msgid " has been removed for not being a member"
msgstr ""
#: converse.js:1417 converse.js:1480
msgid "You have been banned from this room"
msgstr ""
#: converse.js:1418
msgid "You have been kicked from this room"
msgstr ""
#: converse.js:1419
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
#: converse.js:1420
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr ""
#: converse.js:1421
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr ""
#: converse.js:1478
msgid "You are not on the member list of this room"
msgstr ""
#: converse.js:1484
msgid "No nickname was specified"
msgstr ""
#: converse.js:1488
msgid "You are not allowed to create new rooms"
msgstr ""
#: converse.js:1490
msgid "Your nickname doesn't conform to this room's policies"
msgstr ""
#: converse.js:1492
msgid "Your nickname is already taken"
msgstr ""
#: converse.js:1494
msgid "This room does not (yet) exist"
msgstr ""
#: converse.js:1496
msgid "This room has reached it's maximum number of occupants"
msgstr ""
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1573
msgid "Topic set by %1$s to: %2$s"
msgstr ""
#: converse.js:1589
msgid "This user is a moderator"
msgstr ""
#: converse.js:1592
msgid "This user can send messages in this room"
msgstr ""
#: converse.js:1595
msgid "This user can NOT send messages in this room"
msgstr ""
#: converse.js:1799
msgid "Click to chat with this contact"
msgstr ""
#: converse.js:1800 converse.js:1804
msgid "Click to remove this contact"
msgstr ""
#: converse.js:2166
msgid "Contact requests"
msgstr ""
#: converse.js:2167
msgid "My contacts"
msgstr ""
#: converse.js:2168
msgid "Pending contacts"
msgstr ""
#: converse.js:2320
msgid "Custom status"
msgstr ""
#: converse.js:2326
msgid "Click to change your chat status"
msgstr ""
#: converse.js:2329
msgid "Click here to write a custom status message"
msgstr ""
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2376 converse.js:2410
msgid "I am %1$s"
msgstr ""
#: converse.js:2481
msgid "Sign in"
msgstr ""
#: converse.js:2484
msgid "XMPP/Jabber Username:"
msgstr ""
#: converse.js:2486
msgid "Password:"
msgstr ""
#: converse.js:2488
msgid "Log In"
msgstr ""
#: converse.js:2492
msgid "BOSH Service URL:"
msgstr ""
#: converse.js:2504
msgid "Connected"
msgstr ""
#: converse.js:2508
msgid "Disconnected"
msgstr ""
#: converse.js:2512
msgid "Error"
msgstr ""
#: converse.js:2514
msgid "Connecting"
msgstr ""
#: converse.js:2517
msgid "Connection Failed"
msgstr ""
#: converse.js:2519
msgid "Authenticating"
msgstr ""
#: converse.js:2522
msgid "Authentication Failed"
msgstr ""
#: converse.js:2524
msgid "Disconnecting"
msgstr ""
#: converse.js:2526
msgid "Attached"
msgstr ""
#: converse.js:2657
msgid "Online Contacts"
msgstr ""
(function (root, factory) {
define("en", ['jed'], function () {
var en = new Jed({
"domain": "converse",
"locale_data": {
"converse": {
"": {
"domain": "converse",
"lang": "en",
"plural_forms": "nplurals=2; plural=(n != 1);"
}
}
}
});
return factory(en);
});
}(this, function (en) {
return en;
}));
# Dutch translations for Converse.js package.
# Copyright (C) 2013 Jan-Carel Brand
# This file is distributed under the same license as the Converse.js package.
# JC Brand <jc@opkode.com>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: Converse.js 0.4\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-01 10:36+0200\n"
"PO-Revision-Date: 2013-06-01 10:48+0200\n"
"Last-Translator: JC Brand <jc@opkode.com>\n"
"Language-Team: Dutch\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: converse.js:416 converse.js:1141
msgid "Show this menu"
msgstr ""
#: converse.js:417 converse.js:1142
msgid "Write in the third person"
msgstr ""
#: converse.js:418 converse.js:1146
msgid "Remove messages"
msgstr ""
#: converse.js:558
msgid "Personal message"
msgstr ""
#: converse.js:632
msgid "Contacts"
msgstr ""
#: converse.js:637
msgid "Online"
msgstr ""
#: converse.js:638
msgid "Busy"
msgstr ""
#: converse.js:639
msgid "Away"
msgstr ""
#: converse.js:640
msgid "Offline"
msgstr ""
#: converse.js:647
msgid "Click to add new chat contacts"
msgstr ""
#: converse.js:647
msgid "Add a contact"
msgstr ""
#: converse.js:656
msgid "Contact username"
msgstr ""
#: converse.js:657
msgid "Add"
msgstr ""
#: converse.js:665
msgid "Contact name"
msgstr ""
#: converse.js:666
msgid "Search"
msgstr ""
#: converse.js:701
msgid "No users found"
msgstr ""
#: converse.js:708
msgid "Click to add as a chat contact"
msgstr ""
#: converse.js:772
msgid "Click to open this room"
msgstr ""
#: converse.js:774
msgid "Show more information on this room"
msgstr ""
#: converse.js:779
msgid "Description:"
msgstr ""
#: converse.js:780
msgid "Occupants:"
msgstr ""
#: converse.js:781
msgid "Features:"
msgstr ""
#: converse.js:783
msgid "Requires authentication"
msgstr ""
#: converse.js:786
msgid "Hidden"
msgstr ""
#: converse.js:789
msgid "Requires an invitation"
msgstr ""
#: converse.js:792
msgid "Moderated"
msgstr ""
#: converse.js:795
msgid "Non-anonymous"
msgstr ""
#: converse.js:798
msgid "Open room"
msgstr ""
#: converse.js:801
msgid "Permanent room"
msgstr ""
#: converse.js:804
msgid "Public"
msgstr ""
#: converse.js:807
msgid "Semi-anonymous"
msgstr ""
#: converse.js:810
msgid "Temporary room"
msgstr ""
#: converse.js:813
msgid "Unmoderated"
msgstr ""
#: converse.js:819
msgid "Rooms"
msgstr ""
#: converse.js:823
msgid "Room name"
msgstr ""
#: converse.js:824
msgid "Nickname"
msgstr ""
#: converse.js:825
msgid "Server"
msgstr ""
#: converse.js:826
msgid "Join"
msgstr ""
#: converse.js:827
msgid "Show rooms"
msgstr ""
#: converse.js:1143
msgid "Set chatroom topic"
msgstr ""
#: converse.js:1144
msgid "Kick user from chatroom"
msgstr ""
#: converse.js:1145
msgid "Ban user from chatroom"
msgstr ""
#: converse.js:1172
msgid "Message"
msgstr ""
#: converse.js:1286 converse.js:2321
msgid "Save"
msgstr ""
#: converse.js:1287
msgid "Cancel"
msgstr ""
#: converse.js:1334
msgid "An error occurred while trying to save the form."
msgstr ""
#: converse.js:1380
msgid "This chat room requires a password"
msgstr ""
#: converse.js:1381
msgid "Password: "
msgstr ""
#: converse.js:1382
msgid "Submit"
msgstr ""
#: converse.js:1396
msgid "This room is not anonymous"
msgstr ""
#: converse.js:1397
msgid "This room now shows unavailable members"
msgstr ""
#: converse.js:1398
msgid "This room does not show unavailable members"
msgstr ""
#: converse.js:1399
msgid "Non-privacy-related room configuration has changed"
msgstr ""
#: converse.js:1400
msgid "Room logging is now enabled"
msgstr ""
#: converse.js:1401
msgid "Room logging is now disabled"
msgstr ""
#: converse.js:1402
msgid "This room is now non-anonymous"
msgstr ""
#: converse.js:1403
msgid "This room is now semi-anonymous"
msgstr ""
#: converse.js:1404
msgid "This room is now fully-anonymous"
msgstr ""
#: converse.js:1405
msgid "A new room has been created"
msgstr ""
#: converse.js:1406
msgid "Your nickname has been changed"
msgstr ""
#: converse.js:1410
msgid " has been banned"
msgstr ""
#: converse.js:1411
msgid " has been kicked out"
msgstr ""
#: converse.js:1412
msgid " has been removed because of an affiliation change"
msgstr ""
#: converse.js:1413
msgid " has been removed for not being a member"
msgstr ""
#: converse.js:1417 converse.js:1480
msgid "You have been banned from this room"
msgstr ""
#: converse.js:1418
msgid "You have been kicked from this room"
msgstr ""
#: converse.js:1419
msgid "You have been removed from this room because of an affiliation change"
msgstr ""
#: converse.js:1420
msgid ""
"You have been removed from this room because the room has changed to members-"
"only and you're not a member"
msgstr ""
#: converse.js:1421
msgid ""
"You have been removed from this room because the MUC (Multi-user chat) "
"service is being shut down."
msgstr ""
#: converse.js:1478
msgid "You are not on the member list of this room"
msgstr ""
#: converse.js:1484
msgid "No nickname was specified"
msgstr ""
#: converse.js:1488
msgid "You are not allowed to create new rooms"
msgstr ""
#: converse.js:1490
msgid "Your nickname doesn't conform to this room's policies"
msgstr ""
#: converse.js:1492
msgid "Your nickname is already taken"
msgstr ""
#: converse.js:1494
msgid "This room does not (yet) exist"
msgstr ""
#: converse.js:1496
msgid "This room has reached it's maximum number of occupants"
msgstr ""
#. For translators: the %1$s and %2$s parts will get replaced by the user and topic text respectively
#. Example: Topic set by JC Brand to: Hello World!
#: converse.js:1573
msgid "Topic set by %1$s to: %2$s"
msgstr ""
#: converse.js:1589
msgid "This user is a moderator"
msgstr ""
#: converse.js:1592
msgid "This user can send messages in this room"
msgstr ""
#: converse.js:1595
msgid "This user can NOT send messages in this room"
msgstr ""
#: converse.js:1799
msgid "Click to chat with this contact"
msgstr ""
#: converse.js:1800 converse.js:1804
msgid "Click to remove this contact"
msgstr ""
#: converse.js:2166
msgid "Contact requests"
msgstr ""
#: converse.js:2167
msgid "My contacts"
msgstr ""
#: converse.js:2168
msgid "Pending contacts"
msgstr ""
#: converse.js:2320
msgid "Custom status"
msgstr ""
#: converse.js:2326
msgid "Click to change your chat status"
msgstr ""
#: converse.js:2329
msgid "Click here to write a custom status message"
msgstr ""
#. For translators: the %1$s part gets replaced with the status
#. Example, I am online
#: converse.js:2376 converse.js:2410
msgid "I am %1$s"
msgstr ""
#: converse.js:2481
msgid "Sign in"
msgstr ""
#: converse.js:2484
msgid "XMPP/Jabber Username:"
msgstr ""
#: converse.js:2486
msgid "Password:"
msgstr ""
#: converse.js:2488
msgid "Log In"
msgstr ""
#: converse.js:2492
msgid "BOSH Service URL:"
msgstr ""
#: converse.js:2504
msgid "Connected"
msgstr ""
#: converse.js:2508
msgid "Disconnected"
msgstr ""
#: converse.js:2512
msgid "Error"
msgstr ""
#: converse.js:2514
msgid "Connecting"
msgstr ""
#: converse.js:2517
msgid "Connection Failed"
msgstr ""
#: converse.js:2519
msgid "Authenticating"
msgstr ""
#: converse.js:2522
msgid "Authentication Failed"
msgstr ""
#: converse.js:2524
msgid "Disconnecting"
msgstr ""
#: converse.js:2526
msgid "Attached"
msgstr ""
#: converse.js:2657
msgid "Online Contacts"
msgstr ""
...@@ -28,9 +28,16 @@ ...@@ -28,9 +28,16 @@
}, },
'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());
......
...@@ -471,8 +471,6 @@ ...@@ -471,8 +471,6 @@
}).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 @@ ...@@ -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];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment