Browse Source

Add info icon in room header and show room details in modal

JC Brand 7 years ago
parent
commit
78d6d493d6

+ 22 - 19
css/converse.css

@@ -6938,6 +6938,8 @@ body.reset {
     min-height: 0; }
   #conversejs strong {
     font-weight: 700; }
+  #conversejs em {
+    font-style: italic; }
   #conversejs ol, #conversejs ul {
     list-style: none; }
   #conversejs li {
@@ -8443,6 +8445,26 @@ body.reset {
 #conversejs .add-chatroom input[type="submit"],
 #conversejs .add-chatroom input[type="button"] {
   margin: 0.3em 0; }
+#conversejs.converse-embedded #room-details-modal .features-list,
+#conversejs #room-details-modal .features-list {
+  margin-left: 1em; }
+#conversejs.converse-embedded .chatroom-features,
+#conversejs .chatroom-features {
+  width: 100%; }
+  #conversejs.converse-embedded .chatroom-features .features-list,
+  #conversejs .chatroom-features .features-list {
+    padding-top: 0; }
+    #conversejs.converse-embedded .chatroom-features .features-list .feature,
+    #conversejs .chatroom-features .features-list .feature {
+      width: 100%;
+      margin-right: 0.5em;
+      padding-right: 0;
+      font-size: 1em;
+      cursor: help; }
+      #conversejs.converse-embedded .chatroom-features .features-list .feature .fa,
+      #conversejs .chatroom-features .features-list .feature .fa {
+        margin-right: 0.5em;
+        color: #666; }
 #conversejs.converse-embedded .chat-head-chatroom,
 #conversejs .chat-head-chatroom {
   background-color: #E77051; }
@@ -8567,16 +8589,6 @@ body.reset {
           #conversejs .chatroom .box-flyout .chatroom-body .occupants .occupants-header .occupants-heading {
             font-family: "Century Gothic", futura, "URW Gothic L", Verdana, sans-serif;
             padding: 0.3em 0; }
-        #conversejs.converse-embedded .chatroom .box-flyout .chatroom-body .occupants .chatroom-features,
-        #conversejs .chatroom .box-flyout .chatroom-body .occupants .chatroom-features {
-          width: 100%; }
-          #conversejs.converse-embedded .chatroom .box-flyout .chatroom-body .occupants .chatroom-features .feature,
-          #conversejs .chatroom .box-flyout .chatroom-body .occupants .chatroom-features .feature {
-            float: left;
-            margin-right: 0.5em;
-            padding-right: 0;
-            font-size: 1em;
-            cursor: help; }
         #conversejs.converse-embedded .chatroom .box-flyout .chatroom-body .occupants .awesomplete ul,
         #conversejs .chatroom .box-flyout .chatroom-body .occupants .awesomplete ul {
           padding: 0; }
@@ -8596,15 +8608,6 @@ body.reset {
             flex-basis: 0;
             flex-grow: 1;
             border-bottom: 1px solid lightgrey; }
-          #conversejs.converse-embedded .chatroom .box-flyout .chatroom-body .occupants ul.features-list,
-          #conversejs .chatroom .box-flyout .chatroom-body .occupants ul.features-list {
-            padding-top: 0; }
-            #conversejs.converse-embedded .chatroom .box-flyout .chatroom-body .occupants ul.features-list .feature,
-            #conversejs .chatroom .box-flyout .chatroom-body .occupants ul.features-list .feature {
-              width: 100%; }
-              #conversejs.converse-embedded .chatroom .box-flyout .chatroom-body .occupants ul.features-list .feature .fa,
-              #conversejs .chatroom .box-flyout .chatroom-body .occupants ul.features-list .feature .fa {
-                color: #666; }
           #conversejs.converse-embedded .chatroom .box-flyout .chatroom-body .occupants ul li,
           #conversejs .chatroom .box-flyout .chatroom-body .occupants ul li {
             cursor: default;

+ 2 - 2
dev.html

@@ -32,8 +32,8 @@
         notify_all_room_messages: [
             'discuss@conference.conversejs.org'
         ],
-        // bosh_service_url: 'http://chat.example.org:5280/http-bind/',
-        bosh_service_url: 'https://conversejs.org/http-bind/', // Please use this connection manager only for testing purposes
+        bosh_service_url: 'http://chat.example.org:5280/http-bind/',
+        // bosh_service_url: 'https://conversejs.org/http-bind/', // Please use this connection manager only for testing purposes
         message_archiving: 'always',
         debug: true
     });

File diff suppressed because it is too large
+ 190 - 225
dist/converse-no-dependencies.js


File diff suppressed because it is too large
+ 2 - 0
dist/converse.js


+ 602 - 737
locale/converse.pot

@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Converse.js 3.3.4\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-05-17 11:19+0200\n"
+"POT-Creation-Date: 2018-06-04 18:44+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"
@@ -17,688 +17,402 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: dist/converse-no-dependencies.js:9853 dist/converse-no-dependencies.js:9882
-msgid "Download"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:9872
-#, javascript-format
-msgid "Download: \"%1$s"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:9895
-msgid "Download video file"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:9908
-msgid "Download audio file"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:11229
-msgid "The connection has dropped, attempting to reconnect."
-msgstr ""
-
-#: dist/converse-no-dependencies.js:11327
-msgid "An error occurred while connecting to the chat server."
-msgstr ""
-
-#: dist/converse-no-dependencies.js:11334
-msgid "Your Jabber ID and/or password is incorrect. Please try again."
-msgstr ""
-
-#: dist/converse-no-dependencies.js:11346
-#, javascript-format
-msgid "Sorry, we could not connect to the XMPP host with domain: %1$s"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:11348
-msgid "The XMPP server did not offer a supported authentication mechanism"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:16016
-#, javascript-format
-msgid "%1$s has invited you to join a chat room: %2$s"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:16018
-#, javascript-format
-msgid ""
-"%1$s has invited you to join a chat room: %2$s, and left the following "
-"reason: \"%3$s\""
-msgstr ""
-
-#: dist/converse-no-dependencies.js:16379
-#: dist/converse-no-dependencies.js:16464
-#: dist/converse-no-dependencies.js:33114
+#: dist/converse-no-dependencies.js:34242
+#: dist/converse-no-dependencies.js:34327
+#: dist/converse-no-dependencies.js:46646
 msgid "Bookmark this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16465
+#: dist/converse-no-dependencies.js:34328
 msgid "The name for this bookmark:"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16466
+#: dist/converse-no-dependencies.js:34329
 msgid "Would you like this room to be automatically joined upon startup?"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16467
+#: dist/converse-no-dependencies.js:34330
 msgid "What should your nickname for this room be?"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16469
-#: dist/converse-no-dependencies.js:25296
-#: dist/converse-no-dependencies.js:25380
+#: dist/converse-no-dependencies.js:34332
+#: dist/converse-no-dependencies.js:42768
+#: dist/converse-no-dependencies.js:45592
+#: dist/converse-no-dependencies.js:45677
 msgid "Save"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16470
-#: dist/converse-no-dependencies.js:25376
-#: dist/converse-no-dependencies.js:32190
+#: dist/converse-no-dependencies.js:34333
+#: dist/converse-no-dependencies.js:42769
+#: dist/converse-no-dependencies.js:45673
+#: dist/converse-no-dependencies.js:51631
 msgid "Cancel"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16543
+#: dist/converse-no-dependencies.js:34406
 #, javascript-format
 msgid "Are you sure you want to remove the bookmark \"%1$s\"?"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16659
+#: dist/converse-no-dependencies.js:34522
 msgid "Sorry, something went wrong while trying to save your bookmark."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16738
-#: dist/converse-no-dependencies.js:33112
+#: dist/converse-no-dependencies.js:34601
+#: dist/converse-no-dependencies.js:46644
 msgid "Leave this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16739
+#: dist/converse-no-dependencies.js:34602
 msgid "Remove this bookmark"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16740
-#: dist/converse-no-dependencies.js:33113
+#: dist/converse-no-dependencies.js:34603
+#: dist/converse-no-dependencies.js:46645
 msgid "Unbookmark this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16741
-#: dist/converse-no-dependencies.js:28819
-#: dist/converse-no-dependencies.js:33115
+#: dist/converse-no-dependencies.js:34604
+#: dist/converse-no-dependencies.js:42041
+#: dist/converse-no-dependencies.js:46647
 msgid "Show more information on this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16744
-#: dist/converse-no-dependencies.js:28818
-#: dist/converse-no-dependencies.js:33117
+#: dist/converse-no-dependencies.js:34607
+#: dist/converse-no-dependencies.js:42040
+#: dist/converse-no-dependencies.js:46649
 msgid "Click to open this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16780
+#: dist/converse-no-dependencies.js:34643
 msgid "Click to toggle the bookmarks list"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:16781
+#: dist/converse-no-dependencies.js:34644
 msgid "Bookmarks"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:21217
+#: dist/converse-no-dependencies.js:35089
 msgid "Sorry, could not determine file upload URL."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:21225
+#: dist/converse-no-dependencies.js:35097
 msgid "Sorry, could not determine upload URL."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:21257
+#: dist/converse-no-dependencies.js:35129
 msgid "Sorry, could not succesfully upload your file."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:21260
+#: dist/converse-no-dependencies.js:35132
 #, javascript-format
 msgid "Your server's response: \"%1$s\""
 msgstr ""
 
-#: dist/converse-no-dependencies.js:21442
+#: dist/converse-no-dependencies.js:35306
 msgid "Sorry, looks like file upload is not supported by your server."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:21452
+#: dist/converse-no-dependencies.js:35316
 #, javascript-format
 msgid ""
 "The size of your file, %1$s, exceeds the maximum allowed by your server, "
 "which is %2$s."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22197
