Merge pull request #765 in FS/freeswitch from ~DCOLOMBO/freeswitch:feature/FS-8972-add-i18n to master

* commit '6c197ae2f0cb647ab20bc5143870a80c3dd8d602':
  FS-8972 - [verto_communicator]  add i18n using angular-translate and static file loader
This commit is contained in:
Italo Rossi 2016-03-29 14:48:42 -05:00
commit 6bb8078810
23 changed files with 504 additions and 191 deletions

View File

@ -120,6 +120,7 @@ module.exports = function (grunt) {
'<%= config.app %>/**/*.html', '<%= config.app %>/**/*.html',
'.tmp/styles/{,*/}*.css', '.tmp/styles/{,*/}*.css',
'<%= config.app %>/images/{,*/}*', '<%= config.app %>/images/{,*/}*',
'<%= config.app %>/locales/{,*/}*',
'.tmp/**/*.js', '.tmp/**/*.js',
'<%= config.app %>/**/*.js' '<%= config.app %>/**/*.js'
], ],
@ -150,6 +151,7 @@ module.exports = function (grunt) {
], ],
routes: { routes: {
'/partials': 'src/partials', '/partials': 'src/partials',
'/locales': 'src/locales',
'/config.json': 'src/config.json', '/config.json': 'src/config.json',
'/contributors.txt': 'src/contributors.txt', '/contributors.txt': 'src/contributors.txt',
'/bower_components': './bower_components', '/bower_components': './bower_components',
@ -309,7 +311,8 @@ module.exports = function (grunt) {
'img/*.png', 'img/*.png',
'images/{,*/}*.{webp}', 'images/{,*/}*.{webp}',
'css/fonts/{,*/}*.*', 'css/fonts/{,*/}*.*',
'sounds/*.*' 'sounds/*.*',
'locales/*.*'
] ]
}, { }, {
expand: true, expand: true,

View File

@ -43,7 +43,9 @@
"jquery-json": "~2.5.1", "jquery-json": "~2.5.1",
"datatables": "~1.10.8", "datatables": "~1.10.8",
"angular-bootstrap": "~0.14.3", "angular-bootstrap": "~0.14.3",
"bootstrap-material-design": "~0.3.0" "bootstrap-material-design": "~0.3.0",
"angular-translate": "~2.10.0",
"angular-translate-loader-static-files": "~2.10.0"
}, },
"resolutions": { "resolutions": {
"angular": "~1.3.15", "angular": "~1.3.15",

View File

@ -1728,6 +1728,10 @@ body:-webkit-full-screen #incall .video-footer {
color: white; color: white;
} }
#settings .checkbox .checkbox-material .check {
margin-right: 10px;
}
#settings .btn { #settings .btn {
color: rgba(0, 10, 66, 0.84); color: rgba(0, 10, 66, 0.84);
background-color: #E8E8E8; background-color: #E8E8E8;

View File

@ -97,6 +97,8 @@
<script src="bower_components/datatables/media/js/jquery.dataTables.js"></script> <script src="bower_components/datatables/media/js/jquery.dataTables.js"></script>
<script src="bower_components/bootstrap-material-design/dist/js/material.js"></script> <script src="bower_components/bootstrap-material-design/dist/js/material.js"></script>
<script src="bower_components/bootstrap-material-design/dist/js/ripples.js"></script> <script src="bower_components/bootstrap-material-design/dist/js/ripples.js"></script>
<script src="bower_components/angular-translate/angular-translate.js"></script>
<script src="bower_components/angular-translate-loader-static-files/angular-translate-loader-static-files.js"></script>
<!-- endbower --> <!-- endbower -->
<!-- endbuild --> <!-- endbuild -->

View File

@ -0,0 +1,143 @@
{
"TITLE_ACTIVE_CALL": "Oops, Active Call in Course.",
"MESSAGE_ACTIVE_CALL_HANGUP": "It seems that you are in a call. Do you want to hang up?",
"MESSAGE_ACTIVE_CALL_BACK": "It seems you were in a call before leaving the last time. Wanna go back to that?",
"TITLE_INCOMING_CALL": "Incoming Call",
"MESSAGE_INCOMING_CALL": "from ",
"MESSAGE_NO_HANGUP_CALL": "There is no call to hangup.",
"MESSAGE_ENTER_FILENAME": "Please, enter filename",
"TITLE_ENABLE_VIDEO": "Would you like to activate video for this call?",
"MESSAGE_ENABLE_VIDEO": "Video will be active during the next calls.",
"TITLE_INSERT_BANNER": "Please insert the banner text",
"TITLE_INSERT_CANVAS_ID": "Please insert the Canvas Id",
"TITLE_INSERT_LAYER": "Please insert the Layer",
"TITLE_TRANSFER": "Transfer party?",
"MESSAGE_TRANSFER": "To what destination would you like to transfer this call?",
"LABEL_TRANSFER": "Destination",
"MESSAGE_DISPLAY_SETTINGS": "Can't display preview settings during a call",
"BUTTON_END_CALL": "End Call",
"BUTTON_CLOSE": "Close",
"MESSAGE_PLAY": "Play",
"MESSAGE_STOP": "Stop",
"MESSAGE_RECORD": "Record",
"MESSAGE_STOP_RECORD": "Stop Record",
"MESSAGE_SNAPSHOT": "Snapshot",
"MESSAGE_VIDEO_MODE": "Video Mode",
"MESSAGE_MUTE_MIC": "(un)Mute Mic",
"MESSAGE_MUTE_VIDEO": "(un)Mute Video",
"MESSAGE_FULLSCREEN": "Toggle Fullscreen Mode",
"MESSAGE_SCREENSHARE": "Screenshare",
"MESSAGE_OPEN_CLOSE_CHAT": "Open/Close Chat",
"MESSAGE_SPEAKER": "Speaker",
"MESSAGE_POPUP": "Popup",
"CHAT_TITLE_MEMBERS": "Members",
"CHAT_TITLE": "Chat",
"CHAT_NO_MEMBERS": "There are no members to show.",
"CHAT_GENERAL": "General",
"CHAT_TITLE_KICK": "Kick",
"CHAT_KICK": "Kick",
"CHAT_TITLE_VIDEO_FLOOR": "Video Floor",
"CHAT_FLOOR": "Floor",
"CHAT_TITLE_TRANSFER": "Transfer",
"CHAT_TRANSFER": "Transfer",
"CHAT_BANNER": "Banner",
"CHAT_TITLE_SET": "Set",
"CHAT_SET": "Set",
"CHAT_TITLE_RESET": "Reset",
"CHAT_RESET": "Reset",
"CHAT_CANVAS": "Canvas",
"CHAT_CANVAS_IN": "Canvas In",
"CHAT_CANVAS_OUT": "Canvas Out",
"CHAT_PREV": "Prev",
"CHAT_NEXT": "Next",
"CHAT_LAYER": "Layer",
"CHAT_AUDIO_VIDEO": "Audio/Video",
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Mute/Unmute Mic",
"CHAT_MUTE_MIC": "Mute",
"CHAT_UNMUTE_MIC": "Unmute",
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Mute/Unmute Video",
"CHAT_NO_MESSAGES": "There are no messages to show.",
"CHAT_SEND_MESSAGE": "Send",
"CHAT_TYPE_MESSAGE": "Type your message here...",
"TITLE_CONTRIBUTORS": "Contributors",
"MESSAGE_CONNECTION_UNTRUSTED": "This Connection is Untrusted.",
"MESSAGE_TOGGLE_NAVIGATION": "Toggle navigation",
"BANDWIDTH_INFO": "Bandwidth Info",
"BANDWIDTH_INFO_INCOMING": "Incoming:",
"BANDWIDTH_INFO_OUTGOING": "Outgoing:",
"BANDWIDTH_INFO_VIDEO_RES": "Video Resolution:",
"IN_CALL": "In Call:",
"LAST_CALL": "Last Call:",
"OPEN_NEW_WINDOW": "Open New Window",
"CHANGE_LOGIN_INFO": "Change Login Information",
"LOGOUT": "Logout",
"ABOUT": "About",
"HELP": "Help",
"CONTRIBUTORS": "Contributors",
"TITLE_PREVIEW_SETTINGS": "Setup your camera and microphone settings",
"CAMERA__SETTNGS": "Camera:",
"MIC_SETTINGS": "Microphone:",
"SAVE": "Save",
"LOADING": "Loading",
"ERRORS" : "Errors",
"CALLING_TO": "Calling to ",
"CANCELLING": "Cancelling...",
"DETERMINING_SPEED": "Determining your speed...",
"CALL_HISTORY": "Call History",
"CLEAR_CALL_HISTORY": "Clear History",
"NO_CALL_HISTORY": "No history calls.",
"ENTER_EXTENSION": "Enter an extension",
"CALL_EXTENSION": "Call Extension",
"LOGIN": "Login",
"LOGIN_INFORMATION": "Login Information",
"SAVE_LOGIN_INFORMATION": "Save Login Information",
"INVALID_LOGIN_FIELDS": "Verify the fields below and try again.",
"NAME": "Name",
"YOUR_NAME": "Your name",
"EMAIL": "Email",
"YOUR_EMAIL": "Your email",
"USER": "User",
"PASSWORD": "Password",
"CALLER_ID": "Caller ID",
"HOSTNAME": "Hostname",
"WEBSOCKET_URL": "Websocket URL",
"SETTINGS": "Settings",
"DEVICE_SETTINGS": "Device Settings",
"SHARE_DEVICE": "Share device",
"SPEAKER": "Speaker:",
"SPEAKER_FEATURE": "Your browser doesn't seem to support this feature",
"PREVIEW_SETTINGS": "Preview Settings",
"REFRESH_DEVICE_LIST": "Refresh device list",
"GENERAL_SETTINGS": "General settings:",
"USE_VIDEO": "Use Video",
"USE_STEREO_AUDIO": "Stereo Audio",
"USE_STUN": "Use STUN",
"SCALE_VIDEO": "Scale Remote Video To Match Camera Resolution",
"ASK_BEFORE_RECOVER": "Ask before recovering call",
"BEST_FRAME_RATE": "Best frame rate:",
"AUDIO_SETTINGS": "Audio settings:",
"ECHO_CANCEL": "Echo Cancellation",
"NOISE_SUPPRESSION": "Noise Suppression",
"HIGHPASS_FILTER": "Highpass Filter",
"VIDEO_SETTINGS": "Video settings:",
"REMOTE_ENCODER": "Dedicated Remote Encoder enabled.",
"AUTO_SPEED_RES": "Automatically determine speed and resolution settings",
"RECHECK_BANDWIDTH": "Recheck bandwidth before each outgoing call",
"CHECK_NETWORK_SPEED": "Check Network Speed",
"VIDEO_QUALITY": "Video quality:",
"MAX_INCOMING_BANDWIDTH": "Max incoming bandwidth:",
"MAX_OUTGOING_BANDWIDTH": "Max outgoing bandwidth:",
"FACTORY_RESET": "Factory reset",
"SAVE_DEVICE_SETTINGS": "Save Device Settings",
"BROWSER_COMPATIBILITY": "Checking browser compatibility.",
"REFRESH_MEDIA_DEVICES": "Refresh Media Devices.",
"BROWSER_WITHOUT_WEBRTC": "Error: browser doesn't support WebRTC.",
"CHECK_PERMISSION_MEDIA": "Checking media permissions",
"CHECK_PROVISIONING_CONF": "Provisioning configuration.",
"CHECK_LOGIN": "Checking login.",
"CHECK_CONNECTION_SPEED": "Check Connection Speed.",
"ERROR_PERMISSION_MEDIA": "Error: Media Permission Denied",
"ERROR_PROVISIONING_CONF": "Error: Provision failed.",
"PLEASE_WAIT": "Please wait..."
}

View File

@ -0,0 +1,144 @@
{
"TITLE_ACTIVE_CALL": "Oops, Chiamata in corso.",
"MESSAGE_ACTIVE_CALL_HANGUP": "Sembra che tu sia in conversazione. Vuoi chiudere la chiamata?",
"MESSAGE_ACTIVE_CALL_BACK": "Sembra che eri in conversazione prima di abbandonare la sessione l'ultima volta. Vuoi tornare in quella conversazione?",
"TITLE_INCOMING_CALL": "Chiamata in arrivo",
"MESSAGE_INCOMING_CALL": "da ",
"MESSAGE_NO_HANGUP_CALL": "Non ci sono chiamate da chiudere.",
"MESSAGE_ENTER_FILENAME": "Per favore, inserisci il nome del file",
"TITLE_ENABLE_VIDEO": "Vuoi attivare il video per questa chiamata?",
"MESSAGE_ENABLE_VIDEO": "Il video verrà attivato a partire dalla prossima chiamata.",
"TITLE_INSERT_BANNER": "Per favore inserisci il testo del banner",
"TITLE_INSERT_CANVAS_ID": "Please insert the Canvas Id",
"TITLE_INSERT_LAYER": "Please insert the Layer",
"TITLE_TRANSFER": "Transfer party?",
"MESSAGE_TRANSFER": "To what destination would you like to transfer this call?",
"LABEL_TRANSFER": "Destinazione",
"MESSAGE_DISPLAY_SETTINGS": "Non è possibile mostrare le configurazioni video durante una chiamata",
"BUTTON_END_CALL": "Termina la chiamata",
"BUTTON_CLOSE": "Chiudi",
"MESSAGE_PLAY": "Riproduci",
"MESSAGE_STOP": "Ferma",
"MESSAGE_RECORD": "Registra",
"MESSAGE_STOP_RECORD": "Ferma la registrazione",
"MESSAGE_SNAPSHOT": "Snapshot",
"MESSAGE_VIDEO_MODE": "Video Mode",
"MESSAGE_MUTE_MIC": "(un)Mute Mic",
"MESSAGE_MUTE_VIDEO": "(un)Mute Video",
"MESSAGE_FULLSCREEN": "Abilita/Disabilita schermo intero",
"MESSAGE_SCREENSHARE": "Condividi lo schermo",
"MESSAGE_OPEN_CLOSE_CHAT": "Apri/Chiudi Chat",
"MESSAGE_SPEAKER": "Speaker",
"MESSAGE_POPUP": "Popup",
"CHAT_TITLE_MEMBERS": "Membri",
"CHAT_TITLE": "Chat",
"CHAT_NO_MEMBERS": "Non ci sono membri da mostrare.",
"CHAT_GENERAL": "Generale",
"CHAT_TITLE_KICK": "Kick",
"CHAT_KICK": "Kick",
"CHAT_TITLE_VIDEO_FLOOR": "Video Floor",
"CHAT_FLOOR": "Floor",
"CHAT_TITLE_TRASFER": "Transfer",
"CHAT_TRANSFER": "Transfer",
"CHAT_BANNER": "Banner",
"CHAT_TITLE_SET": "Set",
"CHAT_SET": "Set",
"CHAT_TITLE_RESET": "Reset",
"CHAT_RESET": "Reset",
"CHAT_RESET": "Reset",
"CHAT_CANVAS": "Canvas",
"CHAT_CANVAS_IN": "Canvas In",
"CHAT_CANVAS_OUT": "Canvas Out",
"CHAT_PREV": "Prev",
"CHAT_NEXT": "Next",
"CHAT_LAYER": "Layer",
"CHAT_AUDIO_VIDEO": "Audio/Video",
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Mute/Unmute Mic",
"CHAT_MUTE_MIC": "Mute",
"CHAT_UNMUTE_MIC": "Unmute",
"CHAT_TITLE_MUTE_UNMUTE_MIC": "Mute/Unmute Video",
"CHAT_NO_MESSAGES": "Non ci sono messaggi da mostrare.",
"CHAT_SEND_MESSAGE": "Invia",
"CHAT_TYPE_MESSAGE": "Scrivi il tuo messaggio qui...",
"TITLE_CONTRIBUTORS": "Contributori",
"MESSAGE_CONNECTION_UNTRUSTED": "Questa connessione non è sicura.",
"MESSAGE_TOGGLE_NAVIGATION": "Abilita/Disabilita navigazione",
"BANDWIDTH_INFO": "Informazioni sulla larghezza di banda",
"BANDWIDTH_INFO_INCOMING": "Ingresso:",
"BANDWIDTH_INFO_OUTGOING": "Uscita:",
"BANDWIDTH_INFO_VIDEO_RES": "Risoluzione Video:",
"IN_CALL": "In chiamata: ",
"LAST_CALL": "Ultima chiamata: ",
"OPEN_NEW_WINDOW": "Apri Una Nuova Finestra",
"CHANGE_LOGIN_INFO": "Cambia le informazioni di login",
"LOGOUT": "Logout",
"ABOUT": "About",
"HELP": "Aiuto",
"CONTRIBUTORS": "Contributori",
"TITLE_PREVIEW_SETTINGS": "Configura le impostazioni della tua video camera e del tuo microfono",
"CAMERA_SETTINGS": "Video Camera:",
"MIC_SETTINGS": "Microfono:",
"SAVE": "Salva",
"LOADING": "Caricamento",
"ERRORS" : "Errori",
"CALLING_TO": "Chiamata verso ",
"CANCELLING": "In annullamento",
"DETERMINING_SPEED": "Calcolo della tua velocità...",
"CALL_HISTORY": "Cronologia Chiamate",
"CLEAR_CALL_HISTORY": "Rimuovi la cronologia",
"NO_CALL_HISTORY": "Nessuna chiamata nella cronologia.",
"ENTER_EXTENSION": "Inserisci un numero",
"CALL_EXTENSION": "Chiama il numero",
"LOGIN": "Login",
"LOGIN_INFORMATION": "Informazioni di login",
"SAVE_LOGIN_INFORMATION": "Salva le informazioni di login",
"INVALID_LOGIN_FIELDS": "Verifica i campi e prova di nuovo.",
"NAME": "Nome",
"YOUR_NAME": "Il tuo nome",
"EMAIL": "Email",
"YOUR_EMAIL": "Il tuo indirizzo email",
"USER": "Utente",
"PASSWORD": "Password",
"CALLER_ID": "Caller ID",
"HOSTNAME": "Hostname",
"WEBSOCKET_URL": "Websocket URL",
"SETTINGS": "Impostazioni",
"DEVICE_SETTINGS": "Configurazione dei dispositivi",
"SHARE_DEVICE": "Dispositivo in condivisione",
"SPEAKER": "Altoparlante:",
"SPEAKER_FEATURE": "Il tuo browser sembra non supportare questa funzionalità",
"PREVIEW_SETTINGS": "Anteprima delle configurazioni",
"REFRESH_DEVICE_LIST": "Aggiorna la lista dei dispositivi",
"GENERAL_SETTINGS": "Configurazioni generali:",
"USE_VIDEO": "Abilita Video",
"USE_STEREO_AUDIO": "Abilita Audio Stereo",
"USE_STUN": "Abilita STUN",
"SCALE_VIDEO": "Scala il video remoto con la risoluzione della video camera",
"ASK_BEFORE_RECOVER": "Chiedi prima di recuperare una chiamata",
"BEST_FRAME_RATE": "Miglior frame rate:",
"AUDIO_SETTINGS": "Impostazioni audio:",
"ECHO_CANCEL": "Cancellatore d'eco",
"NOISE_SUPPRESSION": "Soppressione del rumore",
"HIGHPASS_FILTER": "Highpass Filter",
"VIDEO_SETTINGS": "Impostazioni video:",
"REMOTE_ENCODER": "Abilita codificatore remoto dedicato.",
"AUTO_SPEED_RES": "Rileva in modo automatico la velocità e le impostazioni",
"RECHECK_BANDWIDTH": "Controlla la larghezza di banda per ogni chiamata in uscita",
"CHECK_NETWORK_SPEED": "Controllo della velocità di rete",
"VIDEO_QUALITY": "Qualità video:",
"MAX_INCOMING_BANDWIDTH": "Massima larghezza di banda in ingresso:",
"MAX_OUTGOING_BANDWIDTH": "Massima larghezza di banda in uscita:",
"FACTORY_RESET": "Reset ai valori di default",
"SAVE_DEVICE_SETTINGS": "Salva le impostazioni dei dispositivi",
"BROWSER_COMPATIBILITY": "Verifica compatibilità browser.",
"REFRESH_MEDIA_DEVICES": "Aggiornamento dei dispositivi.",
"BROWSER_WITHOUT_WEBRTC": "Errore: il browser non supporta WebRTC.",
"CHECK_PERMISSION_MEDIA": "Verifica permessi dispositivi",
"CHECK_PROVISIONING_CONF": "Recupero della configurazione.",
"CHECK_LOGIN": "Verifica del login.",
"CHECK_CONNECTION_SPEED": "Verifica velocità connessione.",
"ERROR_PERMISSION_MEDIA": "Errore: permesso sui dispositivi negato",
"ERROR_PROVISIONING_CONF": "Errore: Recupero configurazione fallito.",
"PLEASE_WAIT": "Attendere prego..."
}

View File

@ -2,19 +2,19 @@
<ul class="nav nav-tabs" role="tablist" ng-init="activePane = 'members'"> <ul class="nav nav-tabs" role="tablist" ng-init="activePane = 'members'">
<li role="presentation" ng-class="{'active': activePane == 'members'}"> <li role="presentation" ng-class="{'active': activePane == 'members'}">
<a ng-click="activePane = 'members'" href=""> <a ng-click="activePane = 'members'" href="">
Members {{ 'CHAT_TITLE_MEMBERS' | translate}}
</a> </a>
</li> </li>
<li role="presentation" ng-class="{'active': activePane == 'chat'}"> <li role="presentation" ng-class="{'active': activePane == 'chat'}">
<a ng-click="activePane = 'chat'" href=""> <a ng-click="activePane = 'chat'" href="">
Chat {{ 'CHAT_TITLE' | translate }}
</a> </a>
</li> </li>
</ul> </ul>
<div class="chat-members" ng-show="activePane == 'members'"> <div class="chat-members" ng-show="activePane == 'members'">
<div ng-show="!members.length"> <div ng-show="!members.length">
<p class="text-center text-muted">There are no members to show.</p> <p class="text-center text-muted">{{ 'CHAT_NO_MEMBERS' | translate }}</p>
</div> </div>
<div ng-repeat="member in members" class="chat-member-item" ng-class="{ opened: $index == openId }"> <div ng-repeat="member in members" class="chat-member-item" ng-class="{ opened: $index == openId }">
@ -56,33 +56,33 @@
<div class="admin-controls" ng-if="verto.data.confRole == 'moderator'" ng-show="$index == $parent.openId"> <div class="admin-controls" ng-if="verto.data.confRole == 'moderator'" ng-show="$index == $parent.openId">
<div> <div>
<div class="col-md-6 ctrl-section"> <div class="col-md-6 ctrl-section">
<h3>General</h3> <h3>{{ 'CHAT_GENERAL' | translate }}</h3>
<div class="group btn-group-justified"> <div class="group btn-group-justified">
<a href="" class="btn btn-xs" ng-click="confKick(member.id)" title="Kick"> <a href="" class="btn btn-xs" ng-click="confKick(member.id)" title="{{ 'CHAT_TITLE_KICK' | translate }}">
<i class="mdi-fw mdi-av-not-interested"></i> <i class="mdi-fw mdi-av-not-interested"></i>
Kick {{ 'CHAT_KICK' | translate }}
</a> </a>
<a href="" class="btn btn-xs" ng-click="confVideoFloor(member.id)" title="Video Floor"> <a href="" class="btn btn-xs" ng-click="confVideoFloor(member.id)" title="{{ 'CHAT_TITLE_VIDEO_FLOOR' | translate }}">
<i class="mdi-fw mdi-action-aspect-ratio"></i> <i class="mdi-fw mdi-action-aspect-ratio"></i>
Floor {{ 'CHAT_FLOOR' | translate }}
</a> </a>
<a href="" class="btn btn-xs" ng-click="confTransfer(member.id)" title="Transfer"> <a href="" class="btn btn-xs" ng-click="confTransfer(member.id)" title="{{ 'CHAT_TITLE_TRANSFER' | translate }}">
<i class="mdi-fw mdi-communication-call-made"></i> <i class="mdi-fw mdi-communication-call-made"></i>
<span style="margin-left: -9px">Transfer</span> <span style="margin-left: -9px">{{ 'CHAT_TRANSFER' | translate }}</span>
</a> </a>
</div> </div>
</div> </div>
<div class="col-md-6 ctrl-section"> <div class="col-md-6 ctrl-section">
<h3>Banner</h3> <h3>{{ 'CHAT_BANNER' | translate }}</h3>
<div class="group btn-group-justified"> <div class="group btn-group-justified">
<a href="" class="btn btn-xs" ng-click="confBanner(member.id)" title="Set"> <a href="" class="btn btn-xs" ng-click="confBanner(member.id)" title="{{ 'CHAT_TITLE_SET' | translate }}">
<i class="mdi-fw mdi-toggle-radio-button-on"></i> <i class="mdi-fw mdi-toggle-radio-button-on"></i>
Set {{ 'CHAT_SET' | translate }}
</a> </a>
<a href="" class="btn btn-xs" ng-click="confResetBanner(member.id)" title="Reset"> <a href="" class="btn btn-xs" ng-click="confResetBanner(member.id)" title="{{ 'CHAT_TITLE_RESET' | translate }}">
<i class="mdi-fw mdi-content-clear"></i> <i class="mdi-fw mdi-content-clear"></i>
Reset {{ 'CHAT_RESET' | translate }}
</a> </a>
</div> </div>
</div> </div>
@ -90,61 +90,61 @@
<div> <div>
<div class="col-md-6 ctrl-section" ng-if="conf.canvasCount > 1"> <div class="col-md-6 ctrl-section" ng-if="conf.canvasCount > 1">
<h3>Canvas</h3> <h3>{{ 'CHAT_CANVAS' | translate }}</h3>
<div class="group btn-group-justified"> <div class="group btn-group-justified">
<a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id, 'prev')" title="Canvas In"> <a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id, 'prev')" title="{{ 'CHAT_CANVAS_IN' | translate }}">
<i class="mdi-fw mdi-action-open-in-browser"></i> <i class="mdi-fw mdi-action-open-in-browser"></i>
Prev {{ 'CHAT_PREV' | translate }}
</a> </a>
<a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id)" title="Canvas In"> <a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id)" title="{{ 'CHAT_CANVAS_IN' | translate }}">
<i class="mdi-fw mdi-action-open-in-browser"></i> <i class="mdi-fw mdi-action-open-in-browser"></i>
Id Id
</a> </a>
<a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id, 'next')" title="Canvas In"> <a href="" class="btn btn-xs" ng-click="confCanvasIn(member.id, 'next')" title="{{ 'CHAT_CANVAS_IN' | translate }}">
<i class="mdi-fw mdi-action-open-in-browser"></i> <i class="mdi-fw mdi-action-open-in-browser"></i>
Next {{ 'CHAT_NEXT' | translate }}
</a> </a>
</div> </div>
<div class="group btn-group-justified"> <div class="group btn-group-justified">
<a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id, 'prev')" title="Canvas Out"> <a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id, 'prev')" title="{{ 'CHAT_CANVAS_OUT' | translate }}">
<i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i> <i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i>
Prev {{ 'CHAT_PREV' | translate }}
</a> </a>
<a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id)" title="Canvas Out"> <a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id)" title="{{ 'CHAT_CANVAS_OUT' | translate }}">
<i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i> <i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i>
Id Id
</a> </a>
<a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id, 'next')" title="Canvas Out"> <a href="" class="btn btn-xs" ng-click="confCanvasOut(member.id, 'next')" title="{{ 'CHAT_CANVAS_OUT' | translate }}">
<i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i> <i class="mdi-fw mdi-fw mdi-action-system-update-tv"></i>
Next {{ 'CHAT_NEXT' | translate }}
</a> </a>
</div> </div>
<div class="group btn-group-justified"> <div class="group btn-group-justified">
<a href="" class="btn btn-xs" ng-click="confLayer(member.id, 'prev')" title="Layer"> <a href="" class="btn btn-xs" ng-click="confLayer(member.id, 'prev')" title="{{ 'CHAT_LAYER' | translate }}">
<i class="mdi-fw mdi-action-view-carousel"></i> <i class="mdi-fw mdi-action-view-carousel"></i>
Prev {{ 'CHAT_PREV' | translate }}
</a> </a>
<a href="" class="btn btn-xs" ng-click="confLayer(member.id)" title="Layer"> <a href="" class="btn btn-xs" ng-click="confLayer(member.id)" title="{{ 'CHAT_LAYER' | translate }}">
<i class="mdi-fw mdi-action-view-carousel"></i> <i class="mdi-fw mdi-action-view-carousel"></i>
Id Id
</a> </a>
<a href="" class="btn btn-xs" ng-click="confLayer(member.id, 'next')" title="Layer"> <a href="" class="btn btn-xs" ng-click="confLayer(member.id, 'next')" title="{{ 'CHAT_LAYER' | translate }}">
<i class="mdi-fw mdi-action-view-carousel"></i> <i class="mdi-fw mdi-action-view-carousel"></i>
Next {{ 'CHAT_NEXT' | translate }}
</a> </a>
</div> </div>
</div> </div>
<div class="col-md-6 ctrl-section"> <div class="col-md-6 ctrl-section">
<h3>Audio/Video</h3> <h3>{{ 'CHAT_AUDIO_VIDEO' | translate }}</h3>
<div class="group btn-group-justified"> <div class="group btn-group-justified">
<a href="" class="btn btn-xs" ng-click="confMuteMic(member.id)" title="Mute/Unmute Mic"> <a href="" class="btn btn-xs" ng-click="confMuteMic(member.id)" title="{{ 'CHAT_TITLE_MUTE_UNMUTE_MIC' | translate }}">
<i class="mdi-fw" ng-class="member.status.audio.muted ? 'mdi-av-mic-off' : 'mdi-av-mic'"></i> <i class="mdi-fw" ng-class="member.status.audio.muted ? 'mdi-av-mic-off' : 'mdi-av-mic'"></i>
{{ member.status.audio.muted ? 'Unmute' : 'Mute' }} {{ member.status.audio.muted ? 'CHAT_UNMUTE_MIC' : 'CHAT_MUTE_MIC' | translate }}
</a> </a>
<a href="" ng-class="{ 'disabled': !member.status.video }" class="btn btn-xs" ng-click="confMuteVideo(member.id)" title="Mute/Unmute Video"> <a href="" ng-class="{ 'disabled': !member.status.video }" class="btn btn-xs" ng-click="confMuteVideo(member.id)" title="{{ 'CHAT_TITLE_MUTE_UNMUTE_VIDEO' | translate }}">
<i class="mdi-fw" ng-class="member.status.video.muted ? 'mdi-av-videocam-off' : 'mdi-av-videocam'"></i> <i class="mdi-fw" ng-class="member.status.video.muted ? 'mdi-av-videocam-off' : 'mdi-av-videocam'"></i>
{{ member.status.video.muted ? 'Unmute' : 'Mute' }} {{ member.status.video.muted ? 'CHAT_UNMUTE_MIC' : 'CHAT_MUTE_MIC' | translate }}
</a> </a>
</div> </div>
<div class="group btn-group-justified"> <div class="group btn-group-justified">
@ -176,7 +176,7 @@
<div class="chat-history" ng-show="activePane == 'chat'"> <div class="chat-history" ng-show="activePane == 'chat'">
<div class="chat-messages"> <div class="chat-messages">
<div class="chat-message" ng-show="!messages.length"> <div class="chat-message" ng-show="!messages.length">
<p class="text-center text-muted">There are no messages to show.</p> <p class="text-center text-muted">{{ 'CHAT_NO_MESSAGES' | translate }}</p>
</div> </div>
<div class="chat-message" ng-repeat="message in messages" title="Sent at {{ message.created_at|date }}."> <div class="chat-message" ng-repeat="message in messages" title="Sent at {{ message.created_at|date }}.">
<div class="chat-message-metadata">{{ message.from }}:</div> <div class="chat-message-metadata">{{ message.from }}:</div>
@ -188,9 +188,9 @@
<div class="chat-message-input"> <div class="chat-message-input">
<form ng-submit="send()" > <form ng-submit="send()" >
<div class="chat-message-input-group"> <div class="chat-message-input-group">
<textarea ng-model="message" ng-keydown="($event.keyCode == 13 && $event.shiftKey !== true) && send($event)" required="required" class="form-control input-sm" placeholder="Type your message here..."></textarea> <textarea ng-model="message" ng-keydown="($event.keyCode == 13 && $event.shiftKey !== true) && send($event)" required="required" class="form-control input-sm" placeholder="{{ 'CHAT_TYPE_MESSAGE' | translate }}"></textarea>
<button class="btn btn-success btn-sm" type="submit"> <button class="btn btn-success btn-sm" type="submit">
Send {{ 'CHAT_SEND_MESSAGE' | translate }}
<span class="mdi-navigation-arrow-forward chat-message-input-group-icon-button"></span> <span class="mdi-navigation-arrow-forward chat-message-input-group-icon-button"></span>
</button> </button>
</div> </div>

View File

@ -1,5 +1,5 @@
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title">Contributors</h3> <h3 class="modal-title">{{ 'TITLE_CONTRIBUTORS' | translate}}</h3>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<ul class="contributors"> <ul class="contributors">

View File

@ -1,9 +1,9 @@
<div ng-show="loading"> <div ng-show="loading">
<h2 ng-show="cancelled" style="margin-top: 4%;" class="text-center">Cancelling...</h2> <h2 ng-show="cancelled" style="margin-top: 4%;" class="text-center">{{ 'CANCELLING' | translate}}</h2>
<span ng-show="!cancelled"> <span ng-show="!cancelled">
<h2 style="margin-top: 4%;" class="text-center">Determining your speed...</h2> <h2 style="margin-top: 4%;" class="text-center">{{ 'DETERMINING_SPEED' | translate}}</h2>
<h4 style="margin-top: 4%;" class="text-center"> <h4 style="margin-top: 4%;" class="text-center">
Calling to {{ dialpadNumber }}... {{ 'CALLING_TO' | translate}} {{ dialpadNumber }}...
<a class="btn btn-sm btn-raised btn-warning" ng-click="cancel()"> <a class="btn btn-sm btn-raised btn-warning" ng-click="cancel()">
Cancel<div class="ripple-container"></div> Cancel<div class="ripple-container"></div>
</a> </a>
@ -19,7 +19,7 @@
<div class="panel-heading"> <div class="panel-heading">
<div class="panel-title"> <div class="panel-title">
<i class="mdi-navigation-arrow-back back-icon" ng-click="viewCallsList()" ng-if="call_list"></i> <i class="mdi-navigation-arrow-back back-icon" ng-click="viewCallsList()" ng-if="call_list"></i>
<span ng-if="!call_list">Call History</span> <span ng-if="!call_list">{{ 'CALL_HISTORY' | translate}}</span>
<span ng-if="call_list">{{ call_list[0].number }}</span> <span ng-if="call_list">{{ call_list[0].number }}</span>
<span class="pull-right pull-right-margin dropdown"> <span class="pull-right pull-right-margin dropdown">
@ -27,14 +27,14 @@
<i class="mdi-navigation-more-vert"></i> <i class="mdi-navigation-more-vert"></i>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="" ng-click="clearCallHistory()">Clear History</a></li> <li><a href="" ng-click="clearCallHistory()">{{ 'CLEAR_CALL_HISTORY' | translate}}</a></li>
</ul> </ul>
</span> </span>
</div> </div>
</div> </div>
<ul class="call-history"> <ul class="call-history">
<div ng-if="!has_history"> <div ng-if="!has_history">
<p class="text-center text-muted">No history calls.</p> <p class="text-center text-muted">{{ 'NO_CALL_HISTORY' | translate}}</p>
</div> </div>
<li ng-repeat="number in history_control track by number" ng-if="!call_list"> <li ng-repeat="number in history_control track by number" ng-if="!call_list">
@ -72,7 +72,7 @@
<i class="mdi-action-settings-phone"></i> <i class="mdi-action-settings-phone"></i>
</a> </a>
</span> </span>
<input name="dialpadnumber" type="text" class="form-control text-center" placeholder="Enter an extension" ng-model="dialpadNumber" autofocus/> <input name="dialpadnumber" type="text" class="form-control text-center" placeholder="{{ 'ENTER_EXTENSION' | translate}}" ng-model="dialpadNumber" autofocus/>
<span class="input-group-btn"> <span class="input-group-btn">
<a href="" ng-click="backspace()"> <a href="" ng-click="backspace()">
<i class="mdi-content-backspace"></i> <i class="mdi-content-backspace"></i>
@ -163,7 +163,7 @@
</div> </div>
</div> </div>
<div class="form-group text-center"> <div class="form-group text-center">
<button type="submit" class="btn btn-success btn-fab" ng-click="call(dialpadNumber)" title="Call Extension"> <button type="submit" class="btn btn-success btn-fab" ng-click="call(dialpadNumber)" title="{{ 'CALL_EXTENSION' | translate}}">
<i class="mdi-communication-call"></i> <i class="mdi-communication-call"></i>
</button> </button>
</div> </div>

View File

@ -2,59 +2,59 @@
<div class="col-md-4 col-xs-12 col-sm-12 centered-block"> <div class="col-md-4 col-xs-12 col-sm-12 centered-block">
<div class="panel panel-default shadow-z-2"> <div class="panel panel-default shadow-z-2">
<div class="panel-body"> <div class="panel-body">
<h3>Login</h3> <h3>{{ 'LOGIN' | translate}}</h3>
<div ng-show="form.$submitted && form.$invalid" class="alert alert-danger"> <div ng-show="form.$submitted && form.$invalid" class="alert alert-danger">
<p>Verify the fields bellow and try again.</p> <p>{{ 'INVALID_LOGIN_FIELDS' | translate }}</p>
</div> </div>
<form name="form" class="css-form" novalidate ng-init="advanced = false"> <form name="form" class="css-form" novalidate ng-init="advanced = false">
<div class="form-group {{ (((!form.name.$pristine || form.$submitted) && !form.name.$valid) ? 'has-error': '') }}"> <div class="form-group {{ (((!form.name.$pristine || form.$submitted) && !form.name.$valid) ? 'has-error': '') }}">
<label class="control-label" for="login-name">Name</label> <label class="control-label" for="login-name">{{ 'NAME' | translate}}</label>
<input type="text" name="name" class="form-control" id="login-name" placeholder="Your name" required="" ng-model="verto.data.name" autofocus> <input type="text" name="name" class="form-control" id="login-name" placeholder="{{ 'YOUR_NAME' | translate}}" required="" ng-model="verto.data.name" autofocus>
</div> </div>
<div class="form-group {{ (((!form.email.$pristine || form.$submitted) && !form.email.$valid) ? 'has-error': '') }}"> <div class="form-group {{ (((!form.email.$pristine || form.$submitted) && !form.email.$valid) ? 'has-error': '') }}">
<label class="control-label" for="login-email">Email</label> <label class="control-label" for="login-email">{{ 'EMAIL' | translate }}</label>
<input type="email" name="email" class="form-control" id="login-email" placeholder="Your email" required="" ng-model="verto.data.email" ng-model-options="{debounce: 250}"> <input type="email" name="email" class="form-control" id="login-email" placeholder="{{ 'YOUR_EMAIL' | translate}}" required="" ng-model="verto.data.email" ng-model-options="{debounce: 250}">
</div> </div>
<div class="form-group" ng-hide="!advanced"> <div class="form-group" ng-hide="!advanced">
<label class="control-label" for="login-user">User</label> <label class="control-label" for="login-user">{{ 'USER' | translate}}</label>
<input type="text" class="form-control" id="login-user" placeholder="User" ng-model="verto.data.login"> <input type="text" class="form-control" id="login-user" placeholder="{{ 'USER' | translate}}" ng-model="verto.data.login">
</div> </div>
<div class="form-group" ng-hide="!advanced"> <div class="form-group" ng-hide="!advanced">
<label class="control-label" for="login-password">Password</label> <label class="control-label" for="login-password">{{ 'PASSWORD' | translate}}</label>
<input type="password" class="form-control" id="login-password" placeholder="Password" ng-model="verto.data.password"> <input type="password" class="form-control" id="login-password" placeholder={{ 'PASSWORD' | translate}} ng-model="verto.data.password">
</div> </div>
<div class="form-group" ng-hide="!advanced"> <div class="form-group" ng-hide="!advanced">
<label class="control-label" for="login-callerid">Caller ID</label> <label class="control-label" for="login-callerid">{{ 'CALLER_ID' | translate}}</label>
<input type="text" class="form-control" id="login-callerid" placeholder="Caller ID" ng-model="verto.data.callerid"> <input type="text" class="form-control" id="login-callerid" placeholder="{{ 'CALLER_ID' | translate}}" ng-model="verto.data.callerid">
</div> </div>
<div class="form-group" ng-hide="!advanced"> <div class="form-group" ng-hide="!advanced">
<label class="control-label" for="login-hostname">Hostname</label> <label class="control-label" for="login-hostname">{{ 'HOSTNAME' | translate}}</label>
<input type="text" class="form-control" id="login-hostname" placeholder="Hostname" ng-model="verto.data.hostname"> <input type="text" class="form-control" id="login-hostname" placeholder="{{ 'HOSTNAME' | translate}}" ng-model="verto.data.hostname">
</div> </div>
<div class="form-group" ng-hide="!advanced"> <div class="form-group" ng-hide="!advanced">
<label class="control-label" for="login-wsurl">Websocket URL</label> <label class="control-label" for="login-wsurl">{{ 'WEBSOCKET_URL' | translate}}</label>
<input type="text" class="form-control" id="login-wsurl" placeholder="Websocket URL" ng-model="verto.data.wsURL"> <input type="text" class="form-control" id="login-wsurl" placeholder="{{ 'WEBSOCKET_URL' | translate}}" ng-model="verto.data.wsURL">
</div> </div>
<div class="form-group hide"> <div class="form-group hide">
<label for="login-login">Login</label> <label for="login-login">{{ 'LOGIN' | translate}}</label>
<input type="text" class="form-control" id="login-login" placeholder="Login" ng-model="verto.data.login"> <input type="text" class="form-control" id="login-login" placeholder="{{ 'LOGIN' | translate}}" ng-model="verto.data.login">
</div> </div>
<div class="form-group hide"> <div class="form-group hide">
<label for="login-password">Password</label> <label for="login-password">Password</label>
<input type="text" class="form-control" id="login-password" placeholder="Password" ng-model="verto.data.password"> <input type="text" class="form-control" id="login-password" placeholder="{{ 'PASSWORD' | translate}}" ng-model="verto.data.password">
</div> </div>
<div class="form-group text-right"> <div class="form-group text-right">
<div><a style="margin-top: 13px;" href="" ng-click="advanced = !advanced" class="pull-left">Settings</a></div> <div><a style="margin-top: 13px;" href="" ng-click="advanced = !advanced" class="pull-left">{{ 'SETTINGS' | translate}}</a></div>
<div><button type="submit" class="btn btn-success" ng-click="(form.$valid && login())">Login</button></div> <div><button type="submit" class="btn btn-success" ng-click="(form.$valid && login())">{{ 'LOGIN' | translate}}</button></div>
<div ng-if="googlelogin" class="googlelogin"> <div ng-if="googlelogin" class="googlelogin">
<google-plus-signin clientid="{{src/partials/login.html}}" class="center"> <google-plus-signin clientid="{{src/partials/login.html}}" class="center">
</google-plus-signin> </google-plus-signin>

View File

@ -2,13 +2,13 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="https-untrusted navbar-center" ng-show="!safeProtocol"> <div class="https-untrusted navbar-center" ng-show="!safeProtocol">
<div class="https-message"> <div class="https-message">
This Connection is Untrusted. {{ 'MESSAGE_CONNECTION_UNTRUSTED' | translate }}
</div> </div>
</div> </div>
<div class="navbar-header"> <div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span> <span class="sr-only">{{ 'MESSAGE_TOGGLE_NAVIGATION' | translate }}</span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
@ -25,10 +25,10 @@
<span class="caret"></span> <span class="caret"></span>
</a> </a>
<ul class="dropdown-menu drop-net-info" role="menu" ng-click="$event.stopPropagation()"> <ul class="dropdown-menu drop-net-info" role="menu" ng-click="$event.stopPropagation()">
<li><a class="title">Bandwidth Info</a></li> <li><a class="title">{{ 'BANDWIDTH_INFO' | translate }}</a></li>
<li><a>Outgoing: {{bandUp}} Kbps</a></li> <li><a>{{ 'BANDWIDTH_INFO_OUTGOING' | translate }} {{bandUp}} Kbps</a></li>
<li><a>Incoming: {{bandDown}} Kbps</a></li> <li><a>{{ 'BANDWIDTH_INFO_INCOMING' | translate }} {{bandDown}} Kbps</a></li>
<li><a>Video Resolution: {{vidRes}}</a></li> <li><a>{{ 'BANDWIDTH_INFO_VIDEO_RES' | translate }} {{vidRes}}</a></li>
</ul> </ul>
</li> </li>
<li> <li>
@ -38,7 +38,7 @@
</li> </li>
<li> <li>
<a href="" class="incall-number" ng-show="storage.data.called_number"> <a href="" class="incall-number" ng-show="storage.data.called_number">
{{ storage.data.called_number && storage.data.userStatus != 'connected' ? 'Last Call: ' : 'In Call: ' }} {{ storage.data.called_number }} {{ storage.data.called_number && storage.data.userStatus != 'connected' ? 'LAST_CALL' : 'IN_CALL' | translate }} {{ storage.data.called_number }}
</a> </a>
</li> </li>
<li class="navbar-item-icon" ng-show="verto.data.connected"> <li class="navbar-item-icon" ng-show="verto.data.connected">
@ -63,10 +63,10 @@
<span class="caret"></span> <span class="caret"></span>
</a> </a>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
<li><a href="#/?sessid=random" target="_blank">Open New Window</a></li> <li><a href="#/?sessid=random" target="_blank">{{ 'OPEN_NEW_WINDOW' | translate}}</a></li>
<li><a href="" ng-click="openModal('partials/modal_logininfo.html', 'ModalLoginInformationController')">Change Login Information</a></li> <li><a href="" ng-click="openModal('partials/modal_logininfo.html', 'ModalLoginInformationController')">{{ 'CHANGE_LOGIN_INFO' | translate}}</a></li>
<!--<li><a href="#">View Device Settings</a></li>--> <!--<li><a href="#">View Device Settings</a></li>-->
<li><a href="" ng-click="logout()">Logout</a></li> <li><a href="" ng-click="logout()">{{ 'LOGOUT' | translate}}</a></li>
</ul> </ul>
</li> </li>
<li class="navbar-item-icon"> <li class="navbar-item-icon">
@ -75,9 +75,9 @@
<span class="caret"></span> <span class="caret"></span>
</a> </a>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
<li><a href="" ng-click="showAbout()">About</a></li> <li><a href="" ng-click="showAbout()">{{ 'ABOUT' | translate}}</a></li>
<li><a href="" ng-click="showContributors()">Contributors</a></li> <li><a href="" ng-click="showContributors()">{{ 'CONTRIBUTORS' | translate}}</a></li>
<li><a href="https://freeswitch.org/confluence/x/MQCT" target="_blank">Help</a></li> <li><a href="https://freeswitch.org/confluence/x/MQCT" target="_blank">{{ 'HELP' | translate}}</a></li>
</ul> </ul>
</li> </li>

View File

@ -1,35 +1,35 @@
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title">Login Information</h3> <h3 class="modal-title">{{ 'LOGIN_INFORMATION' | translate}}</h3>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="form-group"> <div class="form-group">
<label for="name">Name:</label> <label for="name">{{ 'NAME' | translate}}</label>
<input type="text" name="name" class="form-control" ng-model="storage.data.name" ng-value="storage.data.name"/> <input type="text" name="name" class="form-control" ng-model="storage.data.name" ng-value="storage.data.name"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="email">Email:</label> <label for="email">{{ 'EMAIL' | translate}}</label>
<input type="text" name="email" class="form-control" ng-model="storage.data.email" ng-value="storage.data.email"/> <input type="text" name="email" class="form-control" ng-model="storage.data.email" ng-value="storage.data.email"/>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label" for="user">User</label> <label class="control-label" for="user">{{ 'USER' | translate}}</label>
<input type="text" class="form-control" id="user" placeholder="User" ng-model="storage.data.login"> <input type="text" class="form-control" id="user" placeholder="User" ng-model="storage.data.login">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label" for="password">Password</label> <label class="control-label" for="password">{{ 'PASSWORD' | translate}}</label>
<input type="password" class="form-control" id="password" placeholder="Password" ng-model="verto.data.password"> <input type="password" class="form-control" id="password" placeholder="Password" ng-model="verto.data.password">
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="control-label" for="callerid">Caller ID</label> <label class="control-label" for="callerid">{{ 'CALLER_ID' | translate}}</label>
<input type="text" class="form-control" id="callerid" placeholder="Caller ID" ng-model="verto.data.callerid"> <input type="text" class="form-control" id="callerid" placeholder="Caller ID" ng-model="verto.data.callerid">
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<!-- <button class="btn btn-primary" ng-click="cancel()">Cancel</button> --> <!-- <button class="btn btn-primary" ng-click="cancel()">Cancel</button> -->
<button class="btn btn-primary" ng-click="ok()">Save Login Information</button> <button class="btn btn-primary" ng-click="ok()">{{ 'SAVE_LOGIN_INFORMATION' | translate}}</button>
</div> </div>

View File

@ -2,7 +2,7 @@
<div class="col-md-4 col-sm-12 col-xs-12 centered-block"> <div class="col-md-4 col-sm-12 col-xs-12 centered-block">
<div class="panel panel-material-blue-900 shadow-z-2 "> <div class="panel panel-material-blue-900 shadow-z-2 ">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title text-center">Setup your camera and microphone settings</h3> <h3 class="panel-title text-center">{{ 'TITLE_PREVIEW_SETTINGS' | translate }}</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="preview-wrapper"> <div class="preview-wrapper">
@ -20,13 +20,13 @@
</div> </div>
<form name="form"> <form name="form">
<div class="form-group col-md-5 col-sm-12 col-xs-12" ng-show="true"> <div class="form-group col-md-5 col-sm-12 col-xs-12" ng-show="true">
<label for="settings-camera">Camera:</label> <label for="settings-camera">{{ 'CAMERA_SETTINGS' | translate }}</label>
<select name="camera" id="settings-camera" class="form-control" ng-model="storage.data.selectedVideo" <select name="camera" id="settings-camera" class="form-control" ng-model="storage.data.selectedVideo"
ng-options="item.id as item.label for item in verto.data.videoDevices" ng-change="localVideo()" > ng-options="item.id as item.label for item in verto.data.videoDevices" ng-change="localVideo()" >
</select> </select>
</div> </div>
<div class="form-group col-md-5 col-sm-12 col-xs-12" ng-show="true"> <div class="form-group col-md-5 col-sm-12 col-xs-12" ng-show="true">
<label for="settings-microphone">Microphone:</label> <label for="settings-microphone">{{ 'MIC_SETTINGS' | translate }}</label>
<select name="microphone" id="settings-microphone" class="form-control" ng-model="storage.data.selectedAudio" <select name="microphone" id="settings-microphone" class="form-control" ng-model="storage.data.selectedAudio"
ng-options="item.id as item.label for item in verto.data.audioDevices" ng-change="localVideo()"> ng-options="item.id as item.label for item in verto.data.audioDevices" ng-change="localVideo()">
</select> </select>
@ -36,8 +36,8 @@
</a> </a>
<div class="form-group text-center"> <div class="form-group text-center">
<button type="submit" class="btn btn-success" ng-click="endPreview()" title="Save"> <button type="submit" class="btn btn-success" ng-click="endPreview()" title="{{ 'SAVE' | translate }}">
Save {{ 'SAVE' | translate }}
</button> </button>
</div> </div>
</form> </form>

View File

@ -3,21 +3,21 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="form-group" ng-show="mydata.useVideo"> <div class="form-group" ng-show="mydata.useVideo">
<label for="settings-camera">Camera:</label> <label for="settings-camera">{{ 'CAMERA_SETTINGS' | translate }}</label>
<select name="camera" id="settings-camera" class="form-control" <select name="camera" id="settings-camera" class="form-control"
ng-model="mydata.selectedVideo" ng-options="item.id as item.label for item in verto.data.videoDevices"> ng-model="mydata.selectedVideo" ng-options="item.id as item.label for item in verto.data.videoDevices">
</select> </select>
</div> </div>
<div class="form-group" ng-show="mydata.useVideo"> <div class="form-group" ng-show="mydata.useVideo">
<label for="settings-share-device">Share device:</label> <label for="settings-share-device">{{ 'SHARE_DEVICE' | translate }}</label>
<select name="share-device" id="settings-share-device" class="form-control" <select name="share-device" id="settings-share-device" class="form-control"
ng-model="mydata.selectedShare" ng-options="item.id as item.label for item in verto.data.shareDevices"> ng-model="mydata.selectedShare" ng-options="item.id as item.label for item in verto.data.shareDevices">
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="settings-microphone">Microphone:</label> <label for="settings-microphone">{{ 'MIC_SETTINGS' | translate}}</label>
<select name="microphone" id="settings-microphone" class="form-control" <select name="microphone" id="settings-microphone" class="form-control"
ng-model="mydata.selectedAudio" ng-options="item.id as item.label for item in verto.data.audioDevices"> ng-model="mydata.selectedAudio" ng-options="item.id as item.label for item in verto.data.audioDevices">
</select> </select>
@ -25,9 +25,9 @@
<div class="form-group"> <div class="form-group">
<label for="settings-microphone"> <label for="settings-microphone">
Speaker: {{ 'SPEAKER' | translate }}
<span ng-show="!speakerFeature" class="unsupported"> <span ng-show="!speakerFeature" class="unsupported">
Your browser doesn't seem to support this feature {{ 'SPEAKER_FEATURE' | translate }}
</span> </span>
</label> </label>
<select name="microphone" id="settings-microphone" class="form-control" ng-disabled="!speakerFeature" <select name="microphone" id="settings-microphone" class="form-control" ng-disabled="!speakerFeature"
@ -36,67 +36,67 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="settings-framerate">Best frame rate:</label> <label for="settings-framerate">{{ 'BEST_FRAME_RATE' | translate }}</label>
<select name="settings-framerate" id="settings-framerate" class="form-control" <select name="settings-framerate" id="settings-framerate" class="form-control"
ng-model="mydata.bestFrameRate" ng-model="mydata.bestFrameRate"
ng-options="item.id as item.label for item in verto.framerate"></select> ng-options="item.id as item.label for item in verto.framerate"></select>
</div> </div>
<a class="btn btn-primary" href="" ng-click="showPreview()">Preview Settings</a> <a class="btn btn-primary" href="" ng-click="showPreview()">{{ 'PREVIEW_SETTINGS' | translate }}</a>
<a class="btn btn-primary" href="" ng-click="refreshDeviceList()">Refresh device list</a> <a class="btn btn-primary" href="" ng-click="refreshDeviceList()">{{ 'REFRESH_DEVICE_LIST' | translate }}</a>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<div class="form-group"> <div class="form-group">
<label for="settings-microphone">General settings:</label> <label for="settings-microphone">{{ 'GENERAL_SETTINGS' | translate }}</label>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="use_video" value="mydata.useVideo" ng-model="mydata.useVideo"> <input type="checkbox" name="use_video" value="mydata.useVideo" ng-model="mydata.useVideo">
Use Video <span ng-bind="'USE_VIDEO' | translate"></span>
</label> </label>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="use_stereo_audio" ng-value="mydata.useStereo" ng-model="mydata.useStereo"> <input type="checkbox" name="use_stereo_audio" ng-value="mydata.useStereo" ng-model="mydata.useStereo">
Stereo Audio <span ng-bind="'USE_STEREO_AUDIO' | translate"></span>
</label> </label>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="use_stun" ng-value="mydata.useSTUN" ng-model="mydata.useSTUN"> <input type="checkbox" name="use_stun" ng-value="mydata.useSTUN" ng-model="mydata.useSTUN">
Use STUN <span ng-bind="'USE_STUN' | translate"></span>
</label> </label>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="mirror_input" ng-value="mydata.mirrorInput" ng-model="mydata.mirrorInput"> <input type="checkbox" name="mirror_input" ng-value="mydata.mirrorInput" ng-model="mydata.mirrorInput">
Scale Remote Video To Match Camera Resolution <span ng-bind="'SCALE_VIDEO' | translate"></span>
</label> </label>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="ask_recover_call" ng-value="mydata.askRecoverCall" ng-model="mydata.askRecoverCall"> <input type="checkbox" name="ask_recover_call" ng-value="mydata.askRecoverCall" ng-model="mydata.askRecoverCall">
Ask before recovering call <span ng-bind="'ASK_BEFORE_RECOVER' | translate"></span>
</label> </label>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="settings-microphone">Audio settings:</label> <label for="settings-microphone">{{ 'AUDIO_SETTINGS' | translate }}</label>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="googEchoCancellation" value="mydata.googEchoCancellation" ng-model="mydata.googEchoCancellation"> <input type="checkbox" name="googEchoCancellation" value="mydata.googEchoCancellation" ng-model="mydata.googEchoCancellation">
Echo Cancellation <span ng-bind="'ECHO_CANCEL' | translate"></span>
</label> </label>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="googNoiseSuppression" value="mydata.googNoiseSuppression" ng-model="mydata.googNoiseSuppression"> <input type="checkbox" name="googNoiseSuppression" value="mydata.googNoiseSuppression" ng-model="mydata.googNoiseSuppression">
Noise Suppression <span ng-bind="'NOISE_SUPPRESSION' | translate"></span>
</label> </label>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="googHighpassFilter" value="mydata.googHighpassFilter" ng-model="mydata.googHighpassFilter"> <input type="checkbox" name="googHighpassFilter" value="mydata.googHighpassFilter" ng-model="mydata.googHighpassFilter">
Highpass Filter <span ng-bind="'HIGHPASS_FILTER' | translate"></span>
</label> </label>
</div> </div>
</div> </div>
@ -106,32 +106,32 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="form-group"> <div class="form-group">
<label>Video settings:</label> <br> <label>{{ 'VIDEO_SETTINGS' | translate }}</label> <br>
<input type="hidden" name="use_dedenc" ng-value="mydata.useDedenc" ng-model="mydata.useDedenc"> <input type="hidden" name="use_dedenc" ng-value="mydata.useDedenc" ng-model="mydata.useDedenc">
<div ng-show="mydata.useDedenc" class="dedicated_encoder"> <div ng-show="mydata.useDedenc" class="dedicated_encoder">
<p>Dedicated Remote Encoder enabled.</b> <p>{{ 'REMOTE_ENCODER' | translate }}</b>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" ng-model="mydata.autoBand" ng-change="checkAutoBand(mydata.autoBand)"> <input type="checkbox" ng-model="mydata.autoBand" ng-change="checkAutoBand(mydata.autoBand)">
Automatically determine speed and resolution settings <span ng-bind="'AUTO_SPEED_RES' | translate"></span>
</label> </label>
</div> </div>
<div class="checkbox" ng-show="mydata.autoBand"> <div class="checkbox" ng-show="mydata.autoBand">
<label> <label>
<input type="checkbox" ng-model="mydata.testSpeedJoin"> <input type="checkbox" ng-model="mydata.testSpeedJoin">
Recheck bandwidth before each outgoing call <span ng-bind="'RECHECK_BANDWIDTH' | translate"></span>
</label> </label>
</div> </div>
<a ng-show="mydata.autoBand" class="btn btn-primary" href="" ng-click="testSpeed()">Check Network Speed</a> <span ng-bind="speedMsg"></span> <a ng-show="mydata.autoBand" class="btn btn-primary" href="" ng-click="testSpeed()">{{ 'CHECK_NETWORK_SPEED' | translate }}</a> <span ng-bind="speedMsg"></span>
<div ng-show="!mydata.autoBand"> <div ng-show="!mydata.autoBand">
<label for="video-quality">Video quality:</label> <label for="video-quality">{{ 'VIDEO_QUALITY' | translate }}</label>
<select name="video_quality" id="video-quality" class="form-control" <select name="video_quality" id="video-quality" class="form-control"
ng-disabled="mydata.autoBand" ng-disabled="mydata.autoBand"
ng-model="mydata.vidQual" ng-model="mydata.vidQual"
@ -140,7 +140,7 @@
</div> </div>
<div ng-show="!mydata.autoBand"> <div ng-show="!mydata.autoBand">
<label for="incoming-bandwidth">Max incoming bandwidth:</label> <label for="incoming-bandwidth">{{ 'MAX_INCOMING_BANDWIDTH' | translate }}</label>
<select name="incoming_bandwidth" id="incoming-bandwidth" class="form-control" <select name="incoming_bandwidth" id="incoming-bandwidth" class="form-control"
ng-model="mydata.incomingBandwidth" ng-model="mydata.incomingBandwidth"
ng-change="checkUseDedRemoteEncoder(mydata.incomingBandwidth)" ng-change="checkUseDedRemoteEncoder(mydata.incomingBandwidth)"
@ -148,7 +148,7 @@
</div> </div>
<div ng-show="!mydata.autoBand"> <div ng-show="!mydata.autoBand">
<label for="outgoing-bandwidth">Max outgoing bandwidth:</label> <label for="outgoing-bandwidth">{{ 'MAX_OUTGOING_BANDWIDTH' | translate }}</label>
<select name="outgoing_bandwidth" id="outgoing-bandwidth" class="form-control" <select name="outgoing_bandwidth" id="outgoing-bandwidth" class="form-control"
ng-model="mydata.outgoingBandwidth" ng-model="mydata.outgoingBandwidth"
ng-options="item.id as item.label for item in verto.bandwidth"></select> ng-options="item.id as item.label for item in verto.bandwidth"></select>

View File

@ -2,14 +2,14 @@
<div class="col-md-6 centered-block"> <div class="col-md-6 centered-block">
<div class="card"> <div class="card">
<div class="card-body text-center"> <div class="card-body text-center">
<h2>Loading</h2> <h2>{{ 'LOADING' | translate }}</h2>
<div class="progress progress-striped active"> <div class="progress progress-striped active">
<div class="progress-bar" ng-class="{'progress-bar-danger': interrupt_next}" style="width: {{ progress_percentage }}%"></div> <div class="progress-bar" ng-class="{'progress-bar-danger': interrupt_next}" style="width: {{ progress_percentage }}%"></div>
</div> </div>
<div ng-bind="message"></div> <div ng-bind="message"></div>
<div class="splash-errors" ng-if="errors.length"> <div class="splash-errors" ng-if="errors.length">
<h4>Errors</h4> <h4>{{ 'ERRORS' | translate }}</h4>
<ul ng-repeat="error in errors"> <ul ng-repeat="error in errors">
<li>{{ ::error }}</li> <li>{{ ::error }}</li>
</ul> </ul>

View File

@ -2,28 +2,28 @@
<div class="video-wrapper"> <div class="video-wrapper">
<div class="video-hover-buttons" ng-show="verto.data.callState == 'active' && !watcher"> <div class="video-hover-buttons" ng-show="verto.data.callState == 'active' && !watcher">
<div id="moderator-tools" ng-show="verto.data.confRole == 'moderator'"> <div id="moderator-tools" ng-show="verto.data.confRole == 'moderator'">
<button tooltip-placement="bottom" tooltip-title="Play" uib-tooltip="Play" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_PLAY' | translate}}" uib-tooltip="{{'MESSAGE_PLAY' | translate}}"
class="btn btn-material-blue-900" ng-click="play()"> class="btn btn-material-blue-900" ng-click="play()">
<i class="mdi-av-play-circle-outline"></i> <i class="mdi-av-play-circle-outline"></i>
</button> </button>
<button tooltip-placement="bottom" tooltip-title="Stop" uib-tooltip="Stop" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_STOP' | translate}}" uib-tooltip="{{'MESSAGE_STOP' | translate}}"
class="btn btn-material-blue-900" ng-click="stop()"> class="btn btn-material-blue-900" ng-click="stop()">
<i class="mdi-av-stop"></i> <i class="mdi-av-stop"></i>
</button> </button>
<button tooltip-placement="bottom" tooltip-title="Record" uib-tooltip="Record" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_RECORD' | translate}}" uib-tooltip="{{'MESSAGE_RECORD' | translate}}"
class="btn btn-material-blue-900" ng-click="record()"> class="btn btn-material-blue-900" ng-click="record()">
<i class="mdi-toggle-radio-button-on"></i> <i class="mdi-toggle-radio-button-on"></i>
</button> </button>
<button tooltip-placement="bottom" tooltip-title="Stop Record" uib-tooltip="Stop Record" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_STOP_RECORD' | translate}}" uib-tooltip="{{'MESSAGE_STOP_RECORD' | translate}}"
class="btn btn-material-blue-900" ng-click="stopRecord()"> class="btn btn-material-blue-900" ng-click="stopRecord()">
<i class="mdi-image-switch-camera"></i> <i class="mdi-image-switch-camera"></i>
</button> </button>
<button tooltip-placement="bottom" tooltip-title="Snapshot" uib-tooltip="Snapshot" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_SNAPSHOT' | translate}}" uib-tooltip="{{'MESSAGE_SNAPSHOT' | translate}}"
tooltip-lazy="false" class="btn btn-material-blue-900" ng-click="snapshot()"> tooltip-lazy="false" class="btn btn-material-blue-900" ng-click="snapshot()">
<i class="mdi-image-photo-camera"></i> <i class="mdi-image-photo-camera"></i>
</button> </button>
<div class="btn-group"> <div class="btn-group">
<button tooltip-placement="bottom" tooltip-title="Video Mode" uib-tooltip="Video Mode" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_VIDEO_MODE' | translate}}" uib-tooltip="{{'MESSAGE_VIDEO_MODE' | translate}}"
type="button" class="btn btn-material-blue-900 dropdown-toggle" type="button" class="btn btn-material-blue-900 dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="mdi-action-view-module"></i> <i class="mdi-action-view-module"></i>
@ -37,28 +37,28 @@
</div> </div>
</div> </div>
<div class="user-tools"> <div class="user-tools">
<button tooltip-placement="bottom" tooltip-title="(un)Mute Mic" uib-tooltip="(un)Mute Mic" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_MUTE_MIC' | translate}}" uib-tooltip="{{'MESSAGE_MUTE_MIC' | translate}}"
class="btn btn-material-blue-900" ng-click="muteMic(cbMuteMic)"> class="btn btn-material-blue-900" ng-click="muteMic(cbMuteMic)">
<i class="" ng-class="{'mdi-av-mic': !verto.data.mutedMic, 'mdi-av-mic-off': verto.data.mutedMic}"></i> <i class="" ng-class="{'mdi-av-mic': !verto.data.mutedMic, 'mdi-av-mic-off': verto.data.mutedMic}"></i>
</button> </button>
<button tooltip-placement="bottom" tooltip-title="(un)Mute Video" uib-tooltip="(un)Mute Video" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_MUTE_MIC' | translate}}" uib-tooltip="{{'MESSAGE_MUTE_MIC' | translate}}"
class="btn btn-material-blue-900" ng-click="muteVideo(cbMuteVideo)" ng-if="verto.data.canVideo"> class="btn btn-material-blue-900" ng-click="muteVideo(cbMuteVideo)" ng-if="verto.data.canVideo">
<i class="" ng-class="{'mdi-av-videocam': !verto.data.mutedVideo, 'mdi-av-videocam-off': verto.data.mutedVideo}"></i> <i class="" ng-class="{'mdi-av-videocam': !verto.data.mutedVideo, 'mdi-av-videocam-off': verto.data.mutedVideo}"></i>
</button> </button>
<button tooltip-placement="bottom" tooltip-title="Toggle Fullscreen Mode" uib-tooltip="Toggle Fullscreen Mode" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_FULLSCREEN' | translate}}" uib-tooltip="{{'MESSAGE_FULLSCREEN' | translate}}"
class="btn btn-material-blue-900" ng-click="goFullscreen()"> class="btn btn-material-blue-900" ng-click="goFullscreen()">
<i class="" ng-class="{'mdi-navigation-fullscreen': !fullscreenEnabled, 'mdi-navigation-fullscreen-exit': fullscreenEnabled}"></i> <i class="" ng-class="{'mdi-navigation-fullscreen': !fullscreenEnabled, 'mdi-navigation-fullscreen-exit': fullscreenEnabled}"></i>
</button> </button>
<button tooltip-placement="bottom" tooltip-title="Screenshare" uib-tooltip="Screenshare" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_SCREENSHARE' | translate}}" uib-tooltip="{{'MESSAGE_SCREENSHARE' | translate}}"
class="btn btn-material-blue-900" ng-click="screenshare()"> class="btn btn-material-blue-900" ng-click="screenshare()">
<i class="mdi-hardware-desktop-windows"></i> <i class="mdi-hardware-desktop-windows"></i>
</button> </button>
<button tooltip-placement="bottom" tooltip-title="Open/Close Chat" uib-tooltip="Open/Close Chat" <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_OPEN_CLOSE_CHAT' | translate}}" uib-tooltip="{{'MESSAGE_OPEN_CLOSE_CHAT' | translate}}"
class="btn btn-material-blue-900" ng-click="toggleChat()" ng-show="fullscreenEnabled"> class="btn btn-material-blue-900" ng-click="toggleChat()" ng-show="fullscreenEnabled">
<i class="mdi-communication-chat"></i> <i class="mdi-communication-chat"></i>
</button> </button>
<div class="btn-group"> <div class="btn-group">
<button tooltip-placement="bottom" tooltip-title="Speaker" uib-tooltips="Speaker" type="button" class="btn btn-material-blue-900 dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_SPEAKER' | translate}}" uib-tooltips="{{'MESSAGE_SPEAKER' | translate}}" type="button" class="btn btn-material-blue-900 dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="mdi-hardware-headset"></i> <i class="mdi-hardware-headset"></i>
<span class="caret"></span> <span class="caret"></span>
</button> </button>
@ -69,7 +69,7 @@
</ul> </ul>
</div> </div>
<div class="btn-group" ng-show="conf.canvasCount > 1"> <div class="btn-group" ng-show="conf.canvasCount > 1">
<button tooltip-placement="bottom" tooltip-title="Popup" uib-tooltips="Popup" type="button" class="btn btn-material-blue-900 dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button tooltip-placement="bottom" tooltip-title="{{'MESSAGE_POPUP' | translate}}" uib-tooltips="{{'MESSAGE_POPUP' | translate}}" type="button" class="btn btn-material-blue-900 dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="mdi-image-filter-none"></i> <i class="mdi-image-filter-none"></i>
<span class="caret"></span> <span class="caret"></span>
</button> </button>
@ -96,9 +96,9 @@
</div> </div>
</div> </div>
<div class="col-md-6 col-xs-6 text-right"> <div class="col-md-6 col-xs-6 text-right">
<button class="btn btn-danger" ng-click="hangup()"> <button class="btn btn-danger" ng-click="hangup()" translate>
<i class="mdi-communication-call-end"></i> <i class="mdi-communication-call-end"></i>
{{ watcher ? 'Close' : 'End Call' }} {{ watcher ? 'BUTTON_CLOSE' : 'BUTTON_END_CALL' }}
</button> </button>
</div> </div>
</div> </div>

View File

@ -2,8 +2,8 @@
angular angular
.module('storageService') .module('storageService')
.service('splashscreen', ['$rootScope', '$q', 'storage', 'config', 'verto', .service('splashscreen', ['$rootScope', '$q', 'storage', 'config', 'verto', '$translate',
function($rootScope, $q, storage, config, verto) { function($rootScope, $q, storage, config, verto, $translate) {
var checkBrowser = function() { var checkBrowser = function() {
return $q(function(resolve, reject) { return $q(function(resolve, reject) {
@ -12,16 +12,15 @@
'activity': activity, 'activity': activity,
'soft': false, 'soft': false,
'status': 'success', 'status': 'success',
'message': 'Checking browser compability.' 'message': $translate.instant('BROWSER_COMPATIBILITY')
}; };
navigator.getUserMedia = navigator.getUserMedia || navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia; navigator.mozGetUserMedia;
if (!navigator.getUserMedia) { if (!navigator.getUserMedia) {
result['status'] = 'error'; result['status'] = 'error';
result['message'] = 'Error: browser doesn\'t support WebRTC.'; result['message'] = $translate.instant('BROWSER_WITHOUT_WEBRTC');
reject(result); reject(result);
} }
@ -37,13 +36,13 @@
'activity': activity, 'activity': activity,
'soft': false, 'soft': false,
'status': 'success', 'status': 'success',
'message': 'Checking media permissions' 'message': $translate.instant('CHECK_PERMISSION_MEDIA')
}; };
verto.mediaPerm(function(status) { verto.mediaPerm(function(status) {
if(!status) { if(!status) {
result['status'] = 'error'; result['status'] = 'error';
result['message'] = 'Error: Media Permission Denied'; result['message'] = $translate.instant('ERROR_PERMISSION_MEDIA');
verto.data.mediaPerm = false; verto.data.mediaPerm = false;
reject(result); reject(result);
} }
@ -60,7 +59,7 @@
'status': 'success', 'status': 'success',
'soft': true, 'soft': true,
'activity': activity, 'activity': activity,
'message': 'Refresh Media Devices.' 'message': $translate.instant('REFRESH_MEDIA_DEVICES')
}; };
verto.refreshDevices(function(status) { verto.refreshDevices(function(status) {
@ -79,7 +78,7 @@
'status': 'success', 'status': 'success',
'soft': true, 'soft': true,
'activity': activity, 'activity': activity,
'message': 'Check Connection Speed.' 'message': $translate.instant('CHECK_CONNECTION_SPEED')
}; };
if (storage.data.autoBand && verto.data.instance) { if (storage.data.autoBand && verto.data.instance) {
@ -101,7 +100,7 @@
'status': 'promise', 'status': 'promise',
'soft': true, 'soft': true,
'activity': activity, 'activity': activity,
'message': 'Provisioning configuration.' 'message': $translate.instant('CHECK_PROVISIONING_CONF')
}; };
var configResponse = config.configure(); var configResponse = config.configure();
@ -116,7 +115,7 @@
return result; return result;
} else { } else {
result['status'] = 'error'; result['status'] = 'error';
result['message'] = 'Error: Provision failed.'; result['message'] = $translate.instant('ERROR_PROVISIONING_CONF');
return result; return result;
} }
}); });
@ -134,7 +133,7 @@
'status': 'success', 'status': 'success',
'soft': true, 'soft': true,
'activity': activity, 'activity': activity,
'message': 'Checking login.' 'message': $translate.instant('CHECK_LOGIN'),
}; };
if(verto.data.connecting || verto.data.connected) { if(verto.data.connecting || verto.data.connected) {
@ -179,19 +178,19 @@
]; ];
var progress_message = [ var progress_message = [
'Checking browser compability.', $translate.instant('BROWSER_COMPATIBILITY'),
'Checking media permissions', $translate.instant('CHECK_PERMISSION_MEDIA'),
'Refresh Media Devices.', $translate.instant('REFRESH_MEDIA_DEVICES'),
'Provisioning configuration.', $translate.instant('CHECK_PROVISIONING_CONF'),
'Checking login.', $translate.instant('CHECK_LOGIN'),
'Check Connection Speed.' $translate.instant('CHECK_CONNECTION_SPEED'),
]; ];
var getProgressMessage = function(current_progress) { var getProgressMessage = function(current_progress) {
if(progress_message[current_progress] != undefined) { if(progress_message[current_progress] != undefined) {
return progress_message[current_progress]; return progress_message[current_progress];
} else { } else {
return 'Please wait...'; return $translate.instant('PLEASE_WAIT');
} }
}; };

View File

@ -17,10 +17,11 @@
'ui.gravatar', 'ui.gravatar',
'ui.bootstrap', 'ui.bootstrap',
'directive.g+signin', 'directive.g+signin',
'pascalprecht.translate',
]); ]);
vertoApp.config(['$routeProvider', 'gravatarServiceProvider', vertoApp.config(['$routeProvider', 'gravatarServiceProvider', '$translateProvider',
function($routeProvider, gravatarServiceProvider) { function($routeProvider, gravatarServiceProvider, $translateProvider) {
$routeProvider. $routeProvider.
when('/', { when('/', {
title: 'Loading', title: 'Loading',
@ -59,6 +60,21 @@
gravatarServiceProvider.defaults = { gravatarServiceProvider.defaults = {
default: 'mm' // Mystery man as default for missing avatars default: 'mm' // Mystery man as default for missing avatars
}; };
$translateProvider
.useStaticFilesLoader({
prefix: 'locales/locale-',
suffix: '.json'
})
.registerAvailableLanguageKeys(['en', 'it'], {
'en' : 'en', 'en_GB': 'en', 'en_US': 'en',
'it' : 'it', 'it_IT' : 'it'
})
.preferredLanguage('en')
.fallbackLanguage('en')
.determinePreferredLanguage()
.useSanitizeValueStrategy(null);
} }
]); ]);

View File

@ -5,9 +5,9 @@
angular angular
.module('vertoControllers') .module('vertoControllers')
.controller('ChatController', ['$scope', '$rootScope', '$http', .controller('ChatController', ['$scope', '$rootScope', '$http',
'$location', '$anchorScroll', '$timeout', 'verto', 'prompt', '$location', '$anchorScroll', '$timeout', 'verto', 'prompt', '$translate',
function($scope, $rootScope, $http, $location, $anchorScroll, $timeout, function($scope, $rootScope, $http, $location, $anchorScroll, $timeout,
verto, prompt) { verto, prompt, $translate) {
console.debug('Executing ChatController.'); console.debug('Executing ChatController.');
function scrollToChatBottom() { function scrollToChatBottom() {
@ -246,7 +246,7 @@
console.log('$scope.confBanner'); console.log('$scope.confBanner');
prompt({ prompt({
title: 'Please insert the banner text', title: $translate.instant('TITLE_INSERT_BANNER'),
input: true, input: true,
label: '', label: '',
value: '', value: '',
@ -263,7 +263,7 @@
return; return;
} }
shortPrompt('Please insert the Canvas Id', function(canvasID) { shortPrompt($translate.instant('TITLE_INSERT_CANVAS_ID'), function(canvasID) {
console.log(memberID, canvasID); console.log(memberID, canvasID);
verto.setCanvasIn(memberID, canvasID); verto.setCanvasIn(memberID, canvasID);
}); });
@ -276,7 +276,7 @@
return; return;
} }
shortPrompt('Please insert the Canvas Id', function(canvasID) { shortPrompt($translate.instant('TITLE_INSERT_CANVAS_ID'), function(canvasID) {
verto.setCanvasOut(memberID, canvasID); verto.setCanvasOut(memberID, canvasID);
}); });
}; };
@ -287,7 +287,7 @@
return; return;
} }
shortPrompt('Please insert the Layer', function(canvasID) { shortPrompt($translate.instant('TITLE_INSERT_LAYER'), function(canvasID) {
verto.setLayer(memberID, canvasID); verto.setLayer(memberID, canvasID);
}); });
}; };
@ -321,10 +321,10 @@
$scope.confTransfer = function(memberID) { $scope.confTransfer = function(memberID) {
console.log('$scope.confTransfer'); console.log('$scope.confTransfer');
prompt({ prompt({
title: 'Transfer party?', title: $translate.instant('TITLE_TRANSFER'),
message: 'To what destination would you like to transfer this call?', message: $translate.instant('MESSAGE_TRANSFER'),
input: true, input: true,
label: 'Destination', label: $translate.instant('LABEL_TRANSFER'),
value: '', value: '',
}).then(function(exten) { }).then(function(exten) {
if (exten) { if (exten) {

View File

@ -4,9 +4,9 @@
angular angular
.module('vertoControllers') .module('vertoControllers')
.controller('InCallController', ['$rootScope', '$scope', .controller('InCallController', ['$rootScope', '$scope',
'$http', '$location', '$modal', '$timeout', 'toastr', 'verto', 'storage', 'prompt', 'Fullscreen', '$http', '$location', '$modal', '$timeout', 'toastr', 'verto', 'storage', 'prompt', 'Fullscreen', '$translate',
function($rootScope, $scope, $http, $location, $modal, $timeout, toastr, function($rootScope, $scope, $http, $location, $modal, $timeout, toastr,
verto, storage, prompt, Fullscreen) { verto, storage, prompt, Fullscreen, $translate) {
console.debug('Executing InCallController.'); console.debug('Executing InCallController.');
$scope.layout = null; $scope.layout = null;
@ -55,8 +55,8 @@
*/ */
$scope.videoCall = function() { $scope.videoCall = function() {
prompt({ prompt({
title: 'Would you like to activate video for this call?', title: $translate.instant('TITLE_ENABLE_VIDEO'),
message: 'Video will be active during the next calls.' message: $translate.instant('MESSAGE_ENABLE_VIDEO')
}).then(function() { }).then(function() {
storage.data.videoCall = true; storage.data.videoCall = true;
$scope.callTemplate = 'partials/video_call.html'; $scope.callTemplate = 'partials/video_call.html';

View File

@ -4,7 +4,7 @@
angular angular
.module('vertoControllers') .module('vertoControllers')
.controller('MainController', .controller('MainController',
function($scope, $rootScope, $location, $modal, $timeout, $q, verto, storage, CallHistory, toastr, Fullscreen, prompt, eventQueue) { function($scope, $rootScope, $location, $modal, $timeout, $q, verto, storage, CallHistory, toastr, Fullscreen, prompt, eventQueue, $translate) {
console.debug('Executing MainController.'); console.debug('Executing MainController.');
@ -123,8 +123,8 @@
if (verto.data.call) { if (verto.data.call) {
prompt({ prompt({
title: 'Oops, Active Call in Course.', title: $translate.instant('TITLE_ACTIVE_CALL'),
message: 'It seems that you are in a call. Do you want to hang up?' message: $translate.instant('MESSAGE_ACTIVE_CALL_HANGUP')
}).then(function() { }).then(function() {
disconnect(); disconnect();
}); });
@ -326,8 +326,8 @@
return $q(function(resolve, reject) { return $q(function(resolve, reject) {
if (storage.data.askRecoverCall) { if (storage.data.askRecoverCall) {
prompt({ prompt({
title: 'Oops, Active Call in Course.', title: $translate.instant('TITLE_ACTIVE_CALL'),
message: 'It seems you were in a call before leaving the last time. Wanna go back to that?' message: $translate.instant('MESSAGE_ACTIVE_CALL_BACK')
}).then(function() { }).then(function() {
console.log('redirect to incall page'); console.log('redirect to incall page');
$location.path('/incall'); $location.path('/incall');
@ -423,8 +423,8 @@
storage.data.mutedMic = false; storage.data.mutedMic = false;
prompt({ prompt({
title: 'Incoming Call', title: $translate.instant('TITLE_INCOMING_CALL'),
message: 'from ' + data message: $translate.instant('MESSAGE_INCOMING_CALL') + data
}).then(function() { }).then(function() {
var call_start = new Date(storage.data.call_start); var call_start = new Date(storage.data.call_start);
$rootScope.start_time = call_start; $rootScope.start_time = call_start;
@ -450,7 +450,7 @@
*/ */
$scope.hangup = function() { $scope.hangup = function() {
if (!verto.data.call) { if (!verto.data.call) {
toastr.warning('There is no call to hangup.'); toastr.warning($translate.instant('MESSAGE_NO_HANGUP_CALL'));
$location.path('/dialpad'); $location.path('/dialpad');
return; return;
} }
@ -501,7 +501,7 @@
}; };
$scope.play = function() { $scope.play = function() {
var file = $scope.promptInput('Please, enter filename', '', 'File', var file = $scope.promptInput($translate.instant('MESSAGE_ENTER_FILENAME'), '', 'File',
function(file) { function(file) {
verto.data.conf.play(file); verto.data.conf.play(file);
console.log('play file :', file); console.log('play file :', file);
@ -514,7 +514,7 @@
}; };
$scope.record = function() { $scope.record = function() {
var file = $scope.promptInput('Please, enter filename', '', 'File', var file = $scope.promptInput($translate.instant('MESSAGE_ENTER_FILENAME'), '', 'File',
function(file) { function(file) {
verto.data.conf.record(file); verto.data.conf.record(file);
console.log('recording file :', file); console.log('recording file :', file);
@ -526,7 +526,7 @@
}; };
$scope.snapshot = function() { $scope.snapshot = function() {
var file = $scope.promptInput('Please, enter filename', '', 'File', var file = $scope.promptInput($translate.instant('MESSAGE_ENTER_FILENAME'), '', 'File',
function(file) { function(file) {
verto.data.conf.snapshot(file); verto.data.conf.snapshot(file);
console.log('snapshot file :', file); console.log('snapshot file :', file);

View File

@ -4,9 +4,9 @@
angular angular
.module('vertoControllers') .module('vertoControllers')
.controller('PreviewController', ['$rootScope', '$scope', .controller('PreviewController', ['$rootScope', '$scope',
'$http', '$location', '$modal', '$timeout', 'toastr', 'verto', 'storage', 'prompt', 'Fullscreen', '$http', '$location', '$modal', '$timeout', 'toastr', 'verto', 'storage', 'prompt', 'Fullscreen', '$translate',
function($rootScope, $scope, $http, $location, $modal, $timeout, toastr, function($rootScope, $scope, $http, $location, $modal, $timeout, toastr,
verto, storage, prompt, Fullscreen) { verto, storage, prompt, Fullscreen, $translate) {
$scope.storage = storage; $scope.storage = storage;
console.debug('Executing PreviewController.'); console.debug('Executing PreviewController.');
@ -87,8 +87,8 @@
$scope.videoCall = function() { $scope.videoCall = function() {
prompt({ prompt({
title: 'Would you like to activate video for this call?', title: $translate.instant('TITLE_ENABLE_VIDEO'),
message: 'Video will be active during the next calls.' message: $translate.instant('MESSAGE_ENABLE_VIDEO')
}).then(function() { }).then(function() {
storage.data.videoCall = true; storage.data.videoCall = true;
$scope.callTemplate = 'partials/video_call.html'; $scope.callTemplate = 'partials/video_call.html';

View File

@ -4,8 +4,8 @@
angular angular
.module('vertoControllers') .module('vertoControllers')
.controller('SettingsController', ['$scope', '$http', .controller('SettingsController', ['$scope', '$http',
'$location', '$rootScope', 'storage', 'verto', '$location', '$rootScope', 'storage', 'verto', '$translate',
function($scope, $http, $location, $rootScope, storage, verto) { function($scope, $http, $location, $rootScope, storage, verto, $translate) {
console.debug('Executing ModalSettingsController.'); console.debug('Executing ModalSettingsController.');
$.material.init(); $.material.init();
@ -47,7 +47,7 @@
return; return;
} }
else { else {
toastr.warning('Can\'t display preview settings during a call'); toastr.warning($translate.instant('MESSAGE_DISPLAY_SETTINGS'));
} }
}; };