├── LICENSE ├── README.md └── docs ├── LICENSE ├── WEB-INF └── web.xml ├── analytics-ga.js ├── app.js ├── authorizephone.json ├── babel.config.js ├── base.html ├── body.html ├── calendar.css ├── calendar.js ├── check-solid.png ├── collab.js ├── conference.js ├── conferenceInvite.json ├── conferenceMapper.json ├── conferenceinvitecallflows.json ├── confetti.js ├── config.js ├── config_custom.js ├── connection.js ├── connection_optimization ├── .eslintrc.js ├── connection_optimization.html └── do_external_connect.js ├── countrycodes.json ├── css └── all.css ├── cursor.css ├── custom_ofmeet.css ├── custom_ofmeet.js ├── dayjs.min.js ├── delivered.png ├── directorySearch.json ├── external_api.min.js ├── favicon.ico ├── fix-webm-duration.js ├── fonts.html ├── fonts ├── OpenSans-Light-webfont.eot ├── OpenSans-Light-webfont.svg ├── OpenSans-Light-webfont.ttf └── OpenSans-Light-webfont.woff ├── head.html ├── icon.png ├── image_192.png ├── image_512.png ├── images ├── GIPHY_icon.png ├── GIPHY_logo.png ├── app-store-badge.png ├── apple-touch-icon.png ├── avatar.png ├── btn_google_signin_dark_normal.png ├── calendar.svg ├── chromeLogo.svg ├── downloadLocalRecording.png ├── dropboxLogo_square.png ├── f-droid-badge.png ├── favicon.ico ├── flags.png ├── flags@2x.png ├── google-play-badge.png ├── googleLogo.svg ├── icon-cloud.png ├── icon-info.png ├── icon-users.png ├── jitsilogo.png ├── logo-deep-linking.png ├── microsoftLogo.svg ├── share-audio.gif ├── virtual-background │ ├── background-1.jpg │ ├── background-2.jpg │ ├── background-3.jpg │ ├── background-4.jpg │ ├── background-5.jpg │ ├── background-6.jpg │ └── background-7.jpg ├── watermark.svg └── welcome-background.png ├── index.android.js ├── index.html ├── index.ios.js ├── interface_config.js ├── jkanban.css ├── jkanban.js ├── jspdf.debug.js ├── jspdf.plugin.autotable.js ├── lang ├── languages-af.json ├── languages-ar.json ├── languages-be.json ├── languages-bg.json ├── languages-ca.json ├── languages-cs.json ├── languages-da.json ├── languages-de.json ├── languages-el.json ├── languages-enGB.json ├── languages-eo.json ├── languages-es.json ├── languages-esUS.json ├── languages-et.json ├── languages-eu.json ├── languages-fa.json ├── languages-fi.json ├── languages-fr.json ├── languages-frCA.json ├── languages-gl.json ├── languages-he.json ├── languages-hi.json ├── languages-hr.json ├── languages-hsb.json ├── languages-hu.json ├── languages-hy.json ├── languages-id.json ├── languages-is.json ├── languages-it.json ├── languages-ja.json ├── languages-kab.json ├── languages-ko.json ├── languages-lt.json ├── languages-lv.json ├── languages-mn.json ├── languages-mr.json ├── languages-nb.json ├── languages-nl.json ├── languages-oc.json ├── languages-pl.json ├── languages-pt.json ├── languages-ptBR.json ├── languages-ro.json ├── languages-ru.json ├── languages-sc.json ├── languages-sk.json ├── languages-sl.json ├── languages-sq.json ├── languages-sr.json ├── languages-sv.json ├── languages-te.json ├── languages-tr.json ├── languages-uk.json ├── languages-vi.json ├── languages-zhCN.json ├── languages-zhTW.json ├── languages.json ├── main-af.json ├── main-ar.json ├── main-be.json ├── main-bg.json ├── main-ca.json ├── main-cs.json ├── main-da.json ├── main-de.json ├── main-el.json ├── main-enGB.json ├── main-eo.json ├── main-es.json ├── main-esUS.json ├── main-et.json ├── main-eu.json ├── main-fa.json ├── main-fi.json ├── main-fr.json ├── main-frCA.json ├── main-gl.json ├── main-he.json ├── main-hi.json ├── main-hr.json ├── main-hsb.json ├── main-hu.json ├── main-hy.json ├── main-id.json ├── main-is.json ├── main-it.json ├── main-ja.json ├── main-kab.json ├── main-ko.json ├── main-lt.json ├── main-lv.json ├── main-ml.json ├── main-mn.json ├── main-mr.json ├── main-nb.json ├── main-nl.json ├── main-oc.json ├── main-pl.json ├── main-pt.json ├── main-ptBR.json ├── main-ro.json ├── main-ru.json ├── main-sc.json ├── main-sk.json ├── main-sl.json ├── main-sq.json ├── main-sr.json ├── main-sv.json ├── main-te.json ├── main-tr.json ├── main-uk.json ├── main-vi.json ├── main-zhCN.json ├── main-zhTW.json ├── main.json ├── ofmeet-de.json ├── ofmeet-enGB.json ├── ofmeet-ja.json ├── readme.md └── update-translation.js ├── libs ├── alwaysontop.min.js ├── alwaysontop.min.js.map ├── analytics-ga.js ├── analytics-ga.min.js ├── analytics-ga.min.js.map ├── app.bundle.min-old.js ├── app.bundle.min.js ├── app.bundle.min.js.map ├── blazeface-front.bin ├── blazeface-front.json ├── capabilities.json ├── close3.min.js ├── dial_in_info_bundle.min.js ├── dial_in_info_bundle.min.js.map ├── do_external_connect.min.js ├── do_external_connect.min.js.map ├── emotion.bin ├── emotion.json ├── external_api.min.js ├── external_api.min.js.map ├── external_connect.js ├── face-landmarks-worker.min.js ├── face-landmarks-worker.min.js.map ├── lib-jitsi-meet.e2ee-worker.js ├── lib-jitsi-meet.min-old.js ├── lib-jitsi-meet.min.js ├── lib-jitsi-meet.min.map ├── noise-suppressor-worklet.min.js ├── noise-suppressor-worklet.min.js.map ├── olm.wasm ├── rnnoise.wasm ├── selfie_segmentation_landscape.tflite ├── tfjs-backend-wasm-simd.wasm ├── tfjs-backend-wasm-threaded-simd.wasm ├── tfjs-backend-wasm.wasm ├── tflite-simd.wasm └── tflite.wasm ├── manifest_ofmeet.json ├── metro.config.js ├── phoneNumberList.json ├── plugin.head.html ├── pwa-worker.js ├── react-native.config.js ├── robots.txt ├── sounds ├── asked-unmute.mp3 ├── e2eeOff.mp3 ├── e2eeOn.mp3 ├── incomingMessage.wav ├── joined.wav ├── knock.mp3 ├── left.wav ├── liveStreamingOff.mp3 ├── liveStreamingOn.mp3 ├── noAudioSignal.mp3 ├── noisyAudioInput.mp3 ├── outgoingRinging.wav ├── outgoingStart.wav ├── reactions-applause.mp3 ├── reactions-boo.mp3 ├── reactions-crickets.mp3 ├── reactions-laughter.mp3 ├── reactions-raised-hand.mp3 ├── reactions-surprise.mp3 ├── reactions-thumbs-up.mp3 ├── recordingOff.mp3 ├── recordingOn.mp3 ├── rejected.wav ├── ring.ogg ├── ring.wav └── talkWhileMuted.mp3 ├── static ├── 404.html ├── authError.html ├── close.html ├── close.js ├── close2.html ├── close3.html ├── close3.js ├── css │ └── all.css ├── dialInInfo.html ├── msredirect.html ├── oauth.html ├── offline.html ├── planLimit.html ├── prejoin.html ├── pwa │ └── icons │ │ ├── icon192.png │ │ ├── icon512.png │ │ └── iconMask.png ├── recommendedBrowsers.html ├── settingsToolbarAdditionalContent.html ├── welcomePageAdditionalCard.html └── welcomePageAdditionalContent.html ├── times-solid.png ├── tingle.css ├── tingle.js ├── tinycolor.js ├── title.html ├── webpack.config.js ├── webpush-browserify-bundle.js └── webpush-sw.js /README.md: -------------------------------------------------------------------------------- 1 | # ìpàdé 2 | ìpàdé (Yoruba word for Meeting) is a web-serverless version of [Openfire Pàdé](https://github.com/igniterealtime/openfire-pade-plugin) hosted on GitPages 3 | 4 | ìpàdé uses static web pages hosted here on Github to run a custom version of jitsi-meet. It works with both Jitsi-Meet and Openfire Pàdé hosted instances, but defaults to the Openfire server at pade.chat. 5 | 6 | ## Demo 7 | Open a browser window/tabs instances and point it at https://inspired-futures.github.io/ipade/index.html?room=AnyRoomNameYouLike 8 | 9 | 10 | 11 | ## Installation 12 | Nothing to install!. It is is serverless. Just clone this GitHub repository and enabled GitPages for the docs folder. 13 | 14 | ## How to use 15 | First edit config.js and interface_config.js directly from GitHub. Modify as required. 16 | -------------------------------------------------------------------------------- /docs/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | proxy 9 | org.jivesoftware.openfire.plugin.ofmeet.HttpProxyServlet 10 | 11 | 12 | 13 | proxy 14 | /proxy 15 | 16 | 17 | 18 | config 19 | org.jivesoftware.openfire.plugin.ofmeet.ConfigServlet 20 | 21 | 22 | 23 | config 24 | /config.js 25 | 26 | 27 | 28 | interfaceConfig 29 | org.jivesoftware.openfire.plugin.ofmeet.InterfaceConfigServlet 30 | 31 | 32 | 33 | interfaceConfig 34 | /interface_config.js 35 | 36 | 37 | 38 | inProgressList 39 | org.jivesoftware.openfire.plugin.ofmeet.InProgressListServlet 40 | 41 | 42 | 43 | inProgressList 44 | /inProgressList.json 45 | 46 | 47 | 48 | feedback 49 | org.jivesoftware.openfire.plugin.ofmeet.FeedbackServlet 50 | 51 | 2048 52 | 2048 53 | 2048 54 | 55 | 56 | 57 | 58 | feedback 59 | /static/close3.html 60 | 61 | 62 | 63 | 64 | WatermarkFilter 65 | org.jivesoftware.openfire.plugin.ofmeet.WatermarkFilter 66 | 67 | 68 | 69 | WatermarkFilter 70 | /images/watermark.png 71 | /images/rightwatermark.png 72 | REQUEST 73 | 74 | 75 | 76 | JitsiMeetRedirectFilter 77 | org.jivesoftware.openfire.plugin.ofmeet.JitsiMeetRedirectFilter 78 | 79 | 80 | 81 | JitsiMeetRedirectFilter 82 | /* 83 | REQUEST 84 | 85 | 86 | 87 | index.html 88 | 89 | 90 | -------------------------------------------------------------------------------- /docs/analytics-ga.js: -------------------------------------------------------------------------------- 1 | /* global ga */ 2 | 3 | (function(ctx) { 4 | /** 5 | * 6 | */ 7 | function Analytics(options) { 8 | /* eslint-disable */ 9 | 10 | if (!options.googleAnalyticsTrackingId) { 11 | console.log( 12 | 'Failed to initialize Google Analytics handler, no tracking ID'); 13 | return; 14 | } 15 | 16 | /** 17 | * Google Analytics 18 | * TODO: Keep this local, there's no need to add it to window. 19 | */ 20 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 21 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 22 | })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 23 | ga('create', options.googleAnalyticsTrackingId, 'auto'); 24 | ga('send', 'pageview'); 25 | 26 | /* eslint-enable */ 27 | } 28 | 29 | /** 30 | * Extracts the integer to use for a Google Analytics event's value field 31 | * from a lib-jitsi-meet analytics event. 32 | * @param {Object} event - The lib-jitsi-meet analytics event. 33 | * @returns {Object} - The integer to use for the 'value' of a Google 34 | * Analytics event. 35 | * @private 36 | */ 37 | Analytics.prototype._extractAction = function(event) { 38 | // Page events have a single 'name' field. 39 | if (event.type === 'page') { 40 | return event.name; 41 | } 42 | 43 | // All other events have action, actionSubject, and source fields. All 44 | // three fields are required, and the often jitsi-meet and 45 | // lib-jitsi-meet use the same value when separate values are not 46 | // necessary (i.e. event.action == event.actionSubject). 47 | // Here we concatenate these three fields, but avoid adding the same 48 | // value twice, because it would only make the GA event's action harder 49 | // to read. 50 | let action = event.action; 51 | 52 | if (event.actionSubject && event.actionSubject !== event.action) { 53 | // Intentionally use string concatenation as analytics needs to 54 | // work on IE but this file does not go through babel. For some 55 | // reason disabling this globally for the file does not have an 56 | // effect. 57 | // eslint-disable-next-line prefer-template 58 | action = event.actionSubject + '.' + action; 59 | } 60 | if (event.source && event.source !== event.action 61 | && event.source !== event.action) { 62 | // eslint-disable-next-line prefer-template 63 | action = event.source + '.' + action; 64 | } 65 | 66 | return action; 67 | }; 68 | 69 | /** 70 | * Extracts the integer to use for a Google Analytics event's value field 71 | * from a lib-jitsi-meet analytics event. 72 | * @param {Object} event - The lib-jitsi-meet analytics event. 73 | * @returns {Object} - The integer to use for the 'value' of a Google 74 | * Analytics event, or NaN if the lib-jitsi-meet event doesn't contain a 75 | * suitable value. 76 | * @private 77 | */ 78 | Analytics.prototype._extractValue = function(event) { 79 | let value = event && event.attributes && event.attributes.value; 80 | 81 | // Try to extract an integer from the "value" attribute. 82 | value = Math.round(parseFloat(value)); 83 | 84 | return value; 85 | }; 86 | 87 | /** 88 | * Extracts the string to use for a Google Analytics event's label field 89 | * from a lib-jitsi-meet analytics event. 90 | * @param {Object} event - The lib-jitsi-meet analytics event. 91 | * @returns {string} - The string to use for the 'label' of a Google 92 | * Analytics event. 93 | * @private 94 | */ 95 | Analytics.prototype._extractLabel = function(event) { 96 | let label = ''; 97 | 98 | // The label field is limited to 500B. We will concatenate all 99 | // attributes of the event, except the user agent because it may be 100 | // lengthy and is probably included from elsewhere. 101 | for (const property in event.attributes) { 102 | if (property !== 'permanent_user_agent' 103 | && property !== 'permanent_callstats_name' 104 | && event.attributes.hasOwnProperty(property)) { 105 | // eslint-disable-next-line prefer-template 106 | label += property + '=' + event.attributes[property] + '&'; 107 | } 108 | } 109 | 110 | if (label.length > 0) { 111 | label = label.slice(0, -1); 112 | } 113 | 114 | return label; 115 | }; 116 | 117 | /** 118 | * This is the entry point of the API. The function sends an event to 119 | * google analytics. The format of the event is described in 120 | * AnalyticsAdapter in lib-jitsi-meet. 121 | * @param {Object} event - the event in the format specified by 122 | * lib-jitsi-meet. 123 | */ 124 | Analytics.prototype.sendEvent = function(event) { 125 | if (!event || !ga) { 126 | return; 127 | } 128 | 129 | const ignoredEvents 130 | = [ 'e2e_rtt', 'rtp.stats', 'rtt.by.region', 'available.device', 131 | 'stream.switch.delay', 'ice.state.changed', 'ice.duration' ]; 132 | 133 | // Temporary removing some of the events that are too noisy. 134 | if (ignoredEvents.indexOf(event.action) !== -1) { 135 | return; 136 | } 137 | 138 | const gaEvent = { 139 | 'eventCategory': 'jitsi-meet', 140 | 'eventAction': this._extractAction(event), 141 | 'eventLabel': this._extractLabel(event) 142 | }; 143 | const value = this._extractValue(event); 144 | 145 | if (!isNaN(value)) { 146 | gaEvent.eventValue = value; 147 | } 148 | 149 | ga('send', 'event', gaEvent); 150 | }; 151 | 152 | if (typeof ctx.JitsiMeetJS === 'undefined') { 153 | ctx.JitsiMeetJS = {}; 154 | } 155 | if (typeof ctx.JitsiMeetJS.app === 'undefined') { 156 | ctx.JitsiMeetJS.app = {}; 157 | } 158 | if (typeof ctx.JitsiMeetJS.app.analyticsHandlers === 'undefined') { 159 | ctx.JitsiMeetJS.app.analyticsHandlers = []; 160 | } 161 | ctx.JitsiMeetJS.app.analyticsHandlers.push(Analytics); 162 | })(window); 163 | /* eslint-enable prefer-template */ 164 | -------------------------------------------------------------------------------- /docs/app.js: -------------------------------------------------------------------------------- 1 | /* application specific logic */ 2 | 3 | // Re-export jQuery 4 | // FIXME: Remove this requirement from torture tests. 5 | import $ from 'jquery'; 6 | 7 | window.$ = window.jQuery = $; 8 | 9 | import '@matrix-org/olm'; 10 | 11 | import 'focus-visible'; 12 | 13 | // We need to setup the jitsi-local-storage as early as possible so that we can start using it. 14 | // NOTE: If jitsi-local-storage is used before the initial setup is performed this will break the use case when we use 15 | // the local storage from the parent page when the localStorage is disabled. Also the setup is relying that 16 | // window.location is not changed and still has all URL parameters. 17 | import './react/features/base/jitsi-local-storage/setup'; 18 | import conference from './conference'; 19 | import API from './modules/API'; 20 | import UI from './modules/UI/UI'; 21 | import keyboardshortcut from './modules/keyboardshortcut/keyboardshortcut'; 22 | import translation from './modules/translation/translation'; 23 | 24 | // Initialize Olm as early as possible. 25 | if (window.Olm) { 26 | window.Olm.init().catch(e => { 27 | console.error('Failed to initialize Olm, E2EE will be disabled', e); 28 | delete window.Olm; 29 | }); 30 | } 31 | 32 | window.APP = { 33 | API, 34 | conference, 35 | 36 | // Used by do_external_connect.js if we receive the attach data after 37 | // connect was already executed. status property can be 'initialized', 38 | // 'ready', or 'connecting'. We are interested in 'ready' status only which 39 | // means that connect was executed but we have to wait for the attach data. 40 | // In status 'ready' handler property will be set to a function that will 41 | // finish the connect process when the attach data or error is received. 42 | connect: { 43 | handler: null, 44 | status: 'initialized' 45 | }, 46 | 47 | // Used for automated performance tests. 48 | connectionTimes: { 49 | 'index.loaded': window.indexLoadedTime 50 | }, 51 | 52 | keyboardshortcut, 53 | translation, 54 | UI 55 | }; 56 | 57 | // TODO The execution of the mobile app starts from react/index.native.js. 58 | // Similarly, the execution of the Web app should start from react/index.web.js 59 | // for the sake of consistency and ease of understanding. Temporarily though 60 | // because we are at the beginning of introducing React into the Web app, allow 61 | // the execution of the Web app to start from app.js in order to reduce the 62 | // complexity of the beginning step. 63 | import './react'; 64 | -------------------------------------------------------------------------------- /docs/authorizephone.json: -------------------------------------------------------------------------------- 1 | {"message":"Access allowed","phone":"+151","country":"1","allow":true} -------------------------------------------------------------------------------- /docs/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 'module:metro-react-native-babel-preset' ], 3 | env: { 4 | production: { 5 | plugins: [ 'react-native-paper/babel' ] 6 | } 7 | }, 8 | plugins: [ 'optional-require' ] 9 | }; 10 | -------------------------------------------------------------------------------- /docs/base.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/body.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/body.html -------------------------------------------------------------------------------- /docs/check-solid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/check-solid.png -------------------------------------------------------------------------------- /docs/conferenceInvite.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/conferenceInvite.json -------------------------------------------------------------------------------- /docs/conferenceMapper.json: -------------------------------------------------------------------------------- 1 | {"message":"Successfully retrieved conference mapping","id":3216565315,"conference":"siptest@conference.desktop-545pc5b"} -------------------------------------------------------------------------------- /docs/conferenceinvitecallflows.json: -------------------------------------------------------------------------------- 1 | {"message":"Missing Authentication Token"} -------------------------------------------------------------------------------- /docs/config.js: -------------------------------------------------------------------------------- 1 | var config = { 2 | "useNicks": false, 3 | "enableUserRolesBasedOnToken": false, 4 | "webrtcIceTcpDisable": false, 5 | "defaultSipNumber": "", 6 | "enableRtpStats": true, 7 | "noticeMessage": "", 8 | "enableRecording": false, 9 | "resolution": 720, 10 | "constraints": {"video": { 11 | "width": { 12 | "ideal": 1280, 13 | "min": 426, 14 | "max": 3840 15 | }, 16 | "aspectRatio": 16 / 9, 17 | "height": { 18 | "ideal": 720, 19 | "min": 360, 20 | "max": 1080 21 | } 22 | }}, 23 | "hiddenDomain": "recorder.pade.chat", 24 | "videoQuality": { 25 | "minHeightForQualityLvl": { 26 | "720": "high", 27 | "180": "low", 28 | "360": "standard" 29 | }, 30 | "maxBitratesVideo": {"VP9": { 31 | "standard": 500000, 32 | "high": 1500000, 33 | "low": 200000 34 | }}, 35 | "preferredCodec": "VP9" 36 | }, 37 | "enableP2P": true, 38 | "enableLipSync": false, 39 | "minHDHeight": 540, 40 | "enableLayerSuspension": true, 41 | "websocket": "wss://pade.chat:5443/ws/", 42 | "startAudioMuted": 9, 43 | "enableForcedReload": true, 44 | "desktopSharingFrameRate": { 45 | "min": 5, 46 | "max": 25 47 | }, 48 | "channelLastN": -1, 49 | "adaptiveLastN": false, 50 | "hosts": { 51 | "domain": "pade.chat", 52 | "muc": "conference.pade.chat" 53 | }, 54 | "testing": { 55 | "capScreenshareBitrate": 1, 56 | "octo": {"probability": 0} 57 | }, 58 | "prejoinPageEnabled": false, 59 | "useTurnUdp": false, 60 | "desktopSharingChromeDisabled": false, 61 | "disableAdaptiveSimulcast": true, 62 | "enableUnifiedOnChrome": true, 63 | "stereo": false, 64 | "enableClosePage": false, 65 | "ofmeetStreamPort": "8080", 66 | "disableAudioLevels": true, 67 | "ofmeetStreamKey": "a6vg-e64h-b73h-ts1q-ft4e", 68 | "useIPv6": false, 69 | "startBitrate": 800, 70 | "enableWelcomePage": true, 71 | "maxFullResolutionParticipants": -1, 72 | "useStunTurn": false, 73 | "bosh": "https://pade.chat:5443/http-bind/", 74 | "enableNoAudioDetection": true, 75 | "useNewBandwidthAllocationStrategy": true, 76 | "defaultLanguage": "en", 77 | "useRoomAsSharedDocumentName": false, 78 | "recordingType": "colibri", 79 | "clientNode": "http://igniterealtime.org/ofmeet/jitsi-meet/", 80 | "conferences": [], 81 | "enableNoisyMicDetection": true, 82 | "desktopSharingFirefoxDisabled": false, 83 | "logStats": false, 84 | "useRtcpMux": true, 85 | "requireDisplayName": true, 86 | "startVideoMuted": 9, 87 | "adaptiveSimulcast": false, 88 | "iceServers": "{'iceServers':[{'url': 'stun:jitsi.free-solutions.org:3479'},{url: 'turn:jitsi.free-solutions.org:3479', credential: 'tatafutz',username: 'turnuser'}]}", 89 | "ofmeetWebAuthnEnabled": false, 90 | "ofmeetWinSSOEnabled": false, 91 | "p2p": { 92 | "disableH264": true, 93 | "enableUnifiedOnChrome": true, 94 | "preferH264": false, 95 | "preferredCodec": "VP9", 96 | "useStunTurn": true, 97 | "enabled": true 98 | }, 99 | "disableRtx": false, 100 | "desktopSharingChromeSources": [ 101 | "screen", 102 | "window", 103 | "tab" 104 | ], 105 | "webrtcIceUdpDisable": false, 106 | "disableSimulcast": true, 107 | "startAudioOnly": false, 108 | "ofmeetLiveStream": false, 109 | "focusUserJid": "focus@pade.chat", 110 | "isBrand": false 111 | }; -------------------------------------------------------------------------------- /docs/config_custom.js: -------------------------------------------------------------------------------- 1 | const welcomeEle = document.getElementById("welcome-page-additional-content-template"); 2 | if (welcomeEle) welcomeEle.innerHTML = interfaceConfig.OFMEET_WELCOME_PAGE_CONTENT; 3 | 4 | const settingsEle = document.getElementById("settings-toolbar-additional-content-template"); 5 | if (settingsEle) settingsEle.innerHTML = interfaceConfig.OFMEET_WELCOME_PAGE_TOOLBARCONTENT; 6 | 7 | if (location.hash.indexOf("interfaceConfig.OFMEET_RECORD_CONFERENCE=true") > -1) interfaceConfig.OFMEET_RECORD_CONFERENCE = true; 8 | if (location.hash.indexOf("interfaceConfig.OFMEET_RECORD_CONFERENCE=false") > -1) interfaceConfig.OFMEET_RECORD_CONFERENCE = false; 9 | 10 | if (location.hash.indexOf("interfaceConfig.OFMEET_ENABLE_TRANSCRIPTION=true") > -1) interfaceConfig.OFMEET_ENABLE_TRANSCRIPTION = true; 11 | if (location.hash.indexOf("interfaceConfig.OFMEET_ENABLE_TRANSCRIPTION=false") > -1) interfaceConfig.OFMEET_ENABLE_TRANSCRIPTION = false; 12 | 13 | if (location.hash.indexOf("interfaceConfig.OFMEET_ENABLE_CAPTIONS=true") > -1) interfaceConfig.OFMEET_ENABLE_CAPTIONS = true; 14 | if (location.hash.indexOf("interfaceConfig.OFMEET_ENABLE_CAPTIONS=false") > -1) interfaceConfig.OFMEET_ENABLE_CAPTIONS = false; 15 | 16 | if (location.hash.indexOf("interfaceConfig.OFMEET_ENABLE_BREAKOUT=true") > -1) interfaceConfig.OFMEET_ENABLE_BREAKOUT = true; 17 | if (location.hash.indexOf("interfaceConfig.OFMEET_ENABLE_BREAKOUT=false") > -1) interfaceConfig.OFMEET_ENABLE_BREAKOUT = false; 18 | 19 | if (location.hash.indexOf("interfaceConfig.OFMEET_CONTACTS_MGR=true") > -1) interfaceConfig.OFMEET_CONTACTS_MGR = true; 20 | if (location.hash.indexOf("interfaceConfig.OFMEET_CONTACTS_MGR=false") > -1) interfaceConfig.OFMEET_CONTACTS_MGR = false; 21 | -------------------------------------------------------------------------------- /docs/connection.js: -------------------------------------------------------------------------------- 1 | /* global APP, JitsiMeetJS, config */ 2 | 3 | import { jitsiLocalStorage } from '@jitsi/js-utils'; 4 | import Logger from '@jitsi/logger'; 5 | 6 | import { redirectToTokenAuthService } from './modules/UI/authentication/AuthHandler'; 7 | import { LoginDialog } from './react/features/authentication/components'; 8 | import { isTokenAuthEnabled } from './react/features/authentication/functions'; 9 | import { 10 | connectionEstablished, 11 | connectionFailed, 12 | constructOptions 13 | } from './react/features/base/connection/actions'; 14 | import { openDialog } from './react/features/base/dialog/actions'; 15 | import { setJWT } from './react/features/base/jwt'; 16 | import { 17 | JitsiConnectionErrors, 18 | JitsiConnectionEvents 19 | } from './react/features/base/lib-jitsi-meet'; 20 | import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions'; 21 | import { getCustomerDetails } from './react/features/jaas/actions.any'; 22 | import { getJaasJWT, isVpaasMeeting } from './react/features/jaas/functions'; 23 | import { 24 | setPrejoinDisplayNameRequired 25 | } from './react/features/prejoin/actions'; 26 | const logger = Logger.getLogger(__filename); 27 | 28 | /** 29 | * The feature announced so we can distinguish jibri participants. 30 | * 31 | * @type {string} 32 | */ 33 | export const DISCO_JIBRI_FEATURE = 'http://jitsi.org/protocol/jibri'; 34 | 35 | /** 36 | * Checks if we have data to use attach instead of connect. If we have the data 37 | * executes attach otherwise check if we have to wait for the data. If we have 38 | * to wait for the attach data we are setting handler to APP.connect.handler 39 | * which is going to be called when the attach data is received otherwise 40 | * executes connect. 41 | * 42 | * @param {string} [id] user id 43 | * @param {string} [password] password 44 | * @param {string} [roomName] the name of the conference. 45 | */ 46 | function checkForAttachParametersAndConnect(id, password, connection) { 47 | if (window.XMPPAttachInfo) { 48 | APP.connect.status = 'connecting'; 49 | 50 | // When connection optimization is not deployed or enabled the default 51 | // value will be window.XMPPAttachInfo.status = "error" 52 | // If the connection optimization is deployed and enabled and there is 53 | // a failure the value will be window.XMPPAttachInfo.status = "error" 54 | if (window.XMPPAttachInfo.status === 'error') { 55 | connection.connect({ 56 | id, 57 | password 58 | }); 59 | 60 | return; 61 | } 62 | 63 | const attachOptions = window.XMPPAttachInfo.data; 64 | 65 | if (attachOptions) { 66 | connection.attach(attachOptions); 67 | delete window.XMPPAttachInfo.data; 68 | } else { 69 | connection.connect({ 70 | id, 71 | password 72 | }); 73 | } 74 | } else { 75 | APP.connect.status = 'ready'; 76 | APP.connect.handler 77 | = checkForAttachParametersAndConnect.bind( 78 | null, 79 | id, password, connection); 80 | } 81 | } 82 | 83 | /** 84 | * Try to open connection using provided credentials. 85 | * @param {string} [id] 86 | * @param {string} [password] 87 | * @returns {Promise} connection if 88 | * everything is ok, else error. 89 | */ 90 | export async function connect(id, password) { 91 | const state = APP.store.getState(); 92 | let { jwt } = state['features/base/jwt']; 93 | const { iAmRecorder, iAmSipGateway } = state['features/base/config']; 94 | 95 | if (!iAmRecorder && !iAmSipGateway && isVpaasMeeting(state)) { 96 | await APP.store.dispatch(getCustomerDetails()); 97 | 98 | if (!jwt) { 99 | jwt = await getJaasJWT(state); 100 | APP.store.dispatch(setJWT(jwt)); 101 | } 102 | } 103 | 104 | const connection = new JitsiMeetJS.JitsiConnection(null, jwt, constructOptions(state)); 105 | 106 | if (config.iAmRecorder) { 107 | connection.addFeature(DISCO_JIBRI_FEATURE); 108 | } 109 | 110 | return new Promise((resolve, reject) => { 111 | connection.addEventListener( 112 | JitsiConnectionEvents.CONNECTION_ESTABLISHED, 113 | handleConnectionEstablished); 114 | connection.addEventListener( 115 | JitsiConnectionEvents.CONNECTION_FAILED, 116 | handleConnectionFailed); 117 | connection.addEventListener( 118 | JitsiConnectionEvents.CONNECTION_FAILED, 119 | connectionFailedHandler); 120 | connection.addEventListener( 121 | JitsiConnectionEvents.DISPLAY_NAME_REQUIRED, 122 | displayNameRequiredHandler 123 | ); 124 | 125 | /* eslint-disable max-params */ 126 | /** 127 | * 128 | */ 129 | function connectionFailedHandler(error, message, credentials, details) { 130 | /* eslint-enable max-params */ 131 | APP.store.dispatch( 132 | connectionFailed( 133 | connection, { 134 | credentials, 135 | details, 136 | message, 137 | name: error 138 | })); 139 | 140 | if (isFatalJitsiConnectionError(error)) { 141 | connection.removeEventListener( 142 | JitsiConnectionEvents.CONNECTION_FAILED, 143 | connectionFailedHandler); 144 | } 145 | } 146 | 147 | /** 148 | * 149 | */ 150 | function unsubscribe() { 151 | connection.removeEventListener( 152 | JitsiConnectionEvents.CONNECTION_ESTABLISHED, 153 | handleConnectionEstablished); 154 | connection.removeEventListener( 155 | JitsiConnectionEvents.CONNECTION_FAILED, 156 | handleConnectionFailed); 157 | } 158 | 159 | /** 160 | * 161 | */ 162 | function handleConnectionEstablished() { 163 | APP.store.dispatch(connectionEstablished(connection, Date.now())); 164 | unsubscribe(); 165 | resolve(connection); 166 | } 167 | 168 | /** 169 | * 170 | */ 171 | function handleConnectionFailed(err) { 172 | unsubscribe(); 173 | logger.error('CONNECTION FAILED:', err); 174 | reject(err); 175 | } 176 | 177 | /** 178 | * Marks the display name for the prejoin screen as required. 179 | * This can happen if a user tries to join a room with lobby enabled. 180 | */ 181 | function displayNameRequiredHandler() { 182 | APP.store.dispatch(setPrejoinDisplayNameRequired()); 183 | } 184 | 185 | checkForAttachParametersAndConnect(id, password, connection); 186 | }); 187 | } 188 | 189 | /** 190 | * Open JitsiConnection using provided credentials. 191 | * If retry option is true it will show auth dialog on PASSWORD_REQUIRED error. 192 | * 193 | * @param {object} options 194 | * @param {string} [options.id] 195 | * @param {string} [options.password] 196 | * @param {string} [options.roomName] 197 | * @param {boolean} [retry] if we should show auth dialog 198 | * on PASSWORD_REQUIRED error. 199 | * 200 | * @returns {Promise} 201 | */ 202 | export function openConnection({ id, password, retry, roomName }) { 203 | const usernameOverride 204 | = jitsiLocalStorage.getItem('xmpp_username_override'); 205 | const passwordOverride 206 | = jitsiLocalStorage.getItem('xmpp_password_override'); 207 | 208 | if (usernameOverride && usernameOverride.length > 0) { 209 | id = usernameOverride; // eslint-disable-line no-param-reassign 210 | } 211 | if (passwordOverride && passwordOverride.length > 0) { 212 | password = passwordOverride; // eslint-disable-line no-param-reassign 213 | } 214 | 215 | return connect(id, password, roomName).catch(err => { 216 | if (retry) { 217 | const { jwt } = APP.store.getState()['features/base/jwt']; 218 | 219 | if (err === JitsiConnectionErrors.PASSWORD_REQUIRED && !jwt) { 220 | return requestAuth(roomName); 221 | } 222 | } 223 | 224 | throw err; 225 | }); 226 | } 227 | 228 | /** 229 | * Show Authentication Dialog and try to connect with new credentials. 230 | * If failed to connect because of PASSWORD_REQUIRED error 231 | * then ask for password again. 232 | * @param {string} [roomName] name of the conference room 233 | * 234 | * @returns {Promise} 235 | */ 236 | function requestAuth(roomName) { 237 | const config = APP.store.getState()['features/base/config']; 238 | 239 | if (isTokenAuthEnabled(config)) { 240 | // This Promise never resolves as user gets redirected to another URL 241 | return new Promise(() => redirectToTokenAuthService(roomName)); 242 | } 243 | 244 | return new Promise(resolve => { 245 | const onSuccess = connection => { 246 | resolve(connection); 247 | }; 248 | 249 | APP.store.dispatch( 250 | openDialog(LoginDialog, { onSuccess, 251 | roomName }) 252 | ); 253 | }); 254 | } 255 | -------------------------------------------------------------------------------- /docs/connection_optimization/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'extends': '../react/.eslintrc.js' 3 | }; 4 | -------------------------------------------------------------------------------- /docs/connection_optimization/connection_optimization.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/connection_optimization/connection_optimization.html -------------------------------------------------------------------------------- /docs/connection_optimization/do_external_connect.js: -------------------------------------------------------------------------------- 1 | /* global config, createConnectionExternally */ 2 | 3 | import getRoomName from '../react/features/base/config/getRoomName'; 4 | import { parseURLParams } from '../react/features/base/util/parseURLParams'; 5 | 6 | /** 7 | * Implements external connect using createConnectionExternally function defined 8 | * in external_connect.js for Jitsi Meet. Parses the room name and JSON Web 9 | * Token (JWT) from the URL and executes createConnectionExternally. 10 | * 11 | * NOTE: If you are using lib-jitsi-meet without Jitsi Meet, you should use this 12 | * file as reference only because the implementation is Jitsi Meet-specific. 13 | * 14 | * NOTE: For optimal results this file should be included right after 15 | * external_connect.js. 16 | */ 17 | 18 | if (typeof createConnectionExternally === 'function') { 19 | // URL params have higher priority than config params. 20 | // Do not use external connect if websocket is enabled. 21 | let url 22 | = parseURLParams(window.location, true, 'hash')[ 23 | 'config.externalConnectUrl'] 24 | || config.websocket ? undefined : config.externalConnectUrl; 25 | const isRecorder 26 | = parseURLParams(window.location, true, 'hash')['config.iAmRecorder']; 27 | 28 | let roomName; 29 | 30 | if (url && (roomName = getRoomName()) && !isRecorder) { 31 | url += `?room=${roomName}`; 32 | 33 | const token = parseURLParams(window.location, true, 'search').jwt; 34 | 35 | if (token) { 36 | url += `&token=${token}`; 37 | } 38 | 39 | createConnectionExternally( 40 | url, 41 | connectionInfo => { 42 | // Sets that global variable to be used later by connect method 43 | // in connection.js. 44 | window.XMPPAttachInfo = { 45 | status: 'success', 46 | data: connectionInfo 47 | }; 48 | checkForConnectHandlerAndConnect(); 49 | }, 50 | errorCallback); 51 | } else { 52 | errorCallback(); 53 | } 54 | } else { 55 | errorCallback(); 56 | } 57 | 58 | /** 59 | * Check if connect from connection.js was executed and executes the handler 60 | * that is going to finish the connect work. 61 | * 62 | * @returns {void} 63 | */ 64 | function checkForConnectHandlerAndConnect() { 65 | window.APP 66 | && window.APP.connect.status === 'ready' 67 | && window.APP.connect.handler(); 68 | } 69 | 70 | /** 71 | * Implements a callback to be invoked if anything goes wrong. 72 | * 73 | * @param {Error} error - The specifics of what went wrong. 74 | * @returns {void} 75 | */ 76 | function errorCallback(error) { 77 | // The value of error is undefined if external connect is disabled. 78 | error && console.warn(error); 79 | 80 | // Sets that global variable to be used later by connect method in 81 | // connection.js. 82 | window.XMPPAttachInfo = { 83 | status: 'error' 84 | }; 85 | checkForConnectHandlerAndConnect(); 86 | } 87 | -------------------------------------------------------------------------------- /docs/countrycodes.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "United States", 4 | "dialCode": "+1", 5 | "code": "US" 6 | }, 7 | { 8 | "name": "Australia", 9 | "dialCode": "+61", 10 | "code": "AU" 11 | }, 12 | { 13 | "name": "Canada", 14 | "dialCode": "+1", 15 | "code": "CA" 16 | }, 17 | { 18 | "name": "France", 19 | "dialCode": "+33", 20 | "code": "FR" 21 | }, 22 | { 23 | "name": "Germany", 24 | "dialCode": "+49", 25 | "code": "DE" 26 | }, 27 | { 28 | "name": "Netherlands", 29 | "dialCode": "+31", 30 | "code": "NL" 31 | }, 32 | { 33 | "name": "United Kingdom", 34 | "dialCode": "+44", 35 | "code": "GB" 36 | } 37 | ] -------------------------------------------------------------------------------- /docs/cursor.css: -------------------------------------------------------------------------------- 1 | .togetherjs * { 2 | box-sizing: content-box !important; 3 | } 4 | 5 | .togetherjs-cursor { 6 | position: absolute; 7 | z-index: 999999; 8 | /* This magic CSS rule makes this element basically invisible to clicks/etc: 9 | (good on all but IE: http://caniuse.com/pointer-events */ 10 | pointer-events: none; 11 | /*FIXME: maybe these should use position: fixed so the cursor 12 | stays stuck to the top of the screen until the appropriate time 13 | (when .togetherjs-scrolled-above/below is removed)?*/ 14 | top: 0; 15 | left: 0; 16 | } 17 | 18 | .togetherjs-cursor svg { 19 | filter: drop-shadow(1px 3px 2px rgba(0, 0, 0, 0.3)); 20 | } 21 | 22 | .togetherjs-cursor .togetherjs-cursor-container { 23 | opacity: 0.9; 24 | white-space: nowrap; 25 | font-family: openSansLight, Helvetica, 'Helvetica Neue', Arial, sans-serif; 26 | font-size: 10px; 27 | font-weight: 500; 28 | margin: 5px 0 0 10px; 29 | padding: 5px 8px; 30 | border-radius: 4px; 31 | border: 1px solid rgba(0, 0, 0, 0.2); 32 | box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.5); 33 | } 34 | 35 | @keyframes clicking { 36 | from { 37 | width: 10px; 38 | height: 10px; 39 | margin: -5px 0 0 -5px; 40 | opacity: 1; 41 | } 42 | to { 43 | width: 60px; 44 | height: 60px; 45 | margin: -30px 0 0 -30px; 46 | opacity: 0; 47 | } 48 | } 49 | 50 | .togetherjs-click { 51 | position: absolute; 52 | z-index: 999998; 53 | pointer-events: none; 54 | border-radius: 50%; 55 | border: 3px solid; 56 | border-color: #ff3a29; 57 | box-sizing: border-box; 58 | animation-name: clicking; 59 | animation-duration: 2s; 60 | animation-timing-function: ease-out; 61 | animation-fill-mode: both; 62 | } 63 | -------------------------------------------------------------------------------- /docs/custom_ofmeet.css: -------------------------------------------------------------------------------- 1 | /* 2 | Fix issue #195 - Room "In Progress..." does not show up on Android 3 | */ 4 | @media only screen and (max-width:500px) { 5 | .welcome .welcome-tabs { 6 | display: unset 7 | } 8 | } 9 | 10 | .fc-timegrid-slot-label-cushion, .fc-timegrid-axis-cushion { 11 | color: black; 12 | } 13 | 14 | /* <<< 20220409/G.Jaekel@DNB.DE make raisehand more noticable */ 15 | div.jss3, /* info-box */ 16 | div.jss33, /* participats window & filmstrip */ 17 | div.indicators div:not(.jitsi-icon-default) { /* participant plane */ 18 | animation-name: raisehand; 19 | animation-duration: 5s; 20 | animation-direction: alternate; 21 | animation-delay: 30s; 22 | animation-iteration-count: infinite; 23 | animation-timing-function: ease-in; 24 | } 25 | 26 | @keyframes raisehand { 27 | from { 28 | background-color: #FFD600; 29 | } 30 | 31 | to { 32 | background-color: #FF6000; 33 | transform: scale(1.2); 34 | } 35 | } 36 | 37 | /* >>> */ 38 | 39 | .speaker-room-button { 40 | border: 0; 41 | font-size: 14px; 42 | background: #0074e0; 43 | border-radius: 3px; 44 | color: #fff; 45 | cursor: pointer; 46 | padding: 16px 20px; 47 | } 48 | 49 | .speaker-room-button svg { 50 | fill: #fff; 51 | } 52 | 53 | /* 54 | * 20200522/G.Jaekel@DNB.DE On small browser windows, the left toolbar renders to wide. Make it wrapping around. 55 | * 20210109/G.Jaekel@DNB.DE The same issue rises for the right toolbar, meanwhile 56 | */ 57 | .new-toolbox { 58 | bottom: calc((40px * 3) * -1); 59 | /* was: calc((40px * 2) * -1); */ 60 | } 61 | 62 | .button-group-left { 63 | flex-wrap: wrap; 64 | } 65 | 66 | .button-group-right { 67 | flex-wrap: wrap; 68 | } 69 | 70 | 71 | /* 72 | * 20210104/gj Allow the Conferences Display at the Welcome Page to show more entires 73 | */ 74 | .welcome .tab-container .tab-content { 75 | height: unset; 76 | max-height: 500pt; 77 | } 78 | 79 | .new-toolbox .toolbox-content .toolbox-button .toolbox-icon svg { 80 | width: 24px; 81 | height: 24px; 82 | } 83 | 84 | .ofmeet-tooltip { 85 | position: relative; 86 | } 87 | 88 | .ofmeet-tooltip::after { 89 | background-color: rgb(13, 20, 36); 90 | border-radius: 3px; 91 | color: #fff; 92 | content: attr(aria-label); 93 | display: block; 94 | font-size: 12px; 95 | font-weight: 400; 96 | line-height: 14px; 97 | margin: 0; 98 | overflow-wrap: break-word; 99 | opacity: 0; 100 | padding: 8px; 101 | position: absolute; 102 | pointer-events: none; 103 | top: 0; 104 | left: 0; 105 | transform: translate(calc(-50% + 20px), calc(-100% - 8px)); 106 | transition-delay: 0.5s; 107 | transition-duration: 0.3s; 108 | transition-property: opacity; 109 | transition-timing-function: cubic-bezier(0.23, 1, 0.32, 1), linear; 110 | white-space: nowrap; 111 | user-select: none; 112 | z-index: 800; 113 | } 114 | 115 | .ofmeet-tooltip:hover { 116 | cursor: pointer; 117 | } 118 | 119 | .ofmeet-tooltip:hover::after { 120 | opacity: 1; 121 | visibility: visible; 122 | } 123 | 124 | .ofmeet-toolbox-small-icon { 125 | cursor: pointer; 126 | background: #36383c; 127 | box-shadow: 0 4px 4px rgb(0 0 0 / 25%), 0 0 0 1px rgb(0 0 0 / 10%); 128 | border-radius: 3px; 129 | padding: 4px; 130 | position: absolute; 131 | right: -4px; 132 | top: -3px; 133 | } 134 | 135 | @media only screen and (max-width: 500px) { 136 | .ofmeet-toolbox-small-icon { 137 | display: none; 138 | } 139 | } 140 | 141 | .ofmeet-toolbox-small-icon:hover { 142 | background: #f2f3f4; 143 | } 144 | 145 | .ofmeet-toolbox-small-icon>svg { 146 | fill: #fff; 147 | } 148 | 149 | .ofmeet-toolbox-small-icon:hover>svg { 150 | fill: #000; 151 | } 152 | 153 | .toolbox-button-wth-dialog { 154 | position: relative 155 | } 156 | 157 | .ofmeet-toolbox-menu-container { 158 | position: absolute; 159 | overflow-y: visible !important; 160 | } 161 | 162 | .ofmeet-toolbox-menu { 163 | background: rgb(36, 37, 40); 164 | border-radius: 3px; 165 | box-sizing: content-box; 166 | color: rgb(255, 255, 255); 167 | max-height: calc(100vh - calc(48px + 24px) - 46px); 168 | max-width: 448px; 169 | padding: 0; 170 | position: absolute; 171 | bottom: 60px; 172 | z-index: 300; 173 | box-shadow: rgb(13 20 36 / 85%) 0px 4px 8px -2px, rgb(13 20 36 / 81%) 0px 0px 1px; 174 | transform: translateX(calc(-100% + 48px)); 175 | } 176 | 177 | .ofmeet-toolbox-menu ul{ 178 | margin: 0; 179 | padding: 0; 180 | list-style-type: none; 181 | } 182 | 183 | .button-group-left .ofmeet-toolbox-menu { 184 | left: 0; 185 | } 186 | 187 | .button-group-right .ofmeet-toolbox-menu { 188 | right: 0; 189 | } 190 | 191 | .ofmeet-toolbox-tile-menu ul { 192 | display: flex; 193 | flex-wrap: wrap; 194 | width: 230px; 195 | } 196 | 197 | .ofmeet-toolbox-menu-item { 198 | display: flex; 199 | align-items: center; 200 | color: rgb(255, 255, 255); 201 | cursor: pointer; 202 | padding: 5px; 203 | text-align: center; 204 | } 205 | 206 | .ofmeet-toolbox-list-menu .ofmeet-toolbox-menu-item { 207 | font-size: 14px; 208 | height: 24px; 209 | line-height: 24px; 210 | padding: 8px 16px; 211 | text-align: left; 212 | white-space: nowrap; 213 | } 214 | 215 | .ofmeet-toolbox-tile-menu .ofmeet-toolbox-menu-item { 216 | justify-content: center; 217 | height: 36px; 218 | width: 36px; 219 | } 220 | 221 | .ofmeet-toolbox-menu-item:hover { 222 | background-color: rgb(54, 56, 60); 223 | } 224 | 225 | .ofmeet-toolbox-menu-item * { 226 | pointer-events: none 227 | } 228 | 229 | .ofmeet-toolbox-menu-item svg { 230 | fill: rgb(255, 255, 255) !important; 231 | } 232 | 233 | .ofmeet-toolbox-menu-item .jitsi-icon { 234 | display: flex; 235 | justify-content: center; 236 | align-items: center; 237 | font-size: 24px; 238 | margin: auto; 239 | height: 24px; 240 | width: 24px; 241 | text-align: center; 242 | } 243 | 244 | .new-toolbox .toolbox-content .overflow-menu .profile-text { 245 | max-width: 250px; 246 | } 247 | 248 | .popupmenu { 249 | width: auto; 250 | max-width: 250px; 251 | } 252 | 253 | .breakout-modal .participants .kanban-title-button { 254 | display: none; 255 | } 256 | 257 | #breakout-option { 258 | flex: none; 259 | margin: 0 30px; 260 | } 261 | 262 | #breakout-status { 263 | flex: auto; 264 | color: #ff5983; 265 | font-size: 16px; 266 | line-height: 36px; 267 | } 268 | 269 | #breakout-clock { 270 | flex: auto; 271 | font-size: 18px; 272 | font-weight: 600; 273 | margin-right: 30px; 274 | line-height: 36px; 275 | text-align: right; 276 | } 277 | 278 | .tags-modal .tingle-modal-box { 279 | width: 600px; 280 | } 281 | 282 | /* avoid the info head line to overlay the participant widnow menu icons (#397) */ 283 | .details-container { 284 | top: 24px; /* instead of 0px */ 285 | } 286 | -------------------------------------------------------------------------------- /docs/dayjs.min.js: -------------------------------------------------------------------------------- 1 | !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):t.dayjs=n()}(this,function(){"use strict";var t="millisecond",n="second",e="minute",r="hour",i="day",s="week",u="month",o="quarter",a="year",h=/^(\d{4})-?(\d{1,2})-?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d{1,3})?$/,f=/\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,c=function(t,n,e){var r=String(t);return!r||r.length>=n?t:""+Array(n+1-r.length).join(e)+t},d={s:c,z:function(t){var n=-t.utcOffset(),e=Math.abs(n),r=Math.floor(e/60),i=e%60;return(n<=0?"+":"-")+c(r,2,"0")+":"+c(i,2,"0")},m:function(t,n){var e=12*(n.year()-t.year())+(n.month()-t.month()),r=t.clone().add(e,u),i=n-r<0,s=t.clone().add(e+(i?-1:1),u);return Number(-(e+(n-r)/(i?r-s:s-r))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(h){return{M:u,y:a,w:s,d:i,D:"date",h:r,m:e,s:n,ms:t,Q:o}[h]||String(h||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},$={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},l="en",m={};m[l]=$;var y=function(t){return t instanceof v},M=function(t,n,e){var r;if(!t)return l;if("string"==typeof t)m[t]&&(r=t),n&&(m[t]=n,r=t);else{var i=t.name;m[i]=t,r=i}return e||(l=r),r},g=function(t,n,e){if(y(t))return t.clone();var r=n?"string"==typeof n?{format:n,pl:e}:n:{};return r.date=t,new v(r)},D=d;D.l=M,D.i=y,D.w=function(t,n){return g(t,{locale:n.$L,utc:n.$u,$offset:n.$offset})};var v=function(){function c(t){this.$L=this.$L||M(t.locale,null,!0),this.parse(t)}var d=c.prototype;return d.parse=function(t){this.$d=function(t){var n=t.date,e=t.utc;if(null===n)return new Date(NaN);if(D.u(n))return new Date;if(n instanceof Date)return new Date(n);if("string"==typeof n&&!/Z$/i.test(n)){var r=n.match(h);if(r)return e?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(n)}(t),this.init()},d.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},d.$utils=function(){return D},d.isValid=function(){return!("Invalid Date"===this.$d.toString())},d.isSame=function(t,n){var e=g(t);return this.startOf(n)<=e&&e<=this.endOf(n)},d.isAfter=function(t,n){return g(t) 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /docs/images/downloadLocalRecording.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/downloadLocalRecording.png -------------------------------------------------------------------------------- /docs/images/dropboxLogo_square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/dropboxLogo_square.png -------------------------------------------------------------------------------- /docs/images/f-droid-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/f-droid-badge.png -------------------------------------------------------------------------------- /docs/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/favicon.ico -------------------------------------------------------------------------------- /docs/images/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/flags.png -------------------------------------------------------------------------------- /docs/images/flags@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/flags@2x.png -------------------------------------------------------------------------------- /docs/images/google-play-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/google-play-badge.png -------------------------------------------------------------------------------- /docs/images/googleLogo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/images/icon-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/icon-cloud.png -------------------------------------------------------------------------------- /docs/images/icon-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/icon-info.png -------------------------------------------------------------------------------- /docs/images/icon-users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/icon-users.png -------------------------------------------------------------------------------- /docs/images/jitsilogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/jitsilogo.png -------------------------------------------------------------------------------- /docs/images/logo-deep-linking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/logo-deep-linking.png -------------------------------------------------------------------------------- /docs/images/microsoftLogo.svg: -------------------------------------------------------------------------------- 1 | MS-SymbolLockup -------------------------------------------------------------------------------- /docs/images/share-audio.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/share-audio.gif -------------------------------------------------------------------------------- /docs/images/virtual-background/background-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/virtual-background/background-1.jpg -------------------------------------------------------------------------------- /docs/images/virtual-background/background-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/virtual-background/background-2.jpg -------------------------------------------------------------------------------- /docs/images/virtual-background/background-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/virtual-background/background-3.jpg -------------------------------------------------------------------------------- /docs/images/virtual-background/background-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/virtual-background/background-4.jpg -------------------------------------------------------------------------------- /docs/images/virtual-background/background-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/virtual-background/background-5.jpg -------------------------------------------------------------------------------- /docs/images/virtual-background/background-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/virtual-background/background-6.jpg -------------------------------------------------------------------------------- /docs/images/virtual-background/background-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/virtual-background/background-7.jpg -------------------------------------------------------------------------------- /docs/images/welcome-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/images/welcome-background.png -------------------------------------------------------------------------------- /docs/index.android.js: -------------------------------------------------------------------------------- 1 | import './react/index.native'; 2 | 3 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 47 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 |
201 |
202 |
203 |
204 | 205 | 206 | -------------------------------------------------------------------------------- /docs/index.ios.js: -------------------------------------------------------------------------------- 1 | import './react/index.native'; 2 | 3 | -------------------------------------------------------------------------------- /docs/interface_config.js: -------------------------------------------------------------------------------- 1 | var interfaceConfig = { 2 | "ACTIVE_SPEAKER_AVATAR_SIZE": 100, 3 | "OFMEET_CACHE_PASSWORD": false, 4 | "OFMEET_ALLOW_UPLOADS": false, 5 | "OFMEET_ENABLE_CAPTIONS": false, 6 | "SHOW_POWERED_BY": false, 7 | "APP_NAME": "Pade Meetings", 8 | "OFMEET_ENABLE_BREAKOUT": false, 9 | "SHOW_PROMOTIONAL_CLOSE_PAGE": false, 10 | "SHADOW_COLOR": "#ffffff", 11 | "JITSI_WATERMARK_LINK": "", 12 | "SHOW_BRAND_WATERMARK": false, 13 | "RANDOM_AVATAR_URL_SUFFIX": "", 14 | "OFMEET_WHITEBOARD_URL": "https://wbo.ophir.dev/boards/", 15 | "DISPLAY_WELCOME_PAGE_CONTENT": true, 16 | "SHOW_JITSI_WATERMARK": false, 17 | "VIDEO_LAYOUT_FIT": "both", 18 | "CANVAS_EXTRA": 104, 19 | "TILE_VIEW_MAX_COLUMNS": 5, 20 | "LOCAL_THUMBNAIL_RATIO": 1.7777777777777777, 21 | "TOOLBAR_BUTTONS": [ 22 | "microphone", 23 | "camera", 24 | "closedcaptions", 25 | "embedmeeting", 26 | "desktop", 27 | "fullscreen", 28 | "fodeviceselection", 29 | "hangup", 30 | "profile", 31 | "chat", 32 | "recording", 33 | "livestreaming", 34 | "etherpad", 35 | "sharedvideo", 36 | "shareaudio", 37 | "settings", 38 | "raisehand", 39 | "videoquality", 40 | "filmstrip", 41 | "invite", 42 | "feedback", 43 | "stats", 44 | "shortcuts", 45 | "tileview", 46 | "select-background", 47 | "download", 48 | "help", 49 | "mute-everyone", 50 | "mute-video-everyone", 51 | "security" 52 | ], 53 | "RANDOM_AVATAR_URL_PREFIX": "", 54 | "DEFAULT_DOMINANT_SPEAKER_DISPLAY_NAME": "Speaker", 55 | "OFMEET_WELCOME_PAGE_TOOLBARCONTENT": "", 56 | "FILM_STRIP_MAX_HEIGHT": 120, 57 | "SETTINGS_SECTIONS": [ 58 | "language", 59 | "devices", 60 | "moderator", 61 | "profile", 62 | "calendar" 63 | ], 64 | "DEFAULT_LOGO_URL": "", 65 | "OFMEET_CONFETTI_EMOTICON_ENABLED": true, 66 | "INVITATION_POWERED_BY": true, 67 | "INVITE_OPTIONS": ["invite"], 68 | "IN_PROGRESS_LIST_INTERVAL": 10, 69 | "DEFAULT_WELCOME_PAGE_LOGO_URL": "", 70 | "INITIAL_TOOLBAR_TIMEOUT": 20000, 71 | "DISPLAY_WELCOME_PAGE_TOOLBAR_ADDITIONAL_CONTENT": true, 72 | "LANG_DETECTION": false, 73 | "SHOW_CONTACTLIST_AVATARS": false, 74 | "DISABLE_VIDEO_BACKGROUND": false, 75 | "OFMEET_MOUSECURSOR_TIMEOUT": 10000, 76 | "OFMEET_WELCOME_PAGE_DESCRIPTION": "Welcome to Pade Meetings", 77 | "OFMEET_CRYPTPAD_URL": "https://cryptpad.fr", 78 | "OFMEET_TAG_CONFERENCE": true, 79 | "filmStripOnly": false, 80 | "REMOTE_THUMBNAIL_RATIO": 1, 81 | "AUTO_PIN_LATEST_SCREEN_SHARE": "false", 82 | "OFMEET_WELCOME_PAGE_TITLE": "Pade Meetings", 83 | "OFMEET_CONFETTI_EMOTICON_CLOSE_MENU": true, 84 | "OFMEET_STARTWITH_TRANSCRIPTION_DISABLED": true, 85 | "HIDE_INVITE_MORE_HEADER": true, 86 | "DEFAULT_BACKGROUND": "#474747", 87 | "BRAND_WATERMARK_LINK": "", 88 | "DISABLE_FOCUS_INDICATOR": false, 89 | "OFMEET_ENABLE_CRYPTPAD": true, 90 | "VERTICAL_FILMSTRIP": true, 91 | "IN_PROGRESS_LIST_ENABLED": true, 92 | "OFMEET_CONTACTS_MGR": false, 93 | "OFMEET_ENABLE_WHITEBOARD": true, 94 | "OFMEET_RECORD_CONFERENCE": true, 95 | "CANVAS_RADIUS": 7, 96 | "ENABLE_FEEDBACK_ANIMATION": false, 97 | "OFMEET_CHAT_CAPTIONS_TIMEOUT": 0, 98 | "OFMEET_ENABLE_CONFETTI": true, 99 | "DEFAULT_REMOTE_DISPLAY_NAME": "Change Me", 100 | "OFMEET_ENABLE_TRANSCRIPTION": false, 101 | "OFMEET_WELCOME_PAGE_CONTENT": "Video conference meetings on demand", 102 | "TOOLBAR_TIMEOUT": 4000, 103 | "GENERATE_ROOMNAMES_ON_WELCOME_PAGE": false, 104 | "DEFAULT_LOCAL_DISPLAY_NAME": "Me", 105 | "OFMEET_CONFETTI_EMOTICON_LIST": "😀😄😅😂🙂🙃😊😇😛😍😘😛🤔❤⭐🌸🍺👍", 106 | "OFMEET_STARTWITH_CAPTIONS_DISABLED": true, 107 | "ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT": "15000", 108 | "OFMEET_ENABLE_MOUSE_SHARING": true, 109 | "RECENT_LIST_ENABLED": false 110 | }; -------------------------------------------------------------------------------- /docs/jkanban.css: -------------------------------------------------------------------------------- 1 | .kanban-container { 2 | position: relative; 3 | box-sizing: border-box; 4 | width: auto; 5 | } 6 | 7 | .kanban-container * { 8 | box-sizing: border-box; 9 | } 10 | 11 | .kanban-container:after { 12 | clear: both; 13 | display: block; 14 | content: ""; 15 | } 16 | 17 | .kanban-board { 18 | position: relative; 19 | float: left; 20 | background: rgb(66, 82, 110); 21 | border-radius: 3px; 22 | transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); 23 | } 24 | 25 | .kanban-board.disabled-board { 26 | opacity: 0.3; 27 | } 28 | 29 | .kanban-board.is-moving.gu-mirror { 30 | transform: rotate(3deg); 31 | } 32 | 33 | .kanban-board.is-moving.gu-mirror .kanban-drag { 34 | overflow: hidden; 35 | padding-right: 50px; 36 | } 37 | 38 | .kanban-board header { 39 | font-size: 16px; 40 | padding: 15px; 41 | } 42 | 43 | .kanban-board header .kanban-title-board { 44 | font-weight: 700; 45 | margin: 0; 46 | padding: 0; 47 | display: inline; 48 | } 49 | 50 | .kanban-board header .kanban-title-button { 51 | float: right; 52 | } 53 | 54 | .kanban-board .kanban-drag { 55 | min-height: 200px; 56 | padding: 20px; 57 | } 58 | 59 | .kanban-board:after { 60 | clear: both; 61 | display: block; 62 | content: ""; 63 | } 64 | 65 | .kanban-item { 66 | background: rgba(13, 20, 36, 0.63); 67 | padding: 10px; 68 | margin-bottom: 10px; 69 | transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); 70 | display: flex; 71 | align-items: center; 72 | border-radius: 3px; 73 | } 74 | 75 | .kanban-item:hover { 76 | cursor: move; 77 | } 78 | 79 | .kanban-item:last-child { 80 | margin: 0; 81 | } 82 | 83 | .kanban-item.is-moving.gu-mirror { 84 | height: auto !important; 85 | } 86 | 87 | .kanban-item .header-icon { 88 | padding-right: 10px; 89 | } 90 | 91 | .kanban-item .header-icon .avatar { 92 | font-size: 12px; 93 | height: 24px; 94 | width: 24px; 95 | } 96 | 97 | .kanban-item.disabled-item { 98 | opacity: 0.5; 99 | pointer-events: none; 100 | } 101 | 102 | .kanban-item.disabled-item:hover { 103 | cursor: default; 104 | } 105 | 106 | 107 | /* Dragula CSS */ 108 | .gu-mirror { 109 | position: fixed !important; 110 | margin: 0 !important; 111 | z-index: 9999 !important; 112 | } 113 | 114 | .gu-hide { 115 | display: none !important; 116 | } 117 | 118 | .gu-unselectable { 119 | -webkit-user-select: none !important; 120 | -moz-user-select: none !important; 121 | -ms-user-select: none !important; 122 | user-select: none !important; 123 | } 124 | 125 | .gu-transit { 126 | opacity: 0.2 !important; 127 | transform: rotate(0deg) !important; 128 | } 129 | 130 | .drag_handler { 131 | background: #fff; 132 | border-radius: 50%; 133 | width: 24px; 134 | height: 24px; 135 | position: relative; 136 | float: left; 137 | top: -3px; 138 | margin-right: 4px; 139 | } 140 | 141 | .drag_handler:hover { 142 | cursor: move; 143 | } 144 | 145 | .drag_handler_icon { 146 | position: relative; 147 | display: block; 148 | background: #000; 149 | width: 24px; 150 | height: 2px; 151 | top: 12px; 152 | transition: .5s ease-in-out; 153 | } 154 | 155 | .drag_handler_icon:before, 156 | .drag_handler_icon:after { 157 | background: #000; 158 | content: ''; 159 | display: block; 160 | width: 100%; 161 | height: 100%; 162 | position: absolute; 163 | transition: .5s ease-in-out; 164 | } 165 | 166 | .drag_handler_icon:before { 167 | top: 6px; 168 | } 169 | 170 | .drag_handler_icon:after { 171 | bottom: 6px; 172 | } 173 | -------------------------------------------------------------------------------- /docs/lang/languages-af.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "", 3 | "bg": "Bulgaars", 4 | "cs": "Tsjeggies", 5 | "de": "Duits", 6 | "el": "Grieks", 7 | "en": "Engels", 8 | "eo": "Esperanto", 9 | "es": "Spaans", 10 | "fr": "Frans", 11 | "hy": "Armeens", 12 | "it": "Italiaans", 13 | "ja": "Japannees", 14 | "ko": "Koreaans", 15 | "nb": "Bokmal-Noorweegs", 16 | "oc": "Oksitaans", 17 | "pl": "Pools", 18 | "ptBR": "Portugees (Brasilië)", 19 | "ru": "Russies", 20 | "sk": "Slowaaks", 21 | "sl": "Sloweens", 22 | "sv": "Sweeds", 23 | "tr": "Turks", 24 | "uk": "Oekraïens", 25 | "vi": "Viëtnamees", 26 | "zhCN": "Sjinees (Sjina)" 27 | } 28 | -------------------------------------------------------------------------------- /docs/lang/languages-ar.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "الأفريكانية", 3 | "ar": "العربية", 4 | "bg": "البلغارية", 5 | "ca": "الكاتالانية", 6 | "cs": "التشيكية", 7 | "da": "الدنماركية", 8 | "de": "الألمانية", 9 | "el": "اليونانية", 10 | "en": "الإنجليزية", 11 | "enGB": "الإنجليزية (المملكة المتحدة)", 12 | "eo": "الإسبرانتو", 13 | "es": "الإسبانية", 14 | "esUS": "الإسبانية (أمريكا اللاتينية)", 15 | "et": "الإستونية", 16 | "eu": "الباسكية", 17 | "fi": "الفنلندية", 18 | "fr": "الفرنسية", 19 | "frCA": "الفرنسية (الكندية)", 20 | "he": "العبرية", 21 | "hr": "الكرواتية", 22 | "hu": "الهنغارية", 23 | "hy": "الأرمنية", 24 | "id": "الإندونيسية", 25 | "it": "الإيطالية", 26 | "ja": "اليابانية", 27 | "kab": "قَبَلي", 28 | "ko": "الكورية", 29 | "lt": "الليتوانية", 30 | "mr": "الماراثى", 31 | "nl": "الهولندية", 32 | "oc": "القسطانية", 33 | "pl": "البولندية", 34 | "ptBR": "البرتغالية (البرازيل)", 35 | "ro": "الرومانية", 36 | "ru": "الروسية", 37 | "sc": "السردينية", 38 | "sk": "السلوفاكية", 39 | "sl": "السلوفينية", 40 | "sv": "السويدية", 41 | "tr": "التركية", 42 | "uk": "الأوكرانية", 43 | "vi": "الفيتنامية", 44 | "zhCN": "الصينية (الصين)", 45 | "zhTW": "الصينية (تايوان)" 46 | } 47 | -------------------------------------------------------------------------------- /docs/lang/languages-be.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Афрыкаанс", 3 | "bg": "Балгарская", 4 | "ca": "Каталанская", 5 | "cs": "Чэшская", 6 | "da": "Дацкая", 7 | "de": "Нямецкая", 8 | "el": "Грэцкая", 9 | "en": "Англійская", 10 | "enGB": "Англійская (Вялікабрытанія)", 11 | "eo": "Эсперанта", 12 | "es": "Іспанская", 13 | "esUS": "Іспанская (Лацінская Амерыка)", 14 | "et": "Эстонская", 15 | "fi": "Фінская", 16 | "fr": "Французская", 17 | "frCA": "Французская (канадская)", 18 | "hr": "Харвацкая", 19 | "hu": "Венгерская", 20 | "hy": "Армянская", 21 | "it": "Італьянская", 22 | "ja": "Японская", 23 | "ko": "Карэйская", 24 | "nl": "Галандская", 25 | "oc": "Аксітанская", 26 | "pl": "Польская", 27 | "ptBR": "Партугальская (Бразілія)", 28 | "ru": "Расійская", 29 | "sv": "Шведская", 30 | "tr": "Турэцкая", 31 | "uk": "Украінская", 32 | "vi": "В'етнамская", 33 | "zhCN": "Кітайская (Кітай)", 34 | "zhTW": "Кітайская (Тайвань)" 35 | } 36 | -------------------------------------------------------------------------------- /docs/lang/languages-bg.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Африканс", 3 | "bg": "Български", 4 | "ca": "Каталонски", 5 | "cs": "Чешки", 6 | "de": "Немски", 7 | "el": "Гръцки", 8 | "en": "Английски", 9 | "enGB": "Английски (Великобритания)", 10 | "eo": "Есперанто", 11 | "es": "Испански", 12 | "esUS": "Испански (Латинска Америка)", 13 | "fi": "Фински", 14 | "fr": "Френски", 15 | "frCA": "Френски (Канада)", 16 | "hr": "Хърватски", 17 | "hu": "Унгарски", 18 | "hy": "Арменски", 19 | "it": "Италиански", 20 | "ja": "Японски", 21 | "ko": "Корейски", 22 | "nl": "Нидерландски", 23 | "oc": "Окситански", 24 | "pl": "Полски", 25 | "ptBR": "Португалски (Бразилия)", 26 | "ru": "Руски", 27 | "sv": "Шведски", 28 | "tr": "Турски", 29 | "uk": "Украински", 30 | "vi": "Виетнамски", 31 | "zhCN": "Китайски (Китай)", 32 | "zhTW": "Тайвански" 33 | } 34 | -------------------------------------------------------------------------------- /docs/lang/languages-ca.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "ar": "Àrab", 4 | "bg": "Búlgar", 5 | "ca": "Català", 6 | "cs": "Txec", 7 | "da": "Danès", 8 | "de": "Alemany", 9 | "el": "Grec", 10 | "en": "Anglès", 11 | "enGB": "Anglès (Regne Unit)", 12 | "eo": "Esperanto", 13 | "es": "Espanyol", 14 | "esUS": "Espanyol (Amèrica llatina)", 15 | "et": "Estonià", 16 | "eu": "Basc", 17 | "fa": "Persa", 18 | "fi": "Finès", 19 | "fr": "Francès", 20 | "frCA": "Francès (Canadà)", 21 | "he": "Hebreu", 22 | "hi": "Hindi", 23 | "hr": "Croat", 24 | "hu": "Hongarès", 25 | "hy": "Armeni", 26 | "id": "Indonesi", 27 | "it": "Italià", 28 | "ja": "Japonès", 29 | "kab": "Cabilenc", 30 | "ko": "Coreà", 31 | "lt": "Lituà", 32 | "lv": "Letó", 33 | "ml": "Malaiàlam", 34 | "mr": "Marathi", 35 | "nl": "Neerlandès", 36 | "oc": "Occità", 37 | "pl": "Polonès", 38 | "pt": "Portuguès", 39 | "ptBR": "Portuguès (Brasil)", 40 | "ro": "Romanès", 41 | "ru": "Rus", 42 | "sc": "Sard", 43 | "sk": "Eslovac", 44 | "sl": "Eslovè", 45 | "sq": "Albanès", 46 | "sr": "Serbi", 47 | "sv": "Suec", 48 | "te": "Telugu", 49 | "tr": "Turc", 50 | "uk": "Ucraïnès", 51 | "vi": "Vietnamita", 52 | "zhCN": "Xinès (Xina)", 53 | "zhTW": "Xinès (Taiwan)" 54 | } 55 | -------------------------------------------------------------------------------- /docs/lang/languages-cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikánština", 3 | "ar": "Arabština", 4 | "bg": "Bulharština", 5 | "ca": "Katalánština", 6 | "cs": "Čeština", 7 | "da": "Dánština", 8 | "de": "Němčina", 9 | "el": "Řečtina", 10 | "en": "Angličtina", 11 | "enGB": "Angličtina (Spojené království)", 12 | "eo": "Esperanto", 13 | "es": "Španělština", 14 | "esUS": "Španělština (Latinská Amerika)", 15 | "et": "Estonština", 16 | "eu": "Baskičtina", 17 | "fi": "Finština", 18 | "fr": "Francouština", 19 | "frCA": "Francouzština (Kanada)", 20 | "he": "Hebrejština", 21 | "hr": "Chorvatština", 22 | "hu": "Maďarština", 23 | "hy": "Arménština", 24 | "id": "Indonéština", 25 | "it": "Italština", 26 | "ja": "Japonština", 27 | "kab": "Kabylština", 28 | "ko": "Korejština", 29 | "lt": "Litevština", 30 | "mr": "Maráthština", 31 | "nb": "Norština Bokmal", 32 | "nl": "Nizozemština", 33 | "oc": "Okcitánština", 34 | "pl": "Polština", 35 | "ptBR": "Portugalština (Brazílie)", 36 | "ro": "Rumunština", 37 | "ru": "Ruština", 38 | "sc": "Sardinština", 39 | "sk": "Slovenština", 40 | "sl": "Slovinština", 41 | "sr": "Srbština", 42 | "sv": "Švédština", 43 | "tr": "Turečtina", 44 | "uk": "Ukrajinština", 45 | "vi": "Vietnamština", 46 | "zhCN": "Čínština (Čína)", 47 | "zhTW": "Čínština (Taiwan)" 48 | } 49 | -------------------------------------------------------------------------------- /docs/lang/languages-da.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Sydafrikansk", 3 | "bg": "Bulgarsk", 4 | "ca": "Katalansk", 5 | "cs": "Tjekkisk", 6 | "da": "Dansk", 7 | "de": "Tysk", 8 | "el": "Græsk", 9 | "en": "Engelsk", 10 | "enGB": "Engelsk (Storbritannien)", 11 | "eo": "Esperanto", 12 | "es": "Spansk", 13 | "esUS": "Spansk (Latin Amerika)", 14 | "fi": "Finsk", 15 | "fr": "Fransk", 16 | "frCA": "Fransk (Canada)", 17 | "hr": "Kroatisk", 18 | "hu": "Ungarsk", 19 | "hy": "Armensk", 20 | "it": "Italiensk", 21 | "ja": "Japansk", 22 | "ko": "Koreansk", 23 | "nl": "Hollandsk", 24 | "oc": "Occitansk", 25 | "pl": "Polsk", 26 | "ptBR": "Portugisisk (Brazilien)", 27 | "ru": "Russisk", 28 | "sv": "Svensk", 29 | "tr": "Tyrkisk", 30 | "uk": "Ukrainsk", 31 | "vi": "Vietnamesisk", 32 | "zhCN": "Kinesisk (China)", 33 | "zhTW": "Kinesisk (Taiwan)" 34 | } 35 | -------------------------------------------------------------------------------- /docs/lang/languages-de.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgarisch", 4 | "ca": "Katalanisch", 5 | "cs": "Tschechisch", 6 | "da": "Dänisch", 7 | "de": "Deutsch", 8 | "el": "Griechisch", 9 | "en": "Englisch", 10 | "enGB": "Englisch (Vereinigtes Königreich)", 11 | "eo": "Esperanto", 12 | "es": "Spanisch", 13 | "esUS": "Spanisch (Lateinamerika)", 14 | "et": "Estnisch", 15 | "fi": "Finnisch", 16 | "fr": "Französisch", 17 | "frCA": "Französisch (Kanada)", 18 | "hr": "Kroatisch", 19 | "hsb": "Obersorbisch", 20 | "hu": "Ungarisch", 21 | "hy": "Armenisch", 22 | "it": "Italienisch", 23 | "ja": "Japanisch", 24 | "ko": "Koreanisch", 25 | "nb": "Norwegisch (Bokmal)", 26 | "nl": "Niederländisch", 27 | "oc": "Okzitanisch", 28 | "pl": "Polnisch", 29 | "ptBR": "Portugiesisch (Brasilien)", 30 | "ru": "Russisch", 31 | "sk": "Slowakisch", 32 | "sl": "Slowenisch", 33 | "sr": "Serbish", 34 | "sv": "Schwedisch", 35 | "tr": "Türkisch", 36 | "uk": "Ukrainisch", 37 | "vi": "Vietnamesisch", 38 | "zhCN": "Chinesisch (China)", 39 | "zhTW": "Chinesisch (Taiwan)" 40 | } 41 | -------------------------------------------------------------------------------- /docs/lang/languages-el.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Αφρικανικά", 3 | "bg": "Βουλγάρικα", 4 | "ca": "Καταλανικά", 5 | "cs": "Τσέχικα", 6 | "da": "Δανέζικα", 7 | "de": "Γερμανικά", 8 | "el": "Ελληνικά", 9 | "en": "Αγγλικά", 10 | "enGB": "Αγγλικά (Ηνωμένου Βασιλείου)", 11 | "eo": "Εσπεράντο", 12 | "es": "Ισπανικά", 13 | "esUS": "Ισπανικά (Λατινικής Αμερικής)", 14 | "et": "Εσθονικά", 15 | "eu": "Βάσκικα", 16 | "fi": "Φινλανδικά", 17 | "fr": "Γαλλικά", 18 | "frCA": "Γαλλικά (Καναδικά)", 19 | "he": "Εβραϊκά", 20 | "hr": "Κροατικά", 21 | "hu": "Ουγγρικά", 22 | "hy": "Αρμένικα", 23 | "id": "Ινδονησιακά", 24 | "it": "Ιταλικά", 25 | "ja": "Ιαπωνικά", 26 | "ko": "Κορεάτικα", 27 | "lt": "Λιθουανικά", 28 | "nl": "Ολλανδικά", 29 | "oc": "Οξιτανικά", 30 | "pl": "Πολωνικά", 31 | "ptBR": "Πορτογαλικά (Βραζιλίας)", 32 | "ru": "Ρωσικά", 33 | "sc": "Σαρδηνικά", 34 | "sk": "Σλοβακικά", 35 | "sv": "Σουηδικά", 36 | "tr": "Τουρκικά", 37 | "uk": "Ουκρανικά", 38 | "vi": "Βιετναμέζικα", 39 | "zhCN": "Κινέζικα (Κίνας)", 40 | "zhTW": "Κινέζικα (Ταϊβάν)" 41 | } 42 | -------------------------------------------------------------------------------- /docs/lang/languages-enGB.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgarian", 4 | "ca": "Catalan", 5 | "cs": "Czech", 6 | "da": "Danish", 7 | "de": "German", 8 | "el": "Greek", 9 | "en": "English", 10 | "enGB": "English (United Kingdom)", 11 | "eo": "Esperanto", 12 | "es": "Spanish", 13 | "esUS": "Spanish (Latin America)", 14 | "et": "Estonian", 15 | "fi": "Finnish", 16 | "fr": "French", 17 | "frCA": "French (Canadian)", 18 | "hr": "Croatian", 19 | "hsb": "Upper Sorbian", 20 | "hu": "Hungarian", 21 | "hy": "Armenian", 22 | "it": "Italian", 23 | "ja": "Japanese", 24 | "ko": "Korean", 25 | "nb": "", 26 | "nl": "Dutch", 27 | "oc": "Occitan", 28 | "pl": "Polish", 29 | "ptBR": "Portuguese (Brazil)", 30 | "ru": "Russian", 31 | "sk": "", 32 | "sl": "Slovenian", 33 | "sr": "Serbian", 34 | "sv": "Swedish", 35 | "tr": "Turkish", 36 | "uk": "Ukrainian", 37 | "vi": "Vietnamese", 38 | "zhCN": "Chinese (China)", 39 | "zhTW": "Chinese (Taiwan)" 40 | } 41 | -------------------------------------------------------------------------------- /docs/lang/languages-eo.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikansa", 3 | "bg": "Bulgara", 4 | "cs": "Ĉeĥa", 5 | "de": "Germana", 6 | "el": "Greka", 7 | "en": "Angla", 8 | "eo": "Esperanto", 9 | "es": "Hispana", 10 | "fr": "Franca", 11 | "hy": "Armena", 12 | "it": "Itala", 13 | "ja": "Japana", 14 | "ko": "Korea", 15 | "nb": "Norvega (Bukmola)", 16 | "oc": "Okcitana", 17 | "pl": "Pola", 18 | "ptBR": "Portugala (Brazila)", 19 | "ru": "Rusa", 20 | "sk": "Slovaka", 21 | "sl": "Slovena", 22 | "sv": "Sveda", 23 | "tr": "Turka", 24 | "uk": "Ukraina", 25 | "vi": "Vjetnama", 26 | "zhCN": "Ĉina (Ĉinuja)" 27 | } 28 | -------------------------------------------------------------------------------- /docs/lang/languages-es.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikáans", 3 | "bg": "Búlgaro", 4 | "ca": "Catalán", 5 | "cs": "Checo", 6 | "da": "Danés", 7 | "de": "Alemán", 8 | "el": "Griego", 9 | "en": "Inglés", 10 | "enGB": "Inglés (Reino Unido)", 11 | "eo": "Esperanto", 12 | "es": "Español", 13 | "esUS": "Español (América Latina)", 14 | "et": "Estonio", 15 | "fi": "Finlandés", 16 | "fr": "Francés", 17 | "frCA": "Francés (Canadiense)", 18 | "he": "Hebreo", 19 | "hr": "Croata", 20 | "hu": "Húngaro", 21 | "hy": "Armenio", 22 | "it": "Italiano", 23 | "ja": "Japonés", 24 | "ko": "Coreano", 25 | "nl": "Holandés", 26 | "oc": "Occitano", 27 | "pl": "Polaco", 28 | "ptBR": "Portugués (Brasil)", 29 | "ru": "Ruso", 30 | "sk": "Eslovaco", 31 | "sv": "Sueco", 32 | "tr": "Turco", 33 | "uk": "Ucraniano", 34 | "vi": "Vietnamita", 35 | "zhCN": "Chino (China)", 36 | "zhTW": "Chino (Taiwán)" 37 | } 38 | -------------------------------------------------------------------------------- /docs/lang/languages-esUS.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Africano", 3 | "bg": "Búlgaro", 4 | "ca": "Catalán", 5 | "cs": "Checo", 6 | "de": "Alemán", 7 | "el": "Griego", 8 | "en": "Inglés", 9 | "enGB": "Inglés", 10 | "eo": "Esperanto", 11 | "es": "Español", 12 | "esUS": "Español (Latinoamérica)", 13 | "fi": "Finlandés", 14 | "fr": "Francés", 15 | "frCA": "Francés (Canadiense)", 16 | "he": "Hebreo", 17 | "hr": "Croata", 18 | "hu": "Húngaro", 19 | "hy": "Armenio", 20 | "it": "Italiano", 21 | "ja": "Japonés", 22 | "ko": "Coreano", 23 | "nl": "Holandés", 24 | "oc": "Occitano", 25 | "pl": "Polaco", 26 | "ptBR": "Portugués (Brasil)", 27 | "ru": "Ruso", 28 | "sk": "Eslovaco", 29 | "sv": "Sueco", 30 | "tr": "Turco", 31 | "uk": "Ucraniano", 32 | "vi": "Vietnamita", 33 | "zhCN": "Chino (China)", 34 | "zhTW": "Chino (Taiwan)" 35 | } 36 | -------------------------------------------------------------------------------- /docs/lang/languages-et.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaani keel", 3 | "bg": "Bulgaaria keel", 4 | "ca": "Katalaani keel", 5 | "cs": "Tšehhi keel", 6 | "de": "Saksa keel", 7 | "el": "Kreeka keel", 8 | "en": "Inglise keel", 9 | "enGB": "Inglise keel (Ühendkuningriik)", 10 | "eo": "Esperanto keel", 11 | "es": "Hispaania keel", 12 | "esUS": "Hispaania keel (Ladina-Ameerika)", 13 | "et": "Eesti keel", 14 | "fi": "Soome keel", 15 | "fr": "Prantsuse keel", 16 | "frCA": "Prantsuse keel (Kanada)", 17 | "hr": "Horvaadi keel", 18 | "hu": "Ungari keel", 19 | "hy": "Armeenia keel", 20 | "it": "Itaalia keel", 21 | "ja": "Jaapani keel", 22 | "ko": "Korea keel", 23 | "nl": "Hollandi keel", 24 | "oc": "Oksitaani keel", 25 | "pl": "Poola keel", 26 | "ptBR": "Portigali keel (Brasiilia)", 27 | "ru": "Vene keel", 28 | "sv": "Roosi keel", 29 | "tr": "Türgi keel", 30 | "uk": "Ukraina keel", 31 | "vi": "Vietnami keel", 32 | "zhCN": "Hiina keel (Hiina)", 33 | "zhTW": "Hiina keel (Tai)" 34 | } 35 | -------------------------------------------------------------------------------- /docs/lang/languages-eu.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgariera", 4 | "ca": "Katalana", 5 | "cs": "Txekiera", 6 | "da": "Daniera", 7 | "de": "Alemana", 8 | "el": "Greziera", 9 | "en": "Ingelesa", 10 | "enGB": "Ingelesa (Erresuma Batua)", 11 | "eo": "Esperantoa", 12 | "es": "Gaztelania", 13 | "esUS": "Gaztelania (Latinamerika)", 14 | "et": "Estoniera", 15 | "fi": "Finlandiera", 16 | "fr": "Frantsesa", 17 | "frCA": "Frantsesa (Kanada)", 18 | "hr": "Kroaziera", 19 | "hu": "Hungariera", 20 | "hy": "Armeniera", 21 | "it": "Italiera", 22 | "ja": "Japoniera", 23 | "ko": "Koreera", 24 | "nl": "Nederlandera", 25 | "oc": "Okzitaniera", 26 | "pl": "Poloniera", 27 | "ptBR": "Portugesa (Brasil)", 28 | "ru": "Errusiera", 29 | "sv": "Suediera", 30 | "tr": "Turkiera", 31 | "vi": "Vietnamera", 32 | "zhCN": "Txinera (Txina)", 33 | "zhTW": "Txinera (Taiwan)" 34 | } 35 | -------------------------------------------------------------------------------- /docs/lang/languages-fa.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "آفریقایی", 3 | "ar": "عربی", 4 | "bg": "بلغاری", 5 | "ca": "کاتالانی", 6 | "cs": "چک", 7 | "da": "دانمارکی", 8 | "de": "آلمانی", 9 | "el": "یونانی", 10 | "en": "انگلیسی", 11 | "enGB": "انگلیسی (انگلستان)", 12 | "eo": "اسپرانتو", 13 | "es": "اسپانیایی", 14 | "esUS": "اسپانیایی (آمریکا لاتین)", 15 | "et": "استونیایی", 16 | "eu": "باسکایی", 17 | "fa": "فارسی", 18 | "fi": "فنلاندی", 19 | "fr": "فرانسوی", 20 | "frCA": "فرانسوی (کانادا)", 21 | "he": "عبری", 22 | "hr": "کرواتی", 23 | "hu": "بلغاری", 24 | "hy": "ارمنی", 25 | "id": "اندونزیایی", 26 | "it": "ایتالیایی", 27 | "ja": "ژاپنی", 28 | "kab": "کابیلی", 29 | "ko": "کره ای", 30 | "lt": "لیتوانیایی", 31 | "lv": "لتونیایی", 32 | "ml": "مالایایی", 33 | "mr": "مراتی", 34 | "nl": "هلندی", 35 | "oc": "اکسیتان(قدیمی)", 36 | "pl": "لهستانی", 37 | "ptBR": "پرتغالی (برزیل)", 38 | "ro": "رومانیایی", 39 | "ru": "روسی", 40 | "sc": "ساردینی", 41 | "sk": "اسلواکیایی", 42 | "sl": "اسلوونیایی", 43 | "sr": "صربی", 44 | "sv": "سوئدی", 45 | "tr": "ترکی", 46 | "uk": "اوکراینی", 47 | "vi": "ویتنامی", 48 | "zhCN": "چینی", 49 | "zhTW": "چینی (تایوان)" 50 | } 51 | -------------------------------------------------------------------------------- /docs/lang/languages-fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "afrikaans", 3 | "bg": "bulgaria", 4 | "ca": "katalaani", 5 | "cs": "tšekki", 6 | "da": "tanska", 7 | "de": "saksa", 8 | "el": "kreikka", 9 | "en": "englanti", 10 | "enGB": "englanti (Yhdistynyt kuningaskunta)", 11 | "eo": "esperanto", 12 | "es": "espanja", 13 | "esUS": "espanja (Latinalainen Amerikka)", 14 | "et": "viro", 15 | "fi": "suomi", 16 | "fr": "ranska", 17 | "frCA": "ranska (Kanada)", 18 | "hr": "kroaatti", 19 | "hu": "unkari", 20 | "hy": "armenia", 21 | "it": "italia", 22 | "ja": "japani", 23 | "ko": "korea", 24 | "nb": "", 25 | "nl": "hollanti", 26 | "oc": "oksitaani", 27 | "pl": "puola", 28 | "ptBR": "portugali (Brasilia)", 29 | "ru": "venäjä", 30 | "sk": "", 31 | "sl": "", 32 | "sv": "ruotsi", 33 | "tr": "turkki", 34 | "uk": "ukraina", 35 | "vi": "vietnam", 36 | "zhCN": "kiina (Kiina)", 37 | "zhTW": "kiina (Taiwan)" 38 | } 39 | -------------------------------------------------------------------------------- /docs/lang/languages-fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgare", 4 | "ca": "Catalan", 5 | "cs": "Tchèque", 6 | "da": "Danois", 7 | "de": "Allemand", 8 | "el": "Grec", 9 | "en": "Anglais", 10 | "enGB": "Anglais (Royaume-Uni)", 11 | "eo": "Espéranto", 12 | "es": "Espagnol", 13 | "esUS": "Espagnol (Amérique latine)", 14 | "et": "Estonien", 15 | "fi": "Finnois", 16 | "fr": "Français", 17 | "frCA": "Français (Canada)", 18 | "hr": "Croate", 19 | "hu": "Hongrois", 20 | "hy": "Arménien", 21 | "it": "Italien", 22 | "ja": "Japonais", 23 | "ko": "Coréen", 24 | "nl": "Néerlandais", 25 | "oc": "Occitan", 26 | "pl": "Polonais", 27 | "ptBR": "Portugais (Brésil)", 28 | "ru": "Russe", 29 | "sk": "Slovaque", 30 | "sv": "Suédois", 31 | "tr": "Turc", 32 | "uk": "Ukrainien", 33 | "vi": "Vietnamien", 34 | "zhCN": "Chinois (Chine)", 35 | "zhTW": "Chinois (Taiwan)" 36 | } 37 | -------------------------------------------------------------------------------- /docs/lang/languages-frCA.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Africain", 3 | "bg": "Bulgare", 4 | "ca": "Catalan", 5 | "cs": "Tchèque", 6 | "da": "Danois", 7 | "de": "Allemand", 8 | "el": "Grec", 9 | "en": "Anglais", 10 | "enGB": "Anglais (Royaume-Uni)", 11 | "eo": "Espéranto", 12 | "es": "Espagnol", 13 | "esUS": "Espagnol (Amérique latine)", 14 | "et": "Estonien", 15 | "fi": "Finnois", 16 | "fr": "Français", 17 | "frCA": "Français (Canadien)", 18 | "hr": "Croate", 19 | "hu": "Hongrois", 20 | "hy": "Arménien", 21 | "it": "Italien", 22 | "ja": "Japonais", 23 | "ko": "Coréen", 24 | "nl": "Néerlandais", 25 | "oc": "Occitan", 26 | "pl": "Polonais", 27 | "ptBR": "Portugais (Brésil)", 28 | "ru": "Russe", 29 | "sk": "Slovaque", 30 | "sv": "Suédois", 31 | "tr": "Turc", 32 | "uk": "Ukrainien", 33 | "vi": "Vietnamien", 34 | "zhCN": "Chinois (Chine)", 35 | "zhTW": "Chinois (Taiwan)" 36 | } 37 | -------------------------------------------------------------------------------- /docs/lang/languages-gl.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikans", 3 | "ar": "Árabe", 4 | "bg": "Búlgaro", 5 | "ca": "Catalán", 6 | "cs": "Checo", 7 | "da": "Dinamarqués", 8 | "de": "Alemán", 9 | "el": "Grego", 10 | "en": "Inglés", 11 | "enGB": "Inglés (Reino Unido)", 12 | "eo": "Esperanto", 13 | "es": "Español", 14 | "esUS": "Español (Hispanoamérica)", 15 | "et": "Estoniano", 16 | "eu": "Éuscaro", 17 | "fi": "Finlandés", 18 | "fr": "Francés", 19 | "frCA": "Francés (Canadá)", 20 | "he": "Hebreo", 21 | "hr": "Croata", 22 | "hu": "Húngaro", 23 | "hy": "Armenio", 24 | "id": "Indonesio", 25 | "it": "Italiano", 26 | "ja": "Xaponés", 27 | "kab": "Cabila", 28 | "ko": "Coreano", 29 | "lt": "Lituano", 30 | "lv": "Letón", 31 | "ml": "Malayalam", 32 | "mr": "Marathi", 33 | "nl": "Holandés", 34 | "oc": "Occitano", 35 | "pl": "Polaco", 36 | "ptBR": "Portugués (Brasil)", 37 | "ro": "Romanés", 38 | "ru": "Ruso", 39 | "sc": "Sardo", 40 | "sk": "Eslovaco", 41 | "sl": "Esloveno", 42 | "sr": "Serbio", 43 | "sv": "Sueco", 44 | "tr": "Turco", 45 | "uk": "Ucraíno", 46 | "vi": "Vietnamita", 47 | "zhCN": "Chinés (China)", 48 | "zhTW": "Chinés (Taiwán)" 49 | } 50 | -------------------------------------------------------------------------------- /docs/lang/languages-he.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "אפריקאית", 3 | "bg": "בולגרית", 4 | "ca": "קטלנית", 5 | "cs": "קזחית", 6 | "da": "דנית", 7 | "de": "גרמנית", 8 | "el": "יוונית", 9 | "en": "אנגלית", 10 | "enGB": "אנגלית (בריטניה)", 11 | "eo": "אספרנטו", 12 | "es": "ספרדית", 13 | "esUS": "ספרדית (אמריקה הלטינית)", 14 | "et": "אסטונית", 15 | "fi": "פינית", 16 | "fr": "צרפתית", 17 | "frCA": "צרפתית (קנדה)", 18 | "he": "עברית", 19 | "hr": "קראוטית", 20 | "hu": "הונגרית", 21 | "hy": "ארמנית", 22 | "it": "איטלקית", 23 | "ja": "יפנית", 24 | "ko": "קוראנית", 25 | "nl": "הולנדית", 26 | "oc": "אוקיאנית", 27 | "pl": "פולנית", 28 | "ptBR": "פורטוגזית (ברזיל)", 29 | "ru": "רוסית", 30 | "sc": "סרבית", 31 | "sk": "סלובקית", 32 | "sv": "שוודית", 33 | "tr": "טורקית", 34 | "vi": "ויטנאמית", 35 | "zhCN": "סינית (סין)", 36 | "zhTW": "סינית (טיוואן)" 37 | } 38 | -------------------------------------------------------------------------------- /docs/lang/languages-hi.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "ar": "Arabic", 4 | "bg": "Bulgarian", 5 | "ca": "Catalan", 6 | "cs": "Czech", 7 | "da": "Danish", 8 | "de": "German", 9 | "el": "Greek", 10 | "en": "अंग्रेज़ी", 11 | "enGB": "अंग्रेज़ी (UK)", 12 | "eo": "Esperanto", 13 | "es": "Spanish", 14 | "esUS": "Spanish (Latin America)", 15 | "et": "Estonian", 16 | "eu": "Basque", 17 | "fa": "Persian", 18 | "fi": "Finnish", 19 | "fr": "French", 20 | "frCA": "French (Canadian)", 21 | "he": "Hebrew", 22 | "hi": "हिन्दी", 23 | "hr": "Croatian", 24 | "hu": "Hungarian", 25 | "hy": "Armenian", 26 | "id": "Indonesian", 27 | "it": "Italian", 28 | "ja": "Japanese", 29 | "kab": "Kabyle", 30 | "ko": "Korean", 31 | "lt": "Lithuanian", 32 | "lv": "Latvian", 33 | "ml": "मलयालम", 34 | "mr": "मराठी", 35 | "nl": "Dutch", 36 | "oc": "Occitan", 37 | "pl": "Polish", 38 | "pt": "Portuguese", 39 | "ptBR": "Portuguese (Brazil)", 40 | "ro": "Romanian", 41 | "ru": "Russian", 42 | "sc": "Sardinian", 43 | "sk": "Slovak", 44 | "sl": "Slovenian", 45 | "sr": "Serbian", 46 | "sv": "Swedish", 47 | "tr": "Turkish", 48 | "uk": "Ukrainian", 49 | "vi": "Vietnamese", 50 | "zhCN": "Chinese (China)", 51 | "zhTW": "Chinese (Taiwan)" 52 | } 53 | -------------------------------------------------------------------------------- /docs/lang/languages-hr.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikanski", 3 | "ar": "Arapski", 4 | "bg": "Bugarski", 5 | "ca": "Katalanski", 6 | "cs": "Češki", 7 | "da": "Danski", 8 | "de": "Njemački", 9 | "el": "Grčki", 10 | "en": "Engleski", 11 | "enGB": "Engleski (Ujedinjeno Kraljevstvo)", 12 | "eo": "Esperanto", 13 | "es": "Španjolski", 14 | "esUS": "Španjolski (Latinska Amerika)", 15 | "et": "Estonski", 16 | "eu": "Baskijski", 17 | "fa": "Perzijski", 18 | "fi": "Finski", 19 | "fr": "Francuski", 20 | "frCA": "Francuski (Canada)", 21 | "he": "Hebrejski", 22 | "hi": "Hindski", 23 | "hr": "Hrvatski", 24 | "hsb": "Gornjolužičkosrpski", 25 | "hu": "Mađarski", 26 | "hy": "Armenski", 27 | "id": "Indonezijski", 28 | "it": "Talijanski", 29 | "ja": "Japanski", 30 | "ko": "Korejski", 31 | "lt": "Litvanski", 32 | "lv": "Latvijski", 33 | "ml": "Malayalam", 34 | "mr": "Marathi", 35 | "nb": "Norveški Bokmal", 36 | "nl": "Nizozemski", 37 | "oc": "Okcitanski", 38 | "pl": "Poljski", 39 | "pt": "Portugalski", 40 | "ptBR": "Portugalski (Brazil)", 41 | "ro": "Rumunjski", 42 | "ru": "Ruski", 43 | "sc": "Sardijski", 44 | "sk": "Slovački", 45 | "sl": "Slovenski", 46 | "sq": "Albanski", 47 | "sr": "Srpski", 48 | "sv": "Švedski", 49 | "te": "Teluški", 50 | "tr": "Turski", 51 | "uk": "Ukrajinski", 52 | "vi": "Vijetnamski", 53 | "zhCN": "Kineski (Kina)", 54 | "zhTW": "Kineski (Taiwan)" 55 | } 56 | -------------------------------------------------------------------------------- /docs/lang/languages-hsb.json: -------------------------------------------------------------------------------- 1 | { 2 | "ar": "arabšćina", 3 | "bg": "bołharšćina", 4 | "cs": "čěšćina", 5 | "da": "danšćina", 6 | "de": "němčina", 7 | "el": "grjekšćina", 8 | "en": "jendźelšćina", 9 | "enGB": "jendźelšćina (Wulka Britaniska)", 10 | "eo": "esperanto", 11 | "es": "španišćina", 12 | "esUS": "španišćina (Łaćonska)", 13 | "et": "estišćina", 14 | "eu": "baskišćina", 15 | "fa": "persišćina", 16 | "fi": "finšćina", 17 | "fr": "francošćina", 18 | "frCA": "francošćina (Kanada)", 19 | "he": "hebrejšćina", 20 | "hi": "hindišćina", 21 | "hr": "chorwatšćina", 22 | "hsb": "hornjoserbšćina", 23 | "hu": "madźaršćina", 24 | "hy": "armenšćina", 25 | "id": "indonešćina", 26 | "it": "italšćina", 27 | "ja": "japanšćina", 28 | "ko": "korejšćina", 29 | "lt": "litawšćina", 30 | "lv": "letišćina", 31 | "nl": "nižozemšćina", 32 | "pl": "pólšćina", 33 | "pt": "portugalšćina", 34 | "ptBR": "portugalšćina (Brazilska)", 35 | "ro": "rumunšćina", 36 | "ru": "rušćina", 37 | "sk": "słowakšćina", 38 | "sl": "słowjenšćina", 39 | "sq": "albanšćina", 40 | "sr": "serbišćina", 41 | "sv": "šwedšćina", 42 | "tr": "turkowšćina", 43 | "uk": "ukrainšćina", 44 | "vi": "vietnamšćina", 45 | "zhCN": "chinšćina (China)", 46 | "zhTW": "chinšćina (Taiwan)" 47 | } 48 | -------------------------------------------------------------------------------- /docs/lang/languages-hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bolgár", 4 | "ca": "Katalán", 5 | "cs": "Cseh", 6 | "da": "Dán", 7 | "de": "Német", 8 | "el": "Görög", 9 | "en": "Angol", 10 | "enGB": "Angol (Egyesült Királyság)", 11 | "eo": "Eszperantó", 12 | "es": "Spanyol", 13 | "esUS": "Spanyol (Latin-Amerika)", 14 | "et": "Észt", 15 | "fi": "Finn", 16 | "fr": "Francia", 17 | "frCA": "Francia (kanadai)", 18 | "hr": "Horvát", 19 | "hu": "Magyar", 20 | "hy": "Örmény", 21 | "it": "Olasz", 22 | "ja": "Japán", 23 | "ko": "Koreai", 24 | "nl": "Holland", 25 | "oc": "Okszitán", 26 | "pl": "Lengyel", 27 | "ptBR": "Portugál (Brazil)", 28 | "ru": "Orosz", 29 | "sk": "Szlovákul", 30 | "sv": "Svéd", 31 | "tr": "Török", 32 | "uk": "Ukrán", 33 | "vi": "Vietnámi", 34 | "zhCN": "Kínai (Kína)", 35 | "zhTW": "Kínai (Tajvan)" 36 | } 37 | -------------------------------------------------------------------------------- /docs/lang/languages-hy.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "", 3 | "bg": "Բուլղարերեն", 4 | "cs": "", 5 | "de": "Գերմաներեն ", 6 | "el": "", 7 | "en": "Անգլերեն", 8 | "eo": "Էսպերանտո", 9 | "es": "Իսպաներեն", 10 | "fr": "Ֆրանսերեն", 11 | "hy": "Հայերեն", 12 | "it": "Իտալերեն", 13 | "ja": "", 14 | "ko": "", 15 | "nb": "Նորվեգերեն", 16 | "oc": "Օքսիտաներեն", 17 | "pl": "Լեհերեն", 18 | "ptBR": "Պորտուգալերեն (Բրազիլիա)", 19 | "ru": "Ռուսերեն", 20 | "sk": "Սլովակերեն", 21 | "sl": "Սլովեներեն ", 22 | "sv": "Շվեդերեն ", 23 | "tr": "Թուրքերեն", 24 | "uk": "Ուկրաիներեն", 25 | "vi": "", 26 | "zhCN": "Չիներեն" 27 | } 28 | -------------------------------------------------------------------------------- /docs/lang/languages-id.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Bahasa Afrika", 3 | "bg": "Bahasa Bulgaria", 4 | "ca": "Bahasa Katalan", 5 | "cs": "Bahasa Ceko", 6 | "da": "Bahasa Denmark", 7 | "de": "Bahasa Jerman", 8 | "el": "Bahasa Yunani", 9 | "en": "Bahasa Inggris - US", 10 | "enGB": "Bahasa Inggris - UK", 11 | "eo": "Esperanto", 12 | "es": "Bahasa Spanyol", 13 | "esUS": "Bahasa Spanyol - Latin", 14 | "et": "Bahasa Estonia", 15 | "fi": "Bahasa Finlandia", 16 | "fr": "Bahasa Prancis", 17 | "frCA": "Bahasa Prancis - Kanada", 18 | "he": "Bahasa Hebrew", 19 | "hr": "Bahasa Kroasia", 20 | "hu": "Bahasa Hongaria", 21 | "hy": "Bahasa Armenia", 22 | "id": "Bahasa Indonesia", 23 | "it": "Bahasa Italia", 24 | "ja": "Bahasa Jepang", 25 | "ko": "Bahasa Korea", 26 | "lt": "Bahasa Lituania", 27 | "nl": "Bahasa Belanda", 28 | "oc": "Bahasa Oceania", 29 | "pl": "Bahasa Polandia", 30 | "ptBR": "Bahasa Portugis - Brazil", 31 | "ru": "Bahasa Rusia", 32 | "sc": "Bahasa Sardinia", 33 | "sk": "Bahasa Slovakia", 34 | "sv": "Bahasa Swedia", 35 | "tr": "Bahasa Turki", 36 | "uk": "Bahasa Ukraina", 37 | "vi": "Bahasa Vietnam", 38 | "zhCN": "Bahasa Mandarin", 39 | "zhTW": "Bahasa Mandarin - Taiwan" 40 | } 41 | -------------------------------------------------------------------------------- /docs/lang/languages-is.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afríkanska", 3 | "bg": "Búlgarska", 4 | "ca": "Katalónska", 5 | "cs": "Tékkneska", 6 | "da": "Danska", 7 | "de": "Þýska", 8 | "el": "Gríska", 9 | "en": "Enska", 10 | "enGB": "Enska (Bretland)", 11 | "eo": "Esperantó", 12 | "es": "Spænska", 13 | "esUS": "Spænska (spænskumælandi Ameríka)", 14 | "et": "Eistneska", 15 | "fi": "Finnska", 16 | "fr": "Franska", 17 | "frCA": "Franska (kanadísk)", 18 | "hr": "Króatíska", 19 | "hu": "Ungverska", 20 | "hy": "Armenska", 21 | "it": "Ítalska", 22 | "ja": "Japanska", 23 | "ko": "Kóreska", 24 | "nl": "Hollenska", 25 | "oc": "Occitanska", 26 | "pl": "Pólska", 27 | "ptBR": "Portúgalska (Brasilía)", 28 | "ru": "Rússneska", 29 | "sv": "Sænska", 30 | "tr": "Tyrkneska", 31 | "uk": "Úkraínska", 32 | "vi": "Víetnamska", 33 | "zhCN": "Kínverska (Kína)", 34 | "zhTW": "Kínverska (Taívan)" 35 | } 36 | -------------------------------------------------------------------------------- /docs/lang/languages-it.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgaro", 4 | "ca": "Catalano", 5 | "cs": "Ceco", 6 | "da": "Danese", 7 | "de": "Tedesco", 8 | "el": "Greco", 9 | "en": "Inglese", 10 | "enGB": "Inglese (Regno Unito)", 11 | "eo": "Esperanto", 12 | "es": "Spagnolo", 13 | "esUS": "Spagnolo (America Latina)", 14 | "et": "Estone", 15 | "eu": "Basco", 16 | "fi": "Finlandese", 17 | "fr": "Francese", 18 | "frCA": "Francese (Canada)", 19 | "he": "Ebraico", 20 | "hr": "Croato", 21 | "hu": "Ungaro", 22 | "hy": "Armeno", 23 | "id": "Indonesiano", 24 | "it": "Italiano", 25 | "ja": "Giapponese", 26 | "kab": "Kabyle", 27 | "ko": "Coreano", 28 | "lt": "Lituano", 29 | "lv": "Lettone", 30 | "ml": "Malese", 31 | "mr": "Marathi", 32 | "nl": "Olandese", 33 | "oc": "Occitano", 34 | "pl": "Polacco", 35 | "ptBR": "Portoghese (Brasile)", 36 | "ro": "Rumeno", 37 | "ru": "Russo", 38 | "sc": "Sardo", 39 | "sk": "Slovacco", 40 | "sl": "Sloveno", 41 | "sr": "Serbo", 42 | "sv": "Svedese", 43 | "tr": "Turco", 44 | "uk": "Ucraino", 45 | "vi": "Vietnamita", 46 | "zhCN": "Cinese (Cina)", 47 | "zhTW": "Cinese (Taiwan)" 48 | } 49 | -------------------------------------------------------------------------------- /docs/lang/languages-ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "アフリカーンス語", 3 | "ar": "アラビア語", 4 | "bg": "ブルガリア語", 5 | "ca": "カタルーニャ語", 6 | "cs": "チェコ語", 7 | "da": "デンマーク語", 8 | "de": "ドイツ語", 9 | "el": "ギリシア語", 10 | "en": "英語", 11 | "enGB": "英語 (英国)", 12 | "eo": "エスペラント語", 13 | "es": "スペイン語", 14 | "esUS": "スペイン語 (ラテンアメリカ)", 15 | "et": "エストニア語", 16 | "eu": "バスク語", 17 | "fa": "ペルシア語", 18 | "fi": "フィンランド語", 19 | "fr": "フランス語", 20 | "frCA": "フランス語 (カナダ)", 21 | "he": "ヘブライ語", 22 | "hi": "ヒンディー語", 23 | "hr": "クロアチア語", 24 | "hu": "ハンガリー語", 25 | "hy": "アルメニア語", 26 | "id": "インドネシア語", 27 | "it": "イタリア語", 28 | "ja": "日本語", 29 | "kab": "カビル語", 30 | "ko": "韓国語", 31 | "lt": "リトアニア語", 32 | "lv": "ラトビア語", 33 | "ml": "マラヤーラム語", 34 | "mr": "マラーティー語", 35 | "nl": "オランダ語", 36 | "oc": "オック語", 37 | "pl": "ポーランド語", 38 | "pt": "ポルトガル語", 39 | "ptBR": "ポルトガル語 (ブラジル)", 40 | "ro": "ルーマニア語", 41 | "ru": "ロシア語", 42 | "sc": "サルデーニャ語", 43 | "sk": "スロバキア語", 44 | "sl": "スロベニア語", 45 | "sq": "アルバニア語", 46 | "sr": "セルビア語", 47 | "sv": "スウェーデン語", 48 | "te": "テルグ語", 49 | "tr": "トルコ語", 50 | "uk": "ウクライナ語", 51 | "vi": "ベトナム語", 52 | "zhCN": "中国語 (中国)", 53 | "zhTW": "中国語 (台湾)" 54 | } 55 | -------------------------------------------------------------------------------- /docs/lang/languages-kab.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Tafrikant", 3 | "ar": "Taɛrabt", 4 | "bg": "Tabulgarit", 5 | "ca": "Takaṭalant", 6 | "cs": "Taččikit", 7 | "da": "Tadanit", 8 | "de": "Talmanit", 9 | "el": "Tagrigit", 10 | "en": "Taglizit", 11 | "enGB": "Tagnizit (Tagldit i ddukklen)", 12 | "eo": "Taspiṛantit", 13 | "es": "Taspanit", 14 | "esUS": "Taspanit (Temrikt Talatinit)", 15 | "et": "Tastunit", 16 | "eu": "Tabaskit", 17 | "fa": "Tafarisit", 18 | "fi": "Tafinit", 19 | "fr": "Tafransist", 20 | "frCA": "Tafṛansist (Kanada)", 21 | "he": "Taɛbrit", 22 | "hi": "Tahindit", 23 | "hr": "Takrwasit", 24 | "hu": "Tahungrit", 25 | "hy": "Tarminit", 26 | "id": "Tandunizit", 27 | "it": "Taṭalyant", 28 | "ja": "Tajapunit", 29 | "kab": "Taqbaylit", 30 | "ko": "Takurit", 31 | "lt": "Taliṭwanit", 32 | "lv": "Talatviant", 33 | "ml": "Tamalayalamt", 34 | "mr": "Tamratit", 35 | "nb": "Tanurvijit Bukmal", 36 | "nl": "Tahulandit", 37 | "oc": "Tuksitant", 38 | "pl": "Tapulunit", 39 | "pt": "Taportugit", 40 | "ptBR": "Tapurtugit (Brazil)", 41 | "ro": "Tarumanit", 42 | "ru": "Tarusit", 43 | "sc": "Tasardit", 44 | "sk": "Tasluvakit", 45 | "sl": "Tasluvinit", 46 | "sq": "Talbanit", 47 | "sr": "Taserbit", 48 | "sv": "Taswidit", 49 | "te": "Tatelugut", 50 | "tr": "Taṭurkit", 51 | "uk": "Tukranit", 52 | "vi": "Tavyitnamit", 53 | "zhCN": "Tavyitnamit", 54 | "zhTW": "Tacinwat (Taiwan)" 55 | } 56 | -------------------------------------------------------------------------------- /docs/lang/languages-ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "아프리칸스어", 3 | "ar": "아랍어", 4 | "bg": "불가리어", 5 | "ca": "카탈루냐어", 6 | "cs": "체코어", 7 | "da": "덴마크어", 8 | "de": "독일어", 9 | "el": "그리스어", 10 | "en": "영어", 11 | "enGB": "영어(영국)", 12 | "eo": "에스페란토어", 13 | "es": "스페인어", 14 | "esUS": "스페인어(라틴 아메리카)", 15 | "et": "에스토니아어", 16 | "eu": "바스크어", 17 | "fa": "페르시아어", 18 | "fi": "핀란드어", 19 | "fr": "프랑스어", 20 | "frCA": "프랑스어(캐나다)", 21 | "he": "히브리어", 22 | "hr": "크로아티아어", 23 | "hu": "헝가리어", 24 | "hy": "아르메니아어", 25 | "id": "인도네시아어", 26 | "it": "이탈리아어", 27 | "ja": "일본어", 28 | "kab": "커바일어", 29 | "ko": "한국어", 30 | "lt": "리투아니아어", 31 | "lv": "라트비아어", 32 | "ml": "말라얄람어", 33 | "mr": "마라티어", 34 | "nl": "네덜란드어", 35 | "oc": "오크어", 36 | "pl": "폴란드어", 37 | "ptBR": "포르투갈어(브라질)", 38 | "ro": "루마니아어", 39 | "ru": "러시아어", 40 | "sc": "사르데냐어", 41 | "sk": "슬로바키아어", 42 | "sl": "슬로베니아어", 43 | "sr": "세르비아어", 44 | "sv": "스웨덴어", 45 | "tr": "터키어", 46 | "uk": "우크라이나어", 47 | "vi": "베트남어", 48 | "zhCN": "중국어(중국)", 49 | "zhTW": "중국어(대만)" 50 | } 51 | -------------------------------------------------------------------------------- /docs/lang/languages-lt.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikanų", 3 | "bg": "Bulgarų", 4 | "ca": "Katalanų", 5 | "cs": "Čekų", 6 | "da": "Danų", 7 | "de": "Vokiečių", 8 | "el": "Graikų", 9 | "en": "Anglų", 10 | "enGB": "Anglų (Britų)", 11 | "eo": "Esperanto", 12 | "es": "Ispanų", 13 | "esUS": "Ispanų (Lotynų Amerika)", 14 | "et": "Estų", 15 | "fi": "Suomių", 16 | "fr": "Prancūzų", 17 | "frCA": "Prancūzų (Kanada)", 18 | "hr": "Kroatų", 19 | "hu": "Vengrų", 20 | "hy": "Armėnų", 21 | "it": "Italų", 22 | "ja": "Japonų", 23 | "ko": "Korėjiečių", 24 | "lt": "Lietuvių", 25 | "nl": "Olandų", 26 | "oc": "Oksitanų", 27 | "pl": "Lenkų", 28 | "ptBR": "Portugalų (Brazilija)", 29 | "ru": "Rusų", 30 | "sv": "Švedų", 31 | "tr": "Turkų", 32 | "uk": "Ukrainiečių", 33 | "vi": "Vietnamiečių", 34 | "zhCN": "Kinų (China)", 35 | "zhTW": "Kinų (Taivanas)" 36 | } 37 | -------------------------------------------------------------------------------- /docs/lang/languages-lv.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "āfrikāņu", 3 | "bg": "bulgāru", 4 | "ca": "kataloniešu", 5 | "cs": "čehu", 6 | "de": "vācu", 7 | "el": "grieķu", 8 | "en": "angļu", 9 | "enGB": "angļu (Lielbritānija)", 10 | "eo": "esperanto", 11 | "es": "spāņu", 12 | "esUS": "spāņu (Dienvidamerika)", 13 | "et": "igauņu", 14 | "fi": "somu", 15 | "fr": "franču", 16 | "frCA": "franču (Kanāda)", 17 | "hr": "horvātu", 18 | "hu": "ungāru", 19 | "hy": "armēņu", 20 | "it": "itāļu", 21 | "ja": "japānu", 22 | "ko": "korejiešu", 23 | "lv": "laviešu", 24 | "nl": "holandiešu", 25 | "oc": "oksitāņu", 26 | "pl": "poļu", 27 | "ptBR": "portugāļu (Brazīlija)", 28 | "ru": "krievu", 29 | "sv": "zviedru", 30 | "tr": "turku", 31 | "uk": "ukraiņu", 32 | "vi": "vjetnamiešu", 33 | "zhCN": "ķīniešu (Ķīna)", 34 | "zhTW": "ķīniešu (Taivana)" 35 | } 36 | -------------------------------------------------------------------------------- /docs/lang/languages-mn.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgarian", 4 | "ca": "Catalan", 5 | "cs": "Czech", 6 | "da": "Danish", 7 | "de": "German", 8 | "el": "Greek", 9 | "en": "English", 10 | "enGB": "English (United Kingdom)", 11 | "eo": "Esperanto", 12 | "es": "Spanish", 13 | "esUS": "Spanish (Latin America)", 14 | "et": "Estonian", 15 | "fi": "Finnish", 16 | "fr": "French", 17 | "frCA": "French (Canadian)", 18 | "hr": "Croatian", 19 | "hu": "Hungarian", 20 | "hy": "Armenian", 21 | "it": "Italian", 22 | "ja": "Japanese", 23 | "ko": "Korean", 24 | "mn": "Монгол", 25 | "nl": "Dutch", 26 | "oc": "Occitan", 27 | "pl": "Polish", 28 | "ptBR": "Portuguese (Brazil)", 29 | "ru": "Russian", 30 | "sv": "Swedish", 31 | "tr": "Turkish", 32 | "vi": "Vietnamese", 33 | "zhCN": "Chinese (China)", 34 | "zhTW": "Chinese (Taiwan)" 35 | } 36 | -------------------------------------------------------------------------------- /docs/lang/languages-mr.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgarian", 4 | "ca": "Catalan", 5 | "cs": "Czech", 6 | "da": "Danish", 7 | "de": "German", 8 | "el": "Greek", 9 | "en": "English", 10 | "enGB": "English (United Kingdom)", 11 | "eo": "Esperanto", 12 | "es": "Spanish", 13 | "esUS": "Spanish (Latin America)", 14 | "et": "Estonian", 15 | "fi": "Finnish", 16 | "fr": "French", 17 | "frCA": "French (Canadian)", 18 | "hr": "Croatian", 19 | "hu": "Hungarian", 20 | "hy": "Armenian", 21 | "it": "Italian", 22 | "ja": "Japanese", 23 | "ko": "Korean", 24 | "nb": "", 25 | "nl": "Dutch", 26 | "oc": "Occitan", 27 | "pl": "Polish", 28 | "ptBR": "Portuguese (Brazil)", 29 | "ru": "Russian", 30 | "sk": "", 31 | "sl": "", 32 | "sv": "Swedish", 33 | "tr": "Turkish", 34 | "vi": "Vietnamese", 35 | "zhCN": "Chinese (China)", 36 | "zhTW": "Chinese (Taiwan)" 37 | } 38 | -------------------------------------------------------------------------------- /docs/lang/languages-nb.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "", 3 | "bg": "", 4 | "cs": "Tsjekkisk", 5 | "da": "Dansk", 6 | "de": "Tysk", 7 | "el": "Gresk", 8 | "en": "Engelsk", 9 | "eo": "", 10 | "es": "Spansk", 11 | "fi": "Finsk", 12 | "fr": "Fransk", 13 | "hr": "Kroatisk", 14 | "hu": "Ungarsk", 15 | "hy": "", 16 | "it": "Italiensk", 17 | "ja": "Japansk", 18 | "ko": "Koreansk", 19 | "nb": "", 20 | "oc": "", 21 | "pl": "Polsk", 22 | "ptBR": "", 23 | "ru": "Russisk", 24 | "sk": "", 25 | "sl": "", 26 | "sv": "Svensk", 27 | "tr": "Tyrkisk", 28 | "uk": "Ukrainsk", 29 | "vi": "Vietnamesisk", 30 | "zhCN": "" 31 | } 32 | -------------------------------------------------------------------------------- /docs/lang/languages-nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgaars", 4 | "ca": "Catalaans", 5 | "cs": "Tsjechisch", 6 | "da": "Deens", 7 | "de": "Duits", 8 | "el": "Grieks", 9 | "en": "Engels", 10 | "enGB": "Engels (Verenigd Koninkrijk)", 11 | "eo": "Esperanto", 12 | "es": "Spaans", 13 | "esUS": "Spaans (Latijns Amerika)", 14 | "et": "Estlands", 15 | "fi": "Fins", 16 | "fr": "Frans", 17 | "frCA": "Frans (Canadees)", 18 | "hr": "Kroatisch", 19 | "hu": "Hongaars", 20 | "hy": "Armeens", 21 | "it": "Italiaans", 22 | "ja": "Japans", 23 | "ko": "Koreaans", 24 | "nb": "Noors (Bokmal)", 25 | "nl": "Nederlands", 26 | "oc": "Occitaans", 27 | "pl": "Pools", 28 | "ptBR": "Portugees (Brazilië)", 29 | "ru": "Russisch", 30 | "sk": "Slowaaks", 31 | "sl": "Sloveens", 32 | "sv": "Zweeds", 33 | "tr": "Turks", 34 | "uk": "Oekraïens", 35 | "vi": "Vietnamees", 36 | "zhCN": "Chinees (China)", 37 | "zhTW": "Chinees (Taiwan)" 38 | } 39 | -------------------------------------------------------------------------------- /docs/lang/languages-oc.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "ar": "Arabi", 4 | "bg": "Bulgar", 5 | "ca": "Catalan", 6 | "cs": "Chèc", 7 | "da": "Danés", 8 | "de": "Aleman", 9 | "el": "Grèc", 10 | "en": "Anglés", 11 | "enGB": "Anglés (Reialme Unit)", 12 | "eo": "Esperanto", 13 | "es": "Castelhan", 14 | "esUS": "Espanhòl (America latina)", 15 | "et": "Estonian", 16 | "eu": "Basc", 17 | "fa": "Persa", 18 | "fi": "Finés", 19 | "fr": "Francés", 20 | "frCA": "Francés (Canadian)", 21 | "he": "Ebrèu", 22 | "hi": "Indi", 23 | "hr": "Croat", 24 | "hu": "Ongrés", 25 | "hy": "Armenian", 26 | "id": "Indonesian", 27 | "it": "Italian", 28 | "ja": "Japonés", 29 | "kab": "Cabil", 30 | "ko": "Corean", 31 | "lt": "Lituanian", 32 | "lv": "Leton", 33 | "ml": "Malaialam", 34 | "mr": "Marathi", 35 | "nl": "Neerlandés", 36 | "oc": "Occitan", 37 | "pl": "Polonés", 38 | "pt": "Portugués", 39 | "ptBR": "Portugués (Brasil)", 40 | "ro": "Romanian", 41 | "ru": "Rus", 42 | "sc": "Sarde", 43 | "sk": "Eslovac", 44 | "sl": "Eslovèn", 45 | "sq": "Albanés", 46 | "sr": "Sèrbe", 47 | "sv": "Suedés", 48 | "te": "Telugu", 49 | "tr": "Turc", 50 | "uk": "Ucraïnian", 51 | "vi": "Vietnamian", 52 | "zhCN": "Chinés (China)", 53 | "zhTW": "Chinés (Taiwan)" 54 | } 55 | -------------------------------------------------------------------------------- /docs/lang/languages-pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "ar": "arabski", 4 | "bg": "bułgarski", 5 | "ca": "kataloński", 6 | "cs": "czeski", 7 | "da": "duński", 8 | "de": "niemiecki", 9 | "el": "grecki", 10 | "en": "angielski", 11 | "enGB": "Angielski (Zjednoczone Królestwo)", 12 | "eo": "esperanto", 13 | "es": "hiszpański", 14 | "esUS": "hiszpański (Ameryka Łacińska)", 15 | "et": "estoński", 16 | "eu": "baskijski", 17 | "fa": "perski", 18 | "fi": "fiński", 19 | "fr": "francuski", 20 | "frCA": "francuski (kanadyjski)", 21 | "he": "hebrajski", 22 | "hi": "hindi", 23 | "hr": "chorwacki", 24 | "hu": "węgierski", 25 | "hy": "ormiański", 26 | "id": "indonezyjski", 27 | "it": "włoski", 28 | "ja": "japoński", 29 | "kab": "Kabyle", 30 | "ko": "koreański", 31 | "lt": "litewski", 32 | "lv": "łotewski", 33 | "ml": "malajalam", 34 | "mr": "Marathi", 35 | "nl": "holenderski", 36 | "oc": "prowansalski", 37 | "pl": "polski", 38 | "pt": "portugalski", 39 | "ptBR": "portugalski (Brazylia)", 40 | "ro": "rumuński", 41 | "ru": "rosyjski", 42 | "sc": "sardyński", 43 | "sk": "słowacki", 44 | "sl": "słoweński", 45 | "sq": "albański", 46 | "sr": "serbski", 47 | "sv": "szwedzki", 48 | "te": "telugu", 49 | "tr": "turecki", 50 | "uk": "ukraiński", 51 | "vi": "wietnamski", 52 | "zhCN": "chiński (Chiny)", 53 | "zhTW": "chiński (Tajwan)" 54 | } 55 | -------------------------------------------------------------------------------- /docs/lang/languages-pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Africânder", 3 | "ar": "Árabe", 4 | "bg": "Búlgaro", 5 | "ca": "Catalão", 6 | "cs": "Checo", 7 | "da": "Dinamarquês", 8 | "de": "Alemão", 9 | "el": "Grego", 10 | "en": "Inglês", 11 | "enGB": "Inglês (Reino Unido)", 12 | "eo": "Esperanto", 13 | "es": "Espanhol", 14 | "esUS": "Espanhol (América Latina)", 15 | "et": "Estónio", 16 | "eu": "Basco", 17 | "fa": "Persa", 18 | "fi": "Finlandês", 19 | "fr": "Francês", 20 | "frCA": "Francês (Canadá)", 21 | "he": "Hebraico", 22 | "hi": "Hindu", 23 | "hr": "Croata", 24 | "hu": "Húngaro", 25 | "hy": "Arménio", 26 | "id": "Indonésio", 27 | "it": "Italiano", 28 | "ja": "Japonês", 29 | "kab": "Cabila", 30 | "ko": "Coreano", 31 | "lt": "Lituano", 32 | "lv": "Letão", 33 | "ml": "Malaio", 34 | "mr": "Marata", 35 | "nl": "Holandês", 36 | "oc": "Occitano", 37 | "pl": "Polaco", 38 | "pt": "Português", 39 | "ptBR": "Português (Brasil)", 40 | "ro": "Romeno", 41 | "ru": "Russo", 42 | "sc": "Sardo", 43 | "sk": "Eslovaco", 44 | "sl": "Esloveno", 45 | "sq": "Albanês", 46 | "sr": "Sérvio", 47 | "sv": "Sueco", 48 | "te": "Telugu", 49 | "tr": "Turco", 50 | "uk": "Ucraniano", 51 | "vi": "Vietnamita", 52 | "zhCN": "Chinês (China)", 53 | "zhTW": "Chinês (Taiwan)" 54 | } 55 | -------------------------------------------------------------------------------- /docs/lang/languages-ptBR.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Africâner", 3 | "bg": "Búlgaro", 4 | "ca": "Catalão", 5 | "cs": "Checo", 6 | "de": "Alemão", 7 | "el": "Grego", 8 | "en": "Inglês", 9 | "enGB": "Inglês (Reino Unido)", 10 | "eo": "Esperanto", 11 | "es": "Espanhol", 12 | "esUS": "Espanhol (América Latina)", 13 | "fi": "Finlandês", 14 | "fr": "Francês", 15 | "frCA": "Francês (Canadá)", 16 | "hr": "Croata", 17 | "hu": "Húngaro", 18 | "hy": "Armênio", 19 | "it": "Italiano", 20 | "ja": "Japonês", 21 | "ko": "Coreano", 22 | "nl": "Holandês", 23 | "oc": "Occitano", 24 | "pl": "Polonês", 25 | "ptBR": "Português (Brasil)", 26 | "ru": "Russo", 27 | "sv": "Sueco", 28 | "tr": "Turco", 29 | "uk": "Ucraniano", 30 | "vi": "Vietnamita", 31 | "zhCN": "Chinês (China)", 32 | "zhTW": "Chinês (Taiwan)" 33 | } 34 | -------------------------------------------------------------------------------- /docs/lang/languages-ro.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "ar": "Arabă", 4 | "bg": "Bulgară", 5 | "ca": "Catalană", 6 | "cs": "Cehă", 7 | "da": "Daneză", 8 | "de": "Germană", 9 | "el": "Greacă", 10 | "en": "Engleză", 11 | "enGB": "Engleză (Regatul Unit)", 12 | "eo": "Esperanto", 13 | "es": "Spaniolă", 14 | "esUS": "Spaniolă (America Latină)", 15 | "et": "Estonă", 16 | "eu": "Bască", 17 | "fi": "Finlandeză", 18 | "fr": "Franceză", 19 | "frCA": "Franceză (Canada)", 20 | "he": "Ebraică", 21 | "hr": "Croată", 22 | "hu": "Maghiară", 23 | "hy": "Armeană", 24 | "id": "Indoneziană", 25 | "it": "Italiană", 26 | "ja": "Japoneză", 27 | "ko": "Koreană", 28 | "lt": "Lituaniană", 29 | "nl": "Olandeză", 30 | "oc": "Occitană", 31 | "pl": "Poloneză", 32 | "ptBR": "Portugheză (Brazilia)", 33 | "ro": "Română", 34 | "ru": "Rusă", 35 | "sc": "Sardă", 36 | "sk": "Slovacă", 37 | "sl": "Slovenă", 38 | "sv": "Suedeză", 39 | "tr": "Turcă", 40 | "uk": "Ucraineană", 41 | "vi": "Vietnameză", 42 | "zhCN": "Chineză (China)", 43 | "zhTW": "Chineză (Taiwan)" 44 | } 45 | -------------------------------------------------------------------------------- /docs/lang/languages-ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Африкаанс", 3 | "bg": "Болгарский", 4 | "ca": "Каталонский", 5 | "cs": "Чешский", 6 | "da": "Датский", 7 | "de": "Немецкий", 8 | "el": "Греческий", 9 | "en": "Английский", 10 | "enGB": "Английский (Великобритания)", 11 | "eo": "Эсперанто", 12 | "es": "Испанский", 13 | "esUS": "Испанский (Латинская Америка)", 14 | "et": "Эстонский", 15 | "fi": "Финский", 16 | "fr": "Французский", 17 | "frCA": "Французский (канадский)", 18 | "hr": "Хорватский", 19 | "hu": "Венгерский", 20 | "hy": "Армянский", 21 | "it": "Итальянский", 22 | "ja": "Японский", 23 | "ko": "Корейский", 24 | "nl": "Голландский", 25 | "oc": "Окситанский", 26 | "pl": "Польский", 27 | "ptBR": "Португальский (Бразилия)", 28 | "ru": "Русский", 29 | "sr": "Сербский", 30 | "sv": "Шведский", 31 | "tr": "Турецкий", 32 | "uk": "Украинский", 33 | "vi": "Вьетнамский", 34 | "zhCN": "Китайский (Китай)", 35 | "zhTW": "Китайский (Тайвань)" 36 | } 37 | -------------------------------------------------------------------------------- /docs/lang/languages-sc.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bùlgaru", 4 | "ca": "Catalanu", 5 | "cs": "Tzecu", 6 | "da": "Danesu", 7 | "de": "Tedescu", 8 | "el": "Gregu", 9 | "en": "Inglesu", 10 | "enGB": "Inglesu (Rennu Unidu)", 11 | "eo": "Esperanto", 12 | "es": "Castillianu", 13 | "esUS": "Castillianu (Amèrica de su Sud)", 14 | "fi": "Finlandesu", 15 | "fr": "Frantzesu", 16 | "frCA": "Frantzesu (Canadesu)", 17 | "hr": "Croatu", 18 | "hu": "Ungheresu", 19 | "hy": "Armenu", 20 | "it": "Italianu", 21 | "ja": "Giaponesu", 22 | "ko": "Coreanu", 23 | "nl": "Olandesu", 24 | "oc": "Otzitanu", 25 | "pl": "Polacu", 26 | "ptBR": "Portughesu (Brasile)", 27 | "ru": "Russu", 28 | "sc": "Sardu", 29 | "sv": "Isvedesu", 30 | "tr": "Turcu", 31 | "uk": "Ucràinu", 32 | "vi": "Vietnamita", 33 | "zhCN": "Tzinesu (Tzina)", 34 | "zhTW": "Tzinesu (Taiwan)" 35 | } 36 | -------------------------------------------------------------------------------- /docs/lang/languages-sk.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "", 3 | "bg": "Bulharština", 4 | "ca": "Katalánština", 5 | "cs": "Čeština", 6 | "da": "Dánština", 7 | "de": "Nemčina", 8 | "el": "Gréčtina", 9 | "en": "Angličtina", 10 | "enGB": "Angličtina (Spojené kráľovstvo)", 11 | "eo": "Esperanto", 12 | "es": "Španielčina", 13 | "esUS": "Angličtina (Spojené štáty americké)", 14 | "et": "Estónčina", 15 | "fi": "Fínčina", 16 | "fr": "Francúžtina", 17 | "frCA": "Francúžtina (Kanada)", 18 | "hr": "Chorvátčina", 19 | "hu": "Maďarčina", 20 | "hy": "Arménčina", 21 | "it": "Taliančina", 22 | "ja": "Japončina", 23 | "ko": "Kórejčina", 24 | "nl": "Holandčina", 25 | "oc": "Okcitánština", 26 | "pl": "Polština", 27 | "ptBR": "Portugalčina", 28 | "ru": "Ruština", 29 | "sk": "Slovenčina", 30 | "sv": "Švédčina", 31 | "tr": "Turečtina", 32 | "uk": "Ukrajinčina", 33 | "vi": "Vietnamčina", 34 | "zhCN": "Čínština (Čína)", 35 | "zhTW": "Čínština (Taiwan)" 36 | } 37 | -------------------------------------------------------------------------------- /docs/lang/languages-sl.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikanščina", 3 | "bg": "Bolgarščina", 4 | "cs": "Češčina", 5 | "de": "Nemščina", 6 | "el": "Grščina", 7 | "en": "Angleščina", 8 | "eo": "Esperanto", 9 | "es": "Španščina", 10 | "fr": "Francoščina", 11 | "hy": "Armenščina", 12 | "it": "Italjanščina", 13 | "ja": "Japonščina", 14 | "ko": "Korejščina", 15 | "nb": "Norveščina (Bokmål)", 16 | "oc": "Okcitanščina", 17 | "pl": "Poljščina", 18 | "ptBR": "Portugalščina (Brazilija)", 19 | "ru": "Ruščina", 20 | "sk": "Slovaščina", 21 | "sl": "Slovenščina", 22 | "sv": "Švedščina", 23 | "tr": "Turščina", 24 | "uk": "Ukrajinščina", 25 | "vi": "Vietnamščina", 26 | "zhCN": "kitajščina (poenostavljena)" 27 | } 28 | -------------------------------------------------------------------------------- /docs/lang/languages-sq.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "ar": "Arabisht", 4 | "bg": "Bullgarisht", 5 | "ca": "Katalanisht", 6 | "cs": "Çekisht", 7 | "da": "Danisht", 8 | "de": "Gjermanisht", 9 | "el": "Greqisht", 10 | "en": "Anglisht", 11 | "enGB": "Anglisht (Mbretëria e Bashkuar)", 12 | "eo": "Esperanto", 13 | "es": "Spanjisht", 14 | "esUS": "Spanjisht (Amerikë Latine)", 15 | "et": "Estonisht", 16 | "eu": "Baskisht", 17 | "fa": "Persisht", 18 | "fi": "Finlandisht", 19 | "fr": "Frëngjisht", 20 | "frCA": "Frëngjisht (Kebek)", 21 | "he": "Hebraisht", 22 | "hi": "Hindi", 23 | "hr": "Kroatisht", 24 | "hu": "Hungarisht", 25 | "hy": "Armenisht", 26 | "id": "Indonezisht", 27 | "it": "Italisht", 28 | "ja": "Japonisht", 29 | "kab": "Kabilisht", 30 | "ko": "Koreançe", 31 | "lt": "Lituanisht", 32 | "lv": "Letonisht", 33 | "ml": "Malajalamisht", 34 | "mr": "Maratisht", 35 | "nl": "Holandisht", 36 | "oc": "Oçitanisht", 37 | "pl": "Polonisht", 38 | "pt": "Portugalisht", 39 | "ptBR": "Portugalisht (Brazil)", 40 | "ro": "Rumanisht", 41 | "ru": "Rusisht", 42 | "sc": "Sardenjisht", 43 | "sk": "Sllovakisht", 44 | "sl": "Sllovenisht", 45 | "sq": "Shqip", 46 | "sr": "Serbisht", 47 | "sv": "Suedisht", 48 | "te": "Telugu", 49 | "tr": "Turqisht", 50 | "uk": "Ukrainisht", 51 | "vi": "Vietnamisht", 52 | "zhCN": "Kinezçe (Kinë)", 53 | "zhTW": "Kinezçe (Tajvan)" 54 | } 55 | -------------------------------------------------------------------------------- /docs/lang/languages-sr.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Африкански", 3 | "bg": "Бугарски", 4 | "ca": "Каталонски", 5 | "cs": "Чешки", 6 | "da": "Дански", 7 | "de": "Њемачки", 8 | "el": "Грчки", 9 | "en": "Енглески", 10 | "enGB": "Енглески (Велика Британија)", 11 | "eo": "Есперанто", 12 | "es": "Шпански", 13 | "esUS": "Шпански (Латинска Америка)", 14 | "et": "Естонски", 15 | "fi": "Фински", 16 | "fr": "Француски", 17 | "frCA": "Француски (Канада)", 18 | "hr": "Хрватски", 19 | "hu": "Мађарски", 20 | "hy": "Јерменски", 21 | "it": "Италијански", 22 | "ja": "Јапански", 23 | "ko": "Корејски", 24 | "nb": "Норвешки Бокал", 25 | "nl": "Холандски", 26 | "oc": "Окцитански", 27 | "pl": "Пољски", 28 | "ptBR": "Португалски (Бразил)", 29 | "ru": "Руски", 30 | "sk": "Словачки", 31 | "sl": "Словенски", 32 | "sr": "Српски", 33 | "sv": "Шведски", 34 | "tr": "Турски", 35 | "uk": "Украјински", 36 | "vi": "Вијетнамски", 37 | "zhCN": "Кинески (Кина)", 38 | "zhTW": "Кинески (Тајван)" 39 | } 40 | -------------------------------------------------------------------------------- /docs/lang/languages-sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "bg": "Bulgariska", 4 | "ca": "Katalanska", 5 | "cs": "Tjeckiska", 6 | "da": "Danska", 7 | "de": "Tyska", 8 | "el": "Grekiska", 9 | "en": "Engelska", 10 | "enGB": "Engelska (Storbritannien)", 11 | "eo": "Esperanto", 12 | "es": "Spanska", 13 | "esUS": "Spanska (Latinamerika)", 14 | "et": "Estniska", 15 | "fi": "Finska", 16 | "fr": "Franska", 17 | "frCA": "Franska (Kanada)", 18 | "hr": "Kroatiska", 19 | "hu": "Ungerska", 20 | "hy": "Armeniska", 21 | "it": "Italienska", 22 | "ja": "Japanska", 23 | "ko": "Koreanska", 24 | "nb": "Norska (Bokmål)", 25 | "nl": "Nederländska", 26 | "oc": "Occitanska", 27 | "pl": "Polska", 28 | "ptBR": "Portugisiska (Brasilien)", 29 | "ru": "Ryska", 30 | "sk": "Slovakiska", 31 | "sl": "Slovenska", 32 | "sv": "Svenska", 33 | "tr": "Turkiska", 34 | "uk": "Ukrainska", 35 | "vi": "Vietnamesiska", 36 | "zhCN": "Kinesiska (Kina)", 37 | "zhTW": "Kinesiska (Taiwan)" 38 | } 39 | -------------------------------------------------------------------------------- /docs/lang/languages-te.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "ఆఫ్రికాన్స్", 3 | "ar": "అరబిక్", 4 | "bg": "బల్గేరియన్", 5 | "ca": "కాటలన్", 6 | "cs": "చెక్", 7 | "da": "డేనిష్", 8 | "de": "జెర్మన్", 9 | "el": "గ్రీకు", 10 | "en": "ఆంగ్లం", 11 | "enGB": "ఆంగ్లం (యునైటెడ్ కింగ్‌డమ్)", 12 | "eo": "ఎస్పరాంతో", 13 | "es": "స్పానిష్", 14 | "esUS": "స్పానిష్ (లాటిన్ అమెరిగా)", 15 | "et": "ఎస్టోనియన్", 16 | "eu": "బాస్క్", 17 | "fa": "పెర్షియన్", 18 | "fi": "ఫిన్నిష్", 19 | "fr": "ఫ్రెంచ్", 20 | "frCA": "ఫ్రెంచ్ (కెనడియన్)", 21 | "he": "హీబ్రూ", 22 | "hi": "హిందీ", 23 | "hr": "క్రొయేషియన్", 24 | "hu": "హంగేరియన్", 25 | "hy": "ఆర్మేనియన్", 26 | "id": "ఇండొనేషియన్", 27 | "it": "ఇటాలియన్", 28 | "ja": "జపనీ", 29 | "kab": "కబైల్", 30 | "ko": "కొరియన్", 31 | "lt": "లిథుయేనియన్", 32 | "lv": "లాత్వియన్", 33 | "ml": "మలయాళం", 34 | "mr": "మరాఠీ", 35 | "nl": "డచ్", 36 | "oc": "ఆక్సిటన్", 37 | "pl": "పోలిష్", 38 | "pt": "పోర్చుగీస్", 39 | "ptBR": "పోర్చుగీస్ (బ్రెజిల్)", 40 | "ro": "రొమేనియన్", 41 | "ru": "రష్యన్", 42 | "sc": "సార్డీనియన్", 43 | "sk": "స్లొవాక్", 44 | "sl": "స్లొవేనియన్", 45 | "sr": "సెర్బియన్", 46 | "sv": "స్వీడిష్", 47 | "te": "తెలుగు", 48 | "tr": "టర్కిష్", 49 | "uk": "ఉక్రేనియన్", 50 | "vi": "వియెత్నామీ", 51 | "zhCN": "చైనీ (చైనా)", 52 | "zhTW": "చైనీ (తైవాన్)" 53 | } 54 | -------------------------------------------------------------------------------- /docs/lang/languages-tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikanca", 3 | "bg": "Bulgarca", 4 | "ca": "Katalanca", 5 | "cs": "Çekçe", 6 | "da": "Danca", 7 | "de": "Almanca", 8 | "el": "Yunanca", 9 | "en": "İngilizce", 10 | "enGB": "İngilizce (Birleşik Krallık)", 11 | "eo": "Esperanto", 12 | "es": "İspanyolca", 13 | "esUS": "İspanyolca (Latin Amerika)", 14 | "et": "Estonca", 15 | "fi": "Fince", 16 | "fr": "Fransızca", 17 | "frCA": "Fransızca (Kanada)", 18 | "hr": "Hırvatça", 19 | "hu": "Macarca", 20 | "hy": "Ermenice", 21 | "it": "İtalyanca", 22 | "ja": "Japonca", 23 | "ko": "Korece", 24 | "nb": "Norveççe Bokmal", 25 | "nl": "Flemenkçe", 26 | "oc": "Oksitan dili", 27 | "pl": "Lehçe", 28 | "ptBR": "Portekizce (Brezilya)", 29 | "ru": "Rusça", 30 | "sk": "Slovakça", 31 | "sl": "Slovence", 32 | "sv": "Isveççe", 33 | "tr": "Türkçe", 34 | "uk": "Ukraynaca", 35 | "vi": "Vietnamca", 36 | "zhCN": "Çince (Çin)", 37 | "zhTW": "Çince (Tayvan)" 38 | } 39 | -------------------------------------------------------------------------------- /docs/lang/languages-uk.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Африкаанс", 3 | "ar": "Арабська", 4 | "bg": "Болгарська", 5 | "ca": "Каталонська", 6 | "cs": "Чеська", 7 | "da": "Данська", 8 | "de": "Німецька", 9 | "el": "Грецька", 10 | "en": "Англійська", 11 | "enGB": "Англійська (Сполучене Королівство)", 12 | "eo": "Есперанто", 13 | "es": "Іспанська", 14 | "esUS": "Іспанська (Латинська Америка)", 15 | "et": "Естонська", 16 | "eu": "Баскська", 17 | "fa": "Перська", 18 | "fi": "Фінська", 19 | "fr": "Французька", 20 | "frCA": "Французька (Канада)", 21 | "he": "Іврит", 22 | "hi": "Гінді", 23 | "hr": "Хорватська", 24 | "hsb": "Верхньолужицька", 25 | "hu": "Угорська", 26 | "hy": "Вірменська", 27 | "id": "Індонезійська", 28 | "it": "Італійська", 29 | "ja": "Японська", 30 | "kab": "Кабільська", 31 | "ko": "Корейська", 32 | "lt": "Литовська", 33 | "lv": "Латвійська", 34 | "ml": "Малаялам", 35 | "mr": "Маратхі", 36 | "nl": "Голландська", 37 | "oc": "Окситанська", 38 | "pl": "Польська", 39 | "pt": "Португальська", 40 | "ptBR": "Португальська (Бразилія)", 41 | "ro": "Румунська", 42 | "ru": "Російська", 43 | "sc": "Сардинська", 44 | "sk": "Словацька", 45 | "sl": "Словенська", 46 | "sq": "Албанська", 47 | "sr": "Сербська", 48 | "sv": "Шведська", 49 | "te": "Телуґу", 50 | "tr": "Турецька", 51 | "uk": "Українська", 52 | "vi": "В'єтнамська", 53 | "zhCN": "Китайська (Китай)", 54 | "zhTW": "Китайська (Тайвань)" 55 | } 56 | -------------------------------------------------------------------------------- /docs/lang/languages-vi.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Tiếng Afrika", 3 | "bg": "Tiếng Bulgaria", 4 | "cs": "Tiếng Séc", 5 | "de": "Tiếng Đức", 6 | "el": "Tiếng Nhật", 7 | "en": "Tiếng Anh", 8 | "eo": "Tiếng Esperanto", 9 | "es": "Tiếng Tây Ban Nha", 10 | "fr": "Tiếng Pháp", 11 | "hy": "Tiếng Acmenia", 12 | "it": "Tiếng Ý", 13 | "ja": "Tiếng Nhật", 14 | "ko": "Tiếng Hàn", 15 | "nb": "Tiếng Na Uy", 16 | "oc": "Tiếng Occitan", 17 | "pl": "Tiếng Ba Lan", 18 | "ptBR": "Tiếng Bồ Đào Nha (Brazil)", 19 | "ru": "Tiếng Nga", 20 | "sk": "Tiếng Slovak", 21 | "sl": "Tiếng Slovenia", 22 | "sv": "Tiếng Thụy Điển", 23 | "tr": "Tiếng Thổ Nhĩ Kỳ", 24 | "vi": "Tiếng Việt", 25 | "zhCN": "Tiếng Hoa (Trung Quốc)" 26 | } 27 | -------------------------------------------------------------------------------- /docs/lang/languages-zhCN.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "南非荷兰语", 3 | "ar": "阿拉伯语", 4 | "bg": "保加利亚语", 5 | "ca": "加泰罗尼亚语", 6 | "cs": "捷克语", 7 | "da": "丹麦语", 8 | "de": "德语", 9 | "el": "希腊语", 10 | "en": "英语", 11 | "enGB": "英语(英国)", 12 | "eo": "世界语", 13 | "es": "西班牙语", 14 | "esUS": "西班牙语(拉丁美洲)", 15 | "et": "爱沙尼亚语", 16 | "eu": "巴斯克语", 17 | "fa": "波斯语", 18 | "fi": "芬兰语", 19 | "fr": "法语", 20 | "frCA": "法语(加拿大)", 21 | "he": "希伯来语", 22 | "hi": "印地语", 23 | "hr": "克罗地亚语", 24 | "hsb": "上索布语", 25 | "hu": "匈牙利语", 26 | "hy": "亚美尼亚语", 27 | "id": "印度尼西亚语", 28 | "it": "意大利语", 29 | "ja": "日语", 30 | "kab": "卡拜尔语", 31 | "ko": "韩语", 32 | "lt": "立陶宛语", 33 | "lv": "拉脱维亚语", 34 | "ml": "马拉雅拉姆语", 35 | "mr": "马拉地语", 36 | "nl": "荷兰语", 37 | "oc": "欧西坦语", 38 | "pl": "波兰语", 39 | "pt": "葡萄牙语", 40 | "ptBR": "葡萄牙语(巴西)", 41 | "ro": "罗马尼亚语", 42 | "ru": "俄语", 43 | "sc": "撒丁语", 44 | "sk": "斯洛伐克语", 45 | "sl": "斯洛文尼亚语", 46 | "sq": "阿尔巴尼亚语", 47 | "sr": "塞尔维亚语", 48 | "sv": "瑞典语", 49 | "te": "泰卢固语", 50 | "tr": "土耳其语", 51 | "uk": "乌克兰语", 52 | "vi": "越南语", 53 | "zhCN": "简体中文(中国)", 54 | "zhTW": "正体中文(台湾)" 55 | } 56 | -------------------------------------------------------------------------------- /docs/lang/languages-zhTW.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "南非荷蘭文", 3 | "ar": "阿拉伯文", 4 | "bg": "保加利亞文", 5 | "ca": "卡達隆尼亞文", 6 | "cs": "捷克文", 7 | "da": "丹麥文", 8 | "de": "德文", 9 | "el": "希臘文", 10 | "en": "英文", 11 | "enGB": "英文(英國)", 12 | "eo": "世界語", 13 | "es": "西班牙文", 14 | "esUS": "西班牙文(拉丁美洲)", 15 | "et": "愛沙尼亞文", 16 | "eu": "巴斯克文", 17 | "fa": "波斯文", 18 | "fi": "芬蘭文", 19 | "fr": "法文", 20 | "frCA": "法文(加拿大)", 21 | "he": "希伯來文", 22 | "hi": "印度文", 23 | "hr": "克羅埃西亞文", 24 | "hsb": "上索布文", 25 | "hu": "匈牙利文", 26 | "hy": "亞美尼亞文", 27 | "id": "印尼文", 28 | "it": "義大利文", 29 | "ja": "日文", 30 | "kab": "卡拜爾文", 31 | "ko": "韓文", 32 | "lt": "立陶宛文", 33 | "lv": "拉脫維亞文", 34 | "ml": "馬來亞拉姆文", 35 | "mr": "馬拉提文", 36 | "nl": "荷蘭文", 37 | "oc": "奧克西坦文", 38 | "pl": "波蘭文", 39 | "pt": "葡萄牙文", 40 | "ptBR": "葡萄牙文(巴西)", 41 | "ro": "羅馬尼亞文", 42 | "ru": "俄文", 43 | "sc": "薩丁尼亞文", 44 | "sk": "斯洛伐克文", 45 | "sl": "斯洛維尼亞文", 46 | "sq": "阿爾巴尼亞文", 47 | "sr": "塞爾維亞文", 48 | "sv": "瑞典文", 49 | "te": "特拉古文", 50 | "tr": "土耳其文", 51 | "uk": "烏克蘭文", 52 | "vi": "越南文", 53 | "zhCN": "簡體中文(中國)", 54 | "zhTW": "正體中文(台灣)" 55 | } 56 | -------------------------------------------------------------------------------- /docs/lang/languages.json: -------------------------------------------------------------------------------- 1 | { 2 | "af": "Afrikaans", 3 | "ar": "Arabic", 4 | "bg": "Bulgarian", 5 | "ca": "Catalan", 6 | "cs": "Czech", 7 | "da": "Danish", 8 | "de": "German", 9 | "el": "Greek", 10 | "en": "English", 11 | "enGB": "English (United Kingdom)", 12 | "eo": "Esperanto", 13 | "es": "Spanish", 14 | "esUS": "Spanish (Latin America)", 15 | "et": "Estonian", 16 | "eu": "Basque", 17 | "fa": "Persian", 18 | "fi": "Finnish", 19 | "fr": "French", 20 | "frCA": "French (Canadian)", 21 | "he": "Hebrew", 22 | "hi": "Hindi", 23 | "hr": "Croatian", 24 | "hsb": "Upper Sorbian", 25 | "hu": "Hungarian", 26 | "hy": "Armenian", 27 | "id": "Indonesian", 28 | "it": "Italian", 29 | "ja": "Japanese", 30 | "kab": "Kabyle", 31 | "ko": "Korean", 32 | "lt": "Lithuanian", 33 | "lv": "Latvian", 34 | "ml": "Malayalam", 35 | "mr": "Marathi", 36 | "nl": "Dutch", 37 | "oc": "Occitan", 38 | "pl": "Polish", 39 | "pt": "Portuguese", 40 | "ptBR": "Portuguese (Brazil)", 41 | "ro": "Romanian", 42 | "ru": "Russian", 43 | "sc": "Sardinian", 44 | "sk": "Slovak", 45 | "sl": "Slovenian", 46 | "sq": "Albanian", 47 | "sr": "Serbian", 48 | "sv": "Swedish", 49 | "te": "Telugu", 50 | "tr": "Turkish", 51 | "uk": "Ukrainian", 52 | "vi": "Vietnamese", 53 | "zhCN": "Chinese (China)", 54 | "zhTW": "Chinese (Taiwan)" 55 | } 56 | -------------------------------------------------------------------------------- /docs/lang/ofmeet-de.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcomepage": { 3 | "inProgressList": "Im Gange", 4 | "inProgressListEmpty": "Derzeit finden keine Konferenzen statt." 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /docs/lang/ofmeet-enGB.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcomepage": { 3 | "inProgressList": "In Progress", 4 | "inProgressListEmpty": "There are no meetings in progress." 5 | }, 6 | "toolbar": { 7 | "recordMeeting": "Record Meeting", 8 | "enterStreamKey": "Please enter a valid stream key!", 9 | "recordDesktopApp": "Record/Stream Meeting Browser Tab", 10 | "enableConferenceTags": "Enable Conference Captions/Subtitles", 11 | "launchCryptPadApplication": "Launch CryptPad Application", 12 | "changePersonalAvatar": "Change personal avatar", 13 | "takePhoto": "Take Photo", 14 | "createBreakoutRooms": "Create Breakout Rooms", 15 | "shareCursorMousePointer": "Share cursor/mouse pointer", 16 | "shareaWhiteboard": "Share a whiteboard", 17 | "shareSomeConfetti": "Share some confetti", 18 | "contactsManager": "Contacts Manager" 19 | }, 20 | "breakout": { 21 | "breakoutRooms": "Breakout Rooms", 22 | "participants": "{{title}} Participants", 23 | "duration": "Duration (mins):", 24 | "rooms": "Rooms:", 25 | "close": "Close", 26 | "allocate": "Allocate", 27 | "reassemble": "Reassemble", 28 | "breakout": "Breakout", 29 | "allocatedMessage": "Allocated {{participants}} participants to {{rooms}} rooms", 30 | "missingParticipants": "Missing participants or rooms", 31 | "allocateParticipantsFirst": "Allocate participants first before breakout", 32 | "anonymous": "Anonymous-{{id}}", 33 | "room": "Room {{n}}", 34 | "meetingParticipants": "Meeting Participants", 35 | "breakoutStarting": "Breakout will start in {{sec}} seconds", 36 | "breakoutStartedWithDuration": "Breakout started and finishes in {{min}} minutes", 37 | "breakoutStarted": "Breakout started. Click on reassemble to end and recall participants", 38 | "breakoutHasEnded": "Breakout has ended", 39 | "joining": "Joining breakout in {{sec}} seconds", 40 | "leaving": "Leaving breakout in {{sec}} seconds" 41 | }, 42 | "takePhoto": { 43 | "handsRaised": "Hands Raised", 44 | "location": "Location", 45 | "date": "Date", 46 | "subject": "Subject", 47 | "host": "Host", 48 | "activity": "Activity" 49 | }, 50 | "handsRaised": { 51 | "handsRaised": "Hands Raised: {{raised}} of {{total}} ({{percentage}}%)" 52 | }, 53 | "tag": { 54 | "conferenceCaptionsSubTitles": "Conference Captions/Sub Titles", 55 | "location": "Location", 56 | "date": "Date", 57 | "subject": "Subject", 58 | "host": "Host", 59 | "activity": "Activity", 60 | "enableMessageCaptions": "Enable Message Captions", 61 | "disableMessageCaptions": "Disable Message Captions", 62 | "enableVoiceTranscription": "Enable Voice Transcription", 63 | "disableVoiceTranscription": "Disable Voice Transcription", 64 | "save": "Save", 65 | "cancel": "Cancel" 66 | }, 67 | "avatar": { 68 | "deletePersonalAvatar": "Delete personal avatar", 69 | "changeInitialsAvatarColor": "Change initials avatar colour", 70 | "avatarUpload": "Avatar Upload", 71 | "imageFileTypeError": "Image file must be a png or jpg file", 72 | "imageFileSizeError": "Image file size must be less than {{size}}MB", 73 | "imageFileError ": "Image file error " 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /docs/lang/ofmeet-ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcomepage": { 3 | "inProgressList": "開催中の会議", 4 | "inProgressListEmpty": "開催中の会議はありません。" 5 | }, 6 | "toolbar": { 7 | "recordMeeting": "会議を録画", 8 | "recordDesktopApp": "デスクトップを録画", 9 | "enableConferenceTags": "会議の追加情報を設定", 10 | "launchCryptPadApplication": "CryptPad アプリケーションを起動", 11 | "changePersonalAvatar": "アバターを変更", 12 | "takePhoto": "スクリーンショットを撮る", 13 | "createBreakoutRooms": "ブレイクアウトルームを作成", 14 | "shareCursorMousePointer": "カーソル/マウスポインターを共有", 15 | "shareaWhiteboard": "ホワイトボードを共有", 16 | "shareSomeConfetti": "紙吹雪", 17 | "contactsManager": "連絡先の管理" 18 | }, 19 | "breakout": { 20 | "breakoutRooms": "ブレクアウトルーム", 21 | "participants": "{{title}}人", 22 | "duration": "時間 (分):", 23 | "rooms": "部屋数:", 24 | "close": "閉じる", 25 | "allocate": "参加者の割り当て", 26 | "reassemble": "ブレクアウト停止", 27 | "breakout": "ブレクアウト開始", 28 | "allocatedMessage": "参加者{{participants}}人を{{rooms}}部屋に割り当てました。", 29 | "missingParticipants": "部屋または参加者が存在しません", 30 | "allocateParticipantsFirst": "ブレクアウトを開始する前に参加者を割り当ててください。", 31 | "anonymous": "名無しの{{id}}", 32 | "room": "部屋{{n}}", 33 | "meetingParticipants": "会議の参加者", 34 | "join": "参加", 35 | "breakoutWillStart": "あと{{sec}}秒でブレイクアウトを開始します。", 36 | "breakoutStartedWithDuration": "ブレイクアウトが開始され、{{min}}分後に終了します。", 37 | "breakoutStarted": "ブレイクアウトが開始されました。終了して参加者を呼び戻すには「ブレクアウト停止」をクリックしてください。", 38 | "breakoutWillEnd": "あと{{sec}}秒でブレイクアウトを終了します。", 39 | "breakoutHasEnded": "ブレクアウトは終了しました。", 40 | "joining": "あと{{sec}}秒でブレイクアウトに参加します。", 41 | "leaving": "あと{{sec}}秒でブレイクアウトから退出します。", 42 | "cancelled": "ブレクアウトは中止されました。", 43 | "elapsedTime": "経過時間:", 44 | "remainingTime":"残り時間:" 45 | }, 46 | "takePhoto": { 47 | "handsRaised": "挙手", 48 | "location": "場所", 49 | "date": "日付", 50 | "subject": "会議名", 51 | "host": "開催者", 52 | "activity": "内容" 53 | }, 54 | "handsRaised": { 55 | "handsRaised": "挙手: {{total}}人中{{raised}}人 ({{percentage}}%)" 56 | }, 57 | "tag": { 58 | "conferenceCaptionsSubTitles": "会議の追加情報", 59 | "location": "場所", 60 | "date": "日付", 61 | "subject": "会議名", 62 | "host": "開催者", 63 | "activity": "内容", 64 | "enableMessageCaptions": "メッセージの字幕表示を有効化", 65 | "disableMessageCaptions": "メッセージの字幕表示を無効化", 66 | "enableVoiceTranscription": "音声認識を有効化", 67 | "disableVoiceTranscription": "音声認識を無効化", 68 | "save": "保存", 69 | "cancel": "キャンセル" 70 | }, 71 | "avatar": { 72 | "deletePersonalAvatar": "アバターを削除", 73 | "changeInitialsAvatarColor": "頭文字アバターの色を変更", 74 | "avatarUpload": "アバターのアップロード", 75 | "imageFileTypeError": "画像はPNGかJPEGファイルの必要があります。", 76 | "imageFileSizeError": "画像のサイズはは{{size}}MB以下の必要があります。", 77 | "imageFileError ": "画像ファイルエラー " 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /docs/lang/readme.md: -------------------------------------------------------------------------------- 1 | # Jitsi Meet Translation 2 | 3 | Jitsi Meet uses [i18next](http://i18next.com) library for translation. 4 | i18next uses separate json files for each language. 5 | 6 | 7 | ## Translating Jitsi Meet 8 | 9 | The translation of Jitsi Meet is handled editing manually the language files. 10 | 11 | You can use the `update-translation.js` script as follows to help you with that: 12 | 13 | ```js 14 | cd lang 15 | node update-translation.js main-es.json 16 | ``` 17 | 18 | That will cause the `main-es.json` file to be updated with all the missing keys set as empty 19 | strings. All that's missing is for you to fill in the blanks! 20 | 21 | ## Development 22 | 23 | If you want to add new functionality for Jitsi Meet and you have texts that need to be translated you must add key and value in main.json file in English for each translatable text. 24 | Than you can use the key to get the translated text for the current language. 25 | 26 | You can add translatable text in the HTML: 27 | 28 | 29 | * **via attribute on HTML element** - add **data-i18n** attribute with value the key of the translatable text. 30 | 31 | 32 | ``` 33 | OK 34 | ``` 35 | 36 | 37 | You can also use APP.translation.generateTranslationHTML(key, options) to get this HTML code as Javascript string. 38 | 39 | 40 | ``` 41 | APP.translation.generateTranslationHTML("dialog.OK") // returns OK 42 | ``` 43 | 44 | The value in the options parameter will be added in data-i18n-options attribute of the element. 45 | 46 | **Note:** If you dynamically add HTML elements don't forget to call APP.translation.translateElement(jquery_selector) to translate the text initially. 47 | 48 | 49 | ``` 50 | APP.translation.translateString("dialog.OK") // returns the value for the key of the current language file. "OK" for example. 51 | ``` 52 | 53 | For the available values of ``options`` parameter for the above methods of translation module see [i18next documentation](http://i18next.com/pages/doc_features). 54 | 55 | **Note:** It is useful to add attributes in the HTML for persistent HTML elements because when the language is changed the text will be automatically translated. 56 | -------------------------------------------------------------------------------- /docs/lang/update-translation.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | const fs = require('fs'); 4 | const process = require('process'); 5 | const traverse = require('traverse'); 6 | const mainLang = require('./main.json'); 7 | 8 | const [ targetLangFile ] = process.argv.slice(-1); 9 | 10 | if (!targetLangFile) { 11 | console.log('No target language file specified'); 12 | process.exit(1); 13 | } 14 | 15 | const targetLang = require(`./${targetLangFile}`); 16 | 17 | const paths = traverse(mainLang).reduce(function(acc, item) { 18 | if (this.isLeaf) { 19 | acc.push(this.path); 20 | } 21 | 22 | return acc; 23 | }, []); 24 | 25 | const result = {}; 26 | 27 | for (const path of paths) { 28 | if (traverse(targetLang).has(path)) { 29 | traverse(result).set(path, traverse(targetLang).get(path)); 30 | } else { 31 | //console.log(`${path.join('.')} is missing`); 32 | traverse(result).set(path, ''); 33 | } 34 | } 35 | 36 | const data = JSON.stringify(result, undefined, 4); 37 | 38 | fs.writeFileSync(`./${targetLangFile}`, data); 39 | -------------------------------------------------------------------------------- /docs/libs/analytics-ga.js: -------------------------------------------------------------------------------- 1 | /* global ga */ 2 | 3 | (function(ctx) { 4 | /** 5 | * 6 | */ 7 | function Analytics(options) { 8 | /* eslint-disable */ 9 | 10 | if (!options.googleAnalyticsTrackingId) { 11 | console.log( 12 | 'Failed to initialize Google Analytics handler, no tracking ID'); 13 | return; 14 | } 15 | 16 | /** 17 | * Google Analytics 18 | * TODO: Keep this local, there's no need to add it to window. 19 | */ 20 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 21 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 22 | })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 23 | ga('create', options.googleAnalyticsTrackingId, 'auto'); 24 | ga('send', 'pageview'); 25 | 26 | /* eslint-enable */ 27 | } 28 | 29 | /** 30 | * Extracts the integer to use for a Google Analytics event's value field 31 | * from a lib-jitsi-meet analytics event. 32 | * @param {Object} event - The lib-jitsi-meet analytics event. 33 | * @returns {Object} - The integer to use for the 'value' of a Google 34 | * Analytics event. 35 | * @private 36 | */ 37 | Analytics.prototype._extractAction = function(event) { 38 | // Page events have a single 'name' field. 39 | if (event.type === 'page') { 40 | return event.name; 41 | } 42 | 43 | // All other events have action, actionSubject, and source fields. All 44 | // three fields are required, and the often jitsi-meet and 45 | // lib-jitsi-meet use the same value when separate values are not 46 | // necessary (i.e. event.action == event.actionSubject). 47 | // Here we concatenate these three fields, but avoid adding the same 48 | // value twice, because it would only make the GA event's action harder 49 | // to read. 50 | let action = event.action; 51 | 52 | if (event.actionSubject && event.actionSubject !== event.action) { 53 | // Intentionally use string concatenation as analytics needs to 54 | // work on IE but this file does not go through babel. For some 55 | // reason disabling this globally for the file does not have an 56 | // effect. 57 | // eslint-disable-next-line prefer-template 58 | action = event.actionSubject + '.' + action; 59 | } 60 | if (event.source && event.source !== event.action 61 | && event.source !== event.action) { 62 | // eslint-disable-next-line prefer-template 63 | action = event.source + '.' + action; 64 | } 65 | 66 | return action; 67 | }; 68 | 69 | /** 70 | * Extracts the integer to use for a Google Analytics event's value field 71 | * from a lib-jitsi-meet analytics event. 72 | * @param {Object} event - The lib-jitsi-meet analytics event. 73 | * @returns {Object} - The integer to use for the 'value' of a Google 74 | * Analytics event, or NaN if the lib-jitsi-meet event doesn't contain a 75 | * suitable value. 76 | * @private 77 | */ 78 | Analytics.prototype._extractValue = function(event) { 79 | let value = event && event.attributes && event.attributes.value; 80 | 81 | // Try to extract an integer from the "value" attribute. 82 | value = Math.round(parseFloat(value)); 83 | 84 | return value; 85 | }; 86 | 87 | /** 88 | * Extracts the string to use for a Google Analytics event's label field 89 | * from a lib-jitsi-meet analytics event. 90 | * @param {Object} event - The lib-jitsi-meet analytics event. 91 | * @returns {string} - The string to use for the 'label' of a Google 92 | * Analytics event. 93 | * @private 94 | */ 95 | Analytics.prototype._extractLabel = function(event) { 96 | let label = ''; 97 | 98 | // The label field is limited to 500B. We will concatenate all 99 | // attributes of the event, except the user agent because it may be 100 | // lengthy and is probably included from elsewhere. 101 | for (const property in event.attributes) { 102 | if (property !== 'permanent_user_agent' 103 | && property !== 'permanent_callstats_name' 104 | && event.attributes.hasOwnProperty(property)) { 105 | // eslint-disable-next-line prefer-template 106 | label += property + '=' + event.attributes[property] + '&'; 107 | } 108 | } 109 | 110 | if (label.length > 0) { 111 | label = label.slice(0, -1); 112 | } 113 | 114 | return label; 115 | }; 116 | 117 | /** 118 | * This is the entry point of the API. The function sends an event to 119 | * google analytics. The format of the event is described in 120 | * AnalyticsAdapter in lib-jitsi-meet. 121 | * @param {Object} event - the event in the format specified by 122 | * lib-jitsi-meet. 123 | */ 124 | Analytics.prototype.sendEvent = function(event) { 125 | if (!event || !ga) { 126 | return; 127 | } 128 | 129 | const ignoredEvents 130 | = [ 'e2e_rtt', 'rtp.stats', 'rtt.by.region', 'available.device', 131 | 'stream.switch.delay', 'ice.state.changed', 'ice.duration' ]; 132 | 133 | // Temporary removing some of the events that are too noisy. 134 | if (ignoredEvents.indexOf(event.action) !== -1) { 135 | return; 136 | } 137 | 138 | const gaEvent = { 139 | 'eventCategory': 'jitsi-meet', 140 | 'eventAction': this._extractAction(event), 141 | 'eventLabel': this._extractLabel(event) 142 | }; 143 | const value = this._extractValue(event); 144 | 145 | if (!isNaN(value)) { 146 | gaEvent.eventValue = value; 147 | } 148 | 149 | ga('send', 'event', gaEvent); 150 | }; 151 | 152 | if (typeof ctx.JitsiMeetJS === 'undefined') { 153 | ctx.JitsiMeetJS = {}; 154 | } 155 | if (typeof ctx.JitsiMeetJS.app === 'undefined') { 156 | ctx.JitsiMeetJS.app = {}; 157 | } 158 | if (typeof ctx.JitsiMeetJS.app.analyticsHandlers === 'undefined') { 159 | ctx.JitsiMeetJS.app.analyticsHandlers = []; 160 | } 161 | ctx.JitsiMeetJS.app.analyticsHandlers.push(Analytics); 162 | })(window); 163 | /* eslint-enable prefer-template */ 164 | -------------------------------------------------------------------------------- /docs/libs/analytics-ga.min.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";const e=(window.JitsiMeetJS||(window.JitsiMeetJS={}),window.JitsiMeetJS.app||(window.JitsiMeetJS.app={}),window.JitsiMeetJS.app);e.analyticsHandlers=e.analyticsHandlers||[],e.analyticsHandlers.push(class extends class{constructor(e={}){this._enabled=!1,this._whiteListedEvents=e.whiteListedEvents,this._blackListedEvents=[...e.blackListedEvents||[],"e2e_rtt","rtp.stats","rtt.by.region","available.device","stream.switch.delay","ice.state.changed","ice.duration","peer.conn.status.duration"]}_extractName(e){if("page"===e.type)return e.name;const{action:t,actionSubject:i,source:s}=e;let a=t;return i&&i!==t&&(a=`${i}.${t}`),s&&s!==t&&(a=`${s}.${a}`),a}_shouldIgnore(e){var t;if(!e||!this._enabled)return!0;const i=null!==(t=this._extractName(e))&&void 0!==t?t:"";return Array.isArray(this._whiteListedEvents)?-1===this._whiteListedEvents.indexOf(i):!!Array.isArray(this._blackListedEvents)&&-1!==this._blackListedEvents.indexOf(i)}}{constructor(e){if(super(e),this._userProperties={},!e.googleAnalyticsTrackingId)throw new Error("Failed to initialize Google Analytics handler, no tracking ID");this._enabled=!0,this._initGoogleAnalytics(e)}_initGoogleAnalytics(e){var t,i,s,a,n;t=window,i=document,s="script",t.GoogleAnalyticsObject="ga",t.ga=t.ga||function(){(t.ga.q=t.ga.q||[]).push(arguments)},t.ga.l=1*new Date,a=i.createElement(s),n=i.getElementsByTagName(s)[0],a.async=1,a.src="//www.google-analytics.com/analytics.js",n.parentNode.insertBefore(a,n),ga("create",e.googleAnalyticsTrackingId,"auto"),ga("send","pageview")}_extractValue(e){var t;let i=null===(t=null==e?void 0:e.attributes)||void 0===t?void 0:t.value;return i=Math.round(parseFloat(null!=i?i:"")),i}_extractLabel(e){const{attributes:t={}}=e,i=Object.keys(t).map((e=>`${e}=${t[e]}`));return i.push(this._userPropertiesString),i.join("&")}setUserProperties(e={}){if(!this._enabled)return;const t=["user_agent","callstats_name"];this._userPropertiesString=Object.keys(e).filter((e=>-1===t.indexOf(e))).map((t=>`permanent_${t}=${e[t]}`)).join("&")}sendEvent(e){if(this._shouldIgnore(e))return;const t={eventCategory:"jitsi-meet",eventAction:this._extractName(e),eventLabel:this._extractLabel(e)},i=this._extractValue(e);isNaN(i)||(t.eventValue=i),ga("send","event",t)}})})(); 2 | //# sourceMappingURL=analytics-ga.min.js.map -------------------------------------------------------------------------------- /docs/libs/blazeface-front.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/blazeface-front.bin -------------------------------------------------------------------------------- /docs/libs/capabilities.json: -------------------------------------------------------------------------------- 1 | { 2 | "safari": [ 3 | {"version": "10.2" }, 4 | { 5 | "capabilities": { 6 | "audioIn": true, 7 | "audioOut": true, 8 | "videoIn": false, 9 | "videoOut": false, 10 | "screenSharing": false 11 | }, 12 | "iframeCapabilities": { 13 | "isSupported": false 14 | } 15 | } 16 | ], 17 | "chrome": 18 | [ 19 | {"version": "51" }, 20 | { 21 | "capabilities": { 22 | "audioIn": true, 23 | "audioOut": true, 24 | "videoIn": true, 25 | "videoOut": true, 26 | "screenSharing": true 27 | } 28 | } 29 | ], 30 | "opera": 31 | [ 32 | {"version": "22" }, 33 | { 34 | "capabilities": { 35 | "audioIn": true, 36 | "audioOut": true, 37 | "videoIn": true, 38 | "videoOut": true, 39 | "screenSharing": false 40 | } 41 | } 42 | ], 43 | "firefox": [ 44 | {"version": "52.4" }, 45 | { 46 | "capabilities": { 47 | "audioIn": true, 48 | "audioOut": true, 49 | "videoIn": true, 50 | "videoOut": true, 51 | "screenSharing": true 52 | } 53 | } 54 | ], 55 | "edge": [ 56 | { 57 | "capabilities": { 58 | "audioIn": true, 59 | "audioOut": true, 60 | "videoIn": true, 61 | "videoOut": true, 62 | "screenSharing": false 63 | } 64 | } 65 | ], 66 | "nwjs": [ 67 | { 68 | "capabilities": { 69 | "audioIn": true, 70 | "audioOut": true, 71 | "videoIn": true, 72 | "videoOut": true, 73 | "screenSharing": true 74 | } 75 | } 76 | ], 77 | "electron": [ 78 | { 79 | "capabilities": { 80 | "audioIn": true, 81 | "audioOut": true, 82 | "videoIn": true, 83 | "videoOut": true, 84 | "screenSharing": true 85 | } 86 | } 87 | ], 88 | "react-native": [ 89 | { 90 | "capabilities": { 91 | "audioIn": true, 92 | "audioOut": true, 93 | "videoIn": true, 94 | "videoOut": true, 95 | "screenSharing": false 96 | } 97 | } 98 | ] 99 | } 100 | -------------------------------------------------------------------------------- /docs/libs/close3.min.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/close3.min.js -------------------------------------------------------------------------------- /docs/libs/do_external_connect.min.js: -------------------------------------------------------------------------------- 1 | (()=>{"use strict";var o={571:(o,t)=>{const n=/"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*\:/;t.parse=function(o){const e="object"==typeof(arguments.length<=1?void 0:arguments[1])&&(arguments.length<=1?void 0:arguments[1]),r=(arguments.length<=1?0:arguments.length-1)>1||!e?arguments.length<=1?void 0:arguments[1]:void 0,c=(arguments.length<=1?0:arguments.length-1)>1&&(arguments.length<=2?void 0:arguments[2])||e||{},i=JSON.parse(o,r);return"ignore"===c.protoAction?i:i&&"object"==typeof i&&o.match(n)?(t.scan(i,c),i):i},t.scan=function(o){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[o];for(;n.length;){const o=n;n=[];for(const e of o){if(Object.prototype.hasOwnProperty.call(e,"__proto__")){if("remove"!==t.protoAction)throw new SyntaxError("Object contains forbidden prototype property");delete e.__proto__}for(const o in e){const t=e[o];t&&"object"==typeof t&&n.push(e[o])}}}},t.safeParse=function(o,n){try{return t.parse(o,n)}catch(o){return null}}}},t={};function n(e){var r=t[e];if(void 0!==r)return r.exports;var c=t[e]={exports:{}};return o[e](c,c.exports,n),c.exports}(()=>{var o=n(571);const t=["__proto__","constructor","prototype"];function e(n,e=!1,r="hash"){"string"==typeof n&&(n=new URL(n));const c="search"===r?n.search:n.hash,i={},s=(null==c?void 0:c.substr(1).split("&"))||[];if("hash"===r&&1===s.length){const o=s[0];if(o.startsWith("/")&&1===o.split("&").length)return i}return s.forEach((n=>{const r=n.split("="),c=r[0];if(!c||c.split(".").some((o=>t.includes(o))))return;let s;try{if(s=r[1],!e){const t=decodeURIComponent(s).replace(/\\&/,"&");s="undefined"===t?void 0:o.parse(t)}}catch(o){return void function(o,t=""){var n;console.error(t,o),null===(n=window.onerror)||void 0===n||n.call(window,t,void 0,void 0,void 0,o)}(o,`Failed to parse URL parameter value: ${String(s)}`)}i[c]=s})),i}if("function"==typeof createConnectionExternally){let o=e(window.location,!0,"hash")["config.externalConnectUrl"]||config.websocket?void 0:config.externalConnectUrl;const t=e(window.location,!0,"hash")["config.iAmRecorder"];let n;if(o&&(n=function(){const o=window.location.pathname;return function(o){if(!o)return o;try{o=decodeURIComponent(o)}catch(o){}return o=null==(o=o.normalize("NFKC"))?void 0:o.toLowerCase(),(o=encodeURIComponent(null!=o?o:"")).toLowerCase()}(o.substring(o.lastIndexOf("/")+1)||void 0)}())&&!t){o+=`?room=${n}`;const t=e(window.location,!0,"search").jwt;t&&(o+=`&token=${t}`),createConnectionExternally(o,(o=>{window.XMPPAttachInfo={status:"success",data:o},r()}),c)}else c()}else c();function r(){window.APP&&"ready"===window.APP.connect.status&&window.APP.connect.handler()}function c(o){o&&console.warn(o),window.XMPPAttachInfo={status:"error"},r()}})()})(); 2 | //# sourceMappingURL=do_external_connect.min.js.map -------------------------------------------------------------------------------- /docs/libs/emotion.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/emotion.bin -------------------------------------------------------------------------------- /docs/libs/external_connect.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Requests the given webservice that will create the connection and will return 3 | * the necessary details(rid, sid and jid) to attach to this connection and 4 | * start using it. This script can be used for optimizing the connection startup 5 | * time. The function will send AJAX request to a webservice that should 6 | * create the bosh session much faster than the client because the webservice 7 | * can be started on the same machine as the XMPP serever. 8 | * 9 | * NOTE: It's vert important to execute this function as early as you can for 10 | * optimal results. 11 | * 12 | * @param webserviceUrl the url for the web service that is going to create the 13 | * connection. 14 | * @param successCallback callback function called with the result of the AJAX 15 | * request if the request was successfull. The callback will receive one 16 | * parameter which will be JS Object with properties - rid, sid and jid. This 17 | * result should be passed to JitsiConnection.attach method in order to use that 18 | * connection. 19 | * @param error_callback callback function called the AJAX request fail. This 20 | * callback is going to receive one parameter which is going to be JS error 21 | * object with a reason for failure in it. 22 | */ 23 | function createConnectionExternally( // eslint-disable-line no-unused-vars 24 | webserviceUrl, 25 | successCallback, 26 | error_callback) { 27 | if (!window.XMLHttpRequest) { 28 | error_callback(new Error('XMLHttpRequest is not supported!')); 29 | return; 30 | } 31 | 32 | var HTTP_STATUS_OK = 200; 33 | 34 | var xhttp = new XMLHttpRequest(); 35 | 36 | xhttp.onreadystatechange = function() { 37 | if (xhttp.readyState == xhttp.DONE) { 38 | var now = window.connectionTimes['external_connect.done'] 39 | = window.performance.now(); 40 | console.log('(TIME) external connect XHR done:\t', now); 41 | if (xhttp.status == HTTP_STATUS_OK) { 42 | try { 43 | var data = JSON.parse(xhttp.responseText); 44 | successCallback(data); 45 | } catch (e) { 46 | error_callback(e); 47 | } 48 | } else { 49 | error_callback(new Error('XMLHttpRequest error. Status: ' 50 | + xhttp.status + '. Error message: ' + xhttp.statusText)); 51 | } 52 | } 53 | }; 54 | 55 | xhttp.open('GET', webserviceUrl, true); 56 | 57 | // Fixes external connect for IE 58 | // The timeout property may be set only after calling the open() method 59 | // and before calling the send() method. 60 | xhttp.timeout = 3000; 61 | 62 | window.connectionTimes = {}; 63 | var now = window.connectionTimes['external_connect.sending'] 64 | = window.performance.now(); 65 | console.log('(TIME) Sending external connect XHR:\t', now); 66 | xhttp.send(); 67 | } 68 | -------------------------------------------------------------------------------- /docs/libs/olm.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/olm.wasm -------------------------------------------------------------------------------- /docs/libs/rnnoise.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/rnnoise.wasm -------------------------------------------------------------------------------- /docs/libs/selfie_segmentation_landscape.tflite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/selfie_segmentation_landscape.tflite -------------------------------------------------------------------------------- /docs/libs/tfjs-backend-wasm-simd.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/tfjs-backend-wasm-simd.wasm -------------------------------------------------------------------------------- /docs/libs/tfjs-backend-wasm-threaded-simd.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/tfjs-backend-wasm-threaded-simd.wasm -------------------------------------------------------------------------------- /docs/libs/tfjs-backend-wasm.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/tfjs-backend-wasm.wasm -------------------------------------------------------------------------------- /docs/libs/tflite-simd.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/tflite-simd.wasm -------------------------------------------------------------------------------- /docs/libs/tflite.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/libs/tflite.wasm -------------------------------------------------------------------------------- /docs/manifest_ofmeet.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Pade Meetings", 3 | "name": "Pade Meetings", 4 | "description": "High quality, secured and scalable video conferences with Jitsi and Openfire", 5 | "icons": [ 6 | { 7 | "src": "image_192.png", 8 | "sizes": "192x192", 9 | "type": "image/png" 10 | }, 11 | { 12 | "src": "image_512.png", 13 | "sizes": "512x512", 14 | "type": "image/png" 15 | } 16 | ], 17 | "start_url": "./", 18 | "background_color": "#FFFFFF", 19 | "theme_color": "#FFFFFF", 20 | "display": "standalone", 21 | "orientation": "portrait" 22 | } 23 | -------------------------------------------------------------------------------- /docs/metro.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | /** 4 | * Metro configuration for React Native 5 | * https://github.com/facebook/react-native 6 | * 7 | * @format 8 | */ 9 | 10 | const { getDefaultConfig } = require('metro-config'); 11 | 12 | module.exports = (async () => { 13 | const { 14 | resolver: { 15 | sourceExts, 16 | assetExts 17 | } 18 | } = await getDefaultConfig(); 19 | 20 | return { 21 | transformer: { 22 | babelTransformerPath: require.resolve('react-native-svg-transformer'), 23 | getTransformOptions: async () => ({ 24 | transform: { 25 | experimentalImportSupport: false, 26 | inlineRequires: true, 27 | }, 28 | }), 29 | }, 30 | resolver: { 31 | assetExts: assetExts.filter(ext => ext !== 'svg'), 32 | sourceExts: [...sourceExts, 'svg'] 33 | } 34 | } 35 | })(); -------------------------------------------------------------------------------- /docs/phoneNumberList.json: -------------------------------------------------------------------------------- 1 | {"message":"Phone numbers available.","numbers":{"US":[],"UK":[],"France":[],"Germany":[],"Netherlands":[],"Spain":[],"Canada":[],"Australia":[],"Brazil":[],"Japan":[],"Switzerland":[]},"numbersEnabled":true} -------------------------------------------------------------------------------- /docs/plugin.head.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/plugin.head.html -------------------------------------------------------------------------------- /docs/pwa-worker.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015, 2019, 2020 Google LLC. All Rights Reserved. 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | http://www.apache.org/licenses/LICENSE-2.0 7 | Unless required by applicable law or agreed to in writing, software 8 | distributed under the License is distributed on an "AS IS" BASIS, 9 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | See the License for the specific language governing permissions and 11 | limitations under the License. 12 | */ 13 | 14 | const CACHE_NAME = 'offline'; 15 | 16 | // Customize this with a different URL if needed. 17 | const OFFLINE_URL = 'static/offline.html'; 18 | 19 | self.addEventListener('install', event => { 20 | event.waitUntil( 21 | (async () => { 22 | const cache = await caches.open(CACHE_NAME); 23 | 24 | 25 | // Setting {cache: 'reload'} in the new request will ensure that the 26 | // response isn't fulfilled from the HTTP cache; i.e., it will be from 27 | // the network. 28 | await cache.add(new Request(OFFLINE_URL, { cache: 'reload' })); 29 | })() 30 | ); 31 | 32 | // Force the waiting service worker to become the active service worker. 33 | self.skipWaiting(); 34 | }); 35 | 36 | self.addEventListener('activate', event => { 37 | event.waitUntil( 38 | (async () => { 39 | // Enable navigation preload if it's supported. 40 | // See https://developers.google.com/web/updates/2017/02/navigation-preload 41 | if ('navigationPreload' in self.registration) { 42 | await self.registration.navigationPreload.enable(); 43 | } 44 | })() 45 | ); 46 | 47 | // Tell the active service worker to take control of the page immediately. 48 | self.clients.claim(); 49 | }); 50 | 51 | self.addEventListener('fetch', event => { 52 | // We only want to call event.respondWith() if this is a navigation request 53 | // for an HTML page. 54 | if (event.request.mode === 'navigate') { 55 | event.respondWith((async () => { 56 | try { 57 | // First, try to use the navigation preload response if it's supported. 58 | const preloadResponse = await event.preloadResponse; 59 | 60 | if (preloadResponse) { 61 | return preloadResponse; 62 | } 63 | 64 | // Always try the network first. 65 | const networkResponse = await fetch(event.request); 66 | 67 | return networkResponse; 68 | } catch (error) { 69 | // catch is only triggered if an exception is thrown, which is likely 70 | // due to a network error. 71 | // If fetch() returns a valid HTTP response with a response code in 72 | // the 4xx or 5xx range, the catch() will NOT be called. 73 | console.log('Fetch failed; returning offline page instead.', error); 74 | 75 | const cache = await caches.open(CACHE_NAME); 76 | const cachedResponse = await cache.match(OFFLINE_URL); 77 | 78 | return cachedResponse; 79 | } 80 | })()); 81 | } 82 | 83 | // If our if() condition is false, then this fetch handler won't intercept the 84 | // request. If there are any other fetch handlers registered, they will get a 85 | // chance to call event.respondWith(). If no fetch handlers call 86 | // event.respondWith(), the request will be handled by the browser as if there 87 | // were no service worker involvement. 88 | }); 89 | -------------------------------------------------------------------------------- /docs/react-native.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This is needed because the RN cli incorrectly detects the iOS app path as 3 | * jitsi-meet/ios/app and thus all pod references in the now dynamically generated 4 | * Podfile are wrong. 5 | */ 6 | module.exports = { 7 | // Exclude some dependencies from auto-linking for the lite SDK. 8 | dependencies: { 9 | '@giphy/react-native-sdk': { 10 | platforms: { 11 | ios: null 12 | } 13 | }, 14 | '@react-native-google-signin/google-signin': { 15 | platforms: { 16 | ios: null 17 | } 18 | }, 19 | 'react-native-calendar-events': { 20 | platforms: { 21 | ios: null 22 | } 23 | }, 24 | 'react-native-watch-connectivity': { 25 | platforms: { 26 | ios: null 27 | } 28 | } 29 | }, 30 | project: { 31 | ios: { 32 | project: '.ios/jitsi-meet.xcworkspace' 33 | } 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /docs/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: /$ 3 | Disallow: / 4 | -------------------------------------------------------------------------------- /docs/sounds/asked-unmute.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/asked-unmute.mp3 -------------------------------------------------------------------------------- /docs/sounds/e2eeOff.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/e2eeOff.mp3 -------------------------------------------------------------------------------- /docs/sounds/e2eeOn.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/e2eeOn.mp3 -------------------------------------------------------------------------------- /docs/sounds/incomingMessage.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/incomingMessage.wav -------------------------------------------------------------------------------- /docs/sounds/joined.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/joined.wav -------------------------------------------------------------------------------- /docs/sounds/knock.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/knock.mp3 -------------------------------------------------------------------------------- /docs/sounds/left.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/left.wav -------------------------------------------------------------------------------- /docs/sounds/liveStreamingOff.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/liveStreamingOff.mp3 -------------------------------------------------------------------------------- /docs/sounds/liveStreamingOn.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/liveStreamingOn.mp3 -------------------------------------------------------------------------------- /docs/sounds/noAudioSignal.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/noAudioSignal.mp3 -------------------------------------------------------------------------------- /docs/sounds/noisyAudioInput.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/noisyAudioInput.mp3 -------------------------------------------------------------------------------- /docs/sounds/outgoingRinging.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/outgoingRinging.wav -------------------------------------------------------------------------------- /docs/sounds/outgoingStart.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/outgoingStart.wav -------------------------------------------------------------------------------- /docs/sounds/reactions-applause.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/reactions-applause.mp3 -------------------------------------------------------------------------------- /docs/sounds/reactions-boo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/reactions-boo.mp3 -------------------------------------------------------------------------------- /docs/sounds/reactions-crickets.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/reactions-crickets.mp3 -------------------------------------------------------------------------------- /docs/sounds/reactions-laughter.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/reactions-laughter.mp3 -------------------------------------------------------------------------------- /docs/sounds/reactions-raised-hand.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/reactions-raised-hand.mp3 -------------------------------------------------------------------------------- /docs/sounds/reactions-surprise.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/reactions-surprise.mp3 -------------------------------------------------------------------------------- /docs/sounds/reactions-thumbs-up.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/reactions-thumbs-up.mp3 -------------------------------------------------------------------------------- /docs/sounds/recordingOff.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/recordingOff.mp3 -------------------------------------------------------------------------------- /docs/sounds/recordingOn.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/recordingOn.mp3 -------------------------------------------------------------------------------- /docs/sounds/rejected.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/rejected.wav -------------------------------------------------------------------------------- /docs/sounds/ring.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/ring.ogg -------------------------------------------------------------------------------- /docs/sounds/ring.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/ring.wav -------------------------------------------------------------------------------- /docs/sounds/talkWhileMuted.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/sounds/talkWhileMuted.mp3 -------------------------------------------------------------------------------- /docs/static/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |

404 Not Found

10 |

You can create a new conversation here

11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/static/authError.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Sorry! You are not allowed to be here :(
9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/static/close.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 |

Thank you for your feedback!

13 |
14 |
15 |

16 | Did you know? 17 | 18 |

19 |
20 |
21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/static/close.js: -------------------------------------------------------------------------------- 1 | /* global interfaceConfig */ 2 | // list of tips 3 | const hints = [ 4 | 'You can pin participants by clicking on their thumbnails.', 5 | 'You can tell others you have something to say by using the "Raise Hand" ' 6 | + 'feature', 7 | 'You can learn about key shortcuts by pressing Shift+?', 8 | 'You can learn more about the state of everyone\'s connection by hovering ' 9 | + 'on the bars in their thumbnail', 10 | 'You can hide all thumbnails by using the button in the bottom right corner' 11 | ]; 12 | 13 | /** 14 | * Get a random hint message from hint array. 15 | * 16 | * @return {string} the hint message. 17 | */ 18 | function getHint() { 19 | const l = hints.length - 1; 20 | const n = Math.round(Math.random() * l); 21 | 22 | return hints[n]; 23 | } 24 | 25 | /** 26 | * Inserts text message 27 | * into DOM element 28 | * 29 | * @param id {string} element identificator 30 | * @param msg {string} text message 31 | */ 32 | function insertTextMsg(id, msg) { 33 | const el = document.getElementById(id); 34 | 35 | if (el) { 36 | el.innerHTML = msg; 37 | } 38 | } 39 | 40 | /** 41 | * Sets the hint and thanks messages. Will be executed on load event. 42 | */ 43 | function onLoad() { 44 | // Intentionally use string concatenation as this file does not go through 45 | // babel but IE11 is still supported. 46 | // eslint-disable-next-line prefer-template 47 | const thankYouMessage = 'Thank you for using ' + interfaceConfig.APP_NAME; 48 | 49 | // Works only for close2.html because close.html doesn't have this element. 50 | insertTextMsg('thanksMessage', thankYouMessage); 51 | 52 | // If there is a setting show a special message only for the guests 53 | if (interfaceConfig.CLOSE_PAGE_GUEST_HINT) { 54 | if (window.sessionStorage.getItem('guest') === 'true') { 55 | const element = document.getElementById('hintQuestion'); 56 | 57 | element.classList.add('hide'); 58 | insertTextMsg('hintMessage', interfaceConfig.CLOSE_PAGE_GUEST_HINT); 59 | 60 | return; 61 | } 62 | } 63 | 64 | insertTextMsg('hintMessage', getHint()); 65 | } 66 | 67 | window.onload = onLoad; 68 | -------------------------------------------------------------------------------- /docs/static/close2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 |

13 |
14 |
15 |

16 | Did you know? 17 | 18 |

19 |
20 |
21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/static/close3.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/static/close3.html -------------------------------------------------------------------------------- /docs/static/close3.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/static/close3.js -------------------------------------------------------------------------------- /docs/static/dialInInfo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/static/msredirect.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/static/oauth.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /docs/static/offline.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 48 | 49 | 50 | 51 |
52 |
53 | 54 | 57 | 58 |
59 |

Connection error

60 | Your device may be offline or our servers may be experiencing problems. 61 |
62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /docs/static/planLimit.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/static/planLimit.html -------------------------------------------------------------------------------- /docs/static/prejoin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 | 35 | 36 | -------------------------------------------------------------------------------- /docs/static/pwa/icons/icon192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/static/pwa/icons/icon192.png -------------------------------------------------------------------------------- /docs/static/pwa/icons/icon512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/static/pwa/icons/icon512.png -------------------------------------------------------------------------------- /docs/static/pwa/icons/iconMask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/static/pwa/icons/iconMask.png -------------------------------------------------------------------------------- /docs/static/recommendedBrowsers.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |

10 | It looks like you're using a browser we don't fully support. 11 |

12 |

13 | We recommend to try with the latest version of  14 | Chrome or  17 | Chromium 20 |

21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/static/settingsToolbarAdditionalContent.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/static/welcomePageAdditionalCard.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/static/welcomePageAdditionalContent.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/times-solid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inspired-futures/ipade/24a4ffb9324cebfabd3bdf9b00daceffaa9b8765/docs/times-solid.png -------------------------------------------------------------------------------- /docs/title.html: -------------------------------------------------------------------------------- 1 | Jitsi Meet 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/webpush-sw.js: -------------------------------------------------------------------------------- 1 | // install trigger for sw - cache index.html 2 | 3 | self.addEventListener('install', function(event) { 4 | var indexPage = new Request('index.html'); 5 | event.waitUntil( 6 | fetch(indexPage).then(function(response) { 7 | return caches.open('offline').then(function(cache) { 8 | return cache.put(indexPage, response); 9 | }); 10 | })); 11 | }); 12 | 13 | // activate trigger 14 | 15 | self.addEventListener('activate', function (event) { 16 | console.log('Activated', event); 17 | }); 18 | 19 | 20 | // fetch trigger - serve from cache or fetch from server, cache the file if not previously cached 21 | /* 22 | self.addEventListener('fetch', function(event) { 23 | if (event.request.method == "GET") event.respondWith( 24 | fetch(event.request).then(function(response) { 25 | return caches.open('offline').then(function(cache) { 26 | try { 27 | cache.put(event.request, response.clone()); 28 | } catch (e) {}; 29 | return response; 30 | }); 31 | }).catch(function (error) { 32 | caches.match(event.request).then(function(resp) { 33 | return resp; 34 | }); 35 | }) 36 | ); 37 | }); 38 | */ 39 | 40 | // push trigger 41 | 42 | self.addEventListener('push', function (event) { 43 | const data = event.data.json(); 44 | console.debug('Push message', data); 45 | 46 | const options = { 47 | body: data.msgBody, 48 | icon: './icon.png', 49 | requireInteraction: true, 50 | persistent: true, 51 | sticky: true, 52 | vibrate: [100, 50, 100], 53 | data: data, 54 | actions: [ 55 | {action: 'join', title: 'Join', icon: './check-solid.png'}, 56 | {action: 'ignore', title: 'Ignore', icon: './times-solid.png'}, 57 | ] 58 | }; 59 | 60 | if (data.msgDate && data.msgDate != "") { 61 | options.actions = [ 62 | {action: 'accept', title: 'Accept', icon: './check-solid.png'}, 63 | {action: 'reject', title: 'Reject', icon: './times-solid.png'}, 64 | ] 65 | } 66 | 67 | event.waitUntil( 68 | self.registration.showNotification(data.msgSubject, options) 69 | ); 70 | }); 71 | 72 | self.addEventListener('pushsubscriptionchange', function(event) { 73 | console.log('[Service Worker]: \'pushsubscriptionchange\' event fired.'); 74 | }); 75 | 76 | self.addEventListener("pushsubscriptionchange", event => { 77 | localStorage.removeItem("pade.vapid.keys"); // force new subscription on next login 78 | client.postMessage(event.oldSubscription); // send re-subscribe to web app if running 79 | }); 80 | 81 | self.addEventListener('notificationclose', function(e) { 82 | console.debug('Closed notification', e.notification); 83 | }); 84 | 85 | self.addEventListener('notificationclick', function(event) { 86 | console.debug('notificationclick', event); 87 | 88 | if (event.action === 'ignore' || event.action === 'reject') { 89 | event.notification.close(); 90 | 91 | } else if (event.action === 'accept') { 92 | const source = new BroadcastChannel('ofmeet-notification-event'); 93 | source.postMessage({action: event.action, payload: event.notification.data}); 94 | 95 | } else if (event.action === 'join') { 96 | event.waitUntil( 97 | clients.openWindow(event.notification.data.url) 98 | ); 99 | event.notification.close(); 100 | } 101 | }, false); --------------------------------------------------------------------------------