├── VERSION ├── config ├── func_odbc.conf ├── res_odbc.conf ├── cli.conf ├── extconfig.conf ├── res_parking.conf ├── users.conf ├── cdr.conf ├── iaxprov.conf ├── manager.conf ├── say.conf ├── codecs.conf ├── http.conf ├── sip_notify.conf ├── musiconhold.conf ├── asterisk.conf ├── res_stun_monitor.conf ├── queues.conf ├── udptl.conf ├── queuerules.conf ├── res_snmp.conf ├── logger.conf ├── rtp.conf ├── res_fax.conf ├── modules.conf ├── extensions.conf ├── confbridge.conf ├── voicemail.conf ├── indications.conf ├── sip.conf └── pjsip.conf ├── Docker ├── config │ ├── func_odbc.conf │ ├── res_odbc.conf │ ├── extconfig.conf │ ├── cli.conf │ ├── res_parking.conf │ ├── cdr.conf │ ├── iaxprov.conf │ ├── manager.conf │ ├── say.conf │ ├── codecs.conf │ ├── asterisk.conf │ ├── sip_notify.conf │ ├── musiconhold.conf │ ├── res_stun_monitor.conf │ ├── pjsip_notify.conf │ ├── queues.conf │ ├── udptl.conf │ ├── queuerules.conf │ ├── res_snmp.conf │ ├── logger.conf │ ├── rtp.conf │ ├── res_fax.conf │ ├── ccss.conf │ ├── http.conf │ ├── cel.conf │ ├── modules.conf │ ├── confbridge.conf │ ├── voicemail.conf │ ├── indications.conf │ ├── ari.conf │ ├── extensions.conf │ ├── pjsip.conf │ ├── acl.conf │ ├── pjproject.conf │ └── features.conf └── modules │ ├── ast-13 │ └── codec_opus_arm.so │ └── ast-16 │ └── codec_opus_arm.so ├── .DS_Store ├── .gitattributes ├── Phone ├── .DS_Store ├── favicon.ico ├── icons │ ├── 512.png │ ├── any_192.png │ ├── maskable_192.png │ ├── screenshot1.webp │ └── screenshot2.webp ├── media │ ├── Alert.mp3 │ ├── Ringtone_1.mp3 │ ├── Tone_Busy-UK.mp3 │ ├── Tone_Busy-US.mp3 │ ├── speech_orig.mp3 │ ├── Tone_CallWaiting.mp3 │ ├── Tone_Congestion-UK.mp3 │ ├── Tone_Congestion-US.mp3 │ ├── Tone_EarlyMedia-UK.mp3 │ ├── Tone_EarlyMedia-US.mp3 │ ├── Tone_EarlyMedia-Japan.mp3 │ ├── Tone_EarlyMedia-Australia.mp3 │ └── Tone_EarlyMedia-European.mp3 ├── wallpaper.dark.webp ├── wallpaper.light.webp ├── avatars │ ├── default.0.webp │ ├── default.1.webp │ ├── default.2.webp │ ├── default.3.webp │ ├── default.4.webp │ ├── default.5.webp │ ├── default.6.webp │ ├── default.7.webp │ └── default.8.webp ├── offline.html ├── manifest.json ├── responsive.html ├── sw.js ├── click-to-dial.html ├── popup.html ├── index.html ├── phone.light.css ├── phone.dark.css └── lang │ ├── zh-hans.json │ ├── zh.json │ └── ja.json ├── modules ├── .DS_Store ├── ast-13 │ └── codec_opus_arm.so └── ast-16 │ └── codec_opus_arm.so ├── Screenshots ├── AudioCall.jpg ├── VideoCall.jpg ├── VideoWall.jpg ├── VideoWall1.jpg ├── Buddy_Stream.jpg ├── InCall_Stats.jpg ├── Conference_SFU.jpg ├── Recording_Format.jpg ├── AudioCall_Conference.jpg ├── AudioCall_Transfer.jpg ├── Buddy_Stream_Light.jpg ├── Call_Detail_Records.jpg ├── UI_Mobile_List_Dark.jpg ├── UI_Mobile_List_Light.jpg ├── UI_Mobilr_Call_Light.jpg ├── VideoCall_PresentVideo.jpg ├── Configure_Settings_Dark.jpg ├── Configure_Settings_Light.jpg ├── VideoCall_PresentCamera.jpg └── VideoCall_PresentScratchpad.jpg ├── lib ├── fonts │ ├── font_awesome │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── less │ │ │ ├── fixed-width.less │ │ │ ├── screen-reader.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── core.less │ │ │ ├── stacked.less │ │ │ ├── font-awesome.less │ │ │ ├── bordered-pulled.less │ │ │ ├── rotated-flipped.less │ │ │ ├── path.less │ │ │ ├── animated.less │ │ │ └── mixins.less │ │ ├── scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _core.scss │ │ │ ├── font-awesome.scss │ │ │ ├── _stacked.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _path.scss │ │ │ ├── _animated.scss │ │ │ └── _mixins.scss │ │ └── HELP-US-OUT.txt │ └── font_roboto │ │ ├── CWB0XYA8bzo0kSThX0UTuA.woff2 │ │ ├── -2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2 │ │ ├── Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2 │ │ ├── NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2 │ │ ├── RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2 │ │ ├── d-6IYplOFocCacKzxwXSOFtXRa8TVwTICgirnJhmVJw.woff2 │ │ ├── ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2 │ │ ├── mErvLBYg_cXG3rLvUsKT_fesZW2xOQ-xsNqO47m55DA.woff2 │ │ ├── u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2 │ │ ├── roboto.css │ │ └── LICENSE-2.0.txt ├── README.md ├── jquery │ ├── jquery.md5-min.js │ └── jquery.base64-0.0.2.js ├── Croppie │ └── croppie.css └── Normalize │ └── normalize-v8.0.1.css ├── .gitignore ├── .vscode └── settings.json └── Dockerfile /VERSION: -------------------------------------------------------------------------------- 1 | 0.3.29 -------------------------------------------------------------------------------- /config/func_odbc.conf: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/res_odbc.conf: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Docker/config/func_odbc.conf: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Docker/config/res_odbc.conf: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/cli.conf: -------------------------------------------------------------------------------- 1 | [startup_commands] -------------------------------------------------------------------------------- /config/extconfig.conf: -------------------------------------------------------------------------------- 1 | [settings] -------------------------------------------------------------------------------- /config/res_parking.conf: -------------------------------------------------------------------------------- 1 | [globals] -------------------------------------------------------------------------------- /config/users.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | -------------------------------------------------------------------------------- /Docker/config/extconfig.conf: -------------------------------------------------------------------------------- 1 | [settings] -------------------------------------------------------------------------------- /config/cdr.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | enable=no -------------------------------------------------------------------------------- /config/iaxprov.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | 3 | -------------------------------------------------------------------------------- /Docker/config/cli.conf: -------------------------------------------------------------------------------- 1 | [startup_commands] -------------------------------------------------------------------------------- /Docker/config/res_parking.conf: -------------------------------------------------------------------------------- 1 | [globals] -------------------------------------------------------------------------------- /config/manager.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | enabled=no -------------------------------------------------------------------------------- /config/say.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | mode=old 3 | -------------------------------------------------------------------------------- /Docker/config/cdr.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | enable=no -------------------------------------------------------------------------------- /Docker/config/iaxprov.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | 3 | -------------------------------------------------------------------------------- /config/codecs.conf: -------------------------------------------------------------------------------- 1 | [plc] 2 | genericplc=true 3 | -------------------------------------------------------------------------------- /Docker/config/manager.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | enabled=no -------------------------------------------------------------------------------- /Docker/config/say.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | mode=old 3 | -------------------------------------------------------------------------------- /Docker/config/codecs.conf: -------------------------------------------------------------------------------- 1 | [plc] 2 | genericplc=true 3 | -------------------------------------------------------------------------------- /config/http.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | enabled=no 3 | tlsenable=no 4 | -------------------------------------------------------------------------------- /Docker/config/asterisk.conf: -------------------------------------------------------------------------------- 1 | [options] 2 | verbose = 7 3 | debug = 0 -------------------------------------------------------------------------------- /config/sip_notify.conf: -------------------------------------------------------------------------------- 1 | ; Phone Provisioning and Notification 2 | -------------------------------------------------------------------------------- /Docker/config/sip_notify.conf: -------------------------------------------------------------------------------- 1 | ; Phone Provisioning and Notification 2 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/.DS_Store -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /config/musiconhold.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | mode=files 3 | directory=/var/lib/asterisk/moh 4 | -------------------------------------------------------------------------------- /config/asterisk.conf: -------------------------------------------------------------------------------- 1 | [options] 2 | verbose = 7 3 | debug = 0 4 | systemname = RaspberryPiPBX -------------------------------------------------------------------------------- /Docker/config/musiconhold.conf: -------------------------------------------------------------------------------- 1 | [default] 2 | mode=files 3 | directory=/var/lib/asterisk/moh 4 | -------------------------------------------------------------------------------- /Phone/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/.DS_Store -------------------------------------------------------------------------------- /Phone/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/favicon.ico -------------------------------------------------------------------------------- /config/res_stun_monitor.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | stunaddr = stun.l.google.com:19302 3 | stunrefresh = 300 4 | -------------------------------------------------------------------------------- /modules/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/modules/.DS_Store -------------------------------------------------------------------------------- /Phone/icons/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/icons/512.png -------------------------------------------------------------------------------- /Phone/media/Alert.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Alert.mp3 -------------------------------------------------------------------------------- /Docker/config/res_stun_monitor.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | stunaddr = stun.l.google.com:19302 3 | stunrefresh = 300 4 | -------------------------------------------------------------------------------- /Phone/icons/any_192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/icons/any_192.png -------------------------------------------------------------------------------- /config/queues.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | ; persistentmembers = yes 3 | ; keepstats = yes 4 | shared_lastcall=yes 5 | 6 | -------------------------------------------------------------------------------- /Docker/config/pjsip_notify.conf: -------------------------------------------------------------------------------- 1 | ; rfc3842 2 | ; put empty "Content=>" at the end to have CRLF after last body line 3 | -------------------------------------------------------------------------------- /Phone/media/Ringtone_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Ringtone_1.mp3 -------------------------------------------------------------------------------- /Phone/wallpaper.dark.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/wallpaper.dark.webp -------------------------------------------------------------------------------- /Phone/wallpaper.light.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/wallpaper.light.webp -------------------------------------------------------------------------------- /Screenshots/AudioCall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/AudioCall.jpg -------------------------------------------------------------------------------- /Screenshots/VideoCall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/VideoCall.jpg -------------------------------------------------------------------------------- /Screenshots/VideoWall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/VideoWall.jpg -------------------------------------------------------------------------------- /Screenshots/VideoWall1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/VideoWall1.jpg -------------------------------------------------------------------------------- /Docker/config/queues.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | ; persistentmembers = yes 3 | ; keepstats = yes 4 | shared_lastcall=yes 5 | 6 | -------------------------------------------------------------------------------- /Phone/avatars/default.0.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.0.webp -------------------------------------------------------------------------------- /Phone/avatars/default.1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.1.webp -------------------------------------------------------------------------------- /Phone/avatars/default.2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.2.webp -------------------------------------------------------------------------------- /Phone/avatars/default.3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.3.webp -------------------------------------------------------------------------------- /Phone/avatars/default.4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.4.webp -------------------------------------------------------------------------------- /Phone/avatars/default.5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.5.webp -------------------------------------------------------------------------------- /Phone/avatars/default.6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.6.webp -------------------------------------------------------------------------------- /Phone/avatars/default.7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.7.webp -------------------------------------------------------------------------------- /Phone/avatars/default.8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/avatars/default.8.webp -------------------------------------------------------------------------------- /Phone/icons/maskable_192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/icons/maskable_192.png -------------------------------------------------------------------------------- /Phone/icons/screenshot1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/icons/screenshot1.webp -------------------------------------------------------------------------------- /Phone/icons/screenshot2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/icons/screenshot2.webp -------------------------------------------------------------------------------- /Phone/media/Tone_Busy-UK.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_Busy-UK.mp3 -------------------------------------------------------------------------------- /Phone/media/Tone_Busy-US.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_Busy-US.mp3 -------------------------------------------------------------------------------- /Phone/media/speech_orig.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/speech_orig.mp3 -------------------------------------------------------------------------------- /Screenshots/Buddy_Stream.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/Buddy_Stream.jpg -------------------------------------------------------------------------------- /Screenshots/InCall_Stats.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/InCall_Stats.jpg -------------------------------------------------------------------------------- /Screenshots/Conference_SFU.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/Conference_SFU.jpg -------------------------------------------------------------------------------- /Phone/media/Tone_CallWaiting.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_CallWaiting.mp3 -------------------------------------------------------------------------------- /Screenshots/Recording_Format.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/Recording_Format.jpg -------------------------------------------------------------------------------- /modules/ast-13/codec_opus_arm.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/modules/ast-13/codec_opus_arm.so -------------------------------------------------------------------------------- /modules/ast-16/codec_opus_arm.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/modules/ast-16/codec_opus_arm.so -------------------------------------------------------------------------------- /Phone/media/Tone_Congestion-UK.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_Congestion-UK.mp3 -------------------------------------------------------------------------------- /Phone/media/Tone_Congestion-US.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_Congestion-US.mp3 -------------------------------------------------------------------------------- /Phone/media/Tone_EarlyMedia-UK.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_EarlyMedia-UK.mp3 -------------------------------------------------------------------------------- /Phone/media/Tone_EarlyMedia-US.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_EarlyMedia-US.mp3 -------------------------------------------------------------------------------- /Screenshots/AudioCall_Conference.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/AudioCall_Conference.jpg -------------------------------------------------------------------------------- /Screenshots/AudioCall_Transfer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/AudioCall_Transfer.jpg -------------------------------------------------------------------------------- /Screenshots/Buddy_Stream_Light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/Buddy_Stream_Light.jpg -------------------------------------------------------------------------------- /Screenshots/Call_Detail_Records.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/Call_Detail_Records.jpg -------------------------------------------------------------------------------- /Screenshots/UI_Mobile_List_Dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/UI_Mobile_List_Dark.jpg -------------------------------------------------------------------------------- /Screenshots/UI_Mobile_List_Light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/UI_Mobile_List_Light.jpg -------------------------------------------------------------------------------- /Screenshots/UI_Mobilr_Call_Light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/UI_Mobilr_Call_Light.jpg -------------------------------------------------------------------------------- /config/udptl.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | udptlstart=4000 3 | udptlend=4999 4 | ;udptlchecksums=no 5 | udptlfecentries = 3 6 | udptlfecspan = 3 7 | -------------------------------------------------------------------------------- /Phone/media/Tone_EarlyMedia-Japan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_EarlyMedia-Japan.mp3 -------------------------------------------------------------------------------- /Screenshots/VideoCall_PresentVideo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/VideoCall_PresentVideo.jpg -------------------------------------------------------------------------------- /Docker/config/udptl.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | udptlstart=4000 3 | udptlend=4999 4 | ;udptlchecksums=no 5 | udptlfecentries = 3 6 | udptlfecspan = 3 7 | -------------------------------------------------------------------------------- /Docker/modules/ast-13/codec_opus_arm.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Docker/modules/ast-13/codec_opus_arm.so -------------------------------------------------------------------------------- /Docker/modules/ast-16/codec_opus_arm.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Docker/modules/ast-16/codec_opus_arm.so -------------------------------------------------------------------------------- /Phone/media/Tone_EarlyMedia-Australia.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_EarlyMedia-Australia.mp3 -------------------------------------------------------------------------------- /Phone/media/Tone_EarlyMedia-European.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Phone/media/Tone_EarlyMedia-European.mp3 -------------------------------------------------------------------------------- /Screenshots/Configure_Settings_Dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/Configure_Settings_Dark.jpg -------------------------------------------------------------------------------- /Screenshots/Configure_Settings_Light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/Configure_Settings_Light.jpg -------------------------------------------------------------------------------- /Screenshots/VideoCall_PresentCamera.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/VideoCall_PresentCamera.jpg -------------------------------------------------------------------------------- /Screenshots/VideoCall_PresentScratchpad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/Screenshots/VideoCall_PresentScratchpad.jpg -------------------------------------------------------------------------------- /lib/fonts/font_awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /lib/fonts/font_roboto/CWB0XYA8bzo0kSThX0UTuA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/CWB0XYA8bzo0kSThX0UTuA.woff2 -------------------------------------------------------------------------------- /lib/fonts/font_awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /lib/fonts/font_awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /lib/fonts/font_awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /lib/fonts/font_awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /config/queuerules.conf: -------------------------------------------------------------------------------- 1 | ; penaltychange => ,[,absolute or relative change to QUEUE_MIN_PENALTY] 2 | 3 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /Docker/config/queuerules.conf: -------------------------------------------------------------------------------- 1 | ; penaltychange => ,[,absolute or relative change to QUEUE_MIN_PENALTY] 2 | 3 | -------------------------------------------------------------------------------- /config/res_snmp.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | ; We run as a subagent per default -- to run as a full agent 3 | ; we must run as root (to be able to bind to port 161) 4 | ;subagent = yes 5 | enabled = no -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /Docker/config/res_snmp.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | ; We run as a subagent per default -- to run as a full agent 3 | ; we must run as root (to be able to bind to port 161) 4 | ;subagent = yes 5 | enabled = no -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /lib/fonts/font_roboto/-2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/-2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2 -------------------------------------------------------------------------------- /lib/fonts/font_roboto/Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2 -------------------------------------------------------------------------------- /lib/fonts/font_roboto/NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2 -------------------------------------------------------------------------------- /lib/fonts/font_roboto/RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2 -------------------------------------------------------------------------------- /lib/fonts/font_roboto/d-6IYplOFocCacKzxwXSOFtXRa8TVwTICgirnJhmVJw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/d-6IYplOFocCacKzxwXSOFtXRa8TVwTICgirnJhmVJw.woff2 -------------------------------------------------------------------------------- /lib/fonts/font_roboto/ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2 -------------------------------------------------------------------------------- /lib/fonts/font_roboto/mErvLBYg_cXG3rLvUsKT_fesZW2xOQ-xsNqO47m55DA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/mErvLBYg_cXG3rLvUsKT_fesZW2xOQ-xsNqO47m55DA.woff2 -------------------------------------------------------------------------------- /lib/fonts/font_roboto/u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InnovateAsterisk/Browser-Phone/HEAD/lib/fonts/font_roboto/u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2 -------------------------------------------------------------------------------- /config/logger.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | dateformat=%F %T 3 | queue_log = no 4 | queue_adaptive_realtime=yes 5 | 6 | [logfiles] 7 | console => notice,warning,error,debug ; event 8 | messages => notice,warning,error 9 | -------------------------------------------------------------------------------- /Docker/config/logger.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | dateformat=%F %T 3 | queue_log = no 4 | queue_adaptive_realtime=yes 5 | 6 | [logfiles] 7 | console => notice,warning,error,debug ; event 8 | messages => notice,warning,error 9 | -------------------------------------------------------------------------------- /config/rtp.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | rtpstart=5000 3 | rtpend=31000 4 | ;rtpchecksums=no 5 | ;dtmftimeout=3000 6 | rtcpinterval = 5000 7 | ; strictrtp=yes 8 | ; icesupport = true 9 | stunaddr=stun.l.google.com:19302 10 | -------------------------------------------------------------------------------- /Docker/config/rtp.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | rtpstart=8000 3 | rtpend=10000 4 | ;rtpchecksums=no 5 | ;dtmftimeout=3000 6 | rtcpinterval = 5000 7 | ; strictrtp=yes 8 | icesupport = true 9 | stunaddr=stun.l.google.com:19302 10 | -------------------------------------------------------------------------------- /config/res_fax.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | maxrate=14400 3 | minrate=2400 4 | statusevents=no 5 | modems=v17,v27,v29 6 | ; Enable/disable T.30 ECM (error correction mode) by default. 7 | ; Default: Enabled 8 | ecm=yes 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS generated files # 2 | ###################### 3 | 4 | ._* 5 | .Spotlight-V100 6 | .Trashes 7 | ehthumbs.db 8 | Thumbs.db 9 | .vscode/settings.json 10 | .vscode 11 | 12 | */.DS_Store 13 | *.DS_Store 14 | .DS_Store -------------------------------------------------------------------------------- /Docker/config/res_fax.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | maxrate=14400 3 | minrate=2400 4 | statusevents=no 5 | modems=v17,v27,v29 6 | ; Enable/disable T.30 ECM (error correction mode) by default. 7 | ; Default: Enabled 8 | ecm=yes 9 | 10 | -------------------------------------------------------------------------------- /config/modules.conf: -------------------------------------------------------------------------------- 1 | [modules] 2 | 3 | autoload=yes 4 | 5 | preload => res_odbc.so 6 | preload => res_config_odbc.so 7 | 8 | ; Resource modules currently not needed 9 | 10 | ; Channel modules currently not needed 11 | 12 | ; Application modules currently not needed 13 | -------------------------------------------------------------------------------- /Docker/config/ccss.conf: -------------------------------------------------------------------------------- 1 | ; 2 | ; --- Call Completion Supplementary Services --- 3 | ; 4 | ; For more information about CCSS, see the CCSS user documentation 5 | ; https://docs.asterisk.org/Deployment/PSTN-Connectivity/Call-Completion-Supplementary-Services-CCSS/ 6 | ; 7 | 8 | [general] -------------------------------------------------------------------------------- /config/extensions.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | static=yes 3 | writeprotect=yes 4 | priorityjumping=no 5 | autofallthrough=no 6 | 7 | [globals] 8 | 9 | [from-extensions] 10 | exten => _[+*0-9].,1,NoOp(Hello World) 11 | exten => _[+*0-9].,n,Hangup() 12 | 13 | exten => e,1,Hangup() 14 | -------------------------------------------------------------------------------- /Phone/offline.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Browser Phone | Offline 4 | 5 | 6 |

Sorry.. the Browser Phone requires you to go online ;)

7 |

8 | 9 | -------------------------------------------------------------------------------- /Docker/config/http.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | enabled=yes 3 | bindaddr=0.0.0.0:8080 4 | enablestatic=yes 5 | sessionlimit=1000 6 | redirect=/ /static/index.html 7 | 8 | tlsenable=yes 9 | tlsbindaddr=0.0.0.0:8089 10 | tlscertfile=/etc/asterisk/crt/certificate.pem 11 | tlsprivatekey=/etc/asterisk/crt/private.pem 12 | -------------------------------------------------------------------------------- /Docker/config/cel.conf: -------------------------------------------------------------------------------- 1 | ; 2 | ; Asterisk Channel Event Logging (CEL) 3 | ; 4 | 5 | ; Channel Event Logging is a mechanism to provide fine-grained event information 6 | ; that can be used to generate billing information. Such event information can 7 | ; be recorded to various backend modules. 8 | ; 9 | 10 | [general] -------------------------------------------------------------------------------- /lib/fonts/font_awesome/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /Docker/config/modules.conf: -------------------------------------------------------------------------------- 1 | [modules] 2 | 3 | autoload=yes 4 | 5 | preload => res_odbc.so 6 | preload => res_config_odbc.so 7 | 8 | ; Resource modules currently not needed 9 | noload => res_mwi_external.so 10 | noload => res_stasis_mailbox.so 11 | noload => res_ari_mailboxes.so 12 | 13 | ; Channel modules currently not needed 14 | 15 | ; Application modules currently not needed 16 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /config/confbridge.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | 3 | [default_bridge] 4 | type=bridge 5 | internal_sample_rate=auto 6 | video_mode=sfu 7 | ; video_mode=follow_talker; 8 | max_members=15 ; Max for SFU is 15. Can be more for follow_talker 9 | mixing_interval=20 10 | enable_events=yes 11 | 12 | [default_user] 13 | type=user 14 | send_events=yes 15 | echo_events=yes 16 | music_on_hold_when_empty=yes 17 | music_on_hold_class=default 18 | dsp_drop_silence=yes 19 | talk_detection_events=yes 20 | jitterbuffer=yes 21 | 22 | [sample_user_menu] 23 | type=menu -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Docker/config/confbridge.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | 3 | [default_bridge] 4 | type=bridge 5 | internal_sample_rate=auto 6 | video_mode=sfu 7 | ; video_mode=follow_talker; 8 | max_members=15 ; Max for SFU is 15. Can be more for follow_talker 9 | mixing_interval=20 10 | enable_events=yes 11 | 12 | [default_user] 13 | type=user 14 | send_events=yes 15 | echo_events=yes 16 | music_on_hold_when_empty=yes 17 | music_on_hold_class=default 18 | dsp_drop_silence=yes 19 | talk_detection_events=yes 20 | jitterbuffer=yes 21 | 22 | [sample_user_menu] 23 | type=menu -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /lib/README.md: -------------------------------------------------------------------------------- 1 | # Library Files 2 | 3 | The Browser Phone uses the JavaScripts and or Styles found in this folder. These projects are mostly found on gitHub, and are open source. They have their own license (mostly MIT), please consult with these projects directly if you have any questions. The index.html file in this project will use the CDN hosted versions, so you only need to download these files if you want to create a working off-line version. 4 | 5 | **Please remember that if you host your own files, you will need to configure CORS permissions, as the origionator of the request may come from a script file.** -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /config/voicemail.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | format=wav 3 | 4 | attach=yes 5 | maxmsg=100 6 | maxsecs=180 7 | minsecs=3 8 | ; maxgreet=60 9 | ; skipms=3000 10 | maxsilence=10 11 | silencethreshold=128 12 | maxlogins=3 13 | fromstring = Voice Message 14 | emailsubject = New voice message ${VM_MSGNUM} in mailbox ${VM_MAILBOX} 15 | emailbody = Dear ${VM_NAME}:\n\nYou have a voice mail message.\nDuration: ${VM_DUR}.\nMessage Num: ${VM_MSGNUM}.\nMailbox: ${VM_MAILBOX}.\nFrom: ${VM_CALLERID}\nDate: ${VM_DATE}\n 16 | emaildateformat = %A, %B %d, %Y at %r 17 | 18 | [zonemessages] 19 | eastern = America/New_York|'vm-received' Q 'digits/at' IMp 20 | 21 | [default] 22 | 23 | -------------------------------------------------------------------------------- /Docker/config/voicemail.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | format=wav 3 | 4 | attach=yes 5 | maxmsg=100 6 | maxsecs=180 7 | ; minsecs=3 8 | ; maxgreet=60 9 | ; skipms=3000 10 | maxsilence=10 11 | silencethreshold=128 12 | maxlogins=3 13 | fromstring = Voice Message 14 | emailsubject = New voice message ${VM_MSGNUM} in mailbox ${VM_MAILBOX} 15 | emailbody = Dear ${VM_NAME}:\n\nYou have a voice mail message.\nDuration: ${VM_DUR}.\nMessage Num: ${VM_MSGNUM}.\nMailbox: ${VM_MAILBOX}.\nFrom: ${VM_CALLERID}\nDate: ${VM_DATE}\n 16 | emaildateformat = %A, %B %d, %Y at %r 17 | 18 | [zonemessages] 19 | eastern = America/New_York|'vm-received' Q 'digits/at' IMp 20 | 21 | [default] 22 | 23 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /config/indications.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | country=gb ; default location 3 | 4 | [zgb] 5 | description = United Kingdom 6 | ringcadence = 400,200,400,2000 7 | ; dial/ring/callwaiting for the Siemens switches: 8 | dial = 400*33 9 | ring = 400*33/400,0/200,400*33/400,0/2000 10 | callwaiting = 400*33/250,0/250,400*33/250,0/250,400*33/250,0/250,400*33/250,0/250 11 | ; dial/ring/callwaiting for the Alcatel switches: 12 | ; dial = 383+417 13 | ; ring = 383+417/400,0/200,383+417/400,0/2000 14 | ; callwaiting = 383+417/250,0/250,383+417/250,0/250,383+417/250,0/250,383+417/250,0/250 15 | congestion = 400/250,0/250 16 | busy = 400/500,0/500 17 | dialrecall = 350+440 18 | ; XXX Not sure about the RECORDTONE 19 | record = 1400/500,0/10000 20 | info = 950/330,1400/330,1800/330,0/330 21 | stutter = !400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,400*33 22 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Docker/config/indications.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | country=gb ; default location 3 | 4 | [zgb] 5 | description = United Kingdom 6 | ringcadence = 400,200,400,2000 7 | ; dial/ring/callwaiting for the Siemens switches: 8 | dial = 400*33 9 | ring = 400*33/400,0/200,400*33/400,0/2000 10 | callwaiting = 400*33/250,0/250,400*33/250,0/250,400*33/250,0/250,400*33/250,0/250 11 | ; dial/ring/callwaiting for the Alcatel switches: 12 | ; dial = 383+417 13 | ; ring = 383+417/400,0/200,383+417/400,0/2000 14 | ; callwaiting = 383+417/250,0/250,383+417/250,0/250,383+417/250,0/250,383+417/250,0/250 15 | congestion = 400/250,0/250 16 | busy = 400/500,0/500 17 | dialrecall = 350+440 18 | ; XXX Not sure about the RECORDTONE 19 | record = 1400/500,0/10000 20 | info = 950/330,1400/330,1800/330,0/330 21 | stutter = !400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,400*33 22 | -------------------------------------------------------------------------------- /Phone/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Browser Phone", 3 | "short_name": "Browser Phone", 4 | "id": "com.innovateasterisk.browserphone", 5 | "start_url": "index.html", 6 | "display": "standalone", 7 | "background_color": "#fff", 8 | "theme_color": "#f6f6f6", 9 | "description": "Browser Phone is a fully featured browser based WebRTC SIP phone for Asterisk. Designed to work with Asterisk PBX.", 10 | "screenshots": [ 11 | { 12 | "src": "icons/screenshot1.webp", 13 | "type": "image/webp", 14 | "sizes": "2542x1860", 15 | "label": "Innovate Asterisk" 16 | }, 17 | { 18 | "src": "icons/screenshot2.webp", 19 | "type": "image/webp", 20 | "sizes": "2542x1860", 21 | "label": "Innovate Asterisk" 22 | } 23 | ], 24 | "icons": [ 25 | { 26 | "src": "icons/maskable_192.png", 27 | "sizes": "192x192", 28 | "type": "image/png", 29 | "purpose": "maskable" 30 | }, 31 | { 32 | "src": "icons/any_192.png", 33 | "sizes": "192x192", 34 | "type": "image/png" 35 | }, 36 | { 37 | "src": "icons/512.png", 38 | "sizes": "512x512", 39 | "type": "image/png" 40 | } 41 | ] 42 | } -------------------------------------------------------------------------------- /config/sip.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | 3 | udpbindaddr=0.0.0.0:5060 4 | 5 | context=from-outside 6 | useragent=Raspberry Pi BPX 7 | realm=raspberrypi.local 8 | srvlookup=no 9 | mohsuggest=default 10 | parkinglot=default 11 | allowguest=no 12 | alwaysauthreject=yes 13 | videosupport=no 14 | maxcallbitrate=1024 15 | ignoreregexpire=no 16 | 17 | allowsubscribe=yes 18 | notifyhold=yes 19 | notifyringing=yes 20 | callcounter=yes 21 | 22 | progressinband=yes ; yes|no|never 23 | 24 | tos_sip=af42 25 | tos_audio=ef 26 | cos_sip=3 27 | cos_audio=5 28 | 29 | rtptimeout=120 30 | rtpkeepalive=60 31 | 32 | jbenable=yes 33 | jbforce=no 34 | jbmaxsize=200 35 | jbresyncthreshold=1000 36 | jbimpl=fixed 37 | jblog=no 38 | 39 | tcpenable=no 40 | tlsenable=no 41 | websocket_enabled=no 42 | encryption=no 43 | 44 | deny=0.0.0.0/0.0.0.0 45 | permit=10.0.0.0/255.0.0.0 46 | permit=172.16.0.0/255.240.0.0 47 | permit=192.168.0.0/255.255.0.0 48 | 49 | ; == Templates 50 | 51 | [basic](!) 52 | type=friend 53 | qualify=yes 54 | context=from-extensions 55 | subscribecontext=subscriptions 56 | host=dynamic 57 | directmedia=no 58 | nat=force_rport,comedia 59 | dtmfmode=rfc2833 60 | disallow=all 61 | videosupport=yes 62 | 63 | [phones](!) 64 | transport=udp 65 | allow=ulaw,alaw,g722,gsm,vp9,vp8,h264 66 | 67 | [webrtc](!) 68 | transport=wss 69 | allow=opus,ulaw,vp9,vp8,h264 70 | encryption=yes 71 | avpf=yes 72 | force_avp=yes 73 | icesupport=yes 74 | rtcp_mux=yes 75 | dtlsenable=yes 76 | dtlsverify=fingerprint 77 | dtlscertfile=/home/pi/certs/raspberrypi.pem 78 | dtlscafile=/home/pi/ca/InnovateAsterisk-Root-CA.crt 79 | dtlssetup=actpass 80 | 81 | ; == Users -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "addressbook", 4 | "appversion", 5 | "autoanswer", 6 | "Billsec", 7 | "browserphone", 8 | "calldirection", 9 | "callrecording", 10 | "callstart", 11 | "cellpadding", 12 | "cellspacing", 13 | "chatstate", 14 | "childsession", 15 | "Confbridge", 16 | "confcalls", 17 | "creationtime", 18 | "croppie", 19 | "datetime", 20 | "dereglink", 21 | "devstate", 22 | "DTMF", 23 | "Exten", 24 | "HQVGA", 25 | "hrline", 26 | "httpstatus", 27 | "Initialise", 28 | "innovateasterisk", 29 | "Intrtval", 30 | "ismute", 31 | "kbits", 32 | "Keyla", 33 | "langtag", 34 | "maxlength", 35 | "Messager", 36 | "msgtext", 37 | "myphone", 38 | "Notifyer", 39 | "ondataavailable", 40 | "pidf", 41 | "playsinline", 42 | "PQRS", 43 | "Previewhtml", 44 | "privateuse", 45 | "QVGA", 46 | "raspberrypi", 47 | "readmore", 48 | "reglink", 49 | "sharevideo", 50 | "SIPJS", 51 | "sipjsversion", 52 | "startmuted", 53 | "tabindex", 54 | "terminateby", 55 | "textbox", 56 | "transfered", 57 | "Unhold", 58 | "Unmute", 59 | "Unmuting", 60 | "Vcard", 61 | "Voceimail", 62 | "voicemessages", 63 | "Voicemial", 64 | "webp", 65 | "webrtc", 66 | "withvideo", 67 | "WXYZ", 68 | "XMMP" 69 | ] 70 | } -------------------------------------------------------------------------------- /Docker/config/ari.conf: -------------------------------------------------------------------------------- 1 | ; Asteriks REST API 2 | 3 | [general] 4 | enabled = no ; When set to no, ARI support is disabled. 5 | ;pretty = no ; When set to yes, responses from ARI are 6 | ; ; formatted to be human readable. 7 | ;allowed_origins = ; Comma separated list of allowed origins, for 8 | ; ; Cross-Origin Resource Sharing. May be set to * to 9 | ; ; allow all origins. 10 | ;auth_realm = ; Realm to use for authentication. Defaults to Asterisk 11 | ; ; REST Interface. 12 | ; 13 | ; Default write timeout to set on websockets. This value may need to be adjusted 14 | ; for connections where Asterisk must write a substantial amount of data and the 15 | ; receiving clients are slow to process the received information. Value is in 16 | ; milliseconds; default is 100 ms. 17 | ;websocket_write_timeout = 100 18 | ; 19 | ; Display certain channel variables every time a channel-oriented 20 | ; event is emitted: 21 | ; 22 | ; Note that this does incur a performance penalty and should be avoided if possible. 23 | ; 24 | ;channelvars = var1,var2,var3 25 | 26 | ;[username] 27 | ;type = user ; Specifies user configuration 28 | ;read_only = no ; When set to yes, user is only authorized for 29 | ; ; read-only requests. 30 | ; 31 | ;password = ; Crypted or plaintext password (see password_format). 32 | ; 33 | ; password_format may be set to plain (the default) or crypt. When set to crypt, 34 | ; crypt(3) is used to validate the password. A crypted password can be generated 35 | ; using mkpasswd -m sha-512. 36 | ; 37 | ; When set to plain, the password is in plaintext. 38 | ; 39 | ;password_format = plain -------------------------------------------------------------------------------- /Docker/config/extensions.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | static=yes 3 | writeprotect=yes 4 | priorityjumping=no 5 | autofallthrough=no 6 | 7 | [globals] 8 | ATTENDED_TRANSFER_COMPLETE_SOUND=beep 9 | 10 | [textmessages] 11 | exten => 100,1,Gosub(send-text,s,1,(User1)) 12 | exten => 200,1,Gosub(send-text,s,1,(User2)) 13 | exten => 300,1,Gosub(send-text,s,1,(User3)) 14 | 15 | [subscriptions] 16 | exten => 100,hint,PJSIP/User1 17 | exten => 200,hint,PJSIP/User2 18 | exten => 300,hint,PJSIP/User3 19 | 20 | [from-extensions] 21 | ; Feature Codes: 22 | exten => *65,1,Gosub(moh,s,1) 23 | ; Extensions 24 | exten => 100,1,Gosub(dial-extension,s,1,(User1)) 25 | exten => 200,1,Gosub(dial-extension,s,1,(User2)) 26 | exten => 300,1,Gosub(dial-extension,s,1,(User3)) 27 | ; Anything else, Hangup 28 | exten => _[+*0-9].,1,NoOp(You called: ${EXTEN}) 29 | exten => _[+*0-9].,n,Hangup(1) 30 | 31 | exten => e,1,Hangup() 32 | 33 | [moh] 34 | exten => s,1,NoOp(Music On Hold) 35 | exten => s,n,Ringing() 36 | exten => s,n,Wait(2) 37 | exten => s,n,Answer() 38 | exten => s,n,Wait(1) 39 | exten => s,n,MusicOnHold() 40 | 41 | [dial-extension] 42 | exten => s,1,NoOp(Calling: ${ARG1}) 43 | exten => s,n,Set(JITTERBUFFER(adaptive)=default) 44 | exten => s,n,Dial(PJSIP/${ARG1},30) 45 | exten => s,n,Hangup() 46 | 47 | exten => e,1,Hangup() 48 | 49 | [send-text] 50 | exten => s,1,NoOp(Sending Text To: ${ARG1}) 51 | exten => s,n,Set(PEER=${CUT(CUT(CUT(MESSAGE(from),@,1),<,2),:,2)}) 52 | exten => s,n,Set(FROM=${SHELL(asterisk -rx 'pjsip show endpoint ${PEER}' | grep 'callerid ' | cut -d':' -f2- | sed 's/^\ *//' | tr -d '\n')}) 53 | exten => s,n,Set(CALLERID_NUM=${CUT(CUT(FROM,>,1),<,2)}) 54 | exten => s,n,Set(FROM_SIP=${STRREPLACE(MESSAGE(from), s,n,MessageSend(pjsip:${ARG1},${FROM_SIP}) 56 | exten => s,n,Hangup() -------------------------------------------------------------------------------- /lib/fonts/font_awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /config/pjsip.conf: -------------------------------------------------------------------------------- 1 | [global] 2 | max_forwards=70 3 | user_agent=Raspberry Pi BPX 4 | default_realm=raspberrypi.local 5 | keep_alive_interval=300 6 | 7 | ; == Transports 8 | 9 | [udp_transport] 10 | type=transport 11 | protocol=udp 12 | bind=0.0.0.0 13 | tos=af42 14 | cos=3 15 | 16 | [wss_transport] 17 | type=transport 18 | protocol=wss 19 | bind=0.0.0.0 20 | 21 | [tcp_transport] 22 | type=transport 23 | protocol=tcp 24 | bind=0.0.0.0 25 | 26 | [tls_transport] 27 | type=transport 28 | protocol=tls 29 | bind=0.0.0.0 30 | cert_file=/home/pi/certs/raspberrypi.crt 31 | priv_key_file=/home/pi/certs/raspberrypi.key 32 | cipher=ADH-AES256-SHA,ADH-AES128-SHA 33 | method=tlsv1 34 | 35 | ; == ACL 36 | 37 | [acl] ; Opperates on all pjsip traffic (can also be in acl.conf) 38 | type=acl 39 | deny=0.0.0.0/0.0.0.0 40 | permit=10.0.0.0/255.0.0.0 41 | permit=172.16.0.0/255.240.0.0 42 | permit=192.168.0.0/255.255.0.0 43 | 44 | ; == Templates 45 | 46 | [single_aor](!) 47 | max_contacts=1 48 | qualify_frequency=120 49 | remove_existing=yes 50 | 51 | [userpass_auth](!) 52 | auth_type=userpass 53 | 54 | [basic_endpoint](!) 55 | moh_suggest=default 56 | context=from-extensions 57 | inband_progress=no 58 | rtp_timeout=120 59 | message_context=textmessages 60 | allow_subscribe=yes 61 | subscribe_context=subscriptions 62 | direct_media=no 63 | dtmf_mode=rfc4733 64 | device_state_busy_at=1 65 | disallow=all 66 | 67 | [phone_endpoint](!) 68 | allow=ulaw,alaw,g722,gsm,vp9,vp8,h264 69 | 70 | [webrtc_endpoint](!) 71 | transport=wss_transport 72 | allow=opus,ulaw,vp9,vp8,h264 73 | ; webrtc=yes 74 | use_avpf=yes 75 | media_encryption=dtls 76 | dtls_verify=fingerprint 77 | dtls_setup=actpass 78 | ice_support=yes 79 | media_use_received_transport=yes 80 | rtcp_mux=yes 81 | dtls_cert_file=/home/pi/certs/raspberrypi.crt 82 | dtls_private_key=/home/pi/certs/raspberrypi.key 83 | dtls_ca_file=/home/pi/ca/InnovateAsterisk-Root-CA.crt 84 | 85 | ; == Users 86 | 87 | -------------------------------------------------------------------------------- /lib/fonts/font_awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Phone/responsive.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Browser Phone (Responsive) 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 39 | 40 | 41 | 42 |
43 |
This is a sample of how the phone can be loaded into you own web site.
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /Docker/config/pjsip.conf: -------------------------------------------------------------------------------- 1 | [global] 2 | max_forwards=70 3 | keep_alive_interval=300 4 | 5 | ; == Transports 6 | 7 | [udp_transport] 8 | type=transport 9 | protocol=udp 10 | bind=0.0.0.0:5060 11 | tos=af42 12 | cos=3 13 | 14 | [wss_transport] 15 | type=transport 16 | protocol=wss 17 | bind=0.0.0.0 18 | 19 | ; == ACL 20 | 21 | [acl] ; Opperates on all pjsip traffic (can also be in acl.conf) 22 | type=acl 23 | deny=0.0.0.0/0.0.0.0 24 | permit=10.0.0.0/255.0.0.0 25 | permit=172.16.0.0/255.240.0.0 26 | permit=192.168.0.0/255.255.0.0 27 | 28 | ; == Templates 29 | 30 | [single_aor](!) 31 | max_contacts=1 32 | qualify_frequency=120 33 | remove_existing=yes 34 | 35 | [userpass_auth](!) 36 | auth_type=userpass 37 | 38 | [basic_endpoint](!) 39 | moh_suggest=default 40 | context=from-extensions 41 | inband_progress=no 42 | rtp_timeout=120 43 | message_context=textmessages 44 | allow_subscribe=yes 45 | subscribe_context=subscriptions 46 | direct_media=no 47 | dtmf_mode=rfc4733 48 | device_state_busy_at=1 49 | disallow=all 50 | 51 | [phone_endpoint](!) 52 | allow=ulaw,alaw,g722,gsm,vp9,vp8,h264 53 | 54 | [webrtc_endpoint](!) 55 | transport=wss_transport 56 | allow=opus,ulaw,vp9,vp8,h264 57 | webrtc=yes 58 | 59 | ; == Users 60 | 61 | [User1](basic_endpoint,webrtc_endpoint) 62 | type=endpoint 63 | callerid="User One" <100> 64 | auth=User1 65 | aors=User1 66 | [User1](single_aor) 67 | type=aor 68 | mailboxes=User1@default 69 | [User1](userpass_auth) 70 | type=auth 71 | username=User1 72 | password=1234 73 | 74 | [User2](basic_endpoint,webrtc_endpoint) 75 | type=endpoint 76 | callerid="User Two" <200> 77 | auth=User2 78 | aors=User2 79 | [User2](single_aor) 80 | type=aor 81 | [User2](userpass_auth) 82 | type=auth 83 | username=User2 84 | password=1234 85 | 86 | [User3](basic_endpoint,phone_endpoint) 87 | type=endpoint 88 | callerid="User Three" <300> 89 | auth=User3 90 | aors=User3 91 | [User3](single_aor) 92 | type=aor 93 | [User3](userpass_auth) 94 | type=auth 95 | username=User3 96 | password=1234 -------------------------------------------------------------------------------- /lib/fonts/font_roboto/roboto.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: local('Roboto'), local('Roboto-Regular'), url(ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Roboto'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: local('Roboto'), local('Roboto-Regular'), url(mErvLBYg_cXG3rLvUsKT_fesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); 15 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* greek-ext */ 18 | @font-face { 19 | font-family: 'Roboto'; 20 | font-style: normal; 21 | font-weight: 400; 22 | src: local('Roboto'), local('Roboto-Regular'), url(-2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); 23 | unicode-range: U+1F00-1FFF; 24 | } 25 | /* greek */ 26 | @font-face { 27 | font-family: 'Roboto'; 28 | font-style: normal; 29 | font-weight: 400; 30 | src: local('Roboto'), local('Roboto-Regular'), url(u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); 31 | unicode-range: U+0370-03FF; 32 | } 33 | /* vietnamese */ 34 | @font-face { 35 | font-family: 'Roboto'; 36 | font-style: normal; 37 | font-weight: 400; 38 | src: local('Roboto'), local('Roboto-Regular'), url(NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); 39 | unicode-range: U+0102-0103, U+1EA0-1EF1, U+20AB; 40 | } 41 | /* latin-ext */ 42 | @font-face { 43 | font-family: 'Roboto'; 44 | font-style: normal; 45 | font-weight: 400; 46 | src: local('Roboto'), local('Roboto-Regular'), url(Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2) format('woff2'); 47 | unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; 48 | } 49 | /* latin */ 50 | @font-face { 51 | font-family: 'Roboto'; 52 | font-style: normal; 53 | font-weight: 400; 54 | src: local('Roboto'), local('Roboto-Regular'), url(CWB0XYA8bzo0kSThX0UTuA.woff2) format('woff2'); 55 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 56 | } 57 | 58 | /* Medium 500 */ 59 | /* latin */ 60 | @font-face { 61 | font-family: 'Roboto'; 62 | font-style: normal; 63 | font-weight: 500; 64 | src: local('Roboto Medium'), local('Roboto-Medium'), url(RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); 65 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 66 | } 67 | 68 | /* Bold 700 */ 69 | /* latin */ 70 | @font-face { 71 | font-family: 'Roboto'; 72 | font-style: normal; 73 | font-weight: 700; 74 | src: local('Roboto Bold'), local('Roboto-Bold'), url(d-6IYplOFocCacKzxwXSOFtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); 75 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 76 | } -------------------------------------------------------------------------------- /Docker/config/acl.conf: -------------------------------------------------------------------------------- 1 | ; 2 | ; Named Access Control Lists (ACLs) 3 | ; 4 | ; A convenient way to share acl definitions 5 | ; 6 | ; This configuration file is read on startup 7 | ; 8 | ; CLI Commands 9 | ; ----------------------------------------------------------- 10 | ; acl show Show all named ACLs configured 11 | ; acl show Show contents of a particular named ACL 12 | ; reload acl Reload configuration file 13 | ; 14 | ; Any configuration that uses ACLs which has been made to be able to use named 15 | ; ACLs will specify a named ACL with the 'acl' option in its configuration in 16 | ; a similar fashion to the usual 'permit' and 'deny' options. Example: 17 | ; acl=my_named_acl 18 | ; 19 | ; Multiple named ACLs can be applied by either comma separating the arguments or 20 | ; just by adding additional ACL lines. Example: 21 | ; acl=my_named_acl 22 | ; acl=my_named_acl2 23 | ; 24 | ; or 25 | ; 26 | ; acl=my_named_acl,my_named_acl2 27 | ; 28 | ; ACLs specified by name are evaluated independently from the ACL specified via 29 | ; permit/deny. In order for an address to pass a given ACL, it must pass both 30 | ; the ACL specified by permit/deny for a given item as well as any named ACLs 31 | ; that were specified. 32 | ; 33 | ;[example_named_acl1] 34 | ;deny=0.0.0.0/0.0.0.0 35 | ;permit=209.16.236.0 36 | ;permit=209.16.236.1 37 | ; 38 | ;[example_named_acl2] 39 | ;permit=0.0.0.0/0.0.0.0 40 | ;deny=10.24.20.171 41 | ;deny=10.24.20.103 42 | ;deny=209.16.236.1 43 | ; 44 | ; example_named_acl1 above shows an example of whitelisting. When whitelisting, the 45 | ; named ACLs should follow a deny that blocks everything (like deny=0.0.0.0/0.0.0.0) 46 | ; The following example explains how combining the ACLs works: 47 | ; 48 | ; [example_item_with_acl] 49 | ; acl=example_named_acl1 50 | ; acl=example_named_acl2 51 | ; 52 | ; Suppose 209.16.236.0 tries to communicate and the ACL for that example is applied to it... 53 | ; First, example_named_acl1 is evaluated. The address is allowed by that ACL. 54 | ; Next, example_named_acl2 is evaluated. The address isn't blocked by example_named_acl2 55 | ; either, so it passes. 56 | ; 57 | ; Suppose instead 209.16.236.1 tries to communicate and the same ACL is applied. 58 | ; First, example_named_acl1 is evaluated and the address is allowed. 59 | ; However, it is blocked by example_named_acl2, so the address is blocked from the combined 60 | ; ACL. 61 | ; 62 | ; Similarly, the permits/denies in specific configurations that make up an ACL definition 63 | ; are also treated as a separate ACL for evaluation. So if we change the example above to: 64 | ; 65 | ; [example_item_with_acl] 66 | ; acl=example_named_acl1 67 | ; acl=example_named_acl2 68 | ; deny=209.16.236.0 69 | ; 70 | ; Then 209.16.236.0 will be rejected by the non-named component of the combined ACL even 71 | ; though it passes the two named components. 72 | ; 73 | ; 74 | ; Named ACLs can use ipv6 addresses just like normal ACLs. 75 | ;[ipv6_example_1] 76 | ;deny = ::/0 77 | ;permit = ::1/128 78 | ; 79 | ;[ipv6_example_2] 80 | ;permit = fe80::21d:bad:fad:2323 -------------------------------------------------------------------------------- /Docker/config/pjproject.conf: -------------------------------------------------------------------------------- 1 | ; Common pjproject options 2 | ; 3 | 4 | ;[startup] 5 | ; NOTES: The name of this section in the pjproject.conf configuration file must 6 | ; remain startup or the configuration will not be applied. 7 | ; 8 | ;cache_pools = yes ; Cache pjproject memory pools for performance 9 | ; Disable this option to help track down pool content 10 | ; mismanagement when using valgrind or MALLOC_DEBUG. 11 | ; The cache gets in the way of determining if the 12 | ; pool contents are used after being freed and who 13 | ; freed it. 14 | ; Default yes 15 | ;log_level=default ; Initial maximum pjproject logging level to log 16 | ; Valid values are: 0-6, and default 17 | ; 18 | ; Note: This option is needed very early in the startup 19 | ; process so it can only be read from config files because 20 | ; the modules for other methods have not been loaded yet. 21 | ;type= ; Must be of type startup (default: "") 22 | 23 | ;========================LOG_MAPPINGS SECTION OPTIONS=============================== 24 | ;[log_mappings] 25 | ; SYNOPSIS: Provides pjproject to Asterisk log level mappings. 26 | ; NOTES: The name of this section in the pjproject.conf configuration file must 27 | ; remain log_mappings or the configuration will not be applied. 28 | ; The defaults mentioned below only apply if this file or the 'log_mappings' 29 | ; object can't be found. If the object is found, there are no defaults. If 30 | ; you don't specify an entry, nothing will be logged for that level. 31 | ; 32 | ; These logging level meanings are typically used by pjproject: 33 | ; - 0: fatal error 34 | ; - 1: error 35 | ; - 2: warning 36 | ; - 3: info 37 | ; - 4: debug 38 | ; - 5: trace 39 | ; - 6: more detailed trace 40 | ; 41 | ; Note: setting the pjproject debug level to 4 (debug) or above may result in 42 | ; raw packets being logged. This should only be enabled during active debugging 43 | ; to avoid a potential security issue due to logging injection. 44 | ; 45 | ;asterisk_error = ; A comma separated list of pjproject log levels to map to 46 | ; Asterisk errors. 47 | ; (default: "0,1") 48 | ;asterisk_warning = ; A comma separated list of pjproject log levels to map to 49 | ; Asterisk warnings. 50 | ; (default: "2") 51 | ;asterisk_notice = ; A comma separated list of pjproject log levels to map to 52 | ; Asterisk notices. 53 | ; (default: "") 54 | ;asterisk_verbose = ; A comma separated list of pjproject log levels to map to 55 | ; Asterisk verbose. 56 | ; (default: "") 57 | ;asterisk_debug = ; A comma separated list of pjproject log levels to map to 58 | ; Asterisk debug 59 | ; (default: "3,4") 60 | ;asterisk_trace = ; A comma separated list of pjproject log levels to map to 61 | ; Asterisk trace 62 | ; (default: "5,6") 63 | ;type= ; Must be of type log_mappings (default: "") -------------------------------------------------------------------------------- /lib/jquery/jquery.md5-min.js: -------------------------------------------------------------------------------- 1 | (function(z){function n(a,g){var b=(a&65535)+(g&65535);return(a>>16)+(g>>16)+(b>>16)<<16|b&65535}function k(a,g,b,p,k,h){a=n(n(g,a),n(p,h));return n(a<>>32-k,b)}function h(a,g,b,p,h,l,m){return k(g&b|~g&p,a,g,h,l,m)}function l(a,g,b,p,h,l,m){return k(g&p|b&~p,a,g,h,l,m)}function m(a,g,b,h,l,m,n){return k(b^(g|~h),a,g,l,m,n)}function q(a,g){a[g>>5]|=128<>>9<<4)+14]=g;var b,p,t,u,q,c=1732584193,d=-271733879,e=-1732584194,f=271733878;for(b=0;b>5]>>>g%32&255);return b}function r(a){var g,b=[];b[(a.length>>2)-1]=void 0;for(g=0;g>5]|=(a.charCodeAt(g/8)&255)<b;b+=1)k[b]=h[b]^909522486,l[b]=h[b]^1549556828;b=q(k.concat(r(g)),512+8*g.length);return v(q(l.concat(b),640))}function y(a){var g="",b,h;for(h=0;h>>4&15)+"0123456789abcdef".charAt(b&15);return g}z.md5=function(a,g,b){g?b?a=x(unescape(encodeURIComponent(g)),unescape(encodeURIComponent(a))):(a=x(unescape(encodeURIComponent(g)), 8 | unescape(encodeURIComponent(a))),a=y(a)):a=b?w(unescape(encodeURIComponent(a))):y(w(unescape(encodeURIComponent(a))));return a}})("function"===typeof jQuery?jQuery:this); -------------------------------------------------------------------------------- /lib/jquery/jquery.base64-0.0.2.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jquery.base64.js 0.1 - https://github.com/yckart/jquery.base64.js 3 | * Makes Base64 en & -decoding simpler as it is. 4 | * 5 | * Based upon: https://gist.github.com/Yaffle/1284012 6 | * 7 | * Copyright (c) 2012 Yannick Albert (http://yckart.com) 8 | * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php). 9 | * 2013/02/10 10 | **/ 11 | ;(function($) { 12 | 13 | var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 14 | a256 = '', 15 | r64 = [256], 16 | r256 = [256], 17 | i = 0; 18 | 19 | var UTF8 = { 20 | 21 | /** 22 | * Encode multi-byte Unicode string into utf-8 multiple single-byte characters 23 | * (BMP / basic multilingual plane only) 24 | * 25 | * Chars in range U+0080 - U+07FF are encoded in 2 chars, U+0800 - U+FFFF in 3 chars 26 | * 27 | * @param {String} strUni Unicode string to be encoded as UTF-8 28 | * @returns {String} encoded string 29 | */ 30 | encode: function(strUni) { 31 | // use regular expressions & String.replace callback function for better efficiency 32 | // than procedural approaches 33 | var strUtf = strUni.replace(/[\u0080-\u07ff]/g, // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz 34 | function(c) { 35 | var cc = c.charCodeAt(0); 36 | return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f); 37 | }) 38 | .replace(/[\u0800-\uffff]/g, // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz 39 | function(c) { 40 | var cc = c.charCodeAt(0); 41 | return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f); 42 | }); 43 | return strUtf; 44 | }, 45 | 46 | /** 47 | * Decode utf-8 encoded string back into multi-byte Unicode characters 48 | * 49 | * @param {String} strUtf UTF-8 string to be decoded back to Unicode 50 | * @returns {String} decoded string 51 | */ 52 | decode: function(strUtf) { 53 | // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char! 54 | var strUni = strUtf.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, // 3-byte chars 55 | function(c) { // (note parentheses for precence) 56 | var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f); 57 | return String.fromCharCode(cc); 58 | }) 59 | .replace(/[\u00c0-\u00df][\u0080-\u00bf]/g, // 2-byte chars 60 | function(c) { // (note parentheses for precence) 61 | var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f; 62 | return String.fromCharCode(cc); 63 | }); 64 | return strUni; 65 | } 66 | }; 67 | 68 | while(i < 256) { 69 | var c = String.fromCharCode(i); 70 | a256 += c; 71 | r256[i] = i; 72 | r64[i] = b64.indexOf(c); 73 | ++i; 74 | } 75 | 76 | function code(s, discard, alpha, beta, w1, w2) { 77 | s = String(s); 78 | var buffer = 0, 79 | i = 0, 80 | length = s.length, 81 | result = '', 82 | bitsInBuffer = 0; 83 | 84 | while(i < length) { 85 | var c = s.charCodeAt(i); 86 | c = c < 256 ? alpha[c] : -1; 87 | 88 | buffer = (buffer << w1) + c; 89 | bitsInBuffer += w1; 90 | 91 | while(bitsInBuffer >= w2) { 92 | bitsInBuffer -= w2; 93 | var tmp = buffer >> bitsInBuffer; 94 | result += beta.charAt(tmp); 95 | buffer ^= tmp << bitsInBuffer; 96 | } 97 | ++i; 98 | } 99 | if(!discard && bitsInBuffer > 0) result += beta.charAt(buffer << (w2 - bitsInBuffer)); 100 | return result; 101 | } 102 | 103 | var Plugin = $.base64 = function(dir, input, encode) { 104 | return input ? Plugin[dir](input, encode) : dir ? null : this; 105 | }; 106 | 107 | Plugin.btoa = Plugin.encode = function(plain, utf8encode) { 108 | plain = Plugin.raw === false || Plugin.utf8encode || utf8encode ? UTF8.encode(plain) : plain; 109 | plain = code(plain, false, r256, b64, 8, 6); 110 | return plain + '===='.slice((plain.length % 4) || 4); 111 | }; 112 | 113 | Plugin.atob = Plugin.decode = function(coded, utf8decode) { 114 | coded = String(coded).split('='); 115 | var i = coded.length; 116 | do {--i; 117 | coded[i] = code(coded[i], true, r64, a256, 6, 8); 118 | } while (i > 0); 119 | coded = coded.join(''); 120 | return Plugin.raw === false || Plugin.utf8decode || utf8decode ? UTF8.decode(coded) : coded; 121 | }; 122 | }(jQuery)); -------------------------------------------------------------------------------- /Phone/sw.js: -------------------------------------------------------------------------------- 1 | const cacheID = "v0"; 2 | const CacheItems = [ 3 | "index.html", // Special page: Loads from network 4 | "offline.html", // Special page: Save to cache, but return only when offline 5 | 6 | "/favicon.ico", 7 | 8 | "avatars/default.0.webp", 9 | "avatars/default.1.webp", 10 | "avatars/default.2.webp", 11 | "avatars/default.3.webp", 12 | "avatars/default.4.webp", 13 | "avatars/default.5.webp", 14 | "avatars/default.6.webp", 15 | "avatars/default.7.webp", 16 | "avatars/default.8.webp", 17 | 18 | "wallpaper.dark.webp", 19 | "wallpaper.light.webp", 20 | 21 | "media/Alert.mp3", 22 | "media/Ringtone_1.mp3", 23 | "media/speech_orig.mp3", 24 | "media/Tone_Busy-UK.mp3", 25 | "media/Tone_Busy-US.mp3", 26 | "media/Tone_CallWaiting.mp3", 27 | "media/Tone_Congestion-UK.mp3", 28 | "media/Tone_Congestion-US.mp3", 29 | "media/Tone_EarlyMedia-Australia.mp3", 30 | "media/Tone_EarlyMedia-European.mp3", 31 | "media/Tone_EarlyMedia-Japan.mp3", 32 | "media/Tone_EarlyMedia-UK.mp3", 33 | "media/Tone_EarlyMedia-US.mp3", 34 | 35 | "https://dtd6jl0d42sve.cloudfront.net/lib/jquery/jquery-3.6.1.min.js", 36 | "https://dtd6jl0d42sve.cloudfront.net/lib/jquery/jquery-ui-1.13.2.min.js", 37 | "https://dtd6jl0d42sve.cloudfront.net/lib/jquery/jquery.md5-min.js", 38 | "https://dtd6jl0d42sve.cloudfront.net/lib/Chart/Chart.bundle-2.7.2.min.js", 39 | "https://dtd6jl0d42sve.cloudfront.net/lib/SipJS/sip-0.20.0.min.js", 40 | "https://dtd6jl0d42sve.cloudfront.net/lib/FabricJS/fabric-2.4.6.min.js", 41 | "https://dtd6jl0d42sve.cloudfront.net/lib/Moment/moment-with-locales-2.24.0.min.js", 42 | "https://dtd6jl0d42sve.cloudfront.net/lib/Croppie/Croppie-2.6.4/croppie.min.js", 43 | "https://dtd6jl0d42sve.cloudfront.net/lib/XMPP/strophe-1.4.1.umd.min.js", 44 | 45 | "https://dtd6jl0d42sve.cloudfront.net/lib/Normalize/normalize-v8.0.1.css", 46 | "https://dtd6jl0d42sve.cloudfront.net/lib/fonts/font_roboto/roboto.css", 47 | "https://dtd6jl0d42sve.cloudfront.net/lib/fonts/font_awesome/css/font-awesome.min.css", 48 | "https://dtd6jl0d42sve.cloudfront.net/lib/jquery/jquery-ui-1.13.2.min.css", 49 | "https://dtd6jl0d42sve.cloudfront.net/lib/Croppie/Croppie-2.6.4/croppie.css", 50 | 51 | "phone.js", 52 | "phone.css", 53 | "phone.light.css", 54 | "phone.dark.css" 55 | 56 | ]; 57 | 58 | self.addEventListener('install', function(event){ 59 | console.log("Service Worker: Install"); 60 | event.waitUntil(caches.open(cacheID).then(function(cache){ 61 | console.log("Cache open, adding Items:", CacheItems); 62 | return cache.addAll(CacheItems); 63 | }).then(function(){ 64 | console.log("Items Added to Cache, skipWaiting"); 65 | // Skip waiting to activate 66 | self.skipWaiting(); 67 | }).catch(function(error){ 68 | console.warn("Error opening Cache:", error); 69 | // Skip waiting to activate 70 | self.skipWaiting(); 71 | })); 72 | }); 73 | 74 | self.addEventListener('activate', function(event){ 75 | console.log("Service Worker: Activate"); 76 | event.waitUntil(clients.claim()); 77 | }); 78 | 79 | self.addEventListener("fetch", function(event){ 80 | if(event.request.url.endsWith("index.html")){ 81 | console.log("Special Home Page handling...", event.request.url); 82 | event.respondWith(loadHomePage(event.request)); 83 | } 84 | else { 85 | // Other Request 86 | event.respondWith(loadFromCacheFirst(event.request)); 87 | } 88 | }); 89 | 90 | 91 | const loadFromCacheFirst = async function(request) { 92 | // First try to get the resource from the cache 93 | const responseFromCache = await caches.match(request); 94 | if (responseFromCache) { 95 | return responseFromCache; 96 | } 97 | // Next try to get the resource from the network 98 | try { 99 | const responseFromNetwork = await fetch(request); 100 | if(responseFromNetwork.ok){ 101 | // If the request was fine, add it to the cache 102 | addToCache(request, responseFromNetwork.clone()); 103 | } 104 | return responseFromNetwork; 105 | } 106 | catch (error) { 107 | return new Response("Network Error", { status: 408, statusText : "Network Error", headers: { "Content-Type": "text/plain" },}); 108 | } 109 | } 110 | const loadHomePage = async function(request) { 111 | // First try to get the resource from the network 112 | try { 113 | const responseFromNetwork = await fetch(request); 114 | if(responseFromNetwork.ok){ 115 | // Normal Response from server 116 | return responseFromNetwork; 117 | } else { 118 | throw new Error("Server Error"); 119 | } 120 | } 121 | catch (error) { 122 | const responseFromCache = await caches.match("offline.html"); 123 | if (responseFromCache) { 124 | return responseFromCache; 125 | } else { 126 | return new Response("Network Error", { status: 408, statusText : "Network Error", headers: { "Content-Type": "text/plain" },}); 127 | } 128 | } 129 | } 130 | const addToCache = async function(request, response) { 131 | const cache = await caches.open(cacheID); 132 | await cache.put(request, response); 133 | } 134 | -------------------------------------------------------------------------------- /Phone/click-to-dial.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Browser Phone 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 67 | 68 | 69 | 70 | 71 |
72 | 73 |
74 | 75 | 76 |
77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /lib/Croppie/croppie.css: -------------------------------------------------------------------------------- 1 | .croppie-container { 2 | width: 100%; 3 | height: 100%; 4 | } 5 | 6 | .croppie-container .cr-image { 7 | z-index: -1; 8 | position: absolute; 9 | top: 0; 10 | left: 0; 11 | transform-origin: 0 0; 12 | max-height: none; 13 | max-width: none; 14 | } 15 | 16 | .croppie-container .cr-boundary { 17 | position: relative; 18 | overflow: hidden; 19 | margin: 0 auto; 20 | z-index: 1; 21 | width: 100%; 22 | height: 100%; 23 | } 24 | 25 | .croppie-container .cr-viewport, 26 | .croppie-container .cr-resizer { 27 | position: absolute; 28 | border: 2px solid #fff; 29 | margin: auto; 30 | top: 0; 31 | bottom: 0; 32 | right: 0; 33 | left: 0; 34 | box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5); 35 | z-index: 0; 36 | } 37 | 38 | .croppie-container .cr-resizer { 39 | z-index: 2; 40 | box-shadow: none; 41 | pointer-events: none; 42 | } 43 | 44 | .croppie-container .cr-resizer-vertical, 45 | .croppie-container .cr-resizer-horisontal { 46 | position: absolute; 47 | pointer-events: all; 48 | } 49 | 50 | .croppie-container .cr-resizer-vertical::after, 51 | .croppie-container .cr-resizer-horisontal::after { 52 | display: block; 53 | position: absolute; 54 | box-sizing: border-box; 55 | border: 1px solid black; 56 | background: #fff; 57 | width: 10px; 58 | height: 10px; 59 | content: ''; 60 | } 61 | 62 | .croppie-container .cr-resizer-vertical { 63 | bottom: -5px; 64 | cursor: row-resize; 65 | width: 100%; 66 | height: 10px; 67 | } 68 | 69 | .croppie-container .cr-resizer-vertical::after { 70 | left: 50%; 71 | margin-left: -5px; 72 | } 73 | 74 | .croppie-container .cr-resizer-horisontal { 75 | right: -5px; 76 | cursor: col-resize; 77 | width: 10px; 78 | height: 100%; 79 | } 80 | 81 | .croppie-container .cr-resizer-horisontal::after { 82 | top: 50%; 83 | margin-top: -5px; 84 | } 85 | 86 | .croppie-container .cr-original-image { 87 | display: none; 88 | } 89 | 90 | .croppie-container .cr-vp-circle { 91 | border-radius: 50%; 92 | } 93 | 94 | .croppie-container .cr-overlay { 95 | z-index: 1; 96 | position: absolute; 97 | cursor: move; 98 | touch-action: none; 99 | } 100 | 101 | .croppie-container .cr-slider-wrap { 102 | width: 75%; 103 | margin: 15px auto; 104 | text-align: center; 105 | } 106 | 107 | .croppie-result { 108 | position: relative; 109 | overflow: hidden; 110 | } 111 | 112 | .croppie-result img { 113 | position: absolute; 114 | } 115 | 116 | .croppie-container .cr-image, 117 | .croppie-container .cr-overlay, 118 | .croppie-container .cr-viewport { 119 | -webkit-transform: translateZ(0); 120 | -moz-transform: translateZ(0); 121 | -ms-transform: translateZ(0); 122 | transform: translateZ(0); 123 | } 124 | 125 | /*************************************/ 126 | /***** STYLING RANGE INPUT ***********/ 127 | /*************************************/ 128 | /*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */ 129 | /*************************************/ 130 | 131 | .cr-slider { 132 | -webkit-appearance: none; 133 | /*removes default webkit styles*/ 134 | /*border: 1px solid white; *//*fix for FF unable to apply focus style bug */ 135 | width: 300px; 136 | /*required for proper track sizing in FF*/ 137 | max-width: 100%; 138 | padding-top: 8px; 139 | padding-bottom: 8px; 140 | background-color: transparent; 141 | } 142 | 143 | .cr-slider::-webkit-slider-runnable-track { 144 | width: 100%; 145 | height: 3px; 146 | background: rgba(0, 0, 0, 0.5); 147 | border: 0; 148 | border-radius: 3px; 149 | } 150 | 151 | .cr-slider::-webkit-slider-thumb { 152 | -webkit-appearance: none; 153 | border: none; 154 | height: 16px; 155 | width: 16px; 156 | border-radius: 50%; 157 | background: #ddd; 158 | margin-top: -6px; 159 | } 160 | 161 | .cr-slider:focus { 162 | outline: none; 163 | } 164 | /* 165 | .cr-slider:focus::-webkit-slider-runnable-track { 166 | background: #ccc; 167 | } 168 | */ 169 | 170 | .cr-slider::-moz-range-track { 171 | width: 100%; 172 | height: 3px; 173 | background: rgba(0, 0, 0, 0.5); 174 | border: 0; 175 | border-radius: 3px; 176 | } 177 | 178 | .cr-slider::-moz-range-thumb { 179 | border: none; 180 | height: 16px; 181 | width: 16px; 182 | border-radius: 50%; 183 | background: #ddd; 184 | margin-top: -6px; 185 | } 186 | 187 | /*hide the outline behind the border*/ 188 | .cr-slider:-moz-focusring { 189 | outline: 1px solid white; 190 | outline-offset: -1px; 191 | } 192 | 193 | .cr-slider::-ms-track { 194 | width: 100%; 195 | height: 5px; 196 | background: transparent; 197 | /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ 198 | border-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */ 199 | border-width: 6px 0; 200 | color: transparent;/*remove default tick marks*/ 201 | } 202 | .cr-slider::-ms-fill-lower { 203 | background: rgba(0, 0, 0, 0.5); 204 | border-radius: 10px; 205 | } 206 | .cr-slider::-ms-fill-upper { 207 | background: rgba(0, 0, 0, 0.5); 208 | border-radius: 10px; 209 | } 210 | .cr-slider::-ms-thumb { 211 | border: none; 212 | height: 16px; 213 | width: 16px; 214 | border-radius: 50%; 215 | background: #ddd; 216 | margin-top:1px; 217 | } 218 | .cr-slider:focus::-ms-fill-lower { 219 | background: rgba(0, 0, 0, 0.5); 220 | } 221 | .cr-slider:focus::-ms-fill-upper { 222 | background: rgba(0, 0, 0, 0.5); 223 | } 224 | /*******************************************/ 225 | 226 | /***********************************/ 227 | /* Rotation Tools */ 228 | /***********************************/ 229 | .cr-rotate-controls { 230 | position: absolute; 231 | bottom: 5px; 232 | left: 5px; 233 | z-index: 1; 234 | } 235 | .cr-rotate-controls button { 236 | border: 0; 237 | background: none; 238 | } 239 | .cr-rotate-controls i:before { 240 | display: inline-block; 241 | font-style: normal; 242 | font-weight: 900; 243 | font-size: 22px; 244 | } 245 | .cr-rotate-l i:before { 246 | content: '↺'; 247 | } 248 | .cr-rotate-r i:before { 249 | content: '↻'; 250 | } 251 | -------------------------------------------------------------------------------- /lib/Normalize/normalize-v8.0.1.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | } 26 | 27 | /** 28 | * Render the `main` element consistently in IE. 29 | */ 30 | 31 | main { 32 | display: block; 33 | } 34 | 35 | /** 36 | * Correct the font size and margin on `h1` elements within `section` and 37 | * `article` contexts in Chrome, Firefox, and Safari. 38 | */ 39 | 40 | h1 { 41 | font-size: 2em; 42 | margin: 0.67em 0; 43 | } 44 | 45 | /* Grouping content 46 | ========================================================================== */ 47 | 48 | /** 49 | * 1. Add the correct box sizing in Firefox. 50 | * 2. Show the overflow in Edge and IE. 51 | */ 52 | 53 | hr { 54 | box-sizing: content-box; /* 1 */ 55 | height: 0; /* 1 */ 56 | overflow: visible; /* 2 */ 57 | } 58 | 59 | /** 60 | * 1. Correct the inheritance and scaling of font size in all browsers. 61 | * 2. Correct the odd `em` font sizing in all browsers. 62 | */ 63 | 64 | pre { 65 | font-family: monospace, monospace; /* 1 */ 66 | font-size: 1em; /* 2 */ 67 | } 68 | 69 | /* Text-level semantics 70 | ========================================================================== */ 71 | 72 | /** 73 | * Remove the gray background on active links in IE 10. 74 | */ 75 | 76 | a { 77 | background-color: transparent; 78 | } 79 | 80 | /** 81 | * 1. Remove the bottom border in Chrome 57- 82 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 83 | */ 84 | 85 | abbr[title] { 86 | border-bottom: none; /* 1 */ 87 | text-decoration: underline; /* 2 */ 88 | text-decoration: underline dotted; /* 2 */ 89 | } 90 | 91 | /** 92 | * Add the correct font weight in Chrome, Edge, and Safari. 93 | */ 94 | 95 | b, 96 | strong { 97 | font-weight: bolder; 98 | } 99 | 100 | /** 101 | * 1. Correct the inheritance and scaling of font size in all browsers. 102 | * 2. Correct the odd `em` font sizing in all browsers. 103 | */ 104 | 105 | code, 106 | kbd, 107 | samp { 108 | font-family: monospace, monospace; /* 1 */ 109 | font-size: 1em; /* 2 */ 110 | } 111 | 112 | /** 113 | * Add the correct font size in all browsers. 114 | */ 115 | 116 | small { 117 | font-size: 80%; 118 | } 119 | 120 | /** 121 | * Prevent `sub` and `sup` elements from affecting the line height in 122 | * all browsers. 123 | */ 124 | 125 | sub, 126 | sup { 127 | font-size: 75%; 128 | line-height: 0; 129 | position: relative; 130 | vertical-align: baseline; 131 | } 132 | 133 | sub { 134 | bottom: -0.25em; 135 | } 136 | 137 | sup { 138 | top: -0.5em; 139 | } 140 | 141 | /* Embedded content 142 | ========================================================================== */ 143 | 144 | /** 145 | * Remove the border on images inside links in IE 10. 146 | */ 147 | 148 | img { 149 | border-style: none; 150 | } 151 | 152 | /* Forms 153 | ========================================================================== */ 154 | 155 | /** 156 | * 1. Change the font styles in all browsers. 157 | * 2. Remove the margin in Firefox and Safari. 158 | */ 159 | 160 | button, 161 | input, 162 | optgroup, 163 | select, 164 | textarea { 165 | font-family: inherit; /* 1 */ 166 | font-size: 100%; /* 1 */ 167 | line-height: 1.15; /* 1 */ 168 | margin: 0; /* 2 */ 169 | } 170 | 171 | /** 172 | * Show the overflow in IE. 173 | * 1. Show the overflow in Edge. 174 | */ 175 | 176 | button, 177 | input { /* 1 */ 178 | overflow: visible; 179 | } 180 | 181 | /** 182 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 183 | * 1. Remove the inheritance of text transform in Firefox. 184 | */ 185 | 186 | button, 187 | select { /* 1 */ 188 | text-transform: none; 189 | } 190 | 191 | /** 192 | * Correct the inability to style clickable types in iOS and Safari. 193 | */ 194 | 195 | button, 196 | [type="button"], 197 | [type="reset"], 198 | [type="submit"] { 199 | -webkit-appearance: button; 200 | } 201 | 202 | /** 203 | * Remove the inner border and padding in Firefox. 204 | */ 205 | 206 | button::-moz-focus-inner, 207 | [type="button"]::-moz-focus-inner, 208 | [type="reset"]::-moz-focus-inner, 209 | [type="submit"]::-moz-focus-inner { 210 | border-style: none; 211 | padding: 0; 212 | } 213 | 214 | /** 215 | * Restore the focus styles unset by the previous rule. 216 | */ 217 | 218 | button:-moz-focusring, 219 | [type="button"]:-moz-focusring, 220 | [type="reset"]:-moz-focusring, 221 | [type="submit"]:-moz-focusring { 222 | outline: 1px dotted ButtonText; 223 | } 224 | 225 | /** 226 | * Correct the padding in Firefox. 227 | */ 228 | 229 | fieldset { 230 | padding: 0.35em 0.75em 0.625em; 231 | } 232 | 233 | /** 234 | * 1. Correct the text wrapping in Edge and IE. 235 | * 2. Correct the color inheritance from `fieldset` elements in IE. 236 | * 3. Remove the padding so developers are not caught out when they zero out 237 | * `fieldset` elements in all browsers. 238 | */ 239 | 240 | legend { 241 | box-sizing: border-box; /* 1 */ 242 | color: inherit; /* 2 */ 243 | display: table; /* 1 */ 244 | max-width: 100%; /* 1 */ 245 | padding: 0; /* 3 */ 246 | white-space: normal; /* 1 */ 247 | } 248 | 249 | /** 250 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 251 | */ 252 | 253 | progress { 254 | vertical-align: baseline; 255 | } 256 | 257 | /** 258 | * Remove the default vertical scrollbar in IE 10+. 259 | */ 260 | 261 | textarea { 262 | overflow: auto; 263 | } 264 | 265 | /** 266 | * 1. Add the correct box sizing in IE 10. 267 | * 2. Remove the padding in IE 10. 268 | */ 269 | 270 | [type="checkbox"], 271 | [type="radio"] { 272 | box-sizing: border-box; /* 1 */ 273 | padding: 0; /* 2 */ 274 | } 275 | 276 | /** 277 | * Correct the cursor style of increment and decrement buttons in Chrome. 278 | */ 279 | 280 | [type="number"]::-webkit-inner-spin-button, 281 | [type="number"]::-webkit-outer-spin-button { 282 | height: auto; 283 | } 284 | 285 | /** 286 | * 1. Correct the odd appearance in Chrome and Safari. 287 | * 2. Correct the outline style in Safari. 288 | */ 289 | 290 | [type="search"] { 291 | -webkit-appearance: textfield; /* 1 */ 292 | outline-offset: -2px; /* 2 */ 293 | } 294 | 295 | /** 296 | * Remove the inner padding in Chrome and Safari on macOS. 297 | */ 298 | 299 | [type="search"]::-webkit-search-decoration { 300 | -webkit-appearance: none; 301 | } 302 | 303 | /** 304 | * 1. Correct the inability to style clickable types in iOS and Safari. 305 | * 2. Change font properties to `inherit` in Safari. 306 | */ 307 | 308 | ::-webkit-file-upload-button { 309 | -webkit-appearance: button; /* 1 */ 310 | font: inherit; /* 2 */ 311 | } 312 | 313 | /* Interactive 314 | ========================================================================== */ 315 | 316 | /* 317 | * Add the correct display in Edge, IE 10+, and Firefox. 318 | */ 319 | 320 | details { 321 | display: block; 322 | } 323 | 324 | /* 325 | * Add the correct display in all browsers. 326 | */ 327 | 328 | summary { 329 | display: list-item; 330 | } 331 | 332 | /* Misc 333 | ========================================================================== */ 334 | 335 | /** 336 | * Add the correct display in IE 10+. 337 | */ 338 | 339 | template { 340 | display: none; 341 | } 342 | 343 | /** 344 | * Add the correct display in IE 10. 345 | */ 346 | 347 | [hidden] { 348 | display: none; 349 | } 350 | -------------------------------------------------------------------------------- /Phone/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Browser Phone (Popup) 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 29 | 30 | 31 | 37 | 155 | 156 | 157 | 158 |
159 |

This is a sample of how the phone can be loaded into you own web site.

160 | 161 |
162 | Create & Destroy 163 |

164 | 165 |

166 |

167 | Use this option to create a new phone window, and use the close icon (X) to remove the phone (deletes all trace). 168 |

169 |
170 | 171 | 172 |
173 | Click to Dial 174 |

175 | 176 | or 177 | 123456789 178 |

179 |

180 | Use this option to create an on-demand phone. Its only available for the call, then shuts down. 181 |

182 |
183 | 184 |
185 | Permanent Phone 186 |

187 | 188 |

189 |

190 | Use this phone to create a Permanent phone, that is always registered. 191 |

192 |

show

193 |
194 | 195 |
196 | 197 | -------------------------------------------------------------------------------- /Docker/config/features.conf: -------------------------------------------------------------------------------- 1 | ; 2 | ; Sample Call Features (transfer, mixmonitor, etc) configuration 3 | ; 4 | 5 | ; Note: From Asterisk 12 - All parking lot configuration is now done in res_parking.conf 6 | 7 | [general] 8 | ;transferdigittimeout => 3 ; Number of seconds to wait between digits when transferring a call 9 | ; (default is 3 seconds). If the TRANSFER_EXTEN dialplan variable has been set 10 | ; on the channel of the user that is invoking the transfer feature, then 11 | ; this option is not used as the user is transferred directly to the extension 12 | ; specified by TRANSFER_EXTEN (the transfer context remains the context specified 13 | ; by TRANSFER_CONTEXT, if set, and otherwise the default context). 14 | ;xfersound = beep ; to indicate an attended transfer is complete 15 | ;xferfailsound = beeperr ; to indicate a failed transfer 16 | ;pickupexten = *8 ; Configure the pickup extension. (default is *8) 17 | ;pickupsound = beep ; to indicate a successful pickup (default: no sound) 18 | ;pickupfailsound = beeperr ; to indicate that the pickup failed (default: no sound) 19 | ;featuredigittimeout = 1000 ; Max time (ms) between digits for 20 | ; feature activation (default is 1000 ms) 21 | ;recordingfailsound = beeperr ; indicates that a one-touch mixmonitor feature failed 22 | ; to be applied to the call. (default: no sound) 23 | ;atxfernoanswertimeout = 15 ; Timeout for answer on attended transfer default is 15 seconds. 24 | ;atxferdropcall = no ; If someone does an attended transfer, then hangs up before the transfer 25 | ; target answers, then by default, the system will try to call back the 26 | ; person that did the transfer. If this is set to "yes", the ringing 27 | ; transfer target is immediately transferred to the transferee. 28 | ;atxferloopdelay = 10 ; Number of seconds to sleep between retries (if atxferdropcall = no) 29 | ;atxfercallbackretries = 2 ; Number of times to attempt to send the call back to the transferer. 30 | ; By default, this is 2. 31 | ;transferdialattempts = 3 ; Number of times that a transferer may attempt to dial an extension before 32 | ; being kicked back to the original call. 33 | ;transferannouncesound = beep ; Sound to play to a transferer to indicate transfer process has begun. If empty, no sound will be played. 34 | ;transferretrysound = beep ; Sound to play when a transferer fails to dial a valid extension. 35 | ;transferinvalidsound = beeperr ; Sound to play when a transferer fails to dial a valid extension and is out of retries. 36 | ;atxferabort = *1 ; cancel the attended transfer 37 | ;atxfercomplete = *2 ; complete the attended transfer, dropping out of the call 38 | ;atxferthreeway = *3 ; complete the attended transfer, but stay in the call. This will turn the call into a multi-party bridge 39 | ;atxferswap = *4 ; swap to the other party. Once an attended transfer has begun, this option may be used multiple times 40 | 41 | ; Note that the DTMF features listed below only work when two channels have answered and are bridged together. 42 | ; They can not be used while the remote party is ringing or in progress. If you require this feature you can use 43 | ; chan_local in combination with Answer to accomplish it. 44 | 45 | [featuremap] 46 | ;blindxfer => #1 ; Blind transfer (default is #) -- Make sure to set the T and/or t option in the Dial() or Queue() app call! 47 | ;disconnect => *0 ; Disconnect (default is *) -- Make sure to set the H and/or h option in the Dial() or Queue() app call! 48 | ;atxfer => *2 ; Attended transfer -- Make sure to set the T and/or t option in the Dial() or Queue() app call! 49 | ;parkcall => #72 ; Park call (one step parking) -- Make sure to set the K and/or k option in the Dial() app call! 50 | ;automixmon => *3 ; One Touch Record a.k.a. Touch MixMonitor -- Make sure to set the X and/or x option in the Dial() or Queue() app call! 51 | 52 | [applicationmap] 53 | ; Note that the DYNAMIC_FEATURES channel variable must be set to use the features 54 | ; defined here. The value of DYNAMIC_FEATURES should be the names of the features 55 | ; to allow the channel to use separated by '#'. For example: 56 | ; 57 | ; Set(__DYNAMIC_FEATURES=myfeature1#myfeature2#myfeature3) 58 | ; 59 | ; (Note: The two leading underscores allow these feature settings to be set 60 | ; on the outbound channels, as well. Otherwise, only the original channel 61 | ; will have access to these features.) 62 | ; 63 | ; The syntax for declaring a dynamic feature is any of the following: 64 | ; 65 | ; => ,[/],[,[,MOH_Class]] 66 | ; => ,[/],[,""[,MOH_Class]] 67 | ; => ,[/],([])[,MOH_Class] 68 | 69 | ; 70 | ; FeatureName -> This is the name of the feature used when setting the 71 | ; DYNAMIC_FEATURES variable to enable usage of this feature. 72 | ; DTMF_sequence -> This is the key sequence used to activate this feature. 73 | ; ActivateOn -> This is the channel of the call that the application will be executed 74 | ; on. Valid values are "self" and "peer". "self" means run the 75 | ; application on the same channel that activated the feature. "peer" 76 | ; means run the application on the opposite channel from the one that 77 | ; has activated the feature. 78 | ; ActivatedBy -> ActivatedBy is no longer honored. The feature is activated by which 79 | ; channel DYNAMIC_FEATURES includes the feature is on. Use a pre-dial 80 | ; handler to set different values for DYNAMIC_FEATURES on the channels. 81 | ; Historic values are: "caller", "callee", and "both". 82 | ; Application -> This is the application to execute. 83 | ; AppArguments -> These are the arguments to be passed into the application. If you need 84 | ; commas in your arguments, you should use either the second or third 85 | ; syntax, above. 86 | ; MOH_Class -> This is the music on hold class to play while the idle 87 | ; channel waits for the feature to complete. If left blank, 88 | ; no music will be played. 89 | ; 90 | 91 | ; 92 | ; IMPORTANT NOTE: The applicationmap is not intended to be used for all Asterisk 93 | ; applications. When applications are used in extensions.conf, they are executed 94 | ; by the PBX core. In this case, these applications are executed outside of the 95 | ; PBX core, so it does *not* make sense to use any application which has any 96 | ; concept of dialplan flow. Examples of this would be things like Goto, 97 | ; Background, WaitExten, and many more. The exceptions to this are Gosub 98 | ; routines which must complete for the call to continue. 99 | ; 100 | ; Enabling these features means that the PBX needs to stay in the media flow and 101 | ; media will not be re-directed if DTMF is sent in the media stream. 102 | ; 103 | ; Example Usage: 104 | ; 105 | ;testfeature => #9,peer,Playback,tt-monkeys ;Allow both the caller and callee to play 106 | ; ;tt-monkeys to the opposite channel 107 | ; 108 | ; Set arbitrary channel variables, based upon CALLERID number (Note that the application 109 | ; argument contains commas) 110 | ;retrieveinfo => #8,peer,Set(ARRAY(CDR(mark),CDR(name))=${ODBC_FOO(${CALLERID(num)})}) 111 | 112 | ; Dynamic Feature Groups: 113 | ; Dynamic feature groups are groupings of features defined in [applicationmap] 114 | ; that can have their own custom key mappings. To give a channel access to a dynamic 115 | ; feature group, add the group name to the value of the DYNAMIC_FEATURES variable. 116 | ; 117 | ; example: 118 | ; [myGroupName] ; defines the group named myGroupName 119 | ; testfeature => #9 ; associates testfeature with the group and the keycode '#9'. 120 | ; retrieveinfo => ; associates retrieveinfo with the group and uses the keycode specified 121 | ; ; in the [applicationmap]. -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Asterisk & Browser Phone Dockerfile # 3 | ####################################### 4 | # The easiest way to kick the tires on WebRTC. 5 | 6 | # Note: Make sure you have Docker installed and running 7 | 8 | # 1️⃣ Step 1) Build this docker 9 | # =========================== 10 | # Show the terminal (if you are in Visual Studio Code) and issue the following command: 11 | # docker build --tag browser-phone:latest . 12 | # (Don't forget to include that little fullstop at the end) 13 | # Note: Last time I ran this it took about 15minutes... go take the dog for a walk! 14 | 15 | # 2️⃣ Step 2) Run this docker 16 | # ========================= 17 | # In the same terminal, run the following command: 18 | # docker run -t -i -p 5060:5060/udp -p 8089:8089/tcp browser-phone:latest 19 | # It can take a moment, but this will not be long 20 | 21 | # 3️⃣ Step 3) Navigate to https://localhost:8089/ 22 | # ============================================= 23 | # Note: You will probably have Chrome or Edge security warning page up in front of you right now. 24 | # This is because the script makes a self-signed localhost certificate and installs it. 25 | # It's fine for testing, so just click the "Advanced" button on that page, and click 26 | # "Proceed to localhost (unsafe)". (Trust me, this is perfectly safe.) 27 | # Your browser phone is up and running... see easy as 1... 2... 3... 28 | 29 | # 👩🏼‍🦰 Add a User 30 | # ============= 31 | # I have pre-loaded some users in the config. You will have User1, User2 and User3 all ready for you. 32 | # The Browser Phone may be promoting you for account details, They will be as follows: 33 | # Secure WebSocket Server (TLS): localhost 34 | # WebSocket Port: 8089 35 | # WebSocket Path: /ws 36 | # Full Name: User One (or anything you like) 37 | # Domain: localhost 38 | # SIP Username: User1 (or User2 or User3) 39 | # SIP Password: 1234 40 | # Subscribe to VoiceMail (MWI): off 41 | # Chat Engine: SIP 42 | 43 | # That should be fine for you to create an account, so click Save, and let the page reload. 44 | # You should see the status go to "Registered" at the top. 45 | 46 | # Once registered, make a test call to music on hold with the number *65 47 | # Hmmm... good ol elevator music 48 | 49 | # 🎉 Congratulations!! 50 | 51 | # ======================================== 52 | 53 | # Don't change this: 54 | FROM debian:bookworm 55 | 56 | # This is the release version from Asterisk, to change the version, refer to Asterisk GitHub site, and set accordingly. 57 | ENV ASTERISK_VERSION=releases/20 58 | 59 | # ======================================== 60 | 61 | ENV DEBIAN_FRONTEND=noninteractive 62 | 63 | RUN apt-get update 64 | RUN apt-get install -y git iputils-ping traceroute 65 | WORKDIR /usr/local/src 66 | # Download src 67 | RUN git clone --branch ${ASTERISK_VERSION} --single-branch --depth 1 https://github.com/asterisk/asterisk.git 68 | # Install asterisk 69 | WORKDIR /usr/local/src/asterisk 70 | RUN contrib/scripts/install_prereq install 71 | RUN ./configure 72 | RUN make menuselect.makeopts 73 | RUN menuselect/menuselect \ 74 | --disable BUILD_NATIVE \ 75 | --disable-all \ 76 | --enable chan_bridge_media \ 77 | --enable chan_rtp \ 78 | --enable chan_pjsip \ 79 | --enable bridge_native_rtp \ 80 | --enable bridge_simple \ 81 | --enable codec_gsm \ 82 | --enable codec_a_mu \ 83 | --enable codec_alaw \ 84 | --enable codec_ulaw \ 85 | --enable codec_opus \ 86 | --enable codec_resample \ 87 | --enable format_gsm \ 88 | --enable format_wav \ 89 | --enable format_wav_gsm \ 90 | --enable format_pcm \ 91 | --enable format_ogg_vorbis \ 92 | --enable format_h264 \ 93 | --enable format_h263 \ 94 | --enable func_base64 \ 95 | --enable func_callerid \ 96 | --enable func_channel \ 97 | --enable func_curl \ 98 | --enable func_cut \ 99 | --enable func_db \ 100 | --enable func_logic \ 101 | --enable func_math \ 102 | --enable func_sprintf \ 103 | --enable func_strings \ 104 | --enable app_confbridge \ 105 | --enable app_db \ 106 | --enable app_dial \ 107 | --enable app_echo \ 108 | --enable app_exec \ 109 | --enable app_mixmonitor \ 110 | --enable app_originate \ 111 | --enable app_playback \ 112 | --enable app_playtones \ 113 | --enable app_queue \ 114 | --enable app_sendtext \ 115 | --enable app_stack \ 116 | --enable app_transfer \ 117 | --enable app_system \ 118 | --enable app_verbose \ 119 | --enable app_voicemail \ 120 | --enable app_externalivr \ 121 | --enable pbx_config \ 122 | --enable pbx_realtime \ 123 | --enable res_musiconhold \ 124 | --enable res_agi \ 125 | --enable res_ari \ 126 | --enable res_ari_applications \ 127 | --enable res_ari_asterisk \ 128 | --enable res_ari_bridges \ 129 | --enable res_ari_channels \ 130 | --enable res_ari_device_states \ 131 | --enable res_ari_endpoints \ 132 | --enable res_ari_events \ 133 | --enable res_ari_mailboxes \ 134 | --enable res_ari_model \ 135 | --enable res_ari_playbacks \ 136 | --enable res_ari_recordings \ 137 | --enable res_ari_sounds \ 138 | --enable res_clioriginate \ 139 | --enable res_config_curl \ 140 | --enable res_config_odbc \ 141 | --enable res_curl \ 142 | --enable res_format_attr_h263 \ 143 | --enable res_format_attr_h264 \ 144 | --enable res_format_attr_opus \ 145 | --enable res_format_attr_vp8 \ 146 | --enable res_http_post \ 147 | --enable res_http_websocket \ 148 | --enable res_odbc \ 149 | --enable res_odbc_transaction \ 150 | --enable res_parking \ 151 | --enable res_pjproject \ 152 | --enable res_pjsip \ 153 | --enable res_pjsip_acl \ 154 | --enable res_pjsip_authenticator_digest \ 155 | --enable res_pjsip_caller_id \ 156 | --enable res_pjsip_dialog_info_body_generator \ 157 | --enable res_pjsip_diversion \ 158 | --enable res_pjsip_dlg_options \ 159 | --enable res_pjsip_dtmf_info \ 160 | --enable res_pjsip_empty_info \ 161 | --enable res_pjsip_endpoint_identifier_anonymous \ 162 | --enable res_pjsip_endpoint_identifier_ip \ 163 | --enable res_pjsip_endpoint_identifier_user \ 164 | --enable res_pjsip_exten_state \ 165 | --enable res_pjsip_header_funcs \ 166 | --enable res_pjsip_logger \ 167 | --enable res_pjsip_messaging \ 168 | --enable res_pjsip_mwi \ 169 | --enable res_pjsip_mwi_body_generator \ 170 | --enable res_pjsip_nat \ 171 | --enable res_pjsip_notify \ 172 | --enable res_pjsip_one_touch_record_info \ 173 | --enable res_pjsip_outbound_authenticator_digest \ 174 | --enable res_pjsip_outbound_publish \ 175 | --enable res_pjsip_outbound_registration \ 176 | --enable res_pjsip_path \ 177 | --enable res_pjsip_pidf_body_generator \ 178 | --enable res_pjsip_pidf_digium_body_supplement \ 179 | --enable res_pjsip_pidf_eyebeam_body_supplement \ 180 | --enable res_pjsip_publish_asterisk \ 181 | --enable res_pjsip_pubsub \ 182 | --enable res_pjsip_refer \ 183 | --enable res_pjsip_registrar \ 184 | --enable res_pjsip_rfc3326 \ 185 | --enable res_pjsip_sdp_rtp \ 186 | --enable res_pjsip_send_to_voicemail \ 187 | --enable res_pjsip_session \ 188 | --enable res_pjsip_sips_contact \ 189 | --enable res_pjsip_t38 \ 190 | --enable res_pjsip_transport_websocket \ 191 | --enable res_pjsip_xpidf_body_generator \ 192 | --enable res_realtime \ 193 | --enable res_rtp_asterisk \ 194 | --enable res_sorcery_astdb \ 195 | --enable res_sorcery_config \ 196 | --enable res_sorcery_memory \ 197 | --enable res_sorcery_memory_cache \ 198 | --enable res_sorcery_realtime \ 199 | --enable res_srtp \ 200 | --enable OPTIONAL_API \ 201 | --enable MOH-OPSOUND-WAV \ 202 | --enable CORE-SOUNDS-EN-WAV \ 203 | menuselect.makeopts 204 | RUN make all 205 | RUN make install 206 | RUN make clean 207 | 208 | # Postinstall 209 | RUN chmod -R 750 /var/spool/asterisk 210 | RUN rm -rf /var/lib/apt/lists/* 211 | RUN rm -rf /usr/local/src/asterisk 212 | 213 | # Make own samples 214 | WORKDIR /etc/asterisk/ 215 | COPY Docker/config/* /etc/asterisk/ 216 | 217 | # Websockets does not work without TLS 218 | RUN apt-get install -y openssl 219 | RUN mkdir /etc/asterisk/crt 220 | RUN openssl req -new -x509 -days 365 -nodes \ 221 | -out /etc/asterisk/crt/certificate.pem \ 222 | -keyout /etc/asterisk/crt/private.pem \ 223 | -subj "/C=GB/ST=England/L=London/O=Head Office/OU=devops/CN=localhost" 224 | 225 | # Prepare Browser Phone 226 | RUN rm -rf /var/lib/asterisk/static-http/* 227 | 228 | WORKDIR /usr/local/src 229 | # Download Browser-Phone 230 | RUN git clone https://github.com/InnovateAsterisk/Browser-Phone.git 231 | RUN cp -r /usr/local/src/Browser-Phone/Phone/* /var/lib/asterisk/static-http/ 232 | 233 | # Set HTTP file permissions 234 | RUN chmod -R 744 /var/lib/asterisk/static-http/* 235 | 236 | EXPOSE 5060/udp 8089/tcp 237 | 238 | HEALTHCHECK --interval=60s --timeout=10s --retries=3 CMD /usr/sbin/asterisk -rx "core show sysinfo" 239 | 240 | ENTRYPOINT ["/usr/sbin/asterisk","-f"] 241 | 242 | CMD ["-v"] 243 | -------------------------------------------------------------------------------- /Phone/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Browser Phone 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 151 | 152 | 153 | 154 | 155 |
156 | 157 |
158 | 159 | 160 |
161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | -------------------------------------------------------------------------------- /Phone/phone.light.css: -------------------------------------------------------------------------------- 1 | /* Light/Unspecified Mode UI */ 2 | 3 | body { 4 | color: #000000; 5 | background-color: #f6f6f6; 6 | } 7 | 8 | .pageContainer{ 9 | box-shadow: 0px 0px 20px rgb(0 0 0 / 25%); 10 | } 11 | 12 | .streamSection{ 13 | background-color: #FFFFFF; 14 | border: none; 15 | } 16 | 17 | .buddy { 18 | border-left: 3px solid transparent; 19 | color: #000000; 20 | } 21 | .buddy:hover { 22 | background-color: #e1e1e1; 23 | } 24 | 25 | .buddySelected { 26 | color: #000000; 27 | background-color: #e1e1e1; 28 | border-left: 3px solid #3478f3; 29 | } 30 | .buddySelected:hover { 31 | cursor: default; 32 | } 33 | 34 | .buddyIcon { 35 | background-color: #CCCCCC; 36 | border: 1px solid #FFFFFF; 37 | box-shadow: 1px 1px 5px rgba(0,0,0,0.25); 38 | } 39 | 40 | .buddyActiveCall { 41 | color: #000000; 42 | background-color: #eeeeee; 43 | border-left: 3px solid #40bd3f; 44 | } 45 | .buddyActiveCallHollding { 46 | color: #666666; 47 | background-color: #c8c8c8; 48 | border-left: 3px solid #999999; 49 | } 50 | .buddyActiveCall .lineIcon { 51 | background-color: #cc9009; 52 | border: 1px solid #ffffff; 53 | box-shadow: 1px 1px 5px rgba(0,0,0,0.25); 54 | color: #F3F3F3; 55 | } 56 | .buddyActiveCallHollding .lineIcon { 57 | background-color: #999999; 58 | border: 1px solid #ffffff; 59 | box-shadow: 1px 1px 5px rgba(0,0,0,0.25); 60 | color: #F3F3F3; 61 | } 62 | .lineIcon { 63 | background-color: #cc9009; 64 | border: 1px solid #ffffff; 65 | box-shadow: 1px 1px 5px rgba(0,0,0,0.25); 66 | color: #F3F3F3; 67 | } 68 | 69 | .hiddenBuddiesText{ 70 | color: #3478f3; 71 | } 72 | 73 | .hrline{ 74 | background-color:#cccccc 75 | } 76 | 77 | .profileContainer{ 78 | background-color: #F6F6F6; 79 | border-bottom: 1px solid #CCCCCC; 80 | } 81 | 82 | .searchClean{ 83 | /* border: 1px solid #CCCCCC; */ 84 | background-color: #eaeaea 85 | } 86 | .searchClean:before { 87 | color: #333333; 88 | } 89 | .searchClean INPUT { 90 | color: #333333 !important; 91 | background-color: transparent; 92 | } 93 | 94 | 95 | .roundButtons { 96 | border: 1px solid transparent; 97 | background-color: transparent; 98 | color: #3478f3; 99 | } 100 | 101 | .roundButtons:hover { 102 | border: 1px solid transparent; 103 | background-color: #e1e1e1; 104 | color: #3478f3 105 | } 106 | 107 | .roundButtons:active { 108 | border: 1px solid transparent; 109 | background-color: #666666; 110 | color: #FFFFFF; 111 | } 112 | 113 | .leftContentTable{ 114 | border-right-color: #CCCCCC; 115 | border-left-color: #CCCCCC; 116 | } 117 | .rightContent{ 118 | border-right-color: #CCCCCC; 119 | } 120 | 121 | .highlightSection{ 122 | background-color: #F6F6F6; 123 | } 124 | .sectionBorderBottom{ 125 | border-bottom: 1px solid #CCCCCC; 126 | } 127 | .sectionBorderTop{ 128 | border-top: 1px solid #CCCCCC; 129 | } 130 | 131 | .presenceText { 132 | color: #808080; 133 | } 134 | 135 | .streamSectionBackground { 136 | background-color: #efeadc; 137 | } 138 | 139 | .chatMessage { 140 | border: 1px solid #e6e6e6; 141 | color: #333333; 142 | background-color: #FFFFFF; 143 | } 144 | .theirChatMessageText { 145 | background-color: #ecf7e6; 146 | color: #000000; 147 | } 148 | .ourChatMessageText { 149 | background-color: #f1f9ff; 150 | color: #000000; 151 | } 152 | .messageDate { 153 | color: #666666; 154 | } 155 | .callRecording{ 156 | background-color: #FFFFFF; 157 | color: #333333; 158 | } 159 | .cdrComment{ 160 | color: #444444; 161 | } 162 | .chatMessageDropdown{ 163 | color: #000000; 164 | background-color: rgba(255, 255, 255, 0.8); 165 | } 166 | 167 | .dialTextInput{ 168 | color: #000000; 169 | border-bottom: 1px solid #cccccc; 170 | background-color: transparent; 171 | } 172 | .dialButtons{ 173 | color: #3478f3; 174 | background-color: #eeeeee; 175 | } 176 | .dialButtons:hover{ 177 | border: 1px solid transparent; 178 | background-color: #e1e1e1; 179 | color: #3478f3 180 | } 181 | .dialButtons:active{ 182 | border: 1px solid transparent; 183 | background-color: #666666; 184 | color: #FFFFFF; 185 | } 186 | .dialButtons span{ 187 | color: #999999; 188 | } 189 | .dialButtonsDial{ 190 | color: #FFFFFF; 191 | background-color: #25962f; 192 | } 193 | .dialButtonsDial:hover{ 194 | color: #FFFFFF; 195 | background-color: #44ad4d; 196 | } 197 | .dialButtonsDial:active{ 198 | color: #FFFFFF; 199 | background-color: #0a5210; 200 | } 201 | .dialButtonsDial:disabled{ 202 | color: #666666; 203 | background-color: #25962f; 204 | } 205 | .dialButtonsDial:disabled:hover{ 206 | color: #666666; 207 | background-color: #25962f; 208 | } 209 | 210 | .hangupButton { 211 | color: #FFFFFF !important; 212 | background-color: #dc0000 !important; 213 | border: 1px solid transparent !important; 214 | } 215 | .hangupButton:hover { 216 | color: #FFFFFF !important; 217 | background-color: #ff1b1b !important; 218 | border: 1px solid transparent !important; 219 | } 220 | .hangupButton:active { 221 | color: #FFFFFF !important; 222 | background-color: #d80000 !important; 223 | } 224 | 225 | .answerButton{ 226 | color: #FFFFFF !important; 227 | background-color: #059609; 228 | } 229 | .answerButton:hover { 230 | color: #FFFFFF !important; 231 | background-color: #0aa80f; 232 | } 233 | .answerButton:active { 234 | color: #FFFFFF !important; 235 | background-color: #017a05; 236 | } 237 | 238 | .rejectButton { 239 | color: #FFFFFF; 240 | background-color: #dc0000; 241 | } 242 | .rejectButton:hover { 243 | color: #FFFFFF; 244 | background-color: #ff1b1b; 245 | } 246 | .rejectButton:active { 247 | color: #FFFFFF; 248 | background-color: #d80000; 249 | } 250 | 251 | .CallControl{ 252 | background-color: #CCCCCC; 253 | } 254 | 255 | /* Standard Field Elements */ 256 | button { 257 | border: 1px solid transparent; 258 | background-color: transparent; 259 | color: #3478f3; 260 | } 261 | button:hover { 262 | background-color: #3478f3; 263 | border: 1px solid transparent; 264 | color: #FFFFFF; 265 | } 266 | button:active { 267 | border: 1px solid #333333; 268 | background-color: #222222; 269 | color: #FFFFFF; 270 | } 271 | button:disabled { 272 | color: #333333; 273 | } 274 | button:disabled:hover { 275 | color: #333333; 276 | } 277 | 278 | input[type=text],input[type=password],input[type=email],input[type=tel] { 279 | color: #000000; 280 | border-bottom: 1px solid #999999; 281 | background-color: transparent; 282 | } 283 | input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=tel]:focus { 284 | border-bottom: 1px solid #333333; 285 | } 286 | select { 287 | color: #000000; 288 | border-bottom: 2px solid #999999; 289 | background-color: transparent; 290 | } 291 | select:focus { 292 | border-bottom: 2px solid #333333; 293 | } 294 | input[type=checkbox] + label:before { 295 | color: #3478f3; 296 | } 297 | input[type=checkbox]:checked + label:before { 298 | color: #3478f3; 299 | } 300 | input[type=radio] + label:before { 301 | color: #3478f3; 302 | } 303 | input[type=radio]:checked + label:before { 304 | color: #3478f3; 305 | } 306 | 307 | /* UiText */ 308 | .UiText { 309 | color:#333333; 310 | } 311 | 312 | /* UiTextHeading */ 313 | .UiTextHeading{ 314 | color:#333333; 315 | border-bottom: 1px solid #CCCCCC; 316 | } 317 | .UiTextHeading::before{ 318 | color: #333333; 319 | } 320 | .UiTextHeadingIcon{ 321 | color: #FFFFFF; 322 | } 323 | 324 | /* UiButtonBar */ 325 | .UiButtonBar { 326 | border-top: 1px solid #e6e6e6; 327 | background-color:#F3F3F3; 328 | } 329 | .UiButtonBar button { 330 | border: 0px solid #0b213a; 331 | background-color: #3478f3; 332 | color: #FFFFFF; 333 | } 334 | .UiButtonBar button:hover { 335 | border: 0px solid #092139; 336 | background-color: #3478f3; 337 | color: #FFFFFF; 338 | } 339 | .UiButtonBar button:active { 340 | border: 0px solid #092139; 341 | background-color: #092139; 342 | color: #FFFFFF; 343 | } 344 | .UiButtonBar button:disabled { 345 | color: #999999; 346 | } 347 | 348 | /* UiWindowButtonBar */ 349 | .UiWindowButtonBar button { 350 | border: 0px solid #0b213a; 351 | background-color: #3478f3; 352 | color: #FFFFFF; 353 | } 354 | .UiWindowButtonBar button:hover { 355 | border: 0px solid #092139; 356 | background-color: #6799f2; 357 | color: #FFFFFF; 358 | } 359 | .UiWindowButtonBar button:active { 360 | border: 0px solid #092139; 361 | background-color: #1547a2; 362 | color: #FFFFFF; 363 | } 364 | .UiWindowButtonBar button:disabled { 365 | color: #999999; 366 | } 367 | 368 | /* UiSideField */ 369 | 370 | 371 | .callStatus { 372 | background-color: #e6e6e6; 373 | } 374 | 375 | .dtmfButtons{ 376 | color: #3478f3; 377 | border: 1px solid transparent; 378 | } 379 | .dtmfButtons:hover{ 380 | color: #3478f3; 381 | background-color: #CCCCCC; 382 | border: 1px solid transparent; 383 | } 384 | .dtmfButtons:active{ 385 | color: #FFFFFF; 386 | background-color: #666666; 387 | border: 1px solid transparent; 388 | } 389 | 390 | /* Tags */ 391 | .tags li { 392 | color: #333333; 393 | border: 1px solid #888888; 394 | background-color: rgba(255, 255, 255, 0.25); 395 | 396 | } 397 | .tags li:hover::before { 398 | color: #000000; 399 | } 400 | .tags li::before { 401 | color: #333333; 402 | } 403 | .tags input[type=text]{ 404 | color: #333333; 405 | } 406 | .tags .tagText:hover::before{ 407 | color: #000000; 408 | } 409 | .tags .tagText::before{ 410 | color: #333333; 411 | } 412 | 413 | 414 | .timelineMessage{ 415 | border-left: 3px solid #3478f3; 416 | } 417 | .timelineMessageDot{ 418 | color: #3478f3; 419 | } 420 | .timelineMessageArea{ 421 | color: #F3F3F3; 422 | } 423 | .timelineMessageDate{ 424 | color: #333333; 425 | } 426 | .timelineMessageText{ 427 | color: #000000; 428 | background-color: rgba(0, 0, 0, 0.1); 429 | } 430 | 431 | .audioGraph { 432 | background-color: #FFFFFF; 433 | } 434 | 435 | .CallColorUnderlay{ 436 | background-image: radial-gradient(circle, transparent, #f6f6f6); 437 | } -------------------------------------------------------------------------------- /Phone/phone.dark.css: -------------------------------------------------------------------------------- 1 | /* Dark Mode UI */ 2 | 3 | body { 4 | color: #CCCCCC; 5 | background-color: #222222;; 6 | } 7 | 8 | .pageContainer{ 9 | box-shadow: 0px 0px 20px rgb(0 0 0 / 25%); 10 | } 11 | 12 | .streamSection{ 13 | background-color: #222222; 14 | border: none; 15 | } 16 | 17 | .buddy { 18 | border-left: 3px solid transparent; 19 | color: #CCCCCC; 20 | } 21 | .buddy:hover { 22 | background-color: #333333; 23 | } 24 | 25 | .buddySelected { 26 | color:#CCCCCC; 27 | background-color: #404040; 28 | border-left: 3px solid #3478f3; 29 | } 30 | .buddySelected:hover { 31 | cursor: default; 32 | } 33 | 34 | .buddyIcon { 35 | background-color: #CCCCCC; 36 | border: 1px solid #3e3e3e; 37 | box-shadow: 1px 1px 5px rgba(0,0,0,0.25); 38 | } 39 | 40 | .buddyActiveCall { 41 | color: #CCCCCC; 42 | background-color: #333333; 43 | border-left: 3px solid #40bd3f; 44 | } 45 | .buddyActiveCallHollding { 46 | color: #999999; 47 | background-color: #292929; 48 | border-left: 3px solid #999999; 49 | } 50 | .buddyActiveCall .lineIcon { 51 | background-color: #cc9009; 52 | border: 1px solid #ffffff; 53 | box-shadow: 1px 1px 5px rgba(0,0,0,0.25); 54 | color: #F3F3F3; 55 | } 56 | .buddyActiveCallHollding .lineIcon { 57 | background-color: #999999; 58 | border: 1px solid #ffffff; 59 | box-shadow: 1px 1px 5px rgba(0,0,0,0.25); 60 | color: #F3F3F3; 61 | } 62 | .lineIcon { 63 | background-color: #cc9009; 64 | border: 1px solid #ffffff; 65 | box-shadow: 1px 1px 5px rgba(0,0,0,0.25); 66 | color: #F3F3F3; 67 | } 68 | 69 | .hiddenBuddiesText{ 70 | color: #3478f3; 71 | } 72 | 73 | .hrline{ 74 | background-color:#696969 75 | } 76 | 77 | .profileContainer{ 78 | background-color: #292929; 79 | border-bottom: 1px solid #3e3e3e; 80 | } 81 | 82 | .searchClean{ 83 | /* border: 1px solid #404040; */ 84 | background-color: #222222; 85 | } 86 | .searchClean:before { 87 | color: #888888; 88 | } 89 | .searchClean INPUT { 90 | color: #888888 !important; 91 | background-color: transparent; 92 | } 93 | 94 | .roundButtons { 95 | border: 1px solid transparent; 96 | background-color: transparent; 97 | color: #3478f3; 98 | } 99 | 100 | .roundButtons:hover { 101 | border: 1px solid transparent; 102 | color: #dcdcdc; 103 | background-color: #333333; 104 | } 105 | 106 | .roundButtons:active { 107 | border: 1px solid #404040; 108 | background-color: #222222; 109 | color: #FFFFFF; 110 | } 111 | 112 | .leftContentTable{ 113 | border-right-color: #3e3e3e; 114 | border-left-color: #3e3e3e; 115 | } 116 | .rightContent{ 117 | border-right-color: #3e3e3e; 118 | } 119 | .highlightSection{ 120 | background-color: #292929; 121 | } 122 | .sectionBorderBottom{ 123 | border-bottom: 1px solid #3e3e3e; 124 | } 125 | .sectionBorderTop{ 126 | border-top: 1px solid #3e3e3e; 127 | } 128 | 129 | .presenceText { 130 | color: #999999; 131 | } 132 | 133 | .streamSectionBackground { 134 | background-color: #292929; 135 | } 136 | 137 | .chatMessage { 138 | border: 1px solid #343434; 139 | color: #cccccc; 140 | background-color: #222222; 141 | } 142 | .theirChatMessageText { 143 | background-color: #2c423a; 144 | color: #e1e1e1; 145 | } 146 | .ourChatMessageText { 147 | background-color: #2b3842; 148 | color: #e3e3e3; 149 | } 150 | .callRecording { 151 | background-color: #292929; 152 | color: #a4a4a4; 153 | } 154 | .messageDate { 155 | color: #999999; 156 | } 157 | .cdrComment{ 158 | color: #CCCCCC; 159 | } 160 | .chatMessageDropdown{ 161 | color: #000000; 162 | background-color: rgba(255, 255, 255, 0.8); 163 | } 164 | 165 | .dialTextInput{ 166 | color: #CCCCCC; 167 | border-bottom: 2px solid #404040; 168 | background-color: transparent; 169 | } 170 | .dialButtons{ 171 | color: #CCCCCC; 172 | background-color: #404040; 173 | } 174 | .dialButtons:hover{ 175 | color: #f3f3f3; 176 | background-color: #333333; 177 | } 178 | .dialButtons:active{ 179 | color: #cccccc; 180 | background-color: #222222; 181 | } 182 | .dialButtons span{ 183 | color: #999999; 184 | } 185 | .dialButtonsDial{ 186 | color: #FFFFFF; 187 | background-color: #067d0f; 188 | } 189 | .dialButtonsDial:hover{ 190 | color: #FFFFFF; 191 | background-color: #44ad4d; 192 | } 193 | .dialButtonsDial:active{ 194 | color: #FFFFFF; 195 | background-color: #0a5210; 196 | } 197 | .dialButtonsDial:disabled{ 198 | color: #666666; 199 | background-color: #067d0f; 200 | } 201 | .dialButtonsDial:disabled:hover{ 202 | color: #666666; 203 | background-color: #067d0f; 204 | } 205 | 206 | .hangupButton { 207 | color: #FFFFFF !important; 208 | background-color: #dc0000 !important; 209 | border: 1px solid transparent !important; 210 | } 211 | .hangupButton:hover { 212 | color: #FFFFFF !important; 213 | background-color: #ff1b1b !important; 214 | border: 1px solid transparent !important; 215 | } 216 | .hangupButton:active { 217 | color: #FFFFFF !important; 218 | background-color: #d80000 !important; 219 | } 220 | 221 | .answerButton{ 222 | color: #FFFFFF !important; 223 | background-color: #059609; 224 | } 225 | .answerButton:hover { 226 | color: #FFFFFF !important; 227 | background-color: #0aa80f; 228 | } 229 | .answerButton:active { 230 | color: #FFFFFF !important; 231 | background-color: #017a05; 232 | } 233 | 234 | .rejectButton { 235 | color: #FFFFFF; 236 | background-color: #dc0000; 237 | } 238 | .rejectButton:hover { 239 | color: #FFFFFF; 240 | background-color: #ff1b1b; 241 | } 242 | .rejectButton:active { 243 | color: #FFFFFF; 244 | background-color: #d80000; 245 | } 246 | 247 | .CallControl{ 248 | background-color: #222222; 249 | } 250 | 251 | /* Standard Field Elements */ 252 | button { 253 | border: 1px solid transparent; 254 | background-color: transparent; 255 | color: #dedede; 256 | } 257 | button:hover { 258 | background-color: #333333; 259 | border: 1px solid #404040; 260 | color: #FFFFFF; 261 | } 262 | button:active { 263 | border: 1px solid #333333; 264 | background-color: #222222; 265 | color: #FFFFFF; 266 | } 267 | button:disabled { 268 | color: #CCCCCC; 269 | } 270 | button:disabled:hover { 271 | color: #CCCCCC; 272 | } 273 | input[type=text],input[type=password],input[type=email],input[type=tel] { 274 | color: #333333; 275 | border-bottom: 1px solid #a3bad9; 276 | background-color: transparent; 277 | } 278 | input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=tel]:focus { 279 | border-bottom: 1px solid #416493; 280 | } 281 | 282 | select { 283 | color: #416493; 284 | border-bottom: 1px solid #a3bad9; 285 | background-color: transparent; 286 | } 287 | select:focus { 288 | border-bottom: 1px solid #416493; 289 | } 290 | input[type=checkbox] + label:before { 291 | color: #416493; 292 | } 293 | 294 | input[type=checkbox]:checked + label:before { 295 | color: #416493; 296 | } 297 | 298 | /* UiText */ 299 | .UiText { 300 | color:#333333; 301 | } 302 | 303 | /* UiTextHeading */ 304 | .UiTextHeading{ 305 | color:#333333; 306 | border-bottom: 1px solid #383838; 307 | } 308 | .UiTextHeading::before{ 309 | color: #8e8e8e; 310 | } 311 | .UiTextHeadingIcon{ 312 | color: #FFFFFF; 313 | } 314 | 315 | /* UiButtonBar */ 316 | .UiButtonBar { 317 | border-top:1px solid #e6e6e6; 318 | background-color:#F3F3F3; 319 | } 320 | .UiButtonBar button { 321 | border: 1px solid #0b213a; 322 | background-color: #395f88; 323 | color: #FFFFFF; 324 | } 325 | .UiButtonBar button:hover { 326 | background-color: #2c5077; 327 | background-image: linear-gradient(#597ca2, #2c5077); 328 | border: 1px solid #092139; 329 | 330 | color: #FFFFFF; 331 | } 332 | .UiButtonBar button:active { 333 | border: 1px solid #092139; 334 | background-color: #092139; 335 | 336 | color: #FFFFFF; 337 | } 338 | .UiButtonBar button:disabled { 339 | color: #CCCCCC; 340 | } 341 | 342 | /* UiWindowButtonBar */ 343 | .UiWindowButtonBar button { 344 | border: 1px solid #0b213a; 345 | background-color: #395f88; 346 | color: #FFFFFF; 347 | } 348 | .UiWindowButtonBar button:hover { 349 | background-color: #2c5077; 350 | background-image: linear-gradient(#597ca2, #2c5077); 351 | border: 1px solid #092139; 352 | 353 | color: #FFFFFF; 354 | } 355 | .UiWindowButtonBar button:active { 356 | border: 1px solid #092139; 357 | background-color: #092139; 358 | 359 | color: #FFFFFF; 360 | } 361 | .UiWindowButtonBar button:disabled { 362 | color: #CCCCCC; 363 | } 364 | 365 | 366 | /* UiSideField */ 367 | .UiSideField{ 368 | color:#CCCCCC; 369 | } 370 | .UiSideField input[type=text],input[type=password],input[type=email],input[type=tel] { 371 | color:#CCCCCC !important; 372 | } 373 | .UiSideField input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=tel]:focus { 374 | color:#CCCCCC !important; 375 | border-bottom: 1px solid #416493 !important; 376 | } 377 | 378 | .UiSideField .UiText{ 379 | color: #CCCCCC !important; 380 | } 381 | .UiSideField input[type=checkbox] + label{ 382 | color: #CCCCCC !important; 383 | } 384 | .UiSideField .UiTextHeading{ 385 | color: #F3F3F3 !important; 386 | } 387 | .UiSideField .Settings_VolumeOutput_Container{ 388 | border: 1px solid rgb(204,204,204,20%) !important; 389 | background-color: rgb(255,255,255,20%) !important; 390 | } 391 | .UiSideField select{ 392 | color: #cccccc !important; 393 | border-bottom-width: 1px !important; 394 | } 395 | .UiSideField select:focus{ 396 | border-bottom-width: 1px !important; 397 | } 398 | .UiSideField .pill-nav input[type=radio] + label{ 399 | color: #CCCCCC !important; 400 | } 401 | .UiSideField .croppie-container .cr-viewport, .croppie-container .cr-resizer{ 402 | border: none !important; 403 | } 404 | 405 | .callStatus { 406 | background-color: #333333; 407 | } 408 | 409 | .dtmfButtons{ 410 | color: #efefef; 411 | border: 1px solid #484848; 412 | } 413 | .dtmfButtons:hover{ 414 | color: #FFFFFF; 415 | background-color: #222222; 416 | } 417 | .dtmfButtons:active{ 418 | color: #cccccc; 419 | background-color: #000000; 420 | } 421 | 422 | /* Tags */ 423 | .tags li { 424 | color: #CCCCCC; 425 | border: 1px solid #888888; 426 | background-color: rgba(0, 0, 0, 0.25); 427 | } 428 | .tags li:hover::before { 429 | color: #FFFFFF; 430 | } 431 | .tags li::before { 432 | color: #CCCCCC; 433 | } 434 | .tags input[type=text]{ 435 | color: #CCCCCC; 436 | } 437 | .tags .tagText:hover::before{ 438 | color: #FFFFFF; 439 | } 440 | .tags .tagText::before{ 441 | color: #CCCCCC; 442 | } 443 | 444 | .timelineMessage{ 445 | color: #F3F3F3; 446 | border-left: 3px solid #3478f3; 447 | } 448 | .timelineMessageDot{ 449 | color: #3478f3; 450 | } 451 | .timelineMessageArea{ 452 | color: #F3F3F3; 453 | } 454 | .timelineMessageDate{ 455 | color: #d0d0d0; 456 | } 457 | .timelineMessageText{ 458 | color: #bdbdbd; 459 | background-color: rgba(0, 0, 0, 0.4); 460 | } 461 | 462 | .audioGraph { 463 | background-color: #000000; 464 | } 465 | 466 | .CallColorUnderlay{ 467 | background-image: radial-gradient(circle, transparent, #2a2a2a); 468 | } -------------------------------------------------------------------------------- /Phone/lang/zh-hans.json: -------------------------------------------------------------------------------- 1 | { 2 | "create_group":"创建分组", 3 | "add_someone":"添加某人", 4 | "find_someone":"搜索某人...", 5 | "refresh_registration":"重新注册", 6 | "configure_extension":"配置分机", 7 | "auto_answer":"自动应答", 8 | "do_no_disturb":"请勿打扰", 9 | "call_waiting":"呼叫等待", 10 | "record_all_calls":"记录所有通话", 11 | "extension_number":"分机号", 12 | "email":"电子邮件", 13 | "mobile":"移动", 14 | "alternative_contact":"备用联系方式", 15 | "full_name":"全名", 16 | "eg_full_name":"例如:Keyla James", 17 | "title_description":"标题", 18 | "eg_general_manager":"例如:总经理", 19 | "internal_subscribe_extension":"内部分机标识", 20 | "eg_internal_subscribe_extension":"例如:100或john", 21 | "mobile_number":"手机号码", 22 | "eg_mobile_number":"例如:+86 139 1234 5678", 23 | "eg_email":"例如:Keyla.James@innovateasterisk.com", 24 | "contact_number_1":"电话号码1", 25 | "eg_contact_number_1":"例如:+1 234 567 8901", 26 | "contact_number_2":"电话号码2", 27 | "eg_contact_number_2":"例如:+441234567890", 28 | "add":"添加", 29 | "cancel": "取消", 30 | "save" : "保存", 31 | "reload_required" : "需要重新加载", 32 | "alert_settings" : "为了使新的注册信息生效,必须重新加载页面,请确认。", 33 | "account": "帐户", 34 | "audio_video" : "音频和视频", 35 | "appearance" : "外观", 36 | "notifications" : "通知", 37 | "asterisk_server_address" : "Asterisk服务器地址", 38 | "eg_asterisk_server_address" : "例如: ws.innovateasterisk.com", 39 | "websocket_port" : " WebSocket端口", 40 | "eg_websocket_port" : "例如: 443", 41 | "websocket_path" : " WebSocket路径", 42 | "eg_websocket_path" : "/ws", 43 | "sip_domain": "域名", 44 | "eg_sip_domain" : "例如: innovateasterisk.com", 45 | "sip_username" : " SIP用户名", 46 | "eg_sip_username" : "例如: webrtc", 47 | "sip_password" : " SIP密码", 48 | "eg_sip_password" : "例如: 1234", 49 | "speaker": "扬声器", 50 | "microphone" : "麦克风", 51 | "camera": "相机", 52 | "frame_rate" : "帧速率(每秒)", 53 | "quality" : "质量", 54 | "image_orientation" : "图像方向", 55 | "image_orientation_normal" : "普通的", 56 | "image_orientation_mirror" : "鏡子", 57 | "aspect_ratio" : "纵横比", 58 | "preview": "预览", 59 | "ringtone" : "铃声", 60 | "ring_device" : "响铃设备", 61 | "auto_gain_control" : "自动增益控制", 62 | "echo_cancellation" : "回声消除", 63 | "noise_suppression" : "噪声抑制", 64 | "enable_onscreen_notifications" : "已启用的屏幕通知", 65 | "alert_notification_permission" : "您需要接受许可请求才能允许通知", 66 | "permission": "权限", 67 | "error" : "错误", 68 | "alert_media_devices": "媒体设备为空, 请检查您的连接是否安全 (HTTPS)", 69 | "alert_error_user_media" : "获取用户媒体介质时出错。", 70 | "alert_file_size" : "文件大于50MB, 您无法上传此文件", 71 | "alert_single_file" : "选择一个文件", 72 | "alert_not_found" : "未找到该项目", 73 | "edit": "编辑", 74 | "welcome" : "欢迎", 75 | "accept": "接受", 76 | "registered" : "已注册", 77 | "registration_failed" : "注册失败", 78 | "unregistered" : "未注册,再见!", 79 | "connected_to_web_socket" : "已连接到WebSocket!", 80 | "disconnected_from_web_socket" : "与WebSocket断开连接!", 81 | "web_socket_error": "WebSocket错误", 82 | "connecting_to_web_socket" : "正在连接到WebSocket...", 83 | "error_connecting_web_socket" : "在WebSocket端口上连接服务器时出错", 84 | "sending_registration" : "正在发送注册...", 85 | "unsubscribing" : "正在取消登记...", 86 | "disconnecting": "断开连接...", 87 | "incoming_call" : "来电", 88 | "incoming_call_from" : "来自: 的呼叫", 89 | "answer_call" : "接听电话", 90 | "answer_call_with_video" : "视频通话", 91 | "reject_call" : "拒绝呼叫", 92 | "call_failed" : "呼叫失败", 93 | "alert_no_microphone" : "很抱歉,您的计算机没有连接麦克风。您无法接听电话。", 94 | "call_in_progress" : "正在进行呼叫!", 95 | "call_rejected" : "呼叫被拒绝", 96 | "trying" : "正在尝试...", 97 | "ringing": "正在响铃...", 98 | "call_cancelled" : "通​​话已取消", 99 | "call_ended" : "通​​话结束,再见!", 100 | "yes" : "是", 101 | "no" : "否", 102 | "receive_kilobits_per_second" : "每秒接收数据量", 103 | "receive_packets_per_second" : "每秒接收数据包", 104 | "receive_packet_loss" : "接收数据包丢失", 105 | "receive_jitter" : "接收抖动", 106 | "receive_audio_levels" : "接收音频电平", 107 | "send_kilobits_per_second" : "每秒发送数据量", 108 | "send_packets_per_second" : "每秒发送数据包", 109 | "state_not_online" : "不在线", 110 | "state_ready" : "就绪", 111 | "state_on_the_phone" : "正在通话", 112 | "state_ringing" : "响铃", 113 | "state_on_hold" : "保持", 114 | "state_unavailable" : "不可用", 115 | "state_unknown" : "未知", 116 | "alert_empty_text_message" : "请在提供的文本框中输入内容,然后单击发送", 117 | "no_message" : "没有消息", 118 | "message_from" : "消息来自", 119 | "starting_video_call" : "正在开始视频通话...", 120 | "call_extension" : "呼叫分机", 121 | "call_mobile" : "呼叫手机", 122 | "call_number" : "电话号码", 123 | "call_group" : "通话组", 124 | "starting_audio_call" : "正在启动音频通话...", 125 | "call_recording_started" : "开始通话记录", 126 | "call_recording_stopped" : "通​​话录音已停止", 127 | "confirm_stop_recording" : "确定要停止录制此呼叫吗?", 128 | "stop_recording" : "停止录制吗?", 129 | "width": "宽度", 130 | "height": "高度", 131 | "extension" : "分机", 132 | "call_blind_transfered" : "呼叫盲转", 133 | "connecting" : "正在连接...", 134 | "attended_transfer_call_started" : "正在参加的转接呼叫...", 135 | "attended_transfer_call_cancelled" : "已取消转接的转接呼叫", 136 | "attended_transfer_complete_accepted" : "已完成预定的传输(已接受)", 137 | "attended_transfer_complete" : "已完成预定的传输", 138 | "attended_transfer_call_ended" : "参加的转接呼叫已结束", 139 | "attended_transfer_call_rejected" : "拒绝转接呼叫", 140 | "attended_transfer_call_terminated" : "参加的转接呼叫已终止", 141 | "conference_call_started" : "电话会议已开始...", 142 | "conference_call_cancelled" : "电话会议已取消", 143 | "conference_call_in_progress" : "正在进行电话会议", 144 | "conference_call_ended" : "电话会议结束", 145 | "conference_call_rejected" : "电话会议被拒绝", 146 | "conference_call_terminated" : "电话会议已终止", 147 | "null_session" : "会话错误,为空", 148 | "call_on_hold" : "通​​话保持", 149 | "send_dtmf" : "发送DTMF", 150 | "switching_video_source" : "正在切换视频源", 151 | "switching_to_canvas" : "切换到画布", 152 | "switching_to_shared_video" : "切换到共享视频", 153 | "switching_to_shared_screen" : "切换到共享屏幕", 154 | "video_disabled" : "视频已禁用", 155 | "line": "线", 156 | "back": "返回", 157 | "audio_call" : "音频呼叫", 158 | "video_call" : "视频通话", 159 | "find_something" : "寻找某物", 160 | "remove" : "删除", 161 | "present": "当下", 162 | "scratchpad": "便笺", 163 | "screen": "屏幕", 164 | "video": "视频", 165 | "blank": "空白", 166 | "show_key_pad" : "显示键盘", 167 | "mute" : "静音", 168 | "unmute": "取消静音", 169 | "start_call_recording" : "开始通话记录", 170 | "stop_call_recording" : "停止通话记录", 171 | "transfer_call" : "转接呼叫", 172 | "cancel_transfer" : "取消转接", 173 | "conference_call" : "电话会议", 174 | "cancel_conference" : "取消会议", 175 | "hold_call" : "保持通话", 176 | "resume_call" : "恢复通话", 177 | "end_call" : "结束通话", 178 | "search_or_enter_number" : "搜索或输入号码", 179 | "blind_transfer" : "盲转", 180 | "attended_transfer" : "转接已加入", 181 | "complete_transfer" : "完成转接", 182 | "end_transfer_call" : "结束转接电话", 183 | "call": "呼叫", 184 | "cancel_call" : "取消通话", 185 | "join_conference_call" : "加入电话会议", 186 | "end_conference_call" : "结束电话会议", 187 | "microphone_levels" : "麦克风级别", 188 | "speaker_levels" : "扬声器级别", 189 | "send_statistics" : "发送统计信息", 190 | "receive_statistics" : "接收统计信息", 191 | "find_something_in_the_message_stream" : "在消息流中找到东西...", 192 | "type_your_message_here" : "在这里输入您的消息...", 193 | "menu" : "菜单", 194 | "confirm_remove_buddy" : "请确认是否将该好友从您的列表中删除?", 195 | "remove_buddy" : "删除好友", 196 | "read_more" : "阅读更多", 197 | "started": "已开始", 198 | "stopped" : "已停止", 199 | "recording_duration" : "录音时间", 200 | "a_video_call" : "视频通话", 201 | "an_audio_call" : "音频通话", 202 | "you_tried_to_make" : "您试图", 203 | "you_made" : "您进行了", 204 | "and_spoke_for" : "并讲了", 205 | "you_missed_a_call" : "您错过了电话", 206 | "you_received" : "您收到了", 207 | "second_single" : "秒", 208 | "seconds_plural": "秒", 209 | "minute_single" : "分钟", 210 | "minutes_plural" : "分钟", 211 | "hour_single" : "小时", 212 | "hours_plural" : "小时", 213 | "bytes": "字节", 214 | "kb": "KB", 215 | "mb": "MB", 216 | "gb": "GB", 217 | "tb": "TB", 218 | "pb": "PB", 219 | "eb": "EB", 220 | "zb": "ZB", 221 | "yb": "YB", 222 | "call_on_mute" : "静音", 223 | "call_off_mute" : "取消静音", 224 | "tag_call" : "标记调用", 225 | "clear_flag" : "清除标志", 226 | "flag_call" : "标志呼叫", 227 | "edit_comment" : "编辑评论", 228 | "copy_message" : "复制消息", 229 | "quote_message" : "引用消息", 230 | "select_expression" : "选择表达式", 231 | "dictate_message" : "听写消息", 232 | "alert_speech_recognition" : "抱歉,您的浏览器不支持此功能", 233 | "speech_recognition" : "语音识别中", 234 | "im_listening" : "正在听...", 235 | "msg_silence_detection" : "您安静了一段时间,因此语音识别功能自动关闭。", 236 | "msg_no_speech" : "未检测到语音。请重试。", 237 | "loading" : "正在加载...", 238 | "select_video" : "选择视频", 239 | "ok" : "确定", 240 | "device_settings" : "设备设置", 241 | "call_stats" : "通话统计", 242 | "you_received_a_call_from" : "您接到了一个电话", 243 | "you_made_a_call_to" : "您致电了", 244 | "you_answered_after" : "你回答之后", 245 | "they_answered_after" : "他们回答之后", 246 | "with_video" : "带视频", 247 | "you_started_a_blind_transfer_to" : "您开始盲目转移到", 248 | "you_started_an_attended_transfer_to" : "您开始了有人照管", 249 | "the_call_was_completed" : "通话已完成。", 250 | "the_call_was_not_completed" : "通话未完成。", 251 | "you_put_the_call_on_mute" : "您将通话置于静音状态。", 252 | "you_took_the_call_off_mute" : "您取消了静音通话。", 253 | "you_put_the_call_on_hold" : "您将呼叫保留。", 254 | "you_took_the_call_off_hold" : "您取消了保留通话。", 255 | "you_ended_the_call" : "您结束了通话。", 256 | "they_ended_the_call" : "他们结束了通话。", 257 | "call_is_being_recorded" : "正在通话记录。", 258 | "now_stopped" : "现在已停止", 259 | "you_started_a_conference_call_to" : "您发起了电话会议", 260 | "show_call_detail_record" : "显示通话详细记录", 261 | "call_detail_record" : "通话明细记录", 262 | "call_direction" : "通话方向", 263 | "call_date_and_time" : "通话日期和时间", 264 | "ring_time" : "振铃时间", 265 | "talk_time" : "谈话时间", 266 | "call_duration" : "通话时间", 267 | "flagged" : "已标记", 268 | "call_tags" : "通话标签", 269 | "call_notes" : "通话记录", 270 | "activity_timeline" : "活动时间表", 271 | "call_recordings" : "通话录音", 272 | "save_as" : "另存為", 273 | "right_click_and_select_save_link_as" : "右鍵單擊並選擇“將鏈接另存為”", 274 | "send" : "發送", 275 | "set_status" : "设置我的状态", 276 | "default_status" : "(无状态)", 277 | "is_typing" : "是打字", 278 | "chat_engine" : "聊天引擎", 279 | "xmpp_server_address" : "Secure XMPP Server (TLS)", 280 | "eg_xmpp_server_address" : "eg: xmpp.innovateasterisk.com", 281 | "allow_calls_on_dnd" : "請勿打擾時允許通話", 282 | "basic_extension" : "基本擴展", 283 | "extension_including_xmpp" : "擴展包括消息交換", 284 | "addressbook_contact" : "地址簿聯繫人", 285 | "subscribe_to_dev_state" : "訂閱設備狀態通知", 286 | "default_video_src" : "缺省", 287 | "subscribe_voicemail" : "訂閱語音郵件 (MWI)", 288 | "voicemail_did" : "語音信箱管理號碼", 289 | "filter_and_sort" : "過濾和排序", 290 | "sort_type" : "类型(然后是上次活动)", 291 | "sort_type_cex" : "联系人, SIP 然后 XMPP", 292 | "sort_type_cxe" : "联系人, XMPP 然后 SIP", 293 | "sort_type_xec" : "XMPP, SIP 然后 联系人", 294 | "sort_type_xce" : "XMPP, 联系人 然后 SIP", 295 | "sort_type_exc" : "SIP, XMPP 然后 联系人", 296 | "sort_type_ecx" : "SIP, 联系人 然后 XMPP", 297 | "sort_exten" : "分机号或号码(然后是上次活动)", 298 | "sort_alpha" : "按字母顺序(然后是最后一个活动)", 299 | "sort_activity" : "仅最后一个活动", 300 | "sort_auto_delete_at_end" : "最后显示自动删除", 301 | "sort_auto_delete_hide" : "隱藏自動刪除好友", 302 | "sort_show_exten_num" : "显示分机号码", 303 | "sort_no_showing" : "未顯示 {0} 個自動刪除好友", 304 | "delete_buddy" : "刪除", 305 | "delete_duddy_data" : "刪除歷史", 306 | "pin_to_top" : "固定", 307 | "voice_mail" : "語音信箱", 308 | "you_have_new_voice_mail" : "您有 {0} 條新語音郵件消息。", 309 | "new_voice_mail" : "新語音信箱留言" 310 | } -------------------------------------------------------------------------------- /Phone/lang/zh.json: -------------------------------------------------------------------------------- 1 | { 2 | "create_group":"创建分组", 3 | "add_someone":"添加某人", 4 | "find_someone":"搜索某人...", 5 | "refresh_registration":"重新注册", 6 | "configure_extension":"配置分机", 7 | "auto_answer":"自动应答", 8 | "do_no_disturb":"请勿打扰", 9 | "call_waiting":"呼叫等待", 10 | "record_all_calls":"记录所有通话", 11 | "extension_number":"分机号", 12 | "email":"电子邮件", 13 | "mobile":"移动电话", 14 | "alternative_contact":"备用联系方式", 15 | "full_name":"全名", 16 | "eg_full_name":"例: Keyla James", 17 | "title_description":"称呼/头衔", 18 | "eg_general_manager":"例:总经理", 19 | "internal_subscribe_extension":"内部分机标识", 20 | "eg_internal_subscribe_extension":"例: 100或john", 21 | "mobile_number":"手机号码", 22 | "eg_mobile_number":"例:+86 139 1234 5678", 23 | "eg_email":"例: Keyla.James@innovateasterisk.com", 24 | "contact_number_1":"电话号码1", 25 | "eg_contact_number_1":"例如:+86 21 1234 5678", 26 | "contact_number_2":"电话号码2", 27 | "eg_contact_number_2":"例如:+86123456789", 28 | "add":"添加", 29 | "cancel": "取消", 30 | "save" : "保存", 31 | "reload_required" : "需要重新加载", 32 | "alert_settings" : "为了使新的设置生效,必须重新加载页面,请确认。", 33 | "account": "帐户", 34 | "audio_video" : "音频和视频", 35 | "appearance" : "外观", 36 | "notifications" : "通知", 37 | "asterisk_server_address" : "Asterisk服务器地址", 38 | "eg_asterisk_server_address" : "例: ws.innovateasterisk.com", 39 | "websocket_port" : " WebSocket端口", 40 | "eg_websocket_port" : "例: 443", 41 | "websocket_path" : " WebSocket路径", 42 | "eg_websocket_path" : "/ws", 43 | "sip_domain": "域名", 44 | "eg_sip_domain" : "例: innovateasterisk.com", 45 | "sip_username" : " SIP用户名", 46 | "eg_sip_username" : "例: webrtc", 47 | "sip_password" : " SIP密码", 48 | "eg_sip_password" : "例: 1234", 49 | "speaker": "扬声器", 50 | "microphone" : "麦克风", 51 | "camera": "相机", 52 | "frame_rate" : "帧速率(每秒)", 53 | "quality" : "质量", 54 | "image_orientation" : "影像方向", 55 | "image_orientation_normal" : "普通的", 56 | "image_orientation_mirror" : "鏡子", 57 | "aspect_ratio" : "纵横比", 58 | "preview": "预览", 59 | "ringtone" : "铃声", 60 | "ring_device" : "响铃设备", 61 | "auto_gain_control" : "自动增益控制", 62 | "echo_cancellation" : "回声消除", 63 | "noise_suppression" : "噪声抑制", 64 | "enable_onscreen_notifications" : "打开屏幕通知", 65 | "alert_notification_permission" : "您需要接受许可请求才能允许通知", 66 | "permission": "权限", 67 | "error" : "错误", 68 | "alert_media_devices": "媒体设备为空, 请检查您的连接是否安全 (HTTPS)", 69 | "alert_error_user_media" : "获取用户媒体介质时出错。", 70 | "alert_file_size" : "文件大于50MB, 无法上传此文件", 71 | "alert_single_file" : "选择一个文件", 72 | "alert_not_found" : "未找到该项目", 73 | "edit": "编辑", 74 | "welcome" : "欢迎", 75 | "accept": "接受", 76 | "registered" : "已注册", 77 | "registration_failed" : "注册失败", 78 | "unregistered" : "未注册,再见!", 79 | "connected_to_web_socket" : "已连接到WebSocket!", 80 | "disconnected_from_web_socket" : "与WebSocket的连接已断开!", 81 | "web_socket_error": "WebSocket错误", 82 | "connecting_to_web_socket" : "正在连接到WebSocket...", 83 | "error_connecting_web_socket" : "在WebSocket端口上连接服务器时出错", 84 | "sending_registration" : "正在发送注册...", 85 | "unsubscribing" : "正在取消注册...", 86 | "disconnecting": "断开连接...", 87 | "incoming_call" : "来电", 88 | "incoming_call_from" : "呼叫来自", 89 | "answer_call" : "接听电话", 90 | "answer_call_with_video" : "视频通话", 91 | "reject_call" : "拒绝呼叫", 92 | "call_failed" : "呼叫失败", 93 | "alert_no_microphone" : "很抱歉,您的计算机没有连接麦克风,无法接听电话。", 94 | "call_in_progress" : "呼叫进行中!", 95 | "call_rejected" : "呼叫被拒绝", 96 | "trying" : "正在尝试...", 97 | "ringing": "正在响铃...", 98 | "call_cancelled" : "通​​话已取消", 99 | "call_ended" : "通​​话结束,再见!", 100 | "yes" : "是", 101 | "no" : "否", 102 | "receive_kilobits_per_second" : "每秒接收数据量", 103 | "receive_packets_per_second" : "每秒接收数据包", 104 | "receive_packet_loss" : "接收数据包丢失率", 105 | "receive_jitter" : "接收抖动", 106 | "receive_audio_levels" : "接收音频电平", 107 | "send_kilobits_per_second" : "每秒发送数据量", 108 | "send_packets_per_second" : "每秒发送数据包", 109 | "state_not_online" : "不在线", 110 | "state_ready" : "就绪", 111 | "state_on_the_phone" : "正在通话", 112 | "state_ringing" : "响铃中", 113 | "state_on_hold" : "通话保持中", 114 | "state_unavailable" : "不可用", 115 | "state_unknown" : "未知", 116 | "alert_empty_text_message" : "请在文本框中输入内容,然后单击发送", 117 | "no_message" : "没有消息", 118 | "message_from" : "消息来自", 119 | "starting_video_call" : "正在开始视频通话...", 120 | "call_extension" : "呼叫分机", 121 | "call_mobile" : "呼叫手机", 122 | "call_number" : "呼叫电话号码", 123 | "call_group" : "呼叫分组", 124 | "starting_audio_call" : "正在启动音频通话...", 125 | "call_recording_started" : "开始通话录音", 126 | "call_recording_stopped" : "通​​话录音已停止", 127 | "confirm_stop_recording" : "确定要停止录制此呼叫吗?", 128 | "stop_recording" : "停止录音吗?", 129 | "width": "宽度", 130 | "height": "高度", 131 | "extension" : "分机", 132 | "call_blind_transfered" : "呼叫盲转", 133 | "connecting" : "正在连接...", 134 | "attended_transfer_call_started" : "在席呼叫转移开始...", 135 | "attended_transfer_call_cancelled" : "在席呼叫转移已取消", 136 | "attended_transfer_complete_accepted" : "已完成在席呼叫转移(已接受)", 137 | "attended_transfer_complete" : "已完成在席呼叫转移", 138 | "attended_transfer_call_ended" : "在席呼叫转移已结束", 139 | "attended_transfer_call_rejected" : "在席呼叫转移被拒绝", 140 | "attended_transfer_call_terminated" : "在席呼叫转移已终止", 141 | "conference_call_started" : "电话会议已开始...", 142 | "conference_call_cancelled" : "电话会议已取消", 143 | "conference_call_in_progress" : "电话会议进行中", 144 | "conference_call_ended" : "电话会议已结束", 145 | "conference_call_rejected" : "电话会议被拒绝", 146 | "conference_call_terminated" : "电话会议已终止", 147 | "null_session" : "会话错误", 148 | "call_on_hold" : "通​​话保持", 149 | "send_dtmf" : "发送DTMF", 150 | "switching_video_source" : "正在切换视频源", 151 | "switching_to_canvas" : "正在切换画布", 152 | "switching_to_shared_video" : "切换到共享视频", 153 | "switching_to_shared_screen" : "切换到共享屏幕", 154 | "video_disabled" : "视频已禁用", 155 | "line": "线", 156 | "back": "返回", 157 | "audio_call" : "音频呼叫", 158 | "video_call" : "视频通话", 159 | "find_something" : "寻找某物", 160 | "remove" : "删除", 161 | "present": "当下", 162 | "scratchpad": "写画板", 163 | "screen": "屏幕", 164 | "video": "视频", 165 | "blank": "空白", 166 | "show_key_pad" : "显示键盘", 167 | "mute" : "静音", 168 | "unmute": "取消静音", 169 | "start_call_recording" : "开始通话录音", 170 | "stop_call_recording" : "停止通话录音", 171 | "transfer_call" : "呼叫转移", 172 | "cancel_transfer" : "取消呼叫转移", 173 | "conference_call" : "电话会议", 174 | "cancel_conference" : "取消会议", 175 | "hold_call" : "保持通话", 176 | "resume_call" : "恢复通话", 177 | "end_call" : "结束通话", 178 | "search_or_enter_number" : "搜索或输入号码", 179 | "blind_transfer" : "盲转", 180 | "attended_transfer" : "在席呼叫转移", 181 | "complete_transfer" : "完成呼叫转移", 182 | "end_transfer_call" : "结束转接电话", 183 | "call": "呼叫", 184 | "cancel_call" : "取消通话", 185 | "join_conference_call" : "加入电话会议", 186 | "end_conference_call" : "结束电话会议", 187 | "microphone_levels" : "麦克风音量", 188 | "speaker_levels" : "扬声器音量", 189 | "send_statistics" : "发送统计信息", 190 | "receive_statistics" : "接收统计信息", 191 | "find_something_in_the_message_stream" : "在消息流中查找...", 192 | "type_your_message_here" : "在这里输入您的消息...", 193 | "menu" : "菜单", 194 | "confirm_remove_buddy" : "请确认是否将该好友从列表中删除?", 195 | "remove_buddy" : "删除好友", 196 | "read_more" : "阅读更多", 197 | "started": "已开始", 198 | "stopped" : "已停止", 199 | "recording_duration" : "录音时间", 200 | "a_video_call" : "视频通话", 201 | "an_audio_call" : "音频通话", 202 | "you_tried_to_make" : "您试图", 203 | "you_made" : "您进行了", 204 | "and_spoke_for" : "并讲了", 205 | "you_missed_a_call" : "您错过了电话", 206 | "you_received" : "您收到了", 207 | "second_single" : "秒", 208 | "seconds_plural": "秒", 209 | "minute_single" : "分钟", 210 | "minutes_plural" : "分钟", 211 | "hour_single" : "小时", 212 | "hours_plural" : "小时", 213 | "bytes": "字节", 214 | "kb": "KB", 215 | "mb": "MB", 216 | "gb": "GB", 217 | "tb": "TB", 218 | "pb": "PB", 219 | "eb": "EB", 220 | "zb": "ZB", 221 | "yb": "YB", 222 | "call_on_mute" : "通话静音", 223 | "call_off_mute" : "取消静音", 224 | "tag_call" : "标记呼叫", 225 | "clear_flag" : "清除标志", 226 | "flag_call" : "标志呼叫", 227 | "edit_comment" : "编辑评论", 228 | "copy_message" : "复制消息", 229 | "quote_message" : "引用消息", 230 | "select_expression" : "选择表达式", 231 | "dictate_message" : "听写消息", 232 | "alert_speech_recognition" : "抱歉,您的浏览器不支持此功能", 233 | "speech_recognition" : "语音识别中", 234 | "im_listening" : "正在听...", 235 | "msg_silence_detection" : "您安静了一段时间,因此语音识别功能自动关闭。", 236 | "msg_no_speech" : "未检测到语音。请重试。", 237 | "loading" : "正在加载...", 238 | "select_video" : "选择视频", 239 | "ok" : "确定", 240 | "device_settings" : "设备设置", 241 | "call_stats" : "通话统计", 242 | "you_received_a_call_from" : "您接到了一个电话", 243 | "you_made_a_call_to" : "您致电了", 244 | "you_answered_after" : "你接听之后", 245 | "they_answered_after" : "他们接听之后", 246 | "with_video" : "带视频", 247 | "you_started_a_blind_transfer_to" : "您发起了盲接呼叫转移到", 248 | "you_started_an_attended_transfer_to" : "您发起了在席呼叫转移到", 249 | "the_call_was_completed" : "通话已完成。", 250 | "the_call_was_not_completed" : "通话未完成。", 251 | "you_put_the_call_on_mute" : "您将通话置于静音状态。", 252 | "you_took_the_call_off_mute" : "您取消了静音状态。", 253 | "you_put_the_call_on_hold" : "您将呼叫置于等待状态。", 254 | "you_took_the_call_off_hold" : "您从呼叫等待返回通话。", 255 | "you_ended_the_call" : "您結束了通話。", 256 | "they_ended_the_call" : "他們結束了通話。", 257 | "call_is_being_recorded" : "正在对通话录音", 258 | "now_stopped" : "现在已停止", 259 | "you_started_a_conference_call_to" : "您发起了电话会议到", 260 | "show_call_detail_record" : "显示通话详细记录", 261 | "call_detail_record" : "通话明细记录", 262 | "call_direction" : "通话方向", 263 | "call_date_and_time" : "通话日期和时间", 264 | "ring_time" : "振铃时间", 265 | "talk_time" : "谈话时间", 266 | "call_duration" : "通话时间", 267 | "flagged" : "已标记", 268 | "call_tags" : "通话标签", 269 | "call_notes" : "通话记录", 270 | "activity_timeline" : "活动时间表", 271 | "call_recordings" : "通话录音", 272 | "save_as" : "另存为", 273 | "right_click_and_select_save_link_as" : "右键单击并选择“将链接另存为”", 274 | "send" : "发送", 275 | "set_status" : "設置我的狀態", 276 | "default_status" : "(無狀態)", 277 | "is_typing" : "是打字", 278 | "chat_engine" : "聊天引擎", 279 | "xmpp_server_address" : "Secure XMPP Server (TLS)", 280 | "eg_xmpp_server_address" : "eg: xmpp.innovateasterisk.com", 281 | "allow_calls_on_dnd" : "在免打扰期间允许通话", 282 | "basic_extension" : "基本扩展", 283 | "extension_including_xmpp" : "扩展包括消息交换", 284 | "addressbook_contact" : "地址簿联系人", 285 | "subscribe_to_dev_state" : "订阅设备状态通知", 286 | "default_video_src" : "缺省", 287 | "subscribe_voicemail" : "订阅语音邮件 (MWI)", 288 | "voicemail_did" : "语音信箱管理号码", 289 | "filter_and_sort" : "过滤和排序", 290 | "sort_type" : "類型(然後是上次活動)", 291 | "sort_type_cex" : "聯繫人, SIP 然後 XMPP", 292 | "sort_type_cxe" : "聯繫人, XMPP 然後 SIP", 293 | "sort_type_xec" : "XMPP, SIP 然後 聯繫人", 294 | "sort_type_xce" : "XMPP, 聯繫人 然後 SIP", 295 | "sort_type_exc" : "SIP, XMPP 然後 聯繫人", 296 | "sort_type_ecx" : "SIP, 聯繫人 然後 XMPP", 297 | "sort_exten" : "分機號或號碼(然後是上次活動)", 298 | "sort_alpha" : "按字母順序(然後是最後一個活動)", 299 | "sort_activity" : "僅最後一個活動", 300 | "sort_auto_delete_at_end" : "显示自动删除最后", 301 | "sort_auto_delete_hide" : "隐藏自动删除好友", 302 | "sort_show_exten_num" : "顯示分機號碼", 303 | "sort_no_showing" : "未显示 {0} 个自动删除好友", 304 | "delete_buddy" : "删除", 305 | "delete_duddy_data" : "删除历史", 306 | "pin_to_top" : "固定", 307 | "voice_mail" : "语音信箱", 308 | "you_have_new_voice_mail" : "您有 {0} 条新语音邮件消息。", 309 | "new_voice_mail" : "新语音信箱留言" 310 | } -------------------------------------------------------------------------------- /lib/fonts/font_roboto/LICENSE-2.0.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /Phone/lang/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "create_group" : "グループ作成", 3 | "add_someone" : "連絡先の追加", 4 | "find_someone" : "連絡先を検索...", 5 | "refresh_registration" : "再度登録", 6 | "configure_extension" : "内線の設定", 7 | "auto_answer" : "自動応答", 8 | "do_no_disturb" : "邪魔しない様に", 9 | "call_waiting" : "電話が待っている", 10 | "record_all_calls" : "全ての電話を録音する", 11 | "extension_number" : "内線番号", 12 | "email" : "メールアドレス", 13 | "mobile" : "携帯", 14 | "alternative_contact" : "連絡先", 15 | "full_name" : "氏名", 16 | "eg_full_name" : "例: Keyla James", 17 | "title_description" : "タイトル / 肩書き", 18 | "eg_general_manager" : "例: 社長", 19 | "internal_subscribe_extension" : "内線番号また内線ネーム", 20 | "eg_internal_subscribe_extension" : "例: 100 若しくは john", 21 | "mobile_number" : "携帯番号", 22 | "eg_mobile_number" : "例: +81 090-1234 5678", 23 | "eg_email" : "例: Keyla.James@innovateasterisk.com", 24 | "contact_number_1" : "連絡番号 1", 25 | "eg_contact_number_1" : "例: +81 234 567 8901", 26 | "contact_number_2" : "連絡番号 2", 27 | "eg_contact_number_2" : "例: +811234567890", 28 | "add" : "追加", 29 | "cancel" : "キャンセル", 30 | "save" : "保存", 31 | "reload_required" : "リロードが要る", 32 | "alert_settings" : "設定を有効にするために、このページを再ロードさせてよろしいでしょうか?", 33 | "account" : "アカウント", 34 | "audio_video" : "オーディオとビデオ", 35 | "appearance" : "外観", 36 | "notifications" : "通知", 37 | "asterisk_server_address" : "Asteriskサーバーアドレス", 38 | "eg_asterisk_server_address" : "例: ws.innovateasterisk.com", 39 | "websocket_port" : "WebSocketポート", 40 | "eg_websocket_port" : "例: 443", 41 | "websocket_path" : "WebSocketパース", 42 | "eg_websocket_path" : "/ws", 43 | "sip_domain": "ドメイン", 44 | "eg_sip_domain" : "例: innovateasterisk.com", 45 | "sip_username" : "SIPユーザー名", 46 | "eg_sip_username" : "例: webrtc", 47 | "sip_password" : "SIPパースワード", 48 | "eg_sip_password" : "例: 1234", 49 | "speaker" : "スピーカー", 50 | "microphone" : "マイク", 51 | "camera" : "カメラ", 52 | "frame_rate" : "フレームレート(毎秒)", 53 | "quality" : "品質", 54 | "image_orientation" : "画像オリエンテーション", 55 | "image_orientation_normal" : "普通", 56 | "image_orientation_mirror" : "鏡", 57 | "aspect_ratio" : "アスペクトレシオ", 58 | "preview" : "プレビュー", 59 | "ringtone" : "着信音", 60 | "ring_device" : "鳴るデバイス", 61 | "auto_gain_control" : "自動ゲイン制御", 62 | "echo_cancellation" : "エコー除去", 63 | "noise_suppression" : "ノイズ抑制", 64 | "enable_onscreen_notifications" : "オンスクリーン通知を有効にした", 65 | "alert_notification_permission" : "通知を許可するには、許可リクエストを受け入れる必要がある", 66 | "permission" : "許可", 67 | "error" : "エラー", 68 | "alert_media_devices" : "メディアデバイスがヌルであり、接続が安全かどうかを確認してください (HTTPS)", 69 | "alert_error_user_media" : "ユーザーメディアの取得中にエラーが発生した。", 70 | "alert_file_size" : "ファイルが50MBより大きいため、このファイルをアップロードできない", 71 | "alert_single_file" : "単一のファイルを選択", 72 | "alert_not_found" : "このアイテムは見つからない", 73 | "edit" : "編集", 74 | "welcome" : "ようこそ", 75 | "accept" : "受け入れ", 76 | "registered" : "登録済み", 77 | "registration_failed" : "登録に失敗した", 78 | "unregistered" : "未登録、さようなら!", 79 | "connected_to_web_socket" : "Webソケットに接続した!", 80 | "disconnected_from_web_socket" : "Webソケットから切断された!", 81 | "web_socket_error" : "Webソケットエラー", 82 | "connecting_to_web_socket" : "Webソケットに接続している...", 83 | "error_connecting_web_socket" : "WebSocketポート上のサーバーへの接続エラー", 84 | "sending_registration" : "登録を送信している...", 85 | "unsubscribing" : "登録を解除している...", 86 | "disconnecting" : "切断している...", 87 | "incoming_call" : "電話の着信", 88 | "incoming_call_from" : "電話の着信:", 89 | "answer_call" : "応答する", 90 | "answer_call_with_video" : "ビデオ付き応答する", 91 | "reject_call" : "通話を拒否する", 92 | "call_failed" : "呼び出しに失敗しました", 93 | "alert_no_microphone" : "このパソコンにはマイクが接続されていないため、着信できなかった", 94 | "call_in_progress" : "通話中!", 95 | "call_rejected" : "通話が拒否された", 96 | "trying" : "トライ中...", 97 | "ringing" : "呼び出し中...", 98 | "call_cancelled" : "キャンセルされた通話", 99 | "call_ended" : "通話終了、さようなら!", 100 | "yes" : "はい", 101 | "no" : "いいえ", 102 | "receive_kilobits_per_second" : "1秒あたりのデータ受信量", 103 | "receive_packets_per_second" : "1秒あたりの受信パケット数", 104 | "receive_packet_loss" : "受信のパケット損失", 105 | "receive_jitter" : "受信ジッター", 106 | "receive_audio_levels" : "受信オーディオ音量", 107 | "send_kilobits_per_second" : "1秒あたりのデータ送信量", 108 | "send_packets_per_second" : "1秒あたりの送信パケット数", 109 | "state_not_online" : "オフライン", 110 | "state_ready" : "受信待ち", 111 | "state_on_the_phone" : "話し中", 112 | "state_ringing" : "リンギング中", 113 | "state_on_hold" : "保留中", 114 | "state_unavailable" : "利用できない", 115 | "state_unknown" : "不明", 116 | "alert_empty_text_message" : "キストボックスに何かメッセージを入力して、[送信]をクリックしてください", 117 | "no_message" : "メッセージなし", 118 | "message_from" : "メッセージの元", 119 | "starting_video_call" : "ビデオ通話を開始している...", 120 | "call_extension" : "内線電話を掛ける", 121 | "call_mobile" : "携帯電話を掛ける", 122 | "call_number" : "番号に電話を掛ける", 123 | "call_group" : "グループに電話を掛ける", 124 | "starting_audio_call" : "音声通話を開始している...", 125 | "call_recording_started" : "通話録音を開始された", 126 | "call_recording_stopped" : "通話録音を停止された", 127 | "confirm_stop_recording" : "この通話の録音を停止してもよろしいですか?", 128 | "stop_recording" : "記録を停止するか?", 129 | "width" : "幅", 130 | "height" : "高さ", 131 | "extension" : "内線番号", 132 | "call_blind_transfered" : "コールブラインド転送", 133 | "connecting" : "接続中...", 134 | "attended_transfer_call_started" : "在席転送通話を開始した...", 135 | "attended_transfer_call_cancelled" : "在席転送通話がキャンセルされた", 136 | "attended_transfer_complete_accepted" : "在席転送完了(受理)", 137 | "attended_transfer_complete" : "在席転送が完了しました", 138 | "attended_transfer_call_ended" : "在席転送が終了された", 139 | "attended_transfer_call_rejected" : "在席転送が拒否された", 140 | "attended_transfer_call_terminated" : "在席転送が中止された", 141 | "conference_call_started" : "電話会議が開始された...", 142 | "conference_call_cancelled" : "電話会議がキャンセルされた", 143 | "conference_call_in_progress" : "電話会議が進行中", 144 | "conference_call_ended" : "電話会議が終了された", 145 | "conference_call_rejected" : "電話会議が拒否された", 146 | "conference_call_terminated" : "会議通話が中止された", 147 | "null_session" : "セッションエラー", 148 | "call_on_hold" : "保留中の通話", 149 | "send_dtmf" : "DTMFを送信した", 150 | "switching_video_source" : "ビデオソースの切り替え", 151 | "switching_to_canvas" : "キャンバスに切り替える", 152 | "switching_to_shared_video" : "共有ビデオに切り替える", 153 | "switching_to_shared_screen" : "共有画面に切り替える", 154 | "video_disabled" : "ビデオは使用禁止", 155 | "line" : "線", 156 | "back" : "バック", 157 | "audio_call" : "音声電話", 158 | "video_call" : "ビデオ電話", 159 | "find_something" : "何かを見つける", 160 | "remove" : "削除する", 161 | "present" : "差し出す", 162 | "scratchpad" : "スクラッチパッド", 163 | "screen" : "スクリーン", 164 | "video" : "ビデオ", 165 | "blank" : "ブランク", 166 | "show_key_pad" : "キーパッドを表示する", 167 | "mute" : "ミュート", 168 | "unmute" : "ミュート解除", 169 | "start_call_recording" : "通話録音を開始する", 170 | "stop_call_recording" : "通話録音を停止する", 171 | "transfer_call" : "通話の転送", 172 | "cancel_transfer" : "転送をキャンセル", 173 | "conference_call" : "電話会議", 174 | "cancel_conference" : "電話会議をキャンセル", 175 | "hold_call" : "通話を保留", 176 | "resume_call" : "通話を再開", 177 | "end_call" : "通話終了", 178 | "search_or_enter_number" : "番号を検索または入力", 179 | "blind_transfer" : "ブラインド転送", 180 | "attended_transfer" : "接した転送", 181 | "complete_transfer" : "転送を完了", 182 | "end_transfer_call" : "通話の終了", 183 | "call" : "呼び出し", 184 | "cancel_call" : "通話をキャンセル", 185 | "join_conference_call" : "電話会議に参加", 186 | "end_conference_call" : "電話会議を終了", 187 | "microphone_levels" : "マイク音量", 188 | "speaker_levels" : "スピーカー音量", 189 | "send_statistics" : "送信統計", 190 | "receive_statistics" : "受信統計", 191 | "find_something_in_the_message_stream" : "メッセージストリームで何かを検索...", 192 | "type_your_message_here" : "ここにメッセージを入力してください...", 193 | "menu" : "メニュー", 194 | "confirm_remove_buddy" : "このバディはリストから削除してよろしいでしょうか?", 195 | "remove_buddy" : "バディを削除する", 196 | "read_more" : "続きを読む", 197 | "started" : "始めた", 198 | "stopped" : "停止した", 199 | "recording_duration" : "録音時間", 200 | "a_video_call" : "ビデオ通話", 201 | "an_audio_call" : "音声通話", 202 | "you_tried_to_make" : "トライしたのは", 203 | "you_made" : "実行したのは", 204 | "and_spoke_for" : "続けた時間:", 205 | "you_missed_a_call" : "不在着信", 206 | "you_received" : "受け取ったのは", 207 | "second_single" : "秒", 208 | "seconds_plural" : "秒", 209 | "minute_single" : "分", 210 | "minutes_plural" : "分", 211 | "hour_single" : "時間", 212 | "hours_plural" : "時間", 213 | "bytes" : "バイト", 214 | "kb" : "KB", 215 | "mb" : "MB", 216 | "gb" : "GB", 217 | "tb" : "TB", 218 | "pb" : "PB", 219 | "eb" : "EB", 220 | "zb" : "ZB", 221 | "yb" : "YB", 222 | "call_on_mute" : "ミュート", 223 | "call_off_mute" : "ミュートを解除", 224 | "tag_call" : "タグ呼び出し", 225 | "clear_flag" : "フラグをクリアする", 226 | "flag_call" : "フラグコール", 227 | "edit_comment" : "コメント編集", 228 | "copy_message" : "メッセージをコピーする", 229 | "quote_message" : "メッセージを引用する", 230 | "select_expression" : "表情を選択する", 231 | "dictate_message" : "メッセージをディクテーションする", 232 | "alert_speech_recognition" : "申し訳ないが、ブラザーはその機能をサポートしていない", 233 | "speech_recognition" : "音声認識", 234 | "im_listening" : "聞いている...", 235 | "msg_silence_detection": "しばらく静かだったので、音声認識がオフになりました。", 236 | "msg_no_speech": "音声を検出していなかったが、も一度して見よう", 237 | "loading": "ロード中...", 238 | "select_video": "ビデオを選択", 239 | "ok": "確認", 240 | "device_settings" : "デバイス設定", 241 | "call_stats" : "通話ステータス", 242 | "you_received_a_call_from" : "着信していたが、通話先", 243 | "you_made_a_call_to" : "電話しましたが、通話先", 244 | "you_answered_after" : "応答したまで", 245 | "they_answered_after" : "応答したまで", 246 | "with_video" : "ビデオ付き", 247 | "you_started_a_blind_transfer_to" : "ブラインド転送を開始された。転送先", 248 | "you_started_an_attended_transfer_to" : "在席転送を開始された。転送先", 249 | "the_call_was_completed" : "通話は終了された。", 250 | "the_call_was_not_completed" : "通話は終了されていなかった", 251 | "you_put_the_call_on_mute" : "通話をミュートされた。", 252 | "you_took_the_call_off_mute" : "ミュートを解除された", 253 | "you_put_the_call_on_hold" : "通話を保留された。", 254 | "you_took_the_call_off_hold" : "保留状態から戻った", 255 | "you_ended_the_call" : "通話を終了しました。", 256 | "they_ended_the_call" : "彼らは通話を終了した。", 257 | "call_is_being_recorded" : "通話を録音中", 258 | "now_stopped" : "只今停止された", 259 | "you_started_a_conference_call_to" : "電話会議を開始された。会議対象", 260 | "show_call_detail_record" : "通話詳細記録を表示", 261 | "call_detail_record" : "通話詳細記録", 262 | "call_direction" : "通話方向", 263 | "call_date_and_time" : "通話日時", 264 | "ring_time" : "呼び出し時間", 265 | "talk_time" : "連続通話時間", 266 | "call_duration" : "通話時間", 267 | "flagged" : "フラグ付き", 268 | "call_tags" : "呼び出しタグ", 269 | "call_notes" : "通話メモ", 270 | "activity_timeline" : "活動タイムライン", 271 | "call_recordings" : "通話録音", 272 | "save_as" : "名前を付けて保存", 273 | "right_click_and_select_save_link_as" : "右クリックして「名前を付けてリンクを保存」を選択します", 274 | "send" : "送る", 275 | "set_status" : "ステータスの設定", 276 | "default_status" : "(ステータスなし)", 277 | "is_typing" : "タイピングしている", 278 | "chat_engine" : "チャットエンジン", 279 | "xmpp_server_address" : "Secure XMPP Server (TLS)", 280 | "eg_xmpp_server_address" : "eg: xmpp.innovateasterisk.com", 281 | "allow_calls_on_dnd" : "サイレントモード中に通話を許可する", 282 | "basic_extension" : "基本的な拡張", 283 | "extension_including_xmpp" : "メッセージ交換を含む拡張機能", 284 | "addressbook_contact" : "アドレスブックの連絡先", 285 | "subscribe_to_dev_state" : "デバイス状態通知をサブスクライブする", 286 | "default_video_src" : "デフォルト", 287 | "subscribe_voicemail" : "ボイスメールを購読する (MWI)", 288 | "voicemail_did" : "ボイスメール管理番号", 289 | "filter_and_sort" : "フィルターと並べ替え", 290 | "sort_type" : "タイプ (次に最近のアクティビティ)", 291 | "sort_type_cex" : "連絡先, SIP の次に XMPP", 292 | "sort_type_cxe" : "連絡先, XMPP の次に SIP", 293 | "sort_type_xec" : "XMPP, SIP の次に 連絡先", 294 | "sort_type_xce" : "XMPP, 連絡先 の次に SIP", 295 | "sort_type_exc" : "SIP, XMPP の次に 連絡先", 296 | "sort_type_ecx" : "SIP, 連絡先 の次に XMPP", 297 | "sort_exten" : "内線番号または番号 (その後の最近のアクティビティ)", 298 | "sort_alpha" : "アルファベット順 (次に最近のアクティビティ)", 299 | "sort_activity" : "最後のアクティビティのみ", 300 | "sort_auto_delete_at_end" : "最後に自動削除を表示", 301 | "sort_auto_delete_hide" : "自動的に削除される友達を非表示にする", 302 | "sort_show_exten_num" : "内線番号を表示", 303 | "sort_no_showing" : "{0} 個の自動削除仲間が表示されていません", 304 | "delete_buddy" : "デリート", 305 | "delete_duddy_data" : "履歴を削除", 306 | "pin_to_top" : "固定された", 307 | "voice_mail" : "ボイスメール", 308 | "you_have_new_voice_mail" : "{0} 件の新しいボイスメール メッセージがあります。", 309 | "new_voice_mail" : "新しいボイスメール メッセージ" 310 | } --------------------------------------------------------------------------------