'<%= config.app %>/**/*.html',
'.tmp/styles/{,*/}*.css',
'<%= config.app %>/images/{,*/}*',
+ '<%= config.app %>/locales/{,*/}*',
'.tmp/**/*.js',
'<%= config.app %>/**/*.js'
],
],
routes: {
'/partials': 'src/partials',
+ '/locales': 'src/locales',
'/config.json': 'src/config.json',
'/contributors.txt': 'src/contributors.txt',
'/bower_components': './bower_components',
'img/*.png',
'images/{,*/}*.{webp}',
'css/fonts/{,*/}*.*',
- 'sounds/*.*'
+ 'sounds/*.*',
+ 'locales/*.*'
]
}, {
expand: true,
"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",
color: white;
}
+#settings .checkbox .checkbox-material .check {
+ margin-right: 10px;
+}
+
#settings .btn {
color: rgba(0, 10, 66, 0.84);
background-color: #E8E8E8;
<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 -->
--- /dev/null
+{
+ "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..."
+}
+
--- /dev/null
+{
+ "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..."
+}
+
<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 }">
<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>
<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">
<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>
<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>
<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">
<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>
<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">
<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">
<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>
</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>
<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>
<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>
<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>
</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">
<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">
<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>
<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>
<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">
</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>
</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>
<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>
<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"
</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>
<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"
</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)"
</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>
<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>
<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>
</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>
</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>
</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>
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) {
'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);
}
'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);
}
'status': 'success',
'soft': true,
'activity': activity,
- 'message': 'Refresh Media Devices.'
+ 'message': $translate.instant('REFRESH_MEDIA_DEVICES')
};
verto.refreshDevices(function(status) {
'status': 'success',
'soft': true,
'activity': activity,
- 'message': 'Check Connection Speed.'
+ 'message': $translate.instant('CHECK_CONNECTION_SPEED')
};
if (storage.data.autoBand && verto.data.instance) {
'status': 'promise',
'soft': true,
'activity': activity,
- 'message': 'Provisioning configuration.'
+ 'message': $translate.instant('CHECK_PROVISIONING_CONF')
};
var configResponse = config.configure();
return result;
} else {
result['status'] = 'error';
- result['message'] = 'Error: Provision failed.';
+ result['message'] = $translate.instant('ERROR_PROVISIONING_CONF');
return result;
}
});
'status': 'success',
'soft': true,
'activity': activity,
- 'message': 'Checking login.'
+ 'message': $translate.instant('CHECK_LOGIN'),
};
if(verto.data.connecting || verto.data.connected) {
];
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');
}
};
'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',
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);
}
]);
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() {
console.log('$scope.confBanner');
prompt({
- title: 'Please insert the banner text',
+ title: $translate.instant('TITLE_INSERT_BANNER'),
input: true,
label: '',
value: '',
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);
});
return;
}
- shortPrompt('Please insert the Canvas Id', function(canvasID) {
+ shortPrompt($translate.instant('TITLE_INSERT_CANVAS_ID'), function(canvasID) {
verto.setCanvasOut(memberID, canvasID);
});
};
return;
}
- shortPrompt('Please insert the Layer', function(canvasID) {
+ shortPrompt($translate.instant('TITLE_INSERT_LAYER'), function(canvasID) {
verto.setLayer(memberID, canvasID);
});
};
$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) {
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;
*/
$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';
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.');
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();
});
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');
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;
*/
$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;
}
};
$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);
};
$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);
};
$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);
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.');
$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';
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();
return;
}
else {
- toastr.warning('Can\'t display preview settings during a call');
+ toastr.warning($translate.instant('MESSAGE_DISPLAY_SETTINGS'));
}
};