-msgid "Show more"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:22248
-msgid "Typing from another device"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:22250
-msgid "is typing"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:22254
-msgid "Stopped typing on the other device"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:22256
-msgid "has stopped typing"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:22259
-#: dist/converse-no-dependencies.js:23256
-#: dist/converse-no-dependencies.js:30521
-msgid "has gone away"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:22488
+#: dist/converse-no-dependencies.js:36039
 msgid "Close this chat box"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22516
+#: dist/converse-no-dependencies.js:36067
 msgid "The User's Profile Image"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22519
-#: dist/converse-no-dependencies.js:25289
-#: dist/converse-no-dependencies.js:25374
+#: dist/converse-no-dependencies.js:36070
+#: dist/converse-no-dependencies.js:45585
+#: dist/converse-no-dependencies.js:45671
 msgid "Close"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22520
-#: dist/converse-no-dependencies.js:25290
+#: dist/converse-no-dependencies.js:36071
+#: dist/converse-no-dependencies.js:45586
 msgid "Email"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22521
-#: dist/converse-no-dependencies.js:25291
+#: dist/converse-no-dependencies.js:36072
+#: dist/converse-no-dependencies.js:45587
 msgid "Full Name"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22522
+#: dist/converse-no-dependencies.js:36073
 msgid "Jabber ID"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22523
-#: dist/converse-no-dependencies.js:25292
-#: dist/converse-no-dependencies.js:29617
+#: dist/converse-no-dependencies.js:36074
+#: dist/converse-no-dependencies.js:42924
+#: dist/converse-no-dependencies.js:45588
 msgid "Nickname"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22524
+#: dist/converse-no-dependencies.js:36075
 msgid "Remove as contact"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22525
+#: dist/converse-no-dependencies.js:36076
 msgid "Refresh"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22526
-#: dist/converse-no-dependencies.js:25294
+#: dist/converse-no-dependencies.js:36077
+#: dist/converse-no-dependencies.js:45590
 msgid "Role"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22527
-#: dist/converse-no-dependencies.js:25297
+#: dist/converse-no-dependencies.js:36078
+#: dist/converse-no-dependencies.js:45593
 msgid "URL"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22566
-#: dist/converse-no-dependencies.js:24293
+#: dist/converse-no-dependencies.js:36117
+#: dist/converse-no-dependencies.js:48307
 msgid "Are you sure you want to remove this contact?"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22575
-#: dist/converse-no-dependencies.js:25325
+#: dist/converse-no-dependencies.js:36126
+#: dist/converse-no-dependencies.js:45621
 msgid "Error"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22575
-#: dist/converse-no-dependencies.js:24301
+#: dist/converse-no-dependencies.js:36126
+#: dist/converse-no-dependencies.js:48315
 #, javascript-format
 msgid "Sorry, there was an error while trying to remove %1$s as a contact."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22629
-#: dist/converse-no-dependencies.js:22667
-#: dist/converse-no-dependencies.js:29029
+#: dist/converse-no-dependencies.js:36180
+#: dist/converse-no-dependencies.js:36218
+#: dist/converse-no-dependencies.js:42291
 msgid "You have unread messages"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22653
+#: dist/converse-no-dependencies.js:36204
 msgid "Hidden message"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22655
+#: dist/converse-no-dependencies.js:36206
 msgid "Personal message"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22662
-#: dist/converse-no-dependencies.js:29026
+#: dist/converse-no-dependencies.js:36213
+#: dist/converse-no-dependencies.js:42288
 msgid "Send"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22663
+#: dist/converse-no-dependencies.js:36214
 msgid "Optional hint"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22692
+#: dist/converse-no-dependencies.js:36252
 msgid "Choose a file to send"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22748
+#: dist/converse-no-dependencies.js:36308
 msgid "Click to write as a normal (non-spoiler) message"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22750
+#: dist/converse-no-dependencies.js:36310
 msgid "Click to write your message as a spoiler"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22754
+#: dist/converse-no-dependencies.js:36314
 msgid "Clear all messages"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22755
+#: dist/converse-no-dependencies.js:36315
 msgid "Insert emojis"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:22756
+#: dist/converse-no-dependencies.js:36316
 msgid "Start a call"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23069
-#: dist/converse-no-dependencies.js:29265
+#: dist/converse-no-dependencies.js:36629
+#: dist/converse-no-dependencies.js:42567
 msgid "Remove messages"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23069
+#: dist/converse-no-dependencies.js:36629
 msgid "Write in the third person"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23069
-#: dist/converse-no-dependencies.js:29267
+#: dist/converse-no-dependencies.js:36629
+#: dist/converse-no-dependencies.js:42567
 msgid "Show this menu"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23164
+#: dist/converse-no-dependencies.js:36728
 msgid "Are you sure you want to clear the messages from this conversation?"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23254
-#: dist/converse-no-dependencies.js:30519
+#: dist/converse-no-dependencies.js:36817
+#: dist/converse-no-dependencies.js:45285
 msgid "has gone offline"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23258
-#: dist/converse-no-dependencies.js:30523
-msgid "is busy"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23260
-msgid "is online"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23501
-msgid "XMPP Username:"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23507
-msgid "Password:"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23509
-msgid "password"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23513
-#: dist/converse-no-dependencies.js:29643
-msgid "Submit"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23519
-msgid "Click here to log in anonymously"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23864
-msgid "This contact is busy"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23865
-msgid "This contact is online"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23866
-msgid "This contact is offline"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23867
-msgid "This contact is unavailable"
+#: dist/converse-no-dependencies.js:36819
+#: dist/converse-no-dependencies.js:41017
+#: dist/converse-no-dependencies.js:45287
+msgid "has gone away"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23868
-msgid "This contact is away for an extended period"
+#: dist/converse-no-dependencies.js:36821
+#: dist/converse-no-dependencies.js:45289
+msgid "is busy"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23869
-msgid "This contact is away"
+#: dist/converse-no-dependencies.js:36823
+msgid "is online"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23872
-#: dist/converse-no-dependencies.js:24584
-#: dist/converse-no-dependencies.js:25680
+#: dist/converse-no-dependencies.js:37209
+#: dist/converse-no-dependencies.js:47885
+#: dist/converse-no-dependencies.js:48606
 msgid "Contacts"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23874
-msgid "Groups"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23876
-msgid "My contacts"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23878
-msgid "Pending contacts"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23880
-msgid "Contact requests"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23882
-msgid "Ungrouped"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23925
-msgid "Contact name"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23925
-#: dist/converse-no-dependencies.js:28905
-msgid "Optional nickname"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23928
-msgid "Add a Contact"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23929
-msgid "XMPP Address"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:23931
-msgid "name@example.org"
+#: dist/converse-no-dependencies.js:37447
+msgid "Username"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:23932
-msgid "Add"
+#: dist/converse-no-dependencies.js:37447
+msgid "user@domain"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:24003
-#: dist/converse-no-dependencies.js:25917
+#: dist/converse-no-dependencies.js:37455
+#: dist/converse-no-dependencies.js:48016
 msgid "Please enter a valid XMPP address"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:24040
-msgid "Filter"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24041
-msgid "Filter by contact name"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24042
-msgid "Filter by group name"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24043
-msgid "Filter by status"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24044
-msgid "Any"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24045
-msgid "Unread"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24046
-#: dist/converse-no-dependencies.js:25379
-msgid "Online"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24047
-msgid "Chatty"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24048
-#: dist/converse-no-dependencies.js:25375
-msgid "Busy"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24049
-#: dist/converse-no-dependencies.js:25373
-msgid "Away"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24050
-msgid "Extended Away"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24051
-#: dist/converse-no-dependencies.js:25378
-msgid "Offline"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24205
-#: dist/converse-no-dependencies.js:24247
-#, javascript-format
-msgid "Click to remove %1$s as a contact"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24214
-#, javascript-format
-msgid "Click to accept the contact request from %1$s"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24215
-#, javascript-format
-msgid "Click to decline the contact request from %1$s"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24246
-#, javascript-format
-msgid "Click to chat with %1$s (JID: %2$s)"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24323
-msgid "Are you sure you want to decline this contact request?"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:24585
-msgid "Add a contact"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25288
-msgid "Your Profile"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25293
-msgid "XMPP Address (JID)"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25295
-msgid ""
-"Use commas to separate multiple roles. Your roles are shown next to your "
-"name on your chat messages."
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25298
-msgid "Your avatar image"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25325
-msgid "Sorry, an error happened while trying to save your profile data."
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25325
-msgid "You can check your browser's developer console for any error output."
+#: dist/converse-no-dependencies.js:37544
+msgid "Chat Contacts"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25377
-msgid "Custom status"
+#: dist/converse-no-dependencies.js:37544
+msgid "Toggle chat"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25381
-msgid "Away for long"
+#: dist/converse-no-dependencies.js:38122
+msgid "The connection has dropped, attempting to reconnect."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25382
-msgid "Change chat status"
+#: dist/converse-no-dependencies.js:38220
+msgid "An error occurred while connecting to the chat server."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25383
-msgid "Personal status message"
+#: dist/converse-no-dependencies.js:38227
+msgid "Your Jabber ID and/or password is incorrect. Please try again."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25427
+#: dist/converse-no-dependencies.js:38239
 #, javascript-format
-msgid "I am %1$s"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25430
-msgid "Change settings"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25431
-msgid "Click to change your chat status"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25432
-msgid "Log out"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25433
-msgid "Your profile"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25456
-msgid "Are you sure you want to log out?"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25464
-#: dist/converse-no-dependencies.js:25474
-msgid "online"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25466
-msgid "busy"
-msgstr ""
-
-#: dist/converse-no-dependencies.js:25468
-msgid "away for long"
+msgid "Sorry, we could not connect to the XMPP host with domain: %1$s"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25470
-msgid "away"
+#: dist/converse-no-dependencies.js:38241
+msgid "The XMPP server did not offer a supported authentication mechanism"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25472
-msgid "offline"
+#: dist/converse-no-dependencies.js:40963
+msgid "Show more"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25909
-msgid "Username"
+#: dist/converse-no-dependencies.js:41006
+msgid "Typing from another device"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:25909
-msgid "user@domain"
+#: dist/converse-no-dependencies.js:41008
+msgid "is typing"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:26003
-msgid "Chat Contacts"
+#: dist/converse-no-dependencies.js:41012
+msgid "Stopped typing on the other device"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:26003
-msgid "Toggle chat"
+#: dist/converse-no-dependencies.js:41014
+msgid "has stopped typing"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:27529
-#: dist/converse-no-dependencies.js:27572
+#: dist/converse-no-dependencies.js:41245
+#: dist/converse-no-dependencies.js:41288
 msgid "Minimize this chat box"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:27705
+#: dist/converse-no-dependencies.js:41421
 msgid "Click to restore this chat"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:27892
+#: dist/converse-no-dependencies.js:41608
 msgid "Minimized"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28650
+#: dist/converse-no-dependencies.js:41937
 msgid "This room is not anonymous"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28651
+#: dist/converse-no-dependencies.js:41938
 msgid "This room now shows unavailable members"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28652
+#: dist/converse-no-dependencies.js:41939
 msgid "This room does not show unavailable members"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28653
+#: dist/converse-no-dependencies.js:41940
 msgid "The room configuration has changed"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28654
+#: dist/converse-no-dependencies.js:41941
 msgid "Room logging is now enabled"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28655
+#: dist/converse-no-dependencies.js:41942
 msgid "Room logging is now disabled"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28656
+#: dist/converse-no-dependencies.js:41943
 msgid "This room is now no longer anonymous"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28657
+#: dist/converse-no-dependencies.js:41944
 msgid "This room is now semi-anonymous"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28658
+#: dist/converse-no-dependencies.js:41945
 msgid "This room is now fully-anonymous"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28659
+#: dist/converse-no-dependencies.js:41946
 msgid "A new room has been created"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28663
+#: dist/converse-no-dependencies.js:41949
 msgid "You have been banned from this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28664
+#: dist/converse-no-dependencies.js:41950
 msgid "You have been kicked from this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28665
+#: dist/converse-no-dependencies.js:41951
 msgid "You have been removed from this room because of an affiliation change"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28666
+#: dist/converse-no-dependencies.js:41952
 msgid ""
 "You have been removed from this room because the room has changed to members-"
 "only and you're not a member"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28667
+#: dist/converse-no-dependencies.js:41953
 msgid ""
 "You have been removed from this room because the MUC (Multi-user chat) "
 "service is being shut down"
@@ -714,798 +428,949 @@ msgstr ""
 #. * can then at least tell gettext to scan for it so that these
 #. * strings are picked up by the translation machinery.
 #.
-#: dist/converse-no-dependencies.js:28681
+#: dist/converse-no-dependencies.js:41966
 #, javascript-format
 msgid "%1$s has been banned"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28682
+#: dist/converse-no-dependencies.js:41967
 #, javascript-format
 msgid "%1$s's nickname has changed"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28683
+#: dist/converse-no-dependencies.js:41968
 #, javascript-format
 msgid "%1$s has been kicked out"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28684
+#: dist/converse-no-dependencies.js:41969
 #, javascript-format
 msgid "%1$s has been removed because of an affiliation change"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28685
+#: dist/converse-no-dependencies.js:41970
 #, javascript-format
 msgid "%1$s has been removed for not being a member"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28689
+#: dist/converse-no-dependencies.js:41973
 #, javascript-format
 msgid "Your nickname has been automatically set to %1$s"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28690
+#: dist/converse-no-dependencies.js:41974
 #, javascript-format
 msgid "Your nickname has been changed to %1$s"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28724
-msgid "Description:"
+#: dist/converse-no-dependencies.js:41992
+msgid "Query for Chatrooms"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28725
-msgid "Room Address (JID):"
+#: dist/converse-no-dependencies.js:41993
+msgid "Server address"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28726
-msgid "Occupants:"
+#: dist/converse-no-dependencies.js:41994
+msgid "Show rooms"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28727
-msgid "Features:"
+#: dist/converse-no-dependencies.js:41995
+msgid "conference.example.org"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28728
-msgid "Requires authentication"
+#: dist/converse-no-dependencies.js:42053
+msgid "No rooms found"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28729
-#: dist/converse-no-dependencies.js:30122
-msgid "Hidden"
+#: dist/converse-no-dependencies.js:42070
+msgid "Rooms found:"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28730
-msgid "Requires an invitation"
+#: dist/converse-no-dependencies.js:42122
+msgid "Enter a new Chatroom"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28731
-#: dist/converse-no-dependencies.js:30125
-msgid "Moderated"
+#: dist/converse-no-dependencies.js:42123
+msgid "Room address"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28732
-#: dist/converse-no-dependencies.js:30126
-msgid "Non-anonymous"
+#: dist/converse-no-dependencies.js:42124
+#: dist/converse-no-dependencies.js:47938
+msgid "Optional nickname"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28733
-msgid "Open room"
+#: dist/converse-no-dependencies.js:42125
+msgid "name@conference.example.org"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28734
-msgid "Permanent room"
+#: dist/converse-no-dependencies.js:42126
+msgid "Join"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28735
-#: dist/converse-no-dependencies.js:30130
-msgid "Public"
+#: dist/converse-no-dependencies.js:42169
+msgid "Description:"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28736
-#: dist/converse-no-dependencies.js:30131
-msgid "Semi-anonymous"
+#: dist/converse-no-dependencies.js:42170
+msgid "Features:"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28737
-msgid "Temporary room"
+#: dist/converse-no-dependencies.js:42171
+#: dist/converse-no-dependencies.js:43424
+msgid "Hidden"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28738
-#: dist/converse-no-dependencies.js:30133
-msgid "Unmoderated"
+#: dist/converse-no-dependencies.js:42172
+#: dist/converse-no-dependencies.js:43427
+msgid "Moderated"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28777
-msgid "Query for Chatrooms"
+#: dist/converse-no-dependencies.js:42173
+#: dist/converse-no-dependencies.js:43428
+msgid "Non-anonymous"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28778
-msgid "Server address"
+#: dist/converse-no-dependencies.js:42174
+msgid "Online users:"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28779
-msgid "Show rooms"
+#: dist/converse-no-dependencies.js:42175
+msgid "Open room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28780
-msgid "conference.example.org"
+#: dist/converse-no-dependencies.js:42176
+msgid "Permanent room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28833
-msgid "No rooms found"
+#: dist/converse-no-dependencies.js:42177
+#: dist/converse-no-dependencies.js:43432
+msgid "Public"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28850
-msgid "Rooms found:"
+#: dist/converse-no-dependencies.js:42178
+msgid "Requires authentication"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28903
-msgid "Enter a new Chatroom"
+#: dist/converse-no-dependencies.js:42179
+msgid "Requires an invitation"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28904
-msgid "Room address"
+#: dist/converse-no-dependencies.js:42180
+#: dist/converse-no-dependencies.js:43433
+msgid "Semi-anonymous"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28906
-msgid "name@conference.example.org"
+#: dist/converse-no-dependencies.js:42181
+msgid "Temporary room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:28907
-msgid "Join"
+#: dist/converse-no-dependencies.js:42182
+#: dist/converse-no-dependencies.js:43435
+msgid "Unmoderated"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29025
+#: dist/converse-no-dependencies.js:42287
 msgid "Message"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29058
+#: dist/converse-no-dependencies.js:42322
 #, javascript-format
 msgid "%1$s is no longer a moderator"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29061
+#: dist/converse-no-dependencies.js:42326
 #, javascript-format
 msgid "%1$s has been given a voice again"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29064
+#: dist/converse-no-dependencies.js:42330
 #, javascript-format
 msgid "%1$s has been muted"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29067
+#: dist/converse-no-dependencies.js:42334
 #, javascript-format
 msgid "%1$s is now a moderator"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29077
+#: dist/converse-no-dependencies.js:42342
 msgid "Close and leave this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29078
+#: dist/converse-no-dependencies.js:42343
 msgid "Configure this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29122
+#: dist/converse-no-dependencies.js:42383
 msgid "Hide the list of occupants"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29206
+#: dist/converse-no-dependencies.js:42499
 #, javascript-format
 msgid ""
 "Error: the \"%1$s\" command takes two arguments, the user's nickname and "
 "optionally a reason."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29218
+#: dist/converse-no-dependencies.js:42508
 msgid ""
 "Sorry, an error happened while running the command. Check your browser's "
 "developer console for details."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29263
+#: dist/converse-no-dependencies.js:42567
 msgid "Change user's affiliation to admin"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29264
+#: dist/converse-no-dependencies.js:42567
 msgid "Ban user from room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29266
+#: dist/converse-no-dependencies.js:42567
 msgid "Change user role to participant"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29268
+#: dist/converse-no-dependencies.js:42567
 msgid "Kick user from room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29269
+#: dist/converse-no-dependencies.js:42567
 msgid "Write in 3rd person"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29270
+#: dist/converse-no-dependencies.js:42567
 msgid "Grant membership to a user"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29271
+#: dist/converse-no-dependencies.js:42567
 msgid "Remove user's ability to post messages"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29272
+#: dist/converse-no-dependencies.js:42567
 msgid "Change your nickname"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29273
+#: dist/converse-no-dependencies.js:42567
 msgid "Grant moderator role to user"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29274
+#: dist/converse-no-dependencies.js:42567
 msgid "Grant ownership of this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29275
+#: dist/converse-no-dependencies.js:42567
 msgid "Revoke user's membership"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29276
+#: dist/converse-no-dependencies.js:42567
 msgid "Set room subject"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29277
+#: dist/converse-no-dependencies.js:42567
 msgid "Set room subject (alias for /subject)"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29278
+#: dist/converse-no-dependencies.js:42567
 msgid "Allow muted user to post messages"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29590
+#: dist/converse-no-dependencies.js:42897
 msgid ""
 "The nickname you chose is reserved or currently in use, please choose a "
 "different one."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29616
+#: dist/converse-no-dependencies.js:42923
 msgid "Please choose your nickname"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29618
+#: dist/converse-no-dependencies.js:42925
 msgid "Enter room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29641
+#: dist/converse-no-dependencies.js:42946
 msgid "This chatroom requires a password"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29642
+#: dist/converse-no-dependencies.js:42947
 msgid "Password: "
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29740
+#: dist/converse-no-dependencies.js:42948
+msgid "Submit"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:43062
 #, javascript-format
 msgid "This action was done by %1$s."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29743
-#: dist/converse-no-dependencies.js:29759
+#: dist/converse-no-dependencies.js:43066
+#: dist/converse-no-dependencies.js:43083
 #, javascript-format
 msgid "The reason given is: \"%1$s\"."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29781
+#: dist/converse-no-dependencies.js:43104
 #, javascript-format
 msgid "%1$s has left and re-entered the room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29786
+#: dist/converse-no-dependencies.js:43110
 #, javascript-format
 msgid "%1$s has entered the room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29788
+#: dist/converse-no-dependencies.js:43112
 #, javascript-format
 msgid "%1$s has entered the room. \"%2$s\""
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29818
+#: dist/converse-no-dependencies.js:43143
 #, javascript-format
 msgid "%1$s has entered and left the room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29820
+#: dist/converse-no-dependencies.js:43145
 #, javascript-format
 msgid "%1$s has entered and left the room. \"%2$s\""
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29832
+#: dist/converse-no-dependencies.js:43158
 #, javascript-format
 msgid "%1$s has left the room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29834
+#: dist/converse-no-dependencies.js:43160
 #, javascript-format
 msgid "%1$s has left the room. \"%2$s\""
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29877
+#: dist/converse-no-dependencies.js:43206
 msgid "You are not on the member list of this room."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29879
+#: dist/converse-no-dependencies.js:43208
 msgid "You have been banned from this room."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29883
+#: dist/converse-no-dependencies.js:43212
 msgid "No nickname was specified."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29887
+#: dist/converse-no-dependencies.js:43216
 msgid "You are not allowed to create new rooms."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29889
+#: dist/converse-no-dependencies.js:43218
 msgid "Your nickname doesn't conform to this room's policies."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29893
+#: dist/converse-no-dependencies.js:43222
 msgid "This room does not (yet) exist."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29895
+#: dist/converse-no-dependencies.js:43224
 msgid "This room has reached its maximum number of occupants."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29950
+#: dist/converse-no-dependencies.js:43274
 #, javascript-format
 msgid "Topic set by %1$s"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29981
+#: dist/converse-no-dependencies.js:43297
 msgid "Chatrooms"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29982
+#: dist/converse-no-dependencies.js:43298
 msgid "Add a new room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:29983
+#: dist/converse-no-dependencies.js:43299
 msgid "Query for rooms"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30022
+#: dist/converse-no-dependencies.js:43337
 #, javascript-format
 msgid "Click to mention %1$s in your message."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30023
+#: dist/converse-no-dependencies.js:43338
 msgid "This user is a moderator."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30024
+#: dist/converse-no-dependencies.js:43339
 msgid "This user can send messages in this room."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30025
+#: dist/converse-no-dependencies.js:43340
 msgid "This user can NOT send messages in this room."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30026
+#: dist/converse-no-dependencies.js:43341
 msgid "Moderator"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30027
+#: dist/converse-no-dependencies.js:43342
 msgid "Visitor"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30028
+#: dist/converse-no-dependencies.js:43343
 msgid "Owner"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30029
+#: dist/converse-no-dependencies.js:43344
 msgid "Member"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30030
+#: dist/converse-no-dependencies.js:43345
 msgid "Admin"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30082
+#: dist/converse-no-dependencies.js:43387
 msgid "Occupants"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30102
-#: dist/converse-no-dependencies.js:30209
+#: dist/converse-no-dependencies.js:43404
+#: dist/converse-no-dependencies.js:43511
 msgid "Invite"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30121
+#: dist/converse-no-dependencies.js:43423
 msgid "Features"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30123
+#: dist/converse-no-dependencies.js:43425
 msgid "Message archiving"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30124
+#: dist/converse-no-dependencies.js:43426
 msgid "Members only"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30127
+#: dist/converse-no-dependencies.js:43429
 msgid "Open"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30128
+#: dist/converse-no-dependencies.js:43430
 msgid "Password protected"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30129
+#: dist/converse-no-dependencies.js:43431
 msgid "Persistent"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30132
+#: dist/converse-no-dependencies.js:43434
 msgid "Temporary"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30134
+#: dist/converse-no-dependencies.js:43436
 msgid "No password"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30135
+#: dist/converse-no-dependencies.js:43437
 msgid "This room is not publicly searchable"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30136
+#: dist/converse-no-dependencies.js:43438
 msgid "Messages are archived on the server"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30137
+#: dist/converse-no-dependencies.js:43439
 msgid "This room is restricted to members only"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30138
+#: dist/converse-no-dependencies.js:43440
 msgid "This room is being moderated"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30139
+#: dist/converse-no-dependencies.js:43441
 msgid "All other room occupants can see your XMPP username"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30140
+#: dist/converse-no-dependencies.js:43442
 msgid "Anyone can join this room"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30141
+#: dist/converse-no-dependencies.js:43443
 msgid "This room requires a password before entry"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30142
+#: dist/converse-no-dependencies.js:43444
 msgid "This room persists even if it's unoccupied"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30143
+#: dist/converse-no-dependencies.js:43445
 msgid "This room is publicly searchable"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30144
+#: dist/converse-no-dependencies.js:43446
 msgid "Only moderators can see your XMPP username"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30145
+#: dist/converse-no-dependencies.js:43447
 msgid "This room will disappear once the last person leaves"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30146
+#: dist/converse-no-dependencies.js:43448
 msgid "This room is not being moderated"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30147
+#: dist/converse-no-dependencies.js:43449
 msgid "This room does not require a password upon entry"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30187
+#: dist/converse-no-dependencies.js:43488
 #, javascript-format
 msgid ""
 "You are about to invite %1$s to the chat room \"%2$s\". You may optionally "
 "include a message, explaining the reason for the invitation."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30208
+#: dist/converse-no-dependencies.js:43510
 msgid "Please enter a valid XMPP username"
 msgstr ""
 
+#: dist/converse-no-dependencies.js:44865
+#, javascript-format
+msgid "%1$s has invited you to join a chat room: %2$s"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:44867
+#, javascript-format
+msgid ""
+"%1$s has invited you to join a chat room: %2$s, and left the following "
+"reason: \"%3$s\""
+msgstr ""
+
 #. workaround for Prosody which doesn't give type "headline"
-#: dist/converse-no-dependencies.js:30469
-#: dist/converse-no-dependencies.js:30475
+#: dist/converse-no-dependencies.js:45235
+#: dist/converse-no-dependencies.js:45241
 #, javascript-format
 msgid "Notification from %1$s"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30477
-#: dist/converse-no-dependencies.js:30488
-#: dist/converse-no-dependencies.js:30491
+#: dist/converse-no-dependencies.js:45243
+#: dist/converse-no-dependencies.js:45254
+#: dist/converse-no-dependencies.js:45257
 #, javascript-format
 msgid "%1$s says"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30525
+#: dist/converse-no-dependencies.js:45291
 msgid "has come online"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30542
+#: dist/converse-no-dependencies.js:45308
 msgid "wants to be your contact"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30824
-msgid "Re-establishing encrypted session"
+#: dist/converse-no-dependencies.js:45584
+msgid "Your Profile"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:45589
+msgid "XMPP Address (JID)"
 msgstr ""
 
-#. We need to generate a new key and instance tag
-#: dist/converse-no-dependencies.js:30835
-msgid "Generating private key."
+#: dist/converse-no-dependencies.js:45591
+msgid ""
+"Use commas to separate multiple roles. Your roles are shown next to your "
+"name on your chat messages."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30835
-msgid "Your browser might become unresponsive."
+#: dist/converse-no-dependencies.js:45594
+msgid "Your avatar image"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30878
-#, javascript-format
-msgid ""
-"Authentication request from %1$s\n"
-"\n"
-"Your chat contact is attempting to verify your identity, by asking you the "
-"question below.\n"
-"\n"
-"%2$s"
+#: dist/converse-no-dependencies.js:45621
+msgid "Sorry, an error happened while trying to save your profile data."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30887
-msgid "Could not verify this user's identify."
+#: dist/converse-no-dependencies.js:45621
+msgid "You can check your browser's developer console for any error output."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:30941
-msgid "Exchanging private key with contact."
+#: dist/converse-no-dependencies.js:45670
+#: dist/converse-no-dependencies.js:48062
+msgid "Away"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31038
-msgid "Your messages are not encrypted anymore"
+#: dist/converse-no-dependencies.js:45672
+#: dist/converse-no-dependencies.js:48061
+msgid "Busy"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31040
-msgid ""
-"Your messages are now encrypted but your contact's identity has not been "
-"verified."
+#: dist/converse-no-dependencies.js:45674
+msgid "Custom status"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31042
-msgid "Your contact's identify has been verified."
+#: dist/converse-no-dependencies.js:45675
+#: dist/converse-no-dependencies.js:48064
+msgid "Offline"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31044
-msgid "Your contact has ended encryption on their end, you should do the same."
+#: dist/converse-no-dependencies.js:45676
+#: dist/converse-no-dependencies.js:48059
+msgid "Online"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31054
-msgid "Your message could not be sent"
+#: dist/converse-no-dependencies.js:45678
+msgid "Away for long"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31056
-msgid "We received an unencrypted message"
+#: dist/converse-no-dependencies.js:45679
+msgid "Change chat status"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31058
-msgid "We received an unreadable encrypted message"
+#: dist/converse-no-dependencies.js:45680
+msgid "Personal status message"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31084
+#: dist/converse-no-dependencies.js:45724
 #, javascript-format
-msgid ""
-"Here are the fingerprints, please confirm them with %1$s, outside of this "
-"chat.\n"
-"\n"
-"Fingerprint for you, %2$s: %3$s\n"
-"\n"
-"Fingerprint for %1$s: %4$s\n"
-"\n"
-"If you have confirmed that the fingerprints match, click OK, otherwise click "
-"Cancel."
-msgstr ""
-
-#: dist/converse-no-dependencies.js:31096
-msgid ""
-"You will be prompted to provide a security question and then an answer to "
-"that question.\n"
-"\n"
-"Your contact will then be prompted the same question and if they type the "
-"exact same answer (case sensitive), their identity will be verified."
+msgid "I am %1$s"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31097
-msgid "What is your security question?"
+#: dist/converse-no-dependencies.js:45727
+msgid "Change settings"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31100
-msgid "What is the answer to the security question?"
+#: dist/converse-no-dependencies.js:45728
+msgid "Click to change your chat status"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31104
-msgid "Invalid authentication scheme provided"
+#: dist/converse-no-dependencies.js:45729
+msgid "Log out"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31121
-msgid "Your messages are not encrypted. Click here to enable OTR encryption."
+#: dist/converse-no-dependencies.js:45730
+msgid "Your profile"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31123
-msgid "Your messages are encrypted, but your contact has not been verified."
+#: dist/converse-no-dependencies.js:45753
+msgid "Are you sure you want to log out?"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31125
-msgid "Your messages are encrypted and your contact verified."
+#: dist/converse-no-dependencies.js:45761
+#: dist/converse-no-dependencies.js:45771
+msgid "online"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31127
-msgid ""
-"Your contact has closed their end of the private session, you should do the "
-"same"
+#: dist/converse-no-dependencies.js:45763
+msgid "busy"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:45765
+msgid "away for long"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:45767
+msgid "away"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:45769
+msgid "offline"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:45923
+msgid " e.g. conversejs.org"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:45970
+msgid "Fetch registration form"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:45971
+msgid "Tip: A list of public XMPP providers is available"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31141
-msgid "End encrypted conversation"
+#: dist/converse-no-dependencies.js:45972
+msgid "here"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31142
-msgid "Refresh encrypted conversation"
+#: dist/converse-no-dependencies.js:46020
+msgid "Sorry, we're unable to connect to your chosen provider."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31143
-msgid "Start encrypted conversation"
+#: dist/converse-no-dependencies.js:46036
+msgid ""
+"Sorry, the given provider does not support in band account registration. "
+"Please try with a different provider."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31144
-msgid "Verify with fingerprints"
+#: dist/converse-no-dependencies.js:46060
+#, javascript-format
+msgid ""
+"Something went wrong while establishing a connection with \"%1$s\". Are you "
+"sure it exists?"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31145
-msgid "Verify with SMP"
+#: dist/converse-no-dependencies.js:46223
+msgid "Now logging you in"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31146
-msgid "What's this?"
+#: dist/converse-no-dependencies.js:46227
+msgid "Registered successfully"
 msgstr ""
 
-#. Translation aware constants
-#. ---------------------------
-#. We can only call the __ translation method *after* converse.js
-#. has been initialized and with it the i18n machinery. That's why
-#. we do it here in the "initialize" method and not at the top of
-#. the module.
-#: dist/converse-no-dependencies.js:31189
-msgid "unencrypted"
+#: dist/converse-no-dependencies.js:46336
+msgid ""
+"The provider rejected your registration attempt. Please check the values you "
+"entered for correctness."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31190
-msgid "unverified"
+#: dist/converse-no-dependencies.js:46705
+msgid "Click to toggle the rooms list"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31191
-msgid "verified"
+#: dist/converse-no-dependencies.js:46706
+msgid "Open Rooms"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31192
-msgid "finished"
+#: dist/converse-no-dependencies.js:46750
+#, javascript-format
+msgid "Are you sure you want to leave the room %1$s?"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31788
+#: dist/converse-no-dependencies.js:47359
 #, javascript-format
 msgid "Sorry, there was an error while trying to add %1$s as a contact."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:31936
+#: dist/converse-no-dependencies.js:47570
 msgid "This client does not allow presence subscriptions"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32028
+#: dist/converse-no-dependencies.js:47678
 msgid "Click to hide these contacts"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32112
-msgid "Don't have a chat account?"
+#: dist/converse-no-dependencies.js:47877
+msgid "This contact is busy"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32114
-msgid "Create an account"
+#: dist/converse-no-dependencies.js:47878
+msgid "This contact is online"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32126
-msgid "Create your account"
+#: dist/converse-no-dependencies.js:47879
+msgid "This contact is offline"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32128
-msgid "Please enter the XMPP provider to register with:"
+#: dist/converse-no-dependencies.js:47880
+msgid "This contact is unavailable"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32148
-msgid "Already have a chat account?"
+#: dist/converse-no-dependencies.js:47881
+msgid "This contact is away for an extended period"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32150
-msgid "Log in here"
+#: dist/converse-no-dependencies.js:47882
+msgid "This contact is away"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32162
-msgid "Account Registration:"
+#: dist/converse-no-dependencies.js:47887
+msgid "Groups"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32170
-msgid "Register"
+#: dist/converse-no-dependencies.js:47889
+msgid "My contacts"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32174
-msgid "Choose a different provider"
+#: dist/converse-no-dependencies.js:47891
+msgid "Pending contacts"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32186
-msgid "Hold tight, we're fetching the registration form…"
+#: dist/converse-no-dependencies.js:47893
+msgid "Contact requests"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32321
-msgid " e.g. conversejs.org"
+#: dist/converse-no-dependencies.js:47895
+msgid "Ungrouped"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32367
-msgid "Fetch registration form"
+#: dist/converse-no-dependencies.js:47938
+msgid "Contact name"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32368
-msgid "Tip: A list of public XMPP providers is available"
+#: dist/converse-no-dependencies.js:47941
+msgid "Add a Contact"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32369
-msgid "here"
+#: dist/converse-no-dependencies.js:47942
+msgid "XMPP Address"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32417
-msgid "Sorry, we're unable to connect to your chosen provider."
+#: dist/converse-no-dependencies.js:47944
+msgid "name@example.org"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32433
-msgid ""
-"Sorry, the given provider does not support in band account registration. "
-"Please try with a different provider."
+#: dist/converse-no-dependencies.js:47945
+msgid "Add"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48053
+msgid "Filter"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48054
+msgid "Filter by contact name"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48055
+msgid "Filter by group name"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48056
+msgid "Filter by status"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48057
+msgid "Any"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48058
+msgid "Unread"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48060
+msgid "Chatty"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48063
+msgid "Extended Away"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32457
+#: dist/converse-no-dependencies.js:48219
+#: dist/converse-no-dependencies.js:48261
 #, javascript-format
-msgid ""
-"Something went wrong while establishing a connection with \"%1$s\". Are you "
-"sure it exists?"
+msgid "Click to remove %1$s as a contact"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32620
-msgid "Now logging you in"
+#: dist/converse-no-dependencies.js:48228
+#, javascript-format
+msgid "Click to accept the contact request from %1$s"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32624
-msgid "Registered successfully"
+#: dist/converse-no-dependencies.js:48229
+#, javascript-format
+msgid "Click to decline the contact request from %1$s"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48260
+#, javascript-format
+msgid "Click to chat with %1$s (JID: %2$s)"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48337
+msgid "Are you sure you want to decline this contact request?"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:48607
+msgid "Add a contact"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:50080
+msgid "Room Address (JID)"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:50084
+msgid "Title"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:50088
+msgid "Description"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51158
+msgid "XMPP Username:"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51164
+msgid "Password:"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51166
+msgid "password"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:32733
+#: dist/converse-no-dependencies.js:51174
+msgid "This is a trusted device"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51176
 msgid ""
-"The provider rejected your registration attempt. Please check the values you "
-"entered for correctness."
+"To improve performance, we cache your data in this browser. Uncheck this box "
+"if this is a public computer or if you want your data to be deleted when you "
+"log out. It's important that you explicitly log out, otherwise not all "
+"cached data might be deleted."
 msgstr ""
 
-#: dist/converse-no-dependencies.js:33149
-msgid "Click to toggle the rooms list"
+#: dist/converse-no-dependencies.js:51178
+msgid "Log in"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:33150
-msgid "Open Rooms"
+#: dist/converse-no-dependencies.js:51184
+msgid "Click here to log in anonymously"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51526
+msgid "Don't have a chat account?"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51528
+msgid "Create an account"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51549
+msgid "Create your account"
 msgstr ""
 
-#: dist/converse-no-dependencies.js:33194
+#: dist/converse-no-dependencies.js:51551
+msgid "Please enter the XMPP provider to register with:"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51571
+msgid "Already have a chat account?"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51573
+msgid "Log in here"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51594
+msgid "Account Registration:"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51602
+msgid "Register"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51606
+msgid "Choose a different provider"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:51627
+msgid "Hold tight, we're fetching the registration form…"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:52762
+#: dist/converse-no-dependencies.js:52791
+msgid "Download"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:52781
 #, javascript-format
-msgid "Are you sure you want to leave the room %1$s?"
+msgid "Download: \"%1$s"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:52804
+msgid "Download video file"
+msgstr ""
+
+#: dist/converse-no-dependencies.js:52817
+msgid "Download audio file"
 msgstr ""

+ 25 - 19
sass/_chatrooms.scss

@@ -7,6 +7,31 @@
         }
     }
 
+    #room-details-modal {
+        .features-list {
+            margin-left: 1em;
+        }
+    }
+
+    .chatroom-features {
+        width: 100%;
+        .features-list {
+            padding-top: 0;
+            .feature {
+                width: 100%;
+                margin-right: 0.5em;
+                padding-right: 0;
+                font-size: 1em;
+                cursor: help;
+                .fa {
+                    margin-right: 0.5em;
+                    color: $text-color;
+                }
+            }
+        }
+    }
+
+
     .chat-head-chatroom {
         background-color: $chatroom-head-color;
 
@@ -133,16 +158,6 @@
                         }
                     }
 
-                    .chatroom-features {
-                        width: 100%;
-                        .feature {
-                            float: left;
-                            margin-right: 0.5em;
-                            padding-right: 0;
-                            font-size: 1em;
-                            cursor: help;
-                        }
-                    }
                     .awesomplete {
                         ul {
                             padding: 0;
@@ -164,15 +179,6 @@
                             flex-grow: 1;
                             border-bottom: 1px solid lightgrey;
                         }
-                        &.features-list {
-                            padding-top: 0;
-                            .feature {
-                                width: 100%;
-                                .fa {
-                                    color: $text-color;
-                                }
-                            }
-                        }
                         li {
                             cursor: default;
                             display: block;

+ 4 - 0
sass/_core.scss

@@ -159,6 +159,10 @@ body.reset {
         font-weight: 700;
     }
 
+    em {
+        font-style: italic;
+    }
+
     ol, ul {
         list-style: none;
     }

+ 3 - 4
spec/chatroom.js

@@ -814,9 +814,8 @@
                             .c('field', {'type':'text-single', 'var':'muc#roominfo_occupants', 'label':'Number of occupants'})
                                 .c('value').t(0);
                 _converse.connection._dataRecv(test_utils.createRequest(features_stanza));
-                test_utils.waitUntil(function () {
-                    return _.get(view.el.querySelector('.chatroom-description'), 'textContent');
-                }).then(function () {
+                test_utils.waitUntil(() => _.get(view.el.querySelector('.chatroom-description'), 'textContent'))
+                .then(function () {
                     expect($(view.el.querySelector('.chatroom-description')).text()).toBe('This is the description');
                     done();
                 });
@@ -1842,7 +1841,7 @@
                 _converse.connection._dataRecv(test_utils.createRequest(features_stanza));
 
                 var view = _converse.chatboxviews.get('coven@chat.shakespeare.lit');
-                expect(view.model.get('features_fetched')).toBe(true);
+                expect(view.model.get('features_fetched')).toBeTruthy();
                 expect(view.model.get('passwordprotected')).toBe(true);
                 expect(view.model.get('hidden')).toBe(true);
                 expect(view.model.get('temporary')).toBe(true);

+ 104 - 3
spec/roomslist.js

@@ -3,11 +3,15 @@
 } (this, function (jasmine, mock, test_utils) {
     var _ = converse.env._;
     var $msg = converse.env.$msg;
+    var $iq = converse.env.$iq;
+    var $pres = converse.env.$pres;
     var Promise = converse.env.Promise;
+    var Strophe = converse.env.Strophe;
+    var u = converse.env.utils;
 
-    describe("The converse-roomslist plugin", function () {
+    describe("A list of open rooms", function () {
 
-        it("is shown under a list of open rooms in the \"Rooms\" panel", mock.initConverseWithPromises(
+        it("is shown in the \"Rooms\" panel", mock.initConverseWithPromises(
             null, ['rosterGroupsFetched'],
             { allow_bookmarks: false // Makes testing easier, otherwise we
                                      // have to mock stanza traffic.
@@ -50,7 +54,104 @@
         ));
     });
 
-    describe("An room shown in the rooms list", function () {
+    describe("A room shown in the rooms list", function () {
+
+        it("has an info icon which opens a details modal when clicked", mock.initConverseWithPromises(
+            null, ['rosterGroupsFetched'],
+            { whitelisted_plugins: ['converse-roomslist'],
+              allow_bookmarks: false // Makes testing easier, otherwise we
+                                     // have to mock stanza traffic.
+            }, function (done, _converse) {
+
+            test_utils.openControlBox();
+            _converse.api.rooms.open('coven@chat.shakespeare.lit', {'nick': 'some1'});
+            const view = _converse.chatboxviews.get('coven@chat.shakespeare.lit');
+            const last_stanza = _.last(_converse.connection.IQ_stanzas).nodeTree;
+            const IQ_id = last_stanza.getAttribute('id');
+            const features_stanza = $iq({
+                    'from': 'coven@chat.shakespeare.lit',
+                    'id': IQ_id,
+                    'to': 'dummy@localhost/desktop',
+                    'type': 'result'
+                })
+                .c('query', { 'xmlns': 'http://jabber.org/protocol/disco#info'})
+                    .c('identity', {
+                        'category': 'conference',
+                        'name': 'A Dark Cave',
+                        'type': 'text'
+                    }).up()
+                    .c('feature', {'var': 'http://jabber.org/protocol/muc'}).up()
+                    .c('feature', {'var': 'muc_passwordprotected'}).up()
+                    .c('feature', {'var': 'muc_hidden'}).up()
+                    .c('feature', {'var': 'muc_temporary'}).up()
+                    .c('feature', {'var': 'muc_open'}).up()
+                    .c('feature', {'var': 'muc_unmoderated'}).up()
+                    .c('feature', {'var': 'muc_nonanonymous'}).up()
+                    .c('feature', {'var': 'urn:xmpp:mam:0'}).up()
+                    .c('x', { 'xmlns':'jabber:x:data', 'type':'result'})
+                        .c('field', {'var':'FORM_TYPE', 'type':'hidden'})
+                            .c('value').t('http://jabber.org/protocol/muc#roominfo').up().up()
+                        .c('field', {'type':'text-single', 'var':'muc#roominfo_description', 'label':'Description'})
+                            .c('value').t('This is the description').up().up()
+                        .c('field', {'type':'text-single', 'var':'muc#roominfo_occupants', 'label':'Number of occupants'})
+                            .c('value').t(0);
+            _converse.connection._dataRecv(test_utils.createRequest(features_stanza));
+
+            test_utils.waitUntil(() => view.model.get('connection_status') === converse.ROOMSTATUS.CONNECTING)
+            .then(function () {
+                var presence = $pres({
+                        to: _converse.connection.jid,
+                        from: 'coven@chat.shakespeare.lit/some1',
+                        id: 'DC352437-C019-40EC-B590-AF29E879AF97'
+                }).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'})
+                    .c('item').attrs({
+                        affiliation: 'member',
+                        jid: _converse.bare_jid,
+                        role: 'participant'
+                    }).up()
+                    .c('status').attrs({code:'110'});
+                _converse.connection._dataRecv(test_utils.createRequest(presence));
+
+                const room_els = _converse.rooms_list_view.el.querySelectorAll(".open-room");
+                expect(room_els.length).toBe(1);
+                var info_el = _converse.rooms_list_view.el.querySelector(".room-info");
+                info_el.click();
+
+                const modal = view.model.room_details_modal;
+                return test_utils.waitUntil(() => u.isVisible(modal.el), 2000);
+            }).then(() => {
+                const modal = view.model.room_details_modal;
+                let els = modal.el.querySelectorAll('p.room-info');
+                expect(els[0].textContent).toBe("Room address (JID): coven@chat.shakespeare.lit")
+                expect(els[1].textContent).toBe("Name: A Dark Cave")
+                expect(els[2].textContent).toBe("Description: This is the description")
+                expect(els[3].textContent).toBe("Online users: 1")
+                const features_list = modal.el.querySelector('.features-list');
+                expect(features_list.textContent.replace(/(\n|\s{2,})/g, '')).toBe(
+                    'Password protected - This room requires a password before entry'+
+                    'Hidden - This room is not publicly searchable'+
+                    'Open - Anyone can join this room'+
+                    'Temporary - This room will disappear once the last person leaves'+
+                    'Not anonymous - All other room occupants can see your XMPP username'+
+                    'Not moderated - This room is not being moderated'
+                );
+                const presence = $pres({
+                        to: 'dummy@localhost/_converse.js-29092160',
+                        from: 'coven@chat.shakespeare.lit/newguy'
+                    })
+                    .c('x', {xmlns: Strophe.NS.MUC_USER})
+                    .c('item', {
+                        'affiliation': 'none',
+                        'jid': 'newguy@localhost/_converse.js-290929789',
+                        'role': 'participant'
+                    });
+                _converse.connection._dataRecv(test_utils.createRequest(presence));
+
+                els = modal.el.querySelectorAll('p.room-info');
+                expect(els[3].textContent).toBe("Online users: 2")
+                done();
+            });
+        }));
 
         it("can be closed", mock.initConverseWithPromises(
             null, ['rosterGroupsFetched'],

+ 0 - 1
spec/spoilers.js

@@ -1,7 +1,6 @@
 (function (root, factory) {
     define(["jasmine", "mock", "test-utils"], factory);
 } (this, function (jasmine, mock, test_utils) {
-
     var _ = converse.env._;
     var Strophe = converse.env.Strophe;
     var $msg = converse.env.$msg;

+ 1 - 0
src/converse-chatview.js

@@ -422,6 +422,7 @@
                 },
 
                 showUserDetailsModal (ev) {
+                    ev.preventDefault();
                     if (_.isUndefined(this.user_details_modal)) {
                         this.user_details_modal = new _converse.UserDetailsModal({model: this.model});
                     }

+ 41 - 42
src/converse-muc-views.js

@@ -11,6 +11,7 @@
         "templates/add_chatroom_modal.html",
         "templates/chatarea.html",
         "templates/chatroom.html",
+        "templates/chatroom_details_modal.html",
         "templates/chatroom_disconnect.html",
         "templates/chatroom_features.html",
         "templates/chatroom_form.html",
@@ -37,6 +38,7 @@
     tpl_add_chatroom_modal,
     tpl_chatarea,
     tpl_chatroom,
+    tpl_chatroom_details_modal,
     tpl_chatroom_disconnect,
     tpl_chatroom_features,
     tpl_chatroom_form,
@@ -482,6 +484,26 @@
             });
 
 
+            _converse.RoomDetailsModal = _converse.BootstrapModal.extend({
+
+                initialize () {
+                    _converse.BootstrapModal.prototype.initialize.apply(this, arguments);
+                    this.model.on('change', this.render, this);
+                    this.model.occupants.on('change', this.render, this);
+                },
+
+                toHTML () {
+                    return tpl_chatroom_details_modal(_.extend(
+                        this.model.toJSON(), {
+                            '__': __,
+                            'display_name': this.model.getDisplayName(),
+                            'num_occupants': this.model.occupants.length
+                        })
+                    );
+                }
+            });
+
+
             _converse.ChatRoomView = _converse.ChatBoxView.extend({
                 /* Backbone.NativeView which renders a chat room, based upon the view
                  * for normal one-on-one chat boxes.
@@ -495,6 +517,7 @@
                     'click .chatbox-navback': 'showControlBox',
                     'click .close-chatbox-button': 'close',
                     'click .configure-chatroom-button': 'getAndRenderConfigurationForm',
+                    'click .show-room-details-modal': 'showRoomDetailsModal',
                     'click .hide-occupants': 'hideOccupants',
                     'click .new-msgs-indicator': 'viewUnreadMessages',
                     'click .occupant-nick': 'onOccupantClicked',
@@ -595,6 +618,14 @@
                     return this;
                 },
 
+                showRoomDetailsModal (ev) {
+                    ev.preventDefault();
+                    if (_.isUndefined(this.model.room_details_modal)) {
+                        this.model.room_details_modal = new _converse.RoomDetailsModal({'model': this.model});
+                    }
+                    this.model.room_details_modal.show(ev);
+                },
+
                 showChatStateNotification (message) {
                     if (message.get('sender') === 'me') {
                         return;
@@ -632,10 +663,11 @@
                      */
                     return tpl_chatroom_head(
                         _.extend(this.model.toJSON(), {
-                            Strophe: Strophe,
-                            info_close: __('Close and leave this room'),
-                            info_configure: __('Configure this room'),
-                            description: this.model.get('description') || ''
+                            'Strophe': Strophe,
+                            'info_close': __('Close and leave this room'),
+                            'info_configure': __('Configure this room'),
+                            'info_details': __('Show more details about this room'),
+                            'description': this.model.get('description') || ''
                     }));
                 },
 
@@ -1035,7 +1067,8 @@
                         this.closeForm();
                     });
 
-                    form_el.addEventListener('submit', (ev) => {
+                    form_el.addEventListener('submit',
+                        (ev) => {
                             ev.preventDefault();
                             this.model.saveConfiguration(ev.target).then(
                                 this.model.getRoomFeatures.bind(this.model)
@@ -1547,16 +1580,13 @@
 
             _converse.RoomsPanel = Backbone.NativeView.extend({
                 /* Backbone.NativeView which renders MUC section of the control box.
-                 *
-                 * Chat rooms can be listed, joined and new rooms can be created.
                  */
                 tagName: 'div',
                 className: 'controlbox-section',
                 id: 'chatrooms',
                 events: {
                     'click a.chatbox-btn.show-add-muc-modal': 'showAddRoomModal',
-                    'click a.chatbox-btn.show-list-muc-modal': 'showListRoomsModal',
-                    'click a.room-info': 'toggleRoomInfo'
+                    'click a.chatbox-btn.show-list-muc-modal': 'showListRoomsModal'
                 },
 
                 render () {
@@ -1568,11 +1598,6 @@
                     return this;
                 },
 
-                toggleRoomInfo (ev) {
-                    ev.preventDefault();
-                    toggleRoomInfo(ev);
-                },
-
                 showAddRoomModal (ev) {
                     if (_.isUndefined(this.add_room_modal)) {
                         this.add_room_modal = new _converse.AddChatRoomModal({'model': this.model});
@@ -1703,34 +1728,8 @@
 
                     el.innerHTML = tpl_chatroom_features(
                             _.extend(this.chatroomview.model.toJSON(), {
-                                'has_features': _.reduce(_.values(picks), iteratee),
-                                'label_features': __('Features'),
-                                'label_hidden': __('Hidden'),
-                                'label_mam_enabled': __('Message archiving'),
-                                'label_membersonly': __('Members only'),
-                                'label_moderated': __('Moderated'),
-                                'label_nonanonymous': __('Non-anonymous'),
-                                'label_open': __('Open'),
-                                'label_passwordprotected': __('Password protected'),
-                                'label_persistent': __('Persistent'),
-                                'label_public': __('Public'),
-                                'label_semianonymous': __('Semi-anonymous'),
-                                'label_temporary': __('Temporary'),
-                                'label_unmoderated': __('Unmoderated'),
-                                'label_unsecured': __('No password'),
-                                'tt_hidden': __('This room is not publicly searchable'),
-                                'tt_mam_enabled': __('Messages are archived on the server'),
-                                'tt_membersonly': __('This room is restricted to members only'),
-                                'tt_moderated': __('This room is being moderated'),
-                                'tt_nonanonymous': __('All other room occupants can see your XMPP username'),
-                                'tt_open': __('Anyone can join this room'),
-                                'tt_passwordprotected': __('This room requires a password before entry'),
-                                'tt_persistent': __('This room persists even if it\'s unoccupied'),
-                                'tt_public': __('This room is publicly searchable'),
-                                'tt_semianonymous': __('Only moderators can see your XMPP username'),
-                                'tt_temporary': __('This room will disappear once the last person leaves'),
-                                'tt_unmoderated': __('This room is not being moderated'),
-                                'tt_unsecured': __('This room does not require a password upon entry')
+                                '__': __,
+                                'has_features': _.reduce(_.values(picks), iteratee)
                             }));
                     this.setOccupantsHeight();
                     return this;

+ 5 - 1
src/converse-muc.js

@@ -246,6 +246,10 @@
                     this.handlers[type][name] = callback;
                 },
 
+                getDisplayName () {
+                    return this.get('name') || this.get('jid');
+                },
+
                 join (nick, password) {
                     /* Join the chat room.
                      *
@@ -430,7 +434,7 @@
                      *  <feature var='urn:xmpp:mam:0'/>
                      */
                     const features = {
-                        'features_fetched': true,
+                        'features_fetched': moment().format(),
                         'name': iq.querySelector('identity').getAttribute('name')
                     }
                     _.each(iq.querySelectorAll('feature'), function (field) {

+ 24 - 9
src/converse-roomslist.js

@@ -45,6 +45,7 @@
 
 
             _converse.OpenRooms = Backbone.Collection.extend({
+
                 comparator (room) {
                     if (room.get('bookmarked')) {
                         const bookmark = _.head(_converse.bookmarksview.model.where({'jid': room.get('jid')}));
@@ -97,6 +98,10 @@
             });
 
             _converse.RoomsListElementView = Backbone.VDOMView.extend({
+                events: {
+                    'click a.room-info': 'showRoomDetailsModal'
+                },
+
                 initialize () {
                     this.model.on('destroy', this.remove, this);
                     this.model.on('remove', this.remove, this);
@@ -106,15 +111,6 @@
                     this.model.on('change:num_unread_general', this.render, this);
                 },
 
-                getRoomsListElementName () {
-                    if (this.model.get('bookmarked') && _converse.bookmarksview) {
-                        const bookmark = _.head(_converse.bookmarksview.model.where({'jid': this.model.get('jid')}));
-                        return bookmark.get('name');
-                    } else {
-                        return this.model.get('name');
-                    }
-                },
-
                 toHTML () {
                     return tpl_rooms_list_item(
                         _.extend(this.model.toJSON(), {
@@ -130,9 +126,28 @@
                             'name': this.getRoomsListElementName(),
                             'open_title': __('Click to open this room')
                         }));
+                },
+
+                showRoomDetailsModal (ev) {
+                    const room = _converse.chatboxes.get(this.model.get('jid'));
+                    ev.preventDefault();
+                    if (_.isUndefined(room.room_details_modal)) {
+                        room.room_details_modal = new _converse.RoomDetailsModal({'model': room});
+                    }
+                    room.room_details_modal.show(ev);
+                },
+
+                getRoomsListElementName () {
+                    if (this.model.get('bookmarked') && _converse.bookmarksview) {
+                        const bookmark = _.head(_converse.bookmarksview.model.where({'jid': this.model.get('jid')}));
+                        return bookmark.get('name');
+                    } else {
+                        return this.model.get('name');
+                    }
                 }
             });
 
+
             _converse.RoomsListView = Backbone.OrderedListView.extend({
                 tagName: 'div',
                 className: 'open-rooms-list list-container rooms-list-container',

+ 63 - 0
src/templates/chatroom_details_modal.html

@@ -0,0 +1,63 @@
+<div class="modal fade" id="room-details-modal" tabindex="-1" role="dialog" aria-labelledby="user-profile-modal-label" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="user-profile-modal-label">{{{o.display_name}}}</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="{{{o.label_close}}}"><span aria-hidden="true">&times;</span></button>
+            </div>
+            <div class="modal-body">
+                <div class="room-info">
+                    <p class="room-info"><strong>{{{o.__('Room address (JID)')}}}</strong>: {{{o.jid}}}</p>
+                    <p class="room-info"><strong>{{{o.__('Name')}}}</strong>: {{{o.name}}}</p>
+                    <p class="room-info"><strong>{{{o.__('Description')}}}</strong>: {{{o.description}}}</p>
+                    <p class="room-info"><strong>{{{o.__('Online users')}}}</strong>: {{{o.num_occupants}}}</p>
+                    <p class="room-info"><strong>{{{o.__('Features')}}}</strong>:
+                        <div class="chatroom-features">
+                        <ul class="features-list">
+                        {[ if (o.passwordprotected) { ]}
+                        <li class="feature" ><span class="fa fa-lock"></span>{{{ o.__('Password protected') }}} - <em>{{{ o.__('This room requires a password before entry') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.unsecured) { ]}
+                        <li class="feature" ><span class="fa fa-unlock"></span>{{{ o.__('No password required') }}} - <em>{{{ o.__('This room does not require a password upon entry') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.hidden) { ]}
+                        <li class="feature" ><span class="fa fa-eye-slash"></span>{{{ o.__('Hidden') }}} - <em>{{{ o.__('This room is not publicly searchable') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.public_room) { ]}
+                        <li class="feature" ><span class="fa fa-eye"></span>{{{ o.__('Public') }}} - <em>{{{ o.__('This room is publicly searchable') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.membersonly) { ]}
+                        <li class="feature" ><span class="fa fa-address-book"></span>{{{ o.__('Members only') }}} - <em>{{{ o.__('this room is restricted to members only') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.open) { ]}
+                        <li class="feature" ><span class="fa fa-globe"></span>{{{ o.__('Open') }}} - <em>{{{ o.__('Anyone can join this room') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.persistent) { ]}
+                        <li class="feature" ><span class="fa fa-save"></span>{{{ o.__('Persistent') }}} - <em>{{{ o.__('This room persists even if it\'s unoccupied') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.temporary) { ]}
+                        <li class="feature" ><span class="fa fa-snowflake-o"></span>{{{ o.__('Temporary') }}} - <em>{{{ o.__('This room will disappear once the last person leaves') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.nonanonymous) { ]}
+                        <li class="feature" ><span class="fa fa-id-card"></span>{{{ o.__('Not anonymous') }}} - <em>{{{ o.__('All other room occupants can see your XMPP username') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.semianonymous) { ]}
+                        <li class="feature" ><span class="fa fa-user-secret"></span>{{{ o.__('Semi-anonymous') }}} - <em>{{{ o.__('Only moderators can see your XMPP username') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.moderated) { ]}
+                        <li class="feature" ><span class="fa fa-gavel"></span>{{{ o.__('Moderated') }}} - <em>{{{ o.__('This room is being moderated') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.unmoderated) { ]}
+                        <li class="feature" ><span class="fa fa-info-circle"></span>{{{ o.__('Not moderated') }}} - <em>{{{ o.__('This room is not being moderated') }}}</em></li>
+                        {[ } ]}
+                        {[ if (o.mam_enabled) { ]}
+                        <li class="feature" ><span class="fa fa-database"></span>{{{ o.__('Message archiving') }}} - <em>{{{ o.__('Messages are archived on the server') }}}</em></li>
+                        {[ } ]}
+                        </ul>
+                        </div>
+                    </p>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 14 - 14
src/templates/chatroom_features.html

@@ -1,44 +1,44 @@
 {[ if (o.has_features) { ]}
-<p class="occupants-heading">{{{o.label_features}}}</p>
+<p class="occupants-heading">{{{o.__('Features')}}}</p>
 {[ } ]}
 <ul class="features-list">
 {[ if (o.passwordprotected) { ]}
-<li class="feature" title="{{{ o.tt_passwordprotected }}}"><span class="fa fa-lock"></span>{{{ o.label_passwordprotected }}}</li>
+<li class="feature" title="{{{ o.__('This room requires a password before entry') }}}"><span class="fa fa-lock"></span>{{{ o.__('Password protected') }}}</li>
 {[ } ]}
 {[ if (o.unsecured) { ]}
-<li class="feature" title="{{{ o.tt_unsecured }}}"><span class="fa fa-unlock"></span>{{{ o.label_unsecured }}}</li>
+<li class="feature" title="{{{ o.__('This room does not require a password upon entry') }}}"><span class="fa fa-unlock"></span>{{{ o.__('No password') }}}</li>
 {[ } ]}
 {[ if (o.hidden) { ]}
-<li class="feature" title="{{{ o.tt_hidden }}}"><span class="fa fa-eye-slash"></span>{{{ o.label_hidden }}}</li>
+<li class="feature" title="{{{ o.__('This room is not publicly searchable') }}}"><span class="fa fa-eye-slash"></span>{{{ o.__('Hidden') }}}</li>
 {[ } ]}
 {[ if (o.public_room) { ]}
-<li class="feature" title="{{{ o.tt_public }}}"><span class="fa fa-eye"></span>{{{ o.label_public }}}</li>
+<li class="feature" title="{{{ o.__('This room is publicly searchable') }}}"><span class="fa fa-eye"></span>{{{ o.__('Public') }}}</li>
 {[ } ]}
 {[ if (o.membersonly) { ]}
-<li class="feature" title="{{{ o.tt_membersonly }}}"><span class="fa fa-address-book"></span>{{{ o.label_membersonly }}}</li>
+<li class="feature" title="{{{ o.__('this room is restricted to members only') }}}"><span class="fa fa-address-book"></span>{{{ o.__('Members only') }}}</li>
 {[ } ]}
 {[ if (o.open) { ]}
-<li class="feature" title="{{{ o.tt_open }}}"><span class="fa fa-globe"></span>{{{ o.label_open }}}</li>
+<li class="feature" title="{{{ o.__('Anyone can join this room') }}}"><span class="fa fa-globe"></span>{{{ o.__('Open') }}}</li>
 {[ } ]}
 {[ if (o.persistent) { ]}
-<li class="feature" title="{{{ o.tt_persistent }}}"><span class="fa fa-save"></span>{{{ o.label_persistent }}}</li>
+<li class="feature" title="{{{ o.__('This room persists even if it\'s unoccupied') }}}"><span class="fa fa-save"></span>{{{ o.__('Persistent') }}}</li>
 {[ } ]}
 {[ if (o.temporary) { ]}
-<li class="feature" title="{{{ o.tt_temporary }}}"><span class="fa fa-snowflake-o"></span>{{{ o.label_temporary }}}</li>
+<li class="feature" title="{{{ o.__('This room will disappear once the last person leaves') }}}"><span class="fa fa-snowflake-o"></span>{{{ o.__('Temporary') }}}</li>
 {[ } ]}
 {[ if (o.nonanonymous) { ]}
-<li class="feature" title="{{{ o.tt_nonanonymous }}}"><span class="fa fa-id-card"></span>{{{ o.label_nonanonymous }}}</li>
+<li class="feature" title="{{{ o.__('All other room occupants can see your XMPP username') }}}"><span class="fa fa-id-card"></span>{{{ o.__('Not anonymous') }}}</li>
 {[ } ]}
 {[ if (o.semianonymous) { ]}
-<li class="feature" title="{{{ o.tt_semianonymous }}}"><span class="fa fa-user-secret"></span>{{{ o.label_semianonymous }}}</li>
+<li class="feature" title="{{{ o.__('Only moderators can see your XMPP username') }}}"><span class="fa fa-user-secret"></span>{{{ o.__('Semi-anonymous') }}}</li>
 {[ } ]}
 {[ if (o.moderated) { ]}
-<li class="feature" title="{{{ o.tt_moderated }}}"><span class="fa fa-gavel"></span>{{{ o.label_moderated }}}</li>
+<li class="feature" title="{{{ o.__('This room is being moderated') }}}"><span class="fa fa-gavel"></span>{{{ o.__('Moderated') }}}</li>
 {[ } ]}
 {[ if (o.unmoderated) { ]}
-<li class="feature" title="{{{ o.tt_unmoderated }}}"><span class="fa fa-info-circle"></span>{{{ o.label_unmoderated }}}</li>
+<li class="feature" title="{{{ o.__('This room is not being moderated') }}}"><span class="fa fa-info-circle"></span>{{{ o.__('Not moderated') }}}</li>
 {[ } ]}
 {[ if (o.mam_enabled) { ]}
-<li class="feature" title="{{{ o.tt_mam_enabled }}}"><span class="fa fa-database"></span>{{{ o.label_mam_enabled }}}</li>
+<li class="feature" title="{{{ o.__('Messages are archived on the server') }}}"><span class="fa fa-database"></span>{{{ o.__('Message archiving') }}}</li>
 {[ } ]}
 </ul>

+ 1 - 0
src/templates/chatroom_head.html

@@ -14,4 +14,5 @@
     {[ if (o.affiliation == 'owner') { ]}
     <a class="chatbox-btn configure-chatroom-button fa fa-wrench" title="{{{o.info_configure}}} "></a>
     {[ } ]}
+    <a class="chatbox-btn show-room-details-modal fa fa-info-circle" title="{{{o.info_details}}}"></a>
 </div>

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