├── LICENSE ├── README.md ├── demo ├── css │ ├── images │ │ ├── ajax-loader.gif │ │ ├── icons-18-black.png │ │ ├── icons-18-white.png │ │ ├── icons-36-black.png │ │ ├── icons-36-white.png │ │ ├── loading.gif │ │ └── login.gif │ ├── jquery.mobile.min.css │ └── jsontable.css ├── favicon.ico ├── images │ ├── ajax-loader.gif │ ├── icons-18-black.png │ ├── icons-18-white.png │ ├── icons-36-black.png │ ├── icons-36-white.png │ ├── loading.gif │ └── login.gif ├── img │ ├── cc_banner.gif │ ├── logo.png │ ├── logo_big.png │ ├── logo_med.png │ └── verto_black_web.gif ├── index.html ├── js │ ├── jquery-2.1.1.min.js │ ├── jquery.cookie.js │ ├── jquery.dataTables.min.js │ ├── jquery.json-2.4.min.js │ ├── jquery.mobile.min.js │ └── verto-min.js ├── sounds │ ├── bell_ring2.mp3 │ └── bell_ring2.wav └── verto.js ├── js ├── .gitignore ├── Gruntfile.js ├── Makefile ├── README ├── jsmin.c ├── package.json └── src │ ├── jquery.FSRTC.js │ ├── jquery.jsonrpcclient.js │ ├── jquery.verto.js │ └── vendor │ ├── adapter-latest.js │ └── media-device-id.min.js ├── verto_communicator ├── .gitignore ├── .jshintrc ├── Gruntfile.js ├── README.md ├── bower.json ├── debian8-install.sh ├── js │ └── 3rd-party │ │ ├── getScreenId.js │ │ ├── md5.min.js │ │ └── volume-meter.js ├── package-lock.json ├── package.json └── src │ ├── config.json │ ├── config.json.sample │ ├── contributors.txt │ ├── css │ ├── images │ │ ├── ajax-loader.gif │ │ ├── icons-18-black.png │ │ ├── icons-18-white.png │ │ ├── icons-36-black.png │ │ ├── icons-36-white.png │ │ ├── loading.gif │ │ └── login.gif │ └── verto.css │ ├── favicon.ico │ ├── images │ ├── ajax-loader.gif │ ├── browser-logos │ │ ├── chrome_128x128.png │ │ ├── firefox.svg │ │ ├── firefox_128x128.png │ │ └── opera_128x128.png │ ├── icons-18-black.png │ ├── icons-18-white.png │ ├── icons-36-black.png │ ├── icons-36-white.png │ ├── loading.gif │ └── login.gif │ ├── img │ ├── cc_banner.gif │ ├── fs_logo_small.png │ ├── vc_logo.png │ └── verto_black_web.gif │ ├── index.html │ ├── locales │ ├── locale-da.json │ ├── locale-de.json │ ├── locale-en.json │ ├── locale-es.json │ ├── locale-fr.json │ ├── locale-id.json │ ├── locale-it.json │ ├── locale-pl.json │ ├── locale-pt.json │ ├── locale-ru.json │ ├── locale-sv.json │ └── locale-zh.json │ ├── partials │ ├── about.html │ ├── angular-prompt.html │ ├── browser_upgrade.html │ ├── chat.html │ ├── contributors.html │ ├── dialpad.html │ ├── dialpad_widget.html │ ├── incall.html │ ├── loading.html │ ├── login.html │ ├── menu.html │ ├── modal_logininfo.html │ ├── phone_call.html │ ├── preview.html │ ├── settings.html │ ├── splash_screen.html │ ├── video_call.html │ └── ws_reconnect.html │ ├── sounds │ ├── bell_ring2.mp3 │ └── bell_ring2.wav │ ├── storageService │ ├── services │ │ ├── call_history.js │ │ ├── splash_screen.js │ │ └── storage.js │ └── storageService.module.js │ ├── vertoApp │ └── vertoApp.module.js │ ├── vertoControllers │ ├── controllers │ │ ├── AboutController.source.js │ │ ├── BrowserUpgradeController.js │ │ ├── ChatController.js │ │ ├── ContributorsController.js │ │ ├── DialPadController.js │ │ ├── InCallController.js │ │ ├── LoadingController.js │ │ ├── LoginController.js │ │ ├── MainController.js │ │ ├── MenuController.js │ │ ├── ModalDialpadController.js │ │ ├── ModalLoginInformationController.js │ │ ├── ModalWsReconnectController.js │ │ ├── PreviewController.js │ │ ├── SettingsController.js │ │ └── SplashScreenController.js │ └── vertoControllers.module.js │ ├── vertoDirectives │ ├── directives │ │ ├── autofocus.js │ │ ├── showControls.js │ │ ├── userStatus.js │ │ └── videoTag.js │ └── vertoDirectives.module.js │ ├── vertoFilters │ ├── filters │ │ └── picturify.js │ └── vertoFilters.module.js │ └── vertoService │ ├── services │ ├── configService.js │ ├── eventQueueService.js │ └── vertoService.js │ └── vertoService.module.js ├── video_demo-live_canvas ├── css │ ├── images │ │ ├── ajax-loader.gif │ │ ├── icons-18-black.png │ │ ├── icons-18-white.png │ │ ├── icons-36-black.png │ │ ├── icons-36-white.png │ │ ├── loading.gif │ │ └── login.gif │ ├── jquery.mobile.min.css │ └── jsontable.css ├── dp │ └── dp.xml ├── favicon.ico ├── images │ ├── ajax-loader.gif │ ├── icons-18-black.png │ ├── icons-18-white.png │ ├── icons-36-black.png │ ├── icons-36-white.png │ ├── loading.gif │ ├── login.gif │ ├── search.gif │ └── speed.gif ├── img │ ├── cc_banner.gif │ ├── logo.png │ ├── logo_big.png │ ├── logo_med.png │ └── verto_black_web.gif ├── index.html ├── js │ ├── getScreenId.js │ ├── jquery-2.1.1.min.js │ ├── jquery.cookie.js │ ├── jquery.dataTables.min.js │ ├── jquery.hipchat.js │ ├── jquery.json-2.4.min.js │ ├── jquery.mobile.min.js │ ├── md5.min.js │ └── verto-min.js ├── sounds │ ├── bell_ring2.mp3 │ └── bell_ring2.wav └── verto.js └── video_demo ├── css ├── images │ ├── ajax-loader.gif │ ├── icons-18-black.png │ ├── icons-18-white.png │ ├── icons-36-black.png │ ├── icons-36-white.png │ ├── loading.gif │ └── login.gif ├── jquery.mobile.min.css └── jsontable.css ├── dp └── dp.xml ├── favicon.ico ├── images ├── ajax-loader.gif ├── icons-18-black.png ├── icons-18-white.png ├── icons-36-black.png ├── icons-36-white.png ├── loading.gif ├── login.gif ├── search.gif └── speed.gif ├── img ├── cc_banner.gif ├── logo.png ├── logo_big.png ├── logo_med.png └── verto_black_web.gif ├── index.html ├── js ├── getScreenId.js ├── jquery-2.1.1.min.js ├── jquery.cookie.js ├── jquery.dataTables.min.js ├── jquery.hipchat.js ├── jquery.json-2.4.min.js ├── jquery.mobile.min.js ├── md5.min.js └── verto-min.js ├── sounds ├── bell_ring2.mp3 └── bell_ring2.wav └── verto.js /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) verto-client contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Verto Client 2 | 3 | The community version of the verto client example code. 4 | 5 | [FreeSWITCH](https://github.com/signalwire/freeswitch) and mod_verto is needed to run this demo. 6 | 7 | This needs to be fleshed out more. 8 | 9 | It would be nice to develop a web app here that implements a web phone. 10 | Do not base it on the demo because it was just tossed together. 11 | 12 | To run jshint: 13 | 14 | ``` 15 | cd js 16 | npm install 17 | grunt 18 | ``` 19 | 20 | ## Docs 21 | 22 | https://evoluxbr.github.io/verto-docs/ 23 | 24 | ## Directories 25 | 26 | - demo: audio only WebRTC demo 27 | - video_demo: demo with video support 28 | - video_demo-live_canvas: video demo with live canvas feature 29 | - verto_communicator: nearly full featured video conference demo 30 | 31 | ## Others 32 | 33 | - [@xswitch/rtc](https://www.npmjs.com/package/@xswitch/rtc) is a successor of the verto client SDK, with es6, most docs in Chinese though. 34 | - Theres some demos on https://git.xswitch.cn/xswitch/xcc-examples/src/branch/master/webrtc 35 | - Live demos also available on https://xswitch.cn/demo/ and https://xswitch.cn/demo2/ which can you used to test connect to your own FreeSWITCH. 36 | -------------------------------------------------------------------------------- /demo/css/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/css/images/ajax-loader.gif -------------------------------------------------------------------------------- /demo/css/images/icons-18-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/css/images/icons-18-black.png -------------------------------------------------------------------------------- /demo/css/images/icons-18-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/css/images/icons-18-white.png -------------------------------------------------------------------------------- /demo/css/images/icons-36-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/css/images/icons-36-black.png -------------------------------------------------------------------------------- /demo/css/images/icons-36-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/css/images/icons-36-white.png -------------------------------------------------------------------------------- /demo/css/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/css/images/loading.gif -------------------------------------------------------------------------------- /demo/css/images/login.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/css/images/login.gif -------------------------------------------------------------------------------- /demo/css/jsontable.css: -------------------------------------------------------------------------------- 1 | .nthChildTest > div:nth-child(odd) { 2 | display: none; 3 | } 4 | 5 | .jsDataTable > thead > tr > th { 6 | 7 | border-width:4px; 8 | padding: 2px; 9 | font-size:10pt; 10 | text-align: left; 11 | 12 | } 13 | 14 | .jsDataTable > thead > tr > th.notSortable { 15 | padding: 5px; 16 | } 17 | 18 | .jsDataTable > tbody > tr > td { 19 | border-bottom: 1px solid #ccc; 20 | padding: 2px; 21 | vertical-align: middle; 22 | height:25px; 23 | font-size: 10px; 24 | } 25 | 26 | .jsDataTable { 27 | font-family: verdana; 28 | font-size:10pt; 29 | } 30 | 31 | .jsDataTable > tbody > tr:nth-child(odd), 32 | .jsDataTable > tbody > tr.odd { 33 | background-color: #ffffee; 34 | } 35 | .jsDataTable > tbody > tr:nth-child(even), 36 | .jsDataTable > tbody > tr.even { 37 | background-color: #ffffff; 38 | } 39 | 40 | .jsDataTable > thead th.sortAsc, 41 | .jsDataTable > thead th.sortDesc { 42 | color:ffffff; 43 | 44 | background-color: #7777ff; 45 | background-position: right center; 46 | background-repeat: no-repeat; 47 | } 48 | 49 | .jsDataTable > thead th.sortAsc { 50 | background-image: url(/images/table/asc.png); 51 | } 52 | 53 | .jsDataTable > thead th.sortDesc { 54 | background-image: url(/images/table/desc.png); 55 | } 56 | 57 | .jsDataTable.clickable > tbody > tr, 58 | .clickable > .jsDataTable > tbody > tr { 59 | cursor: pointer; 60 | } 61 | 62 | .jsDataTable.clickable > tbody > tr.nonDataRow, 63 | .clickable > .jsDataTable > tbody > tr.nonDataRow { 64 | cursor: auto; 65 | } 66 | -------------------------------------------------------------------------------- /demo/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/favicon.ico -------------------------------------------------------------------------------- /demo/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/images/ajax-loader.gif -------------------------------------------------------------------------------- /demo/images/icons-18-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/images/icons-18-black.png -------------------------------------------------------------------------------- /demo/images/icons-18-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/images/icons-18-white.png -------------------------------------------------------------------------------- /demo/images/icons-36-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/images/icons-36-black.png -------------------------------------------------------------------------------- /demo/images/icons-36-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/images/icons-36-white.png -------------------------------------------------------------------------------- /demo/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/images/loading.gif -------------------------------------------------------------------------------- /demo/images/login.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/images/login.gif -------------------------------------------------------------------------------- /demo/img/cc_banner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/img/cc_banner.gif -------------------------------------------------------------------------------- /demo/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/img/logo.png -------------------------------------------------------------------------------- /demo/img/logo_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/img/logo_big.png -------------------------------------------------------------------------------- /demo/img/logo_med.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/img/logo_med.png -------------------------------------------------------------------------------- /demo/img/verto_black_web.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/demo/img/verto_black_web.gif -------------------------------------------------------------------------------- /demo/js/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.3.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | (function ($, document, undefined) { 9 | 10 | var pluses = /\+/g; 11 | 12 | function raw(s) { 13 | return s; 14 | } 15 | 16 | function decoded(s) { 17 | return unRfc2068(decodeURIComponent(s.replace(pluses, ' '))); 18 | } 19 | 20 | function unRfc2068(value) { 21 | if (value.indexOf('"') === 0) { 22 | // This is a quoted cookie as according to RFC2068, unescape 23 | value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); 24 | } 25 | return value; 26 | } 27 | 28 | function fromJSON(value) { 29 | return config.json ? JSON.parse(value) : value; 30 | } 31 | 32 | var config = $.cookie = function (key, value, options) { 33 | 34 | // write 35 | if (value !== undefined) { 36 | options = $.extend({}, config.defaults, options); 37 | 38 | if (value === null) { 39 | options.expires = -1; 40 | } 41 | 42 | if (typeof options.expires === 'number') { 43 | var days = options.expires, t = options.expires = new Date(); 44 | t.setDate(t.getDate() + days); 45 | } 46 | 47 | value = config.json ? JSON.stringify(value) : String(value); 48 | 49 | return (document.cookie = [ 50 | encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value), 51 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 52 | options.path ? '; path=' + options.path : '', 53 | options.domain ? '; domain=' + options.domain : '', 54 | options.secure ? '; secure' : '' 55 | ].join('')); 56 | } 57 | 58 | // read 59 | var decode = config.raw ? raw : decoded; 60 | var cookies = document.cookie.split('; '); 61 | var result = key ? null : {}; 62 | for (var i = 0, l = cookies.length; i < l; i++) { 63 | var parts = cookies[i].split('='); 64 | var name = decode(parts.shift()); 65 | var cookie = decode(parts.join('=')); 66 | 67 | if (key && key === name) { 68 | result = fromJSON(cookie); 69 | break; 70 | } 71 | 72 | if (!key) { 73 | result[name] = fromJSON(cookie); 74 | } 75 | } 76 | 77 | return result; 78 | }; 79 | 80 | config.defaults = {}; 81 | 82 | $.removeCookie = function (key, options) { 83 | if ($.cookie(key) !== null) { 84 | $.cookie(key, null, options); 85 | return true; 86 | } 87 | return false; 88 | }; 89 | 90 | })(jQuery, document); 91 | -------------------------------------------------------------------------------- /demo/js/jquery.json-2.4.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery JSON plugin 2.4.0 | code.google.com/p/jquery-json */ 2 | (function($){'use strict';var escape=/["\\\x00-\x1f\x7f-\x9f]/g,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},hasOwn=Object.prototype.hasOwnProperty;$.toJSON=typeof JSON==='object'&&JSON.stringify?JSON.stringify:function(o){if(o===null){return'null';} 3 | var pairs,k,name,val,type=$.type(o);if(type==='undefined'){return undefined;} 4 | if(type==='number'||type==='boolean'){return String(o);} 5 | if(type==='string'){return $.quoteString(o);} 6 | if(typeof o.toJSON==='function'){return $.toJSON(o.toJSON());} 7 | if(type==='date'){var month=o.getUTCMonth()+1,day=o.getUTCDate(),year=o.getUTCFullYear(),hours=o.getUTCHours(),minutes=o.getUTCMinutes(),seconds=o.getUTCSeconds(),milli=o.getUTCMilliseconds();if(month<10){month='0'+month;} 8 | if(day<10){day='0'+day;} 9 | if(hours<10){hours='0'+hours;} 10 | if(minutes<10){minutes='0'+minutes;} 11 | if(seconds<10){seconds='0'+seconds;} 12 | if(milli<100){milli='0'+milli;} 13 | if(milli<10){milli='0'+milli;} 14 | return'"'+year+'-'+month+'-'+day+'T'+ 15 | hours+':'+minutes+':'+seconds+'.'+milli+'Z"';} 16 | pairs=[];if($.isArray(o)){for(k=0;k'], 21 | tasks: ['jshint'] 22 | } 23 | }); 24 | 25 | grunt.loadNpmTasks('grunt-contrib-jshint'); 26 | grunt.loadNpmTasks('grunt-contrib-watch'); 27 | 28 | grunt.registerTask('default', ['jshint']); 29 | 30 | }; 31 | -------------------------------------------------------------------------------- /js/Makefile: -------------------------------------------------------------------------------- 1 | JSFILES=src/jquery.FSRTC.js src/jquery.jsonrpcclient.js src/jquery.verto.js src/vendor/adapter-latest.js 2 | 3 | all: jsmin verto-min.js 4 | 5 | jsmin: jsmin.c 6 | $(CC) $< -o $@ 7 | 8 | verto-min.js: jsmin $(JSFILES) 9 | cat $(JSFILES) | ./jsmin > $@ 10 | 11 | verto-max.js: jsmin $(JSFILES) 12 | cat $(JSFILES) > $@ 13 | 14 | clean: 15 | rm -f verto-min.js verto-max.js jsmin *~ 16 | 17 | install-demo: all 18 | cp verto-min.js ../demo/js 19 | 20 | install-maxdemo: all verto-max.js 21 | cp verto-max.js ../demo/js/verto-min.js 22 | 23 | install-video_demo: all 24 | cp verto-min.js ../video_demo/js 25 | cp verto-min.js ../video_demo-live_canvas/js 26 | 27 | install-video_maxdemo: all verto-max.js 28 | cp verto-max.js ../video_demo/js/verto-min.js 29 | cp verto-max.js ../video_demo-live_canvas/js/verto-min.js 30 | -------------------------------------------------------------------------------- /js/README: -------------------------------------------------------------------------------- 1 | This file needs to say more. 2 | Documentation for the api needs to be developed with jsdoc-toolkit http://pulkitgoyal.in/documenting-jquery-plugins-jsdoc-toolkit/ 3 | 4 | Dependancies for DEMO 5 | jquery-2.0.3.min.js 6 | jquery-2.0.3.min.map 7 | jquery.cookie.js 8 | jquery.dataTables.js 9 | jquery.json-2.4.min.js 10 | jquery.mobile-1.3.2.min.js 11 | -------------------------------------------------------------------------------- /js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "verto", 3 | "version": "0.0.2", 4 | "devDependencies": { 5 | "grunt": "~0.4.5", 6 | "grunt-contrib-jshint": "~0.10.0", 7 | "grunt-contrib-watch": "*" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /verto_communicator/.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | .tmp/ 3 | bower_components/ 4 | node_modules/ 5 | src/vertoControllers/controllers/AboutController.js 6 | -------------------------------------------------------------------------------- /verto_communicator/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "bitwise": true, 3 | "camelcase": true, 4 | "curly": true, 5 | "eqeqeq": true, 6 | "es3": false, 7 | "forin": true, 8 | "freeze": true, 9 | "immed": true, 10 | "indent": 4, 11 | "latedef": "nofunc", 12 | "newcap": true, 13 | "noarg": true, 14 | "noempty": true, 15 | "nonbsp": true, 16 | "nonew": true, 17 | "plusplus": false, 18 | "quotmark": "single", 19 | "undef": true, 20 | "unused": false, 21 | "strict": false, 22 | "maxparams": 10, 23 | "maxdepth": 5, 24 | "maxstatements": 40, 25 | "maxcomplexity": 8, 26 | "maxlen": 120, 27 | 28 | "asi": false, 29 | "boss": false, 30 | "debug": false, 31 | "eqnull": true, 32 | "esnext": false, 33 | "evil": false, 34 | "expr": false, 35 | "funcscope": false, 36 | "globalstrict": false, 37 | "iterator": false, 38 | "lastsemic": false, 39 | "laxbreak": false, 40 | "laxcomma": false, 41 | "loopfunc": true, 42 | "maxerr": false, 43 | "moz": false, 44 | "multistr": false, 45 | "notypeof": false, 46 | "proto": false, 47 | "scripturl": false, 48 | "shadow": false, 49 | "sub": true, 50 | "supernew": false, 51 | "validthis": false, 52 | "noyield": false, 53 | 54 | "browser": true, 55 | "node": true, 56 | 57 | "globals": { 58 | "angular": false, 59 | "$": false, 60 | "jQuery": false 61 | } 62 | } -------------------------------------------------------------------------------- /verto_communicator/README.md: -------------------------------------------------------------------------------- 1 | To install on Mac 2 | 3 | brew install npm 4 | 5 | npm install -g grunt grunt-cli bower 6 | 7 | cd verto_communicator 8 | npm install 9 | bower install 10 | grunt serve 11 | 12 | to Install on Debian 8 13 | ./debian8_install.sh 14 | -------------------------------------------------------------------------------- /verto_communicator/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "verto_communicator", 3 | "version": "0.0.1", 4 | "authors": [ 5 | "Jonatas Oliveira ", 6 | "Ítalo Rossi ", 7 | "Stefan Yohansson ", 8 | "João Mesquita " 9 | ], 10 | "description": "Verto Communicator", 11 | "main": "index.html", 12 | "keywords": [ 13 | "freeswitch", 14 | "verto", 15 | "webrtc" 16 | ], 17 | "license": "MPL", 18 | "homepage": "www.freeswitch.org", 19 | "ignore": [ 20 | "**/.*", 21 | "node_modules", 22 | "bower_components", 23 | "test", 24 | "tests" 25 | ], 26 | "dependencies": { 27 | "jquery": "~2.1.4", 28 | "jquery-cookie": "~1.4.1", 29 | "jquery-json": "~2.5.1", 30 | "angular-gravatar": "~0.4.1", 31 | "bootstrap": "~3.3.4", 32 | "angular-toastr": "~1.4.1", 33 | "angular": "~1.3.15", 34 | "angular-sanitize": "~1.3.15", 35 | "angular-route": "~1.3.15", 36 | "angular-prompt": "~1.1.1", 37 | "angular-animate": "~1.3.15", 38 | "angular-cookies": "~1.3.15", 39 | "angular-directive.g-signin": "~0.1.2", 40 | "angular-fullscreen": "~1.0.1", 41 | "ngstorage": "~0.3.9", 42 | "angular-timer": "~1.3.3", 43 | "angular-tooltips": "~0.1.21", 44 | "datatables": "~1.10.8", 45 | "angular-bootstrap": "~0.14.3", 46 | "bootstrap-material-design": "git://github.com/mdbootstrap/bootstrap-material-design#~0.3.0", 47 | "angular-translate": "~2.10.0", 48 | "angular-translate-loader-static-files": "~2.10.0", 49 | "angular-click-outside": "~2.9.2" 50 | }, 51 | "resolutions": { 52 | "angular": "~1.3.15", 53 | "angular-bootstrap": "~0.14.3" 54 | }, 55 | "overrides": { 56 | "bootstrap": { 57 | "main": [ 58 | "dist/css/bootstrap.css", 59 | "dist/js/bootstrap.js" 60 | ] 61 | }, 62 | "jquery-json": { 63 | "main": [ 64 | "src/jquery.json.js" 65 | ] 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /verto_communicator/debian8-install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | apt-get update 3 | apt-get -y install npm nodejs-legacy 4 | npm install -g grunt grunt-cli bower 5 | npm install 6 | bower --allow-root install 7 | grunt build 8 | -------------------------------------------------------------------------------- /verto_communicator/js/3rd-party/md5.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * JavaScript MD5 1.0.1 3 | * https://github.com/blueimp/JavaScript-MD5 4 | * 5 | * Copyright 2011, Sebastian Tschan 6 | * https://blueimp.net 7 | * 8 | * Licensed under the MIT license: 9 | * http://www.opensource.org/licenses/MIT 10 | * 11 | * Based on 12 | * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message 13 | * Digest Algorithm, as defined in RFC 1321. 14 | * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 15 | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet 16 | * Distributed under the BSD License 17 | * See http://pajhome.org.uk/crypt/md5 for more info. 18 | */ 19 | !function(a){"use strict";function b(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}function c(a,b){return a<>>32-b}function d(a,d,e,f,g,h){return b(c(b(b(d,a),b(f,h)),g),e)}function e(a,b,c,e,f,g,h){return d(b&c|~b&e,a,b,f,g,h)}function f(a,b,c,e,f,g,h){return d(b&e|c&~e,a,b,f,g,h)}function g(a,b,c,e,f,g,h){return d(b^c^e,a,b,f,g,h)}function h(a,b,c,e,f,g,h){return d(c^(b|~e),a,b,f,g,h)}function i(a,c){a[c>>5]|=128<>>9<<4)+14]=c;var d,i,j,k,l,m=1732584193,n=-271733879,o=-1732584194,p=271733878;for(d=0;d>5]>>>b%32&255);return c}function k(a){var b,c=[];for(c[(a.length>>2)-1]=void 0,b=0;b>5]|=(255&a.charCodeAt(b/8))<16&&(e=i(e,8*a.length)),c=0;16>c;c+=1)f[c]=909522486^e[c],g[c]=1549556828^e[c];return d=i(f.concat(k(b)),512+8*b.length),j(i(g.concat(d),640))}function n(a){var b,c,d="0123456789abcdef",e="";for(c=0;c>>4&15)+d.charAt(15&b);return e}function o(a){return unescape(encodeURIComponent(a))}function p(a){return l(o(a))}function q(a){return n(p(a))}function r(a,b){return m(o(a),o(b))}function s(a,b){return n(r(a,b))}function t(a,b,c){return b?c?r(b,a):s(b,a):c?p(a):q(a)}"function"==typeof define&&define.amd?define(function(){return t}):a.md5=t}(this); -------------------------------------------------------------------------------- /verto_communicator/js/3rd-party/volume-meter.js: -------------------------------------------------------------------------------- 1 | /* 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2014 Chris Wilson 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | 25 | /* 26 | 27 | Usage: 28 | audioNode = createAudioMeter(audioContext,clipLevel,averaging,clipLag); 29 | 30 | audioContext: the AudioContext you're using. 31 | clipLevel: the level (0 to 1) that you would consider "clipping". 32 | Defaults to 0.98. 33 | averaging: how "smoothed" you would like the meter to be over time. 34 | Should be between 0 and less than 1. Defaults to 0.95. 35 | clipLag: how long you would like the "clipping" indicator to show 36 | after clipping has occured, in milliseconds. Defaults to 750ms. 37 | 38 | Access the clipping through node.checkClipping(); use node.shutdown to get rid of it. 39 | */ 40 | 41 | function createAudioMeter(audioContext,clipLevel,averaging,clipLag) { 42 | var processor = audioContext.createScriptProcessor(512); 43 | processor.onaudioprocess = volumeAudioProcess; 44 | processor.clipping = false; 45 | processor.lastClip = 0; 46 | processor.volume = 0; 47 | processor.clipLevel = clipLevel || 0.98; 48 | processor.averaging = averaging || 0.95; 49 | processor.clipLag = clipLag || 750; 50 | 51 | // this will have no effect, since we don't copy the input to the output, 52 | // but works around a current Chrome bug. 53 | processor.connect(audioContext.destination); 54 | 55 | processor.checkClipping = 56 | function(){ 57 | if (!this.clipping) 58 | return false; 59 | if ((this.lastClip + this.clipLag) < window.performance.now()) 60 | this.clipping = false; 61 | return this.clipping; 62 | }; 63 | 64 | processor.shutdown = 65 | function(){ 66 | this.disconnect(); 67 | this.onaudioprocess = null; 68 | }; 69 | 70 | return processor; 71 | } 72 | 73 | function volumeAudioProcess( event ) { 74 | var buf = event.inputBuffer.getChannelData(0); 75 | var bufLength = buf.length; 76 | var sum = 0; 77 | var x; 78 | 79 | // Do a root-mean-square on the samples: sum up the squares... 80 | for (var i=0; i=this.clipLevel) { 83 | this.clipping = true; 84 | this.lastClip = window.performance.now(); 85 | } 86 | sum += x * x; 87 | } 88 | 89 | // ... then take the square root of the sum. 90 | var rms = Math.sqrt(sum / bufLength); 91 | 92 | // Now smooth this out with the averaging factor applied 93 | // to the previous sample - take the max here because we 94 | // want "fast attack, slow release." 95 | this.volume = Math.max(rms, this.volume*this.averaging); 96 | } 97 | -------------------------------------------------------------------------------- /verto_communicator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "verto_communicator", 3 | "version": "0.0.1", 4 | "license": "MPL-1.1", 5 | "description": "HTML5 Based Communications application for use with FreeSWITCH and mod_verto", 6 | "devDependencies": { 7 | "autoprefixer-core": "^5.2.1", 8 | "browser-sync": "^2.8.2", 9 | "connect-logger": "0.0.1", 10 | "grunt": "^0.4.5", 11 | "grunt-cli": "^1.2.0", 12 | "grunt-browser-sync": "^2.1.2", 13 | "grunt-concurrent": "^1.0.0", 14 | "grunt-contrib-clean": "^0.6.0", 15 | "grunt-contrib-concat": "^0.5.0", 16 | "grunt-contrib-copy": "^0.7.0", 17 | "grunt-contrib-cssmin": "^0.12.0", 18 | "grunt-contrib-htmlmin": "^0.4.0", 19 | "grunt-contrib-imagemin": "^1.0.0", 20 | "grunt-contrib-jshint": "^0.11.0", 21 | "grunt-contrib-uglify": "^0.7.0", 22 | "grunt-contrib-watch": "latest", 23 | "grunt-preprocess": "latest", 24 | "grunt-git-revision": "latest", 25 | "grunt-filerev": "^2.1.2", 26 | "grunt-newer": "^1.1.0", 27 | "grunt-ng-annotate": "^0.9.2", 28 | "grunt-postcss": "^0.5.3", 29 | "grunt-svgmin": "^2.0.0", 30 | "grunt-usemin": "^3.0.0", 31 | "grunt-wiredep": "^2.0.0", 32 | "jit-grunt": "^0.9.1", 33 | "jshint-stylish": "^1.0.0", 34 | "time-grunt": "^1.0.0" 35 | }, 36 | "repository": { 37 | "type": "git", 38 | "url": "https://github.com/signalwire/freeswitch.git" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /verto_communicator/src/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "login": "1008", 3 | "password": "1234" 4 | } 5 | -------------------------------------------------------------------------------- /verto_communicator/src/config.json.sample: -------------------------------------------------------------------------------- 1 | { 2 | "extension": "3500", 3 | "name": "Ken Rice", 4 | "email": "krice@freeswitch.org", 5 | "cid": "1008", 6 | "textTo": "1000", 7 | "login": "1008", 8 | "password": "1234", 9 | "autologin": "true", 10 | "autocall": "3500", 11 | "googlelogin": "true", 12 | "wsURL": "wss://gamma.tollfreegateway.com/wss2", 13 | "wsFallbackURL": "wss://gamma.tollfreegateway.com/wss2", 14 | "turnServer": { 15 | "urls": "turn:someturnserver.com:443?transport=tcp", 16 | "credential": "1234", 17 | "username": "username" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /verto_communicator/src/contributors.txt: -------------------------------------------------------------------------------- 1 | [ 2 | "Jonatas Oliveira ", 3 | "Ítalo Rossi ", 4 | "Stefan Yohansson ", 5 | "Victor Torres ", 6 | "João Mesquita ", 7 | "Ken Rice ", 8 | "Brian West " 9 | ] 10 | -------------------------------------------------------------------------------- /verto_communicator/src/css/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/css/images/ajax-loader.gif -------------------------------------------------------------------------------- /verto_communicator/src/css/images/icons-18-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/css/images/icons-18-black.png -------------------------------------------------------------------------------- /verto_communicator/src/css/images/icons-18-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/css/images/icons-18-white.png -------------------------------------------------------------------------------- /verto_communicator/src/css/images/icons-36-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/css/images/icons-36-black.png -------------------------------------------------------------------------------- /verto_communicator/src/css/images/icons-36-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/css/images/icons-36-white.png -------------------------------------------------------------------------------- /verto_communicator/src/css/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/css/images/loading.gif -------------------------------------------------------------------------------- /verto_communicator/src/css/images/login.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/css/images/login.gif -------------------------------------------------------------------------------- /verto_communicator/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/favicon.ico -------------------------------------------------------------------------------- /verto_communicator/src/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/ajax-loader.gif -------------------------------------------------------------------------------- /verto_communicator/src/images/browser-logos/chrome_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/browser-logos/chrome_128x128.png -------------------------------------------------------------------------------- /verto_communicator/src/images/browser-logos/firefox_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/browser-logos/firefox_128x128.png -------------------------------------------------------------------------------- /verto_communicator/src/images/browser-logos/opera_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/browser-logos/opera_128x128.png -------------------------------------------------------------------------------- /verto_communicator/src/images/icons-18-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/icons-18-black.png -------------------------------------------------------------------------------- /verto_communicator/src/images/icons-18-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/icons-18-white.png -------------------------------------------------------------------------------- /verto_communicator/src/images/icons-36-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/icons-36-black.png -------------------------------------------------------------------------------- /verto_communicator/src/images/icons-36-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/icons-36-white.png -------------------------------------------------------------------------------- /verto_communicator/src/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/loading.gif -------------------------------------------------------------------------------- /verto_communicator/src/images/login.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/images/login.gif -------------------------------------------------------------------------------- /verto_communicator/src/img/cc_banner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/img/cc_banner.gif -------------------------------------------------------------------------------- /verto_communicator/src/img/fs_logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/img/fs_logo_small.png -------------------------------------------------------------------------------- /verto_communicator/src/img/vc_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/img/vc_logo.png -------------------------------------------------------------------------------- /verto_communicator/src/img/verto_black_web.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/img/verto_black_web.gif -------------------------------------------------------------------------------- /verto_communicator/src/locales/locale-da.json: -------------------------------------------------------------------------------- 1 | { 2 | "TITLE_ACTIVE_CALL": "Ups, der er et aktivt opkald.", 3 | "MESSAGE_ACTIVE_CALL_HANGUP": "Du er allerede i et opkald. Vil du lægge på?", 4 | "MESSAGE_ACTIVE_CALL_BACK": "Det ser ud til du sidste gang var i et opkald. Vil du tilbage til det?", 5 | "TITLE_INCOMING_CALL": "Indkommende kald", 6 | "MESSAGE_INCOMING_CALL": "Fra ", 7 | "MESSAGE_NO_HANGUP_CALL": "Der er ikke noget opkald at lægge på.", 8 | "MESSAGE_ENTER_FILENAME": "Vær venlig at indtaste filnavnet", 9 | "TITLE_ENABLE_VIDEO": "Vil du slå video til for dette opkald?", 10 | "MESSAGE_ENABLE_VIDEO": "Video vil være slået til for de næste opkald.", 11 | "TITLE_INSERT_BANNER": "Vær venlig at indsætte bannerteksten", 12 | "TITLE_INSERT_CANVAS_ID": "Vær venlig at indsætte Canvas Id'et", 13 | "TITLE_INSERT_LAYER": "Vær venlig at indsætte laget", 14 | "TITLE_TRANSFER": "Viderestil gruppen?", 15 | "MESSAGE_TRANSFER": "Til hvilken destination vil du viderestille opkaldet?", 16 | "LABEL_TRANSFER": "Destination", 17 | "MESSAGE_DISPLAY_SETTINGS": "Det er ikke muligt at vise eksempelvisnings indstillinger under et kald", 18 | "BUTTON_END_CALL": "Afslut kald", 19 | "BUTTON_CLOSE": "Luk", 20 | "MESSAGE_PLAY": "Afspil", 21 | "MESSAGE_STOP": "Stop", 22 | "MESSAGE_RECORD": "Optag", 23 | "MESSAGE_STOP_RECORD": "Stop med at optage", 24 | "MESSAGE_SNAPSHOT": "Snapshot", 25 | "MESSAGE_VIDEO_MODE": "Videotilstand", 26 | "MESSAGE_MUTE_MIC": "Slå mikrofon til/fra", 27 | "MESSAGE_MUTE_VIDEO": "Slå video til/fra", 28 | "MESSAGE_FULLSCREEN": "Skift fuldskærmstilstand", 29 | "MESSAGE_SCREENSHARE": "Skærmdeling", 30 | "MESSAGE_OPEN_CLOSE_CHAT": "Åben/luk chat", 31 | "MESSAGE_SPEAKER": "Højtaler", 32 | "MESSAGE_POPUP": "Popup", 33 | "CHAT_TITLE_MEMBERS": "Medlemmer", 34 | "CHAT_TITLE": "Chat", 35 | "CHAT_NO_MEMBERS": "Der er ingen medlemmer at vise.", 36 | "CHAT_GENERAL": "Generel", 37 | "CHAT_TITLE_KICK": "Fjern", 38 | "CHAT_KICK": "Fjern", 39 | "CHAT_TITLE_VIDEO_FLOOR": "Video niveau", 40 | "CHAT_FLOOR": "Niveau", 41 | "CHAT_TITLE_TRANSFER": "Viderestil", 42 | "CHAT_TRANSFER": "Viderestil", 43 | "CHAT_BANNER": "Banner", 44 | "CHAT_TITLE_SET": "Sæt", 45 | "CHAT_SET": "Sæt", 46 | "CHAT_TITLE_RESET": "Nulstil", 47 | "CHAT_RESET": "Nulstil", 48 | "CHAT_CANVAS": "Canvas", 49 | "CHAT_CANVAS_IN": "Canvas ind", 50 | "CHAT_CANVAS_OUT": "Canvas ud", 51 | "CHAT_PREV": "Forrige", 52 | "CHAT_NEXT": "Næste", 53 | "CHAT_LAYER": "Lag", 54 | "CHAT_AUDIO_VIDEO": "Lyd/Video", 55 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "Slå mikrofon til/fra", 56 | "CHAT_MUTE_MIC": "Slå mikrofon fra", 57 | "CHAT_UNMUTE_MIC": "Slå mikrofon til", 58 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "Slå video til/fra", 59 | "CHAT_NO_MESSAGES": "Der er ingen beskeder at vise.", 60 | "CHAT_SEND_MESSAGE": "Send", 61 | "CHAT_TYPE_MESSAGE": "Skriv din besked her...", 62 | "TITLE_CONTRIBUTORS": "Bidragsydere", 63 | "MESSAGE_CONNECTION_UNTRUSTED": "Denne forbindelse er ikke til at stole på.", 64 | "MESSAGE_TOGGLE_NAVIGATION": "Vis/skjul navigation", 65 | "BANDWIDTH_INFO": "Båndbredde information", 66 | "BANDWIDTH_INFO_INCOMING": "Indkommende:", 67 | "BANDWIDTH_INFO_OUTGOING": "Udgående:", 68 | "BANDWIDTH_INFO_VIDEO_RES": "Video opløsning:", 69 | "IN_CALL": "I opkald:", 70 | "LAST_CALL": "Sidste opkald:", 71 | "OPEN_NEW_WINDOW": "Åben nyt vindue", 72 | "CHANGE_LOGIN_INFO": "Rediger loginoplysninger", 73 | "LOGOUT": "Log ud", 74 | "ABOUT": "Om", 75 | "HELP": "Hjælp", 76 | "CONTRIBUTORS": "Bidragsydere", 77 | "TITLE_PREVIEW_SETTINGS": "Opsæt indstillinger for kamera og mikrofon", 78 | "CAMERA__SETTNGS": "Kamera:", 79 | "MIC_SETTINGS": "Mikrofon:", 80 | "SAVE": "Gem", 81 | "LOADING": "Henter", 82 | "ERRORS" : "Fejl", 83 | "CALLING_TO": "Ringer til ", 84 | "CANCELLING": "Annullerer...", 85 | "DETERMINING_SPEED": "Bestemmer din hastighed...", 86 | "CALL_HISTORY": "Opkaldshistorik", 87 | "CLEAR_CALL_HISTORY": "Ryd historik", 88 | "NO_CALL_HISTORY": "Ingen opkaldshistorik.", 89 | "ENTER_EXTENSION": "Skriv en udvidelse", 90 | "CALL_EXTENSION": "Opkaldsudvidelse", 91 | "LOGIN": "Log ind", 92 | "LOGIN_INFORMATION": "Log ind oplysninger", 93 | "SAVE_LOGIN_INFORMATION": "Gem log ind oplysninger", 94 | "INVALID_LOGIN_FIELDS": "Kontroller felterne nedenfor og prøv igen.", 95 | "NAME": "Navn", 96 | "YOUR_NAME": "Dit navn", 97 | "EMAIL": "Email", 98 | "YOUR_EMAIL": "Din email", 99 | "USER": "Bruger", 100 | "PASSWORD": "Adgangskode", 101 | "CALLER_ID": "Den ringende parts ID", 102 | "HOSTNAME": "Hostname", 103 | "WEBSOCKET_URL": "Websocket URL", 104 | "SETTINGS": "Indstillinger", 105 | "DEVICE_SETTINGS": "Enhedsindstillinger", 106 | "SHARE_DEVICE": "Del enhed", 107 | "SPEAKER": "Højtaler:", 108 | "SPEAKER_FEATURE": "Din browser understøtter ikke denne funktion", 109 | "PREVIEW_SETTINGS": "Vis indstillingerne", 110 | "REFRESH_DEVICE_LIST": "Opdater enhedslisten", 111 | "GENERAL_SETTINGS": "Generelle indstillinger:", 112 | "USE_VIDEO": "Brug video", 113 | "USE_STEREO_AUDIO": "Stereolyd", 114 | "USE_STUN": "Brug STUN", 115 | "SCALE_VIDEO": "Skalér video til at matche kameraopløsningen", 116 | "ASK_BEFORE_RECOVER": "Spørg før genetablering af kald", 117 | "BEST_FRAME_RATE": "Bedste billedhastighed:", 118 | "AUDIO_SETTINGS": "Lydindstillinger:", 119 | "ECHO_CANCEL": "Fjernelse af ekko", 120 | "NOISE_SUPPRESSION": "Støjdæmpning", 121 | "HIGHPASS_FILTER": "High-pass filter", 122 | "VIDEO_SETTINGS": "Videoindstillinger:", 123 | "REMOTE_ENCODER": "Dedikeret fjern-enkoder er aktiveret.", 124 | "AUTO_SPEED_RES": "Bestem automatisk indstillinger for hastighed og opløsning", 125 | "RECHECK_BANDWIDTH": "Tjek båndbredden før hvert udgående opkald", 126 | "CHECK_NETWORK_SPEED": "Tjek netværkshastighed", 127 | "VIDEO_QUALITY": "Videokvalitet:", 128 | "MAX_INCOMING_BANDWIDTH": "Max indgående båndbredde:", 129 | "MAX_OUTGOING_BANDWIDTH": "Max udgående båndbredde:", 130 | "FACTORY_RESET": "Nulstil til fabriksindstillinger", 131 | "SAVE_DEVICE_SETTINGS": "Gem enhedsindstillinger", 132 | "BROWSER_COMPATIBILITY": "Tjek browser kompatibilitet.", 133 | "REFRESH_MEDIA_DEVICES": "Opdater medieenhed.", 134 | "BROWSER_WITHOUT_WEBRTC": "Fejk: browseren understøtter ikke WebRTC.", 135 | "CHECK_PERMISSION_MEDIA": "Tjekker medie tilladelser", 136 | "CHECK_PROVISIONING_CONF": "Konfiguration af provisionering.", 137 | "CHECK_LOGIN": "Tjekker log ind oplysninger.", 138 | "CHECK_CONNECTION_SPEED": "Tjek forbindelseshastighed.", 139 | "ERROR_PERMISSION_MEDIA": "Fejl: Medie tilladelse nægtet", 140 | "ERROR_PROVISIONING_CONF": "Fejl: Provisioneringen fejlede.", 141 | "PLEASE_WAIT": "Vent venligst..." 142 | } 143 | -------------------------------------------------------------------------------- /verto_communicator/src/locales/locale-de.json: -------------------------------------------------------------------------------- 1 | { 2 | "TITLE_ACTIVE_CALL": "Oops, actives Gespräch in Bearbeitung.", 3 | "MESSAGE_ACTIVE_CALL_HANGUP": "Es wärst du bereits in einer Konversation. Konversation beenden?", 4 | "MESSAGE_ACTIVE_CALL_BACK": "Es scheint als warst du in einer Konversation bevor die Sitzung beendet wurde. Diese Konversation fortsetzen?", 5 | "TITLE_INCOMING_CALL": "Eingehender Anruf", 6 | "MESSAGE_INCOMING_CALL": "Von ", 7 | "MESSAGE_NO_HANGUP_CALL": "Es gibt keine Gespräche die beendet werden können.", 8 | "MESSAGE_ENTER_FILENAME": "Bitte, Dateinamen eingeben", 9 | "TITLE_ENABLE_VIDEO": "Video für dieses Gespräch aktivieren?", 10 | "MESSAGE_ENABLE_VIDEO": "Video wird für die nächsten Gespräche aktiviert werden.", 11 | "TITLE_INSERT_BANNER": "Bitte Banner text eingeben", 12 | "TITLE_INSERT_CANVAS_ID": "Bitte Canvas ID eingeben", 13 | "TITLE_INSERT_LAYER": "Please insert the Layer", 14 | "TITLE_TRANSFER": "Gespräch weiterleiten?", 15 | "MESSAGE_TRANSFER": "Welches Ziel soll die Weiterleitung haben?", 16 | "LABEL_TRANSFER": "Ziel", 17 | "MESSAGE_DISPLAY_SETTINGS": "Die Vorschau Einstellungen können während eines Gesprächs nicht angezeigt werden", 18 | "BUTTON_END_CALL": "Anruf beenden", 19 | "BUTTON_CLOSE": "Schließen", 20 | "MESSAGE_PLAY": "Wiedergabe", 21 | "MESSAGE_STOP": "Stoppen", 22 | "MESSAGE_RECORD": "Aufnahme", 23 | "MESSAGE_STOP_RECORD": "Aufnahme beenden", 24 | "MESSAGE_SNAPSHOT": "Snapshot", 25 | "MESSAGE_VIDEO_MODE": "Video Modus", 26 | "MESSAGE_MUTE_MIC": "Mikrofon ein/ausschalten", 27 | "MESSAGE_MUTE_VIDEO": "Video ein/ausschalten", 28 | "MESSAGE_FULLSCREEN": "Vollbildmodus ein/ausschalten", 29 | "MESSAGE_SCREENSHARE": "Bildschirm teilen", 30 | "MESSAGE_OPEN_CLOSE_CHAT": "Chat öffnen/schließen", 31 | "MESSAGE_SPEAKER": "Lautsprecher", 32 | "MESSAGE_POPUP": "Popup", 33 | "CHAT_TITLE_MEMBERS": "Teilnehmer", 34 | "CHAT_TITLE": "Chat", 35 | "CHAT_NO_MEMBERS": "Es gibt keine Mitglieder zum anzeigen.", 36 | "CHAT_GENERAL": "Generell", 37 | "CHAT_TITLE_KICK": "Kick", 38 | "CHAT_KICK": "Kick", 39 | "CHAT_TITLE_VIDEO_FLOOR": "Video Floor", 40 | "CHAT_FLOOR": "Floor", 41 | "CHAT_TITLE_TRANSFER": "Weiterleiten", 42 | "CHAT_TRANSFER": "Weiterleiten", 43 | "CHAT_BANNER": "Banner", 44 | "CHAT_TITLE_SET": "Set", 45 | "CHAT_SET": "Set", 46 | "CHAT_TITLE_RESET": "Resetieren", 47 | "CHAT_RESET": "Resetieren", 48 | "CHAT_CANVAS": "Canvas", 49 | "CHAT_CANVAS_IN": "Canvas In", 50 | "CHAT_CANVAS_OUT": "Canvas Out", 51 | "CHAT_PREV": "Zurück", 52 | "CHAT_NEXT": "Weiter", 53 | "CHAT_LAYER": "Layer", 54 | "CHAT_AUDIO_VIDEO": "Audio/Video", 55 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "Mikrofon ein/ausschalten", 56 | "CHAT_MUTE_MIC": "stumm schalten", 57 | "CHAT_UNMUTE_MIC": "stummschaltung deaktivieren", 58 | "CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Stummschaltung ein/ausschalten", 59 | "CHAT_NO_MESSAGES": "Es gibt keine Nachrichten zum anzeigen.", 60 | "CHAT_SEND_MESSAGE": "Absenden", 61 | "CHAT_TYPE_MESSAGE": "Nachricht kann hier eingegeben werden...", 62 | "TITLE_CONTRIBUTORS": "Mitwirkende", 63 | "MESSAGE_CONNECTION_UNTRUSTED": "Die Verbindung ist ungesichert.", 64 | "MESSAGE_TOGGLE_NAVIGATION": "Navigation umschalten", 65 | "BANDWIDTH_INFO": "Info Bandbreite", 66 | "BANDWIDTH_INFO_INCOMING": "Eingehend:", 67 | "BANDWIDTH_INFO_OUTGOING": "Ausgehend:", 68 | "BANDWIDTH_INFO_VIDEO_RES": "Video Auflösung:", 69 | "IN_CALL": "Im Gespräch:", 70 | "LAST_CALL": "Letzter Anruf:", 71 | "OPEN_NEW_WINDOW": "Neues Fenster öffnen", 72 | "CHANGE_LOGIN_INFO": "Anmeldedaten verändern", 73 | "LOGOUT": "Abmelden", 74 | "ABOUT": "Über", 75 | "HELP": "Hilfe", 76 | "CONTRIBUTORS": "Mitwirkende", 77 | "TITLE_PREVIEW_SETTINGS": "Kamera und Mikrofon Einstellungen", 78 | "CAMERA_SETTINGS": "Kamera:", 79 | "MIC_SETTINGS": "Mikrofon:", 80 | "SAVE": "Speichern", 81 | "LOADING": "Ladend", 82 | "ERRORS" : "Fehler", 83 | "CALLING_TO": "Gesprächsaufbau zu ", 84 | "CANCELLING": "Abbrechen...", 85 | "DETERMINING_SPEED": "Geschwindigkeit wird analysiert...", 86 | "CALL_HISTORY": "Gesprächsverlauf", 87 | "CLEAR_CALL_HISTORY": "Gesprächsverlauf löschen", 88 | "NO_CALL_HISTORY": "Kein Gesprächsverlauf vorhanden.", 89 | "ENTER_EXTENSION": "Nummer eingeben", 90 | "CALL_EXTENSION": "Nummer anrufen", 91 | "LOGIN": "Anmelden", 92 | "LOGIN_INFORMATION": "Anmeldeinformationen", 93 | "SAVE_LOGIN_INFORMATION": "Anmeldeinformationen speichern", 94 | "INVALID_LOGIN_FIELDS": "Bitte die unteren Felder kontrollieren und erneut versuchen.", 95 | "NAME": "Name", 96 | "YOUR_NAME": "Dein Name", 97 | "EMAIL": "E-Mail", 98 | "YOUR_EMAIL": "Deine E-Mail", 99 | "USER": "Benutzer", 100 | "PASSWORD": "Passwort", 101 | "CALLER_ID": "Anrufer ID", 102 | "HOSTNAME": "Hostname", 103 | "WEBSOCKET_URL": "Websocket URL", 104 | "SETTINGS": "Einstellungen", 105 | "DEVICE_SETTINGS": "Geräte Einstellungen", 106 | "SHARE_DEVICE": "Gerät teilen", 107 | "SPEAKER": "Lautsprecher:", 108 | "SPEAKER_FEATURE": "Dein browser scheint diese Funktion nicht zu unterstützen", 109 | "PREVIEW_SETTINGS": "Vorschau Einstellungen", 110 | "REFRESH_DEVICE_LIST": "Aktualisieren Geräteliste", 111 | "GENERAL_SETTINGS": "Generelle Einstellungen:", 112 | "USE_VIDEO": "Video aktivieren", 113 | "USE_STEREO_AUDIO": "Stereo Audio", 114 | "USE_STUN": "STUN benützen", 115 | "SCALE_VIDEO": "Entfernte Kamera skalieren damit die Auflösung zusammenpasst", 116 | "ASK_BEFORE_RECOVER": "Nachfrage bevor das Gespräch wiederhergestellt wird", 117 | "BEST_FRAME_RATE": "Beste frame rate:", 118 | "AUDIO_SETTINGS": "Audio Einstellungen:", 119 | "ECHO_CANCEL": "Echo Cancellation", 120 | "NOISE_SUPPRESSION": "Noise Suppression", 121 | "HIGHPASS_FILTER": "Highpass Filter", 122 | "VIDEO_SETTINGS": "Video Einstellungen:", 123 | "REMOTE_ENCODER": "Dedicated Remote Encoder enabled.", 124 | "AUTO_SPEED_RES": "Automatisch geschwindigkeit messen und Auflösung einstellen", 125 | "RECHECK_BANDWIDTH": "Recheck bandwidth before each outgoing call", 126 | "CHECK_NETWORK_SPEED": "Netzwerk Geschwindigkeit messen", 127 | "VIDEO_QUALITY": "Video Qualität:", 128 | "MAX_INCOMING_BANDWIDTH": "Max eingehnde Bandbreite:", 129 | "MAX_OUTGOING_BANDWIDTH": "Max ausgehende Bandbreite:", 130 | "FACTORY_RESET": "Werkseinstellungen", 131 | "SAVE_DEVICE_SETTINGS": "Geräteeinstellungen speichern", 132 | "BROWSER_COMPATIBILITY": "Browserkompatibilität prüfen.", 133 | "REFRESH_MEDIA_DEVICES": "Aktualisiern Medien Geräte.", 134 | "BROWSER_WITHOUT_WEBRTC": "Fehler: Browser unterstützt kein WebRTC.", 135 | "CHECK_PERMISSION_MEDIA": "Medien berechtigungen prüfen", 136 | "CHECK_PROVISIONING_CONF": "Provisioning Konfiguration.", 137 | "CHECK_LOGIN": "Anmeldung verifizieren.", 138 | "CHECK_CONNECTION_SPEED": "Verbindungsgeschwindikeit prüfen.", 139 | "ERROR_PERMISSION_MEDIA": "Fehler: Medien Berechtigung fehlgeschlagen", 140 | "ERROR_PROVISIONING_CONF": "Fehler: Provisioning fehlgeschlagen.", 141 | "PLEASE_WAIT": "Bitte warten...", 142 | "CANCEL": "Abbrechen", 143 | "CHAT_TITLE_VOL_MINUS": "Lautstärke -", 144 | "CHAT_TITLE_VOL_PLUS": "Lautstärke +", 145 | "CHAT_TITLE_GAIN_MINUS": "Gain -", 146 | "CHAT_TITLE_GAIN_PLUS": "Gain +", 147 | "CHAT_VOL_MINUS": "Lautstärke -", 148 | "CHAT_VOL_PLUS": "Lautstärke +", 149 | "CHAT_GAIN_MINUS": "Gain -", 150 | "CHAT_GAIN_PLUS": "Gain +" 151 | } 152 | -------------------------------------------------------------------------------- /verto_communicator/src/locales/locale-en.json: -------------------------------------------------------------------------------- 1 | { 2 | "TITLE_ACTIVE_CALL": "Oops, Active Call in Course.", 3 | "MESSAGE_ACTIVE_CALL_HANGUP": "It seems that you are in a call. Do you want to hang up?", 4 | "MESSAGE_ACTIVE_CALL_BACK": "It seems you were in a call before leaving the last time. Wanna go back to that?", 5 | "TITLE_INCOMING_CALL": "Incoming Call", 6 | "MESSAGE_INCOMING_CALL": "from ", 7 | "MESSAGE_NO_HANGUP_CALL": "There is no call to hangup.", 8 | "MESSAGE_ENTER_FILENAME": "Please, enter filename", 9 | "TITLE_ENABLE_VIDEO": "Would you like to activate video for this call?", 10 | "MESSAGE_ENABLE_VIDEO": "Video will be active during the next calls.", 11 | "TITLE_INSERT_BANNER": "Please insert the banner text", 12 | "TITLE_INSERT_CANVAS_ID": "Please insert the Canvas Id", 13 | "TITLE_INSERT_LAYER": "Please insert the Layer", 14 | "TITLE_TRANSFER": "Transfer party?", 15 | "MESSAGE_TRANSFER": "To what destination would you like to transfer this call?", 16 | "LABEL_TRANSFER": "Destination", 17 | "MESSAGE_DISPLAY_SETTINGS": "Can't display preview settings during a call", 18 | "BUTTON_END_CALL": "End Call", 19 | "BUTTON_CLOSE": "Close", 20 | "MESSAGE_PLAY": "Play", 21 | "MESSAGE_STOP": "Stop", 22 | "MESSAGE_RECORD": "Record", 23 | "MESSAGE_STOP_RECORD": "Stop Record", 24 | "MESSAGE_SNAPSHOT": "Snapshot", 25 | "MESSAGE_VIDEO_MODE": "Video Mode", 26 | "MESSAGE_MUTE_MIC": "(un)Mute Mic", 27 | "MESSAGE_MUTE_VIDEO": "(un)Mute Video", 28 | "MESSAGE_FULLSCREEN": "Toggle Fullscreen Mode", 29 | "MESSAGE_SCREENSHARE": "Screenshare", 30 | "MESSAGE_OPEN_CLOSE_CHAT": "Open/Close Chat", 31 | "MESSAGE_SPEAKER": "Speaker", 32 | "MESSAGE_POPUP": "Popup", 33 | "CHAT_TITLE_MEMBERS": "Members", 34 | "CHAT_TITLE": "Chat", 35 | "CHAT_NO_MEMBERS": "There are no members to show.", 36 | "CHAT_GENERAL": "General", 37 | "CHAT_TITLE_KICK": "Kick", 38 | "CHAT_KICK": "Kick", 39 | "CHAT_TITLE_VIDEO_FLOOR": "Video Floor", 40 | "CHAT_FLOOR": "Floor", 41 | "CHAT_TITLE_TRANSFER": "Transfer", 42 | "CHAT_TRANSFER": "Transfer", 43 | "CHAT_BANNER": "Banner", 44 | "CHAT_TITLE_SET": "Set", 45 | "CHAT_SET": "Set", 46 | "CHAT_TITLE_RESET": "Reset", 47 | "CHAT_RESET": "Reset", 48 | "CHAT_CANVAS": "Canvas", 49 | "CHAT_CANVAS_IN": "Canvas In", 50 | "CHAT_CANVAS_OUT": "Canvas Out", 51 | "CHAT_PREV": "Prev", 52 | "CHAT_NEXT": "Next", 53 | "CHAT_LAYER": "Layer", 54 | "CHAT_AUDIO_VIDEO": "Audio/Video", 55 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "Mute/Unmute Mic", 56 | "CHAT_MUTE_MIC": "Mute", 57 | "CHAT_UNMUTE_MIC": "Unmute", 58 | "CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Mute/Unmute Video", 59 | "CHAT_NO_MESSAGES": "There are no messages to show.", 60 | "CHAT_SEND_MESSAGE": "Send", 61 | "CHAT_TYPE_MESSAGE": "Type your message here...", 62 | "TITLE_CONTRIBUTORS": "Contributors", 63 | "MESSAGE_CONNECTION_UNTRUSTED": "This Connection is Untrusted.", 64 | "MESSAGE_TOGGLE_NAVIGATION": "Toggle navigation", 65 | "BANDWIDTH_INFO": "Bandwidth Info", 66 | "BANDWIDTH_INFO_INCOMING": "Incoming:", 67 | "BANDWIDTH_INFO_OUTGOING": "Outgoing:", 68 | "BANDWIDTH_INFO_VIDEO_RES": "Video Resolution:", 69 | "IN_CALL": "In Call:", 70 | "LAST_CALL": "Last Call:", 71 | "OPEN_NEW_WINDOW": "Open New Window", 72 | "CHANGE_LOGIN_INFO": "Change Login Information", 73 | "LOGOUT": "Logout", 74 | "ABOUT": "About", 75 | "HELP": "Help", 76 | "CONTRIBUTORS": "Contributors", 77 | "TITLE_PREVIEW_SETTINGS": "Setup your camera and microphone settings", 78 | "CAMERA_SETTINGS": "Camera:", 79 | "MIC_SETTINGS": "Microphone:", 80 | "SAVE": "Save", 81 | "LOADING": "Loading", 82 | "ERRORS" : "Errors", 83 | "CALLING_TO": "Calling to ", 84 | "CANCELLING": "Cancelling...", 85 | "DETERMINING_SPEED": "Determining your speed...", 86 | "CALL_HISTORY": "Call History", 87 | "CLEAR_CALL_HISTORY": "Clear History", 88 | "NO_CALL_HISTORY": "No history calls.", 89 | "ENTER_EXTENSION": "Enter an extension", 90 | "CALL_EXTENSION": "Call Extension", 91 | "LOGIN": "Login", 92 | "LOGIN_INFORMATION": "Login Information", 93 | "SAVE_LOGIN_INFORMATION": "Save Login Information", 94 | "INVALID_LOGIN_FIELDS": "Verify the fields below and try again.", 95 | "INVALID_SETTINGS_FIELDS": "Verify the settings below and try again.", 96 | "NAME": "Name", 97 | "YOUR_NAME": "Your name", 98 | "EMAIL": "Email", 99 | "YOUR_EMAIL": "Your email", 100 | "USER": "User", 101 | "PASSWORD": "Password", 102 | "CALLER_ID": "Caller ID", 103 | "HOSTNAME": "Hostname", 104 | "WEBSOCKET_URL": "Websocket URL", 105 | "SETTINGS": "Settings", 106 | "DEVICE_SETTINGS": "Device Settings", 107 | "SHARE_DEVICE": "Share device", 108 | "SPEAKER": "Speaker:", 109 | "SPEAKER_FEATURE": "Your browser doesn't seem to support this feature", 110 | "PREVIEW_SETTINGS": "Preview Settings", 111 | "REFRESH_DEVICE_LIST": "Refresh device list", 112 | "GENERAL_SETTINGS": "General settings:", 113 | "USE_VIDEO": "Use Video", 114 | "USE_STEREO_AUDIO": "Stereo Audio", 115 | "USE_STUN": "Use STUN", 116 | "SCALE_VIDEO": "Scale Remote Video To Match Camera Resolution", 117 | "ASK_BEFORE_RECOVER": "Ask before recovering call", 118 | "BEST_FRAME_RATE": "Best frame rate:", 119 | "AUDIO_SETTINGS": "Audio settings:", 120 | "ECHO_CANCEL": "Echo Cancellation", 121 | "NOISE_SUPPRESSION": "Noise Suppression", 122 | "HIGHPASS_FILTER": "Highpass Filter", 123 | "VIDEO_SETTINGS": "Video settings:", 124 | "REMOTE_ENCODER": "Dedicated Remote Encoder enabled.", 125 | "AUTO_SPEED_RES": "Automatically determine speed and resolution settings", 126 | "RECHECK_BANDWIDTH": "Recheck bandwidth before each outgoing call", 127 | "CHECK_NETWORK_SPEED": "Check Network Speed", 128 | "CHECKING_NETWORK_SPEED": "Checking Network Speed", 129 | "VIDEO_QUALITY": "Video quality:", 130 | "MAX_INCOMING_BANDWIDTH": "Max incoming bandwidth:", 131 | "MAX_OUTGOING_BANDWIDTH": "Max outgoing bandwidth:", 132 | "FACTORY_RESET": "Factory reset", 133 | "SAVE_DEVICE_SETTINGS": "Save Device Settings", 134 | "BROWSER_COMPATIBILITY": "Checking browser compatibility.", 135 | "REFRESH_MEDIA_DEVICES": "Refresh Media Devices.", 136 | "BROWSER_WITHOUT_WEBRTC": "Error: browser doesn't support WebRTC.", 137 | "CHECK_PERMISSION_MEDIA": "Checking media permissions", 138 | "CHECK_PROVISIONING_CONF": "Provisioning configuration.", 139 | "CHECK_LOGIN": "Checking login.", 140 | "CHECK_CONNECTION_SPEED": "Check Connection Speed.", 141 | "ERROR_PERMISSION_MEDIA": "Error: Media Permission Denied", 142 | "ERROR_PROVISIONING_CONF": "Error: Provision failed.", 143 | "PLEASE_WAIT": "Please wait...", 144 | "CANCEL": "Cancel", 145 | "CHAT_TITLE_VOL_MINUS": "Volume -", 146 | "CHAT_TITLE_VOL_PLUS": "Volume +", 147 | "CHAT_TITLE_GAIN_MINUS": "Gain -", 148 | "CHAT_TITLE_GAIN_PLUS": "Gain +", 149 | "CHAT_TITLE_DEAF_UNDEAF": "Deaf/Undeaf", 150 | "CHAT_VOL_MINUS": "Vol -", 151 | "CHAT_VOL_PLUS": "Vol +", 152 | "CHAT_GAIN_MINUS": "Gain -", 153 | "CHAT_GAIN_PLUS": "Gain +", 154 | "CHAT_DEAF": "Deaf", 155 | "CHAT_UNDEAF": "Undeaf", 156 | "LANGUAGE": "Language:", 157 | "BROWSER_LANGUAGE": "Browser Language", 158 | "FACTORY_RESET_SETTINGS": "Factory Reset Settings", 159 | "AUTOGAIN_CONTROL": "Auto Gain Control", 160 | "WAITING_DEVICES": "Waiting for devices..." 161 | } 162 | -------------------------------------------------------------------------------- /verto_communicator/src/locales/locale-fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "TITLE_ACTIVE_CALL": "Oups, appel actif déjà en cours", 3 | "MESSAGE_ACTIVE_CALL_HANGUP": "Il semble que vous êtes déjà en communication. Voulez vous raccrocher ?", 4 | "MESSAGE_ACTIVE_CALL_BACK": "Il semblre que vous étiez déjà en appel avant de quitter la dernière fois, Voulez-vous retourner à cet appel ?", 5 | "TITLE_INCOMING_CALL": "Appel entrant", 6 | "MESSAGE_INCOMING_CALL": "De ", 7 | "MESSAGE_NO_HANGUP_CALL": "Il n'y as pas d'appels à raccrocher.", 8 | "MESSAGE_ENTER_FILENAME": "Veuillez entrer le nom de fichier", 9 | "TITLE_ENABLE_VIDEO": "Voulez vous activer la video pour cet appel?", 10 | "MESSAGE_ENABLE_VIDEO": "La vidéo sera activée pour les prochains appels.", 11 | "TITLE_INSERT_BANNER": "Merci d'insérer le texte de bannière", 12 | "TITLE_INSERT_CANVAS_ID": "Merci d'insérer l'ID du Canvas", 13 | "TITLE_INSERT_LAYER": "Merci d'insérer la couche", 14 | "TITLE_TRANSFER": "Transferer le correspondant ?", 15 | "MESSAGE_TRANSFER": "Vers quelle destination voulez vous transférer cet appel ?", 16 | "LABEL_TRANSFER": "Destination", 17 | "MESSAGE_DISPLAY_SETTINGS": "Nous ne pouvons afficher les paramêtres de prévisualisation pendant un appel", 18 | "BUTTON_END_CALL": "Terminer l'appel", 19 | "BUTTON_CLOSE": "Fermer", 20 | "MESSAGE_PLAY": "Jouer", 21 | "MESSAGE_STOP": "Stop", 22 | "MESSAGE_RECORD": "Enregistrer", 23 | "MESSAGE_STOP_RECORD": "Arrêter l'enregistrement", 24 | "MESSAGE_SNAPSHOT": "Capture d'écran", 25 | "MESSAGE_VIDEO_MODE": "Mode Video", 26 | "MESSAGE_MUTE_MIC": "(des)activer Micro", 27 | "MESSAGE_MUTE_VIDEO": "(des)activer Video", 28 | "MESSAGE_FULLSCREEN": "Basculer en mode plein écran", 29 | "MESSAGE_SCREENSHARE": "Partage d'écran", 30 | "MESSAGE_OPEN_CLOSE_CHAT": "Ouvrir/Fermer le chat", 31 | "MESSAGE_SPEAKER": "Orateur", 32 | "MESSAGE_POPUP": "Popup", 33 | "CHAT_TITLE_MEMBERS": "Membres", 34 | "CHAT_TITLE": "Chat", 35 | "CHAT_NO_MEMBERS": "Il n'y as pas de membres actuellement.", 36 | "CHAT_GENERAL": "General", 37 | "CHAT_TITLE_KICK": "Ejecter", 38 | "CHAT_KICK": "Ejecter", 39 | "CHAT_TITLE_VIDEO_FLOOR": "Video Floor", 40 | "CHAT_FLOOR": "Floor", 41 | "CHAT_TITLE_TRANSFER": "Transferer", 42 | "CHAT_TRANSFER": "Transferer", 43 | "CHAT_BANNER": "Bannière", 44 | "CHAT_TITLE_SET": "Set", 45 | "CHAT_SET": "Set", 46 | "CHAT_TITLE_RESET": "Reset", 47 | "CHAT_RESET": "Reset", 48 | "CHAT_CANVAS": "Canvas", 49 | "CHAT_CANVAS_IN": "Canvas In", 50 | "CHAT_CANVAS_OUT": "Canvas Out", 51 | "CHAT_PREV": "Précédent", 52 | "CHAT_NEXT": "Suivant", 53 | "CHAT_LAYER": "Couche", 54 | "CHAT_AUDIO_VIDEO": "Audio/Video", 55 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "Activer/Désactiver micro", 56 | "CHAT_MUTE_MIC": "Désactiver le micro", 57 | "CHAT_UNMUTE_MIC": "Activer le micro", 58 | "CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Activer/Désactiver video", 59 | "CHAT_NO_MESSAGES": "il n'y as pas de messages à afficher", 60 | "CHAT_SEND_MESSAGE": "Envoyer", 61 | "CHAT_TYPE_MESSAGE": "Saisir votre message ici...", 62 | "TITLE_CONTRIBUTORS": "Contributeurs", 63 | "MESSAGE_CONNECTION_UNTRUSTED": "Cette connection n'est pas certifiée sûre.", 64 | "MESSAGE_TOGGLE_NAVIGATION": "Basculer la navigation", 65 | "BANDWIDTH_INFO": "Information de bande passante", 66 | "BANDWIDTH_INFO_INCOMING": "Entrant:", 67 | "BANDWIDTH_INFO_OUTGOING": "Sortant:", 68 | "BANDWIDTH_INFO_VIDEO_RES": "Résolution vidéo:", 69 | "IN_CALL": "Appel en cours:", 70 | "LAST_CALL": "Dernier appel:", 71 | "OPEN_NEW_WINDOW": "Ouvrir une nouvelle fenêtre", 72 | "CHANGE_LOGIN_INFO": "Changer les informations utilisateur", 73 | "LOGOUT": "Deconnection", 74 | "ABOUT": "A propos", 75 | "HELP": "Aide", 76 | "CONTRIBUTORS": "Contributeurs", 77 | "TITLE_PREVIEW_SETTINGS": "Paramêtrer votre micro et caméra", 78 | "CAMERA_SETTINGS": "Camera:", 79 | "MIC_SETTINGS": "Microphone:", 80 | "SAVE": "Sauvegarder", 81 | "LOADING": "Chargement", 82 | "ERRORS" : "Erreurs", 83 | "CALLING_TO": "Appel sortant vers ", 84 | "CANCELLING": "Annulation en cours...", 85 | "DETERMINING_SPEED": "En train de déterminer votre bande passante...", 86 | "CALL_HISTORY": "Historique d'appel", 87 | "CLEAR_CALL_HISTORY": "Effacer l'historique", 88 | "NO_CALL_HISTORY": "Pas d'historique d'appel", 89 | "ENTER_EXTENSION": "Saisir une extension", 90 | "CALL_EXTENSION": "Appeler une extension", 91 | "LOGIN": "Nom d'utilisateur:", 92 | "LOGIN_INFORMATION": "Information utilisateur", 93 | "SAVE_LOGIN_INFORMATION": "Sauvegarder les informations utilisateurs", 94 | "INVALID_LOGIN_FIELDS": "Vérifiez les champs ci dessous et rééssayez.", 95 | "NAME": "Nom", 96 | "YOUR_NAME": "Votre nom", 97 | "EMAIL": "Email", 98 | "YOUR_EMAIL": "Votre email", 99 | "USER": "Utilisateur", 100 | "PASSWORD": "mot de passe", 101 | "CALLER_ID": "Numéro Appelant", 102 | "HOSTNAME": "Nom de domaine", 103 | "WEBSOCKET_URL": "URL Websocket", 104 | "SETTINGS": "Paramêtres", 105 | "DEVICE_SETTINGS": "Paramêtres de l'appareil", 106 | "SHARE_DEVICE": "Partager le périphérique", 107 | "SPEAKER": "Orateur:", 108 | "SPEAKER_FEATURE": "Votre navigateur ne semble pas supporter cette fonctionnalité", 109 | "PREVIEW_SETTINGS": "Paramêtres de prévisualisation", 110 | "REFRESH_DEVICE_LIST": "Rafraichir la liste des périphériques", 111 | "GENERAL_SETTINGS": "Paramêtres généraux:", 112 | "USE_VIDEO": "Utiliser la vidéo", 113 | "USE_STEREO_AUDIO": "Audio stereo", 114 | "USE_STUN": "Utiliser STUN", 115 | "SCALE_VIDEO": "Ajuster la résolution de la vidéo distante pour correspondre à la résolution de la caméra", 116 | "ASK_BEFORE_RECOVER": "Demander avant de récupérer un appel", 117 | "BEST_FRAME_RATE": "Meilleur taux de rafraichissement:", 118 | "AUDIO_SETTINGS": "Paramêtres audio:", 119 | "ECHO_CANCEL": "Anti-echo", 120 | "NOISE_SUPPRESSION": "Suppression du bruit", 121 | "HIGHPASS_FILTER": "Filtre passe-haut:", 122 | "VIDEO_SETTINGS": "Paramêtres vidéo:", 123 | "REMOTE_ENCODER": "Encodeur distant dédié activé", 124 | "AUTO_SPEED_RES": "Détecter automatiquement les paramêtres de bande passante et de résolution vidéo", 125 | "RECHECK_BANDWIDTH": "Revérifier la bande passante avant chaque appel", 126 | "CHECK_NETWORK_SPEED": "Verification de la vitesse de connection.", 127 | "VIDEO_QUALITY": "Qualité vidéo:", 128 | "MAX_INCOMING_BANDWIDTH": "Bande passante entrante maximale:", 129 | "MAX_OUTGOING_BANDWIDTH": "Bande passante sortante maximale:", 130 | "FACTORY_RESET": "Remise aux paramêtres par défaut", 131 | "SAVE_DEVICE_SETTINGS": "Sauvegarder les paramêtres de l'appareil.", 132 | "BROWSER_COMPATIBILITY": "Vérification de la compatibilité du navigateur.", 133 | "REFRESH_MEDIA_DEVICES": "Rafraichir les périphériques multimédias.", 134 | "BROWSER_WITHOUT_WEBRTC": "Erreur: votre navigateur ne supporte pas WebRTC.", 135 | "CHECK_PERMISSION_MEDIA": "Vérification des permissions multimédias", 136 | "CHECK_PROVISIONING_CONF": "Vérification de la configuration.", 137 | "CHECK_LOGIN": "Vérification du nom d'utilisateur", 138 | "CHECK_CONNECTION_SPEED": "Vérifiez votre vitesse de connection à Internet.", 139 | "ERROR_PERMISSION_MEDIA": "Erreur: La permission d'accéder aux périphériques multimedia as été refusée", 140 | "ERROR_PROVISIONING_CONF": "Erreur: La configuration as échouée.", 141 | "PLEASE_WAIT": "Merci de patienter...", 142 | "CANCEL": "Annuler" 143 | } 144 | -------------------------------------------------------------------------------- /verto_communicator/src/locales/locale-id.json: -------------------------------------------------------------------------------- 1 | { 2 | "TITLE_ACTIVE_CALL": "Waduh, Panggilan sedang berlangsung .", 3 | "MESSAGE_ACTIVE_CALL_HANGUP": "Tampaknya kamu sedang dalam percakapan. Mau diputus?", 4 | "MESSAGE_ACTIVE_CALL_BACK": "Sebelum ini, Tampaknya kamu sedang dalam percakapan. Mau disambungkan lagi?", 5 | "TITLE_INCOMING_CALL": "Panggilan masuk", 6 | "MESSAGE_INCOMING_CALL": "dari ", 7 | "MESSAGE_NO_HANGUP_CALL": "Tidak ada panggilan yang perlu diputus.", 8 | "MESSAGE_ENTER_FILENAME": "Silahkan masukan nama file", 9 | "TITLE_ENABLE_VIDEO": "Apakah anda ingin mengaktifkan Video di panggilan ini?", 10 | "MESSAGE_ENABLE_VIDEO": "Video akan diaktifkan di panggilan berikutnya.", 11 | "TITLE_INSERT_BANNER": "Silahkan isi dengan teks banner", 12 | "TITLE_INSERT_CANVAS_ID": "Silahkan isi dengan id canvas", 13 | "TITLE_INSERT_LAYER": "Silahkan isi dengan layer", 14 | "TITLE_TRANSFER": "Panggilan dialihkan?", 15 | "MESSAGE_TRANSFER": "Kemana panggilan anda ingin dialihkan?", 16 | "LABEL_TRANSFER": "Tujuan", 17 | "MESSAGE_DISPLAY_SETTINGS": "Tidak dapat mereview setelan, selama dalam panggilan", 18 | "BUTTON_END_CALL": "Mengakhiri Panggilan", 19 | "BUTTON_CLOSE": "Tutup", 20 | "MESSAGE_PLAY": "Mainkan", 21 | "MESSAGE_STOP": "Hentikan", 22 | "MESSAGE_RECORD": "Catat", 23 | "MESSAGE_STOP_RECORD": "Hentikan Pencatatan", 24 | "MESSAGE_SNAPSHOT": "Jepret", 25 | "MESSAGE_VIDEO_MODE": "Mode Video", 26 | "MESSAGE_MUTE_MIC": "(tidak)Aktifkan Mic", 27 | "MESSAGE_MUTE_VIDEO": "(tidak)Aktifkan Video", 28 | "MESSAGE_FULLSCREEN": "Pilihan Mode Layar Penuh", 29 | "MESSAGE_SCREENSHARE": "Berbagi Layar", 30 | "MESSAGE_OPEN_CLOSE_CHAT": "Buka/Tutup Obrolan", 31 | "MESSAGE_SPEAKER": "Speaker", 32 | "MESSAGE_POPUP": "Muncul", 33 | "CHAT_TITLE_MEMBERS": "Anggota", 34 | "CHAT_TITLE": "Obrolan", 35 | "CHAT_NO_MEMBERS": "Tidak ada anggota untuk ditampilkan.", 36 | "CHAT_GENERAL": "Umum", 37 | "CHAT_TITLE_KICK": "Tendang", 38 | "CHAT_KICK": "Tendang", 39 | "CHAT_TITLE_VIDEO_FLOOR": "Video Latar", 40 | "CHAT_FLOOR": "Latar", 41 | "CHAT_TITLE_TRANSFER": "Alihkan", 42 | "CHAT_TRANSFER": "Alihkan", 43 | "CHAT_BANNER": "Banner", 44 | "CHAT_TITLE_SET": "Setelan", 45 | "CHAT_SET": "Setelan", 46 | "CHAT_TITLE_RESET": "Atur Ulang", 47 | "CHAT_RESET": "Atur Ulang", 48 | "CHAT_CANVAS": "Canvas", 49 | "CHAT_CANVAS_IN": "Canvas Masuk", 50 | "CHAT_CANVAS_OUT": "Canvas Keluar", 51 | "CHAT_PREV": "Sebelumnya", 52 | "CHAT_NEXT": "Berikutnya", 53 | "CHAT_LAYER": "Layer", 54 | "CHAT_AUDIO_VIDEO": "Suara/Video", 55 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "Matikan/Aktifkan Mic", 56 | "CHAT_MUTE_MIC": "Matikan", 57 | "CHAT_UNMUTE_MIC": "Aktifkan", 58 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "Matikan/Aktifkan Video", 59 | "CHAT_NO_MESSAGES": "Tidak ada pesan yang perlu ditampilkan.", 60 | "CHAT_SEND_MESSAGE": "Kirim", 61 | "CHAT_TYPE_MESSAGE": "Ketik pesan kamu disini...", 62 | "TITLE_CONTRIBUTORS": "Penyumbang", 63 | "MESSAGE_CONNECTION_UNTRUSTED": "Sambungan ini tidak bisa dipercaya.", 64 | "MESSAGE_TOGGLE_NAVIGATION": "Pilihan navigasi", 65 | "BANDWIDTH_INFO": "Info Bandwith", 66 | "BANDWIDTH_INFO_INCOMING": "Panggilan Masuk:", 67 | "BANDWIDTH_INFO_OUTGOING": "Panggilan Keluar:", 68 | "BANDWIDTH_INFO_VIDEO_RES": "Resolusi Video:", 69 | "IN_CALL": "Dalam Panggilan:", 70 | "LAST_CALL": "Panggilan Terakhir:", 71 | "OPEN_NEW_WINDOW": "Buka Tampilan Baru", 72 | "CHANGE_LOGIN_INFO": "Ganti Informasi Login", 73 | "LOGOUT": "Keluar", 74 | "ABOUT": "Tentang", 75 | "HELP": "Bantuan", 76 | "CONTRIBUTORS": "Penyumbang", 77 | "TITLE_PREVIEW_SETTINGS": "Setel Kamera dan Mikrophone kamu", 78 | "CAMERA_SETTINGS": "Kamera:", 79 | "MIC_SETTINGS": "Mikrophone:", 80 | "SAVE": "Simpan", 81 | "LOADING": "Sedang di muat", 82 | "ERRORS" : "Kesalahan", 83 | "CALLING_TO": "Panggilan ke ", 84 | "CANCELLING": "Membatalkan...", 85 | "DETERMINING_SPEED": "Mengukur kecepatan kamu...", 86 | "CALL_HISTORY": "Riwayat Panggilan", 87 | "CLEAR_CALL_HISTORY": "Hapus Riwayat", 88 | "NO_CALL_HISTORY": "Tidak ada Riwayat Panggilan.", 89 | "ENTER_EXTENSION": "Ketikkan Nomer Ekstensi", 90 | "CALL_EXTENSION": "Panggilan Ke Nomer Ekstensi", 91 | "LOGIN": "Login", 92 | "LOGIN_INFORMATION": "Informasi Login", 93 | "SAVE_LOGIN_INFORMATION": "Simpan Informasi Login", 94 | "INVALID_LOGIN_FIELDS": "Periksa isian dibawah ini dan periksa lagi.", 95 | "NAME": "Nama", 96 | "YOUR_NAME": "Nama kamu", 97 | "EMAIL": "Email", 98 | "YOUR_EMAIL": "Email kamu", 99 | "USER": "User", 100 | "PASSWORD": "Password", 101 | "CALLER_ID": "ID Pemanggil", 102 | "HOSTNAME": "Hostname", 103 | "WEBSOCKET_URL": "Websocket URL", 104 | "SETTINGS": "Setelan", 105 | "DEVICE_SETTINGS": "Setelan Perangkat", 106 | "SHARE_DEVICE": "Berbagi Perangkat", 107 | "SPEAKER": "Speaker:", 108 | "SPEAKER_FEATURE": "Tampaknya browser kamu tidak mendukung feature ini", 109 | "PREVIEW_SETTINGS": "Mereview Setelan", 110 | "REFRESH_DEVICE_LIST": "Data ulang daftar perangkat", 111 | "GENERAL_SETTINGS": "Setelan Umum:", 112 | "USE_VIDEO": "Menggunakan Video", 113 | "USE_STEREO_AUDIO": "Suara Stereo", 114 | "USE_STUN": "Menggunakan STUN", 115 | "SCALE_VIDEO": "Menyesuaikan skala video sisi jauh dengan resolusi kamera", 116 | "ASK_BEFORE_RECOVER": "Bertanya sebelum memulihkan panggilan", 117 | "BEST_FRAME_RATE": "Kecepatan frame terbaik:", 118 | "AUDIO_SETTINGS": "Setelan Suara:", 119 | "ECHO_CANCEL": "Membuang Gema", 120 | "NOISE_SUPPRESSION": "Meminimalkan Gangguan", 121 | "HIGHPASS_FILTER": "Highpass Filter", 122 | "VIDEO_SETTINGS": "Setelan Video:", 123 | "REMOTE_ENCODER": "Encoder sisi jauh diaktifkan.", 124 | "AUTO_SPEED_RES": "Menentukan setelan kecepatan dan resolusi secara otomatis", 125 | "RECHECK_BANDWIDTH": "Memastikan bandwidth sebelum setiap panggilan keluar", 126 | "CHECK_NETWORK_SPEED": "Memastikan kecepatan Jaringan", 127 | "VIDEO_QUALITY": "Kualitas Video:", 128 | "MAX_INCOMING_BANDWIDTH": "Maksimum bandwith masuk:", 129 | "MAX_OUTGOING_BANDWIDTH": "Maksimum bandwith keluar:", 130 | "FACTORY_RESET": "Kembali ke Setelan Pabrik", 131 | "SAVE_DEVICE_SETTINGS": "Simpan Setelan Perngkat", 132 | "BROWSER_COMPATIBILITY": "Memastikan kecocokan browser.", 133 | "REFRESH_MEDIA_DEVICES": "Mendata ulang perangkat media.", 134 | "BROWSER_WITHOUT_WEBRTC": "Salah: browser tidak mendukung WebRTC.", 135 | "CHECK_PERMISSION_MEDIA": "Memastikan izin dari perangkat", 136 | "CHECK_PROVISIONING_CONF": "Konfigurasi Provisioning.", 137 | "CHECK_LOGIN": "Memastikan login.", 138 | "CHECK_CONNECTION_SPEED": "Memastikan kecepatan koneksi.", 139 | "ERROR_PERMISSION_MEDIA": "Salah: Izin media ditolak", 140 | "ERROR_PROVISIONING_CONF": "Salah: Provision gagal.", 141 | "PLEASE_WAIT": "Tunggu..." 142 | } 143 | 144 | -------------------------------------------------------------------------------- /verto_communicator/src/locales/locale-sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "TITLE_ACTIVE_CALL": "Hoppsan, Aktivt samtal pågår.", 3 | "MESSAGE_ACTIVE_CALL_HANGUP": "Det verkar som du är i ett samtal. Vill du lägga på?", 4 | "MESSAGE_ACTIVE_CALL_BACK": "Det verkar som du var i ett samtal innan du lämnade senast, vill du gå tillbaka till det?", 5 | "TITLE_INCOMING_CALL": "Inkommande Samtal", 6 | "MESSAGE_INCOMING_CALL": "från ", 7 | "MESSAGE_NO_HANGUP_CALL": "Det finns inget samtal att avsluta.", 8 | "MESSAGE_ENTER_FILENAME": "Ange filnamn", 9 | "TITLE_ENABLE_VIDEO": "Vill du aktivera video i pågående samtal?", 10 | "MESSAGE_ENABLE_VIDEO": "Video kommer aktiveras i efterföljande samtal.", 11 | "TITLE_INSERT_BANNER": "Lägg till banner text", 12 | "TITLE_INSERT_CANVAS_ID": "Lägg till Canvas Id", 13 | "TITLE_INSERT_LAYER": "Lägg till Lager", 14 | "TITLE_TRANSFER": "Koppla samtal?", 15 | "MESSAGE_TRANSFER": "Vilken destination vill du koppla samtalet till?", 16 | "LABEL_TRANSFER": "Destination", 17 | "MESSAGE_DISPLAY_SETTINGS": "Kan inte förhandsvisa inställningar under samtal", 18 | "BUTTON_END_CALL": "Avsluta samtal", 19 | "BUTTON_CLOSE": "Stäng", 20 | "MESSAGE_PLAY": "Spela upp", 21 | "MESSAGE_STOP": "Stoppa", 22 | "MESSAGE_RECORD": "Spela in", 23 | "MESSAGE_STOP_RECORD": "Avsluta inspelning", 24 | "MESSAGE_SNAPSHOT": "Snapshot", 25 | "MESSAGE_VIDEO_MODE": "Videoläge", 26 | "MESSAGE_MUTE_MIC": "(av)Aktivera Mikrofon", 27 | "MESSAGE_MUTE_VIDEO": "(av)Aktivera Video", 28 | "MESSAGE_FULLSCREEN": "Växla fullskärmsläge", 29 | "MESSAGE_SCREENSHARE": "Skärmdelning", 30 | "MESSAGE_OPEN_CLOSE_CHAT": "Öppna/stäng chatt", 31 | "MESSAGE_SPEAKER": "Högtalare", 32 | "MESSAGE_POPUP": "Popup", 33 | "CHAT_TITLE_MEMBERS": "Medlemmar", 34 | "CHAT_TITLE": "Chatt", 35 | "CHAT_NO_MEMBERS": "Det finns inga medlemmar att visa.", 36 | "CHAT_GENERAL": "Allmänt", 37 | "CHAT_TITLE_KICK": "Sparka ut", 38 | "CHAT_KICK": "Sparka ut", 39 | "CHAT_TITLE_VIDEO_FLOOR": "Video Floor", 40 | "CHAT_FLOOR": "Floor", 41 | "CHAT_TITLE_TRANSFER": "Koppla", 42 | "CHAT_TRANSFER": "Koppla", 43 | "CHAT_BANNER": "Banner", 44 | "CHAT_TITLE_SET": "Sätt", 45 | "CHAT_SET": "Sätt", 46 | "CHAT_TITLE_RESET": "Reset", 47 | "CHAT_RESET": "Reset", 48 | "CHAT_CANVAS": "Canvas", 49 | "CHAT_CANVAS_IN": "Canvas In", 50 | "CHAT_CANVAS_OUT": "Canvas Ut", 51 | "CHAT_PREV": "Föregående", 52 | "CHAT_NEXT": "Nästa", 53 | "CHAT_LAYER": "Lager", 54 | "CHAT_AUDIO_VIDEO": "Ljud/Video", 55 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "Aktivera/Inaktivera Mikrofon", 56 | "CHAT_MUTE_MIC": "Inaktivera", 57 | "CHAT_UNMUTE_MIC": "Aktivera", 58 | "CHAT_TITLE_MUTE_UNMUTE_VIDEO": "Aktivera/Inaktivera Video", 59 | "CHAT_NO_MESSAGES": "Det finns inga meddelanden att visa.", 60 | "CHAT_SEND_MESSAGE": "Skicka", 61 | "CHAT_TYPE_MESSAGE": "Skriv ditt meddelande här...", 62 | "TITLE_CONTRIBUTORS": "Contributors", 63 | "MESSAGE_CONNECTION_UNTRUSTED": "Denna anslutning är opålitlig.", 64 | "MESSAGE_TOGGLE_NAVIGATION": "Toggla navigation", 65 | "BANDWIDTH_INFO": "Bandbreddsinformation", 66 | "BANDWIDTH_INFO_INCOMING": "Inkommande:", 67 | "BANDWIDTH_INFO_OUTGOING": "Utgående:", 68 | "BANDWIDTH_INFO_VIDEO_RES": "Videoupplösning:", 69 | "IN_CALL": "I Samtal:", 70 | "LAST_CALL": "Senaste Samtal:", 71 | "OPEN_NEW_WINDOW": "Öppna nytt fönster", 72 | "CHANGE_LOGIN_INFO": "Ändra inloggningsinformation", 73 | "LOGOUT": "Logga ut", 74 | "ABOUT": "Om", 75 | "HELP": "Hjälp", 76 | "CONTRIBUTORS": "Contributors", 77 | "TITLE_PREVIEW_SETTINGS": "Inställningar för kamera och mikrofon", 78 | "CAMERA_SETTINGS": "Kamera:", 79 | "MIC_SETTINGS": "Mikrofon:", 80 | "SAVE": "Spara", 81 | "LOADING": "Laddar", 82 | "ERRORS" : "Fel", 83 | "CALLING_TO": "Ringer till ", 84 | "CANCELLING": "Avbryter...", 85 | "DETERMINING_SPEED": "Avgör din hastighet...", 86 | "CALL_HISTORY": "Samtalshistorik", 87 | "CLEAR_CALL_HISTORY": "Rensa Historik", 88 | "NO_CALL_HISTORY": "Ingen samtalshistorik.", 89 | "ENTER_EXTENSION": "Ange anknytning", 90 | "CALL_EXTENSION": "Ring Anknytning", 91 | "LOGIN": "Inloggning", 92 | "LOGIN_INFORMATION": "Inloggningsinformation", 93 | "SAVE_LOGIN_INFORMATION": "Spara inloggningsinformation", 94 | "INVALID_LOGIN_FIELDS": "Verifiera nedanstående fält och försök igen.", 95 | "NAME": "Namn", 96 | "YOUR_NAME": "Ditt namn", 97 | "EMAIL": "Epost", 98 | "YOUR_EMAIL": "Din epost", 99 | "USER": "Användare", 100 | "PASSWORD": "Lösenord", 101 | "CALLER_ID": "Utringande ID", 102 | "HOSTNAME": "Servernamn", 103 | "WEBSOCKET_URL": "Websocket URL", 104 | "SETTINGS": "Inställningar", 105 | "DEVICE_SETTINGS": "Enhetsinställningar", 106 | "SHARE_DEVICE": "Dela enhet", 107 | "SPEAKER": "Högtalare:", 108 | "SPEAKER_FEATURE": "Din browser verkar inte stödja denna funktion", 109 | "PREVIEW_SETTINGS": "Förhandsgranska inställningar", 110 | "REFRESH_DEVICE_LIST": "Uppdatera enhetslista", 111 | "GENERAL_SETTINGS": "Generella inställningar:", 112 | "USE_VIDEO": "Använd Video", 113 | "USE_STEREO_AUDIO": "Stereoljud", 114 | "USE_STUN": "Använd STUN", 115 | "SCALE_VIDEO": "Skala fjärrvideo för att matcha kameraupplösning", 116 | "ASK_BEFORE_RECOVER": "Fråga före återhämtning av samtal", 117 | "BEST_FRAME_RATE": "Bästa framerate:", 118 | "AUDIO_SETTINGS": "Ljudinställningar:", 119 | "ECHO_CANCEL": "Echo Cancellation", 120 | "NOISE_SUPPRESSION": "Brusreducering", 121 | "HIGHPASS_FILTER": "Högpassfilter", 122 | "VIDEO_SETTINGS": "Videoinställningar:", 123 | "REMOTE_ENCODER": "Dedikerad Remote Encoder aktiverad.", 124 | "AUTO_SPEED_RES": "Automatiska inställningar för hastighet och upplösning", 125 | "RECHECK_BANDWIDTH": "Kontrollera bandbredd före varje utgående samtal", 126 | "CHECK_NETWORK_SPEED": "Kontrollera nätverkshastighet", 127 | "VIDEO_QUALITY": "Videokvalitet:", 128 | "MAX_INCOMING_BANDWIDTH": "Max inkommande bandbredd:", 129 | "MAX_OUTGOING_BANDWIDTH": "Max utgående bandbredd:", 130 | "FACTORY_RESET": "Fabriksåterställning", 131 | "SAVE_DEVICE_SETTINGS": "Spara inställningar", 132 | "BROWSER_COMPATIBILITY": "Kontrollerar browserkompatibilitet.", 133 | "REFRESH_MEDIA_DEVICES": "Uppdatera mediaenheter.", 134 | "BROWSER_WITHOUT_WEBRTC": "Fel: browsern saknar stöd för WebRTC.", 135 | "CHECK_PERMISSION_MEDIA": "Kontrollerar mediarättigheter", 136 | "CHECK_PROVISIONING_CONF": "Provisioneringskonfiguration.", 137 | "CHECK_LOGIN": "Kontrollerar inloggning.", 138 | "CHECK_CONNECTION_SPEED": "Kontrollera anslutningshastighet.", 139 | "ERROR_PERMISSION_MEDIA": "Fel: Mediaåtkomst nekad", 140 | "ERROR_PROVISIONING_CONF": "Fel: Provisionering misslyckades.", 141 | "PLEASE_WAIT": "Vänligen vänta...", 142 | "CANCEL": "Avbryt", 143 | "CHAT_TITLE_VOL_MINUS": "Volym -", 144 | "CHAT_TITLE_VOL_PLUS": "Volym +", 145 | "CHAT_TITLE_GAIN_MINUS": "Förstärkning -", 146 | "CHAT_TITLE_GAIN_PLUS": "Förstärkning +", 147 | "CHAT_VOL_MINUS": "Vol -", 148 | "CHAT_VOL_PLUS": "Vol +", 149 | "CHAT_GAIN_MINUS": "Förstärkning -", 150 | "CHAT_GAIN_PLUS": "Förstärkning +" 151 | } 152 | -------------------------------------------------------------------------------- /verto_communicator/src/locales/locale-zh.json: -------------------------------------------------------------------------------- 1 | { 2 | "TITLE_ACTIVE_CALL": "囧,正在通话中", 3 | "MESSAGE_ACTIVE_CALL_HANGUP": "好像正在通话中,你想挂断吗?", 4 | "MESSAGE_ACTIVE_CALL_BACK": "好像上次还有个电话没有挂断?你想恢复上次的通话吗?", 5 | "TITLE_INCOMING_CALL": "新来电", 6 | "MESSAGE_INCOMING_CALL": "来自 ", 7 | "MESSAGE_NO_HANGUP_CALL": "没有可挂断的电话", 8 | "MESSAGE_ENTER_FILENAME": "请输入文件名", 9 | "TITLE_ENABLE_VIDEO": "你想为当前通话开启视频吗?", 10 | "MESSAGE_ENABLE_VIDEO": "开启视频将在下次通话生效", 11 | "TITLE_INSERT_BANNER": "请输入标题文本", 12 | "TITLE_INSERT_CANVAS_ID": "请选择一个画布ID", 13 | "TITLE_INSERT_LAYER": "请输入一个层", 14 | "TITLE_TRANSFER": "转移方?", 15 | "MESSAGE_TRANSFER": "你想把该电话转移到什么号码?", 16 | "LABEL_TRANSFER": "目的地", 17 | "MESSAGE_DISPLAY_SETTINGS": "通话中不能预览", 18 | "BUTTON_END_CALL": "挂断", 19 | "BUTTON_CLOSE": "关闭", 20 | "MESSAGE_PLAY": "播放", 21 | "MESSAGE_STOP": "停止", 22 | "MESSAGE_RECORD": "录音/录像", 23 | "MESSAGE_STOP_RECORD": "停止录音/录像", 24 | "MESSAGE_SNAPSHOT": "抓拍", 25 | "MESSAGE_VIDEO_MODE": "停止发送视频", 26 | "MESSAGE_MUTE_MIC": "静音/恢复", 27 | "MESSAGE_MUTE_VIDEO": "停止视频/恢复", 28 | "MESSAGE_FULLSCREEN": "全屏", 29 | "MESSAGE_SCREENSHARE": "屏幕共享", 30 | "MESSAGE_OPEN_CLOSE_CHAT": "打开/关闭聊天", 31 | "MESSAGE_SPEAKER": "喇叭", 32 | "MESSAGE_POPUP": "弹出", 33 | "CHAT_TITLE_MEMBERS": "成员", 34 | "CHAT_TITLE": "聊天", 35 | "CHAT_NO_MEMBERS": "没有成员", 36 | "CHAT_GENERAL": "一般", 37 | "CHAT_TITLE_KICK": "踢出", 38 | "CHAT_KICK": "踢出", 39 | "CHAT_TITLE_VIDEO_FLOOR": "视频Floor", 40 | "CHAT_FLOOR": "Floor", 41 | "CHAT_TITLE_TRANSFER": "转移", 42 | "CHAT_TRANSFER": "转移", 43 | "CHAT_BANNER": "标题", 44 | "CHAT_TITLE_SET": "设置", 45 | "CHAT_SET": "设置", 46 | "CHAT_TITLE_RESET": "重置", 47 | "CHAT_RESET": "重置", 48 | "CHAT_CANVAS": "画布", 49 | "CHAT_CANVAS_IN": "入画布", 50 | "CHAT_CANVAS_OUT": "出画布", 51 | "CHAT_PREV": "上一个", 52 | "CHAT_NEXT": "下一个", 53 | "CHAT_LAYER": "层", 54 | "CHAT_AUDIO_VIDEO": "音频/视频", 55 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "静音/恢复", 56 | "CHAT_MUTE_MIC": "静音", 57 | "CHAT_UNMUTE_MIC": "恢复", 58 | "CHAT_TITLE_MUTE_UNMUTE_MIC": "停止/恢复视频", 59 | "CHAT_NO_MESSAGES": "没有可显示的消息", 60 | "CHAT_SEND_MESSAGE": "发送", 61 | "CHAT_TYPE_MESSAGE": "请在此输入消息", 62 | "TITLE_CONTRIBUTORS": "贡献者", 63 | "MESSAGE_CONNECTION_UNTRUSTED": "本连接不是可信的连接", 64 | "MESSAGE_TOGGLE_NAVIGATION": "导航", 65 | "BANDWIDTH_INFO": "带宽信息", 66 | "BANDWIDTH_INFO_INCOMING": "接收:", 67 | "BANDWIDTH_INFO_OUTGOING": "发送:", 68 | "BANDWIDTH_INFO_VIDEO_RES": "视频分辨率:", 69 | "IN_CALL": "通话中:", 70 | "LAST_CALL": "最近通话:", 71 | "OPEN_NEW_WINDOW": "打开新窗口", 72 | "CHANGE_LOGIN_INFO": "修改登录信息", 73 | "LOGOUT": "退出登录", 74 | "ABOUT": "关于", 75 | "HELP": "帮助", 76 | "CONTRIBUTORS": "贡献者", 77 | "TITLE_PREVIEW_SETTINGS": "设置摄像头和麦克风", 78 | "CAMERA_SETTINGS": "摄像头:", 79 | "MIC_SETTINGS": "麦克风", 80 | "SAVE": "保存", 81 | "LOADING": "加载中", 82 | "ERRORS" : "错误", 83 | "CALLING_TO": "正在呼叫 ", 84 | "CANCELLING": "正在取消", 85 | "DETERMINING_SPEED": "检查网速...", 86 | "CALL_HISTORY": "通话历史", 87 | "CLEAR_CALL_HISTORY": "清除历史记录", 88 | "NO_CALL_HISTORY": "尚无任何通话", 89 | "ENTER_EXTENSION": "输入号码", 90 | "CALL_EXTENSION": "呼叫", 91 | "LOGIN": "登录", 92 | "LOGIN_INFORMATION": "登录信息", 93 | "SAVE_LOGIN_INFORMATION": "保存登录信息", 94 | "INVALID_LOGIN_FIELDS": "请检查下面的项目并重试", 95 | "NAME": "姓名", 96 | "YOUR_NAME": "你的姓名", 97 | "EMAIL": "电子邮件", 98 | "YOUR_EMAIL": "你的电子邮件", 99 | "USER": "用户名", 100 | "PASSWORD": "密码", 101 | "CALLER_ID": "主叫号码", 102 | "HOSTNAME": "主机名", 103 | "WEBSOCKET_URL": "Websocket URL", 104 | "SETTINGS": "设置", 105 | "DEVICE_SETTINGS": "设备设置", 106 | "SHARE_DEVICE": "共享设备", 107 | "SPEAKER": "喇叭:", 108 | "SPEAKER_FEATURE": "你的浏览器好像不支持该设置", 109 | "PREVIEW_SETTINGS": "预览设置", 110 | "REFRESH_DEVICE_LIST": "刷新设备列表", 111 | "GENERAL_SETTINGS": "通话设置:", 112 | "USE_VIDEO": "启用视频", 113 | "USE_STEREO_AUDIO": "立体声", 114 | "USE_STUN": "启用STUN", 115 | "SCALE_VIDEO": "自动缩放远端视频到本地摄像头分辨率", 116 | "ASK_BEFORE_RECOVER": "在恢复上一次通话前询问", 117 | "BEST_FRAME_RATE": "最佳帧率:", 118 | "AUDIO_SETTINGS": "音频设置:", 119 | "ECHO_CANCEL": "回声消除", 120 | "NOISE_SUPPRESSION": "噪声抑制", 121 | "HIGHPASS_FILTER": "高通滤波", 122 | "VIDEO_SETTINGS": "视频设置:", 123 | "REMOTE_ENCODER": "已启用专用远端编码器", 124 | "AUTO_SPEED_RES": "根据网速自动选择最佳分辨率", 125 | "RECHECK_BANDWIDTH": "每次通话前重新检查网速", 126 | "CHECK_NETWORK_SPEED": "检查网速", 127 | "VIDEO_QUALITY": "视频质量:", 128 | "MAX_INCOMING_BANDWIDTH": "最大接收带宽:", 129 | "MAX_OUTGOING_BANDWIDTH": "最大发送带宽:", 130 | "FACTORY_RESET": "恢复出厂设置", 131 | "SAVE_DEVICE_SETTINGS": "保存设备设置", 132 | "BROWSER_COMPATIBILITY": "检查浏览器兼容性", 133 | "REFRESH_MEDIA_DEVICES": "检查媒体设备", 134 | "BROWSER_WITHOUT_WEBRTC": "错误:浏览器不支持WebRTC", 135 | "CHECK_PERMISSION_MEDIA": "检查媒体使用权限", 136 | "CHECK_PROVISIONING_CONF": "自在自动配置", 137 | "CHECK_LOGIN": "正在检查登录信息", 138 | "CHECK_CONNECTION_SPEED": "检查网速", 139 | "ERROR_PERMISSION_MEDIA": "错误:未授权使用麦克风或摄像头", 140 | "ERROR_PROVISIONING_CONF": "错误:自动配置失败", 141 | "PLEASE_WAIT": "请稍候...", 142 | "CANCEL": "取消", 143 | "CHAT_TITLE_VOL_MINUS": "音量-", 144 | "CHAT_TITLE_VOL_PLUS": "音量+", 145 | "CHAT_TITLE_GAIN_MINUS": "增益-", 146 | "CHAT_TITLE_GAIN_PLUS": "增益+", 147 | "CHAT_VOL_MINUS": "音量-", 148 | "CHAT_VOL_PLUS": "音量+", 149 | "CHAT_GAIN_MINUS": "增益-", 150 | "CHAT_GAIN_PLUS": "增益+" 151 | } 152 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/about.html: -------------------------------------------------------------------------------- 1 | 3 | 20 | 22 | 23 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/angular-prompt.html: -------------------------------------------------------------------------------- 1 |
2 | 6 | 30 | 33 |
34 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/browser_upgrade.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

Sorry, your browser is not supported.

6 |

Use one of the following supported browsers.

7 | 24 |
25 |
26 |
27 |
28 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/contributors.html: -------------------------------------------------------------------------------- 1 | 4 | 21 | 23 | 24 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/dialpad_widget.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 |
8 |
9 | 15 | 21 | 27 |
28 |
29 | 35 | 41 | 47 |
48 |
49 | 55 | 61 | 67 |
68 |
69 | 75 | 81 | 87 |
88 |
89 |
90 |
91 |
92 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/incall.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/loading.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

{{ 'LOADING' | translate}}

6 |
{{ 'WAITING_DEVICES' | translate }}
7 |
8 |
9 |
10 |
-------------------------------------------------------------------------------- /verto_communicator/src/partials/login.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

{{ 'LOGIN' | translate}}

6 | 7 | 8 |
9 |

{{ 'INVALID_LOGIN_FIELDS' | translate }}

10 |
11 | 12 |
13 |

{{ 'INVALID_SETTINGS_FIELDS' | translate }}

14 |
15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 29 |
30 |
31 | 32 | 33 |
34 | 35 |
36 | 37 | 38 |
39 | 40 |
41 | 42 | 43 |
44 |
45 | 46 | 47 |
48 | 49 |
50 | 51 | 52 |
53 |
54 | 55 | 56 |
57 | 58 | 59 |
60 | 61 |
62 |
63 | 64 | 65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/menu.html: -------------------------------------------------------------------------------- 1 | 88 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/modal_logininfo.html: -------------------------------------------------------------------------------- 1 | 4 | 32 | 36 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/phone_call.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 |

{{ storage.data.called_number }}

9 |
10 | {{hhours}}:{{mminutes}}:{{sseconds}} 11 |
12 |
13 |

Calling

14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | 23 | 57 |
58 | 59 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/preview.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

{{ 'TITLE_PREVIEW_SETTINGS' | translate }}

6 |
7 |
8 |
9 | 10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | 19 |
20 |
21 |
22 |
23 | 24 | 27 |
28 |
29 | 30 | 33 |
34 | 35 | 36 | 37 | 38 |
39 | 42 |
43 |
44 |
45 |
46 |
47 |
48 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/splash_screen.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

{{ 'LOADING' | translate }}

6 |
7 |
8 |
9 |
10 | 11 |
12 |

{{ 'ERRORS' | translate }}

13 |
    14 |
  • {{ ::error }}
  • 15 |
16 |
17 |
18 |
19 |
20 |
21 | 22 | -------------------------------------------------------------------------------- /verto_communicator/src/partials/ws_reconnect.html: -------------------------------------------------------------------------------- 1 | 4 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /verto_communicator/src/sounds/bell_ring2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/sounds/bell_ring2.mp3 -------------------------------------------------------------------------------- /verto_communicator/src/sounds/bell_ring2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/freeswitch/verto-client/6d19d90dfdbf29005c9356823250692283acda63/verto_communicator/src/sounds/bell_ring2.wav -------------------------------------------------------------------------------- /verto_communicator/src/storageService/services/call_history.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular 4 | .module('storageService') 5 | .factory('CallHistory', function(storage) { 6 | 7 | var history = storage.data.call_history; 8 | var history_control = storage.data.history_control; 9 | 10 | var addCallToHistory = function(number, direction, status) { 11 | if(history[number] == undefined) { 12 | history[number] = []; 13 | } 14 | 15 | history[number].unshift({ 16 | 'number': number, 17 | 'direction': direction, 18 | 'status': status, 19 | 'call_start': Date() 20 | }); 21 | 22 | var index = history_control.indexOf(number); 23 | console.log(index); 24 | if(index > -1) { 25 | history_control.splice(index, 1); 26 | } 27 | 28 | history_control.unshift(number); 29 | 30 | }; 31 | 32 | var getCallsFromHistory = function(number) { 33 | return history[number]; 34 | }; 35 | 36 | return { 37 | all: function() { 38 | return history; 39 | }, 40 | all_control: function() { 41 | return history_control; 42 | }, 43 | get: function(number) { 44 | return getCallsFromHistory(number); 45 | }, 46 | add: function(number, direction, status) { 47 | return addCallToHistory(number, direction, status); 48 | }, 49 | clear: function() { 50 | storage.data.call_history = {}; 51 | storage.data.history_control = []; 52 | history = storage.data.call_history; 53 | history_control = storage.data.history_control; 54 | return history_control; 55 | } 56 | } 57 | }); 58 | -------------------------------------------------------------------------------- /verto_communicator/src/storageService/services/storage.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular 4 | .module('storageService') 5 | .service('storage', ['$rootScope', '$localStorage', 6 | function($rootScope, $localStorage) { 7 | var data = $localStorage, 8 | defaultSettings = { 9 | ui_connected: false, 10 | ws_connected: false, 11 | cur_call: 0, 12 | called_number: '', 13 | useVideo: true, 14 | call_history: {}, 15 | history_control: [], 16 | call_start: false, 17 | name: '', 18 | email: '', 19 | login: '', 20 | password: '', 21 | userStatus: 'disconnected', 22 | mutedVideo: false, 23 | mutedMic: false, 24 | preview: true, 25 | selectedVideo: null, 26 | selectedVideoName: null, 27 | selectedAudio: null, 28 | selectedShare: null, 29 | selectedSpeaker: null, 30 | useStereo: true, 31 | useSTUN: true, 32 | useDedenc: false, 33 | mirrorInput: false, 34 | outgoingBandwidth: 'default', 35 | incomingBandwidth: 'default', 36 | vidQual: undefined, 37 | askRecoverCall: false, 38 | googNoiseSuppression: true, 39 | googHighpassFilter: true, 40 | googEchoCancellation: true, 41 | googAutoGainControl: true, 42 | autoBand: true, 43 | testSpeedJoin: true, 44 | bestFrameRate: "15", 45 | language: undefined 46 | }; 47 | 48 | data.$default(defaultSettings); 49 | 50 | function changeData(verto_data) { 51 | jQuery.extend(true, data, verto_data); 52 | } 53 | 54 | return { 55 | data: data, 56 | changeData: changeData, 57 | reset: function() { 58 | data.ui_connected = false; 59 | data.ws_connected = false; 60 | data.cur_call = 0; 61 | data.userStatus = 'disconnected'; 62 | }, 63 | factoryReset: function() { 64 | localStorage.clear(); 65 | // set defaultSettings again 66 | data.$reset(defaultSettings); 67 | }, 68 | }; 69 | } 70 | ]); 71 | -------------------------------------------------------------------------------- /verto_communicator/src/storageService/storageService.module.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | var vertoService = angular.module('storageService', ['ngStorage']); 4 | })(); 5 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoApp/vertoApp.module.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | var vertoApp = angular.module('vertoApp', [ 5 | 'timer', 6 | 'ngRoute', 7 | 'vertoControllers', 8 | 'vertoDirectives', 9 | 'vertoFilters', 10 | 'ngStorage', 11 | 'ngAnimate', 12 | 'ngSanitize', 13 | 'toastr', 14 | 'FBAngular', 15 | 'cgPrompt', 16 | '720kb.tooltips', 17 | 'ui.gravatar', 18 | 'ui.bootstrap', 19 | 'directive.g+signin', 20 | 'pascalprecht.translate', 21 | 'angular-click-outside', 22 | ]); 23 | 24 | vertoApp.constant('configLanguages', { 25 | 'languages' : [ 26 | {id: 'en', name: 'English'}, 27 | {id: 'it', name: 'Italiano'}, 28 | {id: 'fr', name: 'Français'}, 29 | {id: 'de', name: 'Deutsch'}, 30 | {id: 'pt', name: 'Português'}, 31 | {id: 'pl', name: 'Polski'}, 32 | {id: 'zh', name: '中國'}, 33 | {id: 'ru', name: 'Pусский'}, 34 | {id: 'sv', name: 'Svenska'}, 35 | {id: 'da', name: 'Dansk'}, 36 | {id: 'es', name: 'Español'}, 37 | {id: 'id', name: 'Indonesia'} 38 | ], 39 | 40 | 'dialects' : { 41 | 'en': 'en', 42 | 'en_GB': 'en', 43 | 'en_US': 'en', 44 | 'it': 'it', 45 | 'it_IT': 'it', 46 | 'fr': 'fr', 47 | 'fr_FR': 'fr', 48 | 'fr_CA': 'fr', 49 | 'pt': 'pt', 50 | 'pt_BR': 'pt', 51 | 'pt_PT': 'pt', 52 | 'de': 'de', 53 | 'de_DE': 'de', 54 | 'es': 'es', 55 | 'es_ES': 'es', 56 | 'pl': 'pl', 57 | 'pl_PL': 'pl', 58 | 'ru': 'ru', 59 | 'ru_RU': 'ru', 60 | 'sv': 'sv', 61 | 'sv_SV': 'sv', 62 | 'sv_FI': 'sv', 63 | 'da': 'da', 64 | 'da_DK': 'da', 65 | 'id': 'id', 66 | 'id_ID': 'id', 67 | 'zh': 'zh', 68 | 'zh_CN': 'zh', 69 | 'zh_TW': 'zh', 70 | 'zh_HK': 'zh' 71 | } 72 | }); 73 | 74 | vertoApp.config(['$routeProvider', 'gravatarServiceProvider', '$translateProvider', 'configLanguages', 75 | function($routeProvider, gravatarServiceProvider, $translateProvider, configLanguages) { 76 | $routeProvider. 77 | when('/', { 78 | title: 'Loading', 79 | templateUrl: 'partials/splash_screen.html', 80 | controller: 'SplashScreenController' 81 | }). 82 | when('/login', { 83 | title: 'Login', 84 | templateUrl: 'partials/login.html', 85 | controller: 'LoginController' 86 | }). 87 | when('/dialpad', { 88 | title: 'Dialpad', 89 | templateUrl: 'partials/dialpad.html', 90 | controller: 'DialPadController' 91 | }). 92 | when('/incall', { 93 | title: 'In a Call', 94 | templateUrl: 'partials/incall.html', 95 | controller: 'InCallController' 96 | }). 97 | when('/loading', { 98 | title: 'Loading Verto Communicator', 99 | templateUrl: 'partials/loading.html', 100 | controller: 'LoadingController' 101 | }). 102 | when('/preview', { 103 | title: 'Preview Video', 104 | templateUrl: 'partials/preview.html', 105 | controller: 'PreviewController' 106 | }). 107 | when('/browser-upgrade', { 108 | title: '', 109 | templateUrl: 'partials/browser_upgrade.html', 110 | controller: 'BrowserUpgradeController' 111 | }). 112 | otherwise({ 113 | redirectTo: '/' 114 | }); 115 | 116 | gravatarServiceProvider.defaults = { 117 | default: 'mm' // Mystery man as default for missing avatars 118 | }; 119 | 120 | var reg_langs = []; 121 | angular.forEach(configLanguages.languages, function(value, key) { 122 | reg_langs.push(value.id); 123 | }); 124 | 125 | $translateProvider 126 | .useStaticFilesLoader({ 127 | prefix: 'locales/locale-', 128 | suffix: '.json' 129 | }) 130 | .registerAvailableLanguageKeys(reg_langs, configLanguages.dialects) 131 | .preferredLanguage('en') 132 | .determinePreferredLanguage() 133 | .fallbackLanguage('en') 134 | .useSanitizeValueStrategy(null); 135 | } 136 | ]); 137 | 138 | vertoApp.run(['$rootScope', '$location', 'toastr', 'prompt', 'verto', 139 | function($rootScope, $location, toastr, prompt, verto) { 140 | 141 | $rootScope.$on( "$routeChangeStart", function(event, next, current) { 142 | if (!verto.data.connected) { 143 | if ( next.templateUrl === "partials/login.html") { 144 | // pass 145 | } else { 146 | $location.path("/"); 147 | } 148 | } 149 | }); 150 | 151 | $rootScope.$on('$routeChangeSuccess', function(event, current, previous) { 152 | $rootScope.title = current.$$route.title; 153 | }); 154 | 155 | $rootScope.safeProtocol = false; 156 | 157 | if (window.location.protocol == 'https:') { 158 | $rootScope.safeProtocol = true; 159 | } 160 | 161 | 162 | $rootScope.promptInput = function(title, message, label, callback) { 163 | var ret = prompt({ 164 | title: title, 165 | message: message, 166 | input: true, 167 | label: label 168 | }).then(function(ret) { 169 | if (angular.isFunction(callback)) { 170 | callback(ret); 171 | } 172 | }, function() { 173 | 174 | }); 175 | 176 | }; 177 | 178 | } 179 | ]); 180 | 181 | })(); 182 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/AboutController.source.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('AboutController', ['$scope', '$http', 7 | 'toastr', 8 | function($scope, $http, toastr) { 9 | var githash = '/* @echo revision */' || 'something is not right'; 10 | $scope.githash = githash; 11 | 12 | /* leave this here for later, but its not needed right now 13 | $http.get(window.location.pathname + '/contributors.txt') 14 | .success(function(data) { 15 | 16 | }) 17 | .error(function() { 18 | toastr.error('contributors not found.'); 19 | }); 20 | */ 21 | } 22 | ]); 23 | })(); 24 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/BrowserUpgradeController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('BrowserUpgradeController', ['$scope', '$http', 7 | '$location', 'verto', 'storage', 'Fullscreen', 8 | function($scope, $http, $location, verto, storage, Fullscreen) { 9 | console.debug('Executing BrowserUpgradeController.'); 10 | 11 | } 12 | ]); 13 | 14 | })(); -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/ContributorsController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('ContributorsController', ['$scope', '$http', 7 | 'toastr', 8 | function($scope, $http, toastr) { 9 | var url = window.location.origin + window.location.pathname; 10 | $http.get(url + 'contributors.txt') 11 | .success(function(data) { 12 | 13 | var contributors = []; 14 | 15 | angular.forEach(data, function(value, key) { 16 | var re = /(.*) <(.*)>/; 17 | var name = value.replace(re, "$1"); 18 | var email = value.replace(re, "$2"); 19 | 20 | this.push({ 21 | 'name': name, 22 | 'email': email 23 | }); 24 | }, contributors); 25 | 26 | $scope.contributors = contributors; 27 | }) 28 | .error(function() { 29 | toastr.error('contributors not found.'); 30 | }); 31 | } 32 | ]); 33 | })(); 34 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/DialPadController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('DialPadController', ['$rootScope', '$scope', 7 | '$http', '$location', 'toastr', 'verto', 'storage', 'CallHistory', 'eventQueue', '$timeout', 8 | function($rootScope, $scope, $http, $location, toastr, verto, storage, CallHistory, eventQueue, $timeout) { 9 | console.debug('Executing DialPadController.'); 10 | 11 | eventQueue.process(); 12 | 13 | if ($location.search().autocall) { 14 | $rootScope.dialpadNumber = $location.search().autocall; 15 | delete $location.search().autocall; 16 | call($rootScope.dialpadNumber); 17 | if($rootScope.watcher) { 18 | return; 19 | } 20 | } 21 | 22 | $scope.call_history = CallHistory.all(); 23 | $scope.history_control = CallHistory.all_control(); 24 | $scope.has_history = Object.keys($scope.call_history).length; 25 | storage.data.videoCall = false; 26 | storage.data.userStatus = 'connecting'; 27 | storage.data.calling = false; 28 | 29 | $scope.clearCallHistory = function() { 30 | CallHistory.clear(); 31 | $scope.call_history = CallHistory.all(); 32 | $scope.history_control = CallHistory.all_control(); 33 | $scope.has_history = Object.keys($scope.call_history).length; 34 | return $scope.history_control; 35 | }; 36 | 37 | $scope.viewCallsList = function(calls) { 38 | return $scope.call_list = calls; 39 | }; 40 | 41 | /** 42 | * fill dialpad via querystring [?autocall=\d+] 43 | */ 44 | 45 | /** 46 | * fill in dialpad via config.json 47 | */ 48 | if ('autocall' in verto.data) { 49 | $rootScope.dialpadNumber = verto.data.autocall; 50 | delete verto.data.autocall; 51 | call($rootScope.dialpadNumber); 52 | } 53 | 54 | /** 55 | * used to bind click on number in call history to fill dialpad 56 | * 'cause inside a ng-repeat the angular isnt in ctrl scope 57 | */ 58 | $scope.fillDialpadNumber = function(number) { 59 | $rootScope.dialpadNumber = number; 60 | }; 61 | 62 | $scope.preview = function() { 63 | $location.path('/preview'); 64 | }; 65 | 66 | $rootScope.transfer = function() { 67 | if (!$rootScope.dialpadNumber) { 68 | return false; 69 | } 70 | verto.data.call.transfer($rootScope.dialpadNumber); 71 | }; 72 | 73 | function call(extension) { 74 | storage.data.onHold = false; 75 | storage.data.cur_call = 0; 76 | $rootScope.dialpadNumber = extension; 77 | if (!$rootScope.dialpadNumber && storage.data.called_number) { 78 | $rootScope.dialpadNumber = storage.data.called_number; 79 | return false; 80 | } else if (!$rootScope.dialpadNumber && !storage.data.called_number) { 81 | toastr.warning('Enter an extension, please.'); 82 | return false; 83 | } 84 | 85 | if (verto.data.call) { 86 | console.debug('A call is already in progress.'); 87 | return false; 88 | } 89 | 90 | if (extension.indexOf('-canvas-') != -1) { 91 | $rootScope.watcher = true; 92 | verto.call($rootScope.dialpadNumber, null, 93 | { 94 | useCamera: "none", 95 | useMic: "none", 96 | useSpeak: "none", 97 | caller_id_name: null, 98 | userVariables: {}, 99 | caller_id_number: null, 100 | mirrorInput: false 101 | } 102 | ); 103 | $location.path('/incall'); 104 | return; 105 | } 106 | 107 | storage.data.mutedVideo = false; 108 | storage.data.mutedMic = false; 109 | 110 | storage.data.videoCall = false; 111 | verto.call($rootScope.dialpadNumber); 112 | 113 | storage.data.called_number = $rootScope.dialpadNumber; 114 | CallHistory.add($rootScope.dialpadNumber, 'outbound'); 115 | $location.path('/incall'); 116 | } 117 | 118 | /** 119 | * Call to the number in the $rootScope.dialpadNumber. 120 | */ 121 | $scope.loading = false; 122 | $scope.cancelled = false; 123 | $rootScope.call = function(extension) { 124 | if (!storage.data.testSpeedJoin || !$rootScope.dialpadNumber) { 125 | return call(extension); 126 | } 127 | $scope.loading = true; 128 | 129 | verto.testSpeed(function() { 130 | if ($scope.cancelled) { 131 | $scope.cancelled = false; 132 | $scope.loading = false; 133 | return; 134 | } else { 135 | call(extension); 136 | } 137 | }); 138 | } 139 | 140 | $rootScope.cancel = function() { 141 | $scope.cancelled = true; 142 | } 143 | } 144 | ]); 145 | 146 | })(); 147 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/InCallController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('InCallController', ['$rootScope', '$scope', 7 | '$http', '$location', '$modal', '$timeout', 'toastr', 'verto', 'storage', 'prompt', 'Fullscreen', '$translate', 8 | function($rootScope, $scope, $http, $location, $modal, $timeout, toastr, 9 | verto, storage, prompt, Fullscreen, $translate) { 10 | 11 | console.debug('Executing InCallController.'); 12 | $scope.layout = null; 13 | $rootScope.dialpadNumber = ''; 14 | $scope.callTemplate = 'partials/phone_call.html'; 15 | $scope.dialpadTemplate = ''; 16 | $scope.incall = true; 17 | 18 | if (storage.data.videoCall) { 19 | $scope.callTemplate = 'partials/video_call.html'; 20 | } 21 | 22 | $rootScope.$on('call.conference', function(event, data) { 23 | $timeout(function() { 24 | if($scope.chatStatus) { 25 | $scope.openChat(); 26 | } 27 | buildCanvasesData(); 28 | }); 29 | }); 30 | 31 | $rootScope.$on('call.video', function(event, data) { 32 | $timeout(function() { 33 | $scope.callTemplate = 'partials/video_call.html'; 34 | }); 35 | }); 36 | 37 | /** 38 | * toggle dialpad in incall page 39 | */ 40 | $scope.toggleDialpad = function() { 41 | $scope.openModal('partials/dialpad_widget.html', 42 | 'ModalDialpadController'); 43 | 44 | /* 45 | if(!$scope.dialpadTemplate) { 46 | $scope.dialpadTemplate = 'partials/dialpad_widget.html'; 47 | } else { 48 | $scope.dialpadTemplate = ''; 49 | } 50 | */ 51 | } 52 | 53 | /** 54 | * TODO: useless? 55 | */ 56 | $scope.videoCall = function() { 57 | prompt({ 58 | title: $translate.instant('TITLE_ENABLE_VIDEO'), 59 | message: $translate.instant('MESSAGE_ENABLE_VIDEO') 60 | }).then(function() { 61 | storage.data.videoCall = true; 62 | $scope.callTemplate = 'partials/video_call.html'; 63 | }); 64 | }; 65 | 66 | $scope.cbMuteVideo = function(event, data) { 67 | storage.data.mutedVideo = !storage.data.mutedVideo; 68 | } 69 | 70 | $scope.cbMuteMic = function(event, data) { 71 | storage.data.mutedMic = !storage.data.mutedMic; 72 | } 73 | 74 | $scope.confChangeVideoLayout = function(layout, canvasID) { 75 | verto.data.conf.setVideoLayout(layout, canvasID); 76 | $scope.videoLayout = layout; 77 | $rootScope.$emit('changedVideoLayout', layout); 78 | }; 79 | 80 | $scope.confChangeSpeaker = function(speakerId) { 81 | storage.data.selectedSpeaker = speakerId; 82 | $rootScope.$emit('changedSpeaker', speakerId); 83 | }; 84 | 85 | $scope.confPopup = function(canvas_id) { 86 | var video = document.getElementById('webcam'); 87 | var s = window.location.href; 88 | var curCall = verto.data.call.callID; 89 | var extension = verto.data.call.params.remote_caller_id_number; 90 | var width = webcam.offsetWidth; 91 | var height = webcam.offsetHeight + 100; 92 | var x = (screen.width - width)/2 93 | var y = (screen.height - height)/2 94 | 95 | s = s.replace(/\#.*/, ''); 96 | s += "#/?sessid=random&master=" + curCall + "&watcher=true&extension=" + extension+ "&canvas_id=" + canvas_id; 97 | 98 | console.log("opening new window to " + s); 99 | var popup = window.open(s, "canvas_window_" + canvas_id, "toolbar=0,location=0,menubar=0,directories=0,width=" + width + ",height=" + height, + ',left=' + x + ',top=' + y); 100 | popup.moveTo(x, y); 101 | }; 102 | 103 | $scope.screenshare = function() { 104 | if(verto.data.shareCall) { 105 | verto.screenshareHangup(); 106 | return false; 107 | } 108 | if (verto.data.conf) { 109 | console.log('Screenshare inside conferece: ', verto.data.conf); 110 | // Setting the destination of the screenshare call as the conference 111 | // number we last joined 112 | verto.screenshare(verto.data.conf.params.laData.laName); 113 | } 114 | else { 115 | verto.screenshare(storage.data.called_number); 116 | } 117 | }; 118 | 119 | function buildCanvasesData() { 120 | $scope.conf = verto.data.conf.params.laData; 121 | $scope.canvases = [{ id: 1, name: 'Super Canvas' }]; 122 | for (var i = 1; i < $scope.conf.canvasCount; i++) { 123 | $scope.canvases.push({ id: i+1, name: 'Canvas ' + (i+1) }); 124 | } 125 | } 126 | 127 | $scope.muteMic = verto.muteMic; 128 | $scope.muteVideo = verto.muteVideo; 129 | 130 | $rootScope.$on('ScreenShareExtensionStatus', function(event, error) { 131 | var pluginUrl = 'https://chrome.google.com/webstore/detail/screen-capturing/ajhifddimkapgcifgcodmmfdlknahffk'; 132 | switch(error) { 133 | case 'permission-denied': 134 | toastr.info('Please allow the plugin in order to use Screen Share', 'Error'); break; 135 | case 'not-installed': 136 | toastr.warning('Please install the plugin in order to use Screen Share', 'Warning', { allowHtml: true }); break; 137 | case 'installed-disabled': 138 | toastr.info('Please enable the plugin in order to use Screen Share', 'Error'); break; 139 | // case 'not-chrome' 140 | // toastr.info('Chrome', 'Error'); 141 | } 142 | }); 143 | 144 | $timeout(function() { 145 | console.log('broadcast time-start incall'); 146 | $scope.$broadcast('timer-start'); 147 | }, 1000); 148 | 149 | } 150 | ]); 151 | })(); 152 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/LoadingController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('LoadingController', ['$rootScope', '$scope', '$location', '$interval', 'verto', 7 | function($rootScope, $scope, $location, $interval, verto) { 8 | console.log('Loading controller'); 9 | var int_id; 10 | 11 | $scope.stopInterval = function() { 12 | $interval.cancel(int_id); 13 | }; 14 | 15 | int_id = $interval(function() { 16 | if (verto.data.resCheckEnded) { 17 | $scope.stopInterval(); 18 | $location.path('/preview'); 19 | } 20 | }, 1000); 21 | 22 | } 23 | ]); 24 | })(); 25 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/LoginController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('LoginController', ['$scope', '$http', '$location', 'verto', 7 | function($scope, $http, $location, verto) { 8 | var preRoute = function() { 9 | if(verto.data.connected) { 10 | $location.path('/dialpad'); 11 | } 12 | } 13 | preRoute(); 14 | 15 | var name = $location.search().name; 16 | var email = $location.search().email; 17 | var skipPreview = $location.search().skipPreview; 18 | 19 | if (name && email) { 20 | verto.data.name = name; 21 | verto.data.email = email; 22 | $scope.login(true, skipPreview); 23 | return; 24 | } 25 | 26 | verto.data.name = $scope.storage.data.name; 27 | verto.data.email = $scope.storage.data.email; 28 | 29 | console.debug('Executing LoginController.'); 30 | } 31 | ]); 32 | 33 | })(); 34 | 35 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/MenuController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('MenuController', ['$scope', '$http', '$location', 7 | 'verto', 'storage', '$rootScope', 8 | function($scope, $http, $location, verto, storage, $rootScope) { 9 | console.debug('Executing MenuController.'); 10 | $scope.storage = storage; 11 | 12 | $rootScope.$on('testSpeed', function(e, data) { 13 | var vidQual = storage.data.vidQual; 14 | var bwp = 4; 15 | 16 | $scope.bandDown = data.downKPS; 17 | $scope.bandUp = data.upKPS; 18 | 19 | if (data.downKPS < 2000) { 20 | bwp--; 21 | } 22 | 23 | if (data.upKPS < 2000) { 24 | bwp--; 25 | } 26 | 27 | $scope.iconClass = 'mdi-device-signal-wifi-4-bar green'; 28 | 29 | if (bwp < 4) { 30 | $scope.iconClass = 'mdi-device-signal-wifi-3-bar yellow'; 31 | } else if (bwp < 2) { 32 | $scope.iconClass = 'mdi-device-signal-wifi-1-bar red'; 33 | } 34 | 35 | verto.videoQuality.forEach(function(vid) { 36 | if (vid.id == vidQual){ 37 | $scope.vidRes = vid.label; 38 | } 39 | }); 40 | 41 | $scope.$apply(); 42 | }); 43 | } 44 | ]); 45 | 46 | })(); 47 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/ModalDialpadController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('ModalDialpadController', ['$scope', 7 | '$modalInstance', 8 | function($scope, $modalInstance) { 9 | 10 | $scope.ok = function() { 11 | $modalInstance.close('Ok.'); 12 | }; 13 | 14 | $scope.cancel = function() { 15 | $modalInstance.dismiss('cancel'); 16 | }; 17 | 18 | } 19 | ]); 20 | })(); -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/ModalLoginInformationController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('ModalLoginInformationController', ['$scope', 7 | '$http', '$location', '$modalInstance', 'verto', 'storage', 8 | function($scope, $http, $location, $modalInstance, verto, storage) { 9 | console.debug('Executing ModalLoginInformationController.'); 10 | 11 | $scope.verto = verto; 12 | $scope.storage = storage; 13 | 14 | $scope.ok = function() { 15 | $modalInstance.close('Ok.'); 16 | }; 17 | 18 | $scope.cancel = function() { 19 | $modalInstance.dismiss('cancel'); 20 | }; 21 | 22 | verto.data.name = storage.data.name; 23 | verto.data.email = storage.data.email; 24 | 25 | } 26 | ]); 27 | 28 | })(); 29 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/ModalWsReconnectController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('ModalWsReconnectController', ModalWsReconnectController); 7 | 8 | ModalWsReconnectController.$inject = ['$rootScope', '$scope', 'storage', 'verto']; 9 | 10 | function ModalWsReconnectController($rootScope, $scope, storage, verto) { 11 | console.debug('Executing ModalWsReconnectController'); 12 | 13 | $scope.closeReconnect = closeReconnect; 14 | 15 | function closeReconnect() { 16 | if ($rootScope.ws_modalInstance && verto.data.instance) { 17 | verto.data.instance.rpcClient.stopRetrying(); 18 | $rootScope.ws_modalInstance.close(); 19 | delete verto.data.instance; 20 | } 21 | }; 22 | }; 23 | 24 | 25 | })(); 26 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/PreviewController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('PreviewController', ['$rootScope', '$scope', 7 | '$http', '$location', '$modal', '$timeout', 'toastr', 'verto', 'storage', 'prompt', 'Fullscreen', '$translate', 8 | function($rootScope, $scope, $http, $location, $modal, $timeout, toastr, 9 | verto, storage, prompt, Fullscreen, $translate) { 10 | 11 | $scope.storage = storage; 12 | console.debug('Executing PreviewController.'); 13 | var localVideo = document.getElementById('videopreview'); 14 | var volumes = document.querySelector('#mic-meter .volumes'); 15 | if (volumes) { 16 | volumes = volumes.children; 17 | } 18 | 19 | $scope.localVideo = function() { 20 | var constraints = { 21 | mirrored: true, 22 | audio: { 23 | optional: [{ sourceId: storage.data.selectedAudio }] 24 | } 25 | }; 26 | 27 | var newDevice = verto.data.videoDevices.find(function(device) { 28 | return device.id == storage.data.selectedVideo; 29 | }); 30 | 31 | storage.data.selectedVideo = newDevice.id; 32 | storage.data.selectedVideoName = newDevice.label; 33 | 34 | if (newDevice.id !== 'none') { 35 | constraints.video = { 36 | optional: [{ sourceId: newDevice.id }] 37 | }; 38 | } 39 | 40 | navigator.getUserMedia(constraints, handleMedia, function(err, data) { 41 | 42 | }); 43 | }; 44 | var audioContext = null; 45 | if (typeof AudioContext !== "undefined") { 46 | audioContext = new AudioContext(); 47 | } 48 | 49 | var mediaStreamSource = null; 50 | var meter = null; 51 | var streamObj = {}; 52 | 53 | function stopMedia(stream) { 54 | if (typeof stream == 'function') { 55 | stream.stop(); 56 | } else { 57 | if (stream.active) { 58 | var tracks = stream.getTracks(); 59 | tracks.forEach(function(track, index) { 60 | track.stop(); 61 | }) 62 | } 63 | } 64 | } 65 | function handleMedia(stream) { 66 | if (streamObj) { 67 | stopMedia(streamObj); 68 | } 69 | 70 | streamObj = stream; 71 | FSRTCattachMediaStream(localVideo, stream); 72 | if (audioContext) { 73 | mediaStreamSource = audioContext.createMediaStreamSource(stream); 74 | meter = createAudioMeter(audioContext); 75 | mediaStreamSource.connect(meter); 76 | }; 77 | } 78 | 79 | function renderMic() { 80 | // meter.volume; 81 | var n = Math.round(meter.volume * 25); 82 | for(var i = volumes.length -1, j = 0; i >= 0; i--, j++) { 83 | var el = angular.element(volumes[j]); 84 | if (i >= n) el.removeClass('active'); 85 | else el.addClass('active'); 86 | } 87 | 88 | if(!verto.data.call) { 89 | window.requestAnimationFrame(renderMic); 90 | } 91 | } 92 | /** 93 | * TODO: useless? 94 | */ 95 | 96 | $scope.refreshDeviceList = function() { 97 | return verto.refreshDevices(); 98 | }; 99 | 100 | $scope.videoCall = function() { 101 | prompt({ 102 | title: $translate.instant('TITLE_ENABLE_VIDEO'), 103 | message: $translate.instant('MESSAGE_ENABLE_VIDEO') 104 | }).then(function() { 105 | storage.data.videoCall = true; 106 | $scope.callTemplate = 'partials/video_call.html'; 107 | }); 108 | }; 109 | 110 | $scope.cbMuteVideo = function(event, data) { 111 | storage.data.mutedVideo = !storage.data.mutedVideo; 112 | } 113 | 114 | $scope.cbMuteMic = function(event, data) { 115 | storage.data.mutedMic = !storage.data.mutedMic; 116 | } 117 | 118 | $scope.confChangeVideoLayout = function(layout) { 119 | verto.data.conf.setVideoLayout(layout); 120 | }; 121 | 122 | $scope.endPreview = function() { 123 | localVideo.src = null; 124 | if (audioContext) { 125 | meter.shutdown(); 126 | meter.onaudioprocess = null; 127 | }; 128 | stopMedia(streamObj); 129 | $location.path('/dialpad'); 130 | storage.data.preview = false; 131 | }; 132 | 133 | $scope.localVideo(); 134 | } 135 | ]); 136 | })(); 137 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/SettingsController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('SettingsController', ['$scope', '$http', 7 | '$location', '$rootScope', 'storage', 'verto', '$translate', 'toastr', 'configLanguages', 8 | function($scope, $http, $location, $rootScope, storage, verto, $translate, toastr, configLanguages) { 9 | console.debug('Executing ModalSettingsController.'); 10 | 11 | $.material.init(); 12 | 13 | $scope.speakerFeature = typeof document.getElementById('webcam').sinkId !== 'undefined'; 14 | $scope.storage = storage; 15 | $scope.verto = verto; 16 | $scope.mydata = angular.copy(storage.data); 17 | $scope.languages = configLanguages.languages; 18 | $scope.languages.unshift({id: 'browser', name : $translate.instant('BROWSER_LANGUAGE')}); 19 | $scope.mydata.language = storage.data.language || 'browser'; 20 | 21 | $rootScope.$on('$translateChangeSuccess', function () { 22 | $translate('BROWSER_LANGUAGE').then(function (translation) { 23 | $scope.languages[0].name = translation; 24 | }); 25 | }); 26 | 27 | $rootScope.$on('toggledSettings', function(e, status) { 28 | if (status) { 29 | $scope.mydata = angular.copy(storage.data); 30 | } else { 31 | $scope.ok(); 32 | } 33 | }); 34 | 35 | $scope.ok = function() { 36 | console.log('Camera Selected is', $scope.mydata.selectedVideo, $scope.verto.data.videoDevices); 37 | 38 | angular.forEach(verto.data.videoDevices, function(video) { 39 | console.log('checking video ', video); 40 | if (video.id == $scope.mydata.selectedVideo) { 41 | $scope.mydata.selectedVideoName = video.label; 42 | console.log('Setting selectedVideoName to ', video.label); 43 | } 44 | }) 45 | if ($scope.mydata.selectedSpeaker != storage.data.selectedSpeaker) { 46 | $rootScope.$emit('changedSpeaker', $scope.mydata.selectedSpeaker); 47 | } 48 | storage.changeData($scope.mydata); 49 | verto.data.instance.iceServers(storage.data.useSTUN); 50 | 51 | if (storage.data.autoBand) { 52 | $scope.testSpeed(); 53 | } 54 | 55 | var audioParams = { 56 | googEchoCancellation: storage.data.googEchoCancellation === undefined ? true : storage.data.googEchoCancellation, 57 | googNoiseSuppression: storage.data.googNoiseSuppression === undefined ? true : storage.data.googNoiseSuppression, 58 | googHighpassFilter: storage.data.googHighpassFilter === undefined ? true : storage.data.googHighpassFilter, 59 | googAutoGainControl: storage.data.googAutoGainControl === undefined ? true : storage.data.googAutoGainControl, 60 | googAutoGainControl2: storage.data.googAutoGainControl === undefined ? true : storage.data.googAutoGainControl 61 | }; 62 | verto.data.instance.options.audioParams = audioParams; 63 | 64 | }; 65 | 66 | $scope.changedLanguage = function(langKey){ 67 | if (langKey === 'browser'){ 68 | storage.data.language = 'browser'; 69 | var browserlang = $translate.preferredLanguage(); 70 | $translate.use(browserlang).then( 71 | function(lang) {}, function(fail_lang) { 72 | $translate.use('en'); 73 | }); 74 | } else { 75 | $translate.use(langKey); 76 | storage.data.language = langKey; 77 | } 78 | }; 79 | 80 | $scope.refreshDeviceList = function() { 81 | return verto.refreshDevices(); 82 | }; 83 | 84 | $scope.showPreview = function() { 85 | var settingsEl = angular.element(document.querySelector('#settings')); 86 | settingsEl.toggleClass('toggled'); 87 | if (!verto.data.call) { 88 | $location.path('/preview'); 89 | return; 90 | } 91 | else { 92 | toastr.warning($translate.instant('MESSAGE_DISPLAY_SETTINGS')); 93 | } 94 | }; 95 | 96 | $scope.testSpeed = function() { 97 | $scope.isTestingSpeed = true; 98 | return verto.testSpeed(cb); 99 | 100 | function cb(data) { 101 | $scope.mydata.vidQual = storage.data.vidQual; 102 | $scope.speedMsg = 'Up: ' + data.upKPS + ' Down: ' + data.downKPS; 103 | $scope.isTestingSpeed = false; 104 | $scope.$apply(); 105 | } 106 | }; 107 | 108 | $scope.resetSettings = function() { 109 | if (confirm('Factory Reset Settings?')) { 110 | storage.factoryReset(); 111 | $scope.logout(); 112 | window.location.reload(); 113 | }; 114 | }; 115 | 116 | $scope.checkAutoBand = function(option) { 117 | $scope.mydata.useDedenc = false; 118 | var bestres = videoQuality[videoQuality.length-1]; 119 | $scope.mydata.vidQual = bestres.id; 120 | storage.data.vidQual = bestres.id; 121 | verto.data.instance.videoParams({ 122 | minWidth: bestres.width, 123 | minHeight: bestres.height, 124 | maxWidth: bestres.width, 125 | maxHeight: bestres.height, 126 | minFrameRate: 15, 127 | vertoBestFrameRate: storage.data.bestFrameRate 128 | }); 129 | storage.data.vidQual = bestres.id; 130 | if (!option) { 131 | $scope.mydata.outgoingBandwidth = 'default'; 132 | $scope.mydata.incomingBandwidth = 'default'; 133 | $scope.mydata.testSpeedJoin = false; 134 | 135 | } else { 136 | $scope.mydata.testSpeedJoin = true; 137 | } 138 | }; 139 | 140 | $scope.checkUseDedRemoteEncoder = function(option) { 141 | if (['0', 'default', '5120'].indexOf(option) != -1) { 142 | $scope.mydata.useDedenc = false; 143 | } else { 144 | $scope.mydata.useDedenc = true; 145 | } 146 | }; 147 | 148 | $scope.checkVideoQuality = function(resolution) { 149 | var w = videoResolution[resolution]['width']; 150 | var h = videoResolution[resolution]['height']; 151 | storage.data.vidQual = resolution; 152 | verto.data.instance.videoParams({ 153 | minWidth: w, 154 | minHeight: h, 155 | maxWidth: w, 156 | maxHeight: h, 157 | minFrameRate: 15, 158 | vertoBestFrameRate: storage.data.bestFrameRate 159 | }); 160 | 161 | }; 162 | 163 | } 164 | ]); 165 | 166 | })(); 167 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/controllers/SplashScreenController.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoControllers') 6 | .controller('SplashScreenController', ['$scope', '$rootScope', '$location', '$timeout', 'storage', 'splashscreen', 'prompt', 'verto', 7 | function($scope, $rootScope, $location, $timeout, storage, splashscreen, prompt, verto) { 8 | console.debug('Executing SplashScreenController.'); 9 | 10 | $scope.progress_percentage = splashscreen.progress_percentage; 11 | $scope.message = ''; 12 | $scope.interrupt_next = false; 13 | $scope.errors = []; 14 | 15 | var redirectTo = function(link, activity) { 16 | if(activity) { 17 | if(activity == 'browser-upgrade') { 18 | link = activity; 19 | } 20 | } 21 | 22 | $location.path(link); 23 | } 24 | 25 | var checkProgressState = function(current_progress, status, promise, activity, soft, interrupt, message) { 26 | $scope.progress_percentage = splashscreen.calculate(current_progress); 27 | $scope.message = message; 28 | 29 | if(interrupt && status == 'error') { 30 | $scope.errors.push(message); 31 | if(!soft) { 32 | redirectTo('', activity); 33 | return; 34 | } else { 35 | message = message + '. Continue?'; 36 | }; 37 | 38 | if(!confirm(message)) { 39 | $scope.interrupt_next = true; 40 | }; 41 | }; 42 | 43 | if($scope.interrupt_next) { 44 | return; 45 | }; 46 | 47 | $scope.message = splashscreen.getProgressMessage(current_progress+1); 48 | 49 | return true; 50 | }; 51 | 52 | $rootScope.$on('progress.next', function(ev, current_progress, status, promise, activity, soft, interrupt, message) { 53 | $timeout(function() { 54 | if(promise) { 55 | promise.then(function(response) { 56 | message = response['message']; 57 | status = response['status']; 58 | if(checkProgressState(current_progress, status, promise, activity, soft, interrupt, message)) { 59 | splashscreen.next(); 60 | }; 61 | }); 62 | 63 | return; 64 | } 65 | 66 | if(!checkProgressState(current_progress, status, promise, activity, soft, interrupt, message)) { 67 | return; 68 | } 69 | 70 | splashscreen.next(); 71 | }, 400); 72 | }); 73 | 74 | $rootScope.$on('progress.complete', function(ev, current_progress) { 75 | $scope.message = 'Complete'; 76 | if(verto.data.connected) { 77 | if (0 && storage.data.preview) { 78 | $location.path('/preview'); 79 | } 80 | else { 81 | $location.path('/dialpad'); 82 | } 83 | } else { 84 | redirectTo('/login'); 85 | $location.path('/login'); 86 | } 87 | }); 88 | 89 | splashscreen.next(); 90 | 91 | }]); 92 | 93 | })(); 94 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoControllers/vertoControllers.module.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | var vertoControllers = angular.module('vertoControllers', [ 5 | 'ui.bootstrap', 6 | 'vertoService', 7 | 'storageService', 8 | 'ui.gravatar' 9 | ]); 10 | 11 | })(); 12 | -------------------------------------------------------------------------------- /verto_communicator/src/vertoDirectives/directives/autofocus.js: -------------------------------------------------------------------------------- 1 | /* 2 | Sometimes autofocus HTML5 directive just isn't enough with SPAs. 3 | This directive will force autofocus to work properly under those circumstances. 4 | */ 5 | (function () { 6 | 'use strict'; 7 | 8 | angular 9 | .module('vertoDirectives') 10 | .directive('autofocus', ['$timeout', 11 | function ($timeout) { 12 | return { 13 | restrict: 'A', 14 | link: function ($scope, $element) { 15 | $timeout(function () { 16 | $element[0].focus(); 17 | }); 18 | } 19 | }; 20 | } 21 | ]); 22 | })(); -------------------------------------------------------------------------------- /verto_communicator/src/vertoDirectives/directives/showControls.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoDirectives') 6 | .directive('showControls', 7 | function(Fullscreen) { 8 | var link = function(scope, element, attrs) { 9 | var i = null; 10 | jQuery('.video-footer').fadeIn('slow'); 11 | jQuery('.video-hover-buttons').fadeIn('slow'); 12 | element.parent().bind('mousemove', function() { 13 | if (Fullscreen.isEnabled()) { 14 | clearTimeout(i); 15 | jQuery('.video-footer').fadeIn('slow'); 16 | jQuery('.video-hover-buttons').fadeIn(500); 17 | i = setTimeout(function() { 18 | if (Fullscreen.isEnabled()) { 19 | jQuery('.video-footer').fadeOut('slow'); 20 | jQuery('.video-hover-buttons').fadeOut(500); 21 | } 22 | }, 3000); 23 | } 24 | }); 25 | element.parent().bind('mouseleave', function() { 26 | jQuery('.video-footer').fadeIn(); 27 | jQuery('.video-hover-buttons').fadeIn(); 28 | }); 29 | } 30 | 31 | 32 | return { 33 | link: link 34 | }; 35 | }); 36 | 37 | })(); -------------------------------------------------------------------------------- /verto_communicator/src/vertoDirectives/directives/userStatus.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | 4 | angular 5 | .module('vertoDirectives').directive('userStatus', 6 | function() { 7 | var link = function(scope, element, attrs) { 8 | scope.$watch('condition', function(condition) { 9 | element.removeClass('connected'); 10 | element.removeClass('disconnected'); 11 | element.removeClass('connecting'); 12 | 13 | element.addClass(condition); 14 | 15 | }); 16 | } 17 | 18 | return { 19 | scope: { 20 | 'condition': '=' 21 | }, 22 | link: link 23 | }; 24 | 25 | }); 26 | 27 | })(); -------------------------------------------------------------------------------- /verto_communicator/src/vertoDirectives/directives/videoTag.js: -------------------------------------------------------------------------------- 1 | /** 2 | * To RTC work properly we need to give a