Comparar commits
69 Commits
v3.1.1
...
v3.2.0-beta.2
| Autor | SHA1 | Data | |
|---|---|---|---|
| 7e4885b86d | |||
| e8357cb3e8 | |||
| 990dfa5de0 | |||
| ab2a713a29 | |||
| 9ad183210d | |||
| fdf9b670f3 | |||
| 0227f54c8b | |||
| 26d5599ab1 | |||
| c785e8dbdd | |||
| 3c881a4b50 | |||
| 4644d79bb4 | |||
| a8fb7a2e50 | |||
| e1c905586f | |||
| 84c3fbbd44 | |||
| 5bd440ead9 | |||
| ebe6b7bfea | |||
| 50693eece7 | |||
| e8ae2d5421 | |||
| 9c3bfcda07 | |||
| fdc570b6ee | |||
| 6ff2a7ce31 | |||
| 6687eaa66c | |||
| 895cae067c | |||
| b0b3245e4e | |||
| 8f58a939fb | |||
| 068f60c64e | |||
| 240a257397 | |||
| bca7af73ec | |||
| 62f6ddbfbe | |||
| fa831e25ca | |||
| 3e7633d2c8 | |||
| 92e38a8abb | |||
| 7765b6b46f | |||
| d675401bc8 | |||
| 16e519d5ec | |||
| 62ca260ba3 | |||
| f1a83cd696 | |||
| 3d97567429 | |||
| 3226a3c940 | |||
| 31eba50c99 | |||
| ec0cec8a9e | |||
| 15c7948cb8 | |||
| 52588a1437 | |||
| 1d60187f98 | |||
| 81d84a02b9 | |||
| 2eb4dfdea2 | |||
| 0aa0d4d467 | |||
| f544b8d753 | |||
| 60afa8efeb | |||
| 413bfd8dc3 | |||
| 964de1637c | |||
| 684bd5b27a | |||
| 2cbc5b74a3 | |||
| 66a1ed906c | |||
| 55838a4724 | |||
| c8b6a7b1ba | |||
| d45a5e1fda | |||
| 95689c62b6 | |||
| 0f2960b1fb | |||
| 7552e5c73a | |||
| a6de6d6843 | |||
| eeab8355e5 | |||
| e95f61af25 | |||
| 4ec0656de6 | |||
| 687347ec09 | |||
| ace5fc585b | |||
| d38b45c441 | |||
| 3d408a51b9 | |||
| e953303002 |
@@ -25,3 +25,6 @@ lib/i18next/
|
||||
lib/jquery-i18next/
|
||||
lib/magnific-popup/
|
||||
.idea
|
||||
/lib/strophejs-plugin-mam
|
||||
/lib/strophejs-plugin-rsm
|
||||
.github.json
|
||||
|
||||
+1
-1
@@ -6,4 +6,4 @@
|
||||
url = https://github.com/twbs/bootstrap-sass/
|
||||
[submodule "lib/strophe.jinglejs"]
|
||||
path = lib/strophe.jinglejs
|
||||
url = https://github.com/sualko/strophe.jinglejs
|
||||
url = https://github.com/jsxc/strophe.jinglejs
|
||||
|
||||
@@ -8,4 +8,5 @@ before_install:
|
||||
- gem install scss_lint
|
||||
|
||||
script:
|
||||
- echo {} > .github.json
|
||||
- ./node_modules/.bin/grunt pre-commit
|
||||
|
||||
@@ -5,6 +5,41 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [Unreleased]
|
||||
### Added
|
||||
- [#150](https://github.com/jsxc/jsxc/issues/150) add Message Archive Management (XEP-0313)
|
||||
- [#464](https://github.com/jsxc/jsxc/issues/464) respond to software version request (XEP-0092)
|
||||
|
||||
### Fixed
|
||||
- [#447](https://github.com/jsxc/jsxc/pull/447) fix muc member presence
|
||||
- fix http upload discovery
|
||||
- fix vcard retrieval for rooms
|
||||
- fix bookmarks
|
||||
- [#470](https://github.com/jsxc/jsxc/issues/470) fix receiving message from unknown sender
|
||||
- [#483](https://github.com/jsxc/jsxc/issues/483) fix unclickable space
|
||||
- catch quota exceeded errors (e.g. Safari in private mode has a quota of 0)
|
||||
- [#510](https://github.com/jsxc/jsxc/pull/510) fix muc form
|
||||
- [#505](https://github.com/jsxc/jsxc/pull/505) fix i18n key
|
||||
- [#515](https://github.com/jsxc/jsxc/issues/515) fix add contact in slave tab
|
||||
- fix initial roster loading
|
||||
- fix xmpp message uri to unknown jid
|
||||
|
||||
### Changed
|
||||
- update dependencies
|
||||
- strophe.jinglejs
|
||||
- grunt-contrib-clean
|
||||
- grunt-contrib-uglify
|
||||
- node-sass
|
||||
- strophe.chatstates
|
||||
- strophejs-plugin-mam
|
||||
- make max file size optional for http upload service
|
||||
- [#480](https://github.com/jsxc/jsxc/issues/480) split avatar loading into chunks
|
||||
- [#478](https://github.com/jsxc/jsxc/issues/478) support roster versioning
|
||||
- prefer xmpp password from settings over login form
|
||||
- [#468](https://github.com/jsxc/jsxc/issues/468) move composing message to window header
|
||||
- make message error more visible
|
||||
- ignore message errors without id
|
||||
- add data-bid to xmpp uris
|
||||
- add roster state to roster ready event
|
||||
|
||||
## 3.1.1 - 2017-02-14
|
||||
### Fixed
|
||||
|
||||
+36
-7
@@ -9,6 +9,7 @@ module.exports = function(grunt) {
|
||||
|
||||
// Project configuration.
|
||||
grunt.initConfig({
|
||||
github: grunt.file.readJSON('.github.json'),
|
||||
app: grunt.file.readJSON('package.json'),
|
||||
meta: {
|
||||
banner: grunt.file.read('banner.js')
|
||||
@@ -156,12 +157,12 @@ module.exports = function(grunt) {
|
||||
},
|
||||
src: dep_files,
|
||||
dest: '<%= target %>/lib/jsxc.dep.js',
|
||||
filter: function (filepath) {
|
||||
if (!grunt.file.exists(filepath)) {
|
||||
grunt.fail.warn('Could not find: ' + filepath);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
filter: function(filepath) {
|
||||
if (!grunt.file.exists(filepath)) {
|
||||
grunt.fail.warn('Could not find: ' + filepath);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
nonull: true,
|
||||
},
|
||||
@@ -170,7 +171,8 @@ module.exports = function(grunt) {
|
||||
banner: '/*! This file is concatenated for the browser. */\n\n'
|
||||
},
|
||||
src: ['src/jsxc.intro.js', 'src/jsxc.lib.js', 'src/jsxc.lib.xmpp.js',
|
||||
'src/jsxc.lib.*.js', 'tmp/template.js', 'src/jsxc.outro.js'
|
||||
'src/jsxc.lib.gui.js', 'src/jsxc.lib.*.js',
|
||||
'tmp/template.js', 'src/jsxc.outro.js'
|
||||
],
|
||||
dest: '<%= target %>/jsxc.js'
|
||||
}
|
||||
@@ -347,6 +349,29 @@ module.exports = function(grunt) {
|
||||
options: {
|
||||
config: '.scss-lint.yml'
|
||||
}
|
||||
},
|
||||
github_releaser2: {
|
||||
options: {
|
||||
repository: 'jsxc/jsxc',
|
||||
authentication: {
|
||||
type: 'token',
|
||||
token: '<%= github.token %>'
|
||||
},
|
||||
release: {
|
||||
body: 'see https://github.com/jsxc/jsxc/blob/master/CHANGELOG.md'
|
||||
}
|
||||
},
|
||||
release: {
|
||||
src: ['archives/jsxc-archives/jsxc-<%= app.version %>.zip', 'archives/jsxc-archives/jsxc-<%= app.version %>.zip.sig']
|
||||
},
|
||||
prerelease: {
|
||||
options: {
|
||||
release: {
|
||||
prerelease: true
|
||||
}
|
||||
},
|
||||
src: ['archives/jsxc-archives/jsxc-<%= app.version %>.zip', 'archives/jsxc-archives/jsxc-<%= app.version %>.zip.sig']
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -371,6 +396,7 @@ module.exports = function(grunt) {
|
||||
grunt.loadNpmTasks('grunt-prettysass');
|
||||
grunt.loadNpmTasks('grunt-html-convert');
|
||||
grunt.loadNpmTasks('grunt-scss-lint');
|
||||
grunt.loadNpmTasks('grunt-github-releaser2');
|
||||
|
||||
//Default task
|
||||
grunt.registerTask('default', ['build', 'watch']);
|
||||
@@ -395,6 +421,9 @@ module.exports = function(grunt) {
|
||||
grunt.task.run(['search:changelog', 'build:prerelease', 'jsdoc']);
|
||||
});
|
||||
|
||||
grunt.registerTask('publish:release', ['github_releaser2:release']);
|
||||
grunt.registerTask('publish:prerelease', ['github_releaser2:prerelease']);
|
||||
|
||||
// before commit
|
||||
grunt.registerTask('pre-commit', ['search:console', 'jsbeautifier:pre-commit', 'scsslint', 'jshint']);
|
||||
|
||||
|
||||
+6
-4
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jsxc",
|
||||
"version": "3.1.1",
|
||||
"version": "3.2.0-beta.2",
|
||||
"homepage": "https://www.jsxc.org",
|
||||
"authors": [
|
||||
"sualko <klaus@jsxc.org>"
|
||||
@@ -27,13 +27,15 @@
|
||||
"devDependencies": {
|
||||
"emojione": "~2.2.7",
|
||||
"favico.js": "^0.3.10",
|
||||
"strophe.bookmarks": "strophe/strophejs-plugin-bookmarks#f51c60629cb0ad278f92bfb8d8dbb8cb455d9c98",
|
||||
"strophe.bookmarks": "strophe/strophejs-plugin-bookmarks#ff9e95a1a823b927f8c4c45453aaa534857a37b4",
|
||||
"strophe.js": "strophejs#a11ebefa3db1b6712d51d0d309b9f68f8e391d1b",
|
||||
"strophe.vcard": "strophe/strophejs-plugin-vcard#de3a0c97a2c520ed900ee15b04a0c16d5c663891",
|
||||
"strophe.x": "strophe/strophejs-plugin-dataforms",
|
||||
"strophe.chatstates": "strophe/strophejs-plugin-chatstates",
|
||||
"strophe.chatstates": "strophe/strophejs-plugin-chatstates#fb0b5f5b03d98ba05ac9dec853fe2190794128b6",
|
||||
"jquery-i18next": "^1.2.0",
|
||||
"i18next": "^5.0.0",
|
||||
"magnific-popup": "^1.1.0"
|
||||
"magnific-popup": "^1.1.0",
|
||||
"strophejs-plugin-mam": "strophe/strophejs-plugin-mam#d7b9a8a0b404e3dd9c83dd9cc4bf28aec2e5f329",
|
||||
"strophejs-plugin-rsm": "strophe/strophejs-plugin-rsm#fa16b3b"
|
||||
}
|
||||
}
|
||||
|
||||
+80
-35
@@ -2168,7 +2168,8 @@ fieldset[disabled]
|
||||
width: 100%; }
|
||||
|
||||
#jsxc_dialog .mfp-close, #jsxc_webrtc .mfp-close {
|
||||
font-size: 23px; }
|
||||
font-size: 23px;
|
||||
font-weight: normal; }
|
||||
|
||||
.mfp-bg {
|
||||
z-index: 9000; }
|
||||
@@ -2763,15 +2764,14 @@ fieldset[disabled]
|
||||
position: fixed;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 30px;
|
||||
height: 30px; }
|
||||
width: 30px; }
|
||||
@media (max-width: 768px) {
|
||||
#jsxc_windowListSB {
|
||||
display: none; } }
|
||||
#jsxc_windowListSB > div {
|
||||
box-sizing: border-box;
|
||||
width: 14px;
|
||||
height: 100%;
|
||||
height: 30px;
|
||||
background-color: #cccccc;
|
||||
color: #807f7f;
|
||||
text-align: center;
|
||||
@@ -2881,7 +2881,8 @@ fieldset[disabled]
|
||||
.jsxc_window .jsxc_emoticons:hover:after {
|
||||
opacity: 0.5; }
|
||||
.jsxc_window .jsxc_fade {
|
||||
position: relative; }
|
||||
position: relative;
|
||||
overflow: hidden; }
|
||||
.jsxc_window .jsxc_fade .jsxc_overlay {
|
||||
display: none;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
@@ -2931,6 +2932,31 @@ fieldset[disabled]
|
||||
text-overflow: ellipsis; }
|
||||
.jsxc_window .jsxc_fade .jsxc_overlay > div a:hover {
|
||||
text-decoration: underline; }
|
||||
.jsxc_window .jsxc_fade .jsxc_mam-load-more {
|
||||
display: none;
|
||||
text-align: center;
|
||||
font-size: 0.8em;
|
||||
font-style: italic;
|
||||
position: absolute;
|
||||
top: -42px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 42px;
|
||||
cursor: pointer;
|
||||
z-index: 80;
|
||||
line-height: 42px;
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.5s, top 0.5s;
|
||||
transition: opacity 0.5s, top 0.5s; }
|
||||
.jsxc_window .jsxc_fade .jsxc_mam-load-more.jsxc_show {
|
||||
top: 0;
|
||||
opacity: 0.7; }
|
||||
.jsxc_window .jsxc_fade .jsxc_mam-load-more.jsxc_show:hover {
|
||||
opacity: 1; }
|
||||
.jsxc_window .jsxc_fade.jsxc_mam-enable .jsxc_textarea {
|
||||
padding-top: 42px; }
|
||||
.jsxc_window .jsxc_fade.jsxc_mam-enable .jsxc_mam-load-more {
|
||||
display: block; }
|
||||
.jsxc_window .jsxc_avatar {
|
||||
margin-top: 1px; }
|
||||
.jsxc_window .jsxc_textarea {
|
||||
@@ -3018,16 +3044,16 @@ fieldset[disabled]
|
||||
position: relative;
|
||||
outline: none;
|
||||
clear: both; }
|
||||
.jsxc_chatmessage.jsxc_error {
|
||||
opacity: 0.7; }
|
||||
.jsxc_chatmessage.jsxc_error:before {
|
||||
content: " ";
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
right: 3px;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background-color: yellow; }
|
||||
.jsxc_chatmessage.jsxc_error:before {
|
||||
content: attr(data-error-msg);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
background-color: rgba(255, 255, 255, 0.7);
|
||||
text-align: center;
|
||||
padding: 10px 5px; }
|
||||
.jsxc_chatmessage a {
|
||||
color: #00f;
|
||||
text-decoration: underline;
|
||||
@@ -3176,26 +3202,6 @@ fieldset[disabled]
|
||||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
vertical-align: middle; }
|
||||
.jsxc_sys.jsxc_composing {
|
||||
text-align: center;
|
||||
font-size: 0.9em;
|
||||
font-style: italic;
|
||||
display: block;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
-webkit-transition: opacity 0.6s;
|
||||
transition: opacity 0.6s; }
|
||||
.jsxc_sys.jsxc_composing:before {
|
||||
content: " ";
|
||||
width: 1.5em;
|
||||
height: 1em;
|
||||
display: inline-block;
|
||||
background-size: 80%;
|
||||
background-repeat: no-repeat;
|
||||
margin: 0 3px 0 0;
|
||||
background-image: url('../img/composing.png'); }
|
||||
.jsxc_sys.jsxc_composing.jsxc_fadein {
|
||||
opacity: 1; }
|
||||
|
||||
div.jsxc_settings {
|
||||
position: relative; }
|
||||
@@ -3232,6 +3238,35 @@ div.jsxc_transfer {
|
||||
div.jsxc_transfer.jsxc_enc.jsxc_trust {
|
||||
background-image: url('../img/padlock_close_green.svg'); }
|
||||
|
||||
.jsxc_status-msg {
|
||||
font-size: 12px;
|
||||
display: none;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
height: 50%;
|
||||
line-height: 17.5px;
|
||||
opacity: 0.7; }
|
||||
.jsxc_status-msg.jsxc_composing:before {
|
||||
content: " ";
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
display: inline-block;
|
||||
background-size: cover;
|
||||
vertical-align: middle;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../img/composing.png'); }
|
||||
|
||||
.jsxc_status-msg-show .jsxc_name {
|
||||
height: 50%;
|
||||
line-height: 20px; }
|
||||
|
||||
.jsxc_status-msg-show .jsxc_status-msg {
|
||||
display: block; }
|
||||
|
||||
.jsxc_status-msg-show .jsxc_lastmsg {
|
||||
display: none !important; }
|
||||
|
||||
.jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_bar .jsxc_avatar, li[data-type='groupchat'] .jsxc_avatar {
|
||||
text-indent: 999px;
|
||||
background-image: url('../img/group_white.svg');
|
||||
@@ -3309,6 +3344,8 @@ div.jsxc_transfer {
|
||||
color: inherit; }
|
||||
.jsxc_windowItem .jsxc_memberlist.jsxc_expand ul > li .jsxc_avatar {
|
||||
margin-right: 4px; }
|
||||
.jsxc_windowItem .jsxc_memberlist .jsxc_avatar :before {
|
||||
display: none; }
|
||||
|
||||
li[data-type='groupchat'] .jsxc_video {
|
||||
display: none; }
|
||||
@@ -3394,6 +3431,14 @@ li[data-type='groupchat'] .jsxc_video {
|
||||
background-color: #f2f2f2;
|
||||
padding: 10px;
|
||||
margin: 0 -30px 10px; }
|
||||
#jsxc_dialog form fieldset h3.jsxc_experimental:after {
|
||||
content: "experimental";
|
||||
font-size: 0.7em;
|
||||
border-radius: 2px;
|
||||
padding: 1px 5px;
|
||||
background-color: orange;
|
||||
margin-left: 5px;
|
||||
font-weight: normal; }
|
||||
#jsxc_dialog legend {
|
||||
border: 0;
|
||||
font-size: 20px; }
|
||||
|
||||
+973
-510
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
externo
+9
-9
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+3274
-2467
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
externo
+48
-46
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+12
@@ -47,6 +47,18 @@
|
||||
"license": "MIT",
|
||||
"url": "https://github.com/strophe/strophejs-plugins/tree/master/chatstates"
|
||||
},
|
||||
{
|
||||
"name": "strophe.js/mam",
|
||||
"file": "lib/strophejs-plugin-mam/strophe.mam.js",
|
||||
"license": "MIT",
|
||||
"url": "https://github.com/strophe/strophejs-plugin-mam"
|
||||
},
|
||||
{
|
||||
"name": "strophe.js/rsm",
|
||||
"file": "lib/strophejs-plugin-rsm/strophe.rsm.js",
|
||||
"license": "MIT",
|
||||
"url": "https://github.com/strophe/strophejs-plugin-rsm"
|
||||
},
|
||||
{
|
||||
"name": "strophe.jinglejs",
|
||||
"file": "lib/strophe.jinglejs/strophe.jinglejs-bundle.js",
|
||||
|
||||
@@ -117,6 +117,7 @@ $(function() {
|
||||
localStorage.setItem('bosh-url', url);
|
||||
localStorage.setItem('xmpp-domain', domain);
|
||||
|
||||
jsxc.options.xmpp.url = url;
|
||||
settings.xmpp.url = url;
|
||||
settings.xmpp.domain = domain;
|
||||
|
||||
|
||||
+1
-1
Submodule lib/strophe.jinglejs updated: 651a2ba8d2...aac6d4610b
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+16
-11
@@ -56,7 +56,7 @@
|
||||
"Deny": "Ablehnen",
|
||||
"Approve": "Bestätigen",
|
||||
"Remove_buddy": "Kontakt entfernen",
|
||||
"You_are_about_to_remove_": "Du bist gerade dabei __bid_name__ (<b>__bid_jid__</b>) von deiner Kontaktliste zu entfernen. Alle Chats werden geschlossen.",
|
||||
"You_are_about_to_remove_": "Du bist gerade dabei __bid_name__ (<b>__bid_jid__</b>) von deiner Kontaktliste zu entfernen. Alle zugehörigen Chats werden geschlossen.",
|
||||
"Continue_without_chat": "Weiter ohne Chat",
|
||||
"Please_wait": "Bitte warten",
|
||||
"Login_failed": "Chat-Anmeldung fehlgeschlagen",
|
||||
@@ -95,7 +95,7 @@
|
||||
"Remove": "Löschen",
|
||||
"Online_help": "Online Hilfe",
|
||||
"FN": "Name",
|
||||
"N": " ",
|
||||
"N": "Name",
|
||||
"FAMILY": "Familienname",
|
||||
"GIVEN": "Vorname",
|
||||
"NICKNAME": "Spitzname",
|
||||
@@ -110,7 +110,7 @@
|
||||
"TEL": "Telefon",
|
||||
"NUMBER": "Nummer",
|
||||
"EMAIL": "E-Mail",
|
||||
"USERID": " ",
|
||||
"USERID": "Benutzerkennung",
|
||||
"ORG": "Organisation",
|
||||
"ORGNAME": "Name",
|
||||
"ORGUNIT": "Abteilung",
|
||||
@@ -118,7 +118,7 @@
|
||||
"ROLE": "Rolle",
|
||||
"BDAY": "Geburtstag",
|
||||
"DESC": "Beschreibung",
|
||||
"PHOTO": " ",
|
||||
"PHOTO": "Foto",
|
||||
"send_message": "Sende Nachricht",
|
||||
"get_info": "Benutzerinformationen",
|
||||
"Settings": "Einstellungen",
|
||||
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": "Deine Nachricht wurde nicht versandt, da der Raum nicht mehr existiert",
|
||||
"message_not_send_forbidden": "Deine Nachricht wurde nicht versandt, da du kein \"Mitspracherecht\" hast",
|
||||
"message_not_send_not-acceptable": "Deine Nachricht wurde nicht versandt, da du kein Mitglied dieser Gruppe bist",
|
||||
"message_not_send_resource-unavailable": "Ihre Nachricht wurde nicht gesendet, weil Ihr Gesprächspartner sich nicht verbunden hat",
|
||||
"message_not_send_remote-server-not-found": "Ihre Nachricht wurde nicht gesendet, weil keine Server-zu-Server Verbindung aufgebaut werden konnte",
|
||||
"This_room_has_been_closed": "Diese Gruppe wurde geschlossen",
|
||||
"Room_logging_is_enabled": "Gesprächsverlauf kann öffentlich einsehbar sein",
|
||||
"A_password_is_required": "Es wird ein Passwort benötigt",
|
||||
@@ -265,10 +267,10 @@
|
||||
"Use_local_audio_device": "Nutze eigenes Audio Gerät",
|
||||
"Use_local_video_device": "Benutze eigene Webcam",
|
||||
"is_": "ist __status__",
|
||||
"You_received_a_message_from_an_unknown_sender_": "Du hast eine Nachricht von einem unbekannten Sender erhalten (__sender__) Möchtest du sie sehen?",
|
||||
"You_received_a_message_from_an_unknown_sender_": "Du hast eine Nachricht von einem unbekannten Absender erhalten (__sender__). Möchtest du sie sehen?",
|
||||
"Your_roster_is_empty_add_": "Deine Kontaktliste ist leer, füge einen neuen Kontakt <a>hinzu</a>",
|
||||
"onsmp_explanation_question": "Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet. Um dich gegenüber deinem Kontakt zu verifizieren gib die Antwort ein und klick auf Antworten.",
|
||||
"onsmp_explanation_secret": "Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet. Um dich gegenüber deinem Kontakt zu verifizieren gib das Geheimnis ein.",
|
||||
"onsmp_explanation_question": "Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet. Um dich gegenüber deinem Kontakt zu verifizieren gib die Antwort ein und klick auf Antworten.",
|
||||
"onsmp_explanation_secret": "Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet. Um dich gegenüber deinem Kontakt zu verifizieren gib das Geheimnis ein.",
|
||||
"from_sender": "von __sender__",
|
||||
"Verified_private_conversation_started": "Verifizierte private Konversation gestartet.",
|
||||
"Unverified_private_conversation_started": "Unverifizierte private Konversation gestartet.",
|
||||
@@ -283,9 +285,9 @@
|
||||
"Change": "Ändern",
|
||||
"Send_file": "Datei senden",
|
||||
"setting-explanation-carbon": "Wenn Kopien aktiviert sind, werden alle eingehenden Nachrichten zu allen angemeldeten Clients gesendet.",
|
||||
"setting-explanation-login": "Wenn diese Option aktiviert ist, wird der Chat beim anmelden automatisch gestartet.",
|
||||
"setting-explanation-login": "Wenn diese Option aktiviert ist, wird der Chat beim Anmelden automatisch gestartet.",
|
||||
"setting-explanation-priority": "Wenn du mit deinem XMPP Konto mehrfach angemeldet bist, werden Nachrichten zu dem Client mit der höchsten Priorität zugestellt.",
|
||||
"setting-explanation-xmpp": "Diese Optionen werden für die Verbindung zum XMPP server genutzt.",
|
||||
"setting-explanation-xmpp": "Diese Optionen werden für die Verbindung zum XMPP Server genutzt.",
|
||||
"_is_composing": " tippt gerade...",
|
||||
"_are_composing": " tippen gerade...",
|
||||
"Chat_state_notifications": "Statusbenachrichtigungen",
|
||||
@@ -300,7 +302,10 @@
|
||||
"Connection_accepted": "Verbindung angenommen",
|
||||
"Stream_terminated": "Stream beendet",
|
||||
"Close_all": "Schließe alle",
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Notification": "Benachrichtigung",
|
||||
"Unreadable_OTR_message": "Unlesbare OTR Nachricht verworfen",
|
||||
"Load_older_messages": "Ältere Nachrichten laden",
|
||||
"Message_history": "Nachrichten Verlauf",
|
||||
"setting-mam-enable": "Falls aktiviert können Sie gespeicherte Nachrichten vom Server abrufen"
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+19
-14
@@ -95,7 +95,7 @@
|
||||
"Remove": "Remove",
|
||||
"Online_help": "Online help",
|
||||
"FN": "Full name",
|
||||
"N": " ",
|
||||
"N": "Name",
|
||||
"FAMILY": "Family name",
|
||||
"GIVEN": "Given name",
|
||||
"NICKNAME": "Nickname",
|
||||
@@ -110,7 +110,7 @@
|
||||
"TEL": "Telephone",
|
||||
"NUMBER": "Number",
|
||||
"EMAIL": "Email",
|
||||
"USERID": " ",
|
||||
"USERID": "User ID",
|
||||
"ORG": "Organization",
|
||||
"ORGNAME": "Name",
|
||||
"ORGUNIT": "Unit",
|
||||
@@ -118,7 +118,7 @@
|
||||
"ROLE": "Role",
|
||||
"BDAY": "Birthday",
|
||||
"DESC": "Description",
|
||||
"PHOTO": " ",
|
||||
"PHOTO": "Photo",
|
||||
"send_message": "Send message",
|
||||
"get_info": "Show information",
|
||||
"Settings": "Settings",
|
||||
@@ -236,10 +236,12 @@
|
||||
"muc_removed_info_membersonly": "__nickname__ has been removed from the room, because the room has been changed to members-only and you are no member",
|
||||
"muc_removed_shutdown": "You have been removed from the room, because the MUC service is being shut down",
|
||||
"Reason": "Reason",
|
||||
"message_not_send": "Your message was not send because of an error",
|
||||
"message_not_send_item-not-found": "Your message was not send because this room does not exist",
|
||||
"message_not_send_forbidden": "Your message was not send because you have no voice in this room",
|
||||
"message_not_send_not-acceptable": "Your message was not send because you are no occupant of this room",
|
||||
"message_not_send": "Your message was not sent because of an error",
|
||||
"message_not_send_item-not-found": "Your message was not sent because this room does not exist",
|
||||
"message_not_send_forbidden": "Your message was not sent because you have no voice in this room",
|
||||
"message_not_send_not-acceptable": "Your message was not sent because you are no occupant of this room",
|
||||
"message_not_send_resource-unavailable": "Your message was not sent because your interlocutor isn't available or connected",
|
||||
"message_not_send_remote-server-not-found": "Your message was not sent because the server-to-server connection failed",
|
||||
"This_room_has_been_closed": "This room has been closed",
|
||||
"Room_logging_is_enabled": "Room logging is enabled",
|
||||
"A_password_is_required": "A password is required",
|
||||
@@ -265,13 +267,13 @@
|
||||
"Use_local_audio_device": "Use local audio device.",
|
||||
"Use_local_video_device": "Use local video device.",
|
||||
"is_": "is __status__",
|
||||
"You_received_a_message_from_an_unknown_sender_": "You received a message from an unknown sender (__sender__) Do you want to display them?",
|
||||
"You_received_a_message_from_an_unknown_sender_": "You received a message from an unknown sender (__sender__). Do you want to display them?",
|
||||
"Your_roster_is_empty_add_": "Your roster is empty, add a <a>new contact</a>",
|
||||
"onsmp_explanation_question": "You contact is attempting to determine if they are really talking to you. To authenticate to your contact, enter the answer and click Answer.",
|
||||
"onsmp_explanation_secret": "You contact is attempting to determine if they are really talking to you. To authenticate to your contact, enter the secret.",
|
||||
"onsmp_explanation_question": "Your contact is attempting to determine if they are really talking to you. To authenticate to your contact, enter the answer and click Answer.",
|
||||
"onsmp_explanation_secret": "Your contact is attempting to determine if they are really talking to you. To authenticate to your contact, enter the secret.",
|
||||
"from_sender": "from __sender__",
|
||||
"Verified_private_conversation_started": "Verified Private conversation started.",
|
||||
"Unverified_private_conversation_started": "Unverified Private conversation started.",
|
||||
"Verified_private_conversation_started": "Verified private conversation started.",
|
||||
"Unverified_private_conversation_started": "Unverified private conversation started.",
|
||||
"Bookmark": "Bookmark",
|
||||
"Auto-join": "Auto-join",
|
||||
"Edit_bookmark": "Edit bookmark",
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": "Stream terminated",
|
||||
"Close_all": "Close all",
|
||||
"Notification": "Notification",
|
||||
"Unreadable_OTR_message": "Unreadable OTR message omitted"
|
||||
"Unreadable_OTR_message": "Unreadable OTR message omitted",
|
||||
"Load_older_messages": "Load older messages",
|
||||
"Message_history": "Message history",
|
||||
"setting-mam-enable": "If enabled you are able to retrieve stored messages from the server."
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": "Tu mensaje no fue enviado debido a que esta sala no existe",
|
||||
"message_not_send_forbidden": "Tu mensaje no fue enviado debido a que no tienes voz en esta sala",
|
||||
"message_not_send_not-acceptable": "Tu mensaje no fue enviado debido a que no eres un ocupante de esta sala ",
|
||||
"message_not_send_resource-unavailable": "Tu mensaje no fue enviado porque tu interlocutor no está disponible o conectado",
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": "Esta sala ha sido cerrada",
|
||||
"Room_logging_is_enabled": "Log de sala está habilitado",
|
||||
"A_password_is_required": "Se requiere una contraseña",
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+8
-3
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": "Votre message n'a pu être envoyé parce que ce salon n'existe pas",
|
||||
"message_not_send_forbidden": "Votre message n'a pas été envoyé parce que vous n'avez pas le droit de parler dans ce salon",
|
||||
"message_not_send_not-acceptable": "Votre message n'a pas été envoyé car il n'y a personne dans ce salon",
|
||||
"message_not_send_resource-unavailable": "Votre message n'a pas été envoyé parce que votre interlocuteur n'est pas connecté ou accessible",
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": "Ce salon a été fermé",
|
||||
"Room_logging_is_enabled": "L'historique du salon est conservé",
|
||||
"A_password_is_required": "Un mot de passe est requis",
|
||||
@@ -267,7 +269,7 @@
|
||||
"is_": "est __status__",
|
||||
"You_received_a_message_from_an_unknown_sender_": "Vous avez reçu un message d'un expéditeur inconnu (__sender__) Voulez-vous les afficher ?",
|
||||
"Your_roster_is_empty_add_": "Votre liste est vide, ajouter <a>Nouveau contact</a>",
|
||||
"onsmp_explanation_question": "Votre contact tente de déterminer si il ou elle parle vraiment à vous. Pour vous authentifier auprès de votre contact, saisissez une réponse et cliquez sur Répondre.",
|
||||
"onsmp_explanation_question": "Votre contact tente de déterminer si il ou elle vous parle vraiment. Pour vous authentifier auprès de votre contact, saisissez une réponse et cliquez sur Répondre.",
|
||||
"onsmp_explanation_secret": "Votre contact tente de déterminer si il ou elle parle vraiment à vous. Pour vous authentifier auprès de votre contact, entrez le mot secret",
|
||||
"from_sender": "de __sender__",
|
||||
"Verified_private_conversation_started": "La conversation privée vérifiée a démarré.",
|
||||
@@ -300,7 +302,10 @@
|
||||
"Connection_accepted": "Connexion acceptée",
|
||||
"Stream_terminated": "Flux terminé",
|
||||
"Close_all": "Tout fermer",
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Notification": "Notification",
|
||||
"Unreadable_OTR_message": "Message OTR illisible omis",
|
||||
"Load_older_messages": "Charger des messages plus anciens",
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
@@ -240,6 +240,7 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
|
||||
@@ -0,0 +1,311 @@
|
||||
{
|
||||
"translation": {
|
||||
"Logging_in": "Inloggen…",
|
||||
"your_connection_is_unencrypted": "Je verbinding is niet versleuteld.",
|
||||
"your_connection_is_encrypted": "Je verbinding is versleuteld.",
|
||||
"your_buddy_closed_the_private_connection": "Je contactpersoon sloot de prive-verbinding.",
|
||||
"start_private": "start privé",
|
||||
"close_private": "Sluit privé",
|
||||
"your_buddy_is_verificated": "Je contactpersoon is geverifieerd.",
|
||||
"you_have_only_a_subscription_in_one_way": "Je hebt een eenrichtingsabonnement.",
|
||||
"authentication_query_sent": "Verificatie vraag gestuurd.",
|
||||
"your_message_wasnt_send_please_end_your_private_conversation": "Je bericht is niet verzonden. Beëindig prive gesprek.",
|
||||
"unencrypted_message_received": "Ongecodeerde bericht ontvangen",
|
||||
"not_available": "Niet beschikbaar",
|
||||
"no_connection": "Geen verbinding!",
|
||||
"relogin": "opnieuw inloggen",
|
||||
"trying_to_start_private_conversation": "Proberen om privé-gesprek te beginnen!",
|
||||
"Verified": "Geverifieerd",
|
||||
"Unverified": "Ongeverifieerd",
|
||||
"private_conversation_aborted": "Privé-gesprek afgebroken!",
|
||||
"your_buddy_closed_the_private_conversation_you_should_do_the_same": "Je contact sloot het Privé-gesprek! Doe hetzelfde.",
|
||||
"conversation_is_now_verified": "Gesprek is geverifieerd.",
|
||||
"authentication_failed": "Verificatie mislukt.",
|
||||
"Creating_your_private_key_": "Een persoonlijke sleutel maken. Dit kan een tijdje duren.",
|
||||
"Authenticating_a_buddy_helps_": "Authenticatie met een contact helpt ervoor te zorgen dat de persoon met wie u praat echt de persoon is die ze beweert te zijn.",
|
||||
"How_do_you_want_to_authenticate_your_buddy": "Hoe wilt u verificeren __bid_name__ (<b>__bid_jid__</b>)?",
|
||||
"Select_method": "Selectie methode...",
|
||||
"Manual": "Handleiding",
|
||||
"Question": "Vraag",
|
||||
"Secret": "Geheim",
|
||||
"To_verify_the_fingerprint_": "Neem via een ander betrouwbaar kanaal, contact op met uw gesprekspartner om de vingerafdruk te controleren. Bijvoorbeeld per telefoon.",
|
||||
"Your_fingerprint": "Jou vingerafdruk",
|
||||
"Buddy_fingerprint": "Contact vingerafdruk",
|
||||
"Close": "Sluiten",
|
||||
"Compared": "Vergeleken",
|
||||
"To_authenticate_using_a_question_": "Gebruik een vraag om te verificeeren, neem een antwoord alleen bekend bij Jou en je contact.",
|
||||
"Ask": "Vraag",
|
||||
"To_authenticate_pick_a_secret_": "Voor verificatie, kies een geheim alleen bekend is bij jou en je contact.",
|
||||
"Compare": "Vergelijk",
|
||||
"Fingerprints": "Vingerafdrukken",
|
||||
"Authentication": "Verificatie",
|
||||
"Message": "Bericht",
|
||||
"Add_buddy": "Contact toevoegen",
|
||||
"rename_buddy": "contact hernoemen",
|
||||
"delete_buddy": "contact verwijderen",
|
||||
"Login": "Login",
|
||||
"Username": "Gebruikersnaam",
|
||||
"Password": "Wachtwoord",
|
||||
"Cancel": "Annuleer",
|
||||
"Connect": "Verbind",
|
||||
"Type_in_the_full_username_": "Vul de volledige gebruikersnaam en een optionele alias in.",
|
||||
"Alias": "Alias",
|
||||
"Add": "Voeg toe",
|
||||
"Subscription_request": "Abonnementsverzoek",
|
||||
"You_have_a_request_from": "Je hebt een uitnodiging van",
|
||||
"Deny": "Ontken",
|
||||
"Approve": "Toestaan",
|
||||
"Remove_buddy": "Contact verwijderen",
|
||||
"You_are_about_to_remove_": "Je staat op het punt om __bid_name__ (<b>__bid_jid__</b>) van je contactlijst te verwijderen. Alle chats worden afgesloten.",
|
||||
"Continue_without_chat": "Doorgaan zonder chat",
|
||||
"Please_wait": "Even geduld",
|
||||
"Login_failed": "Chat login mislukt",
|
||||
"Sorry_we_cant_authentikate_": "Verificatie is mislukt met de chatserver. Is het paswoord fout?",
|
||||
"Retry": "Terug",
|
||||
"clear_history": "Wis geschiedenis",
|
||||
"New_message_from": "Nieuw bericht van__name__",
|
||||
"Should_we_notify_you_": "Zullen wij u notificeren over nieuwe berichten in de toekomst?",
|
||||
"Please_accept_": "Klik op \"Toestaan\" aan de bovenkant.",
|
||||
"Hide_offline": "Offline contacten verbergen",
|
||||
"Show_offline": "Offline contacten weergeven",
|
||||
"About": "Over",
|
||||
"dnd": "Niet storen",
|
||||
"Mute": "Dempen aan",
|
||||
"Unmute": "Dempen uit",
|
||||
"Subscription": "Abonnement",
|
||||
"both": "Beide",
|
||||
"Status": "Status",
|
||||
"online": "online",
|
||||
"chat": "chat",
|
||||
"away": "afwezig",
|
||||
"xa": "langer afwezig",
|
||||
"offline": "offline",
|
||||
"none": "geen",
|
||||
"Unknown_instance_tag": "Voorbeeld tag onbekend.",
|
||||
"Not_one_of_our_latest_keys": "Niet één van onze laatste sleutels.",
|
||||
"Received_an_unreadable_encrypted_message": "Een niet leesbare versleuteld bericht ontvangen.",
|
||||
"Online": "Online",
|
||||
"Chatty": "Spraakzaam",
|
||||
"Away": "Afwezig",
|
||||
"Extended_away": "Langer afwezig",
|
||||
"Offline": "Offline",
|
||||
"Friendship_request": "Contact verzoek",
|
||||
"Confirm": "Bevestig",
|
||||
"Dismiss": "Afwijzen",
|
||||
"Remove": "Verwijder",
|
||||
"Online_help": "Online hulp",
|
||||
"FN": "Volledige naam",
|
||||
"N": " N ",
|
||||
"FAMILY": "Familienaam",
|
||||
"GIVEN": "Voornaam",
|
||||
"NICKNAME": "Bijnaam",
|
||||
"URL": "URL",
|
||||
"ADR": "Adres",
|
||||
"STREET": "Straatnaam",
|
||||
"EXTADD": "Uitgebreid adres",
|
||||
"LOCALITY": "Plaats",
|
||||
"REGION": "Regio",
|
||||
"PCODE": "Postcode",
|
||||
"CTRY": "Land",
|
||||
"TEL": "Telefoon",
|
||||
"NUMBER": "Nummer",
|
||||
"EMAIL": "E-mail",
|
||||
"USERID": " USERID ",
|
||||
"ORG": "Organisatie",
|
||||
"ORGNAME": "Naam",
|
||||
"ORGUNIT": "Afdeling",
|
||||
"TITLE": "functietitel",
|
||||
"ROLE": "Functie",
|
||||
"BDAY": "Verjaardag",
|
||||
"DESC": "Beschrijving",
|
||||
"PHOTO": " FOTO ",
|
||||
"send_message": "Zend bericht",
|
||||
"get_info": "Gegevens weergeven",
|
||||
"Settings": "Instellingen",
|
||||
"Priority": "Prioriteit",
|
||||
"Save": "Opslaan",
|
||||
"User_settings": "Gebruikersinstellingen",
|
||||
"A_fingerprint_": "Een vingerafdruk wordt gebruikt om er zeker van te zijn dat uw gesprekspartner ook is wie hij of zij zegt te zijn.",
|
||||
"is": "is",
|
||||
"Login_options": "Login options",
|
||||
"BOSH_url": "BOSH URL",
|
||||
"Domain": "Domein",
|
||||
"Resource": "Bron",
|
||||
"On_login": "Tijdens login",
|
||||
"Received_an_unencrypted_message": "Een niet-versleuteld bericht ontvangen",
|
||||
"Sorry_your_buddy_doesnt_provide_any_information": "Sorry, je contact verschaft geen informatie.",
|
||||
"Info_about": "Gegevens van",
|
||||
"Authentication_aborted": "Verificatie afgebroken.",
|
||||
"Authentication_request_received": "Authenticatie verzoek ontvangen.",
|
||||
"Log_in_without_chat": "Zonder chat inloggen",
|
||||
"has_come_online": "is online gekomen",
|
||||
"Unknown_sender": "Afzender onbekend",
|
||||
"Please_allow_access_to_microphone_and_camera": "Klik op \"Toestaan\" aan de bovenkant voor de microfoon en camera.",
|
||||
"Incoming_call": "Inkomend gesprek",
|
||||
"from": "van",
|
||||
"Do_you_want_to_accept_the_call_from": "Wilt u het gesprek accepteren",
|
||||
"Reject": "Weiger",
|
||||
"Accept": "Aanvaard",
|
||||
"hang_up": "ophangen",
|
||||
"snapshot": "momentopname",
|
||||
"mute_my_audio": "mijn geluid dempen",
|
||||
"pause_my_video": "mijn video pauzeren",
|
||||
"fullscreen": "volledige scherm",
|
||||
"Info": "Info",
|
||||
"Local_IP": "Lokaal IP",
|
||||
"Remote_IP": "Extern IP",
|
||||
"Local_Fingerprint": "Lokale vingerafdruk",
|
||||
"Remote_Fingerprint": "Afstand vingerafdruk",
|
||||
"Video_call_not_possible": "Video-gesprek is niet mogelijk. Je contact heeft geen ondersteuning voor video-oproepen.",
|
||||
"Start_video_call": "Video gesprek starten",
|
||||
"Join_chat": "Neem deel aan chat",
|
||||
"Join": "Meedoen",
|
||||
"Room": "Kamer",
|
||||
"Nickname": "Bijnaam",
|
||||
"left_the_building": "__nickname__heeft het gebouw verlaten",
|
||||
"entered_the_room": "__nickname__kwam de kamer binnen",
|
||||
"is_now_known_as": "__newNickname__ is bekend als __oldNickname__",
|
||||
"This_room_is": "Deze kamer is",
|
||||
"muc_hidden": {
|
||||
"keyword": "verborgen",
|
||||
"description": "kan niet worden gevonden via zoeken"
|
||||
},
|
||||
"muc_membersonly": {
|
||||
"keyword": "Alleen leden",
|
||||
"description": "Je dient lid te zijn van deze ledenlijst"
|
||||
},
|
||||
"muc_moderated": {
|
||||
"keyword": "gemodereerd",
|
||||
"description": "Alleen personen met \"spraak\" zijn toegestaan om berichten te zenden"
|
||||
},
|
||||
"muc_nonanonymous": {
|
||||
"keyword": "niet-anoniem",
|
||||
"description": "Je jabber ID is verlopen voor alle andere deelnemers"
|
||||
},
|
||||
"muc_open": {
|
||||
"keyword": "open",
|
||||
"description": "iedereen kan deelnemen"
|
||||
},
|
||||
"muc_passwordprotected": {
|
||||
"keyword": "beschermd wachtwoord",
|
||||
"description": "je dient je correcte wachtwoord in te geven"
|
||||
},
|
||||
"muc_persistent": {
|
||||
"keyword": "aanhoudend",
|
||||
"description": "zal niet worden vernietigd nadat de laatste deelnemer is vertrokken"
|
||||
},
|
||||
"muc_public": {
|
||||
"keyword": "publiek",
|
||||
"description": "kan gevonden worden door te zoeken"
|
||||
},
|
||||
"muc_semianonymous": {
|
||||
"keyword": "semi-anoniem",
|
||||
"description": "je Jabber id is alleen vrijgegeven voor kamer beheerders"
|
||||
},
|
||||
"muc_temporary": {
|
||||
"keyword": "tijdelijk",
|
||||
"description": "zal worden vernietigd nadat de laatste deelnemer is vertrokken"
|
||||
},
|
||||
"muc_unmoderated": {
|
||||
"keyword": "ongemodereerd",
|
||||
"description": "verzenden van berichten is toegestaan voor iedereen"
|
||||
},
|
||||
"muc_unsecured": {
|
||||
"keyword": "niet beveiligd",
|
||||
"description": "je hoeft geen wachtwoord in te voeren"
|
||||
},
|
||||
"Continue": "Doorgaan",
|
||||
"Server": "Server",
|
||||
"Rooms_are_loaded": "Kamers zijn geladen",
|
||||
"Could_load_only": "Alleen aanvullen voor__count__kamers",
|
||||
"muc_explanation": "Vul de kamernaam, optioneel een bijnaam en wachtwoord in om deel te nemen een chat",
|
||||
"You_already_joined_this_room": "Je bent al verbonden met deze kamer",
|
||||
"This_room_will_be_closed": "De kamer wordt gesloten",
|
||||
"Room_not_found_": "Een nieuwe kamer wordt aangemaakt",
|
||||
"Loading_room_information": "Kamer informatie laden",
|
||||
"Destroy": "Vernietigen",
|
||||
"Leave": "Vertrekken",
|
||||
"changed_subject_to": "__nickname__veranderde het onderwerp van de kamer naar \"__subject__\"",
|
||||
"muc_removed_kicked": "Je bent afgemeld van de kamer",
|
||||
"muc_removed_info_kicked": "__nickname__is uit de kamer gegooid",
|
||||
"muc_removed_banned": "Je bent uit de kamer gezet",
|
||||
"muc_removed_info_banned": "__nickname__is uit de kamer gezet",
|
||||
"muc_removed_affiliation": "Je bent verwijderd van de kamer door een verwantschap wijziging",
|
||||
"muc_removed_info_affiliation": "__nickname__is verwijderd van de kamer door een verwantschap wijziging",
|
||||
"muc_removed_membersonly": "Je bent verwijderd van de kamer, omdat de kamer alleen voor leden is. Je bent geen lid.",
|
||||
"muc_removed_info_membersonly": "__nickname__is verwijderd van de kamer, door de wijziging naar alleen voor leden. Je bent geen lid.",
|
||||
"muc_removed_shutdown": "Je bent verwijderd van de kamer, omdat de MUC dienst is uitgeschakeld",
|
||||
"Reason": "Reden",
|
||||
"message_not_send": "Je bericht was niet verzonden door een error",
|
||||
"message_not_send_item-not-found": "Je bericht was niet verzonden omdat de kamer niet bestaat",
|
||||
"message_not_send_forbidden": "Je bericht was niet verzonden omdat er geen spraak is in deze kamer",
|
||||
"message_not_send_not-acceptable": "Je bericht is niet verzonden omdat je geen deelnemer bent van deze kamer",
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": "Deze kamer is gesloten",
|
||||
"Room_logging_is_enabled": "Kamerlog is ingeschakeld",
|
||||
"A_password_is_required": "Een wachtwoord is vereist",
|
||||
"You_are_not_on_the_member_list": "Je staat niet op de ledenlijst",
|
||||
"You_are_banned_from_this_room": "Je bent uit deze kamer gezet",
|
||||
"Your_desired_nickname_": "Je favoriete bijnaam is al in gebruik. Aub kies een andere",
|
||||
"The_maximum_number_": "Het maximum aantal kamer gebruikers is bereikt",
|
||||
"This_room_is_locked_": "Deze kamer is afgesloten",
|
||||
"You_are_not_allowed_to_create_": "Je hebt geen rechten om een kamer aan te maken",
|
||||
"Alert": "alarm",
|
||||
"Call_started": "Gesprek gestart",
|
||||
"Call_terminated": "Gesprek beëindigd",
|
||||
"Carbon_copy": "Carbon kopie",
|
||||
"Enable": "Inschakelen",
|
||||
"jingle_reason_busy": "bezet",
|
||||
"jingle_reason_decline": "afwijzen",
|
||||
"jingle_reason_success": "opgehangen",
|
||||
"Media_failure": "Media storing",
|
||||
"No_local_audio_device": "Lokaal audioapparaat niet aanwezig.",
|
||||
"No_local_video_device": "Lokaal videoapparaat niet aanwezig.",
|
||||
"Ok": "Ok",
|
||||
"PermissionDeniedError": "Jij of je browser weigerde media toestemming",
|
||||
"Use_local_audio_device": "Lokaal audioapparaat gebruiken.",
|
||||
"Use_local_video_device": "Lokaal videoapparaat gebruiken.",
|
||||
"is_": "is __status__",
|
||||
"You_received_a_message_from_an_unknown_sender_": "U ontvangt een bericht van een onbekende afzender (__sender__). Wilt u om het weergeven?",
|
||||
"Your_roster_is_empty_add_": "Jou rooster is leeg, voeg een <a>nieuw contact</a> toe",
|
||||
"onsmp_explanation_question": "Je contact probeert te bepalen of ze echt met jou praten. Voer om te verifiëren naar uw contact het antwoord in.",
|
||||
"onsmp_explanation_secret": "Je contact probeert te bepalen of ze echt met jou praten. Voer om te verifiëren naar jou contact het geheim in.",
|
||||
"from_sender": "van__sender__",
|
||||
"Verified_private_conversation_started": "Privé-gesprek geverifieerd gestart.",
|
||||
"Unverified_private_conversation_started": "Privé-gesprek ongeverifieerd gestart.",
|
||||
"Bookmark": "Favorieten",
|
||||
"Auto-join": "Automatisch deelnemen",
|
||||
"Edit_bookmark": "Favorieten bewerken",
|
||||
"Room_logging_is_disabled": "Kamerlog is uitgeschakeld",
|
||||
"Room_is_now_non-anoymous": "Kamer is nu niet-anoniem",
|
||||
"Room_is_now_semi-anonymous": "Kamer is nu semi-anoniem",
|
||||
"Do_you_want_to_change_the_default_room_configuration": "Wil je de standaard kamer instellingen wijzigen?",
|
||||
"Default": "Standaard",
|
||||
"Change": "Wijzigen",
|
||||
"Send_file": "Bestand zenden",
|
||||
"setting-explanation-carbon": "Met carbon kopie ingeschakeld zal de XMPP server een kopie van elk inkomend bericht doorsturen naar deze client, zelfs als het niet aan haar is gericht.",
|
||||
"setting-explanation-login": "Wanneer ingeschakeld zal de chat starten bij het inloggen.",
|
||||
"setting-explanation-priority": "Je XMPP dienst zal een prioriteitsbericht verzenden wanneer je meerdere keren ingelogd bent met hetzelfde account.",
|
||||
"setting-explanation-xmpp": "Deze opties worden gebruikt om met de XMPP server te verbinden.",
|
||||
"_is_composing": " is aan het schrijven...",
|
||||
"_are_composing": " zijn aan het schrijven...",
|
||||
"Chat_state_notifications": "Chat status notificatie",
|
||||
"setting-explanation-chat-state": "Wil je zend en ontvangst notificaties van iemand die start of stopt met het maken van een bericht?",
|
||||
"Share_screen": "Scherm delen",
|
||||
"Incoming_stream": "Stream inkomend",
|
||||
"Stream_started": "Stream gestart",
|
||||
"HTTPS_REQUIRED": "Deze actie vereist een versleutelde verbinding.",
|
||||
"EXTENSION_UNAVAILABLE": "Je hebt een browser extensie/addon nodig.",
|
||||
"UNKNOWN_ERROR": "Een onbekende error vond plaats.",
|
||||
"Install_extension": "Installeer extensie om scherm delen te gebruiken: ",
|
||||
"Connection_accepted": "Verbinding geaccepteerd",
|
||||
"Stream_terminated": "Stream beëindigd",
|
||||
"Close_all": "Alle sluiten",
|
||||
"Notification": "Notificatie",
|
||||
"Unreadable_OTR_message": "Onleesbaar OTR bericht is weggelaten",
|
||||
"Load_older_messages": "Oudere berichten laden",
|
||||
"Message_history": "Berichten geschiedenis",
|
||||
"setting-mam-enable": "Wanneer ingeschakeld ontvang je opgeslagen berichten van de server."
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": "Twoja wiadomość nie została wysłana ponieważ ten pokój nie istnieje",
|
||||
"message_not_send_forbidden": "Twoja wiadomość nie została wysłana ponieważ nie masz głosu w tym pokoju",
|
||||
"message_not_send_not-acceptable": "Twoja wiadomość nie została wysłana ponieważ nie jesteś właścicielem tego pokoju",
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": "Ten pokój został zamknięty",
|
||||
"Room_logging_is_enabled": "Logowanie do pokoju jest włączone",
|
||||
"A_password_is_required": "Hasło jest wymagane",
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": "Sua mensagem não foi enviada por que essa sala nao existe mais",
|
||||
"message_not_send_forbidden": "Sua mensagem não foi enviada por que não tem 'voz' para essa sala",
|
||||
"message_not_send_not-acceptable": "Sua mensagem não foi enviada por que você nao é ocupante desta sala",
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": "Essa sala foi fechada",
|
||||
"Room_logging_is_enabled": "O Logging esta habilitado",
|
||||
"A_password_is_required": "Senha é obrigatória",
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": "Ваше сообщение не было отправлено, т.к. этой комнаты не существует",
|
||||
"message_not_send_forbidden": "Ваше сообщение не было отправлено, т.к. у Вас нет права голоса в этой комнате",
|
||||
"message_not_send_not-acceptable": "Ваше сообщение не было отправлено, т.к. Вы не являетесь участником этой комнаты",
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": "Эта комната была закрыта",
|
||||
"Room_logging_is_enabled": "Журналирование комнаты включено",
|
||||
"A_password_is_required": "Необходим пароль",
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+10
-5
@@ -23,7 +23,7 @@
|
||||
"authentication_failed": "Kimlik doğrulama başarısız.",
|
||||
"Creating_your_private_key_": "Özel anahtarınız oluşturuluyor; bu işlem biraz sürebilir.",
|
||||
"Authenticating_a_buddy_helps_": "Kimlik doğrulaması, konuşmakta olduğunuz kişinin gerçekten o kişi olduğundan emin olmanıza yardımcı olur.",
|
||||
"How_do_you_want_to_authenticate_your_buddy": "Kimlik doğrulasını nasıl yapmak istersiniz __bid_name__ (<b>__bid_jid__</b>)?",
|
||||
"How_do_you_want_to_authenticate_your_buddy": "Kimlik doğrulamasını nasıl yapmak istersiniz __bid_name__ (<b>__bid_jid__</b>)?",
|
||||
"Select_method": "Yöntemi seçin...",
|
||||
"Manual": "Elle",
|
||||
"Question": "Soru",
|
||||
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": "Mesajınız gönderilmedi, çünkü bu oda mevcut değil",
|
||||
"message_not_send_forbidden": "Mesajınız gönderilmedi çünkü bu odada sesiniz yok",
|
||||
"message_not_send_not-acceptable": "Mesajınız gönderilmedi çünkü bu odaya bulunmuyorsunuz",
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": "Bu oda kapatıldı",
|
||||
"Room_logging_is_enabled": "Oda günlüğü etkinleştirildi",
|
||||
"A_password_is_required": "Şifre gerekli",
|
||||
@@ -261,13 +263,13 @@
|
||||
"No_local_audio_device": "Yerel ses cihazı bulunamadı.",
|
||||
"No_local_video_device": "Yerel video cihazı bulunamadı.",
|
||||
"Ok": "Tamam",
|
||||
"PermissionDeniedError": "Siz veya tarayıcınız sesli/görüntülü izni reddetti",
|
||||
"PermissionDeniedError": "Siz veya tarayıcınız medya iznini reddetti",
|
||||
"Use_local_audio_device": "Yerel video cihazını kullan.",
|
||||
"Use_local_video_device": "Yerel video cihazını kullanın.",
|
||||
"is_": "__status__",
|
||||
"You_received_a_message_from_an_unknown_sender_": "Bilinmeyen bir gönderenden bir ileti aldınız (__sender__) İletiyi görüntülemek istiyor musunuz?",
|
||||
"Your_roster_is_empty_add_": "Listeniz boş, yeni bir <a>kişi ekleyin</a>",
|
||||
"onsmp_explanation_question": "Karşınızdaki kişi, konuştuğu kişinin gerçekten siz olduğunuzu belirlemeye çalışıyor. Karşınızdaki kişiye kimliğinizi kanıtlamak için, yanıtı girin ve Yanıtla'yı tıklayın.",
|
||||
"onsmp_explanation_question": "Karşınızdaki kişi, konuştuğu kişinin gerçekten siz olup olmadığınızı belirlemeye çalışıyor. Kimliğinizi doğrulamak için yanıtı girin ve Yanıtla'yı tıklayın.",
|
||||
"onsmp_explanation_secret": "Karşınızdaki kişi, konuştuğu kişinin gerçekten siz olduğunuzu belirlemeye çalışıyor. Karşınızdaki kişiye kimliğinizi kanıtlamak için, parolayı girin.",
|
||||
"from_sender": "__sender__'den",
|
||||
"Verified_private_conversation_started": "Doğrulanmış Özel görüşme başladı.",
|
||||
@@ -300,7 +302,10 @@
|
||||
"Connection_accepted": "Bağlantı kabul edildi",
|
||||
"Stream_terminated": "Akış sonlandırıldı",
|
||||
"Close_all": "Hepsini kapat",
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Notification": "Bildirim",
|
||||
"Unreadable_OTR_message": "Okunamayan OTR iletisi atlandı",
|
||||
"Load_older_messages": "Eski iletileri yükle",
|
||||
"Message_history": "İleti geçmişi",
|
||||
"setting-mam-enable": "Etkinleştirdiğiniz takdirde kaydedilmiş iletileri sunucudan alabilirsiniz."
|
||||
}
|
||||
}
|
||||
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+10
-5
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"translation": {
|
||||
"Logging_in": "正在登入…",
|
||||
"Logging_in": "正在登入中…",
|
||||
"your_connection_is_unencrypted": "連線沒加密。",
|
||||
"your_connection_is_encrypted": "連線有加密。",
|
||||
"your_buddy_closed_the_private_connection": "聯絡人關閉了加密連線。",
|
||||
@@ -81,8 +81,8 @@
|
||||
"xa": "離開很久",
|
||||
"offline": "離線",
|
||||
"none": "沒有",
|
||||
"Unknown_instance_tag": null,
|
||||
"Not_one_of_our_latest_keys": null,
|
||||
"Unknown_instance_tag": "狀況標籤不明。",
|
||||
"Not_one_of_our_latest_keys": "不是最近使用密鑰其中的一個。",
|
||||
"Received_an_unreadable_encrypted_message": "收到了一則加密但無法辨認的訊息。",
|
||||
"Online": "上線",
|
||||
"Chatty": "想聊天",
|
||||
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": "訊息沒送出去,因為聊天室不存在了",
|
||||
"message_not_send_forbidden": "訊息沒送出去,因為你被消音了",
|
||||
"message_not_send_not-acceptable": "訊息沒送出去,因為你不是聊天室的參與人了",
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": "聊天室已經關閉了",
|
||||
"Room_logging_is_enabled": "聊天室紀錄打開了",
|
||||
"A_password_is_required": "需要密碼",
|
||||
@@ -300,7 +302,10 @@
|
||||
"Connection_accepted": "連線接受了",
|
||||
"Stream_terminated": "串流結束了",
|
||||
"Close_all": "全部關掉",
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Notification": "通知",
|
||||
"Unreadable_OTR_message": "忽略無法解讀的 OTR 訊息",
|
||||
"Load_older_messages": "下載舊訊息",
|
||||
"Message_history": "訊息紀錄",
|
||||
"setting-mam-enable": "打開後就可以從伺服器取得儲存訊息"
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -240,6 +240,8 @@
|
||||
"message_not_send_item-not-found": null,
|
||||
"message_not_send_forbidden": null,
|
||||
"message_not_send_not-acceptable": null,
|
||||
"message_not_send_resource-unavailable": null,
|
||||
"message_not_send_remote-server-not-found": null,
|
||||
"This_room_has_been_closed": null,
|
||||
"Room_logging_is_enabled": null,
|
||||
"A_password_is_required": null,
|
||||
@@ -301,6 +303,9 @@
|
||||
"Stream_terminated": null,
|
||||
"Close_all": null,
|
||||
"Notification": null,
|
||||
"Unreadable_OTR_message": null
|
||||
"Unreadable_OTR_message": null,
|
||||
"Load_older_messages": null,
|
||||
"Message_history": null,
|
||||
"setting-mam-enable": null
|
||||
}
|
||||
}
|
||||
+5
-4
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jsxc",
|
||||
"version": "3.1.1",
|
||||
"version": "3.2.0-beta.2",
|
||||
"description": "Real-time xmpp chat application with video calls, file transfer and encrypted communication",
|
||||
"homepage": "http://www.jsxc.org/",
|
||||
"bugs": "https://github.com/jsxc/jsxc/issues",
|
||||
@@ -16,15 +16,16 @@
|
||||
"grunt": "^1.0.1",
|
||||
"grunt-autoprefixer": "^3.0.4",
|
||||
"grunt-banner": "~0.6.0",
|
||||
"grunt-contrib-clean": "~1.0.0",
|
||||
"grunt-contrib-clean": "~1.1.0",
|
||||
"grunt-contrib-compress": "^1.4.1",
|
||||
"grunt-contrib-concat": "^1.0.1",
|
||||
"grunt-contrib-copy": "~1.0.0",
|
||||
"grunt-contrib-csslint": "^2.0.0",
|
||||
"grunt-contrib-jshint": "~1.1.0",
|
||||
"grunt-contrib-uglify": "^2.0.0",
|
||||
"grunt-contrib-uglify": "^2.3.0",
|
||||
"grunt-contrib-watch": "^1.0.0",
|
||||
"grunt-data-uri": "^0.3.0",
|
||||
"grunt-github-releaser2": "^0.1.1",
|
||||
"grunt-html-convert": "0.0.2",
|
||||
"grunt-jsbeautifier": "^0.2.13",
|
||||
"grunt-jsdoc": "^2.1.0",
|
||||
@@ -34,6 +35,6 @@
|
||||
"grunt-scss-lint": "^0.5.0",
|
||||
"grunt-search": "^0.1.8",
|
||||
"grunt-text-replace": "~0.4.0",
|
||||
"node-sass": "4.3.0"
|
||||
"node-sass": "4.5.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
.mfp-close {
|
||||
font-size: 23px;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -111,6 +111,16 @@
|
||||
background-color: #f2f2f2;
|
||||
padding: 10px;
|
||||
margin: 0 -30px 10px;
|
||||
|
||||
&.jsxc_experimental:after {
|
||||
content: "experimental";
|
||||
font-size: 0.7em;
|
||||
border-radius: 2px;
|
||||
padding: 1px 5px;
|
||||
background-color: orange;
|
||||
margin-left: 5px;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,6 +115,12 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.jsxc_avatar {
|
||||
:before {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+85
-35
@@ -70,7 +70,6 @@
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
|
||||
@media (max-width: 768px) {
|
||||
display: none;
|
||||
@@ -80,7 +79,7 @@
|
||||
div {
|
||||
box-sizing: border-box;
|
||||
width: 14px;
|
||||
height: 100%;
|
||||
height: 30px;
|
||||
background-color: $windowListSB_bg;
|
||||
color: $windowListSB_color;
|
||||
text-align: center;
|
||||
@@ -233,6 +232,7 @@
|
||||
|
||||
.jsxc_fade {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
.jsxc_overlay {
|
||||
display: none;
|
||||
@@ -303,6 +303,42 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.jsxc_mam-load-more {
|
||||
display: none;
|
||||
text-align: center;
|
||||
font-size: 0.8em;
|
||||
font-style: italic;
|
||||
position: absolute;
|
||||
top: -42px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 42px;
|
||||
cursor: pointer;
|
||||
z-index: 80;
|
||||
line-height: 42px;
|
||||
opacity: 0;
|
||||
transition: opacity 0.5s, top 0.5s;
|
||||
|
||||
&.jsxc_show {
|
||||
top: 0;
|
||||
opacity: 0.7;
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.jsxc_mam-enable {
|
||||
.jsxc_textarea {
|
||||
padding-top: 42px;
|
||||
}
|
||||
|
||||
.jsxc_mam-load-more {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.jsxc_avatar {
|
||||
@@ -416,16 +452,16 @@
|
||||
clear: both;
|
||||
|
||||
&.jsxc_error {
|
||||
opacity: 0.7;
|
||||
|
||||
&:before {
|
||||
content: " ";
|
||||
content: attr(data-error-msg);
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
right: 3px;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background-color: yellow;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
background-color: rgba(255, 255, 255, 0.7);
|
||||
text-align: center;
|
||||
padding: 10px 5px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -627,31 +663,6 @@
|
||||
height: 1.2em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
&.jsxc_composing {
|
||||
text-align: center;
|
||||
font-size: 0.9em;
|
||||
font-style: italic;
|
||||
display: block;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
transition: opacity 0.6s;
|
||||
|
||||
&:before {
|
||||
content: " ";
|
||||
width: 1.5em;
|
||||
height: 1em;
|
||||
display: inline-block;
|
||||
background-size: 80%;
|
||||
background-repeat: no-repeat;
|
||||
margin: 0 3px 0 0;
|
||||
background-image: image-url("composing.png");
|
||||
}
|
||||
|
||||
&.jsxc_fadein {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
div.jsxc_settings {
|
||||
@@ -704,3 +715,42 @@ div.jsxc_transfer {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.jsxc_status-msg {
|
||||
font-size: 12px;
|
||||
display: none;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
height: 50%;
|
||||
line-height: 17.5px;
|
||||
opacity: 0.7;
|
||||
|
||||
&.jsxc_composing {
|
||||
&:before {
|
||||
content: " ";
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
display: inline-block;
|
||||
background-size: cover;
|
||||
vertical-align: middle;
|
||||
background-repeat: no-repeat;
|
||||
background-image: image-url("composing.png");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.jsxc_status-msg-show {
|
||||
.jsxc_name {
|
||||
height: 50%;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.jsxc_status-msg {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.jsxc_lastmsg {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,8 +122,9 @@ jsxc.fileTransfer.showFileSelection = function(jid) {
|
||||
*/
|
||||
jsxc.fileTransfer.fileSelected = function(jid, msg, file) {
|
||||
var bid = jsxc.jidToBid(jid);
|
||||
var maxSize = jsxc.options.get('httpUpload').maxSize;
|
||||
|
||||
if (file.transportMethod !== 'webrtc' && jsxc.xmpp.httpUpload.ready && file.size > jsxc.options.get('httpUpload').maxSize) {
|
||||
if (file.transportMethod !== 'webrtc' && jsxc.xmpp.httpUpload.ready && maxSize >= 0 && file.size > maxSize) {
|
||||
jsxc.debug('File too large for http upload.');
|
||||
|
||||
file.transportMethod = 'webrtc';
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
jsxc.gui.avatar = {
|
||||
queue: [],
|
||||
|
||||
PLACEHOLDER: 0,
|
||||
|
||||
DELAY: 300,
|
||||
|
||||
CHUNKSIZE: 20,
|
||||
|
||||
timeout: null,
|
||||
|
||||
lastRun: 0
|
||||
};
|
||||
|
||||
/**
|
||||
* Update avatar on all given elements.
|
||||
*
|
||||
* @memberOf jsxc.gui
|
||||
* @param {jQuery} el Elements with subelement .jsxc_avatar
|
||||
* @param {string} jid Jid
|
||||
* @param {string} aid Avatar id (sha1 hash of image)
|
||||
*/
|
||||
jsxc.gui.avatar.update = function(el, jid, aid) {
|
||||
var self = jsxc.gui.avatar;
|
||||
|
||||
if (typeof aid === 'undefined') {
|
||||
self.set(jid, el, self.PLACEHOLDER);
|
||||
return;
|
||||
}
|
||||
|
||||
var avatarSrc = jsxc.storage.getUserItem('avatar', aid);
|
||||
|
||||
if (!jsxc.master && !avatarSrc) {
|
||||
// force avatar placeholder for slave tab, until master tab requested vCard
|
||||
avatarSrc = self.PLACEHOLDER;
|
||||
}
|
||||
|
||||
if (avatarSrc !== null) {
|
||||
self.set(jid, el, avatarSrc);
|
||||
} else {
|
||||
var handler_cb = function(stanza) {
|
||||
var src = jsxc.gui.avatar.getPhotoFromVcard(stanza);
|
||||
|
||||
jsxc.storage.setUserItem('avatar', aid, src);
|
||||
self.set(jid, el, src);
|
||||
};
|
||||
|
||||
var error_cb = function(msg) {
|
||||
jsxc.warn('Could not load vcard.', msg);
|
||||
|
||||
jsxc.storage.setUserItem('avatar', aid, self.PLACEHOLDER);
|
||||
self.set(jid, el, self.PLACEHOLDER);
|
||||
};
|
||||
|
||||
var args = [];
|
||||
|
||||
// workaround for https://github.com/strophe/strophejs/issues/172
|
||||
if (Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid)) {
|
||||
args = [handler_cb, error_cb];
|
||||
} else {
|
||||
args = [handler_cb, Strophe.getBareJidFromJid(jid), error_cb];
|
||||
}
|
||||
|
||||
jsxc.gui.avatar.queueAction(jid, jsxc.xmpp.conn.vcard.get, args, jsxc.xmpp.conn.vcard);
|
||||
}
|
||||
};
|
||||
|
||||
jsxc.gui.avatar.getPhotoFromVcard = function(stanza) {
|
||||
jsxc.debug('vCard', stanza);
|
||||
|
||||
var vCard = $(stanza).find("vCard > PHOTO");
|
||||
var src;
|
||||
|
||||
if (vCard.length === 0) {
|
||||
jsxc.debug('No photo provided');
|
||||
src = '0';
|
||||
} else if (vCard.find('EXTVAL').length > 0) {
|
||||
src = vCard.find('EXTVAL').text();
|
||||
} else {
|
||||
var img = vCard.find('BINVAL').text();
|
||||
var type = vCard.find('TYPE').text();
|
||||
src = 'data:' + type + ';base64,' + img;
|
||||
}
|
||||
|
||||
// concat chunks
|
||||
src = src.replace(/[\t\r\n\f]/gi, '');
|
||||
|
||||
return src;
|
||||
};
|
||||
|
||||
jsxc.gui.avatar.set = function(jid, el, src) {
|
||||
var self = jsxc.gui.avatar;
|
||||
|
||||
if (src === self.PLACEHOLDER || src === '0') {
|
||||
if (typeof jsxc.options.defaultAvatar === 'function') {
|
||||
jsxc.gui.avatar.queueAction(jid, function() {
|
||||
jsxc.options.defaultAvatar.call(el, jid);
|
||||
});
|
||||
return;
|
||||
}
|
||||
jsxc.gui.avatarPlaceholder(el.find('.jsxc_avatar'), jid);
|
||||
return;
|
||||
}
|
||||
|
||||
el.find('.jsxc_avatar').removeAttr('style');
|
||||
|
||||
el.find('.jsxc_avatar').css({
|
||||
'background-image': 'url(' + src + ')',
|
||||
'text-indent': '999px'
|
||||
});
|
||||
};
|
||||
|
||||
jsxc.gui.avatar.queueAction = function(jid, fn, args, context) {
|
||||
var self = jsxc.gui.avatar;
|
||||
var bid = jsxc.jidToBid(jid);
|
||||
var data = jsxc.storage.getUserItem('buddy', bid) || {};
|
||||
var state = data.status;
|
||||
|
||||
var index = self.queue.indexOf(bid);
|
||||
if (index > -1) {
|
||||
self.queue.splice(index, 1);
|
||||
}
|
||||
|
||||
var action = {
|
||||
fn: fn,
|
||||
args: args || [],
|
||||
context: context || this
|
||||
};
|
||||
|
||||
if (state === 0) {
|
||||
self.queue.push(action);
|
||||
} else {
|
||||
self.queue.unshift(action);
|
||||
}
|
||||
|
||||
jsxc.gui.avatar.processQueue();
|
||||
};
|
||||
|
||||
jsxc.gui.avatar.processQueue = function() {
|
||||
var self = jsxc.gui.avatar;
|
||||
var currentTime = (new Date()).getTime();
|
||||
|
||||
if (currentTime - self.lastRun < self.DELAY) {
|
||||
if (!self.timeout) {
|
||||
self.timeout = setTimeout(self.processQueue, self.DELAY);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
self.lastRun = currentTime;
|
||||
|
||||
var i, action;
|
||||
for (i = 0; i < self.CHUNKSIZE; i++) {
|
||||
if (self.queue.length > 0) {
|
||||
action = self.queue.shift();
|
||||
action.fn.apply(action.context, action.args);
|
||||
}
|
||||
}
|
||||
|
||||
if (self.queue.length > 0) {
|
||||
self.timeout = setTimeout(self.processQueue, self.DELAY);
|
||||
} else {
|
||||
self.timeout = null;
|
||||
}
|
||||
};
|
||||
+43
-95
@@ -57,7 +57,21 @@ jsxc.gui = {
|
||||
queryActions: {
|
||||
/** xmpp:JID?message[;body=TEXT] */
|
||||
message: function(jid, params) {
|
||||
var win = jsxc.gui.window.open(jsxc.jidToBid(jid));
|
||||
var bid = jsxc.jidToBid(jid);
|
||||
|
||||
if (!jsxc.storage.getUserItem('buddy', bid)) {
|
||||
// init contact
|
||||
jsxc.storage.saveBuddy(bid, {
|
||||
jid: jid,
|
||||
name: bid,
|
||||
status: 0,
|
||||
sub: 'none',
|
||||
res: [],
|
||||
rnd: Math.random()
|
||||
});
|
||||
}
|
||||
|
||||
var win = jsxc.gui.window.open(bid);
|
||||
|
||||
if (params && typeof params.body === 'string') {
|
||||
win.find('.jsxc_textinput').val(params.body);
|
||||
@@ -238,94 +252,11 @@ jsxc.gui = {
|
||||
|
||||
ri.find('.jsxc_name').attr('title', info);
|
||||
|
||||
jsxc.gui.updateAvatar(ri.add(we.find('.jsxc_bar')), data.jid, data.avatar);
|
||||
jsxc.gui.avatar.update(ri.add(we.find('.jsxc_bar')), data.jid, data.avatar);
|
||||
|
||||
$(document).trigger('update.gui.jsxc', [bid]);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update avatar on all given elements.
|
||||
*
|
||||
* @memberOf jsxc.gui
|
||||
* @param {jQuery} el Elements with subelement .jsxc_avatar
|
||||
* @param {string} jid Jid
|
||||
* @param {string} aid Avatar id (sha1 hash of image)
|
||||
*/
|
||||
updateAvatar: function(el, jid, aid) {
|
||||
|
||||
var setAvatar = function(src) {
|
||||
if (src === 0 || src === '0') {
|
||||
if (typeof jsxc.options.defaultAvatar === 'function') {
|
||||
jsxc.options.defaultAvatar.call(el, jid);
|
||||
return;
|
||||
}
|
||||
jsxc.gui.avatarPlaceholder(el.find('.jsxc_avatar'), jid);
|
||||
return;
|
||||
}
|
||||
|
||||
el.find('.jsxc_avatar').removeAttr('style');
|
||||
|
||||
el.find('.jsxc_avatar').css({
|
||||
'background-image': 'url(' + src + ')',
|
||||
'text-indent': '999px'
|
||||
});
|
||||
};
|
||||
|
||||
if (typeof aid === 'undefined') {
|
||||
setAvatar(0);
|
||||
return;
|
||||
}
|
||||
|
||||
var avatarSrc = jsxc.storage.getUserItem('avatar', aid);
|
||||
|
||||
if (!jsxc.master && !avatarSrc) {
|
||||
// force avatar placeholder for slave tab, until master tab requested vCard
|
||||
avatarSrc = 0;
|
||||
}
|
||||
|
||||
if (avatarSrc !== null) {
|
||||
setAvatar(avatarSrc);
|
||||
} else {
|
||||
var handler_cb = function(stanza) {
|
||||
jsxc.debug('vCard', stanza);
|
||||
|
||||
var vCard = $(stanza).find("vCard > PHOTO");
|
||||
var src;
|
||||
|
||||
if (vCard.length === 0) {
|
||||
jsxc.debug('No photo provided');
|
||||
src = '0';
|
||||
} else if (vCard.find('EXTVAL').length > 0) {
|
||||
src = vCard.find('EXTVAL').text();
|
||||
} else {
|
||||
var img = vCard.find('BINVAL').text();
|
||||
var type = vCard.find('TYPE').text();
|
||||
src = 'data:' + type + ';base64,' + img;
|
||||
}
|
||||
|
||||
// concat chunks
|
||||
src = src.replace(/[\t\r\n\f]/gi, '');
|
||||
|
||||
jsxc.storage.setUserItem('avatar', aid, src);
|
||||
setAvatar(src);
|
||||
};
|
||||
|
||||
var error_cb = function(msg) {
|
||||
jsxc.warn('Could not load vcard.', msg);
|
||||
|
||||
jsxc.storage.setUserItem('avatar', aid, 0);
|
||||
setAvatar(0);
|
||||
};
|
||||
|
||||
// workaround for https://github.com/strophe/strophejs/issues/172
|
||||
if (Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid)) {
|
||||
jsxc.xmpp.conn.vcard.get(handler_cb, error_cb);
|
||||
} else {
|
||||
jsxc.xmpp.conn.vcard.get(handler_cb, Strophe.getBareJidFromJid(jid), error_cb);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates scrollbar handlers.
|
||||
*
|
||||
@@ -877,7 +808,7 @@ jsxc.gui = {
|
||||
|
||||
var data = jsxc.storage.getUserItem('buddy', bid);
|
||||
|
||||
if (data) {
|
||||
if (data && data.res) {
|
||||
// Display resources and corresponding information
|
||||
var i, j, res, identities, identity = null,
|
||||
cap, client;
|
||||
@@ -1262,12 +1193,12 @@ jsxc.gui = {
|
||||
$('[data-bid="' + bid + '"]').each(function() {
|
||||
var el = $(this);
|
||||
|
||||
el.attr('data-status', pres);
|
||||
|
||||
if (el.find('.jsxc_avatar').length > 0) {
|
||||
el = el.find('.jsxc_avatar');
|
||||
if (!el.hasClass('jsxc_statusIndicator')) {
|
||||
el = el.find('.jsxc_statusIndicator');
|
||||
}
|
||||
|
||||
el.attr('data-status', pres);
|
||||
|
||||
el.removeClass('jsxc_' + jsxc.CONST.STATUS.join(' jsxc_')).addClass('jsxc_' + pres);
|
||||
});
|
||||
},
|
||||
@@ -1369,6 +1300,9 @@ jsxc.gui = {
|
||||
var jid = href.split('?')[0];
|
||||
var action, params = {};
|
||||
|
||||
element.attr('data-bid', jsxc.jidToBid(jid));
|
||||
jsxc.gui.update(jsxc.jidToBid(jid));
|
||||
|
||||
if (href.indexOf('?') < 0) {
|
||||
action = 'message';
|
||||
} else {
|
||||
@@ -1628,7 +1562,8 @@ jsxc.gui.roster = {
|
||||
jsxc.notice.load();
|
||||
|
||||
jsxc.gui.roster.ready = true;
|
||||
$(document).trigger('ready.roster.jsxc');
|
||||
$(document).trigger('ready.roster.jsxc', [rosterState]);
|
||||
$(document).trigger('ready-roster-jsxc', [rosterState]);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -2756,6 +2691,7 @@ jsxc.gui.window = {
|
||||
}
|
||||
|
||||
msgDiv.attr('title', message.error);
|
||||
msgDiv.attr('data-error-msg', message.error);
|
||||
|
||||
if (message.attachment && message.attachment.name) {
|
||||
var attachment = $('<div>');
|
||||
@@ -2800,8 +2736,12 @@ jsxc.gui.window = {
|
||||
$('[data-bid="' + bid + '"]').find('.jsxc_lastmsg .jsxc_text').html(msg);
|
||||
}
|
||||
|
||||
if (jsxc.Message.getDOM(uid).length > 0) {
|
||||
jsxc.Message.getDOM(uid).replaceWith(msgDiv);
|
||||
var currentMessageElement = jsxc.Message.getDOM(uid);
|
||||
if (currentMessageElement.length > 0) {
|
||||
if (currentMessageElement.attr('data-queryId')) {
|
||||
msgDiv.attr('data-queryId', currentMessageElement.attr('data-queryId'));
|
||||
}
|
||||
currentMessageElement.replaceWith(msgDiv);
|
||||
} else {
|
||||
win.find('.jsxc_textarea').append(msgDiv);
|
||||
}
|
||||
@@ -2815,7 +2755,7 @@ jsxc.gui.window = {
|
||||
msgDiv.attr('data-bid', jsxc.jidToBid(message.sender.jid));
|
||||
|
||||
var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(message.sender.jid)) || {};
|
||||
jsxc.gui.updateAvatar(msgDiv, jsxc.jidToBid(message.sender.jid), data.avatar);
|
||||
jsxc.gui.avatar.update(msgDiv, jsxc.jidToBid(message.sender.jid), data.avatar);
|
||||
|
||||
title = jsxc.jidToBid(message.sender.jid);
|
||||
}
|
||||
@@ -2846,7 +2786,9 @@ jsxc.gui.window = {
|
||||
jsxc.gui.detectUriScheme(win);
|
||||
jsxc.gui.detectEmail(win);
|
||||
|
||||
jsxc.gui.window.scrollDown(bid);
|
||||
if (!message.forwarded) {
|
||||
jsxc.gui.window.scrollDown(bid);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -2914,10 +2856,16 @@ jsxc.gui.window = {
|
||||
|
||||
jsxc.storage.setUserItem('history', bid, []);
|
||||
|
||||
var buddyData = jsxc.storage.getUserItem('buddy', bid) || {};
|
||||
delete buddyData.lastArchiveUid;
|
||||
delete buddyData.archiveExhausted;
|
||||
jsxc.storage.setUserItem('buddy', bid, buddyData);
|
||||
|
||||
var win = jsxc.gui.window.get(bid);
|
||||
|
||||
if (win.length > 0) {
|
||||
win.find('.jsxc_textarea').empty();
|
||||
win.find('.jsxc_textarea').scroll();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
+10
-8
@@ -28,9 +28,6 @@ jsxc = {
|
||||
/** Interval for keep-alive */
|
||||
keepaliveInterval: null,
|
||||
|
||||
/** True if jid, sid and rid was used to connect */
|
||||
reconnect: false,
|
||||
|
||||
/** True if restore is complete */
|
||||
restoreCompleted: false,
|
||||
|
||||
@@ -81,7 +78,8 @@ jsxc = {
|
||||
},
|
||||
NS: {
|
||||
CARBONS: 'urn:xmpp:carbons:2',
|
||||
FORWARD: 'urn:xmpp:forward:0'
|
||||
FORWARD: 'urn:xmpp:forward:0',
|
||||
HINTS: 'urn:xmpp:hints'
|
||||
},
|
||||
HIDDEN: 'hidden',
|
||||
SHOWN: 'shown',
|
||||
@@ -222,8 +220,8 @@ jsxc = {
|
||||
}
|
||||
|
||||
// Check localStorage
|
||||
if (typeof(localStorage) === 'undefined') {
|
||||
jsxc.warn("Browser doesn't support localStorage.");
|
||||
if (!jsxc.storage.hasSupport()) {
|
||||
jsxc.error("Browser doesn't support localStorage. JSXC will be disabled.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -531,6 +529,10 @@ jsxc = {
|
||||
username = settings.xmpp.username;
|
||||
}
|
||||
|
||||
if (typeof settings.xmpp.password === 'string') {
|
||||
password = settings.xmpp.password;
|
||||
}
|
||||
|
||||
var resource = (settings.xmpp.resource) ? '/' + settings.xmpp.resource : '';
|
||||
var domain = settings.xmpp.domain;
|
||||
var jid;
|
||||
@@ -584,7 +586,7 @@ jsxc = {
|
||||
$('#jsxc_roster').removeClass('jsxc_noConnection');
|
||||
|
||||
jsxc.registerLogout();
|
||||
jsxc.gui.updateAvatar($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
|
||||
jsxc.gui.avatar.update($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
|
||||
|
||||
jsxc.gui.restore();
|
||||
},
|
||||
@@ -652,7 +654,7 @@ jsxc = {
|
||||
jsxc.otr.createDSA();
|
||||
}
|
||||
|
||||
jsxc.gui.updateAvatar($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
|
||||
jsxc.gui.avatar.update($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
+8
-57
@@ -97,7 +97,6 @@ jsxc.muc = {
|
||||
$(document).on('error.presence.jsxc', jsxc.muc.onPresenceError);
|
||||
|
||||
self.conn.addHandler(self.onGroupchatMessage, null, 'message', 'groupchat');
|
||||
self.conn.addHandler(self.onErrorMessage, null, 'message', 'error');
|
||||
self.conn.muc.roomNames = jsxc.storage.getUserItem('roomNames') || [];
|
||||
},
|
||||
|
||||
@@ -826,7 +825,6 @@ jsxc.muc = {
|
||||
var nickname = Strophe.unescapeNode(res);
|
||||
var own = jsxc.storage.getUserItem('ownNicknames') || {};
|
||||
var member = jsxc.storage.getUserItem('member', room) || {};
|
||||
var openWindow = false;
|
||||
var codes = [];
|
||||
|
||||
xdata.find('status').each(function() {
|
||||
@@ -840,6 +838,9 @@ jsxc.muc = {
|
||||
if (roomdata.state === self.CONST.ROOMSTATE.INIT) {
|
||||
// successfully joined
|
||||
|
||||
roomdata.status = jsxc.CONST.STATUS.indexOf('online');
|
||||
jsxc.storage.setUserItem('buddy', room, roomdata);
|
||||
|
||||
jsxc.storage.setUserItem('roomNames', jsxc.xmpp.conn.muc.roomNames);
|
||||
|
||||
if (jsxc.gui.roster.getItem(room).length === 0) {
|
||||
@@ -852,8 +853,9 @@ jsxc.muc = {
|
||||
|
||||
if ($('#jsxc_dialog').length > 0) {
|
||||
// User joined the room manually
|
||||
openWindow = true;
|
||||
jsxc.gui.dialog.close();
|
||||
|
||||
jsxc.gui.window.open(room);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -944,11 +946,6 @@ jsxc.muc = {
|
||||
$(document).trigger('status.muc.jsxc', [code, room, nickname, member[nickname] || {}, presence]);
|
||||
});
|
||||
|
||||
if (openWindow) {
|
||||
// we wait until all parameters are set up correctly (e.g. state)
|
||||
jsxc.gui.window.open(room);
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
@@ -1244,15 +1241,14 @@ jsxc.muc = {
|
||||
|
||||
if (typeof jid === 'string') {
|
||||
m.find('.jsxc_name').text(jsxc.jidToBid(jid));
|
||||
m.attr('data-bid', jsxc.jidToBid(jid));
|
||||
title = title + '\n' + jsxc.jidToBid(jid);
|
||||
|
||||
var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(jid));
|
||||
|
||||
if (data !== null && typeof data === 'object') {
|
||||
jsxc.gui.updateAvatar(m, jsxc.jidToBid(jid), data.avatar);
|
||||
jsxc.gui.avatar.update(m, jsxc.jidToBid(jid), data.avatar);
|
||||
} else if (jsxc.jidToBid(jid) === ownBid) {
|
||||
jsxc.gui.updateAvatar(m, jsxc.jidToBid(jid), 'own');
|
||||
jsxc.gui.avatar.update(m, jsxc.jidToBid(jid), 'own');
|
||||
}
|
||||
} else {
|
||||
m.find('.jsxc_name').text(nickname);
|
||||
@@ -1392,51 +1388,6 @@ jsxc.muc = {
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle group chat error message.
|
||||
*
|
||||
* @private
|
||||
* @memberOf jsxc.muc
|
||||
* @param {string} message Message stanza
|
||||
*/
|
||||
onErrorMessage: function(message) {
|
||||
var room = jsxc.jidToBid($(message).attr('from'));
|
||||
|
||||
if (jsxc.gui.window.get(room).length === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($(message).find('item-not-found').length > 0) {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: room,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send_item-not-found')
|
||||
});
|
||||
} else if ($(message).find('forbidden').length > 0) {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: room,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send_forbidden')
|
||||
});
|
||||
} else if ($(message).find('not-acceptable').length > 0) {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: room,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send_not-acceptable')
|
||||
});
|
||||
} else {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: room,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send')
|
||||
});
|
||||
}
|
||||
|
||||
jsxc.debug('[muc] error message for ' + room, $(message).find('error')[0]);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Prepare group chat roster item.
|
||||
*
|
||||
@@ -1576,7 +1527,7 @@ jsxc.muc = {
|
||||
}
|
||||
o = $(opt.toHTML());
|
||||
|
||||
for (j = 0; j < self.values; j++) {
|
||||
for (j = 0; j < self.values.length; j++) {
|
||||
k = self.values[j];
|
||||
if (k.toString() === opt.value.toString()) {
|
||||
o.attr('selected', 'selected');
|
||||
|
||||
@@ -174,9 +174,7 @@ jsxc.options = {
|
||||
* @param jid Jid of that user.
|
||||
* @this {jQuery} Elements to update with probable .jsxc_avatar elements
|
||||
*/
|
||||
defaultAvatar: function(jid) {
|
||||
jsxc.gui.avatarPlaceholder($(this).find('.jsxc_avatar'), jid);
|
||||
},
|
||||
defaultAvatar: null,
|
||||
|
||||
/**
|
||||
* This callback processes all settings.
|
||||
@@ -303,5 +301,13 @@ jsxc.options = {
|
||||
screenMediaExtension: {
|
||||
firefox: '',
|
||||
chrome: ''
|
||||
},
|
||||
|
||||
/**
|
||||
* Options for Message Archive Management (XEP-0313)
|
||||
*/
|
||||
mam: {
|
||||
enable: false,
|
||||
max: null
|
||||
}
|
||||
};
|
||||
|
||||
@@ -35,6 +35,7 @@ jsxc.otr = {
|
||||
});
|
||||
} else {
|
||||
jsxc.gui.window.postMessage({
|
||||
_uid: d._uid,
|
||||
bid: bid,
|
||||
direction: jsxc.Message.IN,
|
||||
msg: d.msg,
|
||||
@@ -209,6 +210,7 @@ jsxc.otr = {
|
||||
// Receive message
|
||||
jsxc.otr.objects[bid].on('ui', function(msg, encrypted, meta) {
|
||||
jsxc.otr.receiveMessage({
|
||||
_uid: meta._uid,
|
||||
bid: bid,
|
||||
msg: msg,
|
||||
encrypted: encrypted === true,
|
||||
|
||||
@@ -13,6 +13,22 @@ jsxc.storage = {
|
||||
|
||||
SEP: ':',
|
||||
|
||||
hasSupport: function() {
|
||||
if (typeof localStorage === 'undefined' || localStorage === null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
localStorage.setItem('jsxc:storage:test', 'jsxc');
|
||||
localStorage.removeItem('jsxc:storage:test');
|
||||
} catch (err) {
|
||||
jsxc.warn('Can not save any data. Probably your quota exceeded or you use Safari in private Mode:', (err) ? err.message : undefined);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {type} uk Should we generate a user prefix?
|
||||
* @returns {String} prefix
|
||||
@@ -62,7 +78,11 @@ jsxc.storage = {
|
||||
});
|
||||
}
|
||||
|
||||
localStorage.setItem(jsxc.storage.getPrefix(uk) + key, value);
|
||||
try {
|
||||
localStorage.setItem(jsxc.storage.getPrefix(uk) + key, value);
|
||||
} catch (err) {
|
||||
jsxc.error('An error occured while saving data.', (err) ? err.message : undefined);
|
||||
}
|
||||
},
|
||||
|
||||
setUserItem: function(type, key, value) {
|
||||
@@ -394,6 +414,11 @@ jsxc.storage = {
|
||||
var history = JSON.parse(e.newValue);
|
||||
var uid, el, message;
|
||||
|
||||
if (!jsxc.master) {
|
||||
var win = jsxc.gui.window.get(bid);
|
||||
win.find('.jsxc_textarea').empty();
|
||||
}
|
||||
|
||||
while (history.length > 0) {
|
||||
uid = history.pop();
|
||||
|
||||
@@ -402,7 +427,7 @@ jsxc.storage = {
|
||||
|
||||
if (el.length === 0) {
|
||||
if (jsxc.master && message.direction === jsxc.Message.OUT) {
|
||||
jsxc.xmpp.sendMessage(message.bid, message.msg, message._uid);
|
||||
jsxc.xmpp.sendMessage(message);
|
||||
}
|
||||
|
||||
jsxc.gui.window._postMessage(message, true);
|
||||
|
||||
+17
-14
@@ -248,8 +248,10 @@ jsxc.webrtc = {
|
||||
win.find('.jsxc_tools .jsxc_settings').after(div);
|
||||
|
||||
var screenMediaExtension = jsxc.options.get('screenMediaExtension') || {};
|
||||
var browser = self.conn.jingle.RTC.webrtcDetectedBrowser;
|
||||
if (screenMediaExtension[browser] || jsxc.storage.getItem('debug')) {
|
||||
var browserDetails = self.conn.jingle.RTC.browserDetails || {};
|
||||
var browser = browserDetails.browser;
|
||||
var version = browserDetails.version;
|
||||
if (screenMediaExtension[browser] || jsxc.storage.getItem('debug') || (browser === 'firefox' && version >= 52)) {
|
||||
// Add screen sharing button if extension is available or we are in debug mode
|
||||
var a = $('<a>');
|
||||
a.text($.t('Share_screen'));
|
||||
@@ -794,9 +796,8 @@ jsxc.webrtc = {
|
||||
* @param stream {mediastream}
|
||||
*/
|
||||
attachMediaStream: function(element, stream) {
|
||||
var self = jsxc.webrtc;
|
||||
|
||||
self.conn.jingle.RTC.attachMediaStream((element instanceof jQuery) ? element.get(0) : element, stream);
|
||||
var el = (element instanceof jQuery) ? element.get(0) : element;
|
||||
el.srcObject = stream;
|
||||
|
||||
$(element).show();
|
||||
},
|
||||
@@ -1111,21 +1112,23 @@ jsxc.webrtc = {
|
||||
}
|
||||
|
||||
try {
|
||||
self.conn.jingle.RTC.getUserMedia(constraints,
|
||||
function(stream) {
|
||||
jsxc.debug('onUserMediaSuccess');
|
||||
$(document).trigger('mediaready.jingle', [stream]);
|
||||
},
|
||||
function(error) {
|
||||
jsxc.warn('Failed to get access to local media. Error ', error);
|
||||
$(document).trigger('mediafailure.jingle', [error]);
|
||||
});
|
||||
self.conn.jingle.getUserMedia(constraints, self.userMediaCallback);
|
||||
} catch (e) {
|
||||
jsxc.error('GUM failed: ', e);
|
||||
$(document).trigger('mediafailure.jingle');
|
||||
}
|
||||
},
|
||||
|
||||
userMediaCallback: function(err, stream) {
|
||||
if (err) {
|
||||
jsxc.warn('Failed to get access to local media. Error ', err);
|
||||
$(document).trigger('mediafailure.jingle', [err]);
|
||||
} else if (stream) {
|
||||
jsxc.debug('onUserMediaSuccess');
|
||||
$(document).trigger('mediaready.jingle', [stream]);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Get screen media from local browser.
|
||||
*
|
||||
|
||||
@@ -67,8 +67,6 @@ jsxc.xmpp.chatState.onComposing = function(ev, jid) {
|
||||
return;
|
||||
}
|
||||
|
||||
clearTimeout(win.data('composing-timeout'));
|
||||
|
||||
// add user in array if necessary
|
||||
var usersComposing = win.data('composing') || [];
|
||||
if (usersComposing.indexOf(user) === -1) {
|
||||
@@ -76,25 +74,8 @@ jsxc.xmpp.chatState.onComposing = function(ev, jid) {
|
||||
win.data('composing', usersComposing);
|
||||
}
|
||||
|
||||
var textarea = win.find('.jsxc_textarea');
|
||||
var composingNotif = textarea.find('.jsxc_composing');
|
||||
|
||||
if (composingNotif.length < 1) {
|
||||
// notification not present, add it
|
||||
composingNotif = $('<div>').addClass('jsxc_composing')
|
||||
.addClass('jsxc_chatmessage')
|
||||
.addClass('jsxc_sys')
|
||||
.appendTo(textarea);
|
||||
}
|
||||
|
||||
var msg = self._genComposingMsg(usersComposing);
|
||||
composingNotif.text(msg);
|
||||
|
||||
// scroll to bottom
|
||||
jsxc.gui.window.scrollDown(bid);
|
||||
|
||||
// show message
|
||||
composingNotif.addClass('jsxc_fadein');
|
||||
var msg = self._genComposingMsg(data.type, usersComposing);
|
||||
jsxc.xmpp.chatState.setStatus(win, msg);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -120,7 +101,6 @@ jsxc.xmpp.chatState.onPaused = function(ev, jid) {
|
||||
return;
|
||||
}
|
||||
|
||||
var el = win.find('.jsxc_composing');
|
||||
var usersComposing = win.data('composing') || [];
|
||||
|
||||
if (usersComposing.indexOf(user) >= 0) {
|
||||
@@ -129,25 +109,12 @@ jsxc.xmpp.chatState.onPaused = function(ev, jid) {
|
||||
win.data('composing', usersComposing);
|
||||
}
|
||||
|
||||
if (usersComposing.length === 0) {
|
||||
var durationValue = el.css('transition-duration') || '0s';
|
||||
var duration = parseFloat(durationValue) || 0;
|
||||
|
||||
if (durationValue.match(/[^m]s$/)) {
|
||||
duration *= 1000;
|
||||
}
|
||||
|
||||
el.removeClass('jsxc_fadein');
|
||||
|
||||
var to = setTimeout(function() {
|
||||
el.remove();
|
||||
}, duration);
|
||||
|
||||
win.data('composing-timeout', to);
|
||||
} else {
|
||||
// update message
|
||||
el.text(self._genComposingMsg(usersComposing));
|
||||
var composingMsg;
|
||||
if (usersComposing.length !== 0) {
|
||||
composingMsg = self._genComposingMsg(data.type, usersComposing);
|
||||
}
|
||||
|
||||
jsxc.xmpp.chatState.setStatus(win, composingMsg);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -226,16 +193,35 @@ jsxc.xmpp.chatState.endComposing = function(bid) {
|
||||
* Generate composing message.
|
||||
*
|
||||
* @memberOf jsxc.xmpp.chatState
|
||||
* @param {String} the type of the chat ('groupchat' or 'chat')
|
||||
* @param {Array} usersComposing List of users which are currently composing a message
|
||||
*/
|
||||
jsxc.xmpp.chatState._genComposingMsg = function(usersComposing) {
|
||||
jsxc.xmpp.chatState._genComposingMsg = function(chatType, usersComposing) {
|
||||
if (!usersComposing || usersComposing.length === 0) {
|
||||
jsxc.debug('usersComposing array is empty?');
|
||||
|
||||
return '';
|
||||
} else {
|
||||
return usersComposing.length > 1 ? usersComposing.join(', ') + $.t('_are_composing') :
|
||||
usersComposing[0] + $.t('_is_composing');
|
||||
if (chatType === 'groupchat') {
|
||||
return usersComposing.length > 1 ? usersComposing.join(', ') + $.t('_are_composing') :
|
||||
usersComposing[0] + $.t('_is_composing');
|
||||
}
|
||||
return $.t('_is_composing');
|
||||
}
|
||||
};
|
||||
|
||||
jsxc.xmpp.chatState.setStatus = function(win, msg) {
|
||||
var statusMsgElement = win.find('.jsxc_status-msg');
|
||||
|
||||
statusMsgElement.text(msg || '');
|
||||
statusMsgElement.attr('title', msg || '');
|
||||
|
||||
if (msg) {
|
||||
statusMsgElement.addClass('jsxc_composing');
|
||||
win.addClass('jsxc_status-msg-show');
|
||||
} else {
|
||||
statusMsgElement.removeClass('jsxc_composing');
|
||||
win.removeClass('jsxc_status-msg-show');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -63,11 +63,7 @@ jsxc.xmpp.httpUpload.init = function(o) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (caps.hasFeatureByJid(domain, self.CONST.NS.HTTPUPLOAD)) {
|
||||
self.discoverUploadService();
|
||||
} else {
|
||||
jsxc.debug(domain + ' does not support http upload');
|
||||
}
|
||||
self.discoverUploadService();
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -77,12 +73,15 @@ jsxc.xmpp.httpUpload.init = function(o) {
|
||||
*/
|
||||
jsxc.xmpp.httpUpload.discoverUploadService = function() {
|
||||
var self = jsxc.xmpp.httpUpload;
|
||||
var domain = self.conn.domain;
|
||||
|
||||
jsxc.debug('discover http upload service');
|
||||
|
||||
self.queryItemForUploadService(self.conn.domain);
|
||||
if (jsxc.xmpp.conn.caps.hasFeatureByJid(domain, self.CONST.NS.HTTPUPLOAD)) {
|
||||
self.queryItemForUploadService(domain);
|
||||
}
|
||||
|
||||
self.conn.disco.items(self.conn.domain, null, function(items) {
|
||||
self.conn.disco.items(domain, null, function(items) {
|
||||
$(items).find('item').each(function() {
|
||||
var jid = $(this).attr('jid');
|
||||
|
||||
@@ -118,7 +117,7 @@ jsxc.xmpp.httpUpload.queryItemForUploadService = function(jid, cb) {
|
||||
jsxc.options.set('httpUpload', {
|
||||
server: jid,
|
||||
name: $(info).find('identity').attr('name'),
|
||||
maxSize: parseInt(httpUploadMaxSize.text())
|
||||
maxSize: parseInt(httpUploadMaxSize.text()) || -1
|
||||
});
|
||||
|
||||
self.ready = true;
|
||||
|
||||
+156
-22
@@ -94,6 +94,7 @@ jsxc.xmpp = {
|
||||
$(document).on('authfail.jsxc', jsxc.xmpp.onAuthFail);
|
||||
|
||||
Strophe.addNamespace('RECEIPTS', 'urn:xmpp:receipts');
|
||||
Strophe.addNamespace('VERSION', 'jabber:iq:version');
|
||||
}
|
||||
|
||||
// Create new connection (no login)
|
||||
@@ -147,8 +148,6 @@ jsxc.xmpp = {
|
||||
jsxc.debug('Try to attach');
|
||||
jsxc.debug('SID: ' + sid);
|
||||
|
||||
jsxc.reconnect = true;
|
||||
|
||||
jsxc.xmpp.conn.attach(jid, sid, rid, callback);
|
||||
} else {
|
||||
jsxc.debug('New connection');
|
||||
@@ -156,6 +155,7 @@ jsxc.xmpp = {
|
||||
if (jsxc.xmpp.conn.caps) {
|
||||
// Add system handler, because user handler isn't called before
|
||||
// we are authenticated
|
||||
// @REVIEW this could maybe retrieved from jsxc.xmpp.conn.features
|
||||
jsxc.xmpp.conn._addSysHandler(function(stanza) {
|
||||
var from = jsxc.xmpp.conn.domain,
|
||||
c = stanza.querySelector('c'),
|
||||
@@ -196,7 +196,6 @@ jsxc.xmpp = {
|
||||
|
||||
// REVIEW: this should maybe moved to xmpp.disconnected
|
||||
// clean up
|
||||
jsxc.storage.removeUserItem('buddylist');
|
||||
jsxc.storage.removeUserItem('windowlist');
|
||||
jsxc.storage.removeUserItem('unreadMsg');
|
||||
|
||||
@@ -256,6 +255,9 @@ jsxc.xmpp = {
|
||||
|
||||
jsxc.xmpp.saveSessionParameter();
|
||||
|
||||
var rosterVerSupport = $(jsxc.xmpp.conn.features).find('[xmlns="urn:xmpp:features:rosterver"]').length > 0;
|
||||
jsxc.storage.setUserItem('rosterVerSupport', rosterVerSupport);
|
||||
|
||||
if (jsxc.options.loginForm.triggered) {
|
||||
switch (jsxc.options.loginForm.onConnected || 'submit') {
|
||||
case 'submit':
|
||||
@@ -286,11 +288,15 @@ jsxc.xmpp = {
|
||||
|
||||
$('#jsxc_roster').removeClass('jsxc_noConnection');
|
||||
|
||||
Strophe.addNamespace('VERSION', 'jabber:iq:version');
|
||||
|
||||
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onRosterChanged, 'jabber:iq:roster', 'iq', 'set');
|
||||
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onChatMessage, null, 'message', 'chat');
|
||||
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onErrorMessage, null, 'message', 'error');
|
||||
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onHeadlineMessage, null, 'message', 'headline');
|
||||
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onReceived, null, 'message');
|
||||
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onPresence, null, 'presence');
|
||||
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onVersionRequest, Strophe.NS.VERSION, 'iq', 'get');
|
||||
|
||||
jsxc.gui.init();
|
||||
|
||||
@@ -331,19 +337,28 @@ jsxc.xmpp = {
|
||||
}
|
||||
}
|
||||
|
||||
var rosterLoaded = jsxc.storage.getUserItem('rosterLoaded');
|
||||
|
||||
// Only load roaster if necessary
|
||||
if (!jsxc.reconnect || !jsxc.storage.getUserItem('buddylist')) {
|
||||
if (rosterLoaded !== jsxc.xmpp.conn._proto.sid) {
|
||||
// in order to not overide existing presence information, we send
|
||||
// pres first after roster is ready
|
||||
$(document).one('cloaded.roster.jsxc', jsxc.xmpp.sendPres);
|
||||
|
||||
$('#jsxc_roster > p:first').remove();
|
||||
|
||||
var queryAttr = {
|
||||
xmlns: 'jabber:iq:roster'
|
||||
};
|
||||
|
||||
if (jsxc.storage.getUserItem('rosterVerSupport')) {
|
||||
// @TODO check if we really cached the roster
|
||||
queryAttr.ver = jsxc.storage.getUserItem('rosterVer') || '';
|
||||
}
|
||||
|
||||
var iq = $iq({
|
||||
type: 'get'
|
||||
}).c('query', {
|
||||
xmlns: 'jabber:iq:roster'
|
||||
});
|
||||
}).c('query', queryAttr);
|
||||
|
||||
jsxc.xmpp.conn.sendIQ(iq, jsxc.xmpp.onRoster);
|
||||
} else {
|
||||
@@ -371,14 +386,12 @@ jsxc.xmpp = {
|
||||
},
|
||||
|
||||
initNewConnection: function() {
|
||||
// make shure roster will be reloaded
|
||||
jsxc.storage.removeUserItem('buddylist');
|
||||
|
||||
jsxc.storage.removeUserItem('windowlist');
|
||||
jsxc.storage.removeUserItem('own');
|
||||
jsxc.storage.removeUserItem('avatar', 'own');
|
||||
jsxc.storage.removeUserItem('otrlist');
|
||||
jsxc.storage.removeUserItem('unreadMsg');
|
||||
jsxc.storage.removeUserItem('features');
|
||||
|
||||
// reset user options
|
||||
jsxc.storage.removeUserElement('options', 'RTCPeerConfig');
|
||||
@@ -393,6 +406,7 @@ jsxc.xmpp = {
|
||||
jsxc.xmpp.conn.disco.addIdentity('client', 'web', 'JSXC');
|
||||
jsxc.xmpp.conn.disco.addFeature(Strophe.NS.DISCO_INFO);
|
||||
jsxc.xmpp.conn.disco.addFeature(Strophe.NS.RECEIPTS);
|
||||
jsxc.xmpp.conn.disco.addFeature(Strophe.NS.VERSION);
|
||||
}
|
||||
|
||||
// create presence stanza
|
||||
@@ -415,6 +429,23 @@ jsxc.xmpp = {
|
||||
|
||||
jsxc.debug('Send presence', pres.toString());
|
||||
jsxc.xmpp.conn.send(pres);
|
||||
|
||||
if (!jsxc.storage.getUserItem('features')) {
|
||||
jsxc.xmpp.conn.flush();
|
||||
|
||||
var barJid = Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid);
|
||||
|
||||
jsxc.xmpp.conn.disco.info(barJid, undefined, function(stanza) {
|
||||
var features = $(stanza).find('feature').map(function() {
|
||||
return $(this).attr('var');
|
||||
});
|
||||
|
||||
jsxc.storage.setUserItem('features', features.toArray());
|
||||
$(document).trigger('features.jsxc');
|
||||
});
|
||||
} else {
|
||||
$(document).trigger('features.jsxc');
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -431,6 +462,7 @@ jsxc.xmpp = {
|
||||
jsxc.storage.removeItem('hidden');
|
||||
jsxc.storage.removeUserItem('avatar', 'own');
|
||||
jsxc.storage.removeUserItem('otrlist');
|
||||
jsxc.storage.removeUserItem('features');
|
||||
|
||||
$(document).off('connected.jsxc', jsxc.xmpp.connected);
|
||||
$(document).off('attached.jsxc', jsxc.xmpp.attached);
|
||||
@@ -506,13 +538,17 @@ jsxc.xmpp = {
|
||||
* @private
|
||||
*/
|
||||
onRoster: function(iq) {
|
||||
/*
|
||||
* <iq from='' type='get' id=''> <query xmlns='jabber:iq:roster'> <item
|
||||
* jid='' name='' subscription='' /> ... </query> </iq>
|
||||
*/
|
||||
|
||||
jsxc.debug('Load roster', iq);
|
||||
|
||||
jsxc.storage.setUserItem('rosterLoaded', jsxc.xmpp.conn._proto.sid);
|
||||
|
||||
if ($(iq).find('query').length === 0) {
|
||||
jsxc.debug('Use cached roster');
|
||||
|
||||
jsxc.restoreRoster();
|
||||
return;
|
||||
}
|
||||
|
||||
var buddies = [];
|
||||
|
||||
$(iq).find('item').each(function() {
|
||||
@@ -543,6 +579,10 @@ jsxc.xmpp = {
|
||||
|
||||
jsxc.storage.setUserItem('buddylist', buddies);
|
||||
|
||||
if ($(iq).find('query').attr('ver')) {
|
||||
jsxc.storage.setUserItem('rosterVer', $(iq).find('query').attr('ver'));
|
||||
}
|
||||
|
||||
// load bookmarks
|
||||
jsxc.xmpp.bookmarks.load();
|
||||
|
||||
@@ -622,6 +662,10 @@ jsxc.xmpp = {
|
||||
}
|
||||
});
|
||||
|
||||
if ($(iq).find('query').attr('ver')) {
|
||||
jsxc.storage.setUserItem('rosterVer', $(iq).find('query').attr('ver'));
|
||||
}
|
||||
|
||||
if (!jsxc.storage.getUserItem('buddylist') || jsxc.storage.getUserItem('buddylist').length === 0) {
|
||||
jsxc.gui.roster.empty();
|
||||
} else {
|
||||
@@ -745,9 +789,7 @@ jsxc.xmpp = {
|
||||
});
|
||||
}
|
||||
|
||||
if (data.type === 'groupchat') {
|
||||
data.status = status;
|
||||
} else {
|
||||
if (data.type !== 'groupchat') {
|
||||
data.status = max;
|
||||
}
|
||||
|
||||
@@ -869,14 +911,22 @@ jsxc.xmpp = {
|
||||
if (chat.length === 0) {
|
||||
jsxc.notice.add({
|
||||
msg: $.t('Unknown_sender'),
|
||||
description: $.t('You_received_a_message_from_an_unknown_sender') + ' (' + bid + ').'
|
||||
description: $.t('You_received_a_message_from_an_unknown_sender_') + ' (' + bid + ').'
|
||||
}, 'gui.showUnknownSender', [bid]);
|
||||
}
|
||||
|
||||
var msg = jsxc.removeHTML(body);
|
||||
msg = jsxc.escapeHTML(msg);
|
||||
|
||||
jsxc.storage.saveMessage(bid, 'in', msg, false, forwarded, stamp);
|
||||
var messageObj = new jsxc.Message({
|
||||
bid: bid,
|
||||
msg: msg,
|
||||
direction: jsxc.Message.IN,
|
||||
encrypted: false,
|
||||
forwarded: forwarded,
|
||||
stamp: stamp
|
||||
});
|
||||
messageObj.save();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -939,12 +989,15 @@ jsxc.xmpp = {
|
||||
if (jsxc.otr.objects.hasOwnProperty(bid) && body) {
|
||||
// @TODO check for file upload url after decryption
|
||||
jsxc.otr.objects[bid].receiveMsg(body, {
|
||||
_uid: mid,
|
||||
foo: 'bar',
|
||||
stamp: stamp,
|
||||
forwarded: forwarded,
|
||||
attachment: attachment
|
||||
});
|
||||
} else {
|
||||
jsxc.gui.window.postMessage({
|
||||
_uid: mid,
|
||||
bid: bid,
|
||||
direction: jsxc.Message.IN,
|
||||
msg: body,
|
||||
@@ -959,6 +1012,58 @@ jsxc.xmpp = {
|
||||
return true;
|
||||
},
|
||||
|
||||
onErrorMessage: function(message) {
|
||||
var bid = jsxc.jidToBid($(message).attr('from'));
|
||||
|
||||
if (jsxc.gui.window.get(bid).length === 0 || !$(message).attr('id')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($(message).find('item-not-found').length > 0) {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: bid,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send_item-not-found')
|
||||
});
|
||||
} else if ($(message).find('forbidden').length > 0) {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: bid,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send_forbidden')
|
||||
});
|
||||
} else if ($(message).find('not-acceptable').length > 0) {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: bid,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send_not-acceptable')
|
||||
});
|
||||
} else if ($(message).find('remote-server-not-found').length > 0) {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: bid,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send_remote-server-not-found')
|
||||
});
|
||||
} else if ($(message).find('service-unavailable').length > 0) {
|
||||
if ($(message).find('[xmlns="' + Strophe.NS.CHATSTATES + '"]').length === 0) {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: bid,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send_resource-unavailable')
|
||||
});
|
||||
}
|
||||
} else {
|
||||
jsxc.gui.window.postMessage({
|
||||
bid: bid,
|
||||
direction: jsxc.Message.SYS,
|
||||
msg: $.t('message_not_send')
|
||||
});
|
||||
}
|
||||
|
||||
jsxc.debug('error message for ' + bid, $(message).find('error')[0]);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Process message stanzas of type headline.
|
||||
*
|
||||
@@ -991,6 +1096,29 @@ jsxc.xmpp = {
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Respond to version request (XEP-0092).
|
||||
*/
|
||||
onVersionRequest: function(stanza) {
|
||||
stanza = $(stanza);
|
||||
|
||||
var from = stanza.attr('from');
|
||||
var id = stanza.attr('id');
|
||||
|
||||
var iq = $iq({
|
||||
type: 'result',
|
||||
to: from,
|
||||
id: id
|
||||
}).c('query', {
|
||||
xmlns: Strophe.NS.VERSION
|
||||
}).c('name').t('JSXC').up()
|
||||
.c('version').t(jsxc.version);
|
||||
|
||||
jsxc.xmpp.conn.sendIQ(iq);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Triggerd if the rid changed
|
||||
*
|
||||
@@ -1049,9 +1177,9 @@ jsxc.xmpp = {
|
||||
type: 'subscribe'
|
||||
}));
|
||||
|
||||
jsxc.storage.removeUserItem('add_' + bid);
|
||||
jsxc.storage.removeUserItem('add', bid);
|
||||
} else {
|
||||
jsxc.storage.setUserItem('add_' + bid, {
|
||||
jsxc.storage.setUserItem('add', bid, {
|
||||
username: username,
|
||||
alias: alias || null
|
||||
});
|
||||
@@ -1159,6 +1287,12 @@ jsxc.xmpp = {
|
||||
});
|
||||
}
|
||||
|
||||
if (msg.match(/^\?OTR/)) {
|
||||
xmlMsg.up().c("no-permanent-store", {
|
||||
xmlns: jsxc.CONST.NS.HINTS
|
||||
});
|
||||
}
|
||||
|
||||
if (type === 'chat' && (isBar || jsxc.xmpp.conn.caps.hasFeatureByJid(jid, Strophe.NS.RECEIPTS))) {
|
||||
// Add request according to XEP-0184
|
||||
xmlMsg.up().c('request', {
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
/**
|
||||
* Implements XEP-0313: Message Archive Management.
|
||||
*
|
||||
* @namespace jsxc.xmpp.mam
|
||||
* @see {@link https://xmpp.org/extensions/xep-0313.html}
|
||||
*/
|
||||
jsxc.xmpp.mam = {
|
||||
conn: null
|
||||
};
|
||||
|
||||
jsxc.xmpp.mam.init = function() {
|
||||
var self = jsxc.xmpp.mam;
|
||||
|
||||
self.conn = jsxc.xmpp.conn;
|
||||
};
|
||||
|
||||
jsxc.xmpp.mam.isEnabled = function() {
|
||||
var mamOptions = jsxc.options.get('mam') || {};
|
||||
|
||||
var features = jsxc.storage.getUserItem('features') || [];
|
||||
var hasFeatureMam2 = features.indexOf(Strophe.NS.MAM) >= 0;
|
||||
|
||||
return hasFeatureMam2 && mamOptions.enable;
|
||||
};
|
||||
|
||||
jsxc.xmpp.mam.nextMessages = function(bid) {
|
||||
var self = jsxc.xmpp.mam;
|
||||
var buddyData = jsxc.storage.getUserItem('buddy', bid) || {};
|
||||
var lastArchiveUid = buddyData.lastArchiveUid;
|
||||
var queryId = self.conn.getUniqueId();
|
||||
var mamOptions = jsxc.options.get('mam') || {};
|
||||
var history = jsxc.storage.getUserItem('history', bid) || [];
|
||||
|
||||
if (buddyData.archiveExhausted) {
|
||||
jsxc.debug('No more archived messages.');
|
||||
return;
|
||||
}
|
||||
|
||||
var queryOptions = {
|
||||
queryid: queryId,
|
||||
before: lastArchiveUid || '',
|
||||
with: bid,
|
||||
onMessage: function() {
|
||||
var args = Array.from(arguments);
|
||||
args.unshift(bid);
|
||||
self.onMessage.apply(this, args);
|
||||
return true;
|
||||
},
|
||||
onComplete: function() {
|
||||
var args = Array.from(arguments);
|
||||
args.unshift(bid);
|
||||
self.onComplete.apply(this, args);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
var oldestMessageId = history[history.length - 1];
|
||||
|
||||
if (oldestMessageId && !lastArchiveUid) {
|
||||
var oldestMessage = new jsxc.Message(oldestMessageId);
|
||||
queryOptions.end = (new Date(oldestMessage.stamp)).toISOString();
|
||||
}
|
||||
|
||||
if (mamOptions.max) {
|
||||
queryOptions.max = mamOptions.max;
|
||||
}
|
||||
|
||||
self.conn.mam.query(undefined, queryOptions);
|
||||
};
|
||||
|
||||
jsxc.xmpp.mam.onMessage = function(bid, stanza) {
|
||||
stanza = $(stanza);
|
||||
var result = stanza.find('result[xmlns="' + Strophe.NS.MAM + '"]');
|
||||
var queryId = result.attr('queryid');
|
||||
|
||||
if (result.length !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
var forwarded = result.find('forwarded[xmlns="' + jsxc.CONST.NS.FORWARD + '"]');
|
||||
var message = forwarded.find('message');
|
||||
var messageId = $(message).attr('id');
|
||||
|
||||
if (message.length !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
var from = message.attr('from');
|
||||
var to = message.attr('to');
|
||||
|
||||
if (jsxc.jidToBid(from) !== bid && jsxc.jidToBid(to) !== bid) {
|
||||
return;
|
||||
}
|
||||
|
||||
var delay = forwarded.find('delay[xmlns="urn:xmpp:delay"]');
|
||||
var stamp = (delay.length > 0) ? new Date(delay.attr('stamp')) : new Date();
|
||||
stamp = stamp.getTime();
|
||||
|
||||
var body = $(message).find('body:first').text();
|
||||
|
||||
if (!body || body.match(/\?OTR/i)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
var direction = (jsxc.jidToBid(to) === bid) ? jsxc.Message.OUT : jsxc.Message.IN;
|
||||
|
||||
var win = jsxc.gui.window.get(bid);
|
||||
var textarea = win.find('.jsxc_textarea');
|
||||
if (textarea.find('[id="' + messageId + '"]').length === 0) {
|
||||
var pseudoChatElement = $('<div>');
|
||||
pseudoChatElement.attr('id', messageId.replace(/:/g, '-'));
|
||||
pseudoChatElement.attr('data-queryId', queryId);
|
||||
|
||||
var lastMessage = textarea.find('[data-queryId="' + queryId + '"]').last();
|
||||
var history = jsxc.storage.getUserItem('history', bid) || [];
|
||||
|
||||
if (history.indexOf(messageId) < 0) {
|
||||
if (lastMessage.length === 0) {
|
||||
textarea.prepend(pseudoChatElement);
|
||||
history.push(messageId);
|
||||
} else {
|
||||
lastMessage.after(pseudoChatElement);
|
||||
history.splice(history.indexOf(lastMessage.attr('id').replace(/-/g, ':')), 0, messageId);
|
||||
}
|
||||
}
|
||||
|
||||
jsxc.storage.setUserItem('history', bid, history);
|
||||
}
|
||||
|
||||
jsxc.gui.window.postMessage({
|
||||
_uid: messageId,
|
||||
bid: bid,
|
||||
direction: direction,
|
||||
msg: body,
|
||||
encrypted: false,
|
||||
forwarded: true,
|
||||
stamp: stamp
|
||||
});
|
||||
};
|
||||
|
||||
jsxc.xmpp.mam.onComplete = function(bid, stanza) {
|
||||
stanza = $(stanza);
|
||||
var fin = stanza.find('fin[xmlns="' + Strophe.NS.MAM + '"]');
|
||||
var buddyData = jsxc.storage.getUserItem('buddy', bid) || {};
|
||||
var win = jsxc.gui.window.get(bid);
|
||||
|
||||
buddyData.archiveExhausted = fin.attr('complete') === 'true';
|
||||
buddyData.lastArchiveUid = fin.find('first').text();
|
||||
|
||||
if (buddyData.archiveExhausted) {
|
||||
win.find('.jsxc_fade').removeClass('jsxc_mam-enable');
|
||||
}
|
||||
|
||||
jsxc.storage.setUserItem('buddy', bid, buddyData);
|
||||
};
|
||||
|
||||
jsxc.xmpp.mam.initWindow = function(ev, win) {
|
||||
var self = jsxc.xmpp.mam;
|
||||
|
||||
if (!jsxc.xmpp.conn && jsxc.master) {
|
||||
$(document).one('attached.jsxc', function() {
|
||||
self.initWindow(null, win);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (!jsxc.master) {
|
||||
return;
|
||||
}
|
||||
|
||||
$(document).on('features.jsxc', function() {
|
||||
jsxc.xmpp.mam.addLoadButton(win);
|
||||
});
|
||||
|
||||
var features = jsxc.storage.getUserItem('features');
|
||||
if (features !== null) {
|
||||
// features.jsxc was already fired
|
||||
jsxc.xmpp.mam.addLoadButton(win);
|
||||
}
|
||||
};
|
||||
|
||||
jsxc.xmpp.mam.addLoadButton = function(win) {
|
||||
if (!jsxc.xmpp.mam.isEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
var classNameShow = 'jsxc_show';
|
||||
var classNameMamEnable = 'jsxc_mam-enable';
|
||||
var bid = win.attr('data-bid');
|
||||
|
||||
var element = $('<div>');
|
||||
element.addClass('jsxc_mam-load-more');
|
||||
element.appendTo(win.find('.slimScrollDiv'));
|
||||
element.click(function() {
|
||||
jsxc.xmpp.mam.nextMessages(bid);
|
||||
});
|
||||
element.text($.t('Load_older_messages'));
|
||||
|
||||
win.find('.jsxc_textarea').scroll(function() {
|
||||
var buddyData = jsxc.storage.getUserItem('buddy', bid) || {};
|
||||
|
||||
if (this.scrollTop < 42 && !buddyData.archiveExhausted) {
|
||||
element.addClass(classNameShow);
|
||||
} else {
|
||||
element.removeClass(classNameShow);
|
||||
}
|
||||
|
||||
if (!buddyData.archiveExhausted) {
|
||||
win.find('.jsxc_fade').addClass(classNameMamEnable);
|
||||
}
|
||||
});
|
||||
|
||||
win.find('.jsxc_textarea').scroll();
|
||||
};
|
||||
|
||||
$(document).on('attached.jsxc', jsxc.xmpp.mam.init);
|
||||
$(document).on('init.window.jsxc', jsxc.xmpp.mam.initWindow);
|
||||
+1
-1
@@ -1 +1 @@
|
||||
}(jQuery));
|
||||
}(jQuery));
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<li class="jsxc_windowItem">
|
||||
<div class="jsxc_window">
|
||||
<div class="jsxc_bar">
|
||||
<div class="jsxc_avatar"></div>
|
||||
<div class="jsxc_avatar jsxc_statusIndicator"></div>
|
||||
<div class="jsxc_tools">
|
||||
<div class="jsxc_settings">
|
||||
<div class="jsxc_more"></div>
|
||||
@@ -33,6 +33,7 @@
|
||||
<span class="jsxc_unread" />
|
||||
<span class="jsxc_text" />
|
||||
</div>
|
||||
<div class="jsxc_status-msg" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="jsxc_fade">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<div id="jsxc_roster">
|
||||
<ul id="jsxc_buddylist"></ul>
|
||||
<div class="jsxc_bottom jsxc_presence jsxc_rosteritem" data-bid="own">
|
||||
<div id="jsxc_avatar" class="jsxc_avatar" />
|
||||
<div id="jsxc_avatar" class="jsxc_avatar jsxc_statusIndicator" />
|
||||
<div id="jsxc_menu">
|
||||
<span></span>
|
||||
<div class="jsxc_inner">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<li class="jsxc_rosteritem">
|
||||
<div class="jsxc_avatar"></div>
|
||||
<div class="jsxc_avatar jsxc_statusIndicator"></div>
|
||||
<div class="jsxc_more" />
|
||||
<div class="jsxc_caption">
|
||||
<div class="jsxc_name" />
|
||||
|
||||
@@ -97,6 +97,27 @@
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal col-sm-6">
|
||||
<fieldset class="jsxc_fieldsetMam jsxc_fieldset">
|
||||
<h3 class="jsxc_experimental" data-i18n="Message_history"></h3>
|
||||
<p data-i18n="setting-mam-enable"></p>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-12">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" id="mam-enable"><span data-i18n="Enable"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-12">
|
||||
<button class="btn btn-primary jsxc_continue" type="submit" data-i18n="Save"></button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<form class="form-horizontal col-sm-6" data-onsubmit="xmpp.carbons.refresh">
|
||||
<fieldset class="jsxc_fieldsetCarbons jsxc_fieldset">
|
||||
<h3 data-i18n="Carbon_copy"></h3>
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário