FS-8972 - [verto_communicator] add i18n using angular-translate and static file loader

This commit is contained in:
Davide Colombo 2016-03-23 11:15:44 +01:00
parent ad72c7f56c
commit 6c197ae2f0
23 changed files with 504 additions and 191 deletions

View File

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

View File

@ -43,7 +43,9 @@
"jquery-json": "~2.5.1",
"datatables": "~1.10.8",
"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": {
"angular": "~1.3.15",

View File

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

View File

@ -97,6 +97,8 @@
<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/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 -->
<!-- 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'">
<li role="presentation" ng-class="{'active': activePane == 'members'}">
<a ng-click="activePane = 'members'" href="">
Members
{{ 'CHAT_TITLE_MEMBERS' | translate}}
</a>
</li>
<li role="presentation" ng-class="{'active': activePane == 'chat'}">
<a ng-click="activePane = 'chat'" href="">
Chat
{{ 'CHAT_TITLE' | translate }}
</a>
</li>
</ul>
<div class="chat-members" ng-show="activePane == 'members'">
<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 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>
<div class="col-md-6 ctrl-section">
<h3>General</h3>
<h3>{{ 'CHAT_GENERAL' | translate }}</h3>
<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>
Kick
{{ 'CHAT_KICK' | translate }}
</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>
Floor
{{ 'CHAT_FLOOR' | translate }}
</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>
<span style="margin-left: -9px">Transfer</span>
<span style="margin-left: -9px">{{ 'CHAT_TRANSFER' | translate }}</span>
</a>
</div>
</div>
<div class="col-md-6 ctrl-section">
<h3>Banner</h3>
<h3>{{ 'CHAT_BANNER' | translate }}</h3>
<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>
Set
{{ 'CHAT_SET' | translate }}
</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>
Reset
{{ 'CHAT_RESET' | translate }}
</a>
</div>
</div>
@ -90,61 +90,61 @@
<div>
<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">
<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>
Prev
{{ 'CHAT_PREV' | translate }}
</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>
Id
</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>
Next
{{ 'CHAT_NEXT' | translate }}
</a>
</div>
<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>
Prev
{{ 'CHAT_PREV' | translate }}
</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>
Id
</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>
Next
{{ 'CHAT_NEXT' | translate }}
</a>
</div>
<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>
Prev
{{ 'CHAT_PREV' | translate }}
</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>
Id
</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>
Next
{{ 'CHAT_NEXT' | translate }}
</a>
</div>
</div>
<div class="col-md-6 ctrl-section">
<h3>Audio/Video</h3>
<h3>{{ 'CHAT_AUDIO_VIDEO' | translate }}</h3>
<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>
{{ member.status.audio.muted ? 'Unmute' : 'Mute' }}
{{ member.status.audio.muted ? 'CHAT_UNMUTE_MIC' : 'CHAT_MUTE_MIC' | translate }}
</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>
{{ member.status.video.muted ? 'Unmute' : 'Mute' }}
{{ member.status.video.muted ? 'CHAT_UNMUTE_MIC' : 'CHAT_MUTE_MIC' | translate }}
</a>
</div>
<div class="group btn-group-justified">
@ -176,7 +176,7 @@
<div class="chat-history" ng-show="activePane == 'chat'">
<div class="chat-messages">
<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 class="chat-message" ng-repeat="message in messages" title="Sent at {{ message.created_at|date }}.">
<div class="chat-message-metadata">{{ message.from }}:</div>
@ -188,9 +188,9 @@
<div class="chat-message-input">
<form ng-submit="send()" >
<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">
Send
{{ 'CHAT_SEND_MESSAGE' | translate }}
<span class="mdi-navigation-arrow-forward chat-message-input-group-icon-button"></span>
</button>
</div>

View File

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

View File

@ -1,9 +1,9 @@
<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">
<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">
Calling to {{ dialpadNumber }}...
{{ 'CALLING_TO' | translate}} {{ dialpadNumber }}...
<a class="btn btn-sm btn-raised btn-warning" ng-click="cancel()">
Cancel<div class="ripple-container"></div>
</a>
@ -19,7 +19,7 @@
<div class="panel-heading">
<div class="panel-title">
<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 class="pull-right pull-right-margin dropdown">
@ -27,14 +27,14 @@
<i class="mdi-navigation-more-vert"></i>
</a>
<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>
</span>
</div>
</div>
<ul class="call-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>
<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>
</a>
</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">
<a href="" ng-click="backspace()">
<i class="mdi-content-backspace"></i>
@ -163,7 +163,7 @@
</div>
</div>
<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>
</button>
</div>

View File

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

View File

@ -2,13 +2,13 @@
<div class="container-fluid">
<div class="https-untrusted navbar-center" ng-show="!safeProtocol">
<div class="https-message">
This Connection is Untrusted.
{{ 'MESSAGE_CONNECTION_UNTRUSTED' | translate }}
</div>
</div>
<div class="navbar-header">
<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>
@ -25,10 +25,10 @@
<span class="caret"></span>
</a>
<ul class="dropdown-menu drop-net-info" role="menu" ng-click="$event.stopPropagation()">
<li><a class="title">Bandwidth Info</a></li>
<li><a>Outgoing: {{bandUp}} Kbps</a></li>
<li><a>Incoming: {{bandDown}} Kbps</a></li>
<li><a>Video Resolution: {{vidRes}}</a></li>
<li><a class="title">{{ 'BANDWIDTH_INFO' | translate }}</a></li>
<li><a>{{ 'BANDWIDTH_INFO_OUTGOING' | translate }} {{bandUp}} Kbps</a></li>
<li><a>{{ 'BANDWIDTH_INFO_INCOMING' | translate }} {{bandDown}} Kbps</a></li>
<li><a>{{ 'BANDWIDTH_INFO_VIDEO_RES' | translate }} {{vidRes}}</a></li>
</ul>
</li>
<li>
@ -38,7 +38,7 @@
</li>
<li>
<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>
</li>
<li class="navbar-item-icon" ng-show="verto.data.connected">
@ -63,10 +63,10 @@
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href="#/?sessid=random" target="_blank">Open New Window</a></li>
<li><a href="" ng-click="openModal('partials/modal_logininfo.html', 'ModalLoginInformationController')">Change Login Information</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_INFO' | translate}}</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>
</li>
<li class="navbar-item-icon">
@ -75,9 +75,9 @@
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href="" ng-click="showAbout()">About</a></li>
<li><a href="" ng-click="showContributors()">Contributors</a></li>
<li><a href="https://freeswitch.org/confluence/x/MQCT" target="_blank">Help</a></li>
<li><a href="" ng-click="showAbout()">{{ 'ABOUT' | translate}}</a></li>
<li><a href="" ng-click="showContributors()">{{ 'CONTRIBUTORS' | translate}}</a></li>
<li><a href="https://freeswitch.org/confluence/x/MQCT" target="_blank">{{ 'HELP' | translate}}</a></li>
</ul>
</li>

View File

@ -1,35 +1,35 @@
<div class="modal-header">
<h3 class="modal-title">Login Information</h3>
<h3 class="modal-title">{{ 'LOGIN_INFORMATION' | translate}}</h3>
</div>
<div class="modal-body">
<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"/>
</div>
<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"/>
</div>
<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">
</div>
<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">
</div>
<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">
</div>
</div>
<div class="modal-footer">
<!-- <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>

View File

@ -2,7 +2,7 @@
<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-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 class="panel-body">
<div class="preview-wrapper">
@ -20,13 +20,13 @@
</div>
<form name="form">
<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"
ng-options="item.id as item.label for item in verto.data.videoDevices" ng-change="localVideo()" >
</select>
</div>
<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"
ng-options="item.id as item.label for item in verto.data.audioDevices" ng-change="localVideo()">
</select>
@ -36,8 +36,8 @@
</a>
<div class="form-group text-center">
<button type="submit" class="btn btn-success" ng-click="endPreview()" title="Save">
Save
<button type="submit" class="btn btn-success" ng-click="endPreview()" title="{{ 'SAVE' | translate }}">
{{ 'SAVE' | translate }}
</button>
</div>
</form>

View File

@ -3,21 +3,21 @@
<div class="col-md-4">
<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"
ng-model="mydata.selectedVideo" ng-options="item.id as item.label for item in verto.data.videoDevices">
</select>
</div>
<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"
ng-model="mydata.selectedShare" ng-options="item.id as item.label for item in verto.data.shareDevices">
</select>
</div>
<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"
ng-model="mydata.selectedAudio" ng-options="item.id as item.label for item in verto.data.audioDevices">
</select>
@ -25,9 +25,9 @@
<div class="form-group">
<label for="settings-microphone">
Speaker:
{{ 'SPEAKER' | translate }}
<span ng-show="!speakerFeature" class="unsupported">
Your browser doesn't seem to support this feature
{{ 'SPEAKER_FEATURE' | translate }}
</span>
</label>
<select name="microphone" id="settings-microphone" class="form-control" ng-disabled="!speakerFeature"
@ -36,67 +36,67 @@
</div>
<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"
ng-model="mydata.bestFrameRate"
ng-options="item.id as item.label for item in verto.framerate"></select>
</div>
<a class="btn btn-primary" href="" ng-click="showPreview()">Preview Settings</a>
<a class="btn btn-primary" href="" ng-click="refreshDeviceList()">Refresh device list</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' | translate }}</a>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="settings-microphone">General settings:</label>
<label for="settings-microphone">{{ 'GENERAL_SETTINGS' | translate }}</label>
<div class="checkbox">
<label>
<input type="checkbox" name="use_video" value="mydata.useVideo" ng-model="mydata.useVideo">
Use Video
<span ng-bind="'USE_VIDEO' | translate"></span>
</label>
</div>
<div class="checkbox">
<label>
<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>
</div>
<div class="checkbox">
<label>
<input type="checkbox" name="use_stun" ng-value="mydata.useSTUN" ng-model="mydata.useSTUN">
Use STUN
<span ng-bind="'USE_STUN' | translate"></span>
</label>
</div>
<div class="checkbox">
<label>
<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>
</div>
<div class="checkbox">
<label>
<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>
</div>
<div class="form-group">
<label for="settings-microphone">Audio settings:</label>
<label for="settings-microphone">{{ 'AUDIO_SETTINGS' | translate }}</label>
<div class="checkbox">
<label>
<input type="checkbox" name="googEchoCancellation" value="mydata.googEchoCancellation" ng-model="mydata.googEchoCancellation">
Echo Cancellation
<span ng-bind="'ECHO_CANCEL' | translate"></span>
</label>
</div>
<div class="checkbox">
<label>
<input type="checkbox" name="googNoiseSuppression" value="mydata.googNoiseSuppression" ng-model="mydata.googNoiseSuppression">
Noise Suppression
<span ng-bind="'NOISE_SUPPRESSION' | translate"></span>
</label>
</div>
<div class="checkbox">
<label>
<input type="checkbox" name="googHighpassFilter" value="mydata.googHighpassFilter" ng-model="mydata.googHighpassFilter">
Highpass Filter
<span ng-bind="'HIGHPASS_FILTER' | translate"></span>
</label>
</div>
</div>
@ -106,32 +106,32 @@
<div class="col-md-4">
<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">
<div ng-show="mydata.useDedenc" class="dedicated_encoder">
<p>Dedicated Remote Encoder enabled.</b>
<p>{{ 'REMOTE_ENCODER' | translate }}</b>
</div>
<div class="checkbox">
<label>
<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>
</div>
<div class="checkbox" ng-show="mydata.autoBand">
<label>
<input type="checkbox" ng-model="mydata.testSpeedJoin">
Recheck bandwidth before each outgoing call
<span ng-bind="'RECHECK_BANDWIDTH' | translate"></span>
</label>
</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">
<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"
ng-disabled="mydata.autoBand"
ng-model="mydata.vidQual"
@ -140,7 +140,7 @@
</div>
<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"
ng-model="mydata.incomingBandwidth"
ng-change="checkUseDedRemoteEncoder(mydata.incomingBandwidth)"
@ -148,7 +148,7 @@
</div>
<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"
ng-model="mydata.outgoingBandwidth"
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="card">
<div class="card-body text-center">
<h2>Loading</h2>
<h2>{{ 'LOADING' | translate }}</h2>
<div class="progress progress-striped active">
<div class="progress-bar" ng-class="{'progress-bar-danger': interrupt_next}" style="width: {{ progress_percentage }}%"></div>
</div>
<div ng-bind="message"></div>
<div class="splash-errors" ng-if="errors.length">
<h4>Errors</h4>
<h4>{{ 'ERRORS' | translate }}</h4>
<ul ng-repeat="error in errors">
<li>{{ ::error }}</li>
</ul>

View File

@ -2,28 +2,28 @@
<div class="video-wrapper">
<div class="video-hover-buttons" ng-show="verto.data.callState == 'active' && !watcher">
<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()">
<i class="mdi-av-play-circle-outline"></i>
</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()">
<i class="mdi-av-stop"></i>
</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()">
<i class="mdi-toggle-radio-button-on"></i>
</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()">
<i class="mdi-image-switch-camera"></i>
</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()">
<i class="mdi-image-photo-camera"></i>
</button>
<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"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="mdi-action-view-module"></i>
@ -37,28 +37,28 @@
</div>
</div>
<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)">
<i class="" ng-class="{'mdi-av-mic': !verto.data.mutedMic, 'mdi-av-mic-off': verto.data.mutedMic}"></i>
</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">
<i class="" ng-class="{'mdi-av-videocam': !verto.data.mutedVideo, 'mdi-av-videocam-off': verto.data.mutedVideo}"></i>
</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()">
<i class="" ng-class="{'mdi-navigation-fullscreen': !fullscreenEnabled, 'mdi-navigation-fullscreen-exit': fullscreenEnabled}"></i>
</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()">
<i class="mdi-hardware-desktop-windows"></i>
</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">
<i class="mdi-communication-chat"></i>
</button>
<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>
<span class="caret"></span>
</button>
@ -69,7 +69,7 @@
</ul>
</div>
<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>
<span class="caret"></span>
</button>
@ -96,9 +96,9 @@
</div>
</div>
<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>
{{ watcher ? 'Close' : 'End Call' }}
{{ watcher ? 'BUTTON_CLOSE' : 'BUTTON_END_CALL' }}
</button>
</div>
</div>

View File

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

View File

@ -17,10 +17,11 @@
'ui.gravatar',
'ui.bootstrap',
'directive.g+signin',
'pascalprecht.translate',
]);
vertoApp.config(['$routeProvider', 'gravatarServiceProvider',
function($routeProvider, gravatarServiceProvider) {
vertoApp.config(['$routeProvider', 'gravatarServiceProvider', '$translateProvider',
function($routeProvider, gravatarServiceProvider, $translateProvider) {
$routeProvider.
when('/', {
title: 'Loading',
@ -59,6 +60,21 @@
gravatarServiceProvider.defaults = {
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
.module('vertoControllers')
.controller('ChatController', ['$scope', '$rootScope', '$http',
'$location', '$anchorScroll', '$timeout', 'verto', 'prompt',
'$location', '$anchorScroll', '$timeout', 'verto', 'prompt', '$translate',
function($scope, $rootScope, $http, $location, $anchorScroll, $timeout,
verto, prompt) {
verto, prompt, $translate) {
console.debug('Executing ChatController.');
function scrollToChatBottom() {
@ -246,7 +246,7 @@
console.log('$scope.confBanner');
prompt({
title: 'Please insert the banner text',
title: $translate.instant('TITLE_INSERT_BANNER'),
input: true,
label: '',
value: '',
@ -263,7 +263,7 @@
return;
}
shortPrompt('Please insert the Canvas Id', function(canvasID) {
shortPrompt($translate.instant('TITLE_INSERT_CANVAS_ID'), function(canvasID) {
console.log(memberID, canvasID);
verto.setCanvasIn(memberID, canvasID);
});
@ -276,7 +276,7 @@
return;
}
shortPrompt('Please insert the Canvas Id', function(canvasID) {
shortPrompt($translate.instant('TITLE_INSERT_CANVAS_ID'), function(canvasID) {
verto.setCanvasOut(memberID, canvasID);
});
};
@ -287,7 +287,7 @@
return;
}
shortPrompt('Please insert the Layer', function(canvasID) {
shortPrompt($translate.instant('TITLE_INSERT_LAYER'), function(canvasID) {
verto.setLayer(memberID, canvasID);
});
};
@ -321,10 +321,10 @@
$scope.confTransfer = function(memberID) {
console.log('$scope.confTransfer');
prompt({
title: 'Transfer party?',
message: 'To what destination would you like to transfer this call?',
title: $translate.instant('TITLE_TRANSFER'),
message: $translate.instant('MESSAGE_TRANSFER'),
input: true,
label: 'Destination',
label: $translate.instant('LABEL_TRANSFER'),
value: '',
}).then(function(exten) {
if (exten) {

View File

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

View File

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

View File

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

View File

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