Comparar commits

...

74 Commits

Autor SHA1 Mensagem Data
sualko 7e4885b86d build v3.2.0-beta.2 2017-04-28 15:33:28 +02:00
sualko e8357cb3e8 update lang 2017-04-28 15:32:03 +02:00
sualko 990dfa5de0 update change log 2017-04-28 15:29:26 +02:00
sualko ab2a713a29 change roster ready event
- add roster state
- add event without namespace
2017-04-28 14:16:53 +02:00
sualko 9ad183210d change error message handling
- move to core
- ignore errors without id
- add description to remote-server-not-found error
2017-04-27 17:15:27 +02:00
sualko fdf9b670f3 add data-bid to xmpp uris 2017-04-27 16:53:20 +02:00
sualko 0227f54c8b fix xmpp message uri to unknown jid 2017-04-27 16:52:43 +02:00
sualko 26d5599ab1 update dependencies
- grunt-contrib-clean
- grunt-contrib-uglify
- node-sass
- strophe.chatstates
- strophejs-plugin-mam
2017-04-27 13:44:40 +02:00
sualko c785e8dbdd Merge branch 'mmoqui-chatstate-503'
Take into account the 'RFC 6121 / No Available or Connected Resource' with an offline storage disabled (#513)
2017-04-27 12:57:09 +02:00
sualko 3c881a4b50 use namespace string from strophe 2017-04-27 12:56:47 +02:00
Miguel Moquillon 4644d79bb4 Take into account the 'RFC 6121 / No Available or Connected Resources' with an offline storage disabled. For example, in the context the chatstate notifications is refused to be delivered by the server or the user isn't connected, the messages carrying the chatstate shouldn't to be stored offline (XEP 0085), causing then the server to send back an error 'service-unavailable' (RFC 6121). This behavior was first observed with ejabberd and a message composing to a non connected user. 2017-04-27 08:40:59 +02:00
sualko a8fb7a2e50 make message error more visible 2017-04-25 17:10:32 +02:00
sualko e1c905586f update lang 2017-04-25 16:49:15 +02:00
sualko 84c3fbbd44 fix roster loading 2017-04-25 16:44:11 +02:00
sualko 5bd440ead9 Merge branch 'master' of github.com:jsxc/jsxc 2017-04-24 14:17:16 +02:00
sualko ebe6b7bfea replace old storage key style (fix #515) 2017-04-24 14:17:01 +02:00
Klaus 50693eece7 Merge pull request #510 from Digonly/digonly-ejabberd-fix
One line fix
2017-04-10 09:38:01 +02:00
Klaus e8ae2d5421 Fix travis (#509) 2017-04-07 10:16:07 +02:00
Klaus 9c3bfcda07 Merge pull request #505 from mmoqui/master
Non translated text about the receipt of a message from an unknown sender
2017-04-07 10:01:54 +02:00
Digonly fdc570b6ee Ejabberd one line fix 2017-04-06 22:42:44 +02:00
Miguel Moquillon 6ff2a7ce31 fix the i18n key used when informing about a message coming from an unknown sender 2017-04-06 15:50:29 +02:00
sualko 6687eaa66c v3.2.0-beta.1 2017-04-04 14:12:09 +02:00
sualko 895cae067c add github release task 2017-04-03 17:13:32 +02:00
Klaus b0b3245e4e Merge pull request #502 from mmoqui/master
A little bug: user name missing in the composing message
2017-04-03 16:06:08 +02:00
Klaus 8f58a939fb Merge pull request #493 from jsxc/feature-mam
Message Archive Management (XEP-0313)
2017-04-03 15:54:33 +02:00
sualko 068f60c64e update locales 2017-04-03 15:51:38 +02:00
Miguel Moquillon 240a257397 When one user is composing a message in a groupchat, its name appears in the composing notification in the groupchat window of the others users.
When more than one user are composing simultaneously in a groupchat, their names appear in the composing notification in the groupchat window of the others users.
In a peer-to-peer chat, no name appears in the composing notification in the chat window as the name of the buddy is already displayed in the chat window header
2017-03-31 10:23:58 +02:00
sualko bca7af73ec update lang
add nl
2017-03-30 15:01:35 +02:00
sualko 62f6ddbfbe enable screen sharing for ff 52 even without extension (fix #488) 2017-03-30 14:29:44 +02:00
sualko fa831e25ca disable mam by default and add setting 2017-03-30 14:19:12 +02:00
sualko 3e7633d2c8 build v3.2.0-nightly.1 2017-03-20 17:43:33 +01:00
sualko 92e38a8abb update change log 2017-03-20 17:40:26 +01:00
sualko 7765b6b46f Merge branch 'master' into feature-mam 2017-03-20 17:30:16 +01:00
sualko d675401bc8 move composing message to window header (fix #468) 2017-03-20 17:26:59 +01:00
sualko 16e519d5ec fix state reset after disconnect 2017-03-20 16:31:03 +01:00
sualko 62ca260ba3 force features reload on log in 2017-03-20 16:20:58 +01:00
sualko f1a83cd696 fix mam feature detection 2017-03-20 16:17:54 +01:00
sualko 3d97567429 add no permanent store processing hint
XEP-0334
2017-03-20 15:09:21 +01:00
sualko 3226a3c940 make mam slave safe 2017-03-20 14:54:18 +01:00
sualko 31eba50c99 update locales 2017-03-20 14:52:59 +01:00
sualko ec0cec8a9e fix message dispatch from slave tab 2017-03-20 12:55:27 +01:00
sualko 15c7948cb8 fix mam button in empty windows 2017-03-20 10:53:42 +01:00
sualko 52588a1437 add mam support for master tab 2017-03-17 15:59:41 +01:00
sualko 1d60187f98 prefer xmpp password from settings over login form
nextcloud/jsxc.nextcloud#6
2017-03-16 13:20:04 +01:00
Klaus 81d84a02b9 Merge pull request #447 from jsxc/fix-muc-presence
[WIP] fix muc presence

fix #447
2017-03-14 12:32:24 +01:00
sualko 2eb4dfdea2 use new avatar namespace in muc 2017-03-14 12:31:27 +01:00
sualko 0aa0d4d467 define room as online after successful join 2017-03-14 12:31:08 +01:00
sualko f544b8d753 fix status indicator regression 2017-03-14 12:30:11 +01:00
sualko 60afa8efeb Merge branch 'master' into fix-muc-presence 2017-03-14 12:11:53 +01:00
Klaus 413bfd8dc3 Merge pull request #484 from jsxc/roster-enhancements
Roster enhancements
2017-03-14 10:56:31 +01:00
sualko 964de1637c catch quota exceeded errors
e.g. Safari in private mode has a quota of 0.
2017-03-14 10:47:08 +01:00
sualko 684bd5b27a support roster versioning (fix #478) 2017-03-09 15:43:02 +01:00
sualko 2cbc5b74a3 split avatar loading into chunks (fix #480) 2017-03-09 14:18:11 +01:00
sualko 66a1ed906c fix unclickable space (#483) 2017-03-08 14:10:11 +01:00
sualko 55838a4724 remove whitespace 2017-03-08 14:06:57 +01:00
sualko c8b6a7b1ba fix receiving message from unknown sender (fix #470) 2017-03-07 16:26:33 +01:00
sualko d45a5e1fda fix change of bosh url in example 2017-03-07 15:29:25 +01:00
Klaus 95689c62b6 Merge pull request #466 from jsxc/fix-bookmarks
Fix remote bookmark storage
2017-03-02 17:38:27 +01:00
Klaus 0f2960b1fb Merge pull request #465 from jsxc/fix-upload-discovery
- fix http upload discovery
- make max file size optional
2017-03-02 17:24:43 +01:00
sualko 7552e5c73a make max file size optional 2017-03-02 17:21:55 +01:00
sualko a6de6d6843 update strophe.jinglejs 2017-03-02 16:45:01 +01:00
sualko eeab8355e5 respond to software version request
implements XEP-0092, fix #464
2017-02-22 13:47:44 +01:00
sualko e95f61af25 fix vcard retrieval for rooms 2017-02-22 13:16:13 +01:00
sualko 4ec0656de6 minor dialog style fix 2017-02-22 13:09:35 +01:00
sualko 687347ec09 update strophe.bookmarks 2017-02-22 10:51:27 +01:00
sualko ace5fc585b Merge branch 'master' into fix-upload-discovery 2017-02-22 10:14:14 +01:00
sualko d38b45c441 beautify Gruntfile 2017-02-22 10:11:37 +01:00
sualko 3d408a51b9 fix http upload discovery 2017-02-22 10:05:52 +01:00
sualko 78cb8426c3 build v3.1.1 2017-02-14 16:19:51 +01:00
sualko daa5d35d7a check for missing files in build process 2017-02-14 16:19:38 +01:00
sualko daf6217a63 update documentation 2017-02-14 16:17:50 +01:00
sualko 479ebb3a26 update change log 2017-02-14 16:15:30 +01:00
sualko 4961e7e8e7 fix path to dependencies 2017-02-14 16:11:43 +01:00
sualko e953303002 decouple room and member presence 2017-02-02 16:54:19 +01:00
99 arquivos alterados com 6913 adições e 3444 exclusões
+3
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
+1
Ver Arquivo
@@ -8,4 +8,5 @@ before_install:
- gem install scss_lint
script:
- echo {} > .github.json
- ./node_modules/.bin/grunt pre-commit
+39
Ver Arquivo
@@ -5,6 +5,45 @@ 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
- fix path to dependencies
## 3.1.0 - 2017-02-14
### Added
+39 -2
Ver Arquivo
@@ -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')
@@ -155,14 +156,23 @@ module.exports = function(grunt) {
}
},
src: dep_files,
dest: '<%= target %>/lib/jsxc.dep.js'
dest: '<%= target %>/lib/jsxc.dep.js',
filter: function(filepath) {
if (!grunt.file.exists(filepath)) {
grunt.fail.warn('Could not find: ' + filepath);
} else {
return true;
}
},
nonull: true,
},
jsxc: {
options: {
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'
}
@@ -339,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']
}
}
});
@@ -363,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']);
@@ -387,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
Ver Arquivo
@@ -1,6 +1,6 @@
{
"name": "jsxc",
"version": "3.1.0",
"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
Ver Arquivo
@@ -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
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+9 -9
Ver Arquivo
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
+4371 -2443
Ver Arquivo
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+48 -46
Ver Arquivo
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
+16 -4
Ver Arquivo
@@ -25,28 +25,40 @@
},
{
"name": "strophe.js/vcard",
"file": "lib/strophe.vcard/index.js",
"file": "lib/strophe.vcard/strophe.vcard.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugins"
},
{
"name": "strophe.js/bookmarks",
"file": "lib/strophe.bookmarks/index.js",
"file": "lib/strophe.bookmarks/strophe.bookmarks.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugins/tree/master/bookmarks"
},
{
"name": "strophe.js/x",
"file": "lib/strophe.x/index.js",
"file": "lib/strophe.x/src/strophe.x.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugins/tree/master/dataforms"
},
{
"name": "strophe.js/chatstates",
"file": "lib/strophe.chatstates/index.js",
"file": "lib/strophe.chatstates/strophe.chatstates.js",
"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",
+1 -1
Ver Arquivo
@@ -458,7 +458,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -56,7 +56,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -3620,7 +3620,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1020,7 +1020,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -658,7 +658,7 @@ otherwise only dialog with given name is closed.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -4148,7 +4148,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -536,7 +536,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1707,7 +1707,7 @@ alphabetical of the name
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -3441,7 +3441,7 @@ and save. Check border cases and remove html.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -5073,7 +5073,7 @@ normal signal
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -309,7 +309,7 @@ jsxc.Message.PLAIN = 'plain';
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -291,7 +291,7 @@ $(document).on('update.gui.jsxc', function(ev, bid) {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -3169,7 +3169,7 @@ jsxc.gui.template.get = function(name, bid, msg) {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1007,7 +1007,7 @@ jsxc = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1720,7 +1720,7 @@ $(document).one('connected.jsxc', function() {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -195,7 +195,7 @@ jsxc.notice = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -319,7 +319,7 @@ jsxc.notification = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -349,7 +349,7 @@ jsxc.options = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -574,7 +574,7 @@ jsxc.otr = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -660,7 +660,7 @@ jsxc.storage = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -102,7 +102,7 @@ jsxc.tab = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1524,7 +1524,7 @@ $(document).ready(function() {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -387,7 +387,7 @@ jsxc.xmpp.bookmarks.showDialog = function(room) {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -290,7 +290,7 @@ $(document).on('attached.jsxc', jsxc.xmpp.chatState.init);
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -372,7 +372,7 @@ $(document).on('stateChange.jsxc', function(ev, state) {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1396,7 +1396,7 @@ jsxc.xmpp.carbons = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -2446,7 +2446,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1405,7 +1405,7 @@ messages.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -2760,7 +2760,7 @@ modification is done to it.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -2220,7 +2220,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -2332,7 +2332,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -434,7 +434,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -3444,7 +3444,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1022,7 +1022,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -504,7 +504,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1185,7 +1185,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1620,7 +1620,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1316,7 +1316,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1
Ver Arquivo
@@ -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;
+6 -1
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
}
}
+6 -1
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
}
}
+1
Ver Arquivo
@@ -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,
+311
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
}
}
+6 -1
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
}
}
+6 -1
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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."
}
}
+6 -1
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -1,6 +1,6 @@
{
"name": "jsxc",
"version": "3.1.0",
"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"
}
}
+1
Ver Arquivo
@@ -39,6 +39,7 @@
.mfp-close {
font-size: 23px;
font-weight: normal;
}
}
+10
Ver Arquivo
@@ -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;
}
}
}
}
+6
Ver Arquivo
@@ -115,6 +115,12 @@
}
}
}
.jsxc_avatar {
:before {
display: none;
}
}
}
}
+85 -35
Ver Arquivo
@@ -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;
}
}
+2 -1
Ver Arquivo
@@ -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';
+165
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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');
+9 -3
Ver Arquivo
@@ -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
}
};
+2
Ver Arquivo
@@ -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,
+27 -2
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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.
*
+29 -43
Ver Arquivo
@@ -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');
}
};
+7 -8
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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', {
+217
Ver Arquivo
@@ -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
Ver Arquivo
@@ -1 +1 @@
}(jQuery));
}(jQuery));
+2 -1
Ver Arquivo
@@ -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 -1
Ver Arquivo
@@ -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 -1
Ver Arquivo
@@ -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" />
+21
Ver Arquivo
@@ -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>