diff --git a/.travis.yml b/.travis.yml index d319dd30..ff8349a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ go: - 1.4 - 1.5 - 1.6 + - 1.7 - tip matrix: diff --git a/AUTHORS b/AUTHORS index fda958bf..47b1c63e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -11,3 +11,6 @@ Leon Klingele Translation: Curt Frisemo Irek Zaripov +Florent BEAUCHAMP +Jhon Felipe Urrego Mejia +Riccardo Olivo diff --git a/CHANGELOG.md b/CHANGELOG.md index cf2c30b0..bca92b31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,55 @@ +## 0.29.4 + + * Fixed regression introduced in 0.29.3 that could trigger a ring timeout in conference rooms. + * Handle getUserMedia failures on FF 49 and newer when no audio or video device is available (#394). + * Update spreed-turnservercli to return credentials that are about to expire (but not expired yet). + * Update Italian translation. + * Improve support for building on FreeBSD. + + +## 0.29.3 + + * Added Italian translation (#382) + * Fix XSS in room PIN dialog (#386) + * Reduce volume of "end1" sound by 50% (#379) + * Fix missing ringing sound / timeout on outgoing calls (#377/#378) + + +## 0.29.2 + + * Honor case insensitive config for auto generated room names + * Do not encode the body of a desktop notification + * Make room names case insensitive by default + * Update dependencies to phoenix with Update support + * Implement config loading via NATS + * Don`t run target binary before get is run + * Docker: Use /dev/urandom instead of /dev/random + + +## 0.29.1 + + * Filter rtx support from remote SDP for Chrone <= 38 + * Fix Go 1.4 detection for minor versions + + +## 0.29.0 + + * Add Spanish translation (#307) + * Add minimal TURN refresh interval + * Add script to block UDP for TURN testing + * Implement TURN service client + * Add french translation (#325) + * Make room locking configurable + * Add UI to lock/unlock a room (#239) + * Fix syntax error in example + * Bump minimal Go version + * Fix Go 1.4 release target + * Check if system GOPATH exists + * Allow dist_gopath to fail + * Add make tarball to travis + * Allow specifying docker secrets with enviroment variables + + ## 0.28.1 * Filter rtx support from remote SDP for Chrome <= 38 diff --git a/Makefile.am b/Makefile.am index 6d288d33..9933adfc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -40,7 +40,7 @@ OUTPUT := $(CURDIR)/bin OUTPUT_JS := $(CURDIR)/build/out BUILD_ARCH := $(shell $(GO) env GOARCH) -BUILD_OS := $(shell go env GOOS) +BUILD_OS := $(shell $(GO) env GOOS) DIST := $(CURDIR)/dist_$(BUILD_ARCH) DIST_SRC := $(DIST)/src DIST_BIN := $(DIST)/bin @@ -56,9 +56,9 @@ gopath: @echo GOPATH=$(GOPATH) goget: - if [ -z "$(DEB_BUILDING)" ]; then GOPATH=$(GOPATH) go get github.com/rogpeppe/godeps; fi + if [ -z "$(DEB_BUILDING)" ]; then GOPATH=$(GOPATH) $(GO) get github.com/rogpeppe/godeps; fi if [ -z "$(DEB_BUILDING)" ]; then GOPATH=$(GOPATH) $(CURDIR)/vendor/bin/godeps -u dependencies.tsv; fi - mkdir -p $(shell dirname "$(CURDIR)/vendor/src/$(GOPKG)") + $(MKDIR_P) $(shell dirname "$(CURDIR)/vendor/src/$(GOPKG)") rm -f $(CURDIR)/vendor/src/$(GOPKG) ln -sfn $(PWD) $(CURDIR)/vendor/src/$(GOPKG) @@ -163,6 +163,7 @@ install-assets: $(INSTALL) -d $(DESTDIR)$(SHARE)/www/static/translation $(INSTALL) -d $(DESTDIR)$(SHARE)/www/static/css $(INSTALL) -d $(DESTDIR)$(SHARE)/www/static/js/libs/pdf + $(INSTALL) -d $(DESTDIR)$(SHARE)/www/static/js/libs/require $(INSTALL) -d $(DESTDIR)$(SHARE)/www/static/js/sandboxes $(INSTALL) html/*.html $(DESTDIR)$(SHARE)/www/html $(INSTALL) html/sandboxes/*.html $(DESTDIR)$(SHARE)/www/html/sandboxes @@ -171,10 +172,10 @@ install-assets: $(INSTALL) static/fonts/* $(DESTDIR)$(SHARE)/www/static/fonts $(INSTALL) static/translation/* $(DESTDIR)$(SHARE)/www/static/translation $(INSTALL) static/css/* $(DESTDIR)$(SHARE)/www/static/css - $(INSTALL) -D static/js/libs/require/require.js $(DESTDIR)$(SHARE)/www/static/js/libs/require/require.js + $(INSTALL) static/js/libs/require/require.js $(DESTDIR)$(SHARE)/www/static/js/libs/require $(INSTALL) $(OUTPUT_JS)/*.js $(DESTDIR)$(SHARE)/www/static/js $(INSTALL) $(OUTPUT_JS)/libs/pdf/*.js $(DESTDIR)$(SHARE)/www/static/js/libs/pdf - $(INSTALL) -D static/js/libs/webodf.js $(DESTDIR)$(SHARE)/www/static/js/libs/webodf.js + $(INSTALL) static/js/libs/webodf.js $(DESTDIR)$(SHARE)/www/static/js/libs $(INSTALL) $(OUTPUT_JS)/sandboxes/*.js $(DESTDIR)$(SHARE)/www/static/js/sandboxes install: install-binary install-assets diff --git a/README.md b/README.md index b46eeb0a..6344e653 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ The latest source of Spreed WebRTC can be found on [GitHub](https://github.com/s - [NodeJS](http://nodejs.org/) >= 0.6.0 - [autoconf](http://www.gnu.org/software/autoconf/) - [automake](http://www.gnu.org/software/automake/) + - [git](https://git-scm.com/) ## Runtime dependencies @@ -39,6 +40,9 @@ $ ./configure $ make ``` +On FreeBSD, the default `make` has a different syntax, so `gmake` must be used +there. + ## Build separately @@ -155,13 +159,16 @@ docker run --rm --name my-spreed-webrtc -p 8080:8080 -p 8443:8443 \ ## Setup Screensharing ### Chrome -Chrome should work out of the box. + +Chromium-based browsers (e.g. Google Chrome) require the [Spreed.ME screen sharing +extension](https://www.spreed.me/extension/). ### Firefox -As of Firefox >= 36 you must append the domain being used to the allowed domains -to access your screen. You do this by navigating to `about:config`, search for -'media.getusermedia.screensharing.allowed_domains', and append the domain +Screensharing with Firefox >= 52 should work out of the box. +When using Firefox 36 – 51 you must append the domain being used to the allowed +domains to access your screen. You do this by navigating to `about:config`, search +for 'media.getusermedia.screensharing.allowed_domains', and append the domain to the list of strings. You can edit the field simply by double clicking on it. Ensure that you follow the syntax rules of the field. If you are using an `ip:port` url, simply append `ip` to the list. Also ensure that you are using `https`, diff --git a/dependencies.tsv b/dependencies.tsv index 9b46c45c..5d7cf7e9 100644 --- a/dependencies.tsv +++ b/dependencies.tsv @@ -3,10 +3,11 @@ github.com/gorilla/context git 215affda49addc4c8ef7e2534915df2c8c35c6cd 2014-12- github.com/gorilla/mux git ba336c9cfb43552c90de6cb2ceedd3271c747558 2015-07-17T15:03:03Z github.com/gorilla/securecookie git aeade84400a85c6875264ae51c7a56ecdcb61751 2015-07-16T23:32:44Z github.com/gorilla/websocket git a69d25be2fe2923a97c2af6849b2f52426f68fc0 2016-08-02T13:32:03Z -github.com/longsleep/pkac git 68bf8859f58dd84332ee41c07eba357fb3818ba3 2014-05-01T18:13:13Z +github.com/longsleep/pkac git 302922ac7627196c8cf9e4384cccadf9aa008b3e 2017-02-16T19:00:44Z github.com/nats-io/nats git 355b5b97e0842dc94f1106729aa88e33e06317ca 2015-12-09T21:13:14Z github.com/satori/go.uuid git 879c5887cd475cd7864858769793b2ceb0d44feb 2016-06-07T14:43:47Z github.com/strukturag/goacceptlanguageparser git 68066e68c2940059aadc6e19661610cf428b6647 2014-02-13T13:31:23Z github.com/strukturag/httputils git afbf05c71ac03ee7989c96d033a9571ba4ded468 2014-07-02T01:35:33Z -github.com/strukturag/phoenix git 31b7f25f4815e6e0b8e7c4010f6e9a71c4165b19 2016-06-01T11:34:58Z +github.com/strukturag/phoenix git 8c65e1692d19e1ea84c79d8346bee5747c8ef69c 2016-10-05T15:12:02Z github.com/strukturag/sloth git 74a8bcf67368de59baafe5d3e17aee9875564cfc 2015-04-22T08:59:42Z +github.com/strukturag/spreed-turnservicecli git b8e469d5ef70aebcfbf24555febe96467892f30f 2016-11-17T16:24:08Z diff --git a/doc/CHANNELING-API.txt b/doc/CHANNELING-API.txt index 3dc19aa4..4848b9ba 100644 --- a/doc/CHANNELING-API.txt +++ b/doc/CHANNELING-API.txt @@ -122,11 +122,11 @@ Special purpose documents for channling "username": "turn-username", "password": "turn-password", "ttl": 3600 - "urls": { + "urls": [ "turn:213.203.211.154:3478?transport=udp", "turn:213.203.211.154:3479?transport=tcp", "turns:213.203.211.154:443?transport=tcp" - } + ] }, "Stun": [ "stun:213.203.211.154:443" @@ -150,12 +150,8 @@ Special purpose documents for channling Version : Server version number. Use this to detect server upgrades. ApiVersion : Server channeling API base version. Use this version to select client side compatibility with the connected server. - Turn : Mapping (interface{}) to contain TURN server details, like - urls, password and username. See - http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 - and TURN REST API section in - https://code.google.com/p/rfc5766-turn-server/wiki/turnserver - for details. + Turn : Mapping (interface{}) to contain TURN server details. See + TURN credentials and URNs section below for specification. Stun : Array with STUN server URLs. You can also send an empty Self document to the server to make the server @@ -524,6 +520,19 @@ Additional types for session listing and notifications The Alive value is a timestamp integer in milliseconds (unix time). + TurnUpdate + + { + "Type": "TurnUpdate", + "TurnUpdate": { + "Turn": {...} + } + } + + The server might send a TurnUpdate document at any time. If received by the + client, the Turn details from the Self document have changed and the client + should use the updated data as received in the TurnUpdate document. + User authorization and session authentication @@ -1035,6 +1044,58 @@ File sharing data channel protocol message was received. +TURN cedentials and URNs document + + TURN example data + + { + "username": "turn-username", + "password": "turn-password", + "ttl": 3600 + "urls": [ + "turn:213.203.211.154:3478?transport=udp", + "turn:213.203.211.154:3479?transport=tcp", + "turns:213.203.211.154:443?transport=tcp" + ] + } + + TURN data is provided as a mapping of key value pairs like `urls`, `password` + and `username`. See http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 + and the TURN REST API section in https://github.com/coturn/coturn for details. + + In addition, if the service is configured to use a TURN service to provide + credentials for TURN, it can can contain `geo_uri` and `servers` as returned + by the TURN service client. See https://github.com/strukturag/spreed-turnservicecli + for documentation. + + TURN example data with TURN service + + { + "geo_uri": "https://turnservice.spreed.me/api/v1/turn/geo", + "servers": [ + { + "prio": 10, + "urns": [ + "turn:213.203.211.154:3478?transport=udp", + "turn:213.203.211.154:3479?transport=tcp", + "turns:213.203.211.154:443?transport=tcp" + ], + "id": "zone-id" + } + ], + "ttl": 3600, + "username": "turn-username", + "password": "turn-password" + } + + The TURN credentials data does expire after a while and needs to be refreshed + before the `ttl` is reached. The `ttl` is the number of seconds from now until + the data expires. To refresh the TURN data, a `Self` document with empty data + should be sent. + + All values in the TURN data except the `ttl` are optional. + + End of Channeling API. For latest version of Spreed WebRTC check @@ -1043,4 +1104,4 @@ https://github.com/strukturag/spreed-webrtc For questions, contact mailto:opensource@struktur.de. -(c)2014 struktur AG +(c)2016 struktur AG diff --git a/doc/turn/block-udp-for-turn-test.sh b/doc/turn/block-udp-for-turn-test.sh new file mode 100755 index 00000000..54f457bf --- /dev/null +++ b/doc/turn/block-udp-for-turn-test.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# +# This script blocks all outbound and inbound DNS except DNS. If all UDP is +# blocked, the only way to do a peer to peer connection is with a TURN server +# which supports tcp. +# +# NOTE: this script requires Linux and must be run as root/sudo. +# +# (c)2016 struktur AG +# http://www.struktur.de + +set -e +RETVAL=0 + +run() { + set -x + local mode=$1 + iptables $mode INPUT -p udp --sport 53 -j ACCEPT + iptables $mode INPUT -p udp --dport 53 -j ACCEPT + iptables $mode OUTPUT -p udp --sport 53 -j ACCEPT + iptables $mode OUTPUT -p udp --dport 53 -j ACCEPT + + iptables $mode INPUT -p udp -j DROP + iptables $mode OUTPUT -p udp -j DROP + set +x +} + +start() { + run -A +} + +stop() { + set +e + run -D + set -e +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + *) + echo "Usage: $0 [start|stop]" + RETVAL=1 + ;; +esac + +exit $RETVAL diff --git a/go/channelling/api/api.go b/go/channelling/api/api.go index 854dcb90..e75644d7 100644 --- a/go/channelling/api/api.go +++ b/go/channelling/api/api.go @@ -74,7 +74,7 @@ func New(config *channelling.Config, func (api *channellingAPI) OnConnect(client *channelling.Client, session *channelling.Session) (interface{}, error) { api.Unicaster.OnConnect(client, session) - self, err := api.HandleSelf(session) + self, err := api.HandleSelf(client, session) if err == nil { api.BusManager.Trigger(channelling.BusManagerConnect, session.Id, "", nil, nil) } @@ -90,7 +90,7 @@ func (api *channellingAPI) OnIncoming(sender channelling.Sender, session *channe var pipeline *channelling.Pipeline switch msg.Type { case "Self": - return api.HandleSelf(session) + return api.HandleSelf(sender, session) case "Hello": if msg.Hello == nil { return nil, channelling.NewDataError("bad_request", "message did not contain Hello") @@ -138,7 +138,7 @@ func (api *channellingAPI) OnIncoming(sender channelling.Sender, session *channe return nil, channelling.NewDataError("bad_request", "message did not contain Authentication") } - return api.HandleAuthentication(session, msg.Authentication.Authentication) + return api.HandleAuthentication(sender, session, msg.Authentication.Authentication) case "Bye": if msg.Bye == nil { log.Println("Received invalid bye message.", msg) diff --git a/go/channelling/api/api_test.go b/go/channelling/api/api_test.go index 90787787..6e1745a8 100644 --- a/go/channelling/api/api_test.go +++ b/go/channelling/api/api_test.go @@ -42,6 +42,9 @@ func (fake *fakeClient) Index() uint64 { func (fake *fakeClient) Send(_ buffercache.Buffer) { } +func (fake *fakeClient) Outgoing(_ interface{}) { +} + type fakeRoomManager struct { joinedRoomID string leftRoomID string diff --git a/go/channelling/api/handle_authentication.go b/go/channelling/api/handle_authentication.go index 5487d05b..6a84d903 100644 --- a/go/channelling/api/handle_authentication.go +++ b/go/channelling/api/handle_authentication.go @@ -27,14 +27,14 @@ import ( "github.com/strukturag/spreed-webrtc/go/channelling" ) -func (api *channellingAPI) HandleAuthentication(session *channelling.Session, st *channelling.SessionToken) (*channelling.DataSelf, error) { +func (api *channellingAPI) HandleAuthentication(sender channelling.Sender, session *channelling.Session, st *channelling.SessionToken) (*channelling.DataSelf, error) { if err := api.SessionManager.Authenticate(session, st, ""); err != nil { log.Println("Authentication failed", err, st.Userid, st.Nonce) return nil, err } log.Println("Authentication success", session.Userid()) - self, err := api.HandleSelf(session) + self, err := api.HandleSelf(sender, session) if err == nil { session.BroadcastStatus() } diff --git a/go/channelling/api/handle_self.go b/go/channelling/api/handle_self.go index 1c5e118d..10a87575 100644 --- a/go/channelling/api/handle_self.go +++ b/go/channelling/api/handle_self.go @@ -27,7 +27,7 @@ import ( "github.com/strukturag/spreed-webrtc/go/channelling" ) -func (api *channellingAPI) HandleSelf(session *channelling.Session) (*channelling.DataSelf, error) { +func (api *channellingAPI) HandleSelf(sender channelling.Sender, session *channelling.Session) (*channelling.DataSelf, error) { token, err := api.SessionEncoder.EncodeSessionToken(session) if err != nil { log.Println("Error in OnRegister", err) @@ -44,7 +44,7 @@ func (api *channellingAPI) HandleSelf(session *channelling.Session) (*channellin Token: token, Version: api.config.Version, ApiVersion: apiVersion, - Turn: api.TurnDataCreator.CreateTurnData(session), + Turn: api.TurnDataCreator.CreateTurnData(sender, session), Stun: api.config.StunURIs, } api.BusManager.Trigger(channelling.BusManagerSession, session.Id, session.Userid(), nil, nil) diff --git a/go/channelling/bus_manager.go b/go/channelling/bus_manager.go index de78df7f..0558cbfd 100644 --- a/go/channelling/bus_manager.go +++ b/go/channelling/bus_manager.go @@ -49,6 +49,8 @@ type BusManager interface { Start() Publish(subject string, v interface{}) error Request(subject string, v interface{}, vPtr interface{}, timeout time.Duration) error + BusRequest(subject string, v *BusRequest, vPtr interface{}, timeout time.Duration) error + BusRequestWithRetry(subject string, v *BusRequest, vPtr interface{}, timeout time.Duration, singleTimeout *time.Duration) error Trigger(name, from, payload string, data interface{}, pipeline *Pipeline) error Subscribe(subject string, cb nats.Handler) (*nats.Subscription, error) BindRecvChan(subject string, channel interface{}) (*nats.Subscription, error) @@ -68,6 +70,14 @@ type BusTrigger struct { Pipeline string `json:",omitempty"` } +// A BusRequest is a simple generic to allow sending arbitrary +// Requests to the bus. +type BusRequest struct { + Id string + Type string + Data interface{} `json:",omitempty"` +} + // BusSubjectTrigger returns the bus subject for trigger payloads. func BusSubjectTrigger(prefix, suffix string) string { return fmt.Sprintf("%s.%s", prefix, suffix) @@ -76,11 +86,12 @@ func BusSubjectTrigger(prefix, suffix string) string { // NewBusManager creates and initializes a new BusMager with the // provided flags for NATS support. It is intended to connect the // backend bus with a easy to use API to send and receive bus data. -func NewBusManager(apiConsumer ChannellingAPIConsumer, id string, useNats bool, subjectPrefix string) BusManager { +func NewBusManager(apiConsumer ChannellingAPIConsumer, id string, useNats bool, triggerSubjectPrefix string) BusManager { var b BusManager var err error if useNats { - b, err = newNatsBus(apiConsumer, id, subjectPrefix) + log.Println("NATS enabled", useNats, id) + b, err = newNatsBus(apiConsumer, id, triggerSubjectPrefix) if err == nil { log.Println("NATS bus connected") } else { @@ -111,6 +122,16 @@ func (bus *noopBus) Request(subject string, v interface{}, vPtr interface{}, tim return nil } +func (bus *noopBus) BusRequest(subject string, v *BusRequest, vPtr interface{}, timeout time.Duration) error { + v.Id = bus.id + return nil +} + +func (bus *noopBus) BusRequestWithRetry(subject string, v *BusRequest, vPtr interface{}, timeout time.Duration, singleTimeout *time.Duration) error { + v.Id = bus.id + return nil +} + func (bus *noopBus) Trigger(name, from, payload string, data interface{}, pipeline *Pipeline) error { return nil } @@ -137,24 +158,21 @@ func (bus *noopBus) CreateSink(id string) Sink { type natsBus struct { ChannellingAPIConsumer - id string - prefix string - ec *natsconnection.EncodedConnection - triggerQueue chan *busQueueEntry + id string + triggerPrefix string + ec *natsconnection.EncodedConnection + triggerQueue chan *busQueueEntry } -func newNatsBus(apiConsumer ChannellingAPIConsumer, id, prefix string) (*natsBus, error) { +func newNatsBus(apiConsumer ChannellingAPIConsumer, id, triggerPrefix string) (*natsBus, error) { ec, err := natsconnection.EstablishJSONEncodedConnection(nil) if err != nil { return nil, err } - if prefix == "" { - prefix = "channelling.trigger" - } // Create buffered channel for outbound NATS data. triggerQueue := make(chan *busQueueEntry, 50) - return &natsBus{apiConsumer, id, prefix, ec, triggerQueue}, nil + return &natsBus{apiConsumer, id, triggerPrefix, ec, triggerQueue}, nil } func (bus *natsBus) Start() { @@ -171,7 +189,28 @@ func (bus *natsBus) Request(subject string, v interface{}, vPtr interface{}, tim return bus.ec.Request(subject, v, vPtr, timeout) } +func (bus *natsBus) BusRequest(subject string, v *BusRequest, vPtr interface{}, timeout time.Duration) error { + v.Id = bus.id + return bus.Request(subject, v, vPtr, timeout) +} + +func (bus *natsBus) BusRequestWithRetry(subject string, v *BusRequest, vPtr interface{}, timeout time.Duration, singleTimeout *time.Duration) error { + if singleTimeout == nil { + singleTimeout = &natsconnection.DefaultRequestTimeout + } + v.Id = bus.id + err := natsconnection.CallFuncWithRetry(func() error { + return bus.Request(subject, v, vPtr, *singleTimeout) + }, timeout) + return err +} + func (bus *natsBus) Trigger(name, from, payload string, data interface{}, pipeline *Pipeline) (err error) { + if bus.triggerPrefix == "" { + // Trigger disabled. + return nil + } + trigger := &BusTrigger{ Id: bus.id, Name: name, @@ -182,7 +221,7 @@ func (bus *natsBus) Trigger(name, from, payload string, data interface{}, pipeli if pipeline != nil { trigger.Pipeline = pipeline.GetID() } - entry := &busQueueEntry{BusSubjectTrigger(bus.prefix, name), trigger} + entry := &busQueueEntry{BusSubjectTrigger(bus.triggerPrefix, name), trigger} select { case bus.triggerQueue <- entry: // sent ok @@ -195,7 +234,7 @@ func (bus *natsBus) Trigger(name, from, payload string, data interface{}, pipeli } func (bus *natsBus) PrefixSubject(sub string) string { - return fmt.Sprintf("%s.%s", bus.prefix, sub) + return fmt.Sprintf("%s.%s", bus.triggerPrefix, sub) } func (bus *natsBus) Subscribe(subject string, cb nats.Handler) (*nats.Subscription, error) { diff --git a/go/channelling/client.go b/go/channelling/client.go index c9b604a5..168b1489 100644 --- a/go/channelling/client.go +++ b/go/channelling/client.go @@ -30,6 +30,7 @@ import ( type Sender interface { Index() uint64 Send(buffercache.Buffer) + Outgoing(interface{}) } type Client struct { @@ -50,7 +51,7 @@ func NewClient(codec Codec, api ChannellingAPI, session *Session) *Client { func (client *Client) OnConnect(conn Connection) { client.Connection = conn if reply, err := client.ChannellingAPI.OnConnect(client, client.session); err == nil { - client.reply("", reply) + client.Outgoing(reply) } else { log.Println("OnConnect error", err) } @@ -85,6 +86,10 @@ func (client *Client) reply(iid string, m interface{}) { } } +func (client *Client) Outgoing(m interface{}) { + client.reply("", m) +} + func (client *Client) Session() *Session { return client.session } diff --git a/go/channelling/config.go b/go/channelling/config.go index 162398de..1f1800d2 100644 --- a/go/channelling/config.go +++ b/go/channelling/config.go @@ -14,6 +14,8 @@ type Config struct { Renegotiation bool // Renegotiation flag StunURIs []string // STUN server URIs TurnURIs []string // TURN server URIs + TurnUsername string // Username for TURN server + TurnPassword string // Password for TURN server Tokens bool // True when we got a tokens file Version string // Server version number UsersEnabled bool // Flag if users are enabled @@ -30,6 +32,9 @@ type Config struct { ContentSecurityPolicyReportOnly string `json:"-"` // HTML content security policy in report only mode RoomTypeDefault string `json:"-"` // New rooms default to this type RoomTypes map[*regexp.Regexp]string `json:"-"` // Map of regular expression -> room type + RoomNameCaseSensitive bool // Whether the room names are case sensitive. + LockedRoomJoinableWithPIN bool // Whether locked rooms should be joinable by providing the PIN the room was locked with + PublicRoomNames *regexp.Regexp `json:"-"` // Regular expression that specifies room paths that may be created/joined without a user account. } func (config *Config) WithModule(m string) bool { diff --git a/go/channelling/data.go b/go/channelling/data.go index 960231b7..65a4aba8 100644 --- a/go/channelling/data.go +++ b/go/channelling/data.go @@ -21,6 +21,10 @@ package channelling +import ( + "github.com/strukturag/spreed-turnservicecli/turnservicecli" +) + type DataError struct { Type string Code string @@ -91,11 +95,18 @@ type DataSelf struct { Stun []string } +type DataTurnUpdate struct { + Type string + Turn *DataTurn +} + type DataTurn struct { - Username string `json:"username"` - Password string `json:"password"` - Ttl int `json:"ttl"` - Urls []string `json:"urls"` + Username string `json:"username"` + Password string `json:"password"` + Ttl int `json:"ttl"` + Urls []string `json:"urls,omitempty"` + Servers []*turnservicecli.URNsWithID `json:"servers,omitempty"` + GeoURI string `json:"geo_uri,omitempty"` } type DataSession struct { diff --git a/go/channelling/hub.go b/go/channelling/hub.go index 057fcb60..068e1e83 100644 --- a/go/channelling/hub.go +++ b/go/channelling/hub.go @@ -91,25 +91,39 @@ func (h *hub) ClientInfo(details bool) (clientCount int, sessions map[string]*Da return } -func (h *hub) CreateTurnData(session *Session) *DataTurn { - // Create turn data credentials for shared secret auth with TURN - // server. See http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 - // and https://code.google.com/p/rfc5766-turn-server/ REST API auth - // and set shared secret in TURN server with static-auth-secret. - if len(h.turnSecret) == 0 { - return &DataTurn{} +func (h *hub) CreateTurnData(sender Sender, session *Session) *DataTurn { + if len(h.turnSecret) > 0 { + // Create turn data credentials for shared secret auth with TURN + // server. See http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 + // and https://code.google.com/p/rfc5766-turn-server/ REST API auth + // and set shared secret in TURN server with static-auth-secret. + id := session.Id + bar := sha256.New() + bar.Write([]byte(id)) + id = base64.StdEncoding.EncodeToString(bar.Sum(nil)) + foo := hmac.New(sha1.New, h.turnSecret) + expiration := int32(time.Now().Unix()) + turnTTL + user := fmt.Sprintf("%d:%s", expiration, id) + foo.Write([]byte(user)) + password := base64.StdEncoding.EncodeToString(foo.Sum(nil)) + + return &DataTurn{ + Username: user, + Password: password, + Ttl: turnTTL, + Urls: h.config.TurnURIs, + } + } + + if h.config.TurnUsername != "" && h.config.TurnPassword != "" { + return &DataTurn{ + Username: h.config.TurnUsername, + Password: h.config.TurnPassword, + Urls: h.config.TurnURIs, + } } - id := session.Id - bar := sha256.New() - bar.Write([]byte(id)) - id = base64.StdEncoding.EncodeToString(bar.Sum(nil)) - foo := hmac.New(sha1.New, h.turnSecret) - expiration := int32(time.Now().Unix()) + turnTTL - user := fmt.Sprintf("%d:%s", expiration, id) - foo.Write([]byte(user)) - password := base64.StdEncoding.EncodeToString(foo.Sum(nil)) - return &DataTurn{user, password, turnTTL, h.config.TurnURIs} + return &DataTurn{} } func (h *hub) GetSession(id string) (session *Session, ok bool) { diff --git a/go/channelling/pipeline.go b/go/channelling/pipeline.go index 6f57303c..edca9580 100644 --- a/go/channelling/pipeline.go +++ b/go/channelling/pipeline.go @@ -112,6 +112,10 @@ func (pipeline *Pipeline) Send(b buffercache.Buffer) { // Noop. } +func (pipeline *Pipeline) Outgoing(m interface{}) { + // Noop. +} + func (pipeline *Pipeline) Index() uint64 { return 0 } diff --git a/go/channelling/room_manager.go b/go/channelling/room_manager.go index d72a8834..4ed4b12d 100644 --- a/go/channelling/room_manager.go +++ b/go/channelling/room_manager.go @@ -24,6 +24,7 @@ package channelling import ( "fmt" "log" + "strings" "sync" "github.com/nats-io/nats" @@ -63,6 +64,7 @@ type roomManager struct { roomTypes map[string]string globalRoomID string defaultRoomID string + caseSensitive bool } type roomTypeMessage struct { @@ -77,6 +79,7 @@ func NewRoomManager(config *Config, encoder OutgoingEncoder) RoomManager { OutgoingEncoder: encoder, roomTable: make(map[string]RoomWorker), roomTypes: make(map[string]string), + caseSensitive: config.RoomNameCaseSensitive, } if config.GlobalRoomID != "" { rm.globalRoomID = rm.MakeRoomID(config.GlobalRoomID, "") @@ -106,6 +109,9 @@ func (rooms *roomManager) setNatsRoomType(msg *roomTypeMessage) { return } + // TODO(fancycode): Should we use a separate mutex for this? + rooms.Lock() + defer rooms.Unlock() if msg.Type != "" { log.Printf("Setting room type for %s to %s\n", msg.Path, msg.Type) rooms.roomTypes[msg.Path] = msg.Type @@ -203,9 +209,17 @@ func (rooms *roomManager) Get(roomID string) (room RoomWorker, ok bool) { return } +func (rooms *roomManager) isPublicRoom(roomName string) bool { + return rooms.PublicRoomNames != nil && + rooms.PublicRoomNames.MatchString(roomName) +} + func (rooms *roomManager) GetOrCreate(roomID, roomName, roomType string, credentials *DataRoomCredentials, sessionAuthenticated bool) (RoomWorker, error) { + isPublic := false if rooms.AuthorizeRoomJoin && rooms.UsersEnabled && !sessionAuthenticated { - return nil, NewDataError("room_join_requires_account", "Room join requires a user account") + if isPublic = rooms.isPublicRoom(roomName); !isPublic { + return nil, NewDataError("room_join_requires_account", "Room join requires a user account") + } } if room, ok := rooms.Get(roomID); ok { @@ -225,8 +239,13 @@ func (rooms *roomManager) GetOrCreate(roomID, roomName, roomType string, credent } if rooms.UsersEnabled && rooms.AuthorizeRoomCreation && !sessionAuthenticated { - rooms.Unlock() - return nil, NewDataError("room_join_requires_account", "Room creation requires a user account") + // Only need to check for public room if not checked above. + if !isPublic { + if isPublic = rooms.isPublicRoom(roomName); !isPublic { + rooms.Unlock() + return nil, NewDataError("room_join_requires_account", "Room creation requires a user account") + } + } } room := NewRoomWorker(rooms, roomID, roomName, roomType, credentials) @@ -264,11 +283,18 @@ func (rooms *roomManager) MakeRoomID(roomName, roomType string) string { roomType = rooms.getConfiguredRoomType(roomName) } + if !rooms.caseSensitive { + roomName = strings.ToLower(roomName) + } return fmt.Sprintf("%s:%s", roomType, roomName) } func (rooms *roomManager) getConfiguredRoomType(roomName string) string { - if roomType, found := rooms.roomTypes[roomName]; found { + // TODO(fancycode): Should we use a separate mutex for this? + rooms.RLock() + roomType, found := rooms.roomTypes[roomName] + rooms.RUnlock() + if found { // Type of this room was overwritten through NATS. return roomType } diff --git a/go/channelling/room_manager_test.go b/go/channelling/room_manager_test.go index 579b33fd..a31f69f6 100644 --- a/go/channelling/room_manager_test.go +++ b/go/channelling/room_manager_test.go @@ -22,6 +22,7 @@ package channelling import ( + "regexp" "testing" "github.com/strukturag/spreed-webrtc/go/channelling" @@ -74,6 +75,55 @@ func Test_RoomManager_JoinRoom_ReturnsAnErrorForUnauthenticatedSessionsWhenJoinR assertDataError(t, err, "room_join_requires_account") } +func Test_RoomManager_JoinPublicRoom_ForUnauthenticatedSessionsWhenCreationRequiresAnAccount(t *testing.T) { + roomManager, config := NewTestRoomManager() + config.UsersEnabled = true + config.AuthorizeRoomCreation = true + + unauthenticatedSession := &Session{} + _, err := roomManager.JoinRoom(channelling.RoomTypeRoom+":public", "public", channelling.RoomTypeRoom, nil, unauthenticatedSession, false, nil) + assertDataError(t, err, "room_join_requires_account") + + config.PublicRoomNames = regexp.MustCompile("^public$") + _, err = roomManager.JoinRoom(channelling.RoomTypeRoom+":public", "public", channelling.RoomTypeRoom, nil, unauthenticatedSession, false, nil) + if err != nil { + t.Fatalf("Unexpected error %v joining public room", err) + } + + _, err = roomManager.JoinRoom(channelling.RoomTypeRoom+":private", "private", channelling.RoomTypeRoom, nil, unauthenticatedSession, false, nil) + assertDataError(t, err, "room_join_requires_account") +} + +func Test_RoomManager_JoinPublicRoom_ForUnauthenticatedSessionsWhenJoinRequiresAnAccount(t *testing.T) { + roomManager, config := NewTestRoomManager() + config.UsersEnabled = true + config.AuthorizeRoomJoin = true + + authenticatedSession := &Session{userid: "9870457"} + _, err := roomManager.JoinRoom(channelling.RoomTypeRoom+":public", "public", channelling.RoomTypeRoom, nil, authenticatedSession, true, nil) + if err != nil { + t.Fatalf("Unexpected error %v joining room while authenticated", err) + } + + unauthenticatedSession := &Session{} + _, err = roomManager.JoinRoom(channelling.RoomTypeRoom+":public", "public", channelling.RoomTypeRoom, nil, unauthenticatedSession, false, nil) + assertDataError(t, err, "room_join_requires_account") + + config.PublicRoomNames = regexp.MustCompile("^public$") + _, err = roomManager.JoinRoom(channelling.RoomTypeRoom+":public", "public", channelling.RoomTypeRoom, nil, unauthenticatedSession, false, nil) + if err != nil { + t.Fatalf("Unexpected error %v joining public room", err) + } + + _, err = roomManager.JoinRoom(channelling.RoomTypeRoom+":private", "private", channelling.RoomTypeRoom, nil, authenticatedSession, true, nil) + if err != nil { + t.Fatalf("Unexpected error %v joining room while authenticated", err) + } + + _, err = roomManager.JoinRoom(channelling.RoomTypeRoom+":private", "private", channelling.RoomTypeRoom, nil, unauthenticatedSession, false, nil) + assertDataError(t, err, "room_join_requires_account") +} + func Test_RoomManager_UpdateRoom_ReturnsAnErrorIfNoRoomHasBeenJoined(t *testing.T) { roomManager, _ := NewTestRoomManager() _, err := roomManager.UpdateRoom(&Session{}, nil) diff --git a/go/channelling/server/config.go b/go/channelling/server/config.go index fa234c28..f664e079 100644 --- a/go/channelling/server/config.go +++ b/go/channelling/server/config.go @@ -83,6 +83,7 @@ func NewConfig(container phoenix.Container, tokens bool) (*channelling.Config, e "youtube": true, "presentation": true, "contacts": true, + "roomlocking": true, } modules := []string{} for module := range modulesTable { @@ -118,6 +119,16 @@ func NewConfig(container phoenix.Container, tokens bool) (*channelling.Config, e } } + publicRoomNamesString := container.GetStringDefault("app", "publicRooms", "") + var publicRoomNames *regexp.Regexp + if publicRoomNamesString != "" { + var err error + if publicRoomNames, err = regexp.Compile(publicRoomNamesString); err != nil { + return nil, fmt.Errorf("Invalid regular expression '%s': %s", publicRoomNamesString, err) + } + log.Printf("Allowed public rooms: %s\n", publicRoomNamesString) + } + return &channelling.Config{ Title: container.GetStringDefault("app", "title", "Spreed WebRTC"), Ver: ver, @@ -127,6 +138,8 @@ func NewConfig(container phoenix.Container, tokens bool) (*channelling.Config, e Renegotiation: container.GetBoolDefault("app", "renegotiation", false), StunURIs: stunURIs, TurnURIs: turnURIs, + TurnUsername: container.GetStringDefault("app", "turnUsername", ""), + TurnPassword: container.GetStringDefault("app", "turnPassword", ""), Tokens: tokens, Version: version, UsersEnabled: container.GetBoolDefault("users", "enabled", false), @@ -143,6 +156,9 @@ func NewConfig(container phoenix.Container, tokens bool) (*channelling.Config, e ContentSecurityPolicyReportOnly: container.GetStringDefault("app", "contentSecurityPolicyReportOnly", ""), RoomTypeDefault: defaultRoomType, RoomTypes: roomTypes, + RoomNameCaseSensitive: container.GetBoolDefault("app", "caseSensitiveRooms", false), + LockedRoomJoinableWithPIN: container.GetBoolDefault("app", "lockedRoomJoinableWithPIN", true), + PublicRoomNames: publicRoomNames, }, nil } diff --git a/go/channelling/server/rooms.go b/go/channelling/server/rooms.go index 4172ce8d..2faafcf9 100644 --- a/go/channelling/server/rooms.go +++ b/go/channelling/server/rooms.go @@ -24,6 +24,7 @@ package server import ( "fmt" "net/http" + "strings" "github.com/strukturag/spreed-webrtc/go/randomstring" ) @@ -34,11 +35,16 @@ type Room struct { } type Rooms struct { + CaseSensitive bool } func (rooms *Rooms) Post(request *http.Request) (int, interface{}, http.Header) { name := randomstring.NewRandomString(11) + if !rooms.CaseSensitive { + name = strings.ToLower(name) + } + return 200, &Room{name, fmt.Sprintf("/%s", name)}, http.Header{"Content-Type": {"application/json"}} } diff --git a/go/channelling/turndata.go b/go/channelling/turndata.go index 71002494..c6991ee9 100644 --- a/go/channelling/turndata.go +++ b/go/channelling/turndata.go @@ -22,5 +22,5 @@ package channelling type TurnDataCreator interface { - CreateTurnData(*Session) *DataTurn + CreateTurnData(Sender, *Session) *DataTurn } diff --git a/go/channelling/turnservice_manager.go b/go/channelling/turnservice_manager.go new file mode 100644 index 00000000..3119c0c5 --- /dev/null +++ b/go/channelling/turnservice_manager.go @@ -0,0 +1,140 @@ +/* + * Spreed WebRTC. + * Copyright (C) 2013-2016 struktur AG + * + * This file is part of Spreed WebRTC. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +package channelling + +import ( + "log" + "sync" + "time" + + "github.com/strukturag/spreed-turnservicecli/turnservicecli" +) + +type TURNServiceManager interface { + TurnDataCreator +} + +type turnServiceManager struct { + sync.Mutex + pleaders map[uint64]Sender // Mapping of clients waiting to receive TURN data. + + uri string + accessToken string + clientID string + turnService *turnservicecli.TURNService +} + +func NewTURNServiceManager(uri string, accessToken string, clientID string) TURNServiceManager { + turnService := turnservicecli.NewTURNService(uri, 0, nil) + mgr := &turnServiceManager{ + uri: uri, + accessToken: accessToken, + clientID: clientID, + + turnService: turnService, + pleaders: make(map[uint64]Sender), + } + + turnService.Open(accessToken, clientID, "") + turnService.BindOnCredentials(mgr.onCredentials) + log.Println("Fetching TURN credentials from service") + go func() { + //time.Sleep(10000 * time.Millisecond) + turnService.Autorefresh(true) + }() + // Wait a bit, to give TURN service some time to populate credentials, so + // we avoid to have send them as an update for fast reconnecting clients. + time.Sleep(500 * time.Millisecond) + if mgr.turnService.Credentials(false) == nil { + log.Println("No TURN credentials from service on startup - extra traffic for clients connecting before credentials have been received") + } + + return mgr +} + +func (mgr *turnServiceManager) CreateTurnData(sender Sender, session *Session) *DataTurn { + credentials := mgr.turnService.Credentials(false) + turn, err := mgr.turnData(credentials) + if err != nil || turn.Ttl == 0 { + // When no data was return from service, refresh quickly. + mgr.Lock() + mgr.pleaders[sender.Index()] = sender + mgr.Unlock() + + // Have client come back early. + turn.Ttl = 300 + } + + return turn +} + +func (mgr *turnServiceManager) turnData(credentials *turnservicecli.CachedCredentialsData) (*DataTurn, error) { + turn := &DataTurn{} + if credentials != nil { + ttl := credentials.TTL() + if ttl > 0 { + turn.Username = credentials.Turn.Username + turn.Password = credentials.Turn.Password + turn.Servers = credentials.Turn.Servers + turn.Ttl = int(ttl) + turn.GeoURI = credentials.Turn.GeoURI + + if len(turn.Servers) > 0 { + // For backwards compatibility with clients which do not + // understand turn.Servers, directly deliver the TURN + // server zone URNs with the lowest priority. + minPrio := 0 + minPrioIdx := -1 + for idx, server := range turn.Servers { + if minPrioIdx == -1 || server.Prio < minPrio { + minPrio = server.Prio + minPrioIdx = idx + } + } + turn.Urls = turn.Servers[minPrioIdx].URNs + } + } + } + + return turn, nil +} + +func (mgr *turnServiceManager) onCredentials(credentials *turnservicecli.CachedCredentialsData, err error) { + if err != nil { + log.Printf("TURN credentials service error: %s\n", err.Error()) + return + } + + log.Println("Received TURN credentials from service", credentials.Turn.Username) + + mgr.Lock() + for _, sender := range mgr.pleaders { + if turn, err := mgr.turnData(credentials); err == nil { + sender.Outgoing(&DataTurnUpdate{ + Type: "TurnUpdate", + Turn: turn, + }) + } + } + mgr.pleaders = make(map[uint64]Sender) // Clear. + mgr.Unlock() +} diff --git a/go/natsconnection/natsconnection.go b/go/natsconnection/natsconnection.go index bf64bb7a..6c65990f 100644 --- a/go/natsconnection/natsconnection.go +++ b/go/natsconnection/natsconnection.go @@ -8,11 +8,14 @@ import ( "github.com/nats-io/nats" ) -// DefaultNatsEstablishTimeout is the default timeout for +// DefaultEstablishTimeout is the default timeout for // calls to EstablishNatsConnection. var DefaultEstablishTimeout = 60 * time.Second -// DefaultNatsURL is the default NATS server URL used for +// DefaultRequestTimeout is the default timeout for Request() calls. +var DefaultRequestTimeout = 5 * time.Second + +// DefaultURL is the default NATS server URL used for // calls to NewConnection and EstablishConnection. var DefaultURL = nats.DefaultURL @@ -138,3 +141,58 @@ func EstablishJSONEncodedConnection(timeout *time.Duration) (*EncodedConnection, } return &EncodedConnection{ec}, nil } + +// CallFuncWithRetry retries the given func when it does not return nil +// and the timeout duration has not been reached. It sleeps 1 second between +// each call. If the timeout is 0, the function will be retried forever. +func CallFuncWithRetry(f func() error, timeout time.Duration) error { + errch := make(chan error, 1) + quitch := make(chan bool) + var lastErr error + + // Start our worker loop. + go func() { + for { + select { + case <-quitch: + // Quit requested. + return + default: + // Call our target function. + err := f() + switch err { + case nil: + // No error, success. + errch <- err + return + default: + // Remember last error. + lastErr = err + } + time.Sleep(1 * time.Second) + } + } + }() + + // Create our wait channel. It either is an empty channel or + // it is filled when the timeout gets reached. + var waitch <-chan time.Time + if timeout == 0 { + // Create empty channel to wait forever. + waitch = make(<-chan time.Time) + } else { + waitch = time.After(timeout) + } + + // Wait until something happens, either nil result or timeout. + select { + case err := <-errch: + return err + case <-waitch: + quitch <- true + if lastErr != nil { + return lastErr + } + return errors.New("Call with retry: timeout") + } +} diff --git a/html/head.html b/html/head.html index f9a95ec3..ad653b77 100644 --- a/html/head.html +++ b/html/head.html @@ -12,4 +12,4 @@ <%template "extra-head" .%> <%.ExtraDHead%> -<%end%> +<%end%> diff --git a/scripts/docker_entrypoint.sh b/scripts/docker_entrypoint.sh index 9f23434d..d6f9030a 100644 --- a/scripts/docker_entrypoint.sh +++ b/scripts/docker_entrypoint.sh @@ -28,10 +28,10 @@ openssl x509 -in /srv/cert.pem -text if [ "$NEWSECRETS" = "1" -o ! -s /srv/secrets.conf ]; then echo "Creating new server secrets ..." rm -f /srv/secrets.conf.tmp - echo "SESSION_SECRET=$(randomhex 32)" >>/srv/secrets.conf.tmp - echo "ENCRYPTION_SECRET=$(randomhex 32)" >>/srv/secrets.conf.tmp - echo "SERVER_TOKEN=$(randomhex 32)" >>/srv/secrets.conf.tmp - echo "SHARED_SECRET=$(randomhex 32)" >>/srv/secrets.conf.tmp + echo "SESSION_SECRET=${SESSION_SECRET:-$(randomhex 32)}" >>/srv/secrets.conf.tmp + echo "ENCRYPTION_SECRET=${ENCRYPTION_SECRET:-$(randomhex 32)}" >>/srv/secrets.conf.tmp + echo "SERVER_TOKEN=${SERVER_TOKEN:-$(randomhex 32)}" >>/srv/secrets.conf.tmp + echo "SHARED_SECRET=${SHARED_SECRET:-$(randomhex 32)}" >>/srv/secrets.conf.tmp . /srv/secrets.conf.tmp sed -i -e "s/sessionSecret =.*/sessionSecret = $SESSION_SECRET/" /srv/spreed-webrtc/default.conf sed -i -e "s/encryptionSecret =.*/encryptionSecret = $ENCRYPTION_SECRET/" /srv/spreed-webrtc/default.conf diff --git a/server.conf.in b/server.conf.in index 1c5d5917..98d51ca8 100644 --- a/server.conf.in +++ b/server.conf.in @@ -57,6 +57,12 @@ listen = 127.0.0.1:8080 ; See http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 for details. ; A supported TURN server is https://code.google.com/p/rfc5766-turn-server/. ;turnSecret = the-default-turn-shared-secret-do-not-keep +; Fixed username/password credentials to be used for the TURN server. +; IMPORTANT: This will give all users connected to the spreed-webrtc service +; access to the credentials, so in almost all cases the shared secret mode +; should be used instead!! +;turnUsername = the-turn-username +;turnPassword = the-turn-secret ; Enable renegotiation support. Set to true to tell clients that they can ; renegotiate peer connections when required. Firefox support is not complete, ; so do not enable if you want compatibility with Firefox clients. @@ -82,13 +88,23 @@ encryptionSecret = tne-default-encryption-block-key ; all users will join this room if enabled. If it is disabled then a room join ; form will be shown instead. ;defaultRoomEnabled = true +; Whether the room names are case sensitive. If enabled, different casing +; of room names are different rooms. Optional. Defaults to false. +;caseSensitiveRooms = false ; Whether a user account is required to join a room. This only has an effect ; if user accounts are enabled. Optional, defaults to false. ;authorizeRoomJoin = false ; Whether a user account is required to create a room. This only has an effect ; if user accounts are enabled. Optional, defaults to false. ;authorizeRoomCreation = false -; Wether the pipelines API should be enabled. Optional, defaults to false. +; Whether locked rooms should be joinable by providing the PIN the room was +; locked with. Optional, defaults to true. +;lockedRoomJoinableWithPIN = true +; Regular expression specifying room names that can be created / joined without +; a valid user account (even if "authorizeRoomJoin" or "authorizeRoomCreation" +; is enabled). +;publicRooms = +; Whether the pipelines API should be enabled. Optional, defaults to false. ;pipelinesEnabled = false ; Server token is a public random string which is used to enhance security of ; server generated security tokens. When the serverToken is changed all existing @@ -139,6 +155,7 @@ serverRealm = local ;youtube = true ;presentation = true ;contacts = true +;roomlocking = true [log] ;logfile = /var/log/spreed-webrtc-server.log @@ -202,16 +219,29 @@ enabled = false ;allowRegistration = false [nats] +; Set to true, to connect to NATS on startup. If false, all other settins in the +; [nats] section are ignored. Defaults to false. +;useNATS = false ; Set to true, to enable triggering channelling events via NATS ;channelling_trigger = false +; NATS channel trigger subject. Defaults to 'channelling.trigger'. ;channelling_trigger_subject = channelling.trigger -; NATS server URL +; NATS server URL. ;url = nats://127.0.0.1:4222 -; NATS connect establish timeout in seconds +; NATS connect establish timeout in seconds. ;establishTimeout = 60 ; Use client_id to distinguish between multipe servers. The value is sent ; together with every NATS request. Defaults to empty. ;client_id = +; Set to true, to load additional configuration settings via NATS. The config +; loaded is applied after loading the [nats] section and all entries extend the +; configuration files with overwrite. Only takes effect when a NATS server URL +; is configured. Defaults to false. +;configFromNATS = false +;configFromNATSSubject = spreed-webrtc.config.get +; NATS config load timeout. If 0, then it waits forever, blocking the startup +; until the configuration was loaded from NATS. Defaults to 0. +;configFromNATSTimeout = 0 [roomtypes] ; You can define room types that should be used for given room names instead of @@ -226,3 +256,14 @@ enabled = false ; Example (all rooms below "conference/" are conference rooms): ;^conference/.+ = Conference ; + +[turnService] +; To avoid the setup of a self-owned TURN server, a TURN service can be used. +; When a turnServiceURI is set, TurnURIs in the [app] section are ignored. +;turnServiceURI = https://turnservice.spreed.me +; Access token for the TURN service. This is usually required and provided with +; your TURN service subscription. +;turnServiceAccessToken = some-secret-value +; The ClientID can be used to specify additional credentials if required +; by the TURN service. If empty, the value of turnServiceAccessToken is used. +;turnServiceClientID = diff --git a/src/app/spreed-webrtc-server/main.go b/src/app/spreed-webrtc-server/main.go index b1ebbc4e..60d8fe7a 100644 --- a/src/app/spreed-webrtc-server/main.go +++ b/src/app/spreed-webrtc-server/main.go @@ -62,6 +62,49 @@ var config *channelling.Config func runner(runtime phoenix.Runtime) error { log.SetFlags(log.LstdFlags | log.Lmicroseconds) + // Nats pub/sub supports. + useNats := runtime.GetBoolDefault("nats", "useNATS", false) + if useNats { + if natsURL, err := runtime.GetString("nats", "url"); err == nil { + if natsURL != "" { + natsconnection.DefaultURL = natsURL + } + } + if natsEstablishTimeout, err := runtime.GetInt("nats", "establishTimeout"); err == nil { + if natsEstablishTimeout != 0 { + natsconnection.DefaultEstablishTimeout = time.Duration(natsEstablishTimeout) * time.Second + } + } + } + natsClientId := runtime.GetStringDefault("nats", "client_id", "") + var natsChannellingTriggerSubject string + if runtime.GetBoolDefault("nats", "channelling_trigger", false) { + natsChannellingTriggerSubject = runtime.GetStringDefault("nats", "channelling_trigger_subject", "channelling.trigger") + } + + // Base services. + apiConsumer := channelling.NewChannellingAPIConsumer() + busManager := channelling.NewBusManager(apiConsumer, natsClientId, useNats, natsChannellingTriggerSubject) + + // Update configuration from NATS. + if useNats && runtime.GetBoolDefault("nats", "configFromNATS", false) { + log.Println("Fetching configuration from NATS") + configFromNATSSubject := runtime.GetStringDefault("nats", "configFromNATSSubject", "spreed-webrtc.config.get") + configFromNATSTimeout := time.Duration(runtime.GetIntDefault("nats", "configFromNATSTimeout", 0)) * time.Second + // Receive config from bus. + var req = &channelling.BusRequest{} + var res map[string]map[string]string + if err := busManager.BusRequestWithRetry(configFromNATSSubject, req, &res, configFromNATSTimeout, nil); err == nil { + if updateErr := runtime.Update(res); updateErr == nil { + log.Println("Updated configuration from NATS") + } else { + log.Println("Failed to update config with NATS updates", updateErr) + } + } else { + log.Println("Failed to fetch config from NATS", err) + } + } + rootFolder, err := runtime.GetString("http", "root") if err != nil { cwd, err2 := os.Getwd() @@ -158,21 +201,6 @@ func runner(runtime phoenix.Runtime) error { tokenProvider = channelling.TokenFileProvider(tokenFile) } - // Nats pub/sub supports. - natsChannellingTrigger, _ := runtime.GetBool("nats", "channelling_trigger") - natsChannellingTriggerSubject, _ := runtime.GetString("nats", "channelling_trigger_subject") - if natsURL, err := runtime.GetString("nats", "url"); err == nil { - if natsURL != "" { - natsconnection.DefaultURL = natsURL - } - } - if natsEstablishTimeout, err := runtime.GetInt("nats", "establishTimeout"); err == nil { - if natsEstablishTimeout != 0 { - natsconnection.DefaultEstablishTimeout = time.Duration(natsEstablishTimeout) * time.Second - } - } - natsClientId, _ := runtime.GetString("nats", "client_id") - // Load remaining configuration items. config, err = server.NewConfig(runtime, tokenProvider != nil) if err != nil { @@ -181,7 +209,7 @@ func runner(runtime phoenix.Runtime) error { // Load templates. templates = template.New("") - templates.Delims("<%", "%>") + templates.Delims("<%", "%>").Funcs(templateFuncMap()) // Load html templates folder err = filepath.Walk(path.Join(rootFolder, "html"), func(path string, info os.FileInfo, err error) error { @@ -282,7 +310,6 @@ func runner(runtime phoenix.Runtime) error { } // Prepare services. - apiConsumer := channelling.NewChannellingAPIConsumer() buddyImages := channelling.NewImageCache() codec := channelling.NewCodec(incomingCodecLimit) roomManager := channelling.NewRoomManager(config, codec) @@ -290,14 +317,23 @@ func runner(runtime phoenix.Runtime) error { tickets := channelling.NewTickets(sessionSecret, encryptionSecret, computedRealm) sessionManager := channelling.NewSessionManager(config, tickets, hub, roomManager, roomManager, buddyImages, sessionSecret) statsManager := channelling.NewStatsManager(hub, roomManager, sessionManager) - busManager := channelling.NewBusManager(apiConsumer, natsClientId, natsChannellingTrigger, natsChannellingTriggerSubject) pipelineManager := channelling.NewPipelineManager(busManager, sessionManager, sessionManager, sessionManager) if err := roomManager.SetBusManager(busManager); err != nil { return err } + // TURN data support. + var turnDataCreator channelling.TurnDataCreator + if turnServiceURI, _ := runtime.GetString("turnService", "turnServiceURI"); turnServiceURI != "" { + log.Printf("Using TURN service: %s\n", turnServiceURI) + turnServiceManager := channelling.NewTURNServiceManager(turnServiceURI, runtime.GetStringDefault("turnService", "turnServiceAccessToken", ""), runtime.GetStringDefault("turnService", "turnServiceClientID", "")) + turnDataCreator = turnServiceManager + } else { + turnDataCreator = hub + } + // Create API. - channellingAPI := api.New(config, roomManager, tickets, sessionManager, statsManager, hub, hub, hub, busManager, pipelineManager) + channellingAPI := api.New(config, roomManager, tickets, sessionManager, statsManager, hub, turnDataCreator, hub, busManager, pipelineManager) apiConsumer.SetChannellingAPI(channellingAPI) // Start bus. @@ -317,7 +353,7 @@ func runner(runtime phoenix.Runtime) error { // Add RESTful API end points. rest := sloth.NewAPI() rest.SetMux(r.PathPrefix("/api/v1/").Subrouter()) - rest.AddResource(&server.Rooms{}, "/rooms") + rest.AddResource(&server.Rooms{config.RoomNameCaseSensitive}, "/rooms") rest.AddResource(config, "/config") rest.AddResourceWithWrapper(&server.Tokens{tokenProvider}, httputils.MakeGzipHandler, "/tokens") diff --git a/src/app/spreed-webrtc-server/template.go b/src/app/spreed-webrtc-server/template.go new file mode 100644 index 00000000..de058ef3 --- /dev/null +++ b/src/app/spreed-webrtc-server/template.go @@ -0,0 +1,39 @@ +/* + * Spreed WebRTC. + * Copyright (C) 2013-2016 struktur AG + * + * This file is part of Spreed WebRTC. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +package main + +import ( + "encoding/json" + "html/template" +) + +func templateFuncMap() template.FuncMap { + return template.FuncMap{ + "json": func(obj interface{}) (template.JS, error) { + data, err := json.Marshal(obj) + if err != nil { + return "", err + } + return template.JS(data), nil + }, + } +} diff --git a/src/app/spreed-webrtc-server/template_test.go b/src/app/spreed-webrtc-server/template_test.go new file mode 100644 index 00000000..3b34c95e --- /dev/null +++ b/src/app/spreed-webrtc-server/template_test.go @@ -0,0 +1,50 @@ +/* + * Spreed WebRTC. + * Copyright (C) 2013-2016 struktur AG + * + * This file is part of Spreed WebRTC. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +package main + +import ( + "bytes" + "html/template" + "testing" +) + +const ( + templateString = `` + expectedString = `` +) + +type testPerson struct { + Name string `json:"name"` +} + +func TestHTMLTemplateWithJSON(t *testing.T) { + tmpl := template.New("").Funcs(templateFuncMap()) + if _, err := tmpl.Parse(templateString); err != nil { + t.Fatalf("Could not parse template '%s': %s", templateString, err.Error()) + } + buf := bytes.NewBuffer(nil) + tmpl.Execute(buf, testPerson{Name: "Peter"}) + out := buf.String() + if out != expectedString { + t.Fatalf("Strings do not match: got '%s', want '%s'", out, expectedString) + } +} diff --git a/src/audio/_build.py b/src/audio/_build.py index 63d670e2..85659ef5 100755 --- a/src/audio/_build.py +++ b/src/audio/_build.py @@ -1,5 +1,6 @@ #!/usr/bin/python +import audioop import wave import os import glob @@ -9,6 +10,11 @@ import math silenceDuration = 0.05 # Seconds of silence between merged files outfile = "sprite1.wav" # Output file. Will be saved in the path below. +# Map containing volume adjustments for some of the files. +AUDIO_FACTORS = { + 'end1.wav': 0.5, +} + def main(folder="./files"): currentTime = 0 @@ -16,10 +22,10 @@ def main(folder="./files"): # Open output file output = wave.open(outfile, 'wb') - + # Loop through files in folder and append to outfile - for i, infile in enumerate(glob.glob(os.path.join(folder, '*.wav'))): - + for i, infile in enumerate(sorted(glob.glob(os.path.join(folder, '*.wav')))): + # Open file and get info w = wave.open(infile, 'rb') soundDuration = w.getnframes() / float(w.getframerate()) @@ -32,7 +38,11 @@ def main(folder="./files"): silenceFrames = "".join(wave.struct.pack('h', item) for item in silenceData) # Output sound + silence to file - output.writeframes(w.readframes(w.getnframes())) + samples = w.readframes(w.getnframes()) + factor = AUDIO_FACTORS.get(os.path.basename(infile), None) + if factor is not None: + samples = audioop.mul(samples, w.getsampwidth(), factor) + output.writeframes(samples) output.writeframes(silenceFrames) w.close() @@ -47,7 +57,9 @@ def main(folder="./files"): output.close() # Output howler sprite data - print json.dumps(sprite, sort_keys=True, indent=4, separators=(',', ': ')) - + sprites = json.dumps(sprite, sort_keys=True, indent=4, separators=(',', ': ')) + sprites = '\n'.join([x.rstrip() for x in sprites.split('\n')]) + '\n' + file('sprite1.json', 'wb').write(sprites) + if __name__ == "__main__": main() diff --git a/src/audio/_encode.sh b/src/audio/_encode.sh index 5075146a..04b864bc 100755 --- a/src/audio/_encode.sh +++ b/src/audio/_encode.sh @@ -7,4 +7,4 @@ avconv -y -i .tmp-sprite1.wav -aq 2 -acodec libvorbis sprite1.ogg rm -f .tmp-sprite1.wav -cp -fv sprite1.{mp3,ogg} ../../static/sounds +cp -fv sprite1.{json,mp3,ogg} ../../static/sounds diff --git a/src/audio/sprite1.json b/src/audio/sprite1.json new file mode 100644 index 00000000..58cd9116 --- /dev/null +++ b/src/audio/sprite1.json @@ -0,0 +1,34 @@ +{ + "connect1": [ + 0, + 5179 + ], + "end1": [ + 5228, + 6199 + ], + "entry1": [ + 11476, + 3000 + ], + "leaving1": [ + 14526, + 2126 + ], + "message1": [ + 16701, + 816 + ], + "question1": [ + 17567, + 3313 + ], + "ringtone1": [ + 20929, + 935 + ], + "whistle1": [ + 21913, + 1405 + ] +} diff --git a/src/audio/sprite1.mp3 b/src/audio/sprite1.mp3 index 45be868f..d965a27e 100644 Binary files a/src/audio/sprite1.mp3 and b/src/audio/sprite1.mp3 differ diff --git a/src/audio/sprite1.ogg b/src/audio/sprite1.ogg index 7ff04fd0..4a814feb 100644 Binary files a/src/audio/sprite1.ogg and b/src/audio/sprite1.ogg differ diff --git a/src/audio/sprite1.wav b/src/audio/sprite1.wav index 863336ff..d073f3e8 100644 Binary files a/src/audio/sprite1.wav and b/src/audio/sprite1.wav differ diff --git a/src/i18n/helpers/languages.py b/src/i18n/helpers/languages.py index 00cd6af8..c3cb28a3 100644 --- a/src/i18n/helpers/languages.py +++ b/src/i18n/helpers/languages.py @@ -5,11 +5,14 @@ LANGUAGES = { "en": "English", "de": "Deutsch", + "fr": "Français", "zh-cn": "中文(简体)", "zh-tw": "繁體中文", "ko": "한국어", "ja": "日本語", "ru": "Русский", + "es": "Español", + "it": "Italiano", } import json diff --git a/src/i18n/messages-de.po b/src/i18n/messages-de.po index 3c9f06ac..fb50c5c1 100644 --- a/src/i18n/messages-de.po +++ b/src/i18n/messages-de.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Spreed WebRTC 1.0\n" "Report-Msgid-Bugs-To: simon@struktur.de\n" -"POT-Creation-Date: 2016-02-17 14:15+0100\n" -"PO-Revision-Date: 2016-02-17 14:16+0100\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" +"PO-Revision-Date: 2016-08-18 18:24+0100\n" "Last-Translator: Simon Eisenmann \n" "Language-Team: struktur AG \n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -307,9 +307,6 @@ msgstr "" msgid "Your ID" msgstr "Ihre ID" -msgid "Register" -msgstr "Registrieren" - msgid "" "Authenticated by certificate. To log out you have to remove your " "certificate from the browser." @@ -457,6 +454,9 @@ msgstr "" "Ihre ID bleibt dennoch gespeichert. Klicken Sie Ausloggen weiter oben um " "die ID zu löschen." +msgid "Room PIN" +msgstr "Raum-PIN" + msgid "Room link" msgstr "Raum-Link" @@ -759,6 +759,12 @@ msgstr "Browsereinstellung" msgid "Meet with me here:" msgstr "Meeting:" +msgid "Please enter a new Room PIN to lock the room" +msgstr "Bitte geben Sie eine neue Raum-PIN ein um diesen Raum abzuschliessen" + +msgid "Do you want to unlock the room?" +msgstr "Möchten Sie diesen Raum aufschliessen?" + msgid "Room name" msgstr "Raum-Name" @@ -877,3 +883,6 @@ msgstr "Unbekannt" msgid "Me" msgstr "Ich" +#~ msgid "Register" +#~ msgstr "Registrieren" + diff --git a/src/i18n/messages-es.po b/src/i18n/messages-es.po new file mode 100644 index 00000000..d3c42176 --- /dev/null +++ b/src/i18n/messages-es.po @@ -0,0 +1,892 @@ +# Spanish translations for Spreed WebRTC. +# Copyright (C) 2016 struktur AG +# This file is distributed under the same license as the Spreed WebRTC +# project. +# FIRST AUTHOR , 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Spreed WebRTC 1.0\n" +"Report-Msgid-Bugs-To: simon@struktur.de\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Jhon Felipe Urrego Mejia " +"\n" +"Language-Team: es \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Standard view" +msgstr "Vista estándar" + +msgid "Large view" +msgstr "Vista grande" + +msgid "Kiosk view" +msgstr "Vista de Quiosco" + +msgid "Auditorium" +msgstr "Auditorio" + +msgid "Start chat" +msgstr "Iniciar chat" + +msgid "Start video call" +msgstr "Iniciar videollamada" + +msgid "Start audio conference" +msgstr "Iniciar conferencia de audio" + +msgid "No one else here" +msgstr "No hay nadie aquí" + +msgid "Take" +msgstr "Tomar" + +msgid "Retake" +msgstr "Repetir" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "Set as Profile Picture" +msgstr "Establecer como imagen de perfil" + +msgid "Take picture" +msgstr "Tomar foto" + +msgid "Upload picture" +msgstr "Subir imagen" + +msgid "Waiting for camera" +msgstr "Esperando cámara" + +msgid "Picture" +msgstr "Imagen" + +msgid "The file couldn't be read." +msgstr "El archivo no pudo ser leído." + +msgid "The file is not an image." +msgstr "El archivo no es una imagen." + +#, python-format +msgid "The file is too large. Max. %d MB." +msgstr "El archivo es demasiado grande. Max. %d MB." + +msgid "Select file" +msgstr "Seleccionar archivo" + +msgid "Chat sessions" +msgstr "Sesiones de chat" + +msgid "Room chat" +msgstr "Sala de chat" + +msgid "Peer to peer" +msgstr "Extremo a extremo" + +msgid "Close chat" +msgstr "Cerrar chat" + +msgid "Upload files" +msgstr "Subir archivos" + +msgid "Share my location" +msgstr "Compartir mi ubicación" + +msgid "Clear chat" +msgstr "Borrar chat" + +msgid "is typing..." +msgstr "está escribiendo..." + +msgid "has stopped typing..." +msgstr "ha dejado de escribir..." + +msgid "Type here to chat..." +msgstr "Escriba aquí para charlar..." + +msgid "Send" +msgstr "Enviar" + +msgid "Accept" +msgstr "Aceptar" + +msgid "Reject" +msgstr "Rechazar" + +msgid "You have no contacts." +msgstr "No dispone de contactos." + +msgid "" +"To add new contacts, join a room and create a contact add request by " +"clicking on the star icon next to a user entry." +msgstr "" +"Para agregar nuevos contactos, unirse a una sala y crear una solicitud de" +" contacto al hacer click en el icono de la estrella junto al nombre del " +"usuario." + +msgid "Edit contact" +msgstr "Editar contacto" + +msgid "Edit" +msgstr "Editar" + +msgid "Name" +msgstr "Nombre" + +msgid "Remove" +msgstr "Remover" + +msgid "Refresh" +msgstr "Refrescar" + +msgid "Save" +msgstr "Guardar" + +msgid "Close" +msgstr "Cerrar" + +msgid "File sharing" +msgstr "Compartir archivos" + +msgid "File is no longer available" +msgstr "El archivo ya no está disponible" + +msgid "Download" +msgstr "Descargar" + +msgid "Open" +msgstr "Abierto" + +msgid "Unshare" +msgstr "No compartir" + +msgid "Retry" +msgstr "Reintentar" + +msgid "Download failed." +msgstr "Error de descarga." + +msgid "Share a YouTube video" +msgstr "Compartir un vídeo de YouTube" + +msgid "Share a file as presentation" +msgstr "Compartir un archivo como presentación" + +msgid "Share your screen" +msgstr "Compartir la pantalla" + +msgid "Chat" +msgstr "Chat" + +msgid "Contacts" +msgstr "Contactos" + +msgid "Mute microphone" +msgstr "Silenciar micrófono" + +msgid "Turn camera off" +msgstr "Apagar cámara" + +msgid "Settings" +msgstr "Ajustes" + +msgid "Loading presentation ..." +msgstr "Cargando la presentación ..." + +msgid "Please upload a document" +msgstr "Subir un documento" + +msgid "" +"Documents are shared with everyone in this call. The supported file types" +" are PDF and OpenDocument files." +msgstr "" +"Los documentos son compartidos con todos los participantes en esta " +"llamada. Los tipos de archivo admitidos son PDF y archivos OpenDocument." + +msgid "Upload" +msgstr "Subir" + +msgid "You can drag files here too." +msgstr "Puede arrastrar archivos aquí también." + +msgid "Presentation controls" +msgstr "Controles de presentación" + +msgid "Prev" +msgstr "Ant" + +msgid "Next" +msgstr "Sig" + +msgid "Change room" +msgstr "Cambiar de sala" + +msgid "Room" +msgstr "Sala" + +msgid "Leave room" +msgstr "Abandonar sala" + +msgid "Main" +msgstr "Principal" + +msgid "Current room" +msgstr "Sala actual" + +msgid "Screen sharing options" +msgstr "Opciones para compartir pantalla" + +msgid "Fit screen." +msgstr "Ajustar pantalla." + +msgid "Share screen" +msgstr "Compartir pantalla" + +msgid "Please select what to share." +msgstr "Seleccione qué compartir." + +msgid "Screen" +msgstr "Pantalla" + +msgid "Window" +msgstr "Ventana" + +msgid "Application" +msgstr "Aplicación" + +msgid "Share the whole screen. Click share to select the screen." +msgstr "" +"Compartir toda la pantalla. Haga clic en Compartir para seleccionar la " +"pantalla." + +msgid "Share a single window. Click share to select the window." +msgstr "" +"Compartir una sola ventana. Haga clic en Compartir para seleccionar la " +"ventana." + +msgid "" +"Share all windows of a application. This can leak content behind windows " +"when windows get moved. Click share to select the application." +msgstr "" +"Compartir todas las ventanas de una aplicación. Esto puede gotear el " +"contenido detrás de Windows Cuando Windows se mueven. Haga clic en " +"Compartir para seleccionar la aplicación." + +msgid "Share" +msgstr "Compartir" + +msgid "OK" +msgstr "OK" + +msgid "Profile" +msgstr "Perfil" + +msgid "Your name" +msgstr "Su nombre" + +msgid "Your picture" +msgstr "Su imagen" + +msgid "Status message" +msgstr "Mensaje de estado" + +msgid "What's on your mind?" +msgstr "¿Qué está pensando?" + +msgid "" +"Your picture, name and status message identify yourself in calls, chats " +"and rooms." +msgstr "" +"Su imagen, nombre y mensaje de estado te identificará en llamadas, chat y" +" en las salas." + +msgid "Your ID" +msgstr "Su ID" + +msgid "" +"Authenticated by certificate. To log out you have to remove your " +"certificate from the browser." +msgstr "" +"Autentificado por certificado. Para cerrar su sesión tendrá que quitar el" +" certificado de su navegador." + +msgid "Sign in" +msgstr "Iniciar sesión" + +msgid "Create an account" +msgstr "Crear una cuenta" + +msgid "Sign out" +msgstr "Cerrar sesión" + +msgid "Manage account" +msgstr "Administrar cuenta" + +msgid "Media" +msgstr "Medios" + +msgid "Microphone" +msgstr "Micrófono" + +msgid "Camera" +msgstr "Cámara" + +msgid "Video quality" +msgstr "Calidad de vídeo" + +msgid "Low" +msgstr "Baja" + +msgid "High" +msgstr "Alta" + +msgid "HD" +msgstr "HD" + +msgid "Full HD" +msgstr "Full HD" + +msgid "General" +msgstr "General" + +msgid "Language" +msgstr "Idioma" + +msgid "Language changes become active on reload." +msgstr "Cambios de lenguaje se vuelven activos al recargar." + +msgid "Default room" +msgstr "Sala predeterminada" + +msgid "Set alternative room to join at start." +msgstr "Establecer otra sala para unirse al inicio." + +msgid "Notifications" +msgstr "Notificaciones" + +msgid "Desktop notification" +msgstr "Notificación de escritorio" + +msgid "Enable" +msgstr "Activar" + +msgid "Denied - check your browser settings" +msgstr "Denegado - compruebe la configuración de su navegador" + +msgid "Allowed" +msgstr "Permitido" + +msgid "Sounds for incoming messages" +msgstr "Sonidos para los mensajes entrantes" + +msgid "Ring on incoming calls" +msgstr "Sonar con llamadas entrantes" + +msgid "Sounds for users in current room" +msgstr "Sonidos para usuarios en sala actual" + +msgid "Advanced settings" +msgstr "Configuración avanzada" + +msgid "Play audio on same device as selected microphone" +msgstr "Reproducir audio en el mismo dispositivo seleccionado como micrófono" + +msgid "Experimental AEC" +msgstr "Cancelación de Eco Acústico Experimental" + +msgid "Experimental AGC" +msgstr "Control de Ganancia Automática Experimental" + +msgid "Experimental noise suppression" +msgstr "Supresión de ruido experimental" + +msgid "Max video frame rate" +msgstr "Máx. velocidad de fotogramas de vídeo" + +msgid "auto" +msgstr "auto" + +msgid "Send stereo audio" +msgstr "Enviar audio estéreo" + +msgid "" +"Sending stereo audio disables echo cancellation. Enable only if you have " +"stereo input." +msgstr "" +"Envío de audio estéreo desactiva la cancelación del eco. Activar sólo si " +"tienes La entrada estéreo." + +msgid "Detect CPU over use" +msgstr "detectar sobreuso de la CPU" + +msgid "Automatically reduces video quality as needed." +msgstr "Reduce automáticamente la calidad de vídeo cuando sea necesario." + +msgid "Optimize for high resolution video" +msgstr "Optimizar para vídeo de alta resolución" + +msgid "Reduce video noise" +msgstr "Reducir el ruido de vídeo" + +msgid "Prefer VP9 video codec" +msgstr "Prefiere VP9 códec de vídeo" + +msgid "Enable experiments" +msgstr "Permitir experimentos" + +msgid "Show advanced settings" +msgstr "Mostrar opciones avanzadas" + +msgid "Hide advanced settings" +msgstr "Ocultar opciones avanzadas" + +msgid "Remember settings" +msgstr "Recordar la configuración" + +msgid "" +"Your ID will still be kept - press the log out button above to delete the" +" ID." +msgstr "" +"Su ID será conservada - Pulse el botón Cerrar sesión anterior para " +"eliminar el ID." + +#, fuzzy +msgid "Room PIN" +msgstr "Link de Sala" + +msgid "Room link" +msgstr "Link de Sala" + +msgid "Invite by Email" +msgstr "Invitar por correo electrónico" + +msgid "Invite with Facebook" +msgstr "Invitar con Facebook" + +msgid "Invite with Twitter" +msgstr "Invitar con Twitter" + +msgid "Invite with Google Plus" +msgstr "Invitar con Google Plus" + +msgid "Invite with XING" +msgstr "Invitar con XING" + +msgid "Initializing" +msgstr "Inicializando" + +msgid "Online" +msgstr "En línea" + +msgid "Calling" +msgstr "LLamando" + +msgid "Hangup" +msgstr "Colgar" + +msgid "In call with" +msgstr "En llamada con" + +msgid "Conference with" +msgstr "Conferencia con" + +msgid "Your are offline" +msgstr "está desconectado" + +msgid "Go online" +msgstr "Ir Online" + +msgid "Connection interrupted" +msgstr "Conexión interrumpida" + +msgid "An error occured" +msgstr "Un error ha ocurrido" + +msgid "Incoming call" +msgstr "Llamada entrante" + +msgid "from" +msgstr "desde" + +msgid "Accept call" +msgstr "Aceptar llamada" + +msgid "Waiting for camera/microphone access" +msgstr "Esperando acceso cámara/micrófono" + +msgid "Your audio level" +msgstr "Tu nivel de audio" + +msgid "Checking camera and microphone access." +msgstr "Control de acceso a la cámara y el micrófono." + +msgid "Please allow access to your camera and microphone." +msgstr "Por favor, permitir el acceso a la cámara y al micrófono." + +msgid "Camera / microphone access required." +msgstr "Cámara / micrófono requiere acceso." + +msgid "" +"Please check your browser settings and allow camera and microphone access" +" for this site." +msgstr "" +"Compruebe la configuración de su navegador y permita el acceso a la " +"cámara y el micrófono para este sitio." + +msgid "Skip check" +msgstr "Saltar la comprobación" + +msgid "Click here for help (Google Chrome)." +msgstr "Haga clic aquí para obtener ayuda (Google Chrome)." + +msgid "Please set your user details and settings." +msgstr "Configure su información de usuario y de configuración." + +msgid "Enter a room name" +msgstr "Introduzca un nombre de sala" + +msgid "Random room name" +msgstr "Nombre de la sala aleatorio" + +msgid "Enter room" +msgstr "Ingresar a sala" + +msgid "" +"Enter the name of an existing room. You can create new rooms when you are" +" signed in." +msgstr "" +"Introduzca el nombre de la sala existente. Puede crear nuevas salas " +"cuando estás adentro de la aplicación." + +msgid "Room history" +msgstr "Historial de Salas" + +msgid "Please sign in." +msgstr "Identifícate." + +msgid "Videos play simultaneously for everyone in this call." +msgstr "Reproducir videos simultáneamente para todos en esta llamada." + +msgid "YouTube URL" +msgstr "URL de YouTube" + +msgid "" +"Could not load YouTube player API, please check your network / firewall " +"settings." +msgstr "" +"No se pudo cargar API del reproductor de YouTube, compruebe la red / " +"firewall Ajustes." + +msgid "Currently playing" +msgstr "Actualmente reproduciendo" + +msgid "YouTube controls" +msgstr "Controles en YouTube" + +msgid "YouTube video to share" +msgstr "Compartir video YouTube" + +msgid "Peer to peer chat active." +msgstr "Chat P2P activo." + +msgid "Peer to peer chat is now off." +msgstr "Chat P2P está ahora desactivado." + +msgid " is now offline." +msgstr " está ahora desconectado." + +msgid " is now online." +msgstr " está ahora en línea." + +msgid "You share file:" +msgstr "Compartir archivo:" + +msgid "Incoming file:" +msgstr "Archivo entrante:" + +msgid "You shared your location:" +msgstr "Ha compartido su ubicación:" + +msgid "Location received:" +msgstr "Ubicación recibida:" + +msgid "You accepted the contact request." +msgstr "Ha aceptado la solicitud de contacto." + +msgid "You rejected the contact request." +msgstr "Ha rechazado la solicitud de contacto." + +msgid "You sent a contact request." +msgstr "Ha enviado una solicitud de contacto." + +msgid "Your contact request was accepted." +msgstr "Su solicitud de contacto fue aceptada." + +msgid "Incoming contact request." +msgstr "Solicitud de contacto entrante." + +msgid "Your contact request was rejected." +msgstr "Fue rechazada su solicitud de contacto." + +msgid "Edit Contact" +msgstr "Editar contacto" + +msgid "Your browser does not support WebRTC. No calls possible." +msgstr "Su explorador no soporta WebRTC. No hay posibilidad de realizar llamadas." + +msgid "Close this window and disconnect?" +msgstr "Cerrar esta ventana y desconectar?" + +msgid "Contacts Manager" +msgstr "Administrador de contactos" + +msgid "Restart required to apply updates. Click ok to restart now." +msgstr "" +"Es necesario reiniciar para aplicar las actualizaciones. Haga clic en " +"Aceptar para reiniciar el sistema ahora." + +msgid "Failed to access camera/microphone." +msgstr "Error al acceder a la cámara/micrófono." + +msgid "Failed to establish peer connection." +msgstr "Error al establecer conexión P2P." + +msgid "We are sorry but something went wrong. Boo boo." +msgstr "Lo sentimos, pero algo salió mal. AHHHHHHH." + +msgid "Oops" +msgstr "Ooops" + +msgid "Peer connection failed. Check your settings." +msgstr "Conexión P2P fallida. Compruebe su configuración." + +msgid "User hung up because of error." +msgstr "Usuario colgó debido a un error." + +msgid " is busy. Try again later." +msgstr " está ocupado. Vuelva a intentarlo más tarde." + +msgid " rejected your call." +msgstr " rechazó su llamada." + +msgid " does not pick up." +msgstr " no contesta." + +msgid " tried to call you" +msgstr " intentó llamarte" + +msgid " called you" +msgstr " le llamó" + +msgid "Your browser is not supported. Please upgrade to a current version." +msgstr "Su navegador no es compatible. Actualice a una versión actual." + +msgid "Chat with" +msgstr "Chatear con" + +msgid "Message from " +msgstr "Mensaje de " + +#, python-format +msgid "You are now in room %s ..." +msgstr "Ahora estás en la sala %s ..." + +msgid "Your browser does not support file transfer." +msgstr "Tu navegador no soporta transferencia de archivos." + +msgid "Could not load PDF: Please make sure to select a PDF document." +msgstr "No se pudo cargar el PDF: asegúrese de seleccionar un documento PDF." + +msgid "Could not load PDF: Missing PDF file." +msgstr "No se pudo cargar el PDF: Falta el archivo PDF." + +#, python-format +msgid "An error occurred while loading the PDF (%s)." +msgstr "Se ha producido un error al cargar el archivo PDF (%s)." + +msgid "An unknown error occurred while loading the PDF." +msgstr "Se ha producido un error desconocido al cargar el PDF." + +#, python-format +msgid "An error occurred while loading the PDF page (%s)." +msgstr "Se ha producido un error al cargar la página PDF (%s)." + +msgid "An unknown error occurred while loading the PDF page." +msgstr "Se ha producido un error desconocido mientras se carga la página PDF." + +#, python-format +msgid "An error occurred while rendering the PDF page (%s)." +msgstr "Se ha producido un error al procesar la página PDF (%s)." + +msgid "An unknown error occurred while rendering the PDF page." +msgstr "Se ha producido un error desconocido al procesar la página PDF." + +msgid "Only PDF documents and OpenDocument files can be shared at this time." +msgstr "" +"Sólo documentos PDF y archivos OpenDocument puede ser compartido en este " +"momento." + +#, python-format +msgid "Failed to start screen sharing (%s)." +msgstr "No se pudo iniciar el uso compartido de la pantalla (%s)." + +msgid "" +"Permission to start screen sharing was denied. Make sure to have enabled " +"screen sharing access for your browser. Copy chrome://flags/#enable-" +"usermedia-screen-capture and open it with your browser and enable the " +"flag on top. Then restart the browser and you are ready to go." +msgstr "" +"Permiso para comenzar a compartir la pantalla fue denegada. Asegúrese de " +"haber activado compartir el acceso a la pantalla para su navegador. " +"Copiar chrome://flags/#enable-usermedia-screen-capture y ábralo con su " +"navegador y habilitar la bandera en la parte superior. A continuación, " +"reinicie el navegador y listo." + +msgid "Permission to start screen sharing was denied." +msgstr "Permiso para comenzar a compartir la pantalla fue denegado." + +msgid "Use browser language" +msgstr "Utilizar el idioma del navegador" + +msgid "Meet with me here:" +msgstr "Reunirse conmigo aquí:" + +msgid "Please enter a new Room PIN to lock the room" +msgstr "" + +msgid "Do you want to unlock the room?" +msgstr "" + +msgid "Room name" +msgstr "Nombre de sala" + +msgid "" +"The request contains an invalid parameter value. Please check the URL of " +"the video you want to share and try again." +msgstr "" +"La solicitud contiene un valor de parámetro no válido. Compruebe la " +"dirección URL de el vídeo que desea compartir e inténtelo de nuevo." + +msgid "" +"The requested content cannot be played in an HTML5 player or another " +"error related to the HTML5 player has occurred. Please try again later." +msgstr "" +"El contenido solicitado no se puede reproducir en un reproductor HTML5 u " +"otro error relacionado con el reproductor HTML5 ha ocurrido. Por favor, " +"inténtelo de nuevo más tarde." + +msgid "" +"The video requested was not found. Please check the URL of the video you " +"want to share and try again." +msgstr "" +"El video solicitado no fue encontrado. Compruebe la URL del video que " +"quieres compartir e inténtelo de nuevo." + +msgid "" +"The owner of the requested video does not allow it to be played in " +"embedded players." +msgstr "" +"El propietario del vídeo solicitado no le permite ser reproducido en " +"reproductores incrustados." + +#, python-format +msgid "" +"An unknown error occurred while playing back the video (%s). Please try " +"again later." +msgstr "" +"Se ha producido un error desconocido mientras se reproduce el vídeo (%s)." +" Por favor intente más tarde." + +msgid "" +"An unknown error occurred while playing back the video. Please try again " +"later." +msgstr "" +"Se ha producido un error desconocido mientras se reproduce el vídeo. Por " +"favor, inténtelo de nuevo más adelante." + +msgid "Unknown URL format. Please make sure to enter a valid YouTube URL." +msgstr "" +"Formato URL desconocido. Por favor, asegúrese de escribir una dirección " +"URL válida de YouTube." + +msgid "Error" +msgstr "Error" + +msgid "Hint" +msgstr "Sugerencia" + +msgid "Please confirm" +msgstr "Confirme" + +msgid "More information required" +msgstr "Se necesita más información" + +msgid "Ok" +msgstr "Ok" + +msgid "" +"Screen sharing requires a browser extension. Please add the Spreed WebRTC" +" screen sharing extension to Chrome and try again." +msgstr "" +"Se requiere una extensión del navegador para Compartir Pantalla. Por " +"favor, añada la extensión Spreed WebRTC screen sharing a Chrome e " +"inténtelo de nuevo." + +msgid "Access code required" +msgstr "Código de acceso requerido" + +msgid "Access denied" +msgstr "Acceso denegado" + +msgid "Please provide a valid access code." +msgstr "Proporcione un código de acceso válido." + +msgid "" +"Failed to verify access code. Check your Internet connection and try " +"again." +msgstr "" +"No se ha podido verificar el código de acceso. Compruebe su conexión a " +"Internet e intente una vez más." + +#, python-format +msgid "PIN for room %s is now '%s'." +msgstr "PIN de sala %s es ahora '%s'." + +#, python-format +msgid "PIN lock has been removed from room %s." +msgstr "bloqueo de PIN se ha eliminado desde la sala %s." + +#, python-format +msgid "Enter the PIN for room %s" +msgstr "Introducir el PIN para sala %s" + +msgid "Please sign in to create rooms." +msgstr "Inicie sesión para crear nuevas salas." + +#, python-format +msgid "and %s" +msgstr "y %s" + +#, python-format +msgid "and %d others" +msgstr "y %d otros" + +msgid "User" +msgstr "Usuario" + +msgid "Someone" +msgstr "Alguien" + +msgid "Me" +msgstr "Yo" + +#~ msgid "Register" +#~ msgstr "Registrar" + diff --git a/src/i18n/messages-fr.po b/src/i18n/messages-fr.po new file mode 100644 index 00000000..7798399e --- /dev/null +++ b/src/i18n/messages-fr.po @@ -0,0 +1,888 @@ +# French translations for Spreed WebRTC. +# Copyright (C) 2014 struktur AG +# This file is distributed under the same license as Spreed WebRTC +# project. +# Florent BEAUCHAMP , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: Spreed WebRTC 1.0\n" +"Report-Msgid-Bugs-To: simon@struktur.de\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" +"PO-Revision-Date: 2016-02-17 14:16+0100\n" +"Last-Translator: Florent BEAUCHAMP \n" +"Language-Team: Florent BEAUCHAMP \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Standard view" +msgstr "Mode standard" + +msgid "Large view" +msgstr "Mode large" + +msgid "Kiosk view" +msgstr "Mode kiosque" + +msgid "Auditorium" +msgstr "Mode auditorium" + +msgid "Start chat" +msgstr "Démarrer le chat" + +msgid "Start video call" +msgstr "Appel vidéo" + +msgid "Start audio conference" +msgstr "Appel audio" + +msgid "No one else here" +msgstr "Personne n'est connecté" + +msgid "Take" +msgstr "Répondre" + +msgid "Retake" +msgstr "Refaire" + +msgid "Cancel" +msgstr "Annuler" + +msgid "Set as Profile Picture" +msgstr "Définir comme avatar" + +msgid "Take picture" +msgstr "Prendre une photo" + +msgid "Upload picture" +msgstr "Envoyer une photo" + +msgid "Waiting for camera" +msgstr "En attente de la camera" + +msgid "Picture" +msgstr "Avatar" + +msgid "The file couldn't be read." +msgstr "Le fichier ne peux pas être lu." + +msgid "The file is not an image." +msgstr "Le fichier n'est pas une image." + +#, python-format +msgid "The file is too large. Max. %d MB." +msgstr "Le ficheir est trop gros. Max. %d MB." + +msgid "Select file" +msgstr "Choisir un fichier" + +msgid "Chat sessions" +msgstr "Session de chat" + +msgid "Room chat" +msgstr "Chat de cette salle" + +msgid "Peer to peer" +msgstr "Peer-to-peer" + +msgid "Close chat" +msgstr "Fermer le chat" + +msgid "Upload files" +msgstr "Envoyer les fichiers" + +msgid "Share my location" +msgstr "Partager mon emplacement" + +msgid "Clear chat" +msgstr "Effacer le chat" + +msgid "is typing..." +msgstr "est en train de taper..." + +msgid "has stopped typing..." +msgstr "a fini de taper..." + +msgid "Type here to chat..." +msgstr "Taper ici pour chatter..." + +msgid "Send" +msgstr "Envoyer" + +msgid "Accept" +msgstr "Accepter" + +msgid "Reject" +msgstr "Refuser" + +msgid "You have no contacts." +msgstr "Vous n'avez pas de contact." + +msgid "" +"To add new contacts, join a room and create a contact add request by " +"clicking on the star icon next to a user entry." +msgstr "" +"Pour ajouter des contacts, rejoignez une salle et faites une requête " +"d'ajout de contact en cliquant sur l'étoile à côté de la fiche d'un " +"utilisateur." + +msgid "Edit contact" +msgstr "Modifier le contact" + +msgid "Edit" +msgstr "Modifier" + +msgid "Name" +msgstr "Nom" + +msgid "Remove" +msgstr "Enlever" + +msgid "Refresh" +msgstr "Actualiser" + +msgid "Save" +msgstr "Enregistrer" + +msgid "Close" +msgstr "Fermer" + +msgid "File sharing" +msgstr "Partage de fichier" + +msgid "File is no longer available" +msgstr "Ce fichier n'est plus disponible" + +msgid "Download" +msgstr "Télécharger" + +msgid "Open" +msgstr "Ouvrir" + +msgid "Unshare" +msgstr "Ne plus partager" + +msgid "Retry" +msgstr "Réessayer" + +msgid "Download failed." +msgstr "Echec du téléchargement." + +msgid "Share a YouTube video" +msgstr "Partager une vidéo Youtube" + +msgid "Share a file as presentation" +msgstr "Partager une présentation" + +msgid "Share your screen" +msgstr "Partager votre écran" + +msgid "Chat" +msgstr "Chat" + +msgid "Contacts" +msgstr "Contact" + +msgid "Mute microphone" +msgstr "Couper le micro" + +msgid "Turn camera off" +msgstr "Couper la caméra" + +msgid "Settings" +msgstr "Paramètres" + +msgid "Loading presentation ..." +msgstr "Chargement de la présentation..." + +msgid "Please upload a document" +msgstr "Merci d'envoyer un document" + +msgid "" +"Documents are shared with everyone in this call. The supported file types" +" are PDF and OpenDocument files." +msgstr "" +"Les documents sont partagés avec tous les participants à cet appel. Les " +"documents PDF et opendocument sont supportés." + +msgid "Upload" +msgstr "Sélectionner un fichier" + +msgid "You can drag files here too." +msgstr "Vous pouvez aussi déposer les fichiers ici." + +msgid "Presentation controls" +msgstr "Controles de présentation" + +msgid "Prev" +msgstr "Préc." + +msgid "Next" +msgstr "Suiv." + +msgid "Change room" +msgstr "Changer de salle" + +msgid "Room" +msgstr "Salle" + +msgid "Leave room" +msgstr "Quitter la salle" + +msgid "Main" +msgstr "Principale" + +msgid "Current room" +msgstr "Salle actuelle" + +msgid "Screen sharing options" +msgstr "Options de partage d'écran" + +msgid "Fit screen." +msgstr "Adapter à l'écran." + +msgid "Share screen" +msgstr "Partager mon écran" + +msgid "Please select what to share." +msgstr "Merci de choisir l'écran à partager." + +msgid "Screen" +msgstr "Moniteur" + +msgid "Window" +msgstr "Fenêtre" + +msgid "Application" +msgstr "Application" + +msgid "Share the whole screen. Click share to select the screen." +msgstr "Partager tout le moniteur. Cliquez pour choisir le moniteur." + +msgid "Share a single window. Click share to select the window." +msgstr "Partager une seule fenêtre. Cliquez pour choisir la fenêtre." + +msgid "" +"Share all windows of a application. This can leak content behind windows " +"when windows get moved. Click share to select the application." +msgstr "" +"Partager toutes les fenêtres d'une application. Ceci peux amener à " +"montrer du contenu situé derrière une fenêtre lorsqu'elle est déplacée. " +"Cliquez pour sélectionner l'application." + +msgid "Share" +msgstr "Partager" + +msgid "OK" +msgstr "OK" + +msgid "Profile" +msgstr "Profil" + +msgid "Your name" +msgstr "Votre nom" + +msgid "Your picture" +msgstr "Votre avatar" + +msgid "Status message" +msgstr "Message de statut" + +msgid "What's on your mind?" +msgstr "Quel est votre état d'esprit?" + +msgid "" +"Your picture, name and status message identify yourself in calls, chats " +"and rooms." +msgstr "" +"Votre avatar, nom et état d'esprit servent à vous identifier dans les " +"appels, chat et salle." + +msgid "Your ID" +msgstr "Votre ID" + +msgid "" +"Authenticated by certificate. To log out you have to remove your " +"certificate from the browser." +msgstr "" +"Authentifié par certificat. Vous devrez effacer le certificat de votre " +"navigateur pour vous déconnecter." + +msgid "Sign in" +msgstr "Connnexion" + +msgid "Create an account" +msgstr "Créer un compte" + +msgid "Sign out" +msgstr "Deconnexion" + +msgid "Manage account" +msgstr "Gestion du compte" + +msgid "Media" +msgstr "Webcam / Micro" + +msgid "Microphone" +msgstr "Micro" + +msgid "Camera" +msgstr "Webcam" + +msgid "Video quality" +msgstr "Qualité vidéo" + +msgid "Low" +msgstr "Basse" + +msgid "High" +msgstr "Haute" + +msgid "HD" +msgstr "HD" + +msgid "Full HD" +msgstr "Full HD" + +msgid "General" +msgstr "Général" + +msgid "Language" +msgstr "Langue" + +msgid "Language changes become active on reload." +msgstr "Rechargez la page pour prendre en compte le changement de langue." + +msgid "Default room" +msgstr "Salle par défaut" + +msgid "Set alternative room to join at start." +msgstr "Nom de la salle à rejoindre à la connexion." + +msgid "Notifications" +msgstr "Notifications" + +msgid "Desktop notification" +msgstr "Notifications sur le bureau" + +msgid "Enable" +msgstr "Activer" + +msgid "Denied - check your browser settings" +msgstr "Interdit - vérifier les paramètres de votre navigateur" + +msgid "Allowed" +msgstr "Autorisé" + +msgid "Sounds for incoming messages" +msgstr "Son pour les messages entrant" + +msgid "Ring on incoming calls" +msgstr "Sonnerie pour les appels entrant" + +msgid "Sounds for users in current room" +msgstr "Son pour les participants de la salle courante" + +msgid "Advanced settings" +msgstr "Réglages avancés" + +msgid "Play audio on same device as selected microphone" +msgstr "Ecouter l'audio sur le même materiel que le micro" + +msgid "Experimental AEC" +msgstr "AEC (experimental)" + +msgid "Experimental AGC" +msgstr "AGC (experimental)" + +msgid "Experimental noise suppression" +msgstr "Suppresion de bruit (experimental)" + +msgid "Max video frame rate" +msgstr "Image par seconde max" + +msgid "auto" +msgstr "auto" + +msgid "Send stereo audio" +msgstr "Envoyer de l'audio stéréo" + +msgid "" +"Sending stereo audio disables echo cancellation. Enable only if you have " +"stereo input." +msgstr "" +"Envoyer de l'audio en stéréo désactive la suppression de l'écho. Utilisez" +" le uniquement si vous avez un micro stéréo." + +msgid "Detect CPU over use" +msgstr "Détecter un usage processeur excessif" + +msgid "Automatically reduces video quality as needed." +msgstr "Réduire automatiquement la qualité vidéo si besoin." + +msgid "Optimize for high resolution video" +msgstr "Optimiser la vidéo pour la haute résolution" + +msgid "Reduce video noise" +msgstr "Réduire le bruit vidéo" + +msgid "Prefer VP9 video codec" +msgstr "Utiliser le codec VP9 en priorité" + +msgid "Enable experiments" +msgstr "Activer les réglages experimentaux" + +msgid "Show advanced settings" +msgstr "Montrer les réglages avancés" + +msgid "Hide advanced settings" +msgstr "Masquer les réglage avancés" + +msgid "Remember settings" +msgstr "Se souvenir des réglages" + +msgid "" +"Your ID will still be kept - press the log out button above to delete the" +" ID." +msgstr "" +"Votre ID sera conservé - appuyer sur le bouton de déconnection pour " +"l'effacer." + +#, fuzzy +msgid "Room PIN" +msgstr "Lien vers la salle" + +msgid "Room link" +msgstr "Lien vers la salle" + +msgid "Invite by Email" +msgstr "Inviter par email" + +msgid "Invite with Facebook" +msgstr "Inviter par Facebook" + +msgid "Invite with Twitter" +msgstr "Inviter par Twitter" + +msgid "Invite with Google Plus" +msgstr "Inviter par Google Plus" + +msgid "Invite with XING" +msgstr "Inviter par XING" + +msgid "Initializing" +msgstr "En cours d'initialisation" + +msgid "Online" +msgstr "En ligne" + +msgid "Calling" +msgstr "Appel en cours" + +msgid "Hangup" +msgstr "Raccrocher" + +msgid "In call with" +msgstr "En communication avec" + +msgid "Conference with" +msgstr "En conférence avec" + +msgid "Your are offline" +msgstr "Vous êtes hors ligne" + +msgid "Go online" +msgstr "Passer en ligne" + +msgid "Connection interrupted" +msgstr "Connection interrompue" + +msgid "An error occured" +msgstr "Une erreur est survenue" + +msgid "Incoming call" +msgstr "Appel entrant" + +msgid "from" +msgstr "de" + +msgid "Accept call" +msgstr "Accepter l'appel" + +msgid "Waiting for camera/microphone access" +msgstr "En attente de l'accès à la webcam et au micro" + +msgid "Your audio level" +msgstr "Niveau de votre audio" + +msgid "Checking camera and microphone access." +msgstr "Vérification de l'accès à la webcam et au micro." + +msgid "Please allow access to your camera and microphone." +msgstr "Merci d'autoriser l'accès à la webcam et au micro." + +msgid "Camera / microphone access required." +msgstr "Accès requis à la webcam et au micro." + +msgid "" +"Please check your browser settings and allow camera and microphone access" +" for this site." +msgstr "" +"Merci de verifier les reglages de votre navigateur et pour autoriser " +"l'accès à votre micro et a votre webcam pour ce site." + +msgid "Skip check" +msgstr "Passer la vérification" + +msgid "Click here for help (Google Chrome)." +msgstr "Cliquez ici pour l'aide (Google Chrome)." + +msgid "Please set your user details and settings." +msgstr "Merci de mettre à jours votre profil et vos paramètres." + +msgid "Enter a room name" +msgstr "Entrer un nom de salle" + +msgid "Random room name" +msgstr "Nom aléatoire" + +msgid "Enter room" +msgstr "Rejoindre la salle" + +msgid "" +"Enter the name of an existing room. You can create new rooms when you are" +" signed in." +msgstr "" +"Entrez le nom d'une salle existante. Vous pouvez créer de nouvelles " +"salles lorsque vous êtes connecté." + +msgid "Room history" +msgstr "Historique de la salle" + +msgid "Please sign in." +msgstr "Merci de vous connecter." + +msgid "Videos play simultaneously for everyone in this call." +msgstr "Les vidéos sont lues de manière synchronisée entre tous les participants." + +msgid "YouTube URL" +msgstr "URL YouTube" + +msgid "" +"Could not load YouTube player API, please check your network / firewall " +"settings." +msgstr "" +"Impossible de charger le lecteur de video Youtube. Merci de vérifier vos " +"paramètres de réseau et pare-feu." + +msgid "Currently playing" +msgstr "Lecture en cours" + +msgid "YouTube controls" +msgstr "Contrôles youtube" + +msgid "YouTube video to share" +msgstr "Vidéo YouTube à partager" + +msgid "Peer to peer chat active." +msgstr "Chat privé actif." + +msgid "Peer to peer chat is now off." +msgstr "Chat privé désactivé." + +msgid " is now offline." +msgstr " est passé hors ligne." + +msgid " is now online." +msgstr " est passé en ligne." + +msgid "You share file:" +msgstr "Vous partagez le fichier:" + +msgid "Incoming file:" +msgstr "Fichier entrant:" + +msgid "You shared your location:" +msgstr "Vous partagez votre emplacement:" + +msgid "Location received:" +msgstr "Emplacement reçu:" + +msgid "You accepted the contact request." +msgstr "Vous avez accepté la demande de mise en relation." + +msgid "You rejected the contact request." +msgstr "Vous avez refusé la demande de mise en relation." + +msgid "You sent a contact request." +msgstr "Vous avez envoyé une demande de mise en relation." + +msgid "Your contact request was accepted." +msgstr "Votre requête de mise en relation a été acceptée." + +msgid "Incoming contact request." +msgstr "Arrivée d'une demande de mise en relation." + +msgid "Your contact request was rejected." +msgstr "Votre requête de mise en relation a été refusée." + +msgid "Edit Contact" +msgstr "Modifier le contact" + +msgid "Your browser does not support WebRTC. No calls possible." +msgstr "Votre navigateur ne supporte pas WebRTC. Appels impossible." + +msgid "Close this window and disconnect?" +msgstr "Voulez fermer cette fenêtre et vous déconnecter?" + +msgid "Contacts Manager" +msgstr "Gestionnaire de contacts" + +msgid "Restart required to apply updates. Click ok to restart now." +msgstr "" +"Un redémarrage est requis pour appliquer les mises à jour. Cliquez sur OK" +" pour redémarrer." + +msgid "Failed to access camera/microphone." +msgstr "Impossible d'accéder à la webcam et au micro." + +msgid "Failed to establish peer connection." +msgstr "Impossible d'établir la connexion de pair a pair." + +msgid "We are sorry but something went wrong. Boo boo." +msgstr "Nous sommes désolé, mais quelque chose à planté. Ouin." + +msgid "Oops" +msgstr "Oups" + +msgid "Peer connection failed. Check your settings." +msgstr "La connection avec le pair à échoué. Vérifiez vos réglages." + +msgid "User hung up because of error." +msgstr "Le participant à raccroché suite à une erreur." + +msgid " is busy. Try again later." +msgstr " est occupé. Réessayez plus tard." + +msgid " rejected your call." +msgstr " à refuser votre appel." + +msgid " does not pick up." +msgstr " n'a pas répondu." + +msgid " tried to call you" +msgstr " a essayé de vous appeler." + +msgid " called you" +msgstr " vous a appelé" + +msgid "Your browser is not supported. Please upgrade to a current version." +msgstr "" +"Votre navigateur n'est pas supporté. Merci de le mettre à jout vers une " +"version plus récente." + +msgid "Chat with" +msgstr "Chat avec" + +msgid "Message from " +msgstr "Message de " + +#, python-format +msgid "You are now in room %s ..." +msgstr "Vous avez rejoint la salle %s ..." + +msgid "Your browser does not support file transfer." +msgstr "Votre navigateur ne supporte pas les transferts de fichier." + +msgid "Could not load PDF: Please make sure to select a PDF document." +msgstr "" +"Impossible de charger le PDF: merci de vérifier que vous avez sélectionné" +" un PDF." + +msgid "Could not load PDF: Missing PDF file." +msgstr "Impossible de charger le PDF: le fichier PDF est manquant." + +#, python-format +msgid "An error occurred while loading the PDF (%s)." +msgstr "Une erreur est survenue lors du chargement du PDF (%s)." + +msgid "An unknown error occurred while loading the PDF." +msgstr "Une erreur inconnue est survenue lors du chargement du PDF." + +#, python-format +msgid "An error occurred while loading the PDF page (%s)." +msgstr "Une erreur est survenue lors du chargement du PDF (%s)." + +msgid "An unknown error occurred while loading the PDF page." +msgstr "Une erreur inconnue est survenue lors du chargement du PDF (%s)." + +#, python-format +msgid "An error occurred while rendering the PDF page (%s)." +msgstr "Une erreur est survenue lors du rendu du PDF (%s)." + +msgid "An unknown error occurred while rendering the PDF page." +msgstr "Une erreur inconnue est survenue lors du rendu du PDF." + +msgid "Only PDF documents and OpenDocument files can be shared at this time." +msgstr "" +"Pour l'instant, seuls les documents au format PDF et open documents " +"peuvent être partagés." + +#, python-format +msgid "Failed to start screen sharing (%s)." +msgstr "Impossible de démarrer le partage d'écran (%s)." + +msgid "" +"Permission to start screen sharing was denied. Make sure to have enabled " +"screen sharing access for your browser. Copy chrome://flags/#enable-" +"usermedia-screen-capture and open it with your browser and enable the " +"flag on top. Then restart the browser and you are ready to go." +msgstr "" +"La permission de démarrer le partage d'écran a été refusée. Soyez sûr que" +" vous avez activez le partage pour votre navigateur. Copiez " +"chrome://flags/#enable-usermedia-screen-capture dans votre barre " +"d'adresse et activez le, puis redémarrez votre navigateur." + +msgid "Permission to start screen sharing was denied." +msgstr "La permission de partager l'écran a été refusé." + +msgid "Use browser language" +msgstr "Utiliser la langue du navigateur" + +msgid "Meet with me here:" +msgstr "Rejoins moi là:" + +msgid "Please enter a new Room PIN to lock the room" +msgstr "" + +msgid "Do you want to unlock the room?" +msgstr "" + +msgid "Room name" +msgstr "Nom de la salle" + +msgid "" +"The request contains an invalid parameter value. Please check the URL of " +"the video you want to share and try again." +msgstr "" +"La requête contient des paramètres invalides. Merci de vérifier l'URL de " +"la vidéo que vous voulez partager." + +msgid "" +"The requested content cannot be played in an HTML5 player or another " +"error related to the HTML5 player has occurred. Please try again later." +msgstr "" +"Le contenu requis ne peux pas être pas lu par le lecteur HTML5, ou une " +"autre erreur en relation avec le lecteur HTML5 est survenu. Merci de " +"réessayer plus tard." + +msgid "" +"The video requested was not found. Please check the URL of the video you " +"want to share and try again." +msgstr "" +"Cette vidéo n'a pas été trouvée. Merci de vérifier l'URL de la vidéo que " +"vous souhaitez partager et réessayez." + +msgid "" +"The owner of the requested video does not allow it to be played in " +"embedded players." +msgstr "" +"Le propriétaire de la vidéo ne vous permet pas de la lire dans un lecteur" +" vidéo embarqué." + +#, python-format +msgid "" +"An unknown error occurred while playing back the video (%s). Please try " +"again later." +msgstr "" +"Une erreur inconnue est survenue lors de la lecture de la vidéo (%s). " +"Merci de réessayer plus tard." + +msgid "" +"An unknown error occurred while playing back the video. Please try again " +"later." +msgstr "" +"Une erreur inconnue est survenue lors de la lecture de la vidéo. Merci de" +" réessayer plus tard." + +msgid "Unknown URL format. Please make sure to enter a valid YouTube URL." +msgstr "" +"Format d'URL inconnu. Merci de vérifier qu'il s'agit d'une URL Youtube " +"valide." + +msgid "Error" +msgstr "Erreur" + +msgid "Hint" +msgstr "Information" + +msgid "Please confirm" +msgstr "Merci de confirmer" + +msgid "More information required" +msgstr "Il faut plus d'information" + +msgid "Ok" +msgstr "OK" + +msgid "" +"Screen sharing requires a browser extension. Please add the Spreed WebRTC" +" screen sharing extension to Chrome and try again." +msgstr "" +"Le partage d'écran nécessite une extension pour le navigateur. Merci " +"d'ajouter l'extension \"Spreed WebRTC screen sharing\"." + +msgid "Access code required" +msgstr "Code d'accès requis" + +msgid "Access denied" +msgstr "Accès refusé" + +msgid "Please provide a valid access code." +msgstr "Merci de donner un code d'accès valide." + +msgid "" +"Failed to verify access code. Check your Internet connection and try " +"again." +msgstr "" +"Impossible de vérifier votre code d'accès. Vérifiez votre connection et " +"réssayez." + +#, python-format +msgid "PIN for room %s is now '%s'." +msgstr "Le code PIN pour la salle %s est maintenant '%s'." + +#, python-format +msgid "PIN lock has been removed from room %s." +msgstr "La salle %s n'est plus proteger par un code PIN." + +#, python-format +msgid "Enter the PIN for room %s" +msgstr "Entrez le code PIN pour la salle %s" + +msgid "Please sign in to create rooms." +msgstr "Merci de vous connecter pour créer des salles." + +#, python-format +msgid "and %s" +msgstr "et %s" + +#, python-format +msgid "and %d others" +msgstr "et %d autres" + +msgid "User" +msgstr "Participa,t" + +msgid "Someone" +msgstr "Quelqu'un" + +msgid "Me" +msgstr "Moi" + +#~ msgid "Register" +#~ msgstr "S'enregistrer" + diff --git a/src/i18n/messages-it.po b/src/i18n/messages-it.po new file mode 100644 index 00000000..fad1d03c --- /dev/null +++ b/src/i18n/messages-it.po @@ -0,0 +1,886 @@ +# Translations template for Spreed WebRTC. +# Copyright (C) 2016 struktur AG +# This file is distributed under the same license as the Spreed WebRTC +# project. +# Riccardo Olivo , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: Spreed WebRTC 1.0\n" +"Report-Msgid-Bugs-To: simon@struktur.de\n" +"POT-Creation-Date: 2016-11-11 02:29+0100\n" +"PO-Revision-Date: 2016-11-11 02:30+0100\n" +"Last-Translator: \n" +"Language-Team: Riccardo Olivo \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Standard view" +msgstr "Visualizzazione standard" + +msgid "Large view" +msgstr "Visualizzazione estesa" + +msgid "Kiosk view" +msgstr "Visualizzazione chiosco" + +msgid "Auditorium" +msgstr "Auditorium" + +msgid "Start chat" +msgstr "Inizia chat" + +msgid "Start video call" +msgstr "Inizia chiamata video" + +msgid "Start audio conference" +msgstr "Inizia chiamata audio" + +msgid "No one else here" +msgstr "Nessun altro qui" + +msgid "Take" +msgstr "Scatta" + +msgid "Retake" +msgstr "Riscatta" + +msgid "Cancel" +msgstr "Annulla" + +msgid "Set as Profile Picture" +msgstr "Imposta come immagine profilo" + +msgid "Take picture" +msgstr "Scatta immagine" + +msgid "Upload picture" +msgstr "Carica immagine" + +msgid "Waiting for camera" +msgstr "In attesa della fotocamera" + +msgid "Picture" +msgstr "Immagine" + +msgid "The file couldn't be read." +msgstr "Il file non può essere aperto." + +msgid "The file is not an image." +msgstr "Il file non è un immagine." + +#, python-format +msgid "The file is too large. Max. %d MB." +msgstr "Questo file è di dimensioni eccessive. Max. %d MB." + +msgid "Select file" +msgstr "Seleziona file" + +msgid "Chat sessions" +msgstr "Sessioni di chat" + +msgid "Room chat" +msgstr "Room chat" + +msgid "Peer to peer" +msgstr "Peer-to-peer" + +msgid "Close chat" +msgstr "Chiudi la chat" + +msgid "Upload files" +msgstr "Carica file" + +msgid "Share my location" +msgstr "Condividi la mia posizione" + +msgid "Clear chat" +msgstr "Pulisci chat" + +msgid "is typing..." +msgstr "sta scrivendo..." + +msgid "has stopped typing..." +msgstr "ha smesso di scrivere..." + +msgid "Type here to chat..." +msgstr "Scrivi qui per chattare..." + +msgid "Send" +msgstr "Invia" + +msgid "Accept" +msgstr "Accetta" + +msgid "Reject" +msgstr "Rifiuta" + +msgid "You have no contacts." +msgstr "Non hai contatti." + +msgid "" +"To add new contacts, join a room and create a contact add request by " +"clicking on the star icon next to a user entry." +msgstr "" +"Per aggiungere nuovi contatti unisciti a una room e crea una richiesta di " +"aggiunta contatto cliccando sull'icona a forma di stella vicina a un utente." + +msgid "Edit contact" +msgstr "Modifica contatto" + +msgid "Edit" +msgstr "Modifica" + +msgid "Name" +msgstr "Nome" + +msgid "Remove" +msgstr "Rimuovi" + +msgid "Refresh" +msgstr "Aggiorna" + +msgid "Save" +msgstr "Salva" + +msgid "Close" +msgstr "Chiudi" + +msgid "File sharing" +msgstr "Condividi file" + +msgid "File is no longer available" +msgstr "Il file non è più disponibile" + +msgid "Download" +msgstr "Scarica" + +msgid "Open" +msgstr "Apri" + +msgid "Unshare" +msgstr "Rimuovi condivisione" + +msgid "Retry" +msgstr "Riprova" + +msgid "Download failed." +msgstr "Scaricamento fallito." + +msgid "Share a YouTube video" +msgstr "Condividi un video YouTube" + +msgid "Share a file as presentation" +msgstr "Condividi un file come presentazione" + +msgid "Share your screen" +msgstr "Condividi il tuo schermo" + +msgid "Chat" +msgstr "Chat" + +msgid "Contacts" +msgstr "Contatti" + +msgid "Mute microphone" +msgstr "Silenzia il microfono" + +msgid "Turn camera off" +msgstr "Spegni la videocamera" + +msgid "Settings" +msgstr "Impostazioni" + +msgid "Loading presentation ..." +msgstr "Caricando la presentazione..." + +msgid "Please upload a document" +msgstr "Carica un documento" + +msgid "" +"Documents are shared with everyone in this call. The supported file types " +"are PDF and OpenDocument files." +msgstr "" +"I documenti sono condivisi con tutti i partecipanti a questa chiamata. I " +"tipi di file supportati sono PDF e OpenDocument." + +msgid "Upload" +msgstr "Carica" + +msgid "You can drag files here too." +msgstr "Puoi trascinare i file qui." + +msgid "Presentation controls" +msgstr "Controlli presentazione" + +msgid "Prev" +msgstr "Precedente" + +msgid "Next" +msgstr "Prossimo" + +msgid "Change room" +msgstr "Scegli la stanza" + +msgid "Room" +msgstr "Stanza" + +msgid "Leave room" +msgstr "Lascia la stanza" + +msgid "Main" +msgstr "Principale" + +msgid "Current room" +msgstr "Stanza corrente" + +msgid "Screen sharing options" +msgstr "Opzioni condivisione schermo" + +msgid "Fit screen." +msgstr "Adatta allo schermo." + +msgid "Share screen" +msgstr "Condividi schermo" + +msgid "Please select what to share." +msgstr "Scegli cosa condividere." + +msgid "Screen" +msgstr "Schermo" + +msgid "Window" +msgstr "Finestra" + +msgid "Application" +msgstr "Applicazione" + +msgid "Share the whole screen. Click share to select the screen." +msgstr "" +"Condividi l'intero schermo. Fai click su condividi per selezionare lo " +"schermo." + +msgid "Share a single window. Click share to select the window." +msgstr "" +"Condividi una singola finestra. Fai click su condividi per selezionare la " +"singola finestra." + +msgid "" +"Share all windows of a application. This can leak content behind windows " +"when windows get moved. Click share to select the application." +msgstr "" +"Condividi tutte le finestre di un'applicazione. Questa opzione può mostrare " +"il contenuto dietro alle finestre quando queste vengono spostate. Fai click " +"su condividi per selezionare l'applicazione." + +msgid "Share" +msgstr "Condividi" + +msgid "OK" +msgstr "OK" + +msgid "Profile" +msgstr "Profilo" + +msgid "Your name" +msgstr "Il tuo nome" + +msgid "Your picture" +msgstr "La tua immagine" + +msgid "Status message" +msgstr "Stato" + +msgid "What's on your mind?" +msgstr "A cosa pensi?" + +msgid "" +"Your picture, name and status message identify yourself in calls, chats and " +"rooms." +msgstr "" +"La tua immagine, il tuo nome ed il tuo stato vengono visualizzati nelle " +"chiamate, nelle chat e nelle stanze." + +msgid "Your ID" +msgstr "Il tuo ID" + +msgid "" +"Authenticated by certificate. To log out you have to remove your certificate " +"from the browser." +msgstr "" +"Autenticazione eseguita con certificato. Per disconnettersi rimuovere il " +"certificato dal browser." + +msgid "Sign in" +msgstr "Accedi" + +msgid "Create an account" +msgstr "Crea un account" + +msgid "Sign out" +msgstr "Disconnettiti" + +msgid "Manage account" +msgstr "Gestisci account" + +msgid "Media" +msgstr "Dispositivi" + +msgid "Microphone" +msgstr "Microfono" + +msgid "Camera" +msgstr "Videocamera" + +msgid "Video quality" +msgstr "Qualità video" + +msgid "Low" +msgstr "Bassa" + +msgid "High" +msgstr "Alta" + +msgid "HD" +msgstr "HD" + +msgid "Full HD" +msgstr "Full HD" + +msgid "General" +msgstr "Generale" + +msgid "Language" +msgstr "Lingua" + +msgid "Language changes become active on reload." +msgstr "" +"Le modifiche alla lingua diventano effettive con l'aggiornamento della " +"pagina." + +msgid "Default room" +msgstr "Stanza predefinita" + +msgid "Set alternative room to join at start." +msgstr "Imposta l'ingresso in una stanza alternativa all'avvio." + +msgid "Notifications" +msgstr "Notifiche" + +msgid "Desktop notification" +msgstr "Notifiche Desktop" + +msgid "Enable" +msgstr "Abilita" + +msgid "Denied - check your browser settings" +msgstr "Errore - controlla le impostazioni del tuo browser" + +msgid "Allowed" +msgstr "Permesso" + +msgid "Sounds for incoming messages" +msgstr "Suoni per i messaggi in arrivo" + +msgid "Ring on incoming calls" +msgstr "Suoneria per le chiamate in arrivo" + +msgid "Sounds for users in current room" +msgstr "Suoni per gli utenti nella stanza corrente" + +msgid "Advanced settings" +msgstr "Opzioni avanzate" + +msgid "Play audio on same device as selected microphone" +msgstr "Riproduci l'audio sullo stesso dispositivo del microfono selezionato" + +msgid "Experimental AEC" +msgstr "AEC Sperimentale" + +msgid "Experimental AGC" +msgstr "AGC Sperimentale" + +msgid "Experimental noise suppression" +msgstr "Soppressione del rumore sperimentale" + +msgid "Max video frame rate" +msgstr "Massimo framerate video" + +msgid "auto" +msgstr "automatico" + +msgid "Send stereo audio" +msgstr "Invia audio in stereo" + +msgid "" +"Sending stereo audio disables echo cancellation. Enable only if you have " +"stereo input." +msgstr "" +"Inviare l'audio in stereo disabilita la cancellazione dell eco. Abilitare " +"solo se si dispone di un input stereo." + +msgid "Detect CPU over use" +msgstr "Rileva utilizzo eccessivo della CPU" + +msgid "Automatically reduces video quality as needed." +msgstr "Riduce automaticamente la qualità video se necessario." + +msgid "Optimize for high resolution video" +msgstr "Ottimizza per i video ad alta risoluzione" + +msgid "Reduce video noise" +msgstr "Riduce il rumore digitale nei video" + +msgid "Prefer VP9 video codec" +msgstr "Prediligi il codec VP9" + +msgid "Enable experiments" +msgstr "Abilita gli esperimenti" + +msgid "Show advanced settings" +msgstr "Mostra opzioni avanzate" + +msgid "Hide advanced settings" +msgstr "Nascondi opzioni avanzate" + +msgid "Remember settings" +msgstr "Ricorda le impostazioni" + +msgid "" +"Your ID will still be kept - press the log out button above to delete the ID." +msgstr "" +"Il tuo ID sarà mantenuto - Premi il pulsante disconnetti per cancellare l'ID." + +msgid "Room PIN" +msgstr "PIN della stanza" + +msgid "Room link" +msgstr "Link stanza" + +msgid "Invite by Email" +msgstr "Invita via Email" + +msgid "Invite with Facebook" +msgstr "Invita via Facebook" + +msgid "Invite with Twitter" +msgstr "Invita via Twitter" + +msgid "Invite with Google Plus" +msgstr "Invita via Google Plus" + +msgid "Invite with XING" +msgstr "Invita via XING" + +msgid "Initializing" +msgstr "Inizializzazione" + +msgid "Online" +msgstr "Online" + +msgid "Calling" +msgstr "Sto chiamando" + +msgid "Hangup" +msgstr "Fine chiamata" + +msgid "In call with" +msgstr "In chiamata con" + +msgid "Conference with" +msgstr "In conferenza con" + +msgid "Your are offline" +msgstr "Sei offline" + +msgid "Go online" +msgstr "Connettiti" + +msgid "Connection interrupted" +msgstr "Connessione Interrotta" + +msgid "An error occured" +msgstr "Errore" + +msgid "Incoming call" +msgstr "Chiamata in arrivo" + +msgid "from" +msgstr "da" + +msgid "Accept call" +msgstr "Rispondi" + +msgid "Waiting for camera/microphone access" +msgstr "Attesa accesso videocamera/microfono" + +msgid "Your audio level" +msgstr "Volume" + +msgid "Checking camera and microphone access." +msgstr "Controllo accesso videocamera e microfono." + +msgid "Please allow access to your camera and microphone." +msgstr "Consenti l'accesso alla videocamera ed al microfono." + +msgid "Camera / microphone access required." +msgstr "E' richesto l'accesso alla videocamera/microfono." + +msgid "" +"Please check your browser settings and allow camera and microphone access " +"for this site." +msgstr "" +"Per favore verifica le impostazioni del tuo browser e permetti l'accesso " +"alla videocamera ed al microfono per questo sito." + +msgid "Skip check" +msgstr "Salta controllo" + +msgid "Click here for help (Google Chrome)." +msgstr "Clicca qui per aiuto (Google Chrome)." + +msgid "Please set your user details and settings." +msgstr "Inserisci i tuoi dati utente e le impostazioni." + +msgid "Enter a room name" +msgstr "Inserisci il nome di una stanza" + +msgid "Random room name" +msgstr "Nome casuale stanza" + +msgid "Enter room" +msgstr "Entra nella stanza" + +msgid "" +"Enter the name of an existing room. You can create new rooms when you are " +"signed in." +msgstr "" +"Inserisci il nome di una stanza esistente. Puoi creare nuove stanze quando " +"effetui l'accesso." + +msgid "Room history" +msgstr "Cronologia stanza" + +msgid "Please sign in." +msgstr "Prego accedi." + +msgid "Videos play simultaneously for everyone in this call." +msgstr "" +"I video vengono riprodotti simultaneamente per gli utenti in questa stanza." + +msgid "YouTube URL" +msgstr "YouTube URL" + +msgid "" +"Could not load YouTube player API, please check your network / firewall " +"settings." +msgstr "" +"Impossibile caricare le API del player di YouTube, per favore controlla le " +"tue impostazioni di rete / firewall." + +msgid "Currently playing" +msgstr "In riproduzione" + +msgid "YouTube controls" +msgstr "Opzioni YouTube" + +msgid "YouTube video to share" +msgstr "Video YouTube da condividere" + +msgid "Peer to peer chat active." +msgstr "Chat Peer-to-peer attiva." + +msgid "Peer to peer chat is now off." +msgstr "Chat Peer-to-peer inattiva." + +msgid " is now offline." +msgstr " è offline." + +msgid " is now online." +msgstr " è online." + +msgid "You share file:" +msgstr "File condiviso:" + +msgid "Incoming file:" +msgstr "File in arrivo:" + +msgid "You shared your location:" +msgstr "Hai condiviso la tua posizione:" + +msgid "Location received:" +msgstr "Posizione ricevuta:" + +msgid "You accepted the contact request." +msgstr "Hai accettato la richiesta contatto." + +msgid "You rejected the contact request." +msgstr "Hai rifiutato la richiesta contatto." + +msgid "You sent a contact request." +msgstr "Hai inviato una richiesta di contatto." + +msgid "Your contact request was accepted." +msgstr "La tua richiesta di contatto è stata accettata." + +msgid "Incoming contact request." +msgstr "Richiesta di contatto in arrivo." + +msgid "Your contact request was rejected." +msgstr "La tua richiesta di contatto è stata rifiutata." + +msgid "Edit Contact" +msgstr "Modifica contatto" + +msgid "Your browser does not support WebRTC. No calls possible." +msgstr "Il tuo browser non supporta WebRTC. Non è possibile chiamare." + +msgid "Close this window and disconnect?" +msgstr "Chiudi questa finestra e disconnetti?" + +msgid "Contacts Manager" +msgstr "Contatti" + +msgid "Restart required to apply updates. Click ok to restart now." +msgstr "" +"E' necessario riavviare il programma per applicare le modifiche. Fai click " +"qui per riavviarlo ora." + +msgid "Failed to access camera/microphone." +msgstr "Tentativo fallito di accesso alla videocamera/microfono." + +msgid "Failed to establish peer connection." +msgstr "Impossibile stabilire una connessione." + +msgid "We are sorry but something went wrong. Boo boo." +msgstr "Ci dispiace ma qualcosa è andato storto." + +msgid "Oops" +msgstr "Oops" + +msgid "Peer connection failed. Check your settings." +msgstr "Connessione fallita. Controlla le tue impostazioni." + +msgid "User hung up because of error." +msgstr "L'utente ha riattaccato a causa di un errore." + +msgid " is busy. Try again later." +msgstr " è impegnato. Riprova più tardi." + +msgid " rejected your call." +msgstr " ha rifiutato la tua chiamata." + +msgid " does not pick up." +msgstr " non ha risposto." + +msgid " tried to call you" +msgstr " ha provato a chiamarti." + +msgid " called you" +msgstr " ti ha chiamato." + +msgid "Your browser is not supported. Please upgrade to a current version." +msgstr "Il tuo browser non è supportato. Per favore aggiornalo." + +msgid "Chat with" +msgstr "Parla con" + +msgid "Message from " +msgstr "Messaggio da " + +#, python-format +msgid "You are now in room %s ..." +msgstr "Ora sei nella stanza %s ..." + +msgid "Your browser does not support file transfer." +msgstr "Il tuo browser non supporta il trasferimento di file." + +msgid "Could not load PDF: Please make sure to select a PDF document." +msgstr "" +"Impossibile caricare il PDF: Per favore verifica di aver selezionato un file " +"PDF." + +msgid "Could not load PDF: Missing PDF file." +msgstr "Impossibile caricare il PDF: File mancante." + +#, python-format +msgid "An error occurred while loading the PDF (%s)." +msgstr "Errore durante il caricamento del PDF (%s)." + +msgid "An unknown error occurred while loading the PDF." +msgstr "Errore sconosciuto durante il caricamento del PDF." + +#, python-format +msgid "An error occurred while loading the PDF page (%s)." +msgstr "Errore in fase di caricamento della pagina del PDF (%s)." + +msgid "An unknown error occurred while loading the PDF page." +msgstr "Errore sconosciuto in fase di caricamento della pagina PDF (%s)." + +#, python-format +msgid "An error occurred while rendering the PDF page (%s)." +msgstr "Errore durante il rendering della pagina PDF (%s)." + +msgid "An unknown error occurred while rendering the PDF page." +msgstr "Errore sconosciuto durante il rendering della pagina PDF." + +msgid "Only PDF documents and OpenDocument files can be shared at this time." +msgstr "Possono essere condivisi solamente file PDF ed OpenDocument." + +#, python-format +msgid "Failed to start screen sharing (%s)." +msgstr "Impossibile avviare condivisione schermo (%s)." + +msgid "" +"Permission to start screen sharing was denied. Make sure to have enabled " +"screen sharing access for your browser. Copy chrome://flags/#enable-" +"usermedia-screen-capture and open it with your browser and enable the flag " +"on top. Then restart the browser and you are ready to go." +msgstr "" +"Il permesso per avviare la condivisione dello schermo è stato negato. " +"Verifica di aver abilitato la condivisione dello schermo per il tuo browser. " +"Copia chrome://flags/#enable-usermedia-screen-capture, aprilo nel tuo " +"browser ed abilita la spunta in cima, quindi riavvia il browser." + +msgid "Permission to start screen sharing was denied." +msgstr "Il permesso negato per la condivisione dello schermo." + +msgid "Use browser language" +msgstr "Usa la lingua del browser" + +msgid "Meet with me here:" +msgstr "Incontriamoci qui:" + +msgid "Please enter a new Room PIN to lock the room" +msgstr "Inserisci un nuovo PIN per bloccare la stanza" + +msgid "Do you want to unlock the room?" +msgstr "Vuoi sbloccare la stanza?" + +msgid "Room name" +msgstr "Nome stanza" + +msgid "" +"The request contains an invalid parameter value. Please check the URL of the " +"video you want to share and try again." +msgstr "" +"La richiesta contiene un parametro invalido. Per favore controlla l'URL del " +"video che vuoi condividere e riprova." + +msgid "" +"The requested content cannot be played in an HTML5 player or another error " +"related to the HTML5 player has occurred. Please try again later." +msgstr "" +"Il contenuto richiesto non può essere riprodotto in un player HTML5 - o si è " +"verificato un altro errore relativo al player HTML5. Per favore riprova più " +"tardi." + +msgid "" +"The video requested was not found. Please check the URL of the video you " +"want to share and try again." +msgstr "" +"Il video richiesto non è stato trovato. Per favore controlla la URL del " +"video che vuoi condividere e riprova." + +msgid "" +"The owner of the requested video does not allow it to be played in embedded " +"players." +msgstr "" +"Il proprietario del video non permette che venga riprodotto nel player " +"incluso." + +#, python-format +msgid "" +"An unknown error occurred while playing back the video (%s). Please try " +"again later." +msgstr "" +"Errore sconosciuto durante la riproduzione del video (%s). Per favore " +"riprova più tardi." + +msgid "" +"An unknown error occurred while playing back the video. Please try again " +"later." +msgstr "" +"Errore sconosciuto durante la riproduzione del video. Riprova più tardi." + +msgid "Unknown URL format. Please make sure to enter a valid YouTube URL." +msgstr "" +"Formato URL sconosciuto. Per favore verifica di aver inserito un URL Youtube " +"valido." + +msgid "Error" +msgstr "Errore" + +msgid "Hint" +msgstr "Suggerimento" + +msgid "Please confirm" +msgstr "Prego conferma" + +msgid "More information required" +msgstr "Sono richieste maggiori informazioni" + +msgid "Ok" +msgstr "Ok" + +msgid "" +"Screen sharing requires a browser extension. Please add the Spreed WebRTC " +"screen sharing extension to Chrome and try again." +msgstr "" +"La condivisione dello schermo richiede un'estensione del browser. Per favore " +"aggiungi l'estensione WebRTC screen sharing a Chrome e riprova." + +msgid "Access code required" +msgstr "Codice d'accesso richiesto" + +msgid "Access denied" +msgstr "Accesso negato" + +msgid "Please provide a valid access code." +msgstr "Per favore inserisci un codice di accesso valido." + +msgid "" +"Failed to verify access code. Check your Internet connection and try again." +msgstr "" +"Impossibile verificare il codice d'accesso. Controlla la tua conessione a " +"Internet e riprova." + +#, python-format +msgid "PIN for room %s is now '%s'." +msgstr "Il PIN per la stanza %s è '%s'." + +#, python-format +msgid "PIN lock has been removed from room %s." +msgstr "Il blocco del PIN è stato rimosso per la stanza %s." + +#, python-format +msgid "Enter the PIN for room %s" +msgstr "Inserisci il PIN per la stanza %s" + +msgid "Please sign in to create rooms." +msgstr "Accedi per creare una stanza." + +#, python-format +msgid "and %s" +msgstr "e %s" + +#, python-format +msgid "and %d others" +msgstr "e %d altri" + +msgid "User" +msgstr "Utente" + +msgid "Someone" +msgstr "Qualcuno" + +msgid "Me" +msgstr "Me" + +#~ msgid "Register" +#~ msgstr "Registrati" diff --git a/src/i18n/messages-ja.po b/src/i18n/messages-ja.po index aa588361..017a8deb 100644 --- a/src/i18n/messages-ja.po +++ b/src/i18n/messages-ja.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Spreed WebRTC 1.0\n" "Report-Msgid-Bugs-To: simon@struktur.de\n" -"POT-Creation-Date: 2016-02-17 14:15+0100\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" "PO-Revision-Date: 2014-04-23 22:25+0100\n" "Last-Translator: Curt Frisemo \n" "Language-Team: Curt Frisemo \n" @@ -301,9 +301,6 @@ msgstr "" msgid "Your ID" msgstr "" -msgid "Register" -msgstr "" - msgid "" "Authenticated by certificate. To log out you have to remove your " "certificate from the browser." @@ -448,6 +445,9 @@ msgid "" " ID." msgstr "" +msgid "Room PIN" +msgstr "" + msgid "Room link" msgstr "" @@ -738,6 +738,12 @@ msgstr "ブラウザの言語を使用" msgid "Meet with me here:" msgstr "ここで私と会う:" +msgid "Please enter a new Room PIN to lock the room" +msgstr "" + +msgid "Do you want to unlock the room?" +msgstr "" + #, fuzzy msgid "Room name" msgstr "あなたの名前" @@ -842,3 +848,6 @@ msgstr "誰か" msgid "Me" msgstr "私" +#~ msgid "Register" +#~ msgstr "" + diff --git a/src/i18n/messages-ko.po b/src/i18n/messages-ko.po index 2b3dec8c..196ca177 100644 --- a/src/i18n/messages-ko.po +++ b/src/i18n/messages-ko.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Spreed WebRTC 1.0\n" "Report-Msgid-Bugs-To: simon@struktur.de\n" -"POT-Creation-Date: 2016-02-17 14:15+0100\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" "PO-Revision-Date: 2014-04-13 20:30+0900\n" "Last-Translator: Curt Frisemo \n" "Language-Team: Curt Frisemo \n" @@ -301,9 +301,6 @@ msgstr "" msgid "Your ID" msgstr "" -msgid "Register" -msgstr "" - msgid "" "Authenticated by certificate. To log out you have to remove your " "certificate from the browser." @@ -448,6 +445,9 @@ msgid "" " ID." msgstr "" +msgid "Room PIN" +msgstr "" + msgid "Room link" msgstr "" @@ -738,6 +738,12 @@ msgstr "브라우저 언어 사용" msgid "Meet with me here:" msgstr "나를 여기서 만납니다:" +msgid "Please enter a new Room PIN to lock the room" +msgstr "" + +msgid "Do you want to unlock the room?" +msgstr "" + #, fuzzy msgid "Room name" msgstr "사용자 이름" @@ -842,3 +848,6 @@ msgstr "어떤 사람" msgid "Me" msgstr "나" +#~ msgid "Register" +#~ msgstr "" + diff --git a/src/i18n/messages-ru.po b/src/i18n/messages-ru.po index 1bf19295..351df4c5 100644 --- a/src/i18n/messages-ru.po +++ b/src/i18n/messages-ru.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Spreed WebRTC 1.0\n" "Report-Msgid-Bugs-To: simon@struktur.de\n" -"POT-Creation-Date: 2016-02-17 14:15+0100\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" "PO-Revision-Date: 2016-02-18 16:03+0500\n" "Last-Translator: Irek Zaripov \n" "Language-Team: ru <>\n" @@ -18,7 +18,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 0.9.6\n" +"Generated-By: Babel 1.3\n" msgid "Standard view" msgstr "Стандартный вид" @@ -306,9 +306,6 @@ msgstr "" msgid "Your ID" msgstr "Ваш ID" -msgid "Register" -msgstr "Отметить" - msgid "" "Authenticated by certificate. To log out you have to remove your " "certificate from the browser." @@ -456,6 +453,10 @@ msgstr "" "Ваш ID-прежнему будут храниться - нажмите кнопку выхода из системы выше, " "чтобы удалить ID." +#, fuzzy +msgid "Room PIN" +msgstr "Ссылка комнаты" + msgid "Room link" msgstr "Ссылка комнаты" @@ -755,6 +756,12 @@ msgstr "Использовать язык браузера" msgid "Meet with me here:" msgstr "Встретиться со мной здесь:" +msgid "Please enter a new Room PIN to lock the room" +msgstr "" + +msgid "Do you want to unlock the room?" +msgstr "" + msgid "Room name" msgstr "Имя комнаты" @@ -878,3 +885,6 @@ msgstr "Кто то" msgid "Me" msgstr "Я" +#~ msgid "Register" +#~ msgstr "Отметить" + diff --git a/src/i18n/messages-zh-cn.po b/src/i18n/messages-zh-cn.po index ce551e81..65e8ecbb 100644 --- a/src/i18n/messages-zh-cn.po +++ b/src/i18n/messages-zh-cn.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Spreed WebRTC 1.0\n" "Report-Msgid-Bugs-To: simon@struktur.de\n" -"POT-Creation-Date: 2016-02-17 14:15+0100\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" "PO-Revision-Date: 2014-05-21 09:54+0800\n" "Last-Translator: Michael P.\n" "Language-Team: Curt Frisemo \n" @@ -301,9 +301,6 @@ msgstr "" msgid "Your ID" msgstr "" -msgid "Register" -msgstr "" - msgid "" "Authenticated by certificate. To log out you have to remove your " "certificate from the browser." @@ -448,6 +445,9 @@ msgid "" " ID." msgstr "" +msgid "Room PIN" +msgstr "" + msgid "Room link" msgstr "" @@ -737,6 +737,12 @@ msgstr "使用浏览器语言" msgid "Meet with me here:" msgstr "我们这里见:" +msgid "Please enter a new Room PIN to lock the room" +msgstr "" + +msgid "Do you want to unlock the room?" +msgstr "" + #, fuzzy msgid "Room name" msgstr "您的名字" @@ -841,3 +847,6 @@ msgstr "某人" msgid "Me" msgstr "我" +#~ msgid "Register" +#~ msgstr "" + diff --git a/src/i18n/messages-zh-tw.po b/src/i18n/messages-zh-tw.po index d91e183b..19ac98e9 100644 --- a/src/i18n/messages-zh-tw.po +++ b/src/i18n/messages-zh-tw.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Spreed WebRTC 1.0\n" "Report-Msgid-Bugs-To: simon@struktur.de\n" -"POT-Creation-Date: 2016-02-17 14:15+0100\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" "PO-Revision-Date: 2014-05-21 09:55+0800\n" "Last-Translator: Michael P.\n" "Language-Team: Curt Frisemo \n" @@ -301,9 +301,6 @@ msgstr "" msgid "Your ID" msgstr "" -msgid "Register" -msgstr "" - msgid "" "Authenticated by certificate. To log out you have to remove your " "certificate from the browser." @@ -448,6 +445,9 @@ msgid "" " ID." msgstr "" +msgid "Room PIN" +msgstr "" + msgid "Room link" msgstr "" @@ -737,6 +737,12 @@ msgstr "使用瀏覽器語言" msgid "Meet with me here:" msgstr "我們這裡見:" +msgid "Please enter a new Room PIN to lock the room" +msgstr "" + +msgid "Do you want to unlock the room?" +msgstr "" + #, fuzzy msgid "Room name" msgstr "您的名字" @@ -841,3 +847,6 @@ msgstr "某人" msgid "Me" msgstr "我" +#~ msgid "Register" +#~ msgstr "" + diff --git a/src/i18n/messages.pot b/src/i18n/messages.pot index 2217a8cd..a85a4d01 100644 --- a/src/i18n/messages.pot +++ b/src/i18n/messages.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Spreed WebRTC 1.0\n" "Report-Msgid-Bugs-To: simon@struktur.de\n" -"POT-Creation-Date: 2016-02-17 14:15+0100\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -294,9 +294,6 @@ msgstr "" msgid "Your ID" msgstr "" -msgid "Register" -msgstr "" - msgid "" "Authenticated by certificate. To log out you have to remove your " "certificate from the browser." @@ -438,6 +435,9 @@ msgid "" " ID." msgstr "" +msgid "Room PIN" +msgstr "" + msgid "Room link" msgstr "" @@ -720,6 +720,12 @@ msgstr "" msgid "Meet with me here:" msgstr "" +msgid "Please enter a new Room PIN to lock the room" +msgstr "" + +msgid "Do you want to unlock the room?" +msgstr "" + msgid "Room name" msgstr "" diff --git a/src/styles/components/_social.scss b/src/styles/components/_social.scss index 125d564a..be7b2ced 100644 --- a/src/styles/components/_social.scss +++ b/src/styles/components/_social.scss @@ -20,6 +20,10 @@ */ .#{$fa-css-prefix} { + &.pin { + color: $social-email-color; + } + &.link { color: $social-email-color; } diff --git a/static/css/main.min.css b/static/css/main.min.css index 9c290814..cef4fdb3 100644 --- a/static/css/main.min.css +++ b/static/css/main.min.css @@ -1,4 +1,4 @@ -/*! +/*! * Spreed WebRTC. * Copyright (C) 2013-2015 struktur AG * @@ -17,4 +17,4 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - *//*! HiDPI v2.0.1 | MIT License | git.io/hidpi */.toast-title{font-weight:bold}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#ffffff}.toast-message a:hover{color:#cccccc;text-decoration:none}.toast-close-button{position:relative;right:-0.3em;top:-0.3em;float:right;font-size:20px;font-weight:bold;color:#ffffff;-webkit-text-shadow:0 1px 0 #ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}.toast-close-button:hover,.toast-close-button:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}button.toast-close-button{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;border-radius:3px 3px 3px 3px;background-position:15px center;background-repeat:no-repeat;-webkit-box-shadow:0 0 12px #999999;box-shadow:0 0 12px #999999;color:#ffffff;opacity:0.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>:hover{-webkit-box-shadow:0 0 12px #000000;box-shadow:0 0 12px #000000;opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important}#toast-container>.toast-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important}#toast-container>.toast-success{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important}#toast-container>.toast-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important}#toast-container.toast-top-center>div,#toast-container.toast-bottom-center>div{width:300px;margin:auto}#toast-container.toast-top-full-width>div,#toast-container.toast-bottom-full-width>div{width:96%;margin:auto}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000000;opacity:0.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width: 240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 241px) and (max-width: 480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 481px) and (max-width: 768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}}.dialog-header-error{background-color:#d2322d}.dialog-header-wait{background-color:#428bca}.dialog-header-notify{background-color:#eee}.dialog-header-confirm{background-color:#eee}.dialog-header-error span,.dialog-header-error h4,.dialog-header-wait span,.dialog-header-wait h4{color:#fff}.modal-content{overflow:hidden}.modal-content .modal-body{min-height:160px}[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none !important}html,body{-webkit-background-clip:padding-box;background-clip:padding-box;background-color:#e5e5e5;height:100%}body{margin:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;padding:0}@media (max-width: 700px){body{overflow-x:auto}}body>.ui{height:100%;min-width:300px;position:absolute;width:100%}a{cursor:pointer}#background{background:url("../img/bg-tiles.jpg");bottom:0;left:0;position:fixed;right:0;top:0;z-index:0}@media (-webkit-min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){#background{background-image:url("../img/bg-tiles_x2.jpg");-webkit-background-size:198px 200px;background-size:198px 200px}}.help-block{color:#737373}.dialog-header-notify,.dialog-header-confirm{background-color:#eee}.desktopnotify-icon{background-image:url("../img/logo-48x48.png")}:-webkit-full-screen{background:#000}:-moz-full-screen{background:#000}:-ms-fullscreen{background:#000}:fullscreen{background:#000}.visibleRoomTypeRoom{display:none}.roomTypeRoom .visibleRoomTypeRoom{display:block}.roomTypeRoom .hiddenRoomTypeRoom{display:none}.visibleRoomTypeConference{display:none}.roomTypeConference .visibleRoomTypeConference{display:block}.roomTypeConference .hiddenRoomTypeConference{display:none}#loader{background:url("../img/logo.svg") no-repeat center;-webkit-background-size:contain;background-size:contain;bottom:15%;left:15%;margin:auto;max-height:150px;max-width:200px;opacity:1;pointer-events:none;position:fixed;right:15%;top:15%;-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:opacity;transition-property:opacity;z-index:20000}#loader.fake-alert{background:none;color:white;font-weight:bold;text-align:center;font-size:1.5em;line-height:1.1em}#loader.done{opacity:0}#loader>div{bottom:0;color:#ddd;display:block;font-size:2em;left:0;margin:0 auto;margin-bottom:-40px;position:absolute;right:0;text-align:center;text-shadow:0 0 5px #000}#loader .loader-message{font-size:.5em}.mainview{bottom:0;display:none;left:0;position:absolute;right:0;top:51px}@media (max-width: 700px){.mainview{left:0;left:0}}.videolayoutSmally .mainview{left:150px}.videolayoutClassroom .mainview{left:360px}.withChat .mainview,.withBuddylist .mainview{right:260px}.withBuddylist.withChat .mainview{right:520px}#page{bottom:0;left:0;position:absolute;right:0;top:51px}.welcome{color:#aaa;font-size:1.1em;margin-top:80px;max-width:600px;min-height:160px;padding-left:105px;padding-right:0;position:relative;text-shadow:0 0 5px #000}@media (max-width: 700px){.welcome{margin:0 auto;padding-left:10px;padding-right:20px}}.welcome h1{margin-top:0;white-space:nowrap}@media (max-width: 700px){.welcome h1{white-space:normal}}.welcome .welcome-container{margin:0 auto}.welcome .welcome-logo{background:url("../img/logo.svg") no-repeat left top;-webkit-background-size:contain;background-size:contain;bottom:0;left:0;position:absolute;top:1px;width:90px}@media (max-width: 700px){.welcome .welcome-logo{height:70px;margin-bottom:20px;margin-top:30px;position:relative;width:70px}}.welcome .welcome-input{position:relative}.welcome .welcome-input input{padding-right:105px}.welcome .welcome-input-buttons{position:absolute;right:8px;text-shadow:none;top:6px}.welcome .welcome-input-buttons a{color:#000;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.welcome .room-link{margin-top:-10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.welcome .room-link a{color:#aaa}.welcome .rooms-history{margin-top:3em}.welcome .rooms-history a{display:inline-block;margin-right:.5em}.welcome .rooms-history a:hover{text-decoration:none}.nicescroll::-webkit-scrollbar{background-color:#e5e5e5;border:solid transparent;height:8px;width:8px}.nicescroll::-webkit-scrollbar:hover{background-color:#e5e5e5;border-left:1px solid rgba(0,0,0,0.12);border-right:1px solid rgba(0,0,0,0.12)}.nicescroll::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.2)}.nicescroll::-webkit-scrollbar-thumb:active{background:rgba(0,0,0,0.4)}.fadetogglecontainer>div{position:absolute;width:100%}.animate-show.ng-hide-add{display:block !important;opacity:1;-webkit-transition:all linear 0s;transition:all linear 0s}.animate-show.ng-hide-add.ng-hide-add-active{opacity:0;-webkit-transition:all linear .5s;transition:all linear .5s}.animate-show.ng-hide-remove{display:block !important;opacity:0;-webkit-transition:all linear 0s;transition:all linear 0s}.animate-show.ng-hide-remove.ng-hide-remove-active{opacity:1;-webkit-transition:all linear .5s;transition:all linear .5s}.overlaybar{background:rgba(0,0,0,0.2);border-bottom:1px solid #222;border-top:1px solid #222;color:#e7e7e7;min-height:36px;padding:3px 8px 0 30px;position:absolute;text-shadow:0 0 5px #000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.overlaybar:hover{background:rgba(0,0,0,0.5)}.overlaybar.notvisible{background:transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;pointer-events:none}.overlaybar.notvisible:hover{background:transparent}.overlaybar.notvisible .overlaybar-content{display:none}.overlaybar.notvisible .overlaybar-overlay{display:block}.overlaybar .btn{text-shadow:none}.overlaybar .btn-link{text-shadow:0 0 5px #000}.overlaybar .form-group>*{float:left;padding-top:0}.overlaybar input[type="radio"],.overlaybar input[type="checkbox"]{margin-top:2px}.overlaybar label{padding-top:6px !important}.overlaybar .overlaybar-button{color:#e7e7e7;display:block;font-size:20px;left:3px;opacity:.7;padding:4px 6px;pointer-events:auto;position:absolute;top:0;vertical-align:middle;z-index:15}.overlaybar .overlaybar-content{display:inline-block;margin-bottom:0;margin-left:.5em}.overlaybar .overlaybar-content>*{padding-right:.5em}.overlaybar .overlaybar-content .input-group{max-width:160px}.overlaybar .overlaybar-overlay{display:none;margin-left:.5em;opacity:.7;padding-top:2px;text-align:left}.visible-with-contacts,.visible-with-contacts-inline{display:none}.with-contacts .visible-with-contacts{display:block}.with-contacts .visible-with-contacts-inline{display:inline-block}.with-contacts .hidden-with-contacts{display:none}@media (min-width: 700px){.withBuddylist #rightslide{right:0}}#rightslide{bottom:0;left:0;pointer-events:none;position:absolute;right:-300px;top:51px;-webkit-transition:right 200ms ease-in-out;transition:right 200ms ease-in-out;z-index:5}#rightslide .rightslidepane{height:100%;position:relative;width:100%}.bar{background:#f8f8f8;color:#262626;font:bold 1em/50px "Helvetica Neue",Helvetica,Arial,sans-serif;text-align:center;touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:60}.bar .left{padding:5px 5px 5px 15px}@media (max-width: 700px){.bar .left{padding:2px 5px 0 11px;padding:2px 5px 0 11px}}.logo{background:url("../img/logo-small.png") no-repeat;-webkit-background-size:100%;background-size:100%;color:#000;display:inline-block;font:normal 11px/11px "Helvetica Neue",Helvetica,Arial,sans-serif;height:32px;text-align:left;vertical-align:middle;width:90px}@media (max-width: 700px){.logo{background:url("../img/logo.svg") no-repeat center;height:46px;width:46px}.logo .desc{display:none}}.logo .desc{font-style:italic;left:38px;position:relative;top:26px}.logo .desc a{color:#222}.bar .middle{left:0;pointer-events:none;position:absolute;right:60px;text-align:center;top:0}.bar .middle>span{background:#f8f8f8;display:inline-block;min-height:50px;pointer-events:auto}.bar .middle .userpicture{border-radius:2px;display:inline-block;height:46px;margin:-1px .5em 0;width:46px}@media (max-width: 700px){.bar .middle .userpicture{display:none}}@media (max-width: 700px){.bar .middle .status-connected,.bar .middle .status-conference,.bar .middle .status-connecting,.bar .middle .status-closed,.bar .middle .status-reconnecting,.bar .middle .status-error,.bar .middle .status-ringing{left:0;max-width:100%;position:absolute;right:0}}.bar .right{margin-top:-1px;padding-right:4px}.bar .right .badge{background-color:#84b819;border:1px solid #fff;font-size:.4em;position:absolute;right:0;top:2px}.bar .right .btn{background:#e9e9e9;border-color:#e2e2e2;color:#333;font:24px/40px "Helvetica Neue",Helvetica,Arial,sans-serif;height:42px;margin-left:-2px;padding:0;position:relative;text-align:center;width:42px}.bar .right .btn:focus{border:0;-webkit-box-shadow:0;box-shadow:0;outline:none}.bar .right .btn:hover{background-color:transparent;border-color:#e7e7e7;color:#666}.bar .right .btn.active{background-color:transparent;border-color:#e7e7e7;color:#666}.bar .right .btn.active.amutebtn{background-color:#db4f39;border-color:#db4f39;color:#fff}.bar .right .btn.active.aenablebtn{background-color:#84b819;border-color:#84b819;color:#fff}.btn-mutemicrophone i:before{content:'\f130'}.btn-mutemicrophone.active i:before{content:'\f131'}.btn-mutecamera i:before{content:'\f06e'}.btn-mutecamera.active i:before{content:'\f070'}@-webkit-keyframes shakeityeah{0%{-webkit-transform:translate(2px, 1px) rotate(0deg);transform:translate(2px, 1px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -2px) rotate(-1deg);transform:translate(-1px, -2px) rotate(-1deg)}4%{-webkit-transform:translate(-3px, 0) rotate(1deg);transform:translate(-3px, 0) rotate(1deg)}8%{-webkit-transform:translate(0, 2px) rotate(0deg);transform:translate(0, 2px) rotate(0deg)}10%{-webkit-transform:translate(1px, -1px) rotate(1deg);transform:translate(1px, -1px) rotate(1deg)}12%{-webkit-transform:translate(-1px, 2px) rotate(-1deg);transform:translate(-1px, 2px) rotate(-1deg)}14%{-webkit-transform:translate(-3px, 1px) rotate(0deg);transform:translate(-3px, 1px) rotate(0deg)}16%{-webkit-transform:translate(2px, 1px) rotate(-1deg);transform:translate(2px, 1px) rotate(-1deg)}18%{-webkit-transform:translate(-1px, -1px) rotate(1deg);transform:translate(-1px, -1px) rotate(1deg)}20%{-webkit-transform:translate(2px, 2px) rotate(0deg);transform:translate(2px, 2px) rotate(0deg)}22%{-webkit-transform:translate(1px, -2px) rotate(-1deg);transform:translate(1px, -2px) rotate(-1deg)}24%{-webkit-transform:translate(0, 0) rotate(0deg);transform:translate(0, 0) rotate(0deg)}}@keyframes shakeityeah{0%{-webkit-transform:translate(2px, 1px) rotate(0deg);transform:translate(2px, 1px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -2px) rotate(-1deg);transform:translate(-1px, -2px) rotate(-1deg)}4%{-webkit-transform:translate(-3px, 0) rotate(1deg);transform:translate(-3px, 0) rotate(1deg)}8%{-webkit-transform:translate(0, 2px) rotate(0deg);transform:translate(0, 2px) rotate(0deg)}10%{-webkit-transform:translate(1px, -1px) rotate(1deg);transform:translate(1px, -1px) rotate(1deg)}12%{-webkit-transform:translate(-1px, 2px) rotate(-1deg);transform:translate(-1px, 2px) rotate(-1deg)}14%{-webkit-transform:translate(-3px, 1px) rotate(0deg);transform:translate(-3px, 1px) rotate(0deg)}16%{-webkit-transform:translate(2px, 1px) rotate(-1deg);transform:translate(2px, 1px) rotate(-1deg)}18%{-webkit-transform:translate(-1px, -1px) rotate(1deg);transform:translate(-1px, -1px) rotate(1deg)}20%{-webkit-transform:translate(2px, 2px) rotate(0deg);transform:translate(2px, 2px) rotate(0deg)}22%{-webkit-transform:translate(1px, -2px) rotate(-1deg);transform:translate(1px, -2px) rotate(-1deg)}24%{-webkit-transform:translate(0, 0) rotate(0deg);transform:translate(0, 0) rotate(0deg)}}.btn-shakeityeah{-webkit-animation-duration:4s;animation-duration:4s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:shakeityeah;animation-name:shakeityeah;-webkit-animation-timing-function:steps(5);animation-timing-function:steps(5);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}#buddylist{bottom:0;position:absolute;right:0;top:0;width:325px;z-index:50}#buddylist:before{background:#f8f8f8;border-bottom:1px solid #e7e7e7;border-bottom-left-radius:6px;border-left:1px solid #e7e7e7;border-top:1px solid #e7e7e7;border-top-left-radius:6px;bottom:0;color:rgba(0,0,0,0.3);content:'\f100';cursor:pointer;display:none;font-family:FontAwesome;font-size:1.8em;height:55px;left:0;line-height:55px;margin:auto;padding-right:4px;pointer-events:auto;position:absolute;text-align:center;top:0;width:26px;z-index:1}.withBuddylist #buddylist:before{content:'\f101';padding-right:0}@media (max-width: 700px){.withBuddylist #buddylist:before{display:block}}.withBuddylistAutoHide #buddylist:before{display:block}.buddylist{background:#f8f8f8;border-left:1px solid #e7e7e7;bottom:0;left:25px;overflow-x:hidden;overflow-y:auto;pointer-events:auto;position:absolute;right:0;top:0}.buddylist.loading .buddylistloading{display:block}.buddylist.empty .buddylistempty{display:block}.buddylist .buddycontainer{pointer-events:auto;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.buddylist .buddylistempty{bottom:0;color:#b3b3b3;display:none;font-size:1.4em;height:2em;left:0;margin:auto;padding:.4em;position:absolute;right:0;text-align:center;top:0}.buddylist .buddylistloading{bottom:0;color:#b3b3b3;display:none;font-size:1.4em;height:2em;margin:auto;padding:.4em;position:absolute;right:0;text-align:center}.buddy{-webkit-tap-highlight-color:transparent;background:#fff;border-bottom:1px solid #e7e7e7;cursor:pointer;display:block;font-size:13px;min-height:66px;overflow:hidden;position:relative;text-align:left;width:100%}.buddy:hover{background:rgba(255,255,255,0.5)}.buddy.withSubline .buddy1,.buddy.contact .buddy1{top:15px}.buddy.withSubline .buddy2,.buddy.contact .buddy2{display:block}.buddy.hovered .buddyactions{right:0}.buddy.hovered .buddysessions{max-height:999px}.buddy .fa.contact:before{content:'\f006'}.buddy.contact .fa.contact:before{content:'\f005'}.buddy.isself .fa.contact:before{content:'\f192'}.buddy .buddyPicture{background:#84b819;border-radius:2px;float:left;height:46px;margin:10px;overflow:hidden;position:relative;text-align:center;width:46px}.buddy .buddyPicture .fa{color:#009534;font-size:3em;line-height:46px}.buddy .buddyPicture img{bottom:0;display:block;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.buddy .buddyPictureSmall{height:30px;margin:0;margin-left:0;margin-right:0;width:30px}.buddy .buddyPictureSmall .fa{font-size:2em;line-height:30px}.buddy .buddy1{color:#262626;font-size:14px;font-weight:bold;height:28px;left:65px;overflow:hidden;position:absolute;right:4px;text-overflow:ellipsis;top:24px;white-space:nowrap}.buddy .buddy2{color:rgba(0,0,0,0.5);display:none;left:65px;overflow:hidden;position:absolute;right:4px;text-overflow:ellipsis;top:33px;white-space:nowrap}.buddy .buddy3{display:inline-block;overflow:hidden;padding:0 6px;text-align:left;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:120px}.buddy .buddyactions{background:rgba(255,255,255,0.5);height:66px;line-height:66px;padding:0 10px;position:absolute;right:-125px;text-align:right;top:0;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:right;transition-property:right;white-space:nowrap;z-index:5}.buddy .buddyactions .btn{font-size:1.6em;height:40px;line-height:40px;padding:0;text-align:center;vertical-align:middle;width:42px}.buddy .buddysessions{margin-bottom:10px;margin-top:56px;max-height:0;-webkit-transition-delay:.1s;transition-delay:.1s;-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:max-height;transition-property:max-height}.buddy .buddysessions ul{border-left:1px dotted #e7e7e7;border-right:1px dotted #e7e7e7;margin:0 14px;padding-left:0;padding-top:10px}.buddy .buddysessions ul li{list-style-type:none;margin-bottom:2px;margin-left:0}.buddy .buddysessions ul li .btn-group{visibility:hidden}.buddy .buddysessions ul li:hover .btn-group{visibility:visible}.buddy .buddysessions .currentsession .buddy3{font-weight:bold}.buddyPictureCapture .picture{display:block;margin-bottom:5px}.buddyPictureCapture .videoPicture{margin-bottom:4px}.buddyPictureCapture .videoPicture .videoPictureVideo{background-color:#000;overflow:hidden;position:relative}.buddyPictureCapture .videoPicture video{object-fit:cover}.buddyPictureCapture .videoPictureVideo{height:200px;width:200px}.buddyPictureCapture .videoPictureVideo .videoPrev,.buddyPictureCapture .videoPictureVideo video,.buddyPictureCapture .videoPictureVideo .preview{height:100%;width:100%}.buddyPictureCapture .videoFlash{background-color:#fff;border:1px dotted #e7e7e7;bottom:0;left:0;position:absolute;right:0;top:0;visibility:hidden;z-index:5}.buddyPictureCapture .videoFlash.flash{visibility:visible}.buddyPictureCapture .preview{left:0;position:absolute;top:0}.buddyPictureCapture .preview.previewPicture{position:relative}.buddyPictureCapture .btn-takePicture,.buddyPictureCapture .btn-retakePicture{left:0;margin:0 auto;max-width:40%;position:absolute;right:0;top:50%}.buddyPictureCapture .btn-retakePicture{visibility:hidden}.buddyPictureCapture .videoPictureVideo:hover .btn-retakePicture{visibility:visible}.buddyPictureCapture .countdownPicture{color:#f8f8f8;font-size:45px;left:0;margin:0 auto;opacity:.8;position:absolute;right:0;text-align:center;text-shadow:0 0 5px #000;top:75px}.buddyPictureUpload{position:relative}.buddyPictureUpload .loader{left:90px;position:absolute;z-index:1}.buddyPictureUpload .loader .fa-spin{color:#737373}.buddyPictureUpload>p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.buddyPictureUpload .showUploadPicture{background-color:#f8f8f8;border:1px solid #e7e7e7;height:200px;line-height:200px;margin-bottom:10px;overflow:hidden;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:200px}.buddyPictureUpload .showUploadPicture.imgData{background-color:#000}.buddyPictureUpload .showUploadPicture.imgData .chooseUploadPicture{display:none}.buddyPictureUpload .showUploadPicture.imgData:hover .imageUtilites{visibility:visible}.buddyPictureUpload .showUploadPicture .chooseUploadPicture{color:#737373;left:0;margin:0 auto;position:absolute;right:0;z-index:1}.buddyPictureUpload .showUploadPicture .fa{color:#f8f8f8;opacity:.8;text-shadow:0 0 5px #000}.buddyPictureUpload .preview{left:0;position:relative;top:0}.buddyPictureUpload .imageUtilites{line-height:30px;position:absolute;visibility:hidden;width:200px;z-index:1}.buddyPictureUpload .imageUtilites .fa{cursor:pointer;font-size:40px;height:50px;width:50px}.buddyPictureUpload .moveHorizontal{position:relative;top:-4px}.buddyPictureUpload .moveVertical{left:158px;position:absolute}.buddyPictureUpload .resize{position:relative;top:108px}#settings{background:#fff;border-left:1px solid #e7e7e7;bottom:0;padding-right:0px;position:fixed;right:-520px;top:0;-webkit-transition:right 200ms ease-in-out;transition:right 200ms ease-in-out;width:520px;z-index:80}#settings.show{right:0}@media only screen and (max-width: 800px){#settings.show{background:#fff;left:0;width:auto}}.settings{background:#fff;bottom:0;left:0;overflow-x:hidden;overflow-y:auto;padding:10px 15px;position:absolute;right:0;top:0;margin-top:50px}@media only screen and (max-width: 800px){.settings{padding-bottom:10px}}.settings legend{font-size:17px}.settings .version{color:#ccc;font-size:10px;position:absolute;right:10px;top:10px}settings-advanced{display:block;padding-top:15px}#chat{bottom:0;width:300px;min-width:200px;opacity:0;pointer-events:none;position:absolute;right:300px;top:0;z-index:45}.withChat #chat{opacity:1}@media (max-width: 500px){.withChat #chat{left:0;width:auto}}.withChat.withChatMaximized #chat{left:0;width:auto}@media (max-width: 1280px){.withChat.withChatMaximized #chat .message{max-width:55%}}@media (max-width: 700px){.withChat.withChatMaximized #chat .message{max-width:70%}}@media (max-width: 480px){.withChat.withChatMaximized #chat .message{max-width:85%}}.withChat .chat{pointer-events:auto}.chatcontainer{background:#e5e5e5;bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:0}.showchatlist .chatpane{right:100%}.showchatlist .chatlist{left:0}.chatlist{background:#e5e5e5;bottom:0;left:100%;position:absolute;top:0;width:100%}.chatlist .list-group{margin-bottom:-1px;margin-top:-1px;max-height:100%;overflow-x:hidden;overflow-y:auto}.chatlist .list-group-item{border-left:0;border-radius:0;border-right:0;line-height:26px;min-height:51px;padding-right:70px;position:relative}.chatlist .list-group-item.newmessage{-webkit-animation:newmessage 1s steps(1) infinite alternate;animation:newmessage 1s steps(1) infinite alternate}.chatlist .list-group-item.disabled{color:#aaa}.chatlist .list-group-item:hover button{display:inline}.chatlist .list-group-item .fa-lg{display:inline-block;text-align:center;width:18px}.chatlist .list-group-item .badge{background:#84b819;border:1px solid #fff;position:absolute;right:50px;top:14px}.chatlist .list-group-item button{display:none;position:absolute;right:10px}.chatpane{-webkit-backface-visibility:hidden;backface-visibility:hidden;bottom:0;position:absolute;right:0;top:0;width:100%}.chat{background:#e5e5e5;bottom:0;display:none;left:0;overflow:hidden;position:absolute;right:0;top:0}.chat.newmessage .chatheadertitle:after{content:'***';position:absolute;right:32px;top:2px}.chat.newmessage .chatheader{-webkit-animation:newmessage 1s steps(1) infinite alternate;animation:newmessage 1s steps(1) infinite alternate}.chat.active.visible{display:block}.chat.with_pictures .message.is_self{padding-right:34px}.chat.with_pictures .message.is_self .timestamp{right:45px}.chat.with_pictures .message.is_remote{padding-left:44px}.chat .chatbodybottom{background:transparent;bottom:1px;left:0;margin:0 auto;position:absolute;right:0}@media (max-height: 210px){.chat .chatbodybottom{height:auto}}.chat .typinghint{color:#666;font-size:.8em;height:16px;overflow:hidden;padding:0 6px;white-space:nowrap}@media (max-height: 210px){.chat .typinghint{display:none}}.chat .inputbox{position:relative}@media (max-height: 210px){.chat .inputbox{height:auto}}.chat .inputbox .btn{display:none;padding:.5em 1em;position:absolute;right:6px;top:1px}.chat .input{border-color:transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;display:block;height:54px;margin:0;max-height:54px;resize:none;width:100%}@media (max-height: 210px){.chat .input{max-height:2.5em}}.chat .input:active,.chat .input:focus{border-color:#66afe9}.chat .outputbox{bottom:75px;left:0;position:absolute;right:0;top:0}@media (max-height: 210px){.chat .outputbox{bottom:45px}}.chat .output{height:100%;overflow-x:hidden;overflow-y:auto;padding:.4em 0}.chat .output>i{clear:both;color:#666;display:block;font-size:.8em;padding:6px 0;text-align:center}.chat .output>i.p2p{font-weight:bold;padding:6px 0}.chat .message{background:#fff;border:1px solid transparent;border-radius:6px;-webkit-box-shadow:0 0 2px 0 rgba(0,0,0,0.03);box-shadow:0 0 2px 0 rgba(0,0,0,0.03);clear:both;display:block;margin:0 4px 2px 18px;padding:8px 8px 4px 8px;position:relative;word-wrap:break-word;max-width:85%}.chat .message ul{list-style-type:none;margin:0;padding-left:0}.chat .message .timestamp{font-size:.8em;position:absolute;right:8px;text-align:right;top:8px}.chat .message .timestamp-space{float:right;height:10px;width:40px}.chat .message strong{display:block;margin-right:40px;overflow:hidden;padding-bottom:2px;text-overflow:ellipsis;white-space:nowrap}.chat .message li{line-height:1.1em;margin:0 0 4px 0;padding-left:1.2em;position:relative}.chat .message li:before{color:#ccc;content:'\f075';font-family:FontAwesome;left:0;position:absolute;text-align:center;width:12px}.chat .message li.unread:before{color:#fe9a2e;content:""}.chat .message li.sending:before{color:#ccc;content:""}.chat .message li.sent:before{color:#5882fa;content:""}.chat .message li.delivered:before{color:#5882fa;content:""}.chat .message li.received:before{color:#84b819;content:""}.chat .message li.read:before{color:#ccc;content:""}.chat .message .buddyPicture{background:#84b819;border-radius:2px;font-size:.7em;height:30px;left:4px;overflow:hidden;position:absolute;text-align:center;top:4px;width:30px;z-index:0}.chat .message .buddyPicture .fa{color:#009534;line-height:30px}.chat .message .buddyPicture img{bottom:0;display:block;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.chat .message:before,.chat .message:after{border-style:solid;content:'';display:block;position:absolute;width:0}.chat .message.is_remote{float:left;background:#fff;color:#333}.chat .message.is_remote:before{border-color:transparent #fff;border-width:7px 11px 7px 0;bottom:auto;left:-12px;top:4px}.chat .message.is_remote:after{border-color:transparent #fff;border-width:6px 10px 6px 0;bottom:auto;left:-11px;top:5px}.chat .message.is_self{float:right;background:#fff;color:#333;margin-left:4px;margin-right:18px;padding-right:4px}.chat .message.is_self:before{border-color:transparent #fff;border-width:7px 0 7px 11px;top:4px;bottom:auto;right:-12px}.chat .message.is_self:after{border-color:transparent #fff;border-width:6px 0 6px 10px;top:5px;bottom:auto;right:-11px}.chat .message.is_self li:before{-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.chat .message.is_self .buddyPicture{left:auto;right:4px}.chat .message.with_hoverimage .buddyPicture{overflow:visible;z-index:initial}.chat .message.with_hoverimage .buddyPicture:hover .buddyInfoActions{opacity:1}.chat .message.with_hoverimage .buddyInfoActions{cursor:default;display:inline-block;height:40px;left:0;opacity:0;overflow:hidden;position:absolute;top:32px;-webkit-transition:opacity 0.1s .1s linear;transition:opacity 0.1s .1s linear;white-space:nowrap;z-index:1}.chat .message.with_hoverimage .buddyInfoActions .btn-group{display:block;margin:0 auto;width:70px}.chat .message.with_hoverimage .buddyInfoActions .btn-group .btn{width:35px}.chat .message.with_hoverimage .buddyInfoActions .btn-primary{padding:2px 5px}.chat .message.with_hoverimage .buddyInfoActions .fa{color:#fff;line-height:24px}.chatmenu{height:36px;left:0;padding:4px;position:absolute;right:0;top:36px}@media (max-height: 210px){.chatmenu{display:none}}.chatbody{bottom:-1px;left:0;position:absolute;right:0;top:74px}@media (max-height: 210px){.chatbody{border-top:1px solid #e7e7e7;top:0;top:0}}.chatheader{background:rgba(255,255,255,0.9);border-bottom:1px solid #e7e7e7;border-left:1px solid #e7e7e7;height:36px;left:0;line-height:34px;padding:0 4px 0 8px;position:absolute;right:0;top:0}@media (max-height: 210px){.chatheader{display:none}}.chatheader .chatstatusicon{cursor:pointer;display:block;font-size:1.4em;height:36px;left:0;position:absolute;text-align:center;top:0;width:36px}.chatheader .chatheadertitle{display:inline;padding-left:28px}.chatheader .ctrl{color:rgba(0,0,0,0.3);position:absolute;right:1px;top:0}.chatheader .ctrl .fa{cursor:pointer;padding:6px}.chatheader span{display:inline-block;max-width:60%;overflow:hidden;pointer-events:none;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}@-webkit-keyframes newmessage{0%{background-color:#84b819;border-color:#84b819}50%{background-color:#f8f8f8;border-color:#f8f8f8}100%{background-color:#84b819;border-color:#84b819}}@keyframes newmessage{0%{background-color:#84b819;border-color:#84b819}50%{background-color:#f8f8f8;border-color:#f8f8f8}100%{background-color:#84b819;border-color:#84b819}}.withChat #help,.withBuddylist #help{right:260px}.withChat.withBuddylist #help,.withSettings #help{right:520px}#help{bottom:10px;color:#aaa;font-size:1.1em;left:0;margin:0 auto;position:absolute;right:0;text-shadow:0 0 5px #000;top:80px;-webkit-transition:right 200ms ease-in-out;transition:right 200ms ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:350px}@media only screen and (max-width: 400px){.help{display:none}}@media only screen and (min-width: 400px) and (max-width: 1020px){.help{font-size:1em;width:250px}}.help>div{margin:0 10px}.help .help-subline{color:#888;padding:20px 0}.help .btn{text-shadow:none}#audiolevel{left:0;margin:0 auto;position:fixed;right:0;top:43px;width:400px;z-index:60}#audiolevel .audio-level{background:#84b819;background:gradient(linear, left top, left bottom, color-stop(0%, #84b819), color-stop(50%, #a1d54f), color-stop(51%, #80c217), color-stop(100%, #7cbc0a));background:-webkit-gradient(linear, left top, left bottom, from(#84b819), color-stop(50%, #a1d54f), color-stop(51%, #80c217), to(#7cbc0a));background:-webkit-linear-gradient(top, #84b819 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%);background:linear-gradient(to bottom, #84b819 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%);border-radius:0 0 2px 2px;height:4px;left:0;margin:0 auto;position:absolute;right:0;-webkit-transition:width .05s ease-in-out;transition:width .05s ease-in-out;width:0}.file-info{background:#fff;border:1px solid #ddd;border-radius:4px;max-width:170px;padding:1em;position:relative;text-align:center}.file-info.downloader .anim{margin-left:-40px}.file-info.downloader .file-info-size{margin-bottom:10px}.file-info.downloading .file-info-size{border-color:#ddd}.file-info>div{position:relative;z-index:3}.file-info .file-info-bg{bottom:0;color:#eee;font-size:20em;left:41px;overflow:hidden;position:absolute;right:0;top:-82px;z-index:2}.file-info .actions{left:50%;margin-left:10px;position:absolute;text-align:left;top:14px}.file-info .uploader .file-info-speed{bottom:6px}.file-info .uploader .actions{margin-left:30px;opacity:0}.file-info .uploader .anim{margin-left:0}.file-info .uploader .hovercontrol:hover .anim{margin-left:-50px}.file-info .uploader .hovercontrol:hover .actions{margin-left:0;opacity:1}.file-info .uploader .hovercontrol>div{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.is_remote .file-info{background:#fff;border:1px solid #ddd}.is_remote .file-info .file-info-bg{color:#eee;font-size:20em}.file-info-name{font-size:1.1em;margin:.2em 0;min-width:140px;padding:0 .2em}.file-info-size{font-size:.8em;height:20px;position:relative}.file-info-size>span{display:block;left:0;margin:0 auto;padding:3px;position:absolute;right:0;text-shadow:1px 1px 1px #fff;top:0;z-index:5}.file-info-size>div{bottom:0;-webkit-box-shadow:none !important;box-shadow:none !important;left:0;position:absolute;top:0;width:0;z-index:0}.file-info-size>div.progress-bar{opacity:.5}.file-info-size>div.progress-bar.download{opacity:1;z-index:1}.file-info-speed{bottom:8px;font-size:.8em;left:0;position:absolute;right:0;text-align:center}@media only screen and (max-width: 630px){.mainScreenshare #audiovideo,.mainPresentation #audiovideo{display:none}}.withChat #audiovideo{right:300px}.withBuddylist #audiovideo{right:300px}.withBuddylist.withChat #audiovideo{right:600px}#audiovideo{bottom:0;left:0;position:absolute;right:0;top:51px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 590px){#audiovideo{right:0 !important}}#audiovideo.fullscreen{bottom:0 !important;left:0 !important;right:0 !important;top:0 !important}#audiovideo.fullscreen .remoteVideo .peerActions{display:none}.audiovideo{bottom:0;left:0;position:absolute;right:0;top:0}.audiovideo.active{-webkit-perspective:1000;perspective:1000}.audiovideo.active:hover .overlayActions{opacity:.3}.audiovideo.active .overlayActions:hover{opacity:.6}.audiovideo.active .audiovideoBase{-webkit-transform:rotateY(180deg);-ms-transform:rotateY(180deg);transform:rotateY(180deg)}.audiovideo .audiovideoBase{height:100%;position:relative;-webkit-transform:rotateY(0deg);-ms-transform:rotateY(0deg);transform:rotateY(0deg);-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:-webkit-transform;transition-property:transform;width:100%;z-index:2}.audiovideo .localContainer{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1);z-index:2;overflow:hidden}.audiovideo video{object-fit:cover}.audiovideo .onlyaudio{bottom:0;color:rgba(255,255,255,0.3);display:none;font-size:1em;left:0;pointer-events:auto;position:absolute;right:0;text-align:center;top:0}.audiovideo .onlyaudio:before{content:'';display:inline-block;height:100%;vertical-align:middle}.audiovideo .onlyaudio>*{font-size:6em;vertical-align:middle}.audiovideo .remoteContainer{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transform:rotateY(180deg);-ms-transform:rotateY(180deg);transform:rotateY(180deg);z-index:2}.audiovideo .miniContainer{background:#000;bottom:2px;height:100%;max-height:18%;opacity:0;position:absolute;right:2px;-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1);-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:opacity;transition-property:opacity;z-index:25;overflow:hidden}.audiovideo .miniContainer.visible{opacity:1}.audiovideo.cameraMute .miniContainer,.audiovideo.cameraMute .localVideos{background:#666}.audiovideo.cameraMute .miniContainer .onlyaudio,.audiovideo.cameraMute .localVideos .onlyaudio{display:block}.audiovideo.cameraMute .miniContainer video,.audiovideo.cameraMute .localVideos video{visibility:hidden}.audiovideo .miniVideo{display:block;height:100%;max-height:100%;max-width:100%;width:100%}.audiovideo .localVideo{background:rgba(0,0,0,0.4);display:block;max-height:100%;opacity:0;-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:opacity;transition-property:opacity;width:100%}.audiovideo .localVideos{bottom:0;left:0;position:absolute;right:0;top:0;-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:opacity;transition-property:opacity}.audiovideo .remoteVideos{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0;-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:opacity;transition-property:opacity}.audiovideo .remoteVideos video{display:block;height:100%;width:100%}.audiovideo .overlayActions{background:rgba(0,0,0,0.9);bottom:0;height:140px;left:0;margin:auto 0;opacity:0;padding:3px 0;position:absolute;top:0;width:40px;z-index:5}.audiovideo .overlayActions .btn{color:#ccc;cursor:pointer;display:block;outline:0;text-shadow:0 0 5px #000;width:40px}.audiovideo .remoteVideo{background:rgba(0,0,0,0.4);display:inline-block;max-height:100%;max-width:100%;overflow:hidden;position:relative;vertical-align:bottom;width:100%}.audiovideo .remoteVideo.onlyaudioVideo{background:#666}.audiovideo .remoteVideo.onlyaudioVideo .onlyaudio{display:block}.audiovideo .remoteVideo.onlyaudioVideo video,.audiovideo .remoteVideo.dummy video{visibility:hidden}.audiovideo .remoteVideo.dummy .onlyaudio{display:block}.audiovideo .remoteVideo .peerActions{bottom:5%;left:40px;opacity:0;pointer-events:auto;position:absolute;right:40px;text-align:center;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:opacity;transition-property:opacity;z-index:10}.audiovideo .remoteVideo .peerActions:hover{opacity:.5}.audiovideo .remoteVideo .peerActions i{font-size:3vw}.audiovideo .remoteVideo .peerLabel{bottom:4%;color:#fff;font-size:2.5vw;left:4%;max-width:30%;opacity:.7;overflow:hidden;padding:4px;position:absolute;text-overflow:ellipsis;text-shadow:0 0 4px #000;white-space:nowrap;z-index:8}.remoteVideo.talking .peerLabel{color:#84b819}.remoteVideo .peerLabel{-webkit-transition:color 500ms ease-out;transition:color 500ms ease-out}.remoteVideo .overlayLogo{background:url("../img/logo-overlay.png") no-repeat center;-webkit-background-size:100%;background-size:100%;height:20%;max-height:40px;max-width:111px;opacity:.5;pointer-events:none;position:absolute;right:2.5%;top:4%;width:20%;z-index:2}.miniContainer.talking:after{bottom:2px;-webkit-box-shadow:0 0 20px #84b819 inset;box-shadow:0 0 20px #84b819 inset;content:'';left:2px;position:absolute;right:2px;top:2px}.renderer-smally{background:#000;border-right:0;border-top:0;width:150px}.renderer-smally .remoteVideos{padding-bottom:85px}.renderer-smally .remoteVideo .peerLabel{font-size:.9em;font-weight:bold}.renderer-smally .remoteVideo .peerActions i{font-size:1em}.renderer-smally .miniContainer{bottom:0;height:85px;left:0;max-height:none;right:0}.renderer-onepeople .miniContainer .onlyaudio{font-size:.4em}.renderer-democrazy .remoteVideos .miniContainer{bottom:auto;display:inline-block;max-height:100%;max-width:100%;position:relative;right:auto;vertical-align:bottom}.renderer-democrazy .active .miniContainer{opacity:1}.renderer-conferencekiosk .remoteVideos{background:rgba(0,0,0,0.4);bottom:2px;min-height:108px;pointer-events:auto;text-align:center;top:auto;white-space:nowrap}.renderer-conferencekiosk .remoteVideos>div{cursor:pointer;height:108px;width:192px}.renderer-conferencekiosk .remoteVideos .overlayLogo{display:none}.renderer-conferencekiosk .remoteVideos .peerLabel,.renderer-conferencekiosk .remoteVideos .peerActions i{font-size:1.1em}.renderer-conferencekiosk .remoteVideos .peerLabel{background:rgba(0,0,0,0.9)}.renderer-conferencekiosk .miniContainer{height:108px;max-height:none;width:192px}.renderer-conferencekiosk .bigVideo{bottom:112px;left:0;margin:auto;opacity:0;position:absolute;right:0;top:2px;-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:opacity;transition-property:opacity}.renderer-conferencekiosk .bigVideo video{height:100%;width:100%}.renderer-auditorium{position:relative}.renderer-auditorium span:before{content:'\f183';left:50%;margin-left:-.8em;margin-top:-.5em;position:absolute;top:50%}.renderer-auditorium span:after{content:'\f183';margin-right:-.9em;margin-top:-.5em;position:absolute;right:50%;top:50%}.renderer-auditorium .remoteContainer{border-left:40px solid #000}.renderer-auditorium .remoteVideos{background:rgba(0,0,0,0.4);pointer-events:auto;top:180px;width:320px}.renderer-auditorium .remoteVideos video{height:100%;margin-top:-9px;object-fit:cover;width:100%}.renderer-auditorium .remoteVideos>div{cursor:pointer;display:inline-block;height:60px;width:80px}.renderer-auditorium .remoteVideos .overlayLogo{display:none}.renderer-auditorium .remoteVideos .peerLabel{background:rgba(0,0,0,0.9);bottom:0;font-size:.6em;left:0;line-height:9px;max-width:100%;padding:0 4px;right:0}.renderer-auditorium .remoteVideos .peerActions{display:none}.renderer-auditorium .remoteVideos .miniContainer{max-height:auto;right:auto}.renderer-auditorium .bigVideo{height:180px;width:320px}.renderer-auditorium .bigVideo .remoteVideo,.renderer-auditorium .bigVideo .video{height:100%;width:100%}.renderer-auditorium .bigVideo .peerLabel{bottom:8%;font-size:1vw;max-width:40%}.mainScreenshare #screenshare{display:block}.screenshare{bottom:0;left:0;position:absolute;right:0;top:0}.screenshare .overlaybar{bottom:0;left:0;right:0}.screensharepane{background:#000;bottom:0;left:0;overflow:auto;position:absolute;right:0;top:0}.screensharepane .remotescreen{position:relative}.screensharepane video{max-height:99%;width:100%}.remotesize .screensharepane video{max-height:none;width:auto}#roombar{left:0;min-width:260px;position:absolute;right:0;top:51px;z-index:4}#roombar .roombar{left:0;position:absolute;right:0;top:0}.fa.link{color:#aaa}.fa.email{color:#aaa}.fa.facebook{color:#45619d}.fa.google{color:#dd4b39}.fa.twitter{color:#00aced}.fa.xing{color:#fff}.contactsmanager .desc{font-size:20px;font-weight:normal;text-align:baseline}.contactsmanager .addbtn{font-size:14px}.contactsmanager .addbtn .fa-users{font-size:22px}.contactsmanager .addbtn .fa-plus{font-size:15px}.contactsmanager .editpicture{float:left;margin-right:20px;vertical-align:middle}.contactsmanager .uploadbtn{margin-top:7px}.contactsmanager .editlist{max-height:250px;overflow-y:auto}.contactsmanager .picture{border-bottom:0;cursor:auto;display:table-cell;min-height:46px;position:static;width:auto}.contactsmanager .picture .buddyPicture{margin:0 0 0 10px}.contactsmanager .table{margin-bottom:0}.contactsmanager tr:first-child td{border-top:0}.contactsmanager .name{text-align:left;vertical-align:middle;width:40%}.contactsmanager .action{padding-right:15px;text-align:right;vertical-align:middle}.contactsmanageredit .buddy .buddyPicture{margin:0}.search:before{content:'\f002';font-family:'fontAwesome';font-size:14px;left:22px;opacity:.4;position:absolute;top:6px}.search ~ input{padding-left:25px}.mainPresentation #presentation{display:block}.presentation{bottom:0;left:0;position:absolute;right:0;top:0}.presentation .overlaybar{bottom:0;left:0;right:0;text-align:center}.presentation .overlaybar .overlaybar-content{max-width:100%}.presentation .overlaybar .overlaybar-content .pagecontrol{height:30px}.presentation .overlaybar .btn-prev{left:40px}.presentation .overlaybar .btn-next{left:auto;right:0}.presentation .overlaybar .overlaybar-button{font-size:20px;line-height:28px;padding:4px 6px;position:absolute;top:0}.presentation .thumbnail{color:#333;display:inline-block;height:122px;margin-left:20px;margin-top:20px;position:relative;text-shadow:none;vertical-align:middle;width:160px}.presentation .thumbnail:first-child{margin-left:0}.presentation .thumbnail.presentable{cursor:pointer}.presentation .thumbnail:hover .presentation-action{display:block}.presentation .thumbnail:hover .notavailable{display:block}.presentation .thumbnail .caption{overflow:hidden;padding-bottom:0;text-overflow:ellipsis}.presentation .thumbnail .caption .size{font-size:10px}.presentation .thumbnail .caption .progress{position:relative}.presentation .thumbnail .caption .download-info{bottom:0;color:#333;left:0;line-height:20px;position:absolute;right:0;text-shadow:1px 1px 1px #fff;top:0}.presentation .thumbnail .active{bottom:0;color:#84b819;font-size:10em;left:0;opacity:.7;position:absolute;right:0;text-align:center;top:0}.presentation .thumbnail .notavailable{bottom:0;color:#d2322d;display:none;font-size:10em;left:0;opacity:.25;position:absolute;right:0;text-align:center;top:0}.presentation .thumbnail .presentation-action{display:none;position:absolute;top:1px}.presentation .thumbnail .download{left:1px}.presentation .thumbnail .delete{right:1px}.presentation .thumbnail .filetype{font-size:5em}.presentationpane{bottom:0;left:0;overflow:auto;position:absolute;right:0;top:0}.presentationpane .welcome{padding:0}.presentationpane .welcome h1{white-space:normal}.presentationpane .welcome .btn{margin-top:30px}.presentationpane .welcome .progress span{text-shadow:none}.presentationpane .welcome .progress .download-info{color:#333;left:0;position:absolute;text-shadow:1px 1px 1px #fff;width:100%}.presentationpane .canvasContainer{height:100%;width:100%;overflow:hidden}.presentationpane .canvasContainer iframe{border:0;height:100%;width:100%}.pageinfo input{display:inline;width:70px}.presentations{height:156px;margin-left:-25px;margin-right:10px;overflow-x:auto;overflow-y:hidden;white-space:nowrap}.mainYoutubevideo #youtubevideo{display:block}.youtubevideo{bottom:0;left:0;position:absolute;right:0;top:0}.youtubevideo .click-container{bottom:0;left:0;position:absolute;right:0;top:0;z-index:5}.youtubevideo .welcome{max-width:700px}.youtubevideo .welcome h1{margin-top:10px}.youtubevideo .welcome .welcome-container{max-width:700px}.youtubevideo .welcome .welcome-logo{background:transparent;font-size:10em}.youtubevideo .overlaybar{bottom:0;left:0;right:0}.youtubevideo .overlaybar-content{max-width:100%;width:100%}.youtubevideo .overlaybar-content form .overlaybar-buttons{position:absolute;right:23px;top:6px}.youtubevideo .overlaybar-input{padding-right:15px;position:relative;width:100%}.youtubevideopane{bottom:0;left:0;overflow:auto;position:absolute;right:0;top:0}.youtubecontainer{position:relative}.youtubecontainer.fullscreen{width:100%}.youtubeplayerinfo{bottom:10%;left:0;opacity:0;pointer-events:auto;position:absolute;right:0;text-align:center;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:opacity;transition-property:opacity;z-index:10}.youtubeplayerinfo:hover{opacity:.8}.youtubeplayerinfo div{background-color:#f9f2f4;border-radius:10px;display:inline-block;font-size:2em;padding:20px 40px}.volumecontrol{background:rgba(0,0,0,0.6);bottom:0;left:0;opacity:0;padding:4px;pointer-events:auto;position:absolute;right:0;z-index:10}.volumecontrol:hover{opacity:1}.volume-button{display:inline;min-width:38px}.volumebar{display:inline-block;padding:6px 8px;vertical-align:middle}.volumebar .bar{-webkit-appearance:none;background-color:#aaa;border:1px solid #aaa;height:3px;outline:0;width:100px}.volumebar .bar::-webkit-slider-thumb{-webkit-appearance:none;background-color:#fff;height:20px;width:6px}.volumebar .bar::-moz-range-track{background:#aaa;border:0}.volumebar .bar::-moz-range-thumb{background-color:#fff;border-radius:0;height:20px;width:6px}.volumebar .bar::-moz-focusring{outline:1px solid #aaa;outline-offset:-1px}.modal{overflow-y:auto}#toast-container>.toast{background-image:none !important}#toast-container>.toast:before{color:#fff;float:left;font-family:FontAwesome;font-size:20px;line-height:20px;margin:auto .5em auto -1.5em;padding-right:.5em;position:fixed}#toast-container>.toast-warning:before{content:'\f05a'}#toast-container>.toast-error:before{content:'\f05a'}#toast-container>.toast-info:before{content:'\f05a'}#toast-container>.toast-success:before{content:'\f05a'}#toast-container>:hover,#toast-container>div{-webkit-box-shadow:none !important;box-shadow:none !important}.toast-info{background-color:#5bc0de}.toast-close-button{font-size:1em;top:-.6em}#toast-container>div{filter:alpha(opacity=100);opacity:1} + *//*! HiDPI v2.0.1 | MIT License | git.io/hidpi */.toast-title{font-weight:bold}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#ffffff}.toast-message a:hover{color:#cccccc;text-decoration:none}.toast-close-button{position:relative;right:-0.3em;top:-0.3em;float:right;font-size:20px;font-weight:bold;color:#ffffff;-webkit-text-shadow:0 1px 0 #ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}.toast-close-button:hover,.toast-close-button:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}button.toast-close-button{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999}#toast-container *{box-sizing:border-box}#toast-container>div{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;border-radius:3px 3px 3px 3px;background-position:15px center;background-repeat:no-repeat;box-shadow:0 0 12px #999999;color:#ffffff;opacity:0.8;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80)}#toast-container>:hover{box-shadow:0 0 12px #000000;opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);cursor:pointer}#toast-container>.toast-info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important}#toast-container>.toast-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important}#toast-container>.toast-success{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important}#toast-container>.toast-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important}#toast-container.toast-top-center>div,#toast-container.toast-bottom-center>div{width:300px;margin:auto}#toast-container.toast-top-full-width>div,#toast-container.toast-bottom-full-width>div{width:96%;margin:auto}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000000;opacity:0.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}@media all and (max-width: 240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 241px) and (max-width: 480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 481px) and (max-width: 768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}}.dialog-header-error{background-color:#d2322d}.dialog-header-wait{background-color:#428bca}.dialog-header-notify{background-color:#eee}.dialog-header-confirm{background-color:#eee}.dialog-header-error span,.dialog-header-error h4,.dialog-header-wait span,.dialog-header-wait h4{color:#fff}.modal-content{overflow:hidden}.modal-content .modal-body{min-height:160px}[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none !important}html,body{background-clip:padding-box;background-color:#e5e5e5;height:100%}body{margin:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;padding:0}@media (max-width: 700px){body{overflow-x:auto}}body>.ui{height:100%;min-width:300px;position:absolute;width:100%}a{cursor:pointer}#background{background:url("../img/bg-tiles.jpg");bottom:0;left:0;position:fixed;right:0;top:0;z-index:0}@media (-webkit-min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){#background{background-image:url("../img/bg-tiles_x2.jpg");background-size:198px 200px}}.help-block{color:#737373}.dialog-header-notify,.dialog-header-confirm{background-color:#eee}.desktopnotify-icon{background-image:url("../img/logo-48x48.png")}:-webkit-full-screen{background:#000}:-moz-full-screen{background:#000}:-ms-fullscreen{background:#000}:fullscreen{background:#000}.visibleRoomTypeRoom{display:none}.roomTypeRoom .visibleRoomTypeRoom{display:block}.roomTypeRoom .hiddenRoomTypeRoom{display:none}.visibleRoomTypeConference{display:none}.roomTypeConference .visibleRoomTypeConference{display:block}.roomTypeConference .hiddenRoomTypeConference{display:none}#loader{background:url("../img/logo.svg") no-repeat center;background-size:contain;bottom:15%;left:15%;margin:auto;max-height:150px;max-width:200px;opacity:1;pointer-events:none;position:fixed;right:15%;top:15%;-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:opacity;transition-property:opacity;z-index:20000}#loader.fake-alert{background:none;color:white;font-weight:bold;text-align:center;font-size:1.5em;line-height:1.1em}#loader.done{opacity:0}#loader>div{bottom:0;color:#ddd;display:block;font-size:2em;left:0;margin:0 auto;margin-bottom:-40px;position:absolute;right:0;text-align:center;text-shadow:0 0 5px #000}#loader .loader-message{font-size:.5em}.mainview{bottom:0;display:none;left:0;position:absolute;right:0;top:51px}@media (max-width: 700px){.mainview{left:0;left:0}}.videolayoutSmally .mainview{left:150px}.videolayoutClassroom .mainview{left:360px}.withChat .mainview,.withBuddylist .mainview{right:260px}.withBuddylist.withChat .mainview{right:520px}#page{bottom:0;left:0;position:absolute;right:0;top:51px}.welcome{color:#aaa;font-size:1.1em;margin-top:80px;max-width:600px;min-height:160px;padding-left:105px;padding-right:0;position:relative;text-shadow:0 0 5px #000}@media (max-width: 700px){.welcome{margin:0 auto;padding-left:10px;padding-right:20px}}.welcome h1{margin-top:0;white-space:nowrap}@media (max-width: 700px){.welcome h1{white-space:normal}}.welcome .welcome-container{margin:0 auto}.welcome .welcome-logo{background:url("../img/logo.svg") no-repeat left top;background-size:contain;bottom:0;left:0;position:absolute;top:1px;width:90px}@media (max-width: 700px){.welcome .welcome-logo{height:70px;margin-bottom:20px;margin-top:30px;position:relative;width:70px}}.welcome .welcome-input{position:relative}.welcome .welcome-input input{padding-right:105px}.welcome .welcome-input-buttons{position:absolute;right:8px;text-shadow:none;top:6px}.welcome .welcome-input-buttons a{color:#000;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.welcome .room-link{margin-top:-10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.welcome .room-link a{color:#aaa}.welcome .rooms-history{margin-top:3em}.welcome .rooms-history a{display:inline-block;margin-right:.5em}.welcome .rooms-history a:hover{text-decoration:none}.nicescroll::-webkit-scrollbar{background-color:#e5e5e5;border:solid transparent;height:8px;width:8px}.nicescroll::-webkit-scrollbar:hover{background-color:#e5e5e5;border-left:1px solid rgba(0,0,0,0.12);border-right:1px solid rgba(0,0,0,0.12)}.nicescroll::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.2)}.nicescroll::-webkit-scrollbar-thumb:active{background:rgba(0,0,0,0.4)}.fadetogglecontainer>div{position:absolute;width:100%}.animate-show.ng-hide-add{display:block !important;opacity:1;-webkit-transition:all linear 0s;transition:all linear 0s}.animate-show.ng-hide-add.ng-hide-add-active{opacity:0;-webkit-transition:all linear .5s;transition:all linear .5s}.animate-show.ng-hide-remove{display:block !important;opacity:0;-webkit-transition:all linear 0s;transition:all linear 0s}.animate-show.ng-hide-remove.ng-hide-remove-active{opacity:1;-webkit-transition:all linear .5s;transition:all linear .5s}.overlaybar{background:rgba(0,0,0,0.2);border-bottom:1px solid #222;border-top:1px solid #222;color:#e7e7e7;min-height:36px;padding:3px 8px 0 30px;position:absolute;text-shadow:0 0 5px #000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.overlaybar:hover{background:rgba(0,0,0,0.5)}.overlaybar.notvisible{background:transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;pointer-events:none}.overlaybar.notvisible:hover{background:transparent}.overlaybar.notvisible .overlaybar-content{display:none}.overlaybar.notvisible .overlaybar-overlay{display:block}.overlaybar .btn{text-shadow:none}.overlaybar .btn-link{text-shadow:0 0 5px #000}.overlaybar .form-group>*{float:left;padding-top:0}.overlaybar input[type="radio"],.overlaybar input[type="checkbox"]{margin-top:2px}.overlaybar label{padding-top:6px !important}.overlaybar .overlaybar-button{color:#e7e7e7;display:block;font-size:20px;left:3px;opacity:.7;padding:4px 6px;pointer-events:auto;position:absolute;top:0;vertical-align:middle;z-index:15}.overlaybar .overlaybar-content{display:inline-block;margin-bottom:0;margin-left:.5em}.overlaybar .overlaybar-content>*{padding-right:.5em}.overlaybar .overlaybar-content .input-group{max-width:160px}.overlaybar .overlaybar-overlay{display:none;margin-left:.5em;opacity:.7;padding-top:2px;text-align:left}.visible-with-contacts,.visible-with-contacts-inline{display:none}.with-contacts .visible-with-contacts{display:block}.with-contacts .visible-with-contacts-inline{display:inline-block}.with-contacts .hidden-with-contacts{display:none}@media (min-width: 700px){.withBuddylist #rightslide{right:0}}#rightslide{bottom:0;left:0;pointer-events:none;position:absolute;right:-300px;top:51px;-webkit-transition:right 200ms ease-in-out;transition:right 200ms ease-in-out;z-index:5}#rightslide .rightslidepane{height:100%;position:relative;width:100%}.bar{background:#f8f8f8;color:#262626;font:bold 1em/50px "Helvetica Neue",Helvetica,Arial,sans-serif;text-align:center;touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:60}.bar .left{padding:5px 5px 5px 15px}@media (max-width: 700px){.bar .left{padding:2px 5px 0 11px;padding:2px 5px 0 11px}}.logo{background:url("../img/logo-small.png") no-repeat;background-size:100%;color:#000;display:inline-block;font:normal 11px/11px "Helvetica Neue",Helvetica,Arial,sans-serif;height:32px;text-align:left;vertical-align:middle;width:90px}@media (max-width: 700px){.logo{background:url("../img/logo.svg") no-repeat center;height:46px;width:46px}.logo .desc{display:none}}.logo .desc{font-style:italic;left:38px;position:relative;top:26px}.logo .desc a{color:#222}.bar .middle{left:0;pointer-events:none;position:absolute;right:60px;text-align:center;top:0}.bar .middle>span{background:#f8f8f8;display:inline-block;min-height:50px;pointer-events:auto}.bar .middle .userpicture{border-radius:2px;display:inline-block;height:46px;margin:-1px .5em 0;width:46px}@media (max-width: 700px){.bar .middle .userpicture{display:none}}@media (max-width: 700px){.bar .middle .status-connected,.bar .middle .status-conference,.bar .middle .status-connecting,.bar .middle .status-closed,.bar .middle .status-reconnecting,.bar .middle .status-error,.bar .middle .status-ringing{left:0;max-width:100%;position:absolute;right:0}}.bar .right{margin-top:-1px;padding-right:4px}.bar .right .badge{background-color:#84b819;border:1px solid #fff;font-size:.4em;position:absolute;right:0;top:2px}.bar .right .btn{background:#e9e9e9;border-color:#e2e2e2;color:#333;font:24px/40px "Helvetica Neue",Helvetica,Arial,sans-serif;height:42px;margin-left:-2px;padding:0;position:relative;text-align:center;width:42px}.bar .right .btn:focus{border:0;box-shadow:0;outline:none}.bar .right .btn:hover{background-color:transparent;border-color:#e7e7e7;color:#666}.bar .right .btn.active{background-color:transparent;border-color:#e7e7e7;color:#666}.bar .right .btn.active.amutebtn{background-color:#db4f39;border-color:#db4f39;color:#fff}.bar .right .btn.active.aenablebtn{background-color:#84b819;border-color:#84b819;color:#fff}.btn-mutemicrophone i:before{content:'\f130'}.btn-mutemicrophone.active i:before{content:'\f131'}.btn-mutecamera i:before{content:'\f06e'}.btn-mutecamera.active i:before{content:'\f070'}@-webkit-keyframes shakeityeah{0%{-webkit-transform:translate(2px, 1px) rotate(0deg);transform:translate(2px, 1px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -2px) rotate(-1deg);transform:translate(-1px, -2px) rotate(-1deg)}4%{-webkit-transform:translate(-3px, 0) rotate(1deg);transform:translate(-3px, 0) rotate(1deg)}8%{-webkit-transform:translate(0, 2px) rotate(0deg);transform:translate(0, 2px) rotate(0deg)}10%{-webkit-transform:translate(1px, -1px) rotate(1deg);transform:translate(1px, -1px) rotate(1deg)}12%{-webkit-transform:translate(-1px, 2px) rotate(-1deg);transform:translate(-1px, 2px) rotate(-1deg)}14%{-webkit-transform:translate(-3px, 1px) rotate(0deg);transform:translate(-3px, 1px) rotate(0deg)}16%{-webkit-transform:translate(2px, 1px) rotate(-1deg);transform:translate(2px, 1px) rotate(-1deg)}18%{-webkit-transform:translate(-1px, -1px) rotate(1deg);transform:translate(-1px, -1px) rotate(1deg)}20%{-webkit-transform:translate(2px, 2px) rotate(0deg);transform:translate(2px, 2px) rotate(0deg)}22%{-webkit-transform:translate(1px, -2px) rotate(-1deg);transform:translate(1px, -2px) rotate(-1deg)}24%{-webkit-transform:translate(0, 0) rotate(0deg);transform:translate(0, 0) rotate(0deg)}}@keyframes shakeityeah{0%{-webkit-transform:translate(2px, 1px) rotate(0deg);transform:translate(2px, 1px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -2px) rotate(-1deg);transform:translate(-1px, -2px) rotate(-1deg)}4%{-webkit-transform:translate(-3px, 0) rotate(1deg);transform:translate(-3px, 0) rotate(1deg)}8%{-webkit-transform:translate(0, 2px) rotate(0deg);transform:translate(0, 2px) rotate(0deg)}10%{-webkit-transform:translate(1px, -1px) rotate(1deg);transform:translate(1px, -1px) rotate(1deg)}12%{-webkit-transform:translate(-1px, 2px) rotate(-1deg);transform:translate(-1px, 2px) rotate(-1deg)}14%{-webkit-transform:translate(-3px, 1px) rotate(0deg);transform:translate(-3px, 1px) rotate(0deg)}16%{-webkit-transform:translate(2px, 1px) rotate(-1deg);transform:translate(2px, 1px) rotate(-1deg)}18%{-webkit-transform:translate(-1px, -1px) rotate(1deg);transform:translate(-1px, -1px) rotate(1deg)}20%{-webkit-transform:translate(2px, 2px) rotate(0deg);transform:translate(2px, 2px) rotate(0deg)}22%{-webkit-transform:translate(1px, -2px) rotate(-1deg);transform:translate(1px, -2px) rotate(-1deg)}24%{-webkit-transform:translate(0, 0) rotate(0deg);transform:translate(0, 0) rotate(0deg)}}.btn-shakeityeah{-webkit-animation-duration:4s;animation-duration:4s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:shakeityeah;animation-name:shakeityeah;-webkit-animation-timing-function:steps(5);animation-timing-function:steps(5);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}#buddylist{bottom:0;position:absolute;right:0;top:0;width:325px;z-index:50}#buddylist:before{background:#f8f8f8;border-bottom:1px solid #e7e7e7;border-bottom-left-radius:6px;border-left:1px solid #e7e7e7;border-top:1px solid #e7e7e7;border-top-left-radius:6px;bottom:0;color:rgba(0,0,0,0.3);content:'\f100';cursor:pointer;display:none;font-family:FontAwesome;font-size:1.8em;height:55px;left:0;line-height:55px;margin:auto;padding-right:4px;pointer-events:auto;position:absolute;text-align:center;top:0;width:26px;z-index:1}.withBuddylist #buddylist:before{content:'\f101';padding-right:0}@media (max-width: 700px){.withBuddylist #buddylist:before{display:block}}.withBuddylistAutoHide #buddylist:before{display:block}.buddylist{background:#f8f8f8;border-left:1px solid #e7e7e7;bottom:0;left:25px;overflow-x:hidden;overflow-y:auto;pointer-events:auto;position:absolute;right:0;top:0}.buddylist.loading .buddylistloading{display:block}.buddylist.empty .buddylistempty{display:block}.buddylist .buddycontainer{pointer-events:auto;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.buddylist .buddylistempty{bottom:0;color:#b3b3b3;display:none;font-size:1.4em;height:2em;left:0;margin:auto;padding:.4em;position:absolute;right:0;text-align:center;top:0}.buddylist .buddylistloading{bottom:0;color:#b3b3b3;display:none;font-size:1.4em;height:2em;margin:auto;padding:.4em;position:absolute;right:0;text-align:center}.buddy{-webkit-tap-highlight-color:transparent;background:#fff;border-bottom:1px solid #e7e7e7;cursor:pointer;display:block;font-size:13px;min-height:66px;overflow:hidden;position:relative;text-align:left;width:100%}.buddy:hover{background:rgba(255,255,255,0.5)}.buddy.withSubline .buddy1,.buddy.contact .buddy1{top:15px}.buddy.withSubline .buddy2,.buddy.contact .buddy2{display:block}.buddy.hovered .buddyactions{right:0}.buddy.hovered .buddysessions{max-height:999px}.buddy .fa.contact:before{content:'\f006'}.buddy.contact .fa.contact:before{content:'\f005'}.buddy.isself .fa.contact:before{content:'\f192'}.buddy .buddyPicture{background:#84b819;border-radius:2px;float:left;height:46px;margin:10px;overflow:hidden;position:relative;text-align:center;width:46px}.buddy .buddyPicture .fa{color:#009534;font-size:3em;line-height:46px}.buddy .buddyPicture img{bottom:0;display:block;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.buddy .buddyPictureSmall{height:30px;margin:0;margin-left:0;margin-right:0;width:30px}.buddy .buddyPictureSmall .fa{font-size:2em;line-height:30px}.buddy .buddy1{color:#262626;font-size:14px;font-weight:bold;height:28px;left:65px;overflow:hidden;position:absolute;right:4px;text-overflow:ellipsis;top:24px;white-space:nowrap}.buddy .buddy2{color:rgba(0,0,0,0.5);display:none;left:65px;overflow:hidden;position:absolute;right:4px;text-overflow:ellipsis;top:33px;white-space:nowrap}.buddy .buddy3{display:inline-block;overflow:hidden;padding:0 6px;text-align:left;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:120px}.buddy .buddyactions{background:rgba(255,255,255,0.5);height:66px;line-height:66px;padding:0 10px;position:absolute;right:-125px;text-align:right;top:0;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:right;transition-property:right;white-space:nowrap;z-index:5}.buddy .buddyactions .btn{font-size:1.6em;height:40px;line-height:40px;padding:0;text-align:center;vertical-align:middle;width:42px}.buddy .buddysessions{margin-bottom:10px;margin-top:56px;max-height:0;-webkit-transition-delay:.1s;transition-delay:.1s;-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:max-height;transition-property:max-height}.buddy .buddysessions ul{border-left:1px dotted #e7e7e7;border-right:1px dotted #e7e7e7;margin:0 14px;padding-left:0;padding-top:10px}.buddy .buddysessions ul li{list-style-type:none;margin-bottom:2px;margin-left:0}.buddy .buddysessions ul li .btn-group{visibility:hidden}.buddy .buddysessions ul li:hover .btn-group{visibility:visible}.buddy .buddysessions .currentsession .buddy3{font-weight:bold}.buddyPictureCapture .picture{display:block;margin-bottom:5px}.buddyPictureCapture .videoPicture{margin-bottom:4px}.buddyPictureCapture .videoPicture .videoPictureVideo{background-color:#000;overflow:hidden;position:relative}.buddyPictureCapture .videoPicture video{-o-object-fit:cover;object-fit:cover}.buddyPictureCapture .videoPictureVideo{height:200px;width:200px}.buddyPictureCapture .videoPictureVideo .videoPrev,.buddyPictureCapture .videoPictureVideo video,.buddyPictureCapture .videoPictureVideo .preview{height:100%;width:100%}.buddyPictureCapture .videoFlash{background-color:#fff;border:1px dotted #e7e7e7;bottom:0;left:0;position:absolute;right:0;top:0;visibility:hidden;z-index:5}.buddyPictureCapture .videoFlash.flash{visibility:visible}.buddyPictureCapture .preview{left:0;position:absolute;top:0}.buddyPictureCapture .preview.previewPicture{position:relative}.buddyPictureCapture .btn-takePicture,.buddyPictureCapture .btn-retakePicture{left:0;margin:0 auto;max-width:40%;position:absolute;right:0;top:50%}.buddyPictureCapture .btn-retakePicture{visibility:hidden}.buddyPictureCapture .videoPictureVideo:hover .btn-retakePicture{visibility:visible}.buddyPictureCapture .countdownPicture{color:#f8f8f8;font-size:45px;left:0;margin:0 auto;opacity:.8;position:absolute;right:0;text-align:center;text-shadow:0 0 5px #000;top:75px}.buddyPictureUpload{position:relative}.buddyPictureUpload .loader{left:90px;position:absolute;z-index:1}.buddyPictureUpload .loader .fa-spin{color:#737373}.buddyPictureUpload>p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.buddyPictureUpload .showUploadPicture{background-color:#f8f8f8;border:1px solid #e7e7e7;height:200px;line-height:200px;margin-bottom:10px;overflow:hidden;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:200px}.buddyPictureUpload .showUploadPicture.imgData{background-color:#000}.buddyPictureUpload .showUploadPicture.imgData .chooseUploadPicture{display:none}.buddyPictureUpload .showUploadPicture.imgData:hover .imageUtilites{visibility:visible}.buddyPictureUpload .showUploadPicture .chooseUploadPicture{color:#737373;left:0;margin:0 auto;position:absolute;right:0;z-index:1}.buddyPictureUpload .showUploadPicture .fa{color:#f8f8f8;opacity:.8;text-shadow:0 0 5px #000}.buddyPictureUpload .preview{left:0;position:relative;top:0}.buddyPictureUpload .imageUtilites{line-height:30px;position:absolute;visibility:hidden;width:200px;z-index:1}.buddyPictureUpload .imageUtilites .fa{cursor:pointer;font-size:40px;height:50px;width:50px}.buddyPictureUpload .moveHorizontal{position:relative;top:-4px}.buddyPictureUpload .moveVertical{left:158px;position:absolute}.buddyPictureUpload .resize{position:relative;top:108px}#settings{background:#fff;border-left:1px solid #e7e7e7;bottom:0;padding-right:0px;position:fixed;right:-520px;top:0;-webkit-transition:right 200ms ease-in-out;transition:right 200ms ease-in-out;width:520px;z-index:80}#settings.show{right:0}@media only screen and (max-width: 800px){#settings.show{background:#fff;left:0;width:auto}}.settings{background:#fff;bottom:0;left:0;overflow-x:hidden;overflow-y:auto;padding:10px 15px;position:absolute;right:0;top:0;margin-top:50px}@media only screen and (max-width: 800px){.settings{padding-bottom:10px}}.settings legend{font-size:17px}.settings .version{color:#ccc;font-size:10px;position:absolute;right:10px;top:10px}settings-advanced{display:block;padding-top:15px}#chat{bottom:0;width:300px;min-width:200px;opacity:0;pointer-events:none;position:absolute;right:300px;top:0;z-index:45}.withChat #chat{opacity:1}@media (max-width: 500px){.withChat #chat{left:0;width:auto}}.withChat.withChatMaximized #chat{left:0;width:auto}@media (max-width: 1280px){.withChat.withChatMaximized #chat .message{max-width:55%}}@media (max-width: 700px){.withChat.withChatMaximized #chat .message{max-width:70%}}@media (max-width: 480px){.withChat.withChatMaximized #chat .message{max-width:85%}}.withChat .chat{pointer-events:auto}.chatcontainer{background:#e5e5e5;bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:0}.showchatlist .chatpane{right:100%}.showchatlist .chatlist{left:0}.chatlist{background:#e5e5e5;bottom:0;left:100%;position:absolute;top:0;width:100%}.chatlist .list-group{margin-bottom:-1px;margin-top:-1px;max-height:100%;overflow-x:hidden;overflow-y:auto}.chatlist .list-group-item{border-left:0;border-radius:0;border-right:0;line-height:26px;min-height:51px;padding-right:70px;position:relative}.chatlist .list-group-item.newmessage{-webkit-animation:newmessage 1s steps(1) infinite alternate;animation:newmessage 1s steps(1) infinite alternate}.chatlist .list-group-item.disabled{color:#aaa}.chatlist .list-group-item:hover button{display:inline}.chatlist .list-group-item .fa-lg{display:inline-block;text-align:center;width:18px}.chatlist .list-group-item .badge{background:#84b819;border:1px solid #fff;position:absolute;right:50px;top:14px}.chatlist .list-group-item button{display:none;position:absolute;right:10px}.chatpane{-webkit-backface-visibility:hidden;backface-visibility:hidden;bottom:0;position:absolute;right:0;top:0;width:100%}.chat{background:#e5e5e5;bottom:0;display:none;left:0;overflow:hidden;position:absolute;right:0;top:0}.chat.newmessage .chatheadertitle:after{content:'***';position:absolute;right:32px;top:2px}.chat.newmessage .chatheader{-webkit-animation:newmessage 1s steps(1) infinite alternate;animation:newmessage 1s steps(1) infinite alternate}.chat.active.visible{display:block}.chat.with_pictures .message.is_self{padding-right:34px}.chat.with_pictures .message.is_self .timestamp{right:45px}.chat.with_pictures .message.is_remote{padding-left:44px}.chat .chatbodybottom{background:transparent;bottom:1px;left:0;margin:0 auto;position:absolute;right:0}@media (max-height: 210px){.chat .chatbodybottom{height:auto}}.chat .typinghint{color:#666;font-size:.8em;height:16px;overflow:hidden;padding:0 6px;white-space:nowrap}@media (max-height: 210px){.chat .typinghint{display:none}}.chat .inputbox{position:relative}@media (max-height: 210px){.chat .inputbox{height:auto}}.chat .inputbox .btn{display:none;padding:.5em 1em;position:absolute;right:6px;top:1px}.chat .input{border-color:transparent;border-radius:0;box-shadow:none;display:block;height:54px;margin:0;max-height:54px;resize:none;width:100%}@media (max-height: 210px){.chat .input{max-height:2.5em}}.chat .input:active,.chat .input:focus{border-color:#66afe9}.chat .outputbox{bottom:75px;left:0;position:absolute;right:0;top:0}@media (max-height: 210px){.chat .outputbox{bottom:45px}}.chat .output{height:100%;overflow-x:hidden;overflow-y:auto;padding:.4em 0}.chat .output>i{clear:both;color:#666;display:block;font-size:.8em;padding:6px 0;text-align:center}.chat .output>i.p2p{font-weight:bold;padding:6px 0}.chat .message{background:#fff;border:1px solid transparent;border-radius:6px;box-shadow:0 0 2px 0 rgba(0,0,0,0.03);clear:both;display:block;margin:0 4px 2px 18px;padding:8px 8px 4px 8px;position:relative;word-wrap:break-word;max-width:85%}.chat .message ul{list-style-type:none;margin:0;padding-left:0}.chat .message .timestamp{font-size:.8em;position:absolute;right:8px;text-align:right;top:8px}.chat .message .timestamp-space{float:right;height:10px;width:40px}.chat .message strong{display:block;margin-right:40px;overflow:hidden;padding-bottom:2px;text-overflow:ellipsis;white-space:nowrap}.chat .message li{line-height:1.1em;margin:0 0 4px 0;padding-left:1.2em;position:relative}.chat .message li:before{color:#ccc;content:'\f075';font-family:FontAwesome;left:0;position:absolute;text-align:center;width:12px}.chat .message li.unread:before{color:#fe9a2e;content:""}.chat .message li.sending:before{color:#ccc;content:""}.chat .message li.sent:before{color:#5882fa;content:""}.chat .message li.delivered:before{color:#5882fa;content:""}.chat .message li.received:before{color:#84b819;content:""}.chat .message li.read:before{color:#ccc;content:""}.chat .message .buddyPicture{background:#84b819;border-radius:2px;font-size:.7em;height:30px;left:4px;overflow:hidden;position:absolute;text-align:center;top:4px;width:30px;z-index:0}.chat .message .buddyPicture .fa{color:#009534;line-height:30px}.chat .message .buddyPicture img{bottom:0;display:block;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.chat .message:before,.chat .message:after{border-style:solid;content:'';display:block;position:absolute;width:0}.chat .message.is_remote{float:left;background:#fff;color:#333}.chat .message.is_remote:before{border-color:transparent #fff;border-width:7px 11px 7px 0;bottom:auto;left:-12px;top:4px}.chat .message.is_remote:after{border-color:transparent #fff;border-width:6px 10px 6px 0;bottom:auto;left:-11px;top:5px}.chat .message.is_self{float:right;background:#fff;color:#333;margin-left:4px;margin-right:18px;padding-right:4px}.chat .message.is_self:before{border-color:transparent #fff;border-width:7px 0 7px 11px;top:4px;bottom:auto;right:-12px}.chat .message.is_self:after{border-color:transparent #fff;border-width:6px 0 6px 10px;top:5px;bottom:auto;right:-11px}.chat .message.is_self li:before{-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.chat .message.is_self .buddyPicture{left:auto;right:4px}.chat .message.with_hoverimage .buddyPicture{overflow:visible;z-index:initial}.chat .message.with_hoverimage .buddyPicture:hover .buddyInfoActions{opacity:1}.chat .message.with_hoverimage .buddyInfoActions{cursor:default;display:inline-block;height:40px;left:0;opacity:0;overflow:hidden;position:absolute;top:32px;-webkit-transition:opacity 0.1s .1s linear;transition:opacity 0.1s .1s linear;white-space:nowrap;z-index:1}.chat .message.with_hoverimage .buddyInfoActions .btn-group{display:block;margin:0 auto;width:70px}.chat .message.with_hoverimage .buddyInfoActions .btn-group .btn{width:35px}.chat .message.with_hoverimage .buddyInfoActions .btn-primary{padding:2px 5px}.chat .message.with_hoverimage .buddyInfoActions .fa{color:#fff;line-height:24px}.chatmenu{height:36px;left:0;padding:4px;position:absolute;right:0;top:36px}@media (max-height: 210px){.chatmenu{display:none}}.chatbody{bottom:-1px;left:0;position:absolute;right:0;top:74px}@media (max-height: 210px){.chatbody{border-top:1px solid #e7e7e7;top:0;top:0}}.chatheader{background:rgba(255,255,255,0.9);border-bottom:1px solid #e7e7e7;border-left:1px solid #e7e7e7;height:36px;left:0;line-height:34px;padding:0 4px 0 8px;position:absolute;right:0;top:0}@media (max-height: 210px){.chatheader{display:none}}.chatheader .chatstatusicon{cursor:pointer;display:block;font-size:1.4em;height:36px;left:0;position:absolute;text-align:center;top:0;width:36px}.chatheader .chatheadertitle{display:inline;padding-left:28px}.chatheader .ctrl{color:rgba(0,0,0,0.3);position:absolute;right:1px;top:0}.chatheader .ctrl .fa{cursor:pointer;padding:6px}.chatheader span{display:inline-block;max-width:60%;overflow:hidden;pointer-events:none;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}@-webkit-keyframes newmessage{0%{background-color:#84b819;border-color:#84b819}50%{background-color:#f8f8f8;border-color:#f8f8f8}100%{background-color:#84b819;border-color:#84b819}}@keyframes newmessage{0%{background-color:#84b819;border-color:#84b819}50%{background-color:#f8f8f8;border-color:#f8f8f8}100%{background-color:#84b819;border-color:#84b819}}.withChat #help,.withBuddylist #help{right:260px}.withChat.withBuddylist #help,.withSettings #help{right:520px}#help{bottom:10px;color:#aaa;font-size:1.1em;left:0;margin:0 auto;position:absolute;right:0;text-shadow:0 0 5px #000;top:80px;-webkit-transition:right 200ms ease-in-out;transition:right 200ms ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:350px}@media only screen and (max-width: 400px){.help{display:none}}@media only screen and (min-width: 400px) and (max-width: 1020px){.help{font-size:1em;width:250px}}.help>div{margin:0 10px}.help .help-subline{color:#888;padding:20px 0}.help .btn{text-shadow:none}#audiolevel{left:0;margin:0 auto;position:fixed;right:0;top:43px;width:400px;z-index:60}#audiolevel .audio-level{background:#84b819;background:gradient(linear, left top, left bottom, color-stop(0%, #84b819), color-stop(50%, #a1d54f), color-stop(51%, #80c217), color-stop(100%, #7cbc0a));background:-webkit-linear-gradient(top, #84b819 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%);background:linear-gradient(to bottom, #84b819 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%);border-radius:0 0 2px 2px;height:4px;left:0;margin:0 auto;position:absolute;right:0;-webkit-transition:width .05s ease-in-out;transition:width .05s ease-in-out;width:0}.file-info{background:#fff;border:1px solid #ddd;border-radius:4px;max-width:170px;padding:1em;position:relative;text-align:center}.file-info.downloader .anim{margin-left:-40px}.file-info.downloader .file-info-size{margin-bottom:10px}.file-info.downloading .file-info-size{border-color:#ddd}.file-info>div{position:relative;z-index:3}.file-info .file-info-bg{bottom:0;color:#eee;font-size:20em;left:41px;overflow:hidden;position:absolute;right:0;top:-82px;z-index:2}.file-info .actions{left:50%;margin-left:10px;position:absolute;text-align:left;top:14px}.file-info .uploader .file-info-speed{bottom:6px}.file-info .uploader .actions{margin-left:30px;opacity:0}.file-info .uploader .anim{margin-left:0}.file-info .uploader .hovercontrol:hover .anim{margin-left:-50px}.file-info .uploader .hovercontrol:hover .actions{margin-left:0;opacity:1}.file-info .uploader .hovercontrol>div{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.is_remote .file-info{background:#fff;border:1px solid #ddd}.is_remote .file-info .file-info-bg{color:#eee;font-size:20em}.file-info-name{font-size:1.1em;margin:.2em 0;min-width:140px;padding:0 .2em}.file-info-size{font-size:.8em;height:20px;position:relative}.file-info-size>span{display:block;left:0;margin:0 auto;padding:3px;position:absolute;right:0;text-shadow:1px 1px 1px #fff;top:0;z-index:5}.file-info-size>div{bottom:0;box-shadow:none !important;left:0;position:absolute;top:0;width:0;z-index:0}.file-info-size>div.progress-bar{opacity:.5}.file-info-size>div.progress-bar.download{opacity:1;z-index:1}.file-info-speed{bottom:8px;font-size:.8em;left:0;position:absolute;right:0;text-align:center}@media only screen and (max-width: 630px){.mainScreenshare #audiovideo,.mainPresentation #audiovideo{display:none}}.withChat #audiovideo{right:300px}.withBuddylist #audiovideo{right:300px}.withBuddylist.withChat #audiovideo{right:600px}#audiovideo{bottom:0;left:0;position:absolute;right:0;top:51px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 590px){#audiovideo{right:0 !important}}#audiovideo.fullscreen{bottom:0 !important;left:0 !important;right:0 !important;top:0 !important}#audiovideo.fullscreen .remoteVideo .peerActions{display:none}.audiovideo{bottom:0;left:0;position:absolute;right:0;top:0}.audiovideo.active{-webkit-perspective:1000;perspective:1000}.audiovideo.active:hover .overlayActions{opacity:.3}.audiovideo.active .overlayActions:hover{opacity:.6}.audiovideo.active .audiovideoBase{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.audiovideo .audiovideoBase{height:100%;position:relative;-webkit-transform:rotateY(0deg);transform:rotateY(0deg);-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:-webkit-transform;transition-property:transform;width:100%;z-index:2}.audiovideo .localContainer{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1);z-index:2;overflow:hidden}.audiovideo video{-o-object-fit:cover;object-fit:cover}.audiovideo .onlyaudio{bottom:0;color:rgba(255,255,255,0.3);display:none;font-size:1em;left:0;pointer-events:auto;position:absolute;right:0;text-align:center;top:0}.audiovideo .onlyaudio:before{content:'';display:inline-block;height:100%;vertical-align:middle}.audiovideo .onlyaudio>*{font-size:6em;vertical-align:middle}.audiovideo .remoteContainer{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transform:rotateY(180deg);transform:rotateY(180deg);z-index:2}.audiovideo .miniContainer{background:#000;bottom:2px;height:100%;max-height:18%;opacity:0;position:absolute;right:2px;-webkit-transform:scale(-1, 1);transform:scale(-1, 1);-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:opacity;transition-property:opacity;z-index:25;overflow:hidden}.audiovideo .miniContainer.visible{opacity:1}.audiovideo.cameraMute .miniContainer,.audiovideo.cameraMute .localVideos{background:#666}.audiovideo.cameraMute .miniContainer .onlyaudio,.audiovideo.cameraMute .localVideos .onlyaudio{display:block}.audiovideo.cameraMute .miniContainer video,.audiovideo.cameraMute .localVideos video{visibility:hidden}.audiovideo .miniVideo{display:block;height:100%;max-height:100%;max-width:100%;width:100%}.audiovideo .localVideo{background:rgba(0,0,0,0.4);display:block;max-height:100%;opacity:0;-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:opacity;transition-property:opacity;width:100%}.audiovideo .localVideos{bottom:0;left:0;position:absolute;right:0;top:0;-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:opacity;transition-property:opacity}.audiovideo .remoteVideos{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0;-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:opacity;transition-property:opacity}.audiovideo .remoteVideos video{display:block;height:100%;width:100%}.audiovideo .overlayActions{background:rgba(0,0,0,0.9);bottom:0;height:140px;left:0;margin:auto 0;opacity:0;padding:3px 0;position:absolute;top:0;width:40px;z-index:5}.audiovideo .overlayActions .btn{color:#ccc;cursor:pointer;display:block;outline:0;text-shadow:0 0 5px #000;width:40px}.audiovideo .remoteVideo{background:rgba(0,0,0,0.4);display:inline-block;max-height:100%;max-width:100%;overflow:hidden;position:relative;vertical-align:bottom;width:100%}.audiovideo .remoteVideo.onlyaudioVideo{background:#666}.audiovideo .remoteVideo.onlyaudioVideo .onlyaudio{display:block}.audiovideo .remoteVideo.onlyaudioVideo video,.audiovideo .remoteVideo.dummy video{visibility:hidden}.audiovideo .remoteVideo.dummy .onlyaudio{display:block}.audiovideo .remoteVideo .peerActions{bottom:5%;left:40px;opacity:0;pointer-events:auto;position:absolute;right:40px;text-align:center;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:opacity;transition-property:opacity;z-index:10}.audiovideo .remoteVideo .peerActions:hover{opacity:.5}.audiovideo .remoteVideo .peerActions i{font-size:3vw}.audiovideo .remoteVideo .peerLabel{bottom:4%;color:#fff;font-size:2.5vw;left:4%;max-width:30%;opacity:.7;overflow:hidden;padding:4px;position:absolute;text-overflow:ellipsis;text-shadow:0 0 4px #000;white-space:nowrap;z-index:8}.remoteVideo.talking .peerLabel{color:#84b819}.remoteVideo .peerLabel{-webkit-transition:color 500ms ease-out;transition:color 500ms ease-out}.remoteVideo .overlayLogo{background:url("../img/logo-overlay.png") no-repeat center;background-size:100%;height:20%;max-height:40px;max-width:111px;opacity:.5;pointer-events:none;position:absolute;right:2.5%;top:4%;width:20%;z-index:2}.miniContainer.talking:after{bottom:2px;box-shadow:0 0 20px #84b819 inset;content:'';left:2px;position:absolute;right:2px;top:2px}.renderer-smally{background:#000;border-right:0;border-top:0;width:150px}.renderer-smally .remoteVideos{padding-bottom:85px}.renderer-smally .remoteVideo .peerLabel{font-size:.9em;font-weight:bold}.renderer-smally .remoteVideo .peerActions i{font-size:1em}.renderer-smally .miniContainer{bottom:0;height:85px;left:0;max-height:none;right:0}.renderer-onepeople .miniContainer .onlyaudio{font-size:.4em}.renderer-democrazy .remoteVideos .miniContainer{bottom:auto;display:inline-block;max-height:100%;max-width:100%;position:relative;right:auto;vertical-align:bottom}.renderer-democrazy .active .miniContainer{opacity:1}.renderer-conferencekiosk .remoteVideos{background:rgba(0,0,0,0.4);bottom:2px;min-height:108px;pointer-events:auto;text-align:center;top:auto;white-space:nowrap}.renderer-conferencekiosk .remoteVideos>div{cursor:pointer;height:108px;width:192px}.renderer-conferencekiosk .remoteVideos .overlayLogo{display:none}.renderer-conferencekiosk .remoteVideos .peerLabel,.renderer-conferencekiosk .remoteVideos .peerActions i{font-size:1.1em}.renderer-conferencekiosk .remoteVideos .peerLabel{background:rgba(0,0,0,0.9)}.renderer-conferencekiosk .miniContainer{height:108px;max-height:none;width:192px}.renderer-conferencekiosk .bigVideo{bottom:112px;left:0;margin:auto;opacity:0;position:absolute;right:0;top:2px;-webkit-transition-duration:2s;transition-duration:2s;-webkit-transition-property:opacity;transition-property:opacity}.renderer-conferencekiosk .bigVideo video{height:100%;width:100%}.renderer-auditorium{position:relative}.renderer-auditorium span:before{content:'\f183';left:50%;margin-left:-.8em;margin-top:-.5em;position:absolute;top:50%}.renderer-auditorium span:after{content:'\f183';margin-right:-.9em;margin-top:-.5em;position:absolute;right:50%;top:50%}.renderer-auditorium .remoteContainer{border-left:40px solid #000}.renderer-auditorium .remoteVideos{background:rgba(0,0,0,0.4);pointer-events:auto;top:180px;width:320px}.renderer-auditorium .remoteVideos video{height:100%;margin-top:-9px;-o-object-fit:cover;object-fit:cover;width:100%}.renderer-auditorium .remoteVideos>div{cursor:pointer;display:inline-block;height:60px;width:80px}.renderer-auditorium .remoteVideos .overlayLogo{display:none}.renderer-auditorium .remoteVideos .peerLabel{background:rgba(0,0,0,0.9);bottom:0;font-size:.6em;left:0;line-height:9px;max-width:100%;padding:0 4px;right:0}.renderer-auditorium .remoteVideos .peerActions{display:none}.renderer-auditorium .remoteVideos .miniContainer{max-height:auto;right:auto}.renderer-auditorium .bigVideo{height:180px;width:320px}.renderer-auditorium .bigVideo .remoteVideo,.renderer-auditorium .bigVideo .video{height:100%;width:100%}.renderer-auditorium .bigVideo .peerLabel{bottom:8%;font-size:1vw;max-width:40%}.mainScreenshare #screenshare{display:block}.screenshare{bottom:0;left:0;position:absolute;right:0;top:0}.screenshare .overlaybar{bottom:0;left:0;right:0}.screensharepane{background:#000;bottom:0;left:0;overflow:auto;position:absolute;right:0;top:0}.screensharepane .remotescreen{position:relative}.screensharepane video{max-height:99%;width:100%}.remotesize .screensharepane video{max-height:none;width:auto}#roombar{left:0;min-width:260px;position:absolute;right:0;top:51px;z-index:4}#roombar .roombar{left:0;position:absolute;right:0;top:0}.fa.pin{color:#aaa}.fa.link{color:#aaa}.fa.email{color:#aaa}.fa.facebook{color:#45619d}.fa.google{color:#dd4b39}.fa.twitter{color:#00aced}.fa.xing{color:#fff}.contactsmanager .desc{font-size:20px;font-weight:normal;text-align:baseline}.contactsmanager .addbtn{font-size:14px}.contactsmanager .addbtn .fa-users{font-size:22px}.contactsmanager .addbtn .fa-plus{font-size:15px}.contactsmanager .editpicture{float:left;margin-right:20px;vertical-align:middle}.contactsmanager .uploadbtn{margin-top:7px}.contactsmanager .editlist{max-height:250px;overflow-y:auto}.contactsmanager .picture{border-bottom:0;cursor:auto;display:table-cell;min-height:46px;position:static;width:auto}.contactsmanager .picture .buddyPicture{margin:0 0 0 10px}.contactsmanager .table{margin-bottom:0}.contactsmanager tr:first-child td{border-top:0}.contactsmanager .name{text-align:left;vertical-align:middle;width:40%}.contactsmanager .action{padding-right:15px;text-align:right;vertical-align:middle}.contactsmanageredit .buddy .buddyPicture{margin:0}.search:before{content:'\f002';font-family:'fontAwesome';font-size:14px;left:22px;opacity:.4;position:absolute;top:6px}.search ~ input{padding-left:25px}.mainPresentation #presentation{display:block}.presentation{bottom:0;left:0;position:absolute;right:0;top:0}.presentation .overlaybar{bottom:0;left:0;right:0;text-align:center}.presentation .overlaybar .overlaybar-content{max-width:100%}.presentation .overlaybar .overlaybar-content .pagecontrol{height:30px}.presentation .overlaybar .btn-prev{left:40px}.presentation .overlaybar .btn-next{left:auto;right:0}.presentation .overlaybar .overlaybar-button{font-size:20px;line-height:28px;padding:4px 6px;position:absolute;top:0}.presentation .thumbnail{color:#333;display:inline-block;height:122px;margin-left:20px;margin-top:20px;position:relative;text-shadow:none;vertical-align:middle;width:160px}.presentation .thumbnail:first-child{margin-left:0}.presentation .thumbnail.presentable{cursor:pointer}.presentation .thumbnail:hover .presentation-action{display:block}.presentation .thumbnail:hover .notavailable{display:block}.presentation .thumbnail .caption{overflow:hidden;padding-bottom:0;text-overflow:ellipsis}.presentation .thumbnail .caption .size{font-size:10px}.presentation .thumbnail .caption .progress{position:relative}.presentation .thumbnail .caption .download-info{bottom:0;color:#333;left:0;line-height:20px;position:absolute;right:0;text-shadow:1px 1px 1px #fff;top:0}.presentation .thumbnail .active{bottom:0;color:#84b819;font-size:10em;left:0;opacity:.7;position:absolute;right:0;text-align:center;top:0}.presentation .thumbnail .notavailable{bottom:0;color:#d2322d;display:none;font-size:10em;left:0;opacity:.25;position:absolute;right:0;text-align:center;top:0}.presentation .thumbnail .presentation-action{display:none;position:absolute;top:1px}.presentation .thumbnail .download{left:1px}.presentation .thumbnail .delete{right:1px}.presentation .thumbnail .filetype{font-size:5em}.presentationpane{bottom:0;left:0;overflow:auto;position:absolute;right:0;top:0}.presentationpane .welcome{padding:0}.presentationpane .welcome h1{white-space:normal}.presentationpane .welcome .btn{margin-top:30px}.presentationpane .welcome .progress span{text-shadow:none}.presentationpane .welcome .progress .download-info{color:#333;left:0;position:absolute;text-shadow:1px 1px 1px #fff;width:100%}.presentationpane .canvasContainer{height:100%;width:100%;overflow:hidden}.presentationpane .canvasContainer iframe{border:0;height:100%;width:100%}.pageinfo input{display:inline;width:70px}.presentations{height:156px;margin-left:-25px;margin-right:10px;overflow-x:auto;overflow-y:hidden;white-space:nowrap}.mainYoutubevideo #youtubevideo{display:block}.youtubevideo{bottom:0;left:0;position:absolute;right:0;top:0}.youtubevideo .click-container{bottom:0;left:0;position:absolute;right:0;top:0;z-index:5}.youtubevideo .welcome{max-width:700px}.youtubevideo .welcome h1{margin-top:10px}.youtubevideo .welcome .welcome-container{max-width:700px}.youtubevideo .welcome .welcome-logo{background:transparent;font-size:10em}.youtubevideo .overlaybar{bottom:0;left:0;right:0}.youtubevideo .overlaybar-content{max-width:100%;width:100%}.youtubevideo .overlaybar-content form .overlaybar-buttons{position:absolute;right:23px;top:6px}.youtubevideo .overlaybar-input{padding-right:15px;position:relative;width:100%}.youtubevideopane{bottom:0;left:0;overflow:auto;position:absolute;right:0;top:0}.youtubecontainer{position:relative}.youtubecontainer.fullscreen{width:100%}.youtubeplayerinfo{bottom:10%;left:0;opacity:0;pointer-events:auto;position:absolute;right:0;text-align:center;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:opacity;transition-property:opacity;z-index:10}.youtubeplayerinfo:hover{opacity:.8}.youtubeplayerinfo div{background-color:#f9f2f4;border-radius:10px;display:inline-block;font-size:2em;padding:20px 40px}.volumecontrol{background:rgba(0,0,0,0.6);bottom:0;left:0;opacity:0;padding:4px;pointer-events:auto;position:absolute;right:0;z-index:10}.volumecontrol:hover{opacity:1}.volume-button{display:inline;min-width:38px}.volumebar{display:inline-block;padding:6px 8px;vertical-align:middle}.volumebar .bar{-webkit-appearance:none;background-color:#aaa;border:1px solid #aaa;height:3px;outline:0;width:100px}.volumebar .bar::-webkit-slider-thumb{-webkit-appearance:none;background-color:#fff;height:20px;width:6px}.volumebar .bar::-moz-range-track{background:#aaa;border:0}.volumebar .bar::-moz-range-thumb{background-color:#fff;border-radius:0;height:20px;width:6px}.volumebar .bar::-moz-focusring{outline:1px solid #aaa;outline-offset:-1px}.modal{overflow-y:auto}#toast-container>.toast{background-image:none !important}#toast-container>.toast:before{color:#fff;float:left;font-family:FontAwesome;font-size:20px;line-height:20px;margin:auto .5em auto -1.5em;padding-right:.5em;position:fixed}#toast-container>.toast-warning:before{content:'\f05a'}#toast-container>.toast-error:before{content:'\f05a'}#toast-container>.toast-info:before{content:'\f05a'}#toast-container>.toast-success:before{content:'\f05a'}#toast-container>:hover,#toast-container>div{box-shadow:none !important}.toast-info{background-color:#5bc0de}.toast-close-button{font-size:1em;top:-.6em}#toast-container>div{filter:alpha(opacity=100);opacity:1} diff --git a/static/js/app.js b/static/js/app.js index c6cc7736..fa295ac7 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -267,6 +267,7 @@ define([ }()); console.info("Selected language: "+lang); + app.constant("translationLanguage", {lang: lang}); // Set language and load default translations. launcher.translationData.lang = lang; diff --git a/static/js/controllers/appcontroller.js b/static/js/controllers/appcontroller.js index 65e10948..d1b07b74 100644 --- a/static/js/controllers/appcontroller.js +++ b/static/js/controllers/appcontroller.js @@ -57,6 +57,9 @@ define(["jquery", "angular", "underscore"], function($, angular, _) { videoNoiseReduction: false, preferVideoSendCodecVP9: false }, + turn: { + selectedRegion: null + }, sound: { incomingMessages: true, incomingCall: true, diff --git a/static/js/controllers/chatroomcontroller.js b/static/js/controllers/chatroomcontroller.js index d6611ef8..c2686e20 100644 --- a/static/js/controllers/chatroomcontroller.js +++ b/static/js/controllers/chatroomcontroller.js @@ -20,7 +20,7 @@ */ "use strict"; -define(['jquery', 'underscore', 'moment', 'text!partials/fileinfo.html', 'text!partials/contactrequest.html', 'text!partials/geolocation.html', 'text!partials/picturehover.html'], function($, _, moment, templateFileInfo, templateContactRequest, templateGeolocation, templatePictureHover) { +define(['angular', 'jquery', 'underscore', 'moment', 'text!partials/fileinfo.html', 'text!partials/contactrequest.html', 'text!partials/geolocation.html', 'text!partials/picturehover.html'], function(angular, $, _, moment, templateFileInfo, templateContactRequest, templateGeolocation, templatePictureHover) { // ChatroomController return ["$scope", "$element", "$window", "safeMessage", "safeDisplayName", "$compile", "$filter", "translation", "mediaStream", function($scope, $element, $window, safeMessage, safeDisplayName, $compile, $filter, translation, mediaStream) { @@ -220,6 +220,9 @@ define(['jquery', 'underscore', 'moment', 'text!partials/fileinfo.html', 'text!p var element; var scroll = this.canScroll(); lastMessageContainer = null; + if (angular.isString(s)) { + s = safeMessage(s); + } if (!extra_css) { extra_css = ""; @@ -547,7 +550,7 @@ define(['jquery', 'underscore', 'moment', 'text!partials/fileinfo.html', 'text!p if (!noop) { // Default handling is to use full message with security in place. if (message === null && nodes === null && data.Message && typeof data.Message == "string") { - message = safeMessage(data.Message); + message = data.Message; } // Show the beast. element = $scope.showmessage(from, timestamp, message, nodes); diff --git a/static/js/controllers/uicontroller.js b/static/js/controllers/uicontroller.js index 89a04dee..5ea75c38 100644 --- a/static/js/controllers/uicontroller.js +++ b/static/js/controllers/uicontroller.js @@ -20,9 +20,9 @@ */ "use strict"; -define(['jquery', 'underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapter'], function($, _, BigScreen, moment, sjcl, Modernizr) { +define(['jquery', 'underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'text!sounds/sprite1.json', 'webrtc.adapter'], function($, _, BigScreen, moment, sjcl, Modernizr, sprite1Definition) { - return ["$scope", "$rootScope", "$element", "$window", "$timeout", "safeDisplayName", "safeApply", "mediaStream", "appData", "playSound", "desktopNotify", "alertify", "toastr", "translation", "fileDownload", "localStorage", "screensharing", "localStatus", "dialogs", "rooms", "constraints", function($scope, $rootScope, $element, $window, $timeout, safeDisplayName, safeApply, mediaStream, appData, playSound, desktopNotify, alertify, toastr, translation, fileDownload, localStorage, screensharing, localStatus, dialogs, rooms, constraints) { + return ["$scope", "$rootScope", "$element", "$window", "$timeout", "safeDisplayName", "safeApply", "mediaStream", "appData", "playSound", "desktopNotify", "alertify", "toastr", "translation", "fileDownload", "localStorage", "screensharing", "localStatus", "dialogs", "rooms", "constraints", "turnData", function($scope, $rootScope, $element, $window, $timeout, safeDisplayName, safeApply, mediaStream, appData, playSound, desktopNotify, alertify, toastr, translation, fileDownload, localStorage, screensharing, localStatus, dialogs, rooms, constraints, turnData) { alertify.dialog.registerCustom({ baseType: 'notify', @@ -98,35 +98,14 @@ define(['jquery', 'underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'web }; + if (typeof(sprite1Definition) === "string") { + sprite1Definition = JSON.parse(sprite1Definition); + } + // Load default sounds. playSound.initialize({ urls: ['sounds/sprite1.ogg', 'sounds/sprite1.mp3'], - sprite: { - "connect1": [ - 0, - 5179], - "end1": [ - 12892, - 6199], - "entry1": [ - 8387, - 3000], - "leaving1": [ - 5228, - 2126], - "message1": [ - 19140, - 816], - "question1": [ - 20006, - 3313], - "ringtone1": [ - 7403, - 935], - "whistle1": [ - 11437, - 1405] - } + sprite: sprite1Definition }, null, { "ring": "whistle1", "joined": "entry1", @@ -364,7 +343,6 @@ define(['jquery', 'underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'web mediaStream.api.e.on("received.self", function(event, data) { - $timeout.cancel(ttlTimeout); safeApply($scope, function(scope) { scope.id = scope.myid = data.Id; scope.userid = scope.myuserid = data.Userid ? data.Userid : null; @@ -372,8 +350,8 @@ define(['jquery', 'underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'web }); // Set TURN and STUN data and refresh webrtc settings. - constraints.turn(data.Turn); constraints.stun(data.Stun); + turnData.update(data.Turn); $scope.refreshWebrtcSettings(); if (data.Version !== mediaStream.version) { @@ -410,14 +388,6 @@ define(['jquery', 'underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'web } } - // Support to upgrade stuff when ttl was reached. - if (data.Turn.ttl) { - ttlTimeout = $timeout(function() { - console.log("Ttl reached - sending refresh request."); - mediaStream.api.sendSelf(); - }, data.Turn.ttl / 100 * 90 * 1000); - } - // Support resurrection shrine. if (appData.flags.resurrect) { var resurrection = appData.flags.resurrect; @@ -468,6 +438,12 @@ define(['jquery', 'underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'web }); + mediaStream.api.e.on("received.turnUpdate", function(event, data) { + // Set TURN data and refresh webrtc settings. + turnData.update(data.Turn); + $scope.refreshWebrtcSettings(); + }); + mediaStream.webrtc.e.on("peercall", function(event, peercall) { // Kill timeout. @@ -775,8 +751,13 @@ define(['jquery', 'underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'web } }); + turnData.e.on("apply", function(event, turnData) { + constraints.turn(turnData); + $scope.refreshWebrtcSettings() + }); + $scope.$on("status", function(event, status) { - if (status === "connecting" && dialerEnabled) { + if (status === "connecting" && dialerEnabled && !$scope.isConferenceRoom()) { dialer.start(); // Start accept timeout. ringerTimeout = $timeout(function() { diff --git a/static/js/directives/audiovideo.js b/static/js/directives/audiovideo.js index 468391d0..9992c1b0 100644 --- a/static/js/directives/audiovideo.js +++ b/static/js/directives/audiovideo.js @@ -146,7 +146,7 @@ define(['jquery', 'underscore', 'text!partials/audiovideo.html', 'text!partials/ var video = clonedElement.find("video")[0]; $window.attachMediaStream(video, stream); // Waiter callbacks also count as connected, as browser support (FireFox 25) is not setting state changes properly. - videoWaiter.wait(video, stream, function(withvideo) { + videoWaiter.wait(video, stream, function(withvideo, retriggered) { if (scope.destroyed) { console.log("Abort wait for video on destroyed scope."); return; @@ -163,7 +163,9 @@ define(['jquery', 'underscore', 'text!partials/audiovideo.html', 'text!partials/ $scope.onlyaudio = true; }); } - scope.$emit("active", currentcall); + if (!retriggered) { + scope.$emit("active", currentcall); + } $scope.redraw(); }, function() { if (scope.destroyed) { diff --git a/static/js/directives/settings.js b/static/js/directives/settings.js index 43c9f9a2..d1d30a9d 100644 --- a/static/js/directives/settings.js +++ b/static/js/directives/settings.js @@ -55,7 +55,7 @@ define(['jquery', 'underscore', 'text!partials/settings.html'], function($, _, t return ["$compile", "mediaStream", function($compile, mediaStream) { - var controller = ['$scope', 'desktopNotify', 'mediaSources', 'safeApply', 'availableLanguages', 'translation', 'localStorage', 'userSettingsData', 'constraints', 'appData', '$timeout', function($scope, desktopNotify, mediaSources, safeApply, availableLanguages, translation, localStorage, userSettingsData, constraints, appData, $timeout) { + var controller = ['$scope', 'desktopNotify', 'mediaSources', 'safeApply', 'availableLanguages', 'translation', 'localStorage', 'userSettingsData', 'constraints', 'appData', '$timeout', 'turnData', function($scope, desktopNotify, mediaSources, safeApply, availableLanguages, translation, localStorage, userSettingsData, constraints, appData, $timeout, turnData) { $scope.layout.settings = false; $scope.showAdvancedSettings = true; @@ -63,6 +63,7 @@ define(['jquery', 'underscore', 'text!partials/settings.html'], function($, _, t $scope.rememberSettings = true; $scope.desktopNotify = desktopNotify; $scope.mediaSources = mediaSources; + $scope.turnData = turnData; $scope.availableLanguages = [{ code: "", name: translation._("Use browser language") @@ -90,6 +91,7 @@ define(['jquery', 'underscore', 'text!partials/settings.html'], function($, _, t if (form.$valid && form.$dirty) { var user = $scope.user; $scope.update(user); + $scope.turnData.refresh(); if ($scope.rememberSettings) { userSettingsData.save(user); localStorage.setItem("mediastream-language", user.settings.language || ""); @@ -148,6 +150,9 @@ define(['jquery', 'underscore', 'text!partials/settings.html'], function($, _, t }); $scope.refreshWebrtcSettings(); }); + if ($scope.user.settings.turn.selectedRegion === null && $scope.turnData.data.geo_uri) { + $scope.user.settings.turn.selectedRegion = "auto"; + } } else if (!showSettings && oldValue) { $scope.saveSettings(); } @@ -171,8 +176,19 @@ define(['jquery', 'underscore', 'text!partials/settings.html'], function($, _, t $timeout($scope.maybeShowSettings); }); - constraints.e.on("refresh", function(event, c) { + turnData.e.on("refresh", function(event, turn) { + var settings = $scope.master.settings; + + if (turn && turn.servers) { + var selected = settings.turn.selectedRegion; + if (turn.geo_uri && selected === null) { + selected = "auto"; + } + turn.selected = selected; + } + }); + constraints.e.on("refresh", function(event, c) { var settings = $scope.master.settings; // Assert that selected devices are there. diff --git a/static/js/directives/socialshare.js b/static/js/directives/socialshare.js index a0576251..bcda2133 100644 --- a/static/js/directives/socialshare.js +++ b/static/js/directives/socialshare.js @@ -31,7 +31,7 @@ define(['text!partials/socialshare.html'], function(template) { }; // socialShare - return ["$window", "translation", "rooms", "alertify", function($window, translation, rooms, alertify) { + return ["$window", "translation", "rooms", "roompin", "alertify", function($window, translation, rooms, roompin, alertify) { var title = $window.encodeURIComponent($window.document.title); var makeUrl = function(nw, target) { @@ -49,6 +49,7 @@ define(['text!partials/socialshare.html'], function(template) { replace: true, link: function($scope, $element, $attr) { $scope.$on("room.updated", function(ev, room) { + $scope.isRoomLocked = rooms.isLocked(); $scope.roomlink = rooms.link(room); }); $scope.$on("room.left", function(ev) { @@ -69,6 +70,8 @@ define(['text!partials/socialshare.html'], function(template) { if (nw === "link") { //$window.alert("Room link: " + $scope.roomlink); alertify.dialog.notify(translation._("Room link"), ''+$scope.roomlink+''); + } else if (nw === "pin") { + roompin.toggleCurrentRoomState(rooms); } } }); diff --git a/static/js/mediastream/api.js b/static/js/mediastream/api.js index 058b523c..ee5e576d 100644 --- a/static/js/mediastream/api.js +++ b/static/js/mediastream/api.js @@ -159,6 +159,10 @@ define(['jquery', 'underscore', 'ua-parser'], function($, _, uaparser) { this.sid = data.Sid; this.e.triggerHandler("received.self", [data]); break; + case "TurnUpdate": + //console.log("TURN update received", data); + this.e.triggerHandler("received.turnUpdate", [data]); + break; case "Offer": //console.log("Offer received", data.To, data.Offer); this.e.triggerHandler("received.offer", [data.To, data.Offer, data.Type, d.To, d.From]); diff --git a/static/js/mediastream/peercall.js b/static/js/mediastream/peercall.js index 69d10e6f..5eaca152 100644 --- a/static/js/mediastream/peercall.js +++ b/static/js/mediastream/peercall.js @@ -22,12 +22,13 @@ "use strict"; define(['jquery', 'underscore', 'mediastream/utils', 'mediastream/peerconnection'], function($, _, utils, PeerConnection) { - var PeerCall = function(webrtc, id, from, to) { + var PeerCall = function(webrtc, id, from, to, outgoing) { this.webrtc = webrtc; this.id = id; this.from = from; this.to = to; + this.outgoing = !!outgoing; this.e = $({}) // events @@ -49,7 +50,7 @@ define(['jquery', 'underscore', 'mediastream/utils', 'mediastream/peerconnection }; PeerCall.prototype.isOutgoing = function() { - return !!this.from; + return this.outgoing; }; PeerCall.prototype.setInitiate = function(initiate) { diff --git a/static/js/mediastream/peerconnection.js b/static/js/mediastream/peerconnection.js index 9bdc014d..6236f3a6 100644 --- a/static/js/mediastream/peerconnection.js +++ b/static/js/mediastream/peerconnection.js @@ -347,7 +347,7 @@ define(['jquery', 'underscore', 'webrtc.adapter'], function($, _) { if (!this.pc) { return []; } - return this.pc.getRemoteStreams.apply(this.pc, arguments); + return this.pc.getLocalStreams.apply(this.pc, arguments); }; diff --git a/static/js/mediastream/usermedia.js b/static/js/mediastream/usermedia.js index 4cb5af78..58697fdb 100644 --- a/static/js/mediastream/usermedia.js +++ b/static/js/mediastream/usermedia.js @@ -98,7 +98,52 @@ define(['jquery', 'underscore', 'audiocontext', 'mediastream/dummystream', 'webr var c = {audio: convertConstraints(constraints.audio), video: convertConstraints(constraints.video)}; // mediaDevices API returns a promise. console.log("Constraints for mediaDevices", c); - window.navigator.mediaDevices.getUserMedia(c).then(success).catch(error); + window.navigator.mediaDevices.getUserMedia(c).then(success).catch(function(err) { + if (!navigator.mediaDevices.enumerateDevices) { + // Don't know how to check for available devices. + error(err); + return; + } + + // gUM fails if one of audio/video is not available, check which devices are + // available and retry with updated constraints. + console.log("getUserMedia with audio/video contraints failed", err); + navigator.mediaDevices.enumerateDevices().then(function(devices) { + var has_audio = false; + var has_video = false; + console.log("Available devices", devices); + _.each(devices, function(device) { + switch (device.kind) { + case "audioinput": + has_audio = true; + break; + case "videoinput": + has_video = true; + break; + default: + break; + } + }); + if (!has_audio && !has_video) { + // No audio or video device found, no need to retry gUM. + error(err); + return; + } + + if (!has_audio) { + delete c.audio; + } + if (!has_video) { + delete c.video; + } + console.log("Retry getUserMedia with updated constraints", c); + window.navigator.mediaDevices.getUserMedia(c).then(success).catch(error); + }).catch(function(devicesError) { + console.log("Could not enumerate devices", devicesError); + // Fail initial gUM + error(err); + }); + }); } } else { // Use existing adapter. diff --git a/static/js/mediastream/webrtc.js b/static/js/mediastream/webrtc.js index 0d976d7f..e4288a4e 100644 --- a/static/js/mediastream/webrtc.js +++ b/static/js/mediastream/webrtc.js @@ -461,8 +461,8 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u }; - WebRTC.prototype.createCall = function(id, from, to) { - var call = new PeerCall(this, id, from, to); + WebRTC.prototype.createCall = function(id, from, to, outgoing) { + var call = new PeerCall(this, id, from, to, outgoing); call.e.on("connectionStateChange", _.bind(function(event, iceConnectionState, currentcall) { this.onConnectionStateChange(iceConnectionState, currentcall); }, this)); @@ -577,7 +577,7 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u }; WebRTC.prototype.doCall = function(id, autocall) { - var call = this.createCall(id, null, id); + var call = this.createCall(id, null, id, true); call.setInitiate(true); var count = this.conference.getCallsCount(); if (!this.conference.addOutgoing(id, call)) { diff --git a/static/js/services/constraints.js b/static/js/services/constraints.js index 99dbc27d..80061204 100644 --- a/static/js/services/constraints.js +++ b/static/js/services/constraints.js @@ -212,4 +212,4 @@ }]; - }); \ No newline at end of file + }); diff --git a/static/js/services/roompin.js b/static/js/services/roompin.js index 4eaa237a..5bf760ac 100644 --- a/static/js/services/roompin.js +++ b/static/js/services/roompin.js @@ -21,11 +21,16 @@ "use strict"; define([ -], function() { + "moment" +], function(moment) { - return ["$window", "$q", "alertify", "translation", function($window, $q, alertify, translation) { + return ["$window", "$q", "globalContext", "alertify", "toastr", "translation", "safeMessage", "randomGen", "localStorage", function($window, $q, context, alertify, toastr, translation, safeMessage, randomGen, localStorage) { var pinCache = {}; + var getLocalStoragePINIDForRoom = function(roomName) { + return "room-pin-" + roomName; + }; + var lockedRoomsJoinable = !!context.Cfg.LockedRoomJoinableWithPIN; var roompin = { get: function(roomName) { var cachedPIN = pinCache[roomName]; @@ -33,30 +38,84 @@ define([ }, clear: function(roomName) { delete pinCache[roomName]; + localStorage.removeItem(getLocalStoragePINIDForRoom(roomName)); console.log("Cleared PIN for", roomName); }, - update: function(roomName, pin) { + update: function(roomName, pin, noAlert) { if (pin) { pinCache[roomName] = pin; - alertify.dialog.alert(translation._("PIN for room %s is now '%s'.", roomName, pin)); + localStorage.setItem(getLocalStoragePINIDForRoom(roomName), pin); + if (!noAlert && lockedRoomsJoinable) { + alertify.dialog.alert(translation._("PIN for room %s is now '%s'.", safeMessage(roomName), safeMessage(pin))); + } } else { roompin.clear(roomName); - alertify.dialog.alert(translation._("PIN lock has been removed from room %s.", roomName)); + if (!noAlert && lockedRoomsJoinable) { + toastr.info(moment().format("lll"), translation._("PIN lock has been removed from room '%s'", safeMessage(roomName))); + } } }, requestInteractively: function(roomName) { var deferred = $q.defer(); - alertify.dialog.prompt(translation._("Enter the PIN for room %s", roomName), function(pin) { + var tryJoinWithStoredPIN = function() { + var pin = localStorage.getItem(getLocalStoragePINIDForRoom(roomName)); if (pin) { - pinCache[roomName] = pin; + roompin.update(roomName, pin, true); deferred.resolve(); - } else { + return true; + } + return false; + }; + if (lockedRoomsJoinable) { + if (!tryJoinWithStoredPIN()) { + alertify.dialog.prompt(translation._("Enter the PIN for room %s", safeMessage(roomName)), function(pin) { + if (pin) { + roompin.update(roomName, pin); + deferred.resolve(); + } else { + deferred.reject(); + } + }, function() { + deferred.reject(); + }); + } + } else { + if (!tryJoinWithStoredPIN()) { + alertify.dialog.error( + translation._("Can't join locked room '%s'.", safeMessage(roomName)), + translation._("Room '%s' is locked. This server is configured to not let anyone join locked rooms.", safeMessage(roomName)) + ); deferred.reject(); } + } + return deferred.promise; + }, + // Passing in "rooms" is a bit of a hack to prevent circular dependencies + toggleCurrentRoomState: function(rooms) { + if (!rooms.isLocked()) { + // Lock + if (lockedRoomsJoinable) { + alertify.dialog.prompt(translation._("Please enter a new Room PIN to lock the room"), function(pin) { + rooms.setPIN(pin); + }, function() { + // Do nothing + }); + } else { + alertify.dialog.confirm(translation._("Do you want to lock the room?"), function() { + var pin = randomGen.random({hex: true}); + rooms.setPIN(pin); + }, function() { + // Do nothing + }); + } + return; + } + // Unlock + alertify.dialog.confirm(translation._("Do you want to unlock the room?"), function() { + rooms.setPIN(""); }, function() { - deferred.reject(); + // Do nothing }); - return deferred.promise; } }; diff --git a/static/js/services/rooms.js b/static/js/services/rooms.js index bf4f5ff7..faa99347 100644 --- a/static/js/services/rooms.js +++ b/static/js/services/rooms.js @@ -260,12 +260,13 @@ define([ console.log("Failed to set room PIN", error); return $q.reject(error); }); + }, + isLocked: function(room) { + room = room || currentRoom.Name + return roompin.get(room) !== null; } }; - // NOTE(lcooper): For debugging only, do not use this on production. - $window.setRoomPIN = rooms.setPIN; - return rooms; - }]; + }]; }); diff --git a/static/js/services/services.js b/static/js/services/services.js index a42445f9..b32f196a 100644 --- a/static/js/services/services.js +++ b/static/js/services/services.js @@ -71,7 +71,8 @@ define([ 'services/sandbox', 'services/dummystream', 'services/usermedia', - 'services/playpromise'], function(_, + 'services/playpromise', + 'services/turndata'], function(_, desktopNotify, playSound, safeApply, @@ -120,7 +121,8 @@ mediaDevices, sandbox, dummyStream, userMedia, -playPromise) { +playPromise, +turnData) { var services = { desktopNotify: desktopNotify, @@ -171,7 +173,8 @@ playPromise) { sandbox: sandbox, dummyStream: dummyStream, userMedia: userMedia, - playPromise: playPromise + playPromise: playPromise, + turnData: turnData }; var initialize = function(angModule) { diff --git a/static/js/services/turndata.js b/static/js/services/turndata.js new file mode 100644 index 00000000..c88378e8 --- /dev/null +++ b/static/js/services/turndata.js @@ -0,0 +1,213 @@ +/* + * Spreed WebRTC. + * Copyright (C) 2013-2016 struktur AG + * + * This file is part of Spreed WebRTC. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +"use strict"; +define(["jquery"], function($) { + var geoRequestTimeout = 30000; // Timeout for geo requests in milliseconds. + var geoFastRetryTimeout = 45000; // Refresh timer in milliseconds, after which GEO requests should be retried if failed before. + var refreshPercentile = 90; // Percent of the TTL when TURN credentials should be refreshed. + var refreshMinimumInterval = 30000; // Minimal TURN refresh interval in milliseconds. + + // turnData + return ["$timeout", "$http", "api", "randomGen", "appData", "translationLanguage", function($timeout, $http, api, randomGen, appData, translationLanguage) { + var ttlTimeout = null; + var geoRefresh = null; + var geoPreferred = null; + + var service = this; + service.e = $({}); + service.data = {}; + + service.apply = function() { + var turn = service.data; + var turnData = { + "username": turn.username, + "password": turn.password, + "ttl": turn.ttl + }; + if (turn && turn.servers) { + // Multiple options, need to sort and use settings. + var i; + if (!turn.serverMap) { + var servers = {}; + var serversSelectable = []; + // Sort for prio. + turn.servers.sort(function(a, b) { + servers[a.id] = a; + servers[b.id] = b; + return (a.prio > b.prio) ? 1 : ((a.prio < b.prio) ? -1 : 0); + }); + turn.first = turn.servers[0]; + // Create selectable servers. + var lang = translationLanguage.lang; + for (i=0; i 0) { + serversSelectable.unshift({ + "id": "auto", + "label": "auto" + }) + } + // Make created data available. + turn.serverMap = servers; + turn.serversSelectable = serversSelectable; + } + var urls; + if (turn.preferred) { + for (i=0; i= 10) { - cb(false, video, stream); - } else if (video.currentTime > 0 && video.videoHeight > 0) { - cb(true, video, stream); + this.found(false); + } else if (this.video.currentTime > 0 && this.video.videoHeight > 0) { + this.found(true); } else { if (videoTracks.length > 0 && this.count >= 10) { var videoTrack = videoTracks[0]; if (videoTrack.enabled === true && videoTrack.muted === true) { - cb(false, video, stream); + videoTrack.onunmute = function() { + videoTrack.onunmute = undefined; + _.defer(recheck); + }; + this.found(false); return; } } this.count++; if (this.count < this.retries) { - $window.setTimeout(_.bind(this.start, this, video, stream, cb, err_cb), 100); + $window.setTimeout(recheck, 100); } else { - if (err_cb) { - err_cb(video, stream); - } + this.error(); } } }; @@ -67,15 +89,16 @@ define(["underscore"], function(_) { // videoWaiter wait return { wait: function(video, stream, cb, err_cb) { - var waiter = new Waiter(); + var waiter = new Waiter(video, stream, cb, err_cb); _.defer(function() { - waiter.start(video, stream, cb, err_cb); + waiter.start(); }); - return waiter; + return { + stop: waiter.stop, + }; } } }] - }); diff --git a/static/partials/settings.html b/static/partials/settings.html index 7a485a9c..a7a06497 100644 --- a/static/partials/settings.html +++ b/static/partials/settings.html @@ -239,6 +239,13 @@ +
+ +
+ +
+
+
@@ -318,4 +325,4 @@
- \ No newline at end of file + diff --git a/static/partials/socialshare.html b/static/partials/socialshare.html index ad2ae588..59c8d25a 100644 --- a/static/partials/socialshare.html +++ b/static/partials/socialshare.html @@ -1,4 +1,5 @@
+ diff --git a/static/sounds/sprite1.json b/static/sounds/sprite1.json new file mode 100644 index 00000000..58cd9116 --- /dev/null +++ b/static/sounds/sprite1.json @@ -0,0 +1,34 @@ +{ + "connect1": [ + 0, + 5179 + ], + "end1": [ + 5228, + 6199 + ], + "entry1": [ + 11476, + 3000 + ], + "leaving1": [ + 14526, + 2126 + ], + "message1": [ + 16701, + 816 + ], + "question1": [ + 17567, + 3313 + ], + "ringtone1": [ + 20929, + 935 + ], + "whistle1": [ + 21913, + 1405 + ] +} diff --git a/static/sounds/sprite1.mp3 b/static/sounds/sprite1.mp3 index 45be868f..d965a27e 100644 Binary files a/static/sounds/sprite1.mp3 and b/static/sounds/sprite1.mp3 differ diff --git a/static/sounds/sprite1.ogg b/static/sounds/sprite1.ogg index 7ff04fd0..4a814feb 100644 Binary files a/static/sounds/sprite1.ogg and b/static/sounds/sprite1.ogg differ diff --git a/static/translation/languages.js b/static/translation/languages.js index 843518ef..94ca2c4e 100644 --- a/static/translation/languages.js +++ b/static/translation/languages.js @@ -1,5 +1,5 @@ // This file is auto generated, do not modify. "use strict"; define([], function() { -return {"ru": "\u0420\u0443\u0441\u0441\u043a\u0438\u0439", "en": "English", "zh-tw": "\u7e41\u9ad4\u4e2d\u6587", "de": "Deutsch", "ko": "\ud55c\uad6d\uc5b4", "zh-cn": "\u4e2d\u6587\uff08\u7b80\u4f53\uff09", "ja": "\u65e5\u672c\u8a9e"}; +return {"zh-cn": "\u4e2d\u6587\uff08\u7b80\u4f53\uff09", "fr": "Fran\u00e7ais", "en": "English", "ru": "\u0420\u0443\u0441\u0441\u043a\u0438\u0439", "zh-tw": "\u7e41\u9ad4\u4e2d\u6587", "de": "Deutsch", "ko": "\ud55c\uad6d\uc5b4", "ja": "\u65e5\u672c\u8a9e", "es": "Espa\u00f1ol", "it": "Italiano"}; }); diff --git a/static/translation/messages-de.json b/static/translation/messages-de.json index c79044c8..4230b8ff 100644 --- a/static/translation/messages-de.json +++ b/static/translation/messages-de.json @@ -1 +1 @@ -{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=2; plural=(n != 1)"},"Standard view":["Standardansicht"],"Large view":["Große Videos"],"Kiosk view":["Kiosk-Ansicht"],"Auditorium":["Auditorium"],"Start chat":["Chat starten"],"Start video call":["Video-Anruf starten"],"Start audio conference":["Audio-Konferenz starten"],"No one else here":["Niemand sonst hier"],"Take":["Los"],"Retake":["Nochmal"],"Cancel":["Abbrechen"],"Set as Profile Picture":["Als Bild setzen"],"Take picture":["Bild machen"],"Upload picture":["Bild hochladen"],"Waiting for camera":["Warte auf die Kamera"],"Picture":["Bild"],"The file couldn't be read.":["Die Datei konnte nicht geöffnet werden."],"The file is not an image.":["Diese Datei ist kein Bild."],"The file is too large. Max. %d MB.":["Diese Datei ist zu groß. Max. %d MB."],"Select file":["Datei wählen"],"Chat sessions":["Chat-Sitzungen"],"Room chat":["Raum-Chat"],"Peer to peer":["Peer-to-peer"],"Close chat":["Chat schließen"],"Upload files":["Dateien hochladen"],"Share my location":["Meinen Standort teilen"],"Clear chat":["Chat löschen"],"is typing...":[" schreibt gerade..."],"has stopped typing...":[" schreibt nicht mehr..."],"Type here to chat...":["Nachricht hier eingeben..."],"Send":["Senden"],"Accept":["Akzeptieren"],"Reject":["Abweisen"],"You have no contacts.":["Sie haben keine Kontakte."],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":["Betreten Sie einen Raum und klicken dann auf das Stern-Symbol eines anderen Nutzers um eine Kontaktanfrage zu starten."],"Edit contact":["Kontakt bearbeiten"],"Edit":["Bearbeiten"],"Name":["Name"],"Remove":["Entfernen"],"Refresh":["Aktualisieren"],"Save":["Speichern"],"Close":["Schließen"],"File sharing":["Datei-Austausch"],"File is no longer available":["Datei ist nicht mehr verfügbar"],"Download":["Laden"],"Open":["Öffnen"],"Unshare":["Zurückziehen"],"Retry":["Nochmal versuchen"],"Download failed.":["Fehler beim Download."],"Share a YouTube video":["Ein YouTube Video teilen"],"Share a file as presentation":["Datei als Präsentation teilen."],"Share your screen":["Bildschirm freigeben"],"Chat":["Chat"],"Contacts":["Kontakte"],"Mute microphone":["Mikrofon abschalten"],"Turn camera off":["Kamera abschalten"],"Settings":["Einstellungen"],"Loading presentation ...":["Präsentation wird geladen..."],"Please upload a document":["Bitte Dokument hochladen"],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":["Das Dokument wird mit allen Gesprächsteilnehmern geteilt. Unterstützt werden PDF und OpenDocument Dateien."],"Upload":["Hochladen"],"You can drag files here too.":["Sie können Dateien auch hierhin ziehen."],"Presentation controls":["Präsentations-Steuerung"],"Prev":["Zurück"],"Next":["Vor"],"Change room":["Raum wechseln"],"Room":["Raum"],"Leave room":["Raum verlassen"],"Main":["Standard"],"Current room":["Raum"],"Screen sharing options":["Optionen für Bildschirmfreigabe"],"Fit screen.":["Bildschirm einpassen."],"Share screen":["Bildschirm teilen"],"Please select what to share.":["Bitte wählen Sie aus, was geteilt werden soll."],"Screen":["Bildschirm"],"Window":["Fenster"],"Application":["Anwendung"],"Share the whole screen. Click share to select the screen.":["Gesamten Bildschirm teilen. Klicken Sie auf Teilen um den Bildschirm auszuwählen."],"Share a single window. Click share to select the window.":["Einzelnes Fenster teilen. Klicken Sie auf Teilen um das Fenster auszuwählen."],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":["Alle Fenster einer Anwendung teilen. Es wird u.U. Inhalt hinter Fenstern der Anwendung geteilt, wenn diese verschoben werden. Klicken Sie auf Teilen um die Anwendung auszuwählen."],"Share":["Teilen"],"OK":["OK"],"Profile":["Profil"],"Your name":["Ihr Name"],"Your picture":["Ihr Bild"],"Status message":["Status Nachricht"],"What's on your mind?":["Was machen Sie gerade?"],"Your picture, name and status message identify yourself in calls, chats and rooms.":["Ihr Bild, Name und Status Nachricht repräsentiert Sie in Anrufen, Chats und Räumen."],"Your ID":["Ihre ID"],"Register":["Registrieren"],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":["Mit Zertifikat angemeldet. Melden Sie sich ab indem Sie das Zertifikat aus dem Browser entfernen."],"Sign in":["Anmelden"],"Create an account":["Registrieren"],"Sign out":["Abmelden"],"Manage account":["Konto verwalten"],"Media":["Kamera / Mikrofon"],"Microphone":["Mikrofon"],"Camera":["Kamera"],"Video quality":["Video-Qualität"],"Low":["Gering"],"High":["Hoch"],"HD":["HD"],"Full HD":["Full HD"],"General":["Allgemein"],"Language":["Sprache"],"Language changes become active on reload.":["Sie müssen die Seite neu laden, um die Spracheinstellung zu übernehmen."],"Default room":["Standard Raum"],"Set alternative room to join at start.":[" Raum wird beim Start automatisch betreten."],"Notifications":["Benachrichtigungen"],"Desktop notification":["Desktop-Benachrichtigung"],"Enable":["Aktivieren"],"Denied - check your browser settings":["Verweigert - prüfen Sie die Browser-Einstellungen"],"Allowed":["Aktiviert"],"Sounds for incoming messages":["Töne bei eingehenden Nachrichten"],"Ring on incoming calls":["Klingeln bei eingehenden Anrufen"],"Sounds for users in current room":["Töne für Nutzer im aktuellen Raum"],"Advanced settings":["Erweiterte Einstellungen"],"Play audio on same device as selected microphone":["Audioausgabe auf dem zum Mikrofon gehörenden Gerät"],"Experimental AEC":["Experimentelle AEC"],"Experimental AGC":["Experimentelle AGC"],"Experimental noise suppression":["Experimentelle Geräuschunterdrückung"],"Max video frame rate":["Max. Bildwiederholrate"],"auto":["auto"],"Send stereo audio":["Audio in Stereo übertragen"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":["Um Stereo zu übertragen wird die Echo-Unterdrückung deaktiviert. Nur aktivieren wenn das Eingangssignal Stereo ist."],"Detect CPU over use":["CPU-Überlast erkennen"],"Automatically reduces video quality as needed.":["Reduziert die Videoqualität wenn nötig."],"Optimize for high resolution video":["Für hohe Auflösung optimieren"],"Reduce video noise":["Rauschen reduzieren"],"Prefer VP9 video codec":["VP9 Videocodec bevorzugen"],"Enable experiments":["Experimente aktivieren"],"Show advanced settings":["Erweiterte Einstellungen anzeigen"],"Hide advanced settings":["Erweiterte Einstellungen ausblenden"],"Remember settings":["Einstellungen merken"],"Your ID will still be kept - press the log out button above to delete the ID.":["Ihre ID bleibt dennoch gespeichert. Klicken Sie Ausloggen weiter oben um die ID zu löschen."],"Room link":["Raum-Link"],"Invite by Email":["Per E-Mail einladen"],"Invite with Facebook":["Mit Facebook einladen"],"Invite with Twitter":["Mit Twitter einladen"],"Invite with Google Plus":["Mit Google Plus einladen"],"Invite with XING":["Mit XING einladen"],"Initializing":["Initialisiere"],"Online":["Online"],"Calling":["Verbinde mit"],"Hangup":["Auflegen"],"In call with":["Verbunden mit"],"Conference with":["Konferenz mit"],"Your are offline":["Sie sind offline"],"Go online":["Online gehen"],"Connection interrupted":["Verbindung unterbrochen"],"An error occured":["Ein Fehler ist aufgetreten"],"Incoming call":["Eingehender Anruf"],"from":["von"],"Accept call":["Anruf annehmen"],"Waiting for camera/microphone access":["Warte auf Kamera/Mikrofon Freigabe"],"Your audio level":["Ihr Audio-Pegel"],"Checking camera and microphone access.":["Prüfe Zugriff auf Kamera und Mikrofon."],"Please allow access to your camera and microphone.":["Bitte gestatten Sie den Zugriff auf Ihre Kamera und Mikrofon."],"Camera / microphone access required.":["Kamera / Mikrofon Zugriff wird benötigt."],"Please check your browser settings and allow camera and microphone access for this site.":["Bitte prüfen Sie Ihre Browser-Einstellungen und gestatten Sie den Zugriff auf Kamera und Mikrofon für diese Seite."],"Skip check":["Überspringen"],"Click here for help (Google Chrome).":["Hier klicken für weitere Infos (Google Chrome)."],"Please set your user details and settings.":["Bitte vervollständigen Sie Ihre Daten und Einstellungen."],"Enter a room name":["Raum eingeben"],"Random room name":["Zufälliger Raum"],"Enter room":["Raum betreten"],"Enter the name of an existing room. You can create new rooms when you are signed in.":["Geben Sie den Namen eines existierenden Raums ein. Melden Sie sich an um eigene Räume zu erstellen."],"Room history":["Raum-Verlauf"],"Please sign in.":["Bitte melden Sie sich an."],"Videos play simultaneously for everyone in this call.":["Das Video wird bei allen Gesprächsteilnehmern angezeigt."],"YouTube URL":["YouTube URL"],"Could not load YouTube player API, please check your network / firewall settings.":["Es konnte keine Verbindung zu YouTube aufgebaut werden. Bitte prüfen Sie Ihre Internetverbindung / Firewall."],"Currently playing":["Aktuelles Video"],"YouTube controls":["YouTube Steuerung"],"YouTube video to share":["YouTube Video teilen"],"Peer to peer chat active.":["Peer-to-peer Chat ist aktiv."],"Peer to peer chat is now off.":["Peer-to-peer Chat ist nicht mehr aktiv."]," is now offline.":[" ist jetzt offline."]," is now online.":[" ist jetzt online."],"You share file:":["Sie geben eine Datei frei:"],"Incoming file:":["Eingehende Datei:"],"You shared your location:":["Sie haben Ihren Standort geteilt:"],"Location received:":["Standort erhalten:"],"You accepted the contact request.":["Sie haben die Kontaktanfrage angenommen."],"You rejected the contact request.":["Sie haben die Kontaktanfrage abgelehnt."],"You sent a contact request.":["Sie haben eine Kontaktanfrage gesendet."],"Your contact request was accepted.":["Ihre Kontaktanfrage wurde angenommen."],"Incoming contact request.":["Kontaktanfrage erhalten."],"Your contact request was rejected.":["Ihre Kontaktanfrage wurde abgelehnt."],"Edit Contact":["Kontakt bearbeiten"],"Your browser does not support WebRTC. No calls possible.":["Ihr Browser unterstützt kein WebRTC. Keine Anrufe möglich."],"Close this window and disconnect?":["Fenster schließen und die Verbindung trennen?"],"Contacts Manager":["Kontakte"],"Restart required to apply updates. Click ok to restart now.":["Es stehen Updates zur Verfügung. Klicken Sie Ok um die Anwendung neu zu starten."],"Failed to access camera/microphone.":["Fehler beim Zugriff auf die Kamera / das Mikrofon."],"Failed to establish peer connection.":["Fehler beim Verbindungsaufbau."],"We are sorry but something went wrong. Boo boo.":["Leider ist ein Fehler aufgetreten. Buhuhu."],"Oops":["Hoppla"],"Peer connection failed. Check your settings.":["Verbindung fehlgeschlagen. Überprüfen Sie Ihre Einstellungen."],"User hung up because of error.":["Teilnehmer hat aufgelegt, da ein Fehler aufgetreten ist."]," is busy. Try again later.":[" ist in einem Gespräch. Probieren Sie es später."]," rejected your call.":[" hat Ihren Anruf abgelehnt."]," does not pick up.":[" nimmt nicht ab."]," tried to call you":[" hat versucht Sie anzurufen"]," called you":[" hat Sie angerufen"],"Your browser is not supported. Please upgrade to a current version.":["Ihr Browser wird nicht unterstützt. Bitte aktualisieren Sie auf eine aktuelle Version."],"Chat with":["Chat mit"],"Message from ":["Nachricht von "],"You are now in room %s ...":["Sie sind nun im Raum %s ..."],"Your browser does not support file transfer.":["Mit Ihrem Browser können keine Dateien übertragen werden."],"Could not load PDF: Please make sure to select a PDF document.":["PDF konnte nicht geladen werden - Bitte stellen Sie sicher, dass Sie ein gültiges PDF-Dokument ausgewählt haben."],"Could not load PDF: Missing PDF file.":["Das PDF konnte nicht geladen werden: Datei fehlt."],"An error occurred while loading the PDF (%s).":["Beim Laden des PDF's ist ein Fehler aufgetreten (%s)."],"An unknown error occurred while loading the PDF.":["Beim Laden des PDF ist ein unbekannter Fehler aufgetreten."],"An error occurred while loading the PDF page (%s).":["Beim Laden der PDF-Seite ist ein Fehler aufgetreten (%s)."],"An unknown error occurred while loading the PDF page.":["Beim Laden der PDF-Seite ist ein unbekannter Fehler aufgetreten (%s)."],"An error occurred while rendering the PDF page (%s).":["Beim Anzeigen der PDF-Seite ist ein Fehler aufgetreten (%s)."],"An unknown error occurred while rendering the PDF page.":["Beim Anzeigen der PDF-Seite ist ein ubekannter Fehler aufgetreten."],"Only PDF documents and OpenDocument files can be shared at this time.":["Es können nur Dokumente im PDF oder OpenDocument-Format als Präsentation verwendet werden."],"Failed to start screen sharing (%s).":["Die Bildschirmfreigabe konnte nicht gestartet werden (%s)."],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["Die Berechtigung für die Bildschirmaufzeichnung wurde verweigert. Bitte stellen Sie sicher die Unterstützung für Bildschimaufzeichnung in Ihrem Browser aktiviert ist. Kopieren Sie dazu chrome://flags/#enable-usermedia-screen-capture und öffnen Sie diese Adresse in Ihrem Browser. Aktivieren Sie die oberste Einstellung und starten dann den Browser neu. Anschließend können Sie die Bildschirmfreigabe benutzen."],"Permission to start screen sharing was denied.":["Die Berechtigung den Bildschirm freizugeben wurde verweigert."],"Use browser language":["Browsereinstellung"],"Meet with me here:":["Meeting:"],"Room name":["Raum-Name"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":["Die Anfrage enthält falsche Parameter. Bitte prüfen Sie die URL des Videos."],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":["Dieser Inhalt kann nicht im HTML5-Player abgespielt werden oder ein anderer HTML5-Player-Fehler ist aufgetreten. Bitte versuchen Sie es später wieder."],"The video requested was not found. Please check the URL of the video you want to share and try again.":["Das Video wurde nicht gefunden. Bitte prüfen Sie die URL des Videos."],"The owner of the requested video does not allow it to be played in embedded players.":["Der Eigentümer des Videos hat das Video nicht für eingebettete Anzeige freigegeben."],"An unknown error occurred while playing back the video (%s). Please try again later.":["Beim Abspielen des Videos ist ein unbekannter Fehler aufgetreten (%s). Bitte versuchen Sie es später wieder."],"An unknown error occurred while playing back the video. Please try again later.":["Beim Abspielen des Videos ist ein unbekannter Fehler aufgetreten. Bitte versuchen Sie es später wieder."],"Unknown URL format. Please make sure to enter a valid YouTube URL.":["Unbekanntes URL-Format. Bitte geben Sie eine gültige YouTube URL ein."],"Error":["Fehler"],"Hint":["Hinweis"],"Please confirm":["Bitte bestätigen"],"More information required":["Weitere Informationen nötig"],"Ok":["OK"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":["Die Bildschrimfreigabe benötigt eine Browser-Erweiterung. Bitte fügen Sie die \"Spreed WebRTC screen sharing\" Erweiterung zu Chrome hinzu."],"Access code required":["Bitte Zugriffscode eingeben"],"Access denied":["Zugriff verweigert"],"Please provide a valid access code.":["Bitte geben Sie einen gültigen Zugriffscode ein."],"Failed to verify access code. Check your Internet connection and try again.":["Der Zugriffscode konnte nicht überprueft werden. Bitte prüfen Sie Ihre Internetverbindung."],"PIN for room %s is now '%s'.":["PIN für Raum %s ist jetzt '%s'."],"PIN lock has been removed from room %s.":["Raum %s ist nicht mehr PIN-geschützt."],"Enter the PIN for room %s":["Geben Sie die PIN für Raum %s ein"],"Please sign in to create rooms.":["Bitte melden Sie sich an um Räume zu erstellen."],"and %s":["und %s"],"and %d others":["und %d weiteren"],"User":["Teilnehmer"],"Someone":["Unbekannt"],"Me":["Ich"]}}} \ No newline at end of file +{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=2; plural=(n != 1)"},"Standard view":["Standardansicht"],"Large view":["Große Videos"],"Kiosk view":["Kiosk-Ansicht"],"Auditorium":["Auditorium"],"Start chat":["Chat starten"],"Start video call":["Video-Anruf starten"],"Start audio conference":["Audio-Konferenz starten"],"No one else here":["Niemand sonst hier"],"Take":["Los"],"Retake":["Nochmal"],"Cancel":["Abbrechen"],"Set as Profile Picture":["Als Bild setzen"],"Take picture":["Bild machen"],"Upload picture":["Bild hochladen"],"Waiting for camera":["Warte auf die Kamera"],"Picture":["Bild"],"The file couldn't be read.":["Die Datei konnte nicht geöffnet werden."],"The file is not an image.":["Diese Datei ist kein Bild."],"The file is too large. Max. %d MB.":["Diese Datei ist zu groß. Max. %d MB."],"Select file":["Datei wählen"],"Chat sessions":["Chat-Sitzungen"],"Room chat":["Raum-Chat"],"Peer to peer":["Peer-to-peer"],"Close chat":["Chat schließen"],"Upload files":["Dateien hochladen"],"Share my location":["Meinen Standort teilen"],"Clear chat":["Chat löschen"],"is typing...":["schreibt gerade..."],"has stopped typing...":["schreibt nicht mehr..."],"Type here to chat...":["Nachricht hier eingeben..."],"Send":["Senden"],"Accept":["Akzeptieren"],"Reject":["Abweisen"],"You have no contacts.":["Sie haben keine Kontakte."],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":["Betreten Sie einen Raum und klicken dann auf das Stern-Symbol eines anderen Nutzers um eine Kontaktanfrage zu starten."],"Edit contact":["Kontakt bearbeiten"],"Edit":["Bearbeiten"],"Name":["Name"],"Remove":["Entfernen"],"Refresh":["Aktualisieren"],"Save":["Speichern"],"Close":["Schließen"],"File sharing":["Datei-Austausch"],"File is no longer available":["Datei ist nicht mehr verfügbar"],"Download":["Laden"],"Open":["Öffnen"],"Unshare":["Zurückziehen"],"Retry":["Nochmal versuchen"],"Download failed.":["Fehler beim Download."],"Share a YouTube video":["Ein YouTube Video teilen"],"Share a file as presentation":["Datei als Präsentation teilen."],"Share your screen":["Bildschirm freigeben"],"Chat":["Chat"],"Contacts":["Kontakte"],"Mute microphone":["Mikrofon abschalten"],"Turn camera off":["Kamera abschalten"],"Settings":["Einstellungen"],"Loading presentation ...":["Präsentation wird geladen..."],"Please upload a document":["Bitte Dokument hochladen"],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":["Das Dokument wird mit allen Gesprächsteilnehmern geteilt. Unterstützt werden PDF und OpenDocument Dateien."],"Upload":["Hochladen"],"You can drag files here too.":["Sie können Dateien auch hierhin ziehen."],"Presentation controls":["Präsentations-Steuerung"],"Prev":["Zurück"],"Next":["Vor"],"Change room":["Raum wechseln"],"Room":["Raum"],"Leave room":["Raum verlassen"],"Main":["Standard"],"Current room":["Raum"],"Screen sharing options":["Optionen für Bildschirmfreigabe"],"Fit screen.":["Bildschirm einpassen."],"Share screen":["Bildschirm teilen"],"Please select what to share.":["Bitte wählen Sie aus, was geteilt werden soll."],"Screen":["Bildschirm"],"Window":["Fenster"],"Application":["Anwendung"],"Share the whole screen. Click share to select the screen.":["Gesamten Bildschirm teilen. Klicken Sie auf Teilen um den Bildschirm auszuwählen."],"Share a single window. Click share to select the window.":["Einzelnes Fenster teilen. Klicken Sie auf Teilen um das Fenster auszuwählen."],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":["Alle Fenster einer Anwendung teilen. Es wird u.U. Inhalt hinter Fenstern der Anwendung geteilt, wenn diese verschoben werden. Klicken Sie auf Teilen um die Anwendung auszuwählen."],"Share":["Teilen"],"OK":["OK"],"Profile":["Profil"],"Your name":["Ihr Name"],"Your picture":["Ihr Bild"],"Status message":["Status Nachricht"],"What's on your mind?":["Was machen Sie gerade?"],"Your picture, name and status message identify yourself in calls, chats and rooms.":["Ihr Bild, Name und Status Nachricht repräsentiert Sie in Anrufen, Chats und Räumen."],"Your ID":["Ihre ID"],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":["Mit Zertifikat angemeldet. Melden Sie sich ab indem Sie das Zertifikat aus dem Browser entfernen."],"Sign in":["Anmelden"],"Create an account":["Registrieren"],"Sign out":["Abmelden"],"Manage account":["Konto verwalten"],"Media":["Kamera / Mikrofon"],"Microphone":["Mikrofon"],"Camera":["Kamera"],"Video quality":["Video-Qualität"],"Low":["Gering"],"High":["Hoch"],"HD":["HD"],"Full HD":["Full HD"],"General":["Allgemein"],"Language":["Sprache"],"Language changes become active on reload.":["Sie müssen die Seite neu laden, um die Spracheinstellung zu übernehmen."],"Default room":["Standard Raum"],"Set alternative room to join at start.":["Raum wird beim Start automatisch betreten."],"Notifications":["Benachrichtigungen"],"Desktop notification":["Desktop-Benachrichtigung"],"Enable":["Aktivieren"],"Denied - check your browser settings":["Verweigert - prüfen Sie die Browser-Einstellungen"],"Allowed":["Aktiviert"],"Sounds for incoming messages":["Töne bei eingehenden Nachrichten"],"Ring on incoming calls":["Klingeln bei eingehenden Anrufen"],"Sounds for users in current room":["Töne für Nutzer im aktuellen Raum"],"Advanced settings":["Erweiterte Einstellungen"],"Play audio on same device as selected microphone":["Audioausgabe auf dem zum Mikrofon gehörenden Gerät"],"Experimental AEC":["Experimentelle AEC"],"Experimental AGC":["Experimentelle AGC"],"Experimental noise suppression":["Experimentelle Geräuschunterdrückung"],"Max video frame rate":["Max. Bildwiederholrate"],"auto":["auto"],"Send stereo audio":["Audio in Stereo übertragen"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":["Um Stereo zu übertragen wird die Echo-Unterdrückung deaktiviert. Nur aktivieren wenn das Eingangssignal Stereo ist."],"Detect CPU over use":["CPU-Überlast erkennen"],"Automatically reduces video quality as needed.":["Reduziert die Videoqualität wenn nötig."],"Optimize for high resolution video":["Für hohe Auflösung optimieren"],"Reduce video noise":["Rauschen reduzieren"],"Prefer VP9 video codec":["VP9 Videocodec bevorzugen"],"Enable experiments":["Experimente aktivieren"],"Show advanced settings":["Erweiterte Einstellungen anzeigen"],"Hide advanced settings":["Erweiterte Einstellungen ausblenden"],"Remember settings":["Einstellungen merken"],"Your ID will still be kept - press the log out button above to delete the ID.":["Ihre ID bleibt dennoch gespeichert. Klicken Sie Ausloggen weiter oben um die ID zu löschen."],"Room PIN":["Raum-PIN"],"Room link":["Raum-Link"],"Invite by Email":["Per E-Mail einladen"],"Invite with Facebook":["Mit Facebook einladen"],"Invite with Twitter":["Mit Twitter einladen"],"Invite with Google Plus":["Mit Google Plus einladen"],"Invite with XING":["Mit XING einladen"],"Initializing":["Initialisiere"],"Online":["Online"],"Calling":["Verbinde mit"],"Hangup":["Auflegen"],"In call with":["Verbunden mit"],"Conference with":["Konferenz mit"],"Your are offline":["Sie sind offline"],"Go online":["Online gehen"],"Connection interrupted":["Verbindung unterbrochen"],"An error occured":["Ein Fehler ist aufgetreten"],"Incoming call":["Eingehender Anruf"],"from":["von"],"Accept call":["Anruf annehmen"],"Waiting for camera/microphone access":["Warte auf Kamera/Mikrofon Freigabe"],"Your audio level":["Ihr Audio-Pegel"],"Checking camera and microphone access.":["Prüfe Zugriff auf Kamera und Mikrofon."],"Please allow access to your camera and microphone.":["Bitte gestatten Sie den Zugriff auf Ihre Kamera und Mikrofon."],"Camera / microphone access required.":["Kamera / Mikrofon Zugriff wird benötigt."],"Please check your browser settings and allow camera and microphone access for this site.":["Bitte prüfen Sie Ihre Browser-Einstellungen und gestatten Sie den Zugriff auf Kamera und Mikrofon für diese Seite."],"Skip check":["Überspringen"],"Click here for help (Google Chrome).":["Hier klicken für weitere Infos (Google Chrome)."],"Please set your user details and settings.":["Bitte vervollständigen Sie Ihre Daten und Einstellungen."],"Enter a room name":["Raum eingeben"],"Random room name":["Zufälliger Raum"],"Enter room":["Raum betreten"],"Enter the name of an existing room. You can create new rooms when you are signed in.":["Geben Sie den Namen eines existierenden Raums ein. Melden Sie sich an um eigene Räume zu erstellen."],"Room history":["Raum-Verlauf"],"Please sign in.":["Bitte melden Sie sich an."],"Videos play simultaneously for everyone in this call.":["Das Video wird bei allen Gesprächsteilnehmern angezeigt."],"YouTube URL":["YouTube URL"],"Could not load YouTube player API, please check your network / firewall settings.":["Es konnte keine Verbindung zu YouTube aufgebaut werden. Bitte prüfen Sie Ihre Internetverbindung / Firewall."],"Currently playing":["Aktuelles Video"],"YouTube controls":["YouTube Steuerung"],"YouTube video to share":["YouTube Video teilen"],"Peer to peer chat active.":["Peer-to-peer Chat ist aktiv."],"Peer to peer chat is now off.":["Peer-to-peer Chat ist nicht mehr aktiv."]," is now offline.":[" ist jetzt offline."]," is now online.":[" ist jetzt online."],"You share file:":["Sie geben eine Datei frei:"],"Incoming file:":["Eingehende Datei:"],"You shared your location:":["Sie haben Ihren Standort geteilt:"],"Location received:":["Standort erhalten:"],"You accepted the contact request.":["Sie haben die Kontaktanfrage angenommen."],"You rejected the contact request.":["Sie haben die Kontaktanfrage abgelehnt."],"You sent a contact request.":["Sie haben eine Kontaktanfrage gesendet."],"Your contact request was accepted.":["Ihre Kontaktanfrage wurde angenommen."],"Incoming contact request.":["Kontaktanfrage erhalten."],"Your contact request was rejected.":["Ihre Kontaktanfrage wurde abgelehnt."],"Edit Contact":["Kontakt bearbeiten"],"Your browser does not support WebRTC. No calls possible.":["Ihr Browser unterstützt kein WebRTC. Keine Anrufe möglich."],"Close this window and disconnect?":["Fenster schließen und die Verbindung trennen?"],"Contacts Manager":["Kontakte"],"Restart required to apply updates. Click ok to restart now.":["Es stehen Updates zur Verfügung. Klicken Sie Ok um die Anwendung neu zu starten."],"Failed to access camera/microphone.":["Fehler beim Zugriff auf die Kamera / das Mikrofon."],"Failed to establish peer connection.":["Fehler beim Verbindungsaufbau."],"We are sorry but something went wrong. Boo boo.":["Leider ist ein Fehler aufgetreten. Buhuhu."],"Oops":["Hoppla"],"Peer connection failed. Check your settings.":["Verbindung fehlgeschlagen. Überprüfen Sie Ihre Einstellungen."],"User hung up because of error.":["Teilnehmer hat aufgelegt, da ein Fehler aufgetreten ist."]," is busy. Try again later.":[" ist in einem Gespräch. Probieren Sie es später."]," rejected your call.":[" hat Ihren Anruf abgelehnt."]," does not pick up.":[" nimmt nicht ab."]," tried to call you":[" hat versucht Sie anzurufen"]," called you":[" hat Sie angerufen"],"Your browser is not supported. Please upgrade to a current version.":["Ihr Browser wird nicht unterstützt. Bitte aktualisieren Sie auf eine aktuelle Version."],"Chat with":["Chat mit"],"Message from ":["Nachricht von "],"You are now in room %s ...":["Sie sind nun im Raum %s ..."],"Your browser does not support file transfer.":["Mit Ihrem Browser können keine Dateien übertragen werden."],"Could not load PDF: Please make sure to select a PDF document.":["PDF konnte nicht geladen werden - Bitte stellen Sie sicher, dass Sie ein gültiges PDF-Dokument ausgewählt haben."],"Could not load PDF: Missing PDF file.":["Das PDF konnte nicht geladen werden: Datei fehlt."],"An error occurred while loading the PDF (%s).":["Beim Laden des PDF's ist ein Fehler aufgetreten (%s)."],"An unknown error occurred while loading the PDF.":["Beim Laden des PDF ist ein unbekannter Fehler aufgetreten."],"An error occurred while loading the PDF page (%s).":["Beim Laden der PDF-Seite ist ein Fehler aufgetreten (%s)."],"An unknown error occurred while loading the PDF page.":["Beim Laden der PDF-Seite ist ein unbekannter Fehler aufgetreten (%s)."],"An error occurred while rendering the PDF page (%s).":["Beim Anzeigen der PDF-Seite ist ein Fehler aufgetreten (%s)."],"An unknown error occurred while rendering the PDF page.":["Beim Anzeigen der PDF-Seite ist ein ubekannter Fehler aufgetreten."],"Only PDF documents and OpenDocument files can be shared at this time.":["Es können nur Dokumente im PDF oder OpenDocument-Format als Präsentation verwendet werden."],"Failed to start screen sharing (%s).":["Die Bildschirmfreigabe konnte nicht gestartet werden (%s)."],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["Die Berechtigung für die Bildschirmaufzeichnung wurde verweigert. Bitte stellen Sie sicher die Unterstützung für Bildschimaufzeichnung in Ihrem Browser aktiviert ist. Kopieren Sie dazu chrome://flags/#enable-usermedia-screen-capture und öffnen Sie diese Adresse in Ihrem Browser. Aktivieren Sie die oberste Einstellung und starten dann den Browser neu. Anschließend können Sie die Bildschirmfreigabe benutzen."],"Permission to start screen sharing was denied.":["Die Berechtigung den Bildschirm freizugeben wurde verweigert."],"Use browser language":["Browsereinstellung"],"Meet with me here:":["Meeting:"],"Please enter a new Room PIN to lock the room":["Bitte geben Sie eine neue Raum-PIN ein um diesen Raum abzuschliessen"],"Do you want to unlock the room?":["Möchten Sie diesen Raum aufschliessen?"],"Room name":["Raum-Name"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":["Die Anfrage enthält falsche Parameter. Bitte prüfen Sie die URL des Videos."],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":["Dieser Inhalt kann nicht im HTML5-Player abgespielt werden oder ein anderer HTML5-Player-Fehler ist aufgetreten. Bitte versuchen Sie es später wieder."],"The video requested was not found. Please check the URL of the video you want to share and try again.":["Das Video wurde nicht gefunden. Bitte prüfen Sie die URL des Videos."],"The owner of the requested video does not allow it to be played in embedded players.":["Der Eigentümer des Videos hat das Video nicht für eingebettete Anzeige freigegeben."],"An unknown error occurred while playing back the video (%s). Please try again later.":["Beim Abspielen des Videos ist ein unbekannter Fehler aufgetreten (%s). Bitte versuchen Sie es später wieder."],"An unknown error occurred while playing back the video. Please try again later.":["Beim Abspielen des Videos ist ein unbekannter Fehler aufgetreten. Bitte versuchen Sie es später wieder."],"Unknown URL format. Please make sure to enter a valid YouTube URL.":["Unbekanntes URL-Format. Bitte geben Sie eine gültige YouTube URL ein."],"Error":["Fehler"],"Hint":["Hinweis"],"Please confirm":["Bitte bestätigen"],"More information required":["Weitere Informationen nötig"],"Ok":["OK"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":["Die Bildschrimfreigabe benötigt eine Browser-Erweiterung. Bitte fügen Sie die \"Spreed WebRTC screen sharing\" Erweiterung zu Chrome hinzu."],"Access code required":["Bitte Zugriffscode eingeben"],"Access denied":["Zugriff verweigert"],"Please provide a valid access code.":["Bitte geben Sie einen gültigen Zugriffscode ein."],"Failed to verify access code. Check your Internet connection and try again.":["Der Zugriffscode konnte nicht überprueft werden. Bitte prüfen Sie Ihre Internetverbindung."],"PIN for room %s is now '%s'.":["PIN für Raum %s ist jetzt '%s'."],"PIN lock has been removed from room %s.":["Raum %s ist nicht mehr PIN-geschützt."],"Enter the PIN for room %s":["Geben Sie die PIN für Raum %s ein"],"Please sign in to create rooms.":["Bitte melden Sie sich an um Räume zu erstellen."],"and %s":["und %s"],"and %d others":["und %d weiteren"],"User":["Teilnehmer"],"Someone":["Unbekannt"],"Me":["Ich"]}}} \ No newline at end of file diff --git a/static/translation/messages-es.json b/static/translation/messages-es.json new file mode 100644 index 00000000..f6e129ae --- /dev/null +++ b/static/translation/messages-es.json @@ -0,0 +1 @@ +{"domain":"messages","locale_data":{"messages":{"Standard view":["Vista estándar"],"Large view":["Vista grande"],"Kiosk view":["Vista de Quiosco"],"Auditorium":["Auditorio"],"Start chat":["Iniciar chat"],"Start video call":["Iniciar videollamada"],"Start audio conference":["Iniciar conferencia de audio"],"No one else here":["No hay nadie aquí"],"Take":["Tomar"],"Retake":["Repetir"],"Cancel":["Cancelar"],"Set as Profile Picture":["Establecer como imagen de perfil"],"Take picture":["Tomar foto"],"Upload picture":["Subir imagen"],"Waiting for camera":["Esperando cámara"],"Picture":["Imagen"],"The file couldn't be read.":["El archivo no pudo ser leído."],"The file is not an image.":["El archivo no es una imagen."],"The file is too large. Max. %d MB.":["El archivo es demasiado grande. Max. %d MB."],"Select file":["Seleccionar archivo"],"Chat sessions":["Sesiones de chat"],"Room chat":["Sala de chat"],"Peer to peer":["Extremo a extremo"],"Close chat":["Cerrar chat"],"Upload files":["Subir archivos"],"Share my location":["Compartir mi ubicación"],"Clear chat":["Borrar chat"],"is typing...":["está escribiendo..."],"has stopped typing...":["ha dejado de escribir..."],"Type here to chat...":["Escriba aquí para charlar..."],"Send":["Enviar"],"Accept":["Aceptar"],"Reject":["Rechazar"],"You have no contacts.":["No dispone de contactos."],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":["Para agregar nuevos contactos, unirse a una sala y crear una solicitud de contacto al hacer click en el icono de la estrella junto al nombre del usuario."],"Edit contact":["Editar contacto"],"Edit":["Editar"],"Name":["Nombre"],"Remove":["Remover"],"Refresh":["Refrescar"],"Save":["Guardar"],"Close":["Cerrar"],"File sharing":["Compartir archivos"],"File is no longer available":["El archivo ya no está disponible"],"Download":["Descargar"],"Open":["Abierto"],"Unshare":["No compartir"],"Retry":["Reintentar"],"Download failed.":["Error de descarga."],"Share a YouTube video":["Compartir un vídeo de YouTube"],"Share a file as presentation":["Compartir un archivo como presentación"],"Share your screen":["Compartir la pantalla"],"Chat":["Chat"],"Contacts":["Contactos"],"Mute microphone":["Silenciar micrófono"],"Turn camera off":["Apagar cámara"],"Settings":["Ajustes"],"Loading presentation ...":["Cargando la presentación ..."],"Please upload a document":["Subir un documento"],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":["Los documentos son compartidos con todos los participantes en esta llamada. Los tipos de archivo admitidos son PDF y archivos OpenDocument."],"Upload":["Subir"],"You can drag files here too.":["Puede arrastrar archivos aquí también."],"Presentation controls":["Controles de presentación"],"Prev":["Ant"],"Next":["Sig"],"Change room":["Cambiar de sala"],"Room":["Sala"],"Leave room":["Abandonar sala"],"Main":["Principal"],"Current room":["Sala actual"],"Screen sharing options":["Opciones para compartir pantalla"],"Fit screen.":["Ajustar pantalla."],"Share screen":["Compartir pantalla"],"Please select what to share.":["Seleccione qué compartir."],"Screen":["Pantalla"],"Window":["Ventana"],"Application":["Aplicación"],"Share the whole screen. Click share to select the screen.":["Compartir toda la pantalla. Haga clic en Compartir para seleccionar la pantalla."],"Share a single window. Click share to select the window.":["Compartir una sola ventana. Haga clic en Compartir para seleccionar la ventana."],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":["Compartir todas las ventanas de una aplicación. Esto puede gotear el contenido detrás de Windows Cuando Windows se mueven. Haga clic en Compartir para seleccionar la aplicación."],"Share":["Compartir"],"OK":["OK"],"Profile":["Perfil"],"Your name":["Su nombre"],"Your picture":["Su imagen"],"Status message":["Mensaje de estado"],"What's on your mind?":["¿Qué está pensando?"],"Your picture, name and status message identify yourself in calls, chats and rooms.":["Su imagen, nombre y mensaje de estado te identificará en llamadas, chat y en las salas."],"Your ID":["Su ID"],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":["Autentificado por certificado. Para cerrar su sesión tendrá que quitar el certificado de su navegador."],"Sign in":["Iniciar sesión"],"Create an account":["Crear una cuenta"],"Sign out":["Cerrar sesión"],"Manage account":["Administrar cuenta"],"Media":["Medios"],"Microphone":["Micrófono"],"Camera":["Cámara"],"Video quality":["Calidad de vídeo"],"Low":["Baja"],"High":["Alta"],"HD":["HD"],"Full HD":["Full HD"],"General":["General"],"Language":["Idioma"],"Language changes become active on reload.":["Cambios de lenguaje se vuelven activos al recargar."],"Default room":["Sala predeterminada"],"Set alternative room to join at start.":["Establecer otra sala para unirse al inicio."],"Notifications":["Notificaciones"],"Desktop notification":["Notificación de escritorio"],"Enable":["Activar"],"Denied - check your browser settings":["Denegado - compruebe la configuración de su navegador"],"Allowed":["Permitido"],"Sounds for incoming messages":["Sonidos para los mensajes entrantes"],"Ring on incoming calls":["Sonar con llamadas entrantes"],"Sounds for users in current room":["Sonidos para usuarios en sala actual"],"Advanced settings":["Configuración avanzada"],"Play audio on same device as selected microphone":["Reproducir audio en el mismo dispositivo seleccionado como micrófono"],"Experimental AEC":["Cancelación de Eco Acústico Experimental"],"Experimental AGC":["Control de Ganancia Automática Experimental"],"Experimental noise suppression":["Supresión de ruido experimental"],"Max video frame rate":["Máx. velocidad de fotogramas de vídeo"],"auto":["auto"],"Send stereo audio":["Enviar audio estéreo"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":["Envío de audio estéreo desactiva la cancelación del eco. Activar sólo si tienes La entrada estéreo."],"Detect CPU over use":["detectar sobreuso de la CPU"],"Automatically reduces video quality as needed.":["Reduce automáticamente la calidad de vídeo cuando sea necesario."],"Optimize for high resolution video":["Optimizar para vídeo de alta resolución"],"Reduce video noise":["Reducir el ruido de vídeo"],"Prefer VP9 video codec":["Prefiere VP9 códec de vídeo"],"Enable experiments":["Permitir experimentos"],"Show advanced settings":["Mostrar opciones avanzadas"],"Hide advanced settings":["Ocultar opciones avanzadas"],"Remember settings":["Recordar la configuración"],"Your ID will still be kept - press the log out button above to delete the ID.":["Su ID será conservada - Pulse el botón Cerrar sesión anterior para eliminar el ID."],"Room link":["Link de Sala"],"Invite by Email":["Invitar por correo electrónico"],"Invite with Facebook":["Invitar con Facebook"],"Invite with Twitter":["Invitar con Twitter"],"Invite with Google Plus":["Invitar con Google Plus"],"Invite with XING":["Invitar con XING"],"Initializing":["Inicializando"],"Online":["En línea"],"Calling":["LLamando"],"Hangup":["Colgar"],"In call with":["En llamada con"],"Conference with":["Conferencia con"],"Your are offline":["está desconectado"],"Go online":["Ir Online"],"Connection interrupted":["Conexión interrumpida"],"An error occured":["Un error ha ocurrido"],"Incoming call":["Llamada entrante"],"from":["desde"],"Accept call":["Aceptar llamada"],"Waiting for camera/microphone access":["Esperando acceso cámara/micrófono"],"Your audio level":["Tu nivel de audio"],"Checking camera and microphone access.":["Control de acceso a la cámara y el micrófono."],"Please allow access to your camera and microphone.":["Por favor, permitir el acceso a la cámara y al micrófono."],"Camera / microphone access required.":["Cámara / micrófono requiere acceso."],"Please check your browser settings and allow camera and microphone access for this site.":["Compruebe la configuración de su navegador y permita el acceso a la cámara y el micrófono para este sitio."],"Skip check":["Saltar la comprobación"],"Click here for help (Google Chrome).":["Haga clic aquí para obtener ayuda (Google Chrome)."],"Please set your user details and settings.":["Configure su información de usuario y de configuración."],"Enter a room name":["Introduzca un nombre de sala"],"Random room name":["Nombre de la sala aleatorio"],"Enter room":["Ingresar a sala"],"Enter the name of an existing room. You can create new rooms when you are signed in.":["Introduzca el nombre de la sala existente. Puede crear nuevas salas cuando estás adentro de la aplicación."],"Room history":["Historial de Salas"],"Please sign in.":["Identifícate."],"Videos play simultaneously for everyone in this call.":["Reproducir videos simultáneamente para todos en esta llamada."],"YouTube URL":["URL de YouTube"],"Could not load YouTube player API, please check your network / firewall settings.":["No se pudo cargar API del reproductor de YouTube, compruebe la red / firewall Ajustes."],"Currently playing":["Actualmente reproduciendo"],"YouTube controls":["Controles en YouTube"],"YouTube video to share":["Compartir video YouTube"],"Peer to peer chat active.":["Chat P2P activo."],"Peer to peer chat is now off.":["Chat P2P está ahora desactivado."]," is now offline.":[" está ahora desconectado."]," is now online.":[" está ahora en línea."],"You share file:":["Compartir archivo:"],"Incoming file:":["Archivo entrante:"],"You shared your location:":["Ha compartido su ubicación:"],"Location received:":["Ubicación recibida:"],"You accepted the contact request.":["Ha aceptado la solicitud de contacto."],"You rejected the contact request.":["Ha rechazado la solicitud de contacto."],"You sent a contact request.":["Ha enviado una solicitud de contacto."],"Your contact request was accepted.":["Su solicitud de contacto fue aceptada."],"Incoming contact request.":["Solicitud de contacto entrante."],"Your contact request was rejected.":["Fue rechazada su solicitud de contacto."],"Edit Contact":["Editar contacto"],"Your browser does not support WebRTC. No calls possible.":["Su explorador no soporta WebRTC. No hay posibilidad de realizar llamadas."],"Close this window and disconnect?":["Cerrar esta ventana y desconectar?"],"Contacts Manager":["Administrador de contactos"],"Restart required to apply updates. Click ok to restart now.":["Es necesario reiniciar para aplicar las actualizaciones. Haga clic en Aceptar para reiniciar el sistema ahora."],"Failed to access camera/microphone.":["Error al acceder a la cámara/micrófono."],"Failed to establish peer connection.":["Error al establecer conexión P2P."],"We are sorry but something went wrong. Boo boo.":["Lo sentimos, pero algo salió mal. AHHHHHHH."],"Oops":["Ooops"],"Peer connection failed. Check your settings.":["Conexión P2P fallida. Compruebe su configuración."],"User hung up because of error.":["Usuario colgó debido a un error."]," is busy. Try again later.":[" está ocupado. Vuelva a intentarlo más tarde."]," rejected your call.":[" rechazó su llamada."]," does not pick up.":[" no contesta."]," tried to call you":[" intentó llamarte"]," called you":[" le llamó"],"Your browser is not supported. Please upgrade to a current version.":["Su navegador no es compatible. Actualice a una versión actual."],"Chat with":["Chatear con"],"Message from ":["Mensaje de "],"You are now in room %s ...":["Ahora estás en la sala %s ..."],"Your browser does not support file transfer.":["Tu navegador no soporta transferencia de archivos."],"Could not load PDF: Please make sure to select a PDF document.":["No se pudo cargar el PDF: asegúrese de seleccionar un documento PDF."],"Could not load PDF: Missing PDF file.":["No se pudo cargar el PDF: Falta el archivo PDF."],"An error occurred while loading the PDF (%s).":["Se ha producido un error al cargar el archivo PDF (%s)."],"An unknown error occurred while loading the PDF.":["Se ha producido un error desconocido al cargar el PDF."],"An error occurred while loading the PDF page (%s).":["Se ha producido un error al cargar la página PDF (%s)."],"An unknown error occurred while loading the PDF page.":["Se ha producido un error desconocido mientras se carga la página PDF."],"An error occurred while rendering the PDF page (%s).":["Se ha producido un error al procesar la página PDF (%s)."],"An unknown error occurred while rendering the PDF page.":["Se ha producido un error desconocido al procesar la página PDF."],"Only PDF documents and OpenDocument files can be shared at this time.":["Sólo documentos PDF y archivos OpenDocument puede ser compartido en este momento."],"Failed to start screen sharing (%s).":["No se pudo iniciar el uso compartido de la pantalla (%s)."],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["Permiso para comenzar a compartir la pantalla fue denegada. Asegúrese de haber activado compartir el acceso a la pantalla para su navegador. Copiar chrome://flags/#enable-usermedia-screen-capture y ábralo con su navegador y habilitar la bandera en la parte superior. A continuación, reinicie el navegador y listo."],"Permission to start screen sharing was denied.":["Permiso para comenzar a compartir la pantalla fue denegado."],"Use browser language":["Utilizar el idioma del navegador"],"Meet with me here:":["Reunirse conmigo aquí:"],"Please enter a new Room PIN to lock the room":[""],"Do you want to unlock the room?":[""],"Room name":["Nombre de sala"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":["La solicitud contiene un valor de parámetro no válido. Compruebe la dirección URL de el vídeo que desea compartir e inténtelo de nuevo."],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":["El contenido solicitado no se puede reproducir en un reproductor HTML5 u otro error relacionado con el reproductor HTML5 ha ocurrido. Por favor, inténtelo de nuevo más tarde."],"The video requested was not found. Please check the URL of the video you want to share and try again.":["El video solicitado no fue encontrado. Compruebe la URL del video que quieres compartir e inténtelo de nuevo."],"The owner of the requested video does not allow it to be played in embedded players.":["El propietario del vídeo solicitado no le permite ser reproducido en reproductores incrustados."],"An unknown error occurred while playing back the video (%s). Please try again later.":["Se ha producido un error desconocido mientras se reproduce el vídeo (%s). Por favor intente más tarde."],"An unknown error occurred while playing back the video. Please try again later.":["Se ha producido un error desconocido mientras se reproduce el vídeo. Por favor, inténtelo de nuevo más adelante."],"Unknown URL format. Please make sure to enter a valid YouTube URL.":["Formato URL desconocido. Por favor, asegúrese de escribir una dirección URL válida de YouTube."],"Error":["Error"],"Hint":["Sugerencia"],"Please confirm":["Confirme"],"More information required":["Se necesita más información"],"Ok":["Ok"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":["Se requiere una extensión del navegador para Compartir Pantalla. Por favor, añada la extensión Spreed WebRTC screen sharing a Chrome e inténtelo de nuevo."],"Access code required":["Código de acceso requerido"],"Access denied":["Acceso denegado"],"Please provide a valid access code.":["Proporcione un código de acceso válido."],"Failed to verify access code. Check your Internet connection and try again.":["No se ha podido verificar el código de acceso. Compruebe su conexión a Internet e intente una vez más."],"PIN for room %s is now '%s'.":["PIN de sala %s es ahora '%s'."],"PIN lock has been removed from room %s.":["bloqueo de PIN se ha eliminado desde la sala %s."],"Enter the PIN for room %s":["Introducir el PIN para sala %s"],"Please sign in to create rooms.":["Inicie sesión para crear nuevas salas."],"and %s":["y %s"],"and %d others":["y %d otros"],"User":["Usuario"],"Someone":["Alguien"],"Me":["Yo"],"":{"domain":"messages","plural_forms":"nplurals=2; plural=(n != 1)"}}}} \ No newline at end of file diff --git a/static/translation/messages-fr.json b/static/translation/messages-fr.json new file mode 100644 index 00000000..535fb3ac --- /dev/null +++ b/static/translation/messages-fr.json @@ -0,0 +1 @@ +{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=2; plural=(n != 1)"},"Standard view":["Mode standard"],"Large view":["Mode large"],"Kiosk view":["Mode kiosque"],"Auditorium":["Mode auditorium"],"Start chat":["Démarrer le chat"],"Start video call":["Appel vidéo"],"Start audio conference":["Appel audio"],"No one else here":["Personne n'est connecté"],"Take":["Répondre"],"Retake":["Refaire"],"Cancel":["Annuler"],"Set as Profile Picture":["Définir comme avatar"],"Take picture":["Prendre une photo"],"Upload picture":["Envoyer une photo"],"Waiting for camera":["En attente de la camera"],"Picture":["Avatar"],"The file couldn't be read.":["Le fichier ne peux pas être lu."],"The file is not an image.":["Le fichier n'est pas une image."],"The file is too large. Max. %d MB.":["Le ficheir est trop gros. Max. %d MB."],"Select file":["Choisir un fichier"],"Chat sessions":["Session de chat"],"Room chat":["Chat de cette salle"],"Peer to peer":["Peer-to-peer"],"Close chat":["Fermer le chat"],"Upload files":["Envoyer les fichiers"],"Share my location":["Partager mon emplacement"],"Clear chat":["Effacer le chat"],"is typing...":["est en train de taper..."],"has stopped typing...":["a fini de taper..."],"Type here to chat...":["Taper ici pour chatter..."],"Send":["Envoyer"],"Accept":["Accepter"],"Reject":["Refuser"],"You have no contacts.":["Vous n'avez pas de contact."],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":["Pour ajouter des contacts, rejoignez une salle et faites une requête d'ajout de contact en cliquant sur l'étoile à côté de la fiche d'un utilisateur."],"Edit contact":["Modifier le contact"],"Edit":["Modifier"],"Name":["Nom"],"Remove":["Enlever"],"Refresh":["Actualiser"],"Save":["Enregistrer"],"Close":["Fermer"],"File sharing":["Partage de fichier"],"File is no longer available":["Ce fichier n'est plus disponible"],"Download":["Télécharger"],"Open":["Ouvrir"],"Unshare":["Ne plus partager"],"Retry":["Réessayer"],"Download failed.":["Echec du téléchargement."],"Share a YouTube video":["Partager une vidéo Youtube"],"Share a file as presentation":["Partager une présentation"],"Share your screen":["Partager votre écran"],"Chat":["Chat"],"Contacts":["Contact"],"Mute microphone":["Couper le micro"],"Turn camera off":["Couper la caméra"],"Settings":["Paramètres"],"Loading presentation ...":["Chargement de la présentation..."],"Please upload a document":["Merci d'envoyer un document"],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":["Les documents sont partagés avec tous les participants à cet appel. Les documents PDF et opendocument sont supportés."],"Upload":["Sélectionner un fichier"],"You can drag files here too.":["Vous pouvez aussi déposer les fichiers ici."],"Presentation controls":["Controles de présentation"],"Prev":["Préc."],"Next":["Suiv."],"Change room":["Changer de salle"],"Room":["Salle"],"Leave room":["Quitter la salle"],"Main":["Principale"],"Current room":["Salle actuelle"],"Screen sharing options":["Options de partage d'écran"],"Fit screen.":["Adapter à l'écran."],"Share screen":["Partager mon écran"],"Please select what to share.":["Merci de choisir l'écran à partager."],"Screen":["Moniteur"],"Window":["Fenêtre"],"Application":["Application"],"Share the whole screen. Click share to select the screen.":["Partager tout le moniteur. Cliquez pour choisir le moniteur."],"Share a single window. Click share to select the window.":["Partager une seule fenêtre. Cliquez pour choisir la fenêtre."],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":["Partager toutes les fenêtres d'une application. Ceci peux amener à montrer du contenu situé derrière une fenêtre lorsqu'elle est déplacée. Cliquez pour sélectionner l'application."],"Share":["Partager"],"OK":["OK"],"Profile":["Profil"],"Your name":["Votre nom"],"Your picture":["Votre avatar"],"Status message":["Message de statut"],"What's on your mind?":["Quel est votre état d'esprit?"],"Your picture, name and status message identify yourself in calls, chats and rooms.":["Votre avatar, nom et état d'esprit servent à vous identifier dans les appels, chat et salle."],"Your ID":["Votre ID"],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":["Authentifié par certificat. Vous devrez effacer le certificat de votre navigateur pour vous déconnecter."],"Sign in":["Connnexion"],"Create an account":["Créer un compte"],"Sign out":["Deconnexion"],"Manage account":["Gestion du compte"],"Media":["Webcam / Micro"],"Microphone":["Micro"],"Camera":["Webcam"],"Video quality":["Qualité vidéo"],"Low":["Basse"],"High":["Haute"],"HD":["HD"],"Full HD":["Full HD"],"General":["Général"],"Language":["Langue"],"Language changes become active on reload.":["Rechargez la page pour prendre en compte le changement de langue."],"Default room":["Salle par défaut"],"Set alternative room to join at start.":["Nom de la salle à rejoindre à la connexion."],"Notifications":["Notifications"],"Desktop notification":["Notifications sur le bureau"],"Enable":["Activer"],"Denied - check your browser settings":["Interdit - vérifier les paramètres de votre navigateur"],"Allowed":["Autorisé"],"Sounds for incoming messages":["Son pour les messages entrant"],"Ring on incoming calls":["Sonnerie pour les appels entrant"],"Sounds for users in current room":["Son pour les participants de la salle courante"],"Advanced settings":["Réglages avancés"],"Play audio on same device as selected microphone":["Ecouter l'audio sur le même materiel que le micro"],"Experimental AEC":["AEC (experimental)"],"Experimental AGC":["AGC (experimental)"],"Experimental noise suppression":["Suppresion de bruit (experimental)"],"Max video frame rate":["Image par seconde max"],"auto":["auto"],"Send stereo audio":["Envoyer de l'audio stéréo"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":["Envoyer de l'audio en stéréo désactive la suppression de l'écho. Utilisez le uniquement si vous avez un micro stéréo."],"Detect CPU over use":["Détecter un usage processeur excessif"],"Automatically reduces video quality as needed.":["Réduire automatiquement la qualité vidéo si besoin."],"Optimize for high resolution video":["Optimiser la vidéo pour la haute résolution"],"Reduce video noise":["Réduire le bruit vidéo"],"Prefer VP9 video codec":["Utiliser le codec VP9 en priorité"],"Enable experiments":["Activer les réglages experimentaux"],"Show advanced settings":["Montrer les réglages avancés"],"Hide advanced settings":["Masquer les réglage avancés"],"Remember settings":["Se souvenir des réglages"],"Your ID will still be kept - press the log out button above to delete the ID.":["Votre ID sera conservé - appuyer sur le bouton de déconnection pour l'effacer."],"Room link":["Lien vers la salle"],"Invite by Email":["Inviter par email"],"Invite with Facebook":["Inviter par Facebook"],"Invite with Twitter":["Inviter par Twitter"],"Invite with Google Plus":["Inviter par Google Plus"],"Invite with XING":["Inviter par XING"],"Initializing":["En cours d'initialisation"],"Online":["En ligne"],"Calling":["Appel en cours"],"Hangup":["Raccrocher"],"In call with":["En communication avec"],"Conference with":["En conférence avec"],"Your are offline":["Vous êtes hors ligne"],"Go online":["Passer en ligne"],"Connection interrupted":["Connection interrompue"],"An error occured":["Une erreur est survenue"],"Incoming call":["Appel entrant"],"from":["de"],"Accept call":["Accepter l'appel"],"Waiting for camera/microphone access":["En attente de l'accès à la webcam et au micro"],"Your audio level":["Niveau de votre audio"],"Checking camera and microphone access.":["Vérification de l'accès à la webcam et au micro."],"Please allow access to your camera and microphone.":["Merci d'autoriser l'accès à la webcam et au micro."],"Camera / microphone access required.":["Accès requis à la webcam et au micro."],"Please check your browser settings and allow camera and microphone access for this site.":["Merci de verifier les reglages de votre navigateur et pour autoriser l'accès à votre micro et a votre webcam pour ce site."],"Skip check":["Passer la vérification"],"Click here for help (Google Chrome).":["Cliquez ici pour l'aide (Google Chrome)."],"Please set your user details and settings.":["Merci de mettre à jours votre profil et vos paramètres."],"Enter a room name":["Entrer un nom de salle"],"Random room name":["Nom aléatoire"],"Enter room":["Rejoindre la salle"],"Enter the name of an existing room. You can create new rooms when you are signed in.":["Entrez le nom d'une salle existante. Vous pouvez créer de nouvelles salles lorsque vous êtes connecté."],"Room history":["Historique de la salle"],"Please sign in.":["Merci de vous connecter."],"Videos play simultaneously for everyone in this call.":["Les vidéos sont lues de manière synchronisée entre tous les participants."],"YouTube URL":["URL YouTube"],"Could not load YouTube player API, please check your network / firewall settings.":["Impossible de charger le lecteur de video Youtube. Merci de vérifier vos paramètres de réseau et pare-feu."],"Currently playing":["Lecture en cours"],"YouTube controls":["Contrôles youtube"],"YouTube video to share":["Vidéo YouTube à partager"],"Peer to peer chat active.":["Chat privé actif."],"Peer to peer chat is now off.":["Chat privé désactivé."]," is now offline.":[" est passé hors ligne."]," is now online.":[" est passé en ligne."],"You share file:":["Vous partagez le fichier:"],"Incoming file:":["Fichier entrant:"],"You shared your location:":["Vous partagez votre emplacement:"],"Location received:":["Emplacement reçu:"],"You accepted the contact request.":["Vous avez accepté la demande de mise en relation."],"You rejected the contact request.":["Vous avez refusé la demande de mise en relation."],"You sent a contact request.":["Vous avez envoyé une demande de mise en relation."],"Your contact request was accepted.":["Votre requête de mise en relation a été acceptée."],"Incoming contact request.":["Arrivée d'une demande de mise en relation."],"Your contact request was rejected.":["Votre requête de mise en relation a été refusée."],"Edit Contact":["Modifier le contact"],"Your browser does not support WebRTC. No calls possible.":["Votre navigateur ne supporte pas WebRTC. Appels impossible."],"Close this window and disconnect?":["Voulez fermer cette fenêtre et vous déconnecter?"],"Contacts Manager":["Gestionnaire de contacts"],"Restart required to apply updates. Click ok to restart now.":["Un redémarrage est requis pour appliquer les mises à jour. Cliquez sur OK pour redémarrer."],"Failed to access camera/microphone.":["Impossible d'accéder à la webcam et au micro."],"Failed to establish peer connection.":["Impossible d'établir la connexion de pair a pair."],"We are sorry but something went wrong. Boo boo.":["Nous sommes désolé, mais quelque chose à planté. Ouin."],"Oops":["Oups"],"Peer connection failed. Check your settings.":["La connection avec le pair à échoué. Vérifiez vos réglages."],"User hung up because of error.":["Le participant à raccroché suite à une erreur."]," is busy. Try again later.":[" est occupé. Réessayez plus tard."]," rejected your call.":[" à refuser votre appel."]," does not pick up.":[" n'a pas répondu."]," tried to call you":[" a essayé de vous appeler."]," called you":[" vous a appelé"],"Your browser is not supported. Please upgrade to a current version.":["Votre navigateur n'est pas supporté. Merci de le mettre à jout vers une version plus récente."],"Chat with":["Chat avec"],"Message from ":["Message de "],"You are now in room %s ...":["Vous avez rejoint la salle %s ..."],"Your browser does not support file transfer.":["Votre navigateur ne supporte pas les transferts de fichier."],"Could not load PDF: Please make sure to select a PDF document.":["Impossible de charger le PDF: merci de vérifier que vous avez sélectionné un PDF."],"Could not load PDF: Missing PDF file.":["Impossible de charger le PDF: le fichier PDF est manquant."],"An error occurred while loading the PDF (%s).":["Une erreur est survenue lors du chargement du PDF (%s)."],"An unknown error occurred while loading the PDF.":["Une erreur inconnue est survenue lors du chargement du PDF."],"An error occurred while loading the PDF page (%s).":["Une erreur est survenue lors du chargement du PDF (%s)."],"An unknown error occurred while loading the PDF page.":["Une erreur inconnue est survenue lors du chargement du PDF (%s)."],"An error occurred while rendering the PDF page (%s).":["Une erreur est survenue lors du rendu du PDF (%s)."],"An unknown error occurred while rendering the PDF page.":["Une erreur inconnue est survenue lors du rendu du PDF."],"Only PDF documents and OpenDocument files can be shared at this time.":["Pour l'instant, seuls les documents au format PDF et open documents peuvent être partagés."],"Failed to start screen sharing (%s).":["Impossible de démarrer le partage d'écran (%s)."],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["La permission de démarrer le partage d'écran a été refusée. Soyez sûr que vous avez activez le partage pour votre navigateur. Copiez chrome://flags/#enable-usermedia-screen-capture dans votre barre d'adresse et activez le, puis redémarrez votre navigateur."],"Permission to start screen sharing was denied.":["La permission de partager l'écran a été refusé."],"Use browser language":["Utiliser la langue du navigateur"],"Meet with me here:":["Rejoins moi là:"],"Please enter a new Room PIN to lock the room":[""],"Do you want to unlock the room?":[""],"Room name":["Nom de la salle"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":["La requête contient des paramètres invalides. Merci de vérifier l'URL de la vidéo que vous voulez partager."],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":["Le contenu requis ne peux pas être pas lu par le lecteur HTML5, ou une autre erreur en relation avec le lecteur HTML5 est survenu. Merci de réessayer plus tard."],"The video requested was not found. Please check the URL of the video you want to share and try again.":["Cette vidéo n'a pas été trouvée. Merci de vérifier l'URL de la vidéo que vous souhaitez partager et réessayez."],"The owner of the requested video does not allow it to be played in embedded players.":["Le propriétaire de la vidéo ne vous permet pas de la lire dans un lecteur vidéo embarqué."],"An unknown error occurred while playing back the video (%s). Please try again later.":["Une erreur inconnue est survenue lors de la lecture de la vidéo (%s). Merci de réessayer plus tard."],"An unknown error occurred while playing back the video. Please try again later.":["Une erreur inconnue est survenue lors de la lecture de la vidéo. Merci de réessayer plus tard."],"Unknown URL format. Please make sure to enter a valid YouTube URL.":["Format d'URL inconnu. Merci de vérifier qu'il s'agit d'une URL Youtube valide."],"Error":["Erreur"],"Hint":["Information"],"Please confirm":["Merci de confirmer"],"More information required":["Il faut plus d'information"],"Ok":["OK"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":["Le partage d'écran nécessite une extension pour le navigateur. Merci d'ajouter l'extension \"Spreed WebRTC screen sharing\"."],"Access code required":["Code d'accès requis"],"Access denied":["Accès refusé"],"Please provide a valid access code.":["Merci de donner un code d'accès valide."],"Failed to verify access code. Check your Internet connection and try again.":["Impossible de vérifier votre code d'accès. Vérifiez votre connection et réssayez."],"PIN for room %s is now '%s'.":["Le code PIN pour la salle %s est maintenant '%s'."],"PIN lock has been removed from room %s.":["La salle %s n'est plus proteger par un code PIN."],"Enter the PIN for room %s":["Entrez le code PIN pour la salle %s"],"Please sign in to create rooms.":["Merci de vous connecter pour créer des salles."],"and %s":["et %s"],"and %d others":["et %d autres"],"User":["Participa,t"],"Someone":["Quelqu'un"],"Me":["Moi"]}}} \ No newline at end of file diff --git a/static/translation/messages-it.json b/static/translation/messages-it.json new file mode 100644 index 00000000..9a58a6f6 --- /dev/null +++ b/static/translation/messages-it.json @@ -0,0 +1 @@ +{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=2; plural=(n != 1)"},"Standard view":["Visualizzazione standard"],"Large view":["Visualizzazione estesa"],"Kiosk view":["Visualizzazione chiosco"],"Auditorium":["Auditorium"],"Start chat":["Inizia chat"],"Start video call":["Inizia chiamata video"],"Start audio conference":["Inizia chiamata audio"],"No one else here":["Nessun altro qui"],"Take":["Scatta"],"Retake":["Riscatta"],"Cancel":["Annulla"],"Set as Profile Picture":["Imposta come immagine profilo"],"Take picture":["Scatta immagine"],"Upload picture":["Carica immagine"],"Waiting for camera":["In attesa della fotocamera"],"Picture":["Immagine"],"The file couldn't be read.":["Il file non può essere aperto."],"The file is not an image.":["Il file non è un immagine."],"The file is too large. Max. %d MB.":["Questo file è di dimensioni eccessive. Max. %d MB."],"Select file":["Seleziona file"],"Chat sessions":["Sessioni di chat"],"Room chat":["Room chat"],"Peer to peer":["Peer-to-peer"],"Close chat":["Chiudi la chat"],"Upload files":["Carica file"],"Share my location":["Condividi la mia posizione"],"Clear chat":["Pulisci chat"],"is typing...":["sta scrivendo..."],"has stopped typing...":["ha smesso di scrivere..."],"Type here to chat...":["Scrivi qui per chattare..."],"Send":["Invia"],"Accept":["Accetta"],"Reject":["Rifiuta"],"You have no contacts.":["Non hai contatti."],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":["Per aggiungere nuovi contatti unisciti a una room e crea una richiesta di aggiunta contatto cliccando sull'icona a forma di stella vicina a un utente."],"Edit contact":["Modifica contatto"],"Edit":["Modifica"],"Name":["Nome"],"Remove":["Rimuovi"],"Refresh":["Aggiorna"],"Save":["Salva"],"Close":["Chiudi"],"File sharing":["Condividi file"],"File is no longer available":["Il file non è più disponibile"],"Download":["Scarica"],"Open":["Apri"],"Unshare":["Rimuovi condivisione"],"Retry":["Riprova"],"Download failed.":["Scaricamento fallito."],"Share a YouTube video":["Condividi un video YouTube"],"Share a file as presentation":["Condividi un file come presentazione"],"Share your screen":["Condividi il tuo schermo"],"Chat":["Chat"],"Contacts":["Contatti"],"Mute microphone":["Silenzia il microfono"],"Turn camera off":["Spegni la videocamera"],"Settings":["Impostazioni"],"Loading presentation ...":["Caricando la presentazione..."],"Please upload a document":["Carica un documento"],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":["I documenti sono condivisi con tutti i partecipanti a questa chiamata. I tipi di file supportati sono PDF e OpenDocument."],"Upload":["Carica"],"You can drag files here too.":["Puoi trascinare i file qui."],"Presentation controls":["Controlli presentazione"],"Prev":["Precedente"],"Next":["Prossimo"],"Change room":["Scegli la stanza"],"Room":["Stanza"],"Leave room":["Lascia la stanza"],"Main":["Principale"],"Current room":["Stanza corrente"],"Screen sharing options":["Opzioni condivisione schermo"],"Fit screen.":["Adatta allo schermo."],"Share screen":["Condividi schermo"],"Please select what to share.":["Scegli cosa condividere."],"Screen":["Schermo"],"Window":["Finestra"],"Application":["Applicazione"],"Share the whole screen. Click share to select the screen.":["Condividi l'intero schermo. Fai click su condividi per selezionare lo schermo."],"Share a single window. Click share to select the window.":["Condividi una singola finestra. Fai click su condividi per selezionare la singola finestra."],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":["Condividi tutte le finestre di un'applicazione. Questa opzione può mostrare il contenuto dietro alle finestre quando queste vengono spostate. Fai click su condividi per selezionare l'applicazione."],"Share":["Condividi"],"OK":["OK"],"Profile":["Profilo"],"Your name":["Il tuo nome"],"Your picture":["La tua immagine"],"Status message":["Stato"],"What's on your mind?":["A cosa pensi?"],"Your picture, name and status message identify yourself in calls, chats and rooms.":["La tua immagine, il tuo nome ed il tuo stato vengono visualizzati nelle chiamate, nelle chat e nelle stanze."],"Your ID":["Il tuo ID"],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":["Autenticazione eseguita con certificato. Per disconnettersi rimuovere il certificato dal browser."],"Sign in":["Accedi"],"Create an account":["Crea un account"],"Sign out":["Disconnettiti"],"Manage account":["Gestisci account"],"Media":["Dispositivi"],"Microphone":["Microfono"],"Camera":["Videocamera"],"Video quality":["Qualità video"],"Low":["Bassa"],"High":["Alta"],"HD":["HD"],"Full HD":["Full HD"],"General":["Generale"],"Language":["Lingua"],"Language changes become active on reload.":["Le modifiche alla lingua diventano effettive con l'aggiornamento della pagina."],"Default room":["Stanza predefinita"],"Set alternative room to join at start.":["Imposta l'ingresso in una stanza alternativa all'avvio."],"Notifications":["Notifiche"],"Desktop notification":["Notifiche Desktop"],"Enable":["Abilita"],"Denied - check your browser settings":["Errore - controlla le impostazioni del tuo browser"],"Allowed":["Permesso"],"Sounds for incoming messages":["Suoni per i messaggi in arrivo"],"Ring on incoming calls":["Suoneria per le chiamate in arrivo"],"Sounds for users in current room":["Suoni per gli utenti nella stanza corrente"],"Advanced settings":["Opzioni avanzate"],"Play audio on same device as selected microphone":["Riproduci l'audio sullo stesso dispositivo del microfono selezionato"],"Experimental AEC":["AEC Sperimentale"],"Experimental AGC":["AGC Sperimentale"],"Experimental noise suppression":["Soppressione del rumore sperimentale"],"Max video frame rate":["Massimo framerate video"],"auto":["automatico"],"Send stereo audio":["Invia audio in stereo"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":["Inviare l'audio in stereo disabilita la cancellazione dell eco. Abilitare solo se si dispone di un input stereo."],"Detect CPU over use":["Rileva utilizzo eccessivo della CPU"],"Automatically reduces video quality as needed.":["Riduce automaticamente la qualità video se necessario."],"Optimize for high resolution video":["Ottimizza per i video ad alta risoluzione"],"Reduce video noise":["Riduce il rumore digitale nei video"],"Prefer VP9 video codec":["Prediligi il codec VP9"],"Enable experiments":["Abilita gli esperimenti"],"Show advanced settings":["Mostra opzioni avanzate"],"Hide advanced settings":["Nascondi opzioni avanzate"],"Remember settings":["Ricorda le impostazioni"],"Your ID will still be kept - press the log out button above to delete the ID.":["Il tuo ID sarà mantenuto - Premi il pulsante disconnetti per cancellare l'ID."],"Room PIN":["PIN della stanza"],"Room link":["Link stanza"],"Invite by Email":["Invita via Email"],"Invite with Facebook":["Invita via Facebook"],"Invite with Twitter":["Invita via Twitter"],"Invite with Google Plus":["Invita via Google Plus"],"Invite with XING":["Invita via XING"],"Initializing":["Inizializzazione"],"Online":["Online"],"Calling":["Sto chiamando"],"Hangup":["Fine chiamata"],"In call with":["In chiamata con"],"Conference with":["In conferenza con"],"Your are offline":["Sei offline"],"Go online":["Connettiti"],"Connection interrupted":["Connessione Interrotta"],"An error occured":["Errore"],"Incoming call":["Chiamata in arrivo"],"from":["da"],"Accept call":["Rispondi"],"Waiting for camera/microphone access":["Attesa accesso videocamera/microfono"],"Your audio level":["Volume"],"Checking camera and microphone access.":["Controllo accesso videocamera e microfono."],"Please allow access to your camera and microphone.":["Consenti l'accesso alla videocamera ed al microfono."],"Camera / microphone access required.":["E' richesto l'accesso alla videocamera/microfono."],"Please check your browser settings and allow camera and microphone access for this site.":["Per favore verifica le impostazioni del tuo browser e permetti l'accesso alla videocamera ed al microfono per questo sito."],"Skip check":["Salta controllo"],"Click here for help (Google Chrome).":["Clicca qui per aiuto (Google Chrome)."],"Please set your user details and settings.":["Inserisci i tuoi dati utente e le impostazioni."],"Enter a room name":["Inserisci il nome di una stanza"],"Random room name":["Nome casuale stanza"],"Enter room":["Entra nella stanza"],"Enter the name of an existing room. You can create new rooms when you are signed in.":["Inserisci il nome di una stanza esistente. Puoi creare nuove stanze quando effetui l'accesso."],"Room history":["Cronologia stanza"],"Please sign in.":["Prego accedi."],"Videos play simultaneously for everyone in this call.":["I video vengono riprodotti simultaneamente per gli utenti in questa stanza."],"YouTube URL":["YouTube URL"],"Could not load YouTube player API, please check your network / firewall settings.":["Impossibile caricare le API del player di YouTube, per favore controlla le tue impostazioni di rete / firewall."],"Currently playing":["In riproduzione"],"YouTube controls":["Opzioni YouTube"],"YouTube video to share":["Video YouTube da condividere"],"Peer to peer chat active.":["Chat Peer-to-peer attiva."],"Peer to peer chat is now off.":["Chat Peer-to-peer inattiva."]," is now offline.":[" è offline."]," is now online.":[" è online."],"You share file:":["File condiviso:"],"Incoming file:":["File in arrivo:"],"You shared your location:":["Hai condiviso la tua posizione:"],"Location received:":["Posizione ricevuta:"],"You accepted the contact request.":["Hai accettato la richiesta contatto."],"You rejected the contact request.":["Hai rifiutato la richiesta contatto."],"You sent a contact request.":["Hai inviato una richiesta di contatto."],"Your contact request was accepted.":["La tua richiesta di contatto è stata accettata."],"Incoming contact request.":["Richiesta di contatto in arrivo."],"Your contact request was rejected.":["La tua richiesta di contatto è stata rifiutata."],"Edit Contact":["Modifica contatto"],"Your browser does not support WebRTC. No calls possible.":["Il tuo browser non supporta WebRTC. Non è possibile chiamare."],"Close this window and disconnect?":["Chiudi questa finestra e disconnetti?"],"Contacts Manager":["Contatti"],"Restart required to apply updates. Click ok to restart now.":["E' necessario riavviare il programma per applicare le modifiche. Fai click qui per riavviarlo ora."],"Failed to access camera/microphone.":["Tentativo fallito di accesso alla videocamera/microfono."],"Failed to establish peer connection.":["Impossibile stabilire una connessione."],"We are sorry but something went wrong. Boo boo.":["Ci dispiace ma qualcosa è andato storto."],"Oops":["Oops"],"Peer connection failed. Check your settings.":["Connessione fallita. Controlla le tue impostazioni."],"User hung up because of error.":["L'utente ha riattaccato a causa di un errore."]," is busy. Try again later.":[" è impegnato. Riprova più tardi."]," rejected your call.":[" ha rifiutato la tua chiamata."]," does not pick up.":[" non ha risposto."]," tried to call you":[" ha provato a chiamarti."]," called you":[" ti ha chiamato."],"Your browser is not supported. Please upgrade to a current version.":["Il tuo browser non è supportato. Per favore aggiornalo."],"Chat with":["Parla con"],"Message from ":["Messaggio da "],"You are now in room %s ...":["Ora sei nella stanza %s ..."],"Your browser does not support file transfer.":["Il tuo browser non supporta il trasferimento di file."],"Could not load PDF: Please make sure to select a PDF document.":["Impossibile caricare il PDF: Per favore verifica di aver selezionato un file PDF."],"Could not load PDF: Missing PDF file.":["Impossibile caricare il PDF: File mancante."],"An error occurred while loading the PDF (%s).":["Errore durante il caricamento del PDF (%s)."],"An unknown error occurred while loading the PDF.":["Errore sconosciuto durante il caricamento del PDF."],"An error occurred while loading the PDF page (%s).":["Errore in fase di caricamento della pagina del PDF (%s)."],"An unknown error occurred while loading the PDF page.":["Errore sconosciuto in fase di caricamento della pagina PDF (%s)."],"An error occurred while rendering the PDF page (%s).":["Errore durante il rendering della pagina PDF (%s)."],"An unknown error occurred while rendering the PDF page.":["Errore sconosciuto durante il rendering della pagina PDF."],"Only PDF documents and OpenDocument files can be shared at this time.":["Possono essere condivisi solamente file PDF ed OpenDocument."],"Failed to start screen sharing (%s).":["Impossibile avviare condivisione schermo (%s)."],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["Il permesso per avviare la condivisione dello schermo è stato negato. Verifica di aver abilitato la condivisione dello schermo per il tuo browser. Copia chrome://flags/#enable-usermedia-screen-capture, aprilo nel tuo browser ed abilita la spunta in cima, quindi riavvia il browser."],"Permission to start screen sharing was denied.":["Il permesso negato per la condivisione dello schermo."],"Use browser language":["Usa la lingua del browser"],"Meet with me here:":["Incontriamoci qui:"],"Please enter a new Room PIN to lock the room":["Inserisci un nuovo PIN per bloccare la stanza"],"Do you want to unlock the room?":["Vuoi sbloccare la stanza?"],"Room name":["Nome stanza"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":["La richiesta contiene un parametro invalido. Per favore controlla l'URL del video che vuoi condividere e riprova."],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":["Il contenuto richiesto non può essere riprodotto in un player HTML5 - o si è verificato un altro errore relativo al player HTML5. Per favore riprova più tardi."],"The video requested was not found. Please check the URL of the video you want to share and try again.":["Il video richiesto non è stato trovato. Per favore controlla la URL del video che vuoi condividere e riprova."],"The owner of the requested video does not allow it to be played in embedded players.":["Il proprietario del video non permette che venga riprodotto nel player incluso."],"An unknown error occurred while playing back the video (%s). Please try again later.":["Errore sconosciuto durante la riproduzione del video (%s). Per favore riprova più tardi."],"An unknown error occurred while playing back the video. Please try again later.":["Errore sconosciuto durante la riproduzione del video. Riprova più tardi."],"Unknown URL format. Please make sure to enter a valid YouTube URL.":["Formato URL sconosciuto. Per favore verifica di aver inserito un URL Youtube valido."],"Error":["Errore"],"Hint":["Suggerimento"],"Please confirm":["Prego conferma"],"More information required":["Sono richieste maggiori informazioni"],"Ok":["Ok"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":["La condivisione dello schermo richiede un'estensione del browser. Per favore aggiungi l'estensione WebRTC screen sharing a Chrome e riprova."],"Access code required":["Codice d'accesso richiesto"],"Access denied":["Accesso negato"],"Please provide a valid access code.":["Per favore inserisci un codice di accesso valido."],"Failed to verify access code. Check your Internet connection and try again.":["Impossibile verificare il codice d'accesso. Controlla la tua conessione a Internet e riprova."],"PIN for room %s is now '%s'.":["Il PIN per la stanza %s è '%s'."],"PIN lock has been removed from room %s.":["Il blocco del PIN è stato rimosso per la stanza %s."],"Enter the PIN for room %s":["Inserisci il PIN per la stanza %s"],"Please sign in to create rooms.":["Accedi per creare una stanza."],"and %s":["e %s"],"and %d others":["e %d altri"],"User":["Utente"],"Someone":["Qualcuno"],"Me":["Me"]}}} \ No newline at end of file diff --git a/static/translation/messages-ja.json b/static/translation/messages-ja.json index 571ed101..a7f09609 100644 --- a/static/translation/messages-ja.json +++ b/static/translation/messages-ja.json @@ -1 +1 @@ -{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=1; plural=0"},"Standard view":[""],"Large view":[""],"Kiosk view":[""],"Auditorium":[""],"Start chat":["チャットを始める"],"Start video call":["テレビ電話を始める"],"Start audio conference":["音声会議を始める"],"No one else here":[""],"Take":[""],"Retake":[""],"Cancel":["キャンセル"],"Set as Profile Picture":[""],"Take picture":["写真を取る"],"Waiting for camera":["カメラ待ち"],"The file couldn't be read.":[""],"The file is not an image.":[""],"The file is too large. Max. %d MB.":[""],"Select file":[""],"Chat sessions":["チャットのセッション"],"Room chat":["ルームチャット"],"Peer to peer":["ピア・ツー・ピア"],"Close chat":["チャットを終える"],"Share my location":[""],"is typing...":["は入力中です..."],"has stopped typing...":["は入力を止めました..."],"Type here to chat...":["ここに入力してチャット開始します..."],"Send":["送信"],"Accept":[""],"Reject":["拒否"],"You have no contacts.":[""],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":[""],"Edit contact":[""],"Edit":[""],"Name":["名前"],"Remove":[""],"Refresh":[""],"Save":[""],"Close":["閉じる"],"File sharing":["ファイル共有"],"File is no longer available":["ファイルは有効ではありません"],"Download":["ダウンロード"],"Open":["開く"],"Unshare":["共有取り消し"],"Retry":["リトライ"],"Download failed.":["ダウンロード失敗."],"Share a YouTube video":[""],"Share a file as presentation":[""],"Share your screen":["画面を共有する."],"Chat":["チャット"],"Contacts":[""],"Mute microphone":["消音"],"Turn camera off":["カメラをオフにする"],"Settings":["設定"],"Loading presentation ...":[""],"Please upload a document":[""],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":[""],"Upload":[""],"You can drag files here too.":[""],"Presentation controls":[""],"Prev":[""],"Next":[""],"Change room":["ルームチェンジ"],"Room":["ルーム"],"Leave room":["ルームを出る"],"Main":["メイン"],"Current room":["現在のルーム"],"Screen sharing options":["画面共有オプション"],"Fit screen.":["画面に合わせる"],"Please select what to share.":[""],"Window":[""],"Application":[""],"Share the whole screen. Click share to select the screen.":[""],"Share a single window. Click share to select the window.":[""],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":[""],"OK":[""],"Profile":[""],"Your name":["あなたの名前"],"Your picture":["あなたの写真"],"Status message":[""],"What's on your mind?":[""],"Your picture, name and status message identify yourself in calls, chats and rooms.":[""],"Your ID":[""],"Register":[""],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":[""],"Sign in":[""],"Create an account":[""],"Sign out":[""],"Manage account":[""],"Media":[""],"Microphone":["マイク"],"Camera":["カメラ"],"Video quality":["ビデオ画質"],"Low":["低い"],"High":["高い"],"HD":["HD"],"Full HD":[""],"General":[""],"Language":["言語"],"Language changes become active on reload.":["言語の変更は再読み込み時に適用となります."],"Default room":["デフォルト・ルーム"],"Set alternative room to join at start.":["スタート時に別のルームに参加する."],"Desktop notification":["デスクトップ通知"],"Enable":["有効にする"],"Denied - check your browser settings":["拒否 - ブラウザ設定を確認して下さい"],"Allowed":["許可"],"Sounds for incoming messages":[""],"Sounds for users in current room":[""],"Advanced settings":["詳細設定"],"Play audio on same device as selected microphone":[""],"Experimental AEC":[""],"Experimental AGC":[""],"Experimental noise suppression":[""],"Max video frame rate":["ビデオ最高フレームレート"],"auto":["自動"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":[""],"Detect CPU over use":[""],"Automatically reduces video quality as needed.":[""],"Optimize for high resolution video":[""],"Reduce video noise":[""],"Prefer VP9 video codec":[""],"Enable experiments":[""],"Show advanced settings":["詳細設定を表示"],"Hide advanced settings":["詳細設定を隠す"],"Remember settings":["設定を保存"],"Your ID will still be kept - press the log out button above to delete the ID.":[""],"Room link":[""],"Invite with Facebook":[""],"Invite with Twitter":[""],"Invite with Google Plus":[""],"Invite with XING":[""],"Initializing":["初期化中"],"Online":["オンライン"],"Calling":["発信中"],"Hangup":["切断"],"In call with":["と会話中"],"Conference with":["と会議中"],"Your are offline":["オフラインです"],"Go online":["オンラインにする"],"Connection interrupted":["接続は中断されました"],"An error occured":["エラーが発生しました"],"Incoming call":["着信中"],"from":["から"],"Accept call":["通話"],"Waiting for camera/microphone access":["カメラ・マイクの接続待ち."],"Your audio level":["あなたの音量"],"Checking camera and microphone access.":["カメラ・マイクの接続確認中."],"Please allow access to your camera and microphone.":["カメラとマイクの接続を許可してください."],"Camera / microphone access required.":["カメラ・マイクの接続が必要です."],"Please check your browser settings and allow camera and microphone access for this site.":["ブラウザ設定で、このサイトへのカメラ・マイクの接続を許可してください."],"Skip check":["チェックをスキップ"],"Click here for help (Google Chrome).":["ここをクリックしてヘルプ表示(Google Chrome)"],"Please set your user details and settings.":["あなたのプロフィールとアプリの動作を設定してください."],"Enter a room name":[""],"Random room name":[""],"Enter the name of an existing room. You can create new rooms when you are signed in.":[""],"Room history":[""],"Please sign in.":[""],"Videos play simultaneously for everyone in this call.":[""],"YouTube URL":[""],"Could not load YouTube player API, please check your network / firewall settings.":[""],"Currently playing":[""],"YouTube controls":[""],"YouTube video to share":[""],"Peer to peer chat active.":["ピア・ツー・ピア・チャットがアクティブです."],"Peer to peer chat is now off.":["ピア・ツー・ピア・チャットがオフです."]," is now offline.":["は今オフラインです"]," is now online.":["は今オンラインです"],"You share file:":["あなたの共有ファイル:"],"Incoming file:":["受信中ファイル:"],"You shared your location:":[""],"Location received:":[""],"You accepted the contact request.":[""],"You rejected the contact request.":[""],"You sent a contact request.":[""],"Your contact request was accepted.":[""],"Incoming contact request.":[""],"Your contact request was rejected.":[""],"Edit Contact":[""],"Your browser does not support WebRTC. No calls possible.":["ブラウザがWebRTCをサポートしていない為通話はできません."],"Close this window and disconnect?":[""],"Contacts Manager":[""],"Restart required to apply updates. Click ok to restart now.":["アップデート適用のため再起動してください.ここをクリックして再起動する."],"Failed to access camera/microphone.":["カメラ・マイクへの接続に失敗しました."],"Failed to establish peer connection.":["ピアとの接続に失敗しました."],"We are sorry but something went wrong. Boo boo.":["申し訳ないのですが、不具合が生じました。"],"Oops":["しまった"],"Peer connection failed. Check your settings.":["ピア接続に失敗しました.設定を確認してください."],"User hung up because of error.":["エラーのため切断しました."]," is busy. Try again later.":["は話中です.後で掛けなおしてください."]," rejected your call.":["着信拒否されました."]," does not pick up.":["は電話にでません."],"Chat with":["とチャットする"],"Message from ":["からのメッセージ"],"You are now in room %s ...":["あなたは%sのルームにいます..."],"Your browser does not support file transfer.":["ブラウザがファイル転送をサポートしていません."],"Could not load PDF: Please make sure to select a PDF document.":[""],"Could not load PDF: Missing PDF file.":[""],"An error occurred while loading the PDF (%s).":[""],"An unknown error occurred while loading the PDF.":[""],"An error occurred while loading the PDF page (%s).":[""],"An unknown error occurred while loading the PDF page.":[""],"An error occurred while rendering the PDF page (%s).":[""],"An unknown error occurred while rendering the PDF page.":[""],"Only PDF documents and OpenDocument files can be shared at this time.":[""],"Failed to start screen sharing (%s).":[""],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["画面共有は拒否されました.ブラウザの画面共有の設定を確認して下さい. Chromeのアドレスバーに chrome://flags/#enable-usermedia-screen-capture を入力して開き、スクリーンキャプチャのサポートを有効にしてください。その後ブラウザを再起動してください。"],"Permission to start screen sharing was denied.":[""],"Use browser language":["ブラウザの言語を使用"],"Meet with me here:":["ここで私と会う:"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":[""],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":[""],"The video requested was not found. Please check the URL of the video you want to share and try again.":[""],"The owner of the requested video does not allow it to be played in embedded players.":[""],"An unknown error occurred while playing back the video (%s). Please try again later.":[""],"An unknown error occurred while playing back the video. Please try again later.":[""],"Unknown URL format. Please make sure to enter a valid YouTube URL.":[""],"Error":["エラー"],"Hint":["ヒント"],"Please confirm":["確認して下さい"],"More information required":["さらなる情報が必要です"],"Ok":["OK"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":[""],"Access code required":["アクセスコードが必要です"],"Access denied":["アクセスが拒否されました"],"Please provide a valid access code.":["有効なアクセスコードを入力してください."],"Failed to verify access code. Check your Internet connection and try again.":["アクセスコードの確認に失敗しました.インターネット接続を確認してリトライしてください."],"PIN for room %s is now '%s'.":[""],"PIN lock has been removed from room %s.":[""],"Enter the PIN for room %s":[""],"Please sign in to create rooms.":[""],"and %d others":[""],"User":["ユーザー"],"Someone":["誰か"],"Me":["私"]}}} \ No newline at end of file +{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=1; plural=0"},"Standard view":[""],"Large view":[""],"Kiosk view":[""],"Auditorium":[""],"Start chat":["チャットを始める"],"Start video call":["テレビ電話を始める"],"Start audio conference":["音声会議を始める"],"No one else here":[""],"Take":[""],"Retake":[""],"Cancel":["キャンセル"],"Set as Profile Picture":[""],"Take picture":["写真を取る"],"Waiting for camera":["カメラ待ち"],"The file couldn't be read.":[""],"The file is not an image.":[""],"The file is too large. Max. %d MB.":[""],"Select file":[""],"Chat sessions":["チャットのセッション"],"Room chat":["ルームチャット"],"Peer to peer":["ピア・ツー・ピア"],"Close chat":["チャットを終える"],"Share my location":[""],"is typing...":["は入力中です..."],"has stopped typing...":["は入力を止めました..."],"Type here to chat...":["ここに入力してチャット開始します..."],"Send":["送信"],"Accept":[""],"Reject":["拒否"],"You have no contacts.":[""],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":[""],"Edit contact":[""],"Edit":[""],"Name":["名前"],"Remove":[""],"Refresh":[""],"Save":[""],"Close":["閉じる"],"File sharing":["ファイル共有"],"File is no longer available":["ファイルは有効ではありません"],"Download":["ダウンロード"],"Open":["開く"],"Unshare":["共有取り消し"],"Retry":["リトライ"],"Download failed.":["ダウンロード失敗."],"Share a YouTube video":[""],"Share a file as presentation":[""],"Share your screen":["画面を共有する."],"Chat":["チャット"],"Contacts":[""],"Mute microphone":["消音"],"Turn camera off":["カメラをオフにする"],"Settings":["設定"],"Loading presentation ...":[""],"Please upload a document":[""],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":[""],"Upload":[""],"You can drag files here too.":[""],"Presentation controls":[""],"Prev":[""],"Next":[""],"Change room":["ルームチェンジ"],"Room":["ルーム"],"Leave room":["ルームを出る"],"Main":["メイン"],"Current room":["現在のルーム"],"Screen sharing options":["画面共有オプション"],"Fit screen.":["画面に合わせる"],"Please select what to share.":[""],"Window":[""],"Application":[""],"Share the whole screen. Click share to select the screen.":[""],"Share a single window. Click share to select the window.":[""],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":[""],"OK":[""],"Profile":[""],"Your name":["あなたの名前"],"Your picture":["あなたの写真"],"Status message":[""],"What's on your mind?":[""],"Your picture, name and status message identify yourself in calls, chats and rooms.":[""],"Your ID":[""],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":[""],"Sign in":[""],"Create an account":[""],"Sign out":[""],"Manage account":[""],"Media":[""],"Microphone":["マイク"],"Camera":["カメラ"],"Video quality":["ビデオ画質"],"Low":["低い"],"High":["高い"],"HD":["HD"],"Full HD":[""],"General":[""],"Language":["言語"],"Language changes become active on reload.":["言語の変更は再読み込み時に適用となります."],"Default room":["デフォルト・ルーム"],"Set alternative room to join at start.":["スタート時に別のルームに参加する."],"Desktop notification":["デスクトップ通知"],"Enable":["有効にする"],"Denied - check your browser settings":["拒否 - ブラウザ設定を確認して下さい"],"Allowed":["許可"],"Sounds for incoming messages":[""],"Sounds for users in current room":[""],"Advanced settings":["詳細設定"],"Play audio on same device as selected microphone":[""],"Experimental AEC":[""],"Experimental AGC":[""],"Experimental noise suppression":[""],"Max video frame rate":["ビデオ最高フレームレート"],"auto":["自動"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":[""],"Detect CPU over use":[""],"Automatically reduces video quality as needed.":[""],"Optimize for high resolution video":[""],"Reduce video noise":[""],"Prefer VP9 video codec":[""],"Enable experiments":[""],"Show advanced settings":["詳細設定を表示"],"Hide advanced settings":["詳細設定を隠す"],"Remember settings":["設定を保存"],"Your ID will still be kept - press the log out button above to delete the ID.":[""],"Room PIN":[""],"Room link":[""],"Invite with Facebook":[""],"Invite with Twitter":[""],"Invite with Google Plus":[""],"Invite with XING":[""],"Initializing":["初期化中"],"Online":["オンライン"],"Calling":["発信中"],"Hangup":["切断"],"In call with":["と会話中"],"Conference with":["と会議中"],"Your are offline":["オフラインです"],"Go online":["オンラインにする"],"Connection interrupted":["接続は中断されました"],"An error occured":["エラーが発生しました"],"Incoming call":["着信中"],"from":["から"],"Accept call":["通話"],"Waiting for camera/microphone access":["カメラ・マイクの接続待ち."],"Your audio level":["あなたの音量"],"Checking camera and microphone access.":["カメラ・マイクの接続確認中."],"Please allow access to your camera and microphone.":["カメラとマイクの接続を許可してください."],"Camera / microphone access required.":["カメラ・マイクの接続が必要です."],"Please check your browser settings and allow camera and microphone access for this site.":["ブラウザ設定で、このサイトへのカメラ・マイクの接続を許可してください."],"Skip check":["チェックをスキップ"],"Click here for help (Google Chrome).":["ここをクリックしてヘルプ表示(Google Chrome)"],"Please set your user details and settings.":["あなたのプロフィールとアプリの動作を設定してください."],"Enter a room name":[""],"Random room name":[""],"Enter the name of an existing room. You can create new rooms when you are signed in.":[""],"Room history":[""],"Please sign in.":[""],"Videos play simultaneously for everyone in this call.":[""],"YouTube URL":[""],"Could not load YouTube player API, please check your network / firewall settings.":[""],"Currently playing":[""],"YouTube controls":[""],"YouTube video to share":[""],"Peer to peer chat active.":["ピア・ツー・ピア・チャットがアクティブです."],"Peer to peer chat is now off.":["ピア・ツー・ピア・チャットがオフです."]," is now offline.":[" は今オフラインです"]," is now online.":[" は今オンラインです"],"You share file:":["あなたの共有ファイル:"],"Incoming file:":["受信中ファイル:"],"You shared your location:":[""],"Location received:":[""],"You accepted the contact request.":[""],"You rejected the contact request.":[""],"You sent a contact request.":[""],"Your contact request was accepted.":[""],"Incoming contact request.":[""],"Your contact request was rejected.":[""],"Edit Contact":[""],"Your browser does not support WebRTC. No calls possible.":["ブラウザがWebRTCをサポートしていない為通話はできません."],"Close this window and disconnect?":[""],"Contacts Manager":[""],"Restart required to apply updates. Click ok to restart now.":["アップデート適用のため再起動してください.ここをクリックして再起動する."],"Failed to access camera/microphone.":["カメラ・マイクへの接続に失敗しました."],"Failed to establish peer connection.":["ピアとの接続に失敗しました."],"We are sorry but something went wrong. Boo boo.":["申し訳ないのですが、不具合が生じました。"],"Oops":["しまった"],"Peer connection failed. Check your settings.":["ピア接続に失敗しました.設定を確認してください."],"User hung up because of error.":["エラーのため切断しました."]," is busy. Try again later.":[" は話中です.後で掛けなおしてください."]," rejected your call.":[" 着信拒否されました."]," does not pick up.":[" は電話にでません."],"Chat with":["とチャットする"],"Message from ":["からのメッセージ"],"You are now in room %s ...":["あなたは%sのルームにいます..."],"Your browser does not support file transfer.":["ブラウザがファイル転送をサポートしていません."],"Could not load PDF: Please make sure to select a PDF document.":[""],"Could not load PDF: Missing PDF file.":[""],"An error occurred while loading the PDF (%s).":[""],"An unknown error occurred while loading the PDF.":[""],"An error occurred while loading the PDF page (%s).":[""],"An unknown error occurred while loading the PDF page.":[""],"An error occurred while rendering the PDF page (%s).":[""],"An unknown error occurred while rendering the PDF page.":[""],"Only PDF documents and OpenDocument files can be shared at this time.":[""],"Failed to start screen sharing (%s).":[""],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["画面共有は拒否されました.ブラウザの画面共有の設定を確認して下さい. Chromeのアドレスバーに chrome://flags/#enable-usermedia-screen-capture を入力して開き、スクリーンキャプチャのサポートを有効にしてください。その後ブラウザを再起動してください。"],"Permission to start screen sharing was denied.":[""],"Use browser language":["ブラウザの言語を使用"],"Meet with me here:":["ここで私と会う:"],"Please enter a new Room PIN to lock the room":[""],"Do you want to unlock the room?":[""],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":[""],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":[""],"The video requested was not found. Please check the URL of the video you want to share and try again.":[""],"The owner of the requested video does not allow it to be played in embedded players.":[""],"An unknown error occurred while playing back the video (%s). Please try again later.":[""],"An unknown error occurred while playing back the video. Please try again later.":[""],"Unknown URL format. Please make sure to enter a valid YouTube URL.":[""],"Error":["エラー"],"Hint":["ヒント"],"Please confirm":["確認して下さい"],"More information required":["さらなる情報が必要です"],"Ok":["OK"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":[""],"Access code required":["アクセスコードが必要です"],"Access denied":["アクセスが拒否されました"],"Please provide a valid access code.":["有効なアクセスコードを入力してください."],"Failed to verify access code. Check your Internet connection and try again.":["アクセスコードの確認に失敗しました.インターネット接続を確認してリトライしてください."],"PIN for room %s is now '%s'.":[""],"PIN lock has been removed from room %s.":[""],"Enter the PIN for room %s":[""],"Please sign in to create rooms.":[""],"and %d others":[""],"User":["ユーザー"],"Someone":["誰か"],"Me":["私"]}}} \ No newline at end of file diff --git a/static/translation/messages-ko.json b/static/translation/messages-ko.json index 73f66975..6970a1c7 100644 --- a/static/translation/messages-ko.json +++ b/static/translation/messages-ko.json @@ -1 +1 @@ -{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=1; plural=0"},"Standard view":[""],"Large view":[""],"Kiosk view":[""],"Auditorium":[""],"Start chat":["대화시작"],"Start video call":["화상회의 시작"],"Start audio conference":["음성회의 시작"],"No one else here":[""],"Take":[""],"Retake":[""],"Cancel":["취소"],"Set as Profile Picture":[""],"Take picture":["사진 찍음"],"Waiting for camera":["카메라 대기중"],"The file couldn't be read.":[""],"The file is not an image.":[""],"The file is too large. Max. %d MB.":[""],"Select file":[""],"Chat sessions":["대화 세션"],"Room chat":["대화 방"],"Peer to peer":["일대일"],"Close chat":["대화 종료"],"Share my location":[""],"is typing...":["입력중"],"has stopped typing...":["입력 종료"],"Type here to chat...":["대화 입력"],"Send":["전송"],"Accept":[""],"Reject":["거부"],"You have no contacts.":[""],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":[""],"Edit contact":[""],"Edit":[""],"Name":["이름"],"Remove":[""],"Refresh":[""],"Save":[""],"Close":["닫음"],"File sharing":["회일 공유"],"File is no longer available":["화일이 유효하지 않습니다"],"Download":["다운로드"],"Open":["열기"],"Unshare":["비공유"],"Retry":["재시도"],"Download failed.":["다운로드실패"],"Share a YouTube video":[""],"Share a file as presentation":[""],"Share your screen":["화면 공유하기"],"Chat":["대화"],"Contacts":[""],"Mute microphone":["음성제거"],"Turn camera off":["카메라꺼짐"],"Settings":["설정"],"Loading presentation ...":[""],"Please upload a document":[""],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":[""],"Upload":[""],"You can drag files here too.":[""],"Presentation controls":[""],"Prev":[""],"Next":[""],"Change room":["방 변경"],"Room":["방"],"Leave room":["방 이동"],"Main":["메인"],"Current room":["현재 방"],"Screen sharing options":["화면 공유 옵션"],"Fit screen.":["화면에 맟춤"],"Please select what to share.":[""],"Window":[""],"Application":[""],"Share the whole screen. Click share to select the screen.":[""],"Share a single window. Click share to select the window.":[""],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":[""],"OK":[""],"Profile":[""],"Your name":["사용자 이름"],"Your picture":["사용자 사진"],"Status message":[""],"What's on your mind?":[""],"Your picture, name and status message identify yourself in calls, chats and rooms.":[""],"Your ID":[""],"Register":[""],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":[""],"Sign in":[""],"Create an account":[""],"Sign out":[""],"Manage account":[""],"Media":[""],"Microphone":["마이크"],"Camera":["카메라"],"Video quality":["영상 수준"],"Low":["낮음"],"High":["높음"],"HD":["고화질"],"Full HD":[""],"General":[""],"Language":["언어"],"Language changes become active on reload.":["언어 변경이 재로드 되고 있습니다"],"Default room":["기본 방"],"Set alternative room to join at start.":["시작시에 다른 방에 합류하도록 설정 되었습니다"],"Desktop notification":["데스크탑에 통보"],"Enable":["활성화"],"Denied - check your browser settings":["거부됨 - 브라우저 설정을 확인하세요"],"Allowed":["허락됨"],"Sounds for incoming messages":[""],"Sounds for users in current room":[""],"Advanced settings":["고급 설정"],"Play audio on same device as selected microphone":[""],"Experimental AEC":[""],"Experimental AGC":[""],"Experimental noise suppression":[""],"Max video frame rate":["비디오프레임 비율 최대화"],"auto":["자동"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":[""],"Detect CPU over use":[""],"Automatically reduces video quality as needed.":[""],"Optimize for high resolution video":[""],"Reduce video noise":[""],"Prefer VP9 video codec":[""],"Enable experiments":[""],"Show advanced settings":["고급 설정 보기"],"Hide advanced settings":["고급 설정 감추기"],"Remember settings":["설정 기억"],"Your ID will still be kept - press the log out button above to delete the ID.":[""],"Room link":[""],"Invite with Facebook":[""],"Invite with Twitter":[""],"Invite with Google Plus":[""],"Invite with XING":[""],"Initializing":["초기화"],"Online":["온라인"],"Calling":["전화걸기"],"Hangup":["전화끊기"],"In call with":["전화중"],"Conference with":["회의중"],"Your are offline":["오프라인 입니다"],"Go online":["온라인에 연결합니다"],"Connection interrupted":["연결이 중단"],"An error occured":["에러 발생"],"Incoming call":["전화 걸려옴"],"from":["부터"],"Accept call":["전화 받음"],"Waiting for camera/microphone access":["카메라/마이크 사용을 기다림"],"Your audio level":["음성크기"],"Checking camera and microphone access.":["카메라와 마이크의 사용을 확인 하세요"],"Please allow access to your camera and microphone.":["카메라와 마이크의 사용을 허용 하세요"],"Camera / microphone access required.":["카메라/마이크 사용이 필요합니다"],"Please check your browser settings and allow camera and microphone access for this site.":["이 사이트에 대하여 브라우저의 설정을 확인하고 카메라와 마이크의 사용을 허용 하세요"],"Skip check":["확인 넘어가기"],"Click here for help (Google Chrome).":["도움말을 원하면 여기를 클릭 하세요 (구글 크롬)"],"Please set your user details and settings.":["사용자의 세부상세와 설정을 지정하세요 "],"Enter a room name":[""],"Random room name":[""],"Enter the name of an existing room. You can create new rooms when you are signed in.":[""],"Room history":[""],"Please sign in.":[""],"Videos play simultaneously for everyone in this call.":[""],"YouTube URL":[""],"Could not load YouTube player API, please check your network / firewall settings.":[""],"Currently playing":[""],"YouTube controls":[""],"YouTube video to share":[""],"Peer to peer chat active.":["일대일 대화 활성화"],"Peer to peer chat is now off.":["일대일 대화 꺼짐"]," is now offline.":["현재 오프라인 상태"]," is now online.":["현재 온라인 상태"],"You share file:":["공유 화일:"],"Incoming file:":["도착하는 화일:"],"You shared your location:":[""],"Location received:":[""],"You accepted the contact request.":[""],"You rejected the contact request.":[""],"You sent a contact request.":[""],"Your contact request was accepted.":[""],"Incoming contact request.":[""],"Your contact request was rejected.":[""],"Edit Contact":[""],"Your browser does not support WebRTC. No calls possible.":["브라우저가 WebRTC를 지원하지 않습니다. 전화걸기가 불가능 합니다."],"Close this window and disconnect?":[""],"Contacts Manager":[""],"Restart required to apply updates. Click ok to restart now.":["업데이트를 적용하려면 재시작이 필요 합니다. 지금 재시작 하려면 ok를 클릭 하십시오"],"Failed to access camera/microphone.":["카메라/마이크 사용 실패"],"Failed to establish peer connection.":["상대연결 설정이 실패 하였습니다"],"We are sorry but something went wrong. Boo boo.":["죄송합니다만 현재 문제가 있습니다."],"Oops":["이런"],"Peer connection failed. Check your settings.":["상대연결이 실패 했습니다. 설정을 확인 하십시오"],"User hung up because of error.":["오류로 인해 사용자 끊어짐"]," is busy. Try again later.":["통화중. 다시 시도 하세요."]," rejected your call.":["전화가 거부 되었습니다."]," does not pick up.":["전화를 받지 않습니다."],"Chat with":["대화하기"],"Message from ":["로 부터 메시지"],"You are now in room %s ...":["당신은 현재 방%s ...에 있습니다"],"Your browser does not support file transfer.":["당신의 브라우저가 회일전송을 지원하지 않습니다."],"Could not load PDF: Please make sure to select a PDF document.":[""],"Could not load PDF: Missing PDF file.":[""],"An error occurred while loading the PDF (%s).":[""],"An unknown error occurred while loading the PDF.":[""],"An error occurred while loading the PDF page (%s).":[""],"An unknown error occurred while loading the PDF page.":[""],"An error occurred while rendering the PDF page (%s).":[""],"An unknown error occurred while rendering the PDF page.":[""],"Only PDF documents and OpenDocument files can be shared at this time.":[""],"Failed to start screen sharing (%s).":[""],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["화면공유가 거절되었습니다. 사용하시는 브라우저에서 화면공유를 가능하도록 하여 주십시오. chrome://flags/#enable-usermedia-screen-capture를 복사하여 브라우저에서 수행하시고 상단의 프래그를 가능으로 변경 하십시오. 브라우저를 다시 수행시키면 사용하실수 있습니다."],"Permission to start screen sharing was denied.":[""],"Use browser language":["브라우저 언어 사용"],"Meet with me here:":["나를 여기서 만납니다:"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":[""],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":[""],"The video requested was not found. Please check the URL of the video you want to share and try again.":[""],"The owner of the requested video does not allow it to be played in embedded players.":[""],"An unknown error occurred while playing back the video (%s). Please try again later.":[""],"An unknown error occurred while playing back the video. Please try again later.":[""],"Unknown URL format. Please make sure to enter a valid YouTube URL.":[""],"Error":["오류"],"Hint":["도움말"],"Please confirm":["확인하십시오"],"More information required":["더 많은 정보가 필요함"],"Ok":["오케이"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":[""],"Access code required":["접속코드 필요함"],"Access denied":["접속 거부"],"Please provide a valid access code.":["유효한 접속코드가 필요합니다."],"Failed to verify access code. Check your Internet connection and try again.":["접속코드 확인이 실패 했습니다. 인터넷 연결을 확인하고 다시 시도해 주십시오. "],"PIN for room %s is now '%s'.":[""],"PIN lock has been removed from room %s.":[""],"Enter the PIN for room %s":[""],"Please sign in to create rooms.":[""],"and %d others":[""],"User":["사용자"],"Someone":["어떤 사람"],"Me":["나"]}}} \ No newline at end of file +{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=1; plural=0"},"Standard view":[""],"Large view":[""],"Kiosk view":[""],"Auditorium":[""],"Start chat":["대화시작"],"Start video call":["화상회의 시작"],"Start audio conference":["음성회의 시작"],"No one else here":[""],"Take":[""],"Retake":[""],"Cancel":["취소"],"Set as Profile Picture":[""],"Take picture":["사진 찍음"],"Waiting for camera":["카메라 대기중"],"The file couldn't be read.":[""],"The file is not an image.":[""],"The file is too large. Max. %d MB.":[""],"Select file":[""],"Chat sessions":["대화 세션"],"Room chat":["대화 방"],"Peer to peer":["일대일"],"Close chat":["대화 종료"],"Share my location":[""],"is typing...":["입력중"],"has stopped typing...":["입력 종료"],"Type here to chat...":["대화 입력"],"Send":["전송"],"Accept":[""],"Reject":["거부"],"You have no contacts.":[""],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":[""],"Edit contact":[""],"Edit":[""],"Name":["이름"],"Remove":[""],"Refresh":[""],"Save":[""],"Close":["닫음"],"File sharing":["회일 공유"],"File is no longer available":["화일이 유효하지 않습니다"],"Download":["다운로드"],"Open":["열기"],"Unshare":["비공유"],"Retry":["재시도"],"Download failed.":["다운로드실패"],"Share a YouTube video":[""],"Share a file as presentation":[""],"Share your screen":["화면 공유하기"],"Chat":["대화"],"Contacts":[""],"Mute microphone":["음성제거"],"Turn camera off":["카메라꺼짐"],"Settings":["설정"],"Loading presentation ...":[""],"Please upload a document":[""],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":[""],"Upload":[""],"You can drag files here too.":[""],"Presentation controls":[""],"Prev":[""],"Next":[""],"Change room":["방 변경"],"Room":["방"],"Leave room":["방 이동"],"Main":["메인"],"Current room":["현재 방"],"Screen sharing options":["화면 공유 옵션"],"Fit screen.":["화면에 맟춤"],"Please select what to share.":[""],"Window":[""],"Application":[""],"Share the whole screen. Click share to select the screen.":[""],"Share a single window. Click share to select the window.":[""],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":[""],"OK":[""],"Profile":[""],"Your name":["사용자 이름"],"Your picture":["사용자 사진"],"Status message":[""],"What's on your mind?":[""],"Your picture, name and status message identify yourself in calls, chats and rooms.":[""],"Your ID":[""],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":[""],"Sign in":[""],"Create an account":[""],"Sign out":[""],"Manage account":[""],"Media":[""],"Microphone":["마이크"],"Camera":["카메라"],"Video quality":["영상 수준"],"Low":["낮음"],"High":["높음"],"HD":["고화질"],"Full HD":[""],"General":[""],"Language":["언어"],"Language changes become active on reload.":["언어 변경이 재로드 되고 있습니다"],"Default room":["기본 방"],"Set alternative room to join at start.":["시작시에 다른 방에 합류하도록 설정 되었습니다"],"Desktop notification":["데스크탑에 통보"],"Enable":["활성화"],"Denied - check your browser settings":["거부됨 - 브라우저 설정을 확인하세요"],"Allowed":["허락됨"],"Sounds for incoming messages":[""],"Sounds for users in current room":[""],"Advanced settings":["고급 설정"],"Play audio on same device as selected microphone":[""],"Experimental AEC":[""],"Experimental AGC":[""],"Experimental noise suppression":[""],"Max video frame rate":["비디오프레임 비율 최대화"],"auto":["자동"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":[""],"Detect CPU over use":[""],"Automatically reduces video quality as needed.":[""],"Optimize for high resolution video":[""],"Reduce video noise":[""],"Prefer VP9 video codec":[""],"Enable experiments":[""],"Show advanced settings":["고급 설정 보기"],"Hide advanced settings":["고급 설정 감추기"],"Remember settings":["설정 기억"],"Your ID will still be kept - press the log out button above to delete the ID.":[""],"Room PIN":[""],"Room link":[""],"Invite with Facebook":[""],"Invite with Twitter":[""],"Invite with Google Plus":[""],"Invite with XING":[""],"Initializing":["초기화"],"Online":["온라인"],"Calling":["전화걸기"],"Hangup":["전화끊기"],"In call with":["전화중"],"Conference with":["회의중"],"Your are offline":["오프라인 입니다"],"Go online":["온라인에 연결합니다"],"Connection interrupted":["연결이 중단"],"An error occured":["에러 발생"],"Incoming call":["전화 걸려옴"],"from":["부터"],"Accept call":["전화 받음"],"Waiting for camera/microphone access":["카메라/마이크 사용을 기다림"],"Your audio level":["음성크기"],"Checking camera and microphone access.":["카메라와 마이크의 사용을 확인 하세요"],"Please allow access to your camera and microphone.":["카메라와 마이크의 사용을 허용 하세요"],"Camera / microphone access required.":["카메라/마이크 사용이 필요합니다"],"Please check your browser settings and allow camera and microphone access for this site.":["이 사이트에 대하여 브라우저의 설정을 확인하고 카메라와 마이크의 사용을 허용 하세요"],"Skip check":["확인 넘어가기"],"Click here for help (Google Chrome).":["도움말을 원하면 여기를 클릭 하세요 (구글 크롬)"],"Please set your user details and settings.":["사용자의 세부상세와 설정을 지정하세요 "],"Enter a room name":[""],"Random room name":[""],"Enter the name of an existing room. You can create new rooms when you are signed in.":[""],"Room history":[""],"Please sign in.":[""],"Videos play simultaneously for everyone in this call.":[""],"YouTube URL":[""],"Could not load YouTube player API, please check your network / firewall settings.":[""],"Currently playing":[""],"YouTube controls":[""],"YouTube video to share":[""],"Peer to peer chat active.":["일대일 대화 활성화"],"Peer to peer chat is now off.":["일대일 대화 꺼짐"]," is now offline.":[" 현재 오프라인 상태"]," is now online.":[" 현재 온라인 상태"],"You share file:":["공유 화일:"],"Incoming file:":["도착하는 화일:"],"You shared your location:":[""],"Location received:":[""],"You accepted the contact request.":[""],"You rejected the contact request.":[""],"You sent a contact request.":[""],"Your contact request was accepted.":[""],"Incoming contact request.":[""],"Your contact request was rejected.":[""],"Edit Contact":[""],"Your browser does not support WebRTC. No calls possible.":["브라우저가 WebRTC를 지원하지 않습니다. 전화걸기가 불가능 합니다."],"Close this window and disconnect?":[""],"Contacts Manager":[""],"Restart required to apply updates. Click ok to restart now.":["업데이트를 적용하려면 재시작이 필요 합니다. 지금 재시작 하려면 ok를 클릭 하십시오"],"Failed to access camera/microphone.":["카메라/마이크 사용 실패"],"Failed to establish peer connection.":["상대연결 설정이 실패 하였습니다"],"We are sorry but something went wrong. Boo boo.":["죄송합니다만 현재 문제가 있습니다."],"Oops":["이런"],"Peer connection failed. Check your settings.":["상대연결이 실패 했습니다. 설정을 확인 하십시오"],"User hung up because of error.":["오류로 인해 사용자 끊어짐"]," is busy. Try again later.":[" 통화중. 다시 시도 하세요."]," rejected your call.":[" 전화가 거부 되었습니다."]," does not pick up.":[" 전화를 받지 않습니다."],"Chat with":["대화하기"],"Message from ":["로 부터 메시지"],"You are now in room %s ...":["당신은 현재 방%s ...에 있습니다"],"Your browser does not support file transfer.":["당신의 브라우저가 회일전송을 지원하지 않습니다."],"Could not load PDF: Please make sure to select a PDF document.":[""],"Could not load PDF: Missing PDF file.":[""],"An error occurred while loading the PDF (%s).":[""],"An unknown error occurred while loading the PDF.":[""],"An error occurred while loading the PDF page (%s).":[""],"An unknown error occurred while loading the PDF page.":[""],"An error occurred while rendering the PDF page (%s).":[""],"An unknown error occurred while rendering the PDF page.":[""],"Only PDF documents and OpenDocument files can be shared at this time.":[""],"Failed to start screen sharing (%s).":[""],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["화면공유가 거절되었습니다. 사용하시는 브라우저에서 화면공유를 가능하도록 하여 주십시오. chrome://flags/#enable-usermedia-screen-capture를 복사하여 브라우저에서 수행하시고 상단의 프래그를 가능으로 변경 하십시오. 브라우저를 다시 수행시키면 사용하실수 있습니다."],"Permission to start screen sharing was denied.":[""],"Use browser language":["브라우저 언어 사용"],"Meet with me here:":["나를 여기서 만납니다:"],"Please enter a new Room PIN to lock the room":[""],"Do you want to unlock the room?":[""],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":[""],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":[""],"The video requested was not found. Please check the URL of the video you want to share and try again.":[""],"The owner of the requested video does not allow it to be played in embedded players.":[""],"An unknown error occurred while playing back the video (%s). Please try again later.":[""],"An unknown error occurred while playing back the video. Please try again later.":[""],"Unknown URL format. Please make sure to enter a valid YouTube URL.":[""],"Error":["오류"],"Hint":["도움말"],"Please confirm":["확인하십시오"],"More information required":["더 많은 정보가 필요함"],"Ok":["오케이"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":[""],"Access code required":["접속코드 필요함"],"Access denied":["접속 거부"],"Please provide a valid access code.":["유효한 접속코드가 필요합니다."],"Failed to verify access code. Check your Internet connection and try again.":["접속코드 확인이 실패 했습니다. 인터넷 연결을 확인하고 다시 시도해 주십시오. "],"PIN for room %s is now '%s'.":[""],"PIN lock has been removed from room %s.":[""],"Enter the PIN for room %s":[""],"Please sign in to create rooms.":[""],"and %d others":[""],"User":["사용자"],"Someone":["어떤 사람"],"Me":["나"]}}} \ No newline at end of file diff --git a/static/translation/messages-ru.json b/static/translation/messages-ru.json index 7a1707a8..d0149699 100644 --- a/static/translation/messages-ru.json +++ b/static/translation/messages-ru.json @@ -1 +1 @@ -{"domain":"messages","locale_data":{"messages":{"Standard view":["Стандартный вид"],"Large view":["Увеличенный вид"],"Kiosk view":["Мобильный вид"],"Auditorium":["Актовый зал"],"Start chat":["Начать чат"],"Start video call":["Начать видео вызов"],"Start audio conference":["Начать аудио конференцию"],"No one else here":["Никого здесь нет"],"Take":["Снять"],"Retake":["Снять заново"],"Cancel":["Отменить"],"Set as Profile Picture":["Установить как фото в профиль"],"Take picture":["Сделать фотографию"],"Upload picture":["Загрузить фотографию"],"Waiting for camera":["Ожидание камеры"],"Picture":["Фото"],"The file couldn't be read.":["Файл не может быть прочитан."],"The file is not an image.":["Файл не является рисунком."],"The file is too large. Max. %d MB.":["Файл слишком велик. Макс. %d МБ."],"Select file":["Выберите файл"],"Chat sessions":["Чаты"],"Room chat":["Чат комнаты"],"Peer to peer":["Пиринговый"],"Close chat":["Закрыть чат"],"Upload files":["Загрузить файлы"],"Share my location":["Доступ к местоположению"],"Clear chat":["Очистить чат"],"is typing...":["печатает..."],"has stopped typing...":["перестал печатать..."],"Type here to chat...":["Введите здесь сообщения"],"Send":["Отправить"],"Accept":["Принять"],"Reject":["Отклонить"],"You have no contacts.":["У вас нет контактов."],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":["Для того, чтобы добавить новые контакты, присоединиться к комнате и создать контакт добавьте запрос нажав на значок звездочки рядом с элементом пользовательского."],"Edit contact":["Редактировать контакт"],"Edit":["Редактировать"],"Name":["Имя"],"Remove":["Удалить"],"Refresh":["Обновить"],"Save":["Сохранить"],"Close":["Закрыть"],"File sharing":["Общий доступ к файлам"],"File is no longer available":["Файл больше недоступна"],"Download":["Загрузить"],"Open":["Открыть"],"Unshare":["Убрать из открытого доступа"],"Retry":["Повторить"],"Download failed.":["Ошибка загрузки."],"Share a YouTube video":["Поделиться c видео YouTube"],"Share a file as presentation":["Поделиться с файлом презентации"],"Share your screen":["Поделиться со своим экраном"],"Chat":["Чат"],"Contacts":["Контакты"],"Mute microphone":["Отключение микрофона"],"Turn camera off":["Выключить камеру"],"Settings":["Установки"],"Loading presentation ...":["Загрузка презентации ..."],"Please upload a document":["Пожалуйста, загрузите документ"],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":["Документы являются общими со всеми в этом вызове. Поддерживаются следующие типы файлов PDF и OpenDocument файлы."],"Upload":["Загрузить"],"You can drag files here too.":["Вы также можете перетаскивать файлы сюда."],"Presentation controls":["Управление презентацией"],"Prev":["Пред."],"Next":["След."],"Change room":["Сменить комнату"],"Room":["Комната"],"Leave room":["Оставить комнату"],"Main":["Главная"],"Current room":["Текущая комната"],"Screen sharing options":["Парамеры совместного использования экрана"],"Fit screen.":["Разместить в экран"],"Share screen":["Поделиться экраном"],"Please select what to share.":["Пожалуйста выберите чем поделиться"],"Screen":["Экран"],"Window":["Окно"],"Application":["Приложение"],"Share the whole screen. Click share to select the screen.":["Поделиться полным экраном. Нажмите поделиться, чтобы выбрать экран."],"Share a single window. Click share to select the window.":["Поделиться одним окном. Нажмите поделиться, чтобы выбрать окно."],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":["Поделиться со всеми окнами приложения. Это может привести к утечке содержимого за окна когда окна перемещаются. Нажмите поделиться, чтобы выбрать приложение."],"Share":["Поделиться"],"OK":["OK"],"Profile":["Профиль"],"Your name":["Ваше имя"],"Your picture":["Ваше фото"],"Status message":["Сообщение о статусе"],"What's on your mind?":["О чем ты думаешь?"],"Your picture, name and status message identify yourself in calls, chats and rooms.":["Ваше фото, имя и сообщение о статусе идентифицируют вас в вызовах, чатах и комнатах"],"Your ID":["Ваш ID"],"Register":["Отметить"],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":["Удостоверен сертификатом. Чтобы выйти вы должны удалить ваш сертификат от браузера."],"Sign in":["Войти в систему"],"Create an account":["Завести аккаунт"],"Sign out":["Выйти"],"Manage account":["Управлять аккаунтом"],"Media":["Медиа"],"Microphone":["Микрофон"],"Camera":["Камера"],"Video quality":["Качество видео"],"Low":["Низкое"],"High":["Высокое"],"HD":["HD"],"Full HD":["Полное HD"],"General":["Общие"],"Language":["Язык"],"Language changes become active on reload.":["Изменение язака становится активным при перезагрузке"],"Default room":["Комната по умолчанию"],"Set alternative room to join at start.":["Установить альтернативный номер, чтобы присоединиться в начале."],"Notifications":["Уведомления"],"Desktop notification":["уведомление рабочего стола"],"Enable":["Включить"],"Denied - check your browser settings":["Запрещено - проверьте настройки Вашего браузера"],"Allowed":["Разрешено"],"Sounds for incoming messages":["Звуки для входящих сообщений"],"Ring on incoming calls":["Звонок на входящие звонки"],"Sounds for users in current room":["Звуки для пользователей в текущей комнате"],"Advanced settings":["Расширенные настройки"],"Play audio on same device as selected microphone":["Воспроизведение аудио на одном устройстве, как выбрано микрофон"],"Experimental AEC":["Экспериментальное AEC"],"Experimental AGC":["Экспериментальное AGC"],"Experimental noise suppression":["Экспериментальное подавление шума"],"Max video frame rate":["Максимальная частота кадров видео"],"auto":["авто"],"Send stereo audio":["Использовать стереозвук"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":["Использование стереозвука отключает подавление эха. Включить только если у вас есть стерео вход."],"Detect CPU over use":["Обнаружение перегрузки процессора"],"Automatically reduces video quality as needed.":["Автоматически уменьшить качество видео по мере необходимости."],"Optimize for high resolution video":["Оптимизировать для видео высокого разрешения"],"Reduce video noise":["Уменьшить уровень шума видеоизображения"],"Prefer VP9 video codec":["Предпочесть видео кодек VP9"],"Enable experiments":["Разрешить эксперименты"],"Show advanced settings":["Показать дополнительные настройки"],"Hide advanced settings":["Скрыть дополнительные параметры"],"Remember settings":["Запомнить настройки"],"Your ID will still be kept - press the log out button above to delete the ID.":["Ваш ID-прежнему будут храниться - нажмите кнопку выхода из системы выше, чтобы удалить ID."],"Room link":["Ссылка комнаты"],"Invite by Email":["Пригласить по электронной почте"],"Invite with Facebook":["Пригласить с Facebook"],"Invite with Twitter":["Пригласить с Twitter"],"Invite with Google Plus":["Пригласить с Google Plus"],"Invite with XING":["Пригласить с XING"],"Initializing":["Инициализация"],"Online":["В сети"],"Calling":["Вызывает"],"Hangup":["Сбросить"],"In call with":["В разговоре с"],"Conference with":["Конференция с"],"Your are offline":["Вы не в сети"],"Go online":["Войти в онлайн"],"Connection interrupted":["Подключение прервано"],"An error occured":["Произошла ошибка"],"Incoming call":["Входящий звонок"],"from":["от"],"Accept call":["Принять вызов"],"Waiting for camera/microphone access":["Ожидание камеры/микрофона"],"Your audio level":["Ваш уровень звука"],"Checking camera and microphone access.":["Проверка доступа камеры и микрофона."],"Please allow access to your camera and microphone.":["Пожалуйста разрешите доступ к камере и микрофону."],"Camera / microphone access required.":["Требуется доступ камеры / микрофона."],"Please check your browser settings and allow camera and microphone access for this site.":["Пожалуйста, проверьте настройки Вашего браузера и разрешите доступ к камере и микрофону для этого сайта."],"Skip check":["Пропустить проверку"],"Click here for help (Google Chrome).":["Нажмите здесь для помощи (Google Chrome)."],"Please set your user details and settings.":["Пожалуйста, установите свои пользовательские данные и настройки."],"Enter a room name":["Введите название комнаты"],"Random room name":["Случайное имя комнаты"],"Enter room":["Войти в комнату"],"Enter the name of an existing room. You can create new rooms when you are signed in.":["Введите имя существующей комнаты. Вы можете создавать новые номера, когда вы вошли."],"Room history":["История комнат"],"Please sign in.":["Пожалуйста войдите."],"Videos play simultaneously for everyone in this call.":["Видео проигрывается одновременно для всех в этом вызове."],"YouTube URL":["URL YouTube"],"Could not load YouTube player API, please check your network / firewall settings.":["Не удалось загрузить API проигрывателя YouTube, пожалуйста, проверьте настройки своей сети / файрволла."],"Currently playing":["Сейчас проигрывает"],"YouTube controls":["управления YouTube"],"YouTube video to share":["Видео YouTube, чтобы поделиться"],"Peer to peer chat active.":["Пиринговый чат активен"],"Peer to peer chat is now off.":["Пиринговый чат теперь выключена"]," is now offline.":[" вышел."]," is now online.":[" вошел."],"You share file:":["Вы делитесь файлом:"],"Incoming file:":["Входящий файл:"],"You shared your location:":["Вы поделились своим местоположением:"],"Location received:":["Местоположение получено:"],"You accepted the contact request.":["Вы приняли запрос контакта."],"You rejected the contact request.":["Вы отклонил запрос контакта."],"You sent a contact request.":["Вы отправили запрос на получение контакта."],"Your contact request was accepted.":["Ваш запрос на контакт был принят."],"Incoming contact request.":["Входящий на запрос контакт."],"Your contact request was rejected.":["Ваш запрос на контакт был отклонен."],"Edit Contact":["Редактировать контакт"],"Your browser does not support WebRTC. No calls possible.":["Ваш браузер не поддерживает WebRTC. Вызовы не возможны."],"Close this window and disconnect?":["Закрыть это окно отключиться?"],"Contacts Manager":["Менеджер конактов"],"Restart required to apply updates. Click ok to restart now.":["Требуется перезапуск для применения обновлений. Нажмите кнопку ОК, чтобы перезапустить сейчас."],"Failed to access camera/microphone.":["Не удалось получить доступ к камере/микрофону."],"Failed to establish peer connection.":["Не удалось установить пиринговое соединение."],"We are sorry but something went wrong. Boo boo.":["Извините, но что-то пошло не так. Ай-Ай."],"Oops":["Ой"],"Peer connection failed. Check your settings.":["Пиринговое соединение не удалось. Проверьте настройки."],"User hung up because of error.":["Пользователь сбросил из-за ошибки."]," is busy. Try again later.":[" занят. Попробуйте позже."]," rejected your call.":[" отклонил вызов."]," does not pick up.":[" не берет."]," tried to call you":[" пытался звонить вам"]," called you":[" звонил вам"],"Your browser is not supported. Please upgrade to a current version.":["Ваш браузер не поддерживается. Обновите до текущей версии."],"Chat with":["Чат с"],"Message from ":["Сообщение от "],"You are now in room %s ...":["Теперь вы находитесь в комнате %s ..."],"Your browser does not support file transfer.":["Ваш браузер не поддерживает передачу файлов."],"Could not load PDF: Please make sure to select a PDF document.":["Не удалось загрузить PDF: Пожалуйста, убедитесь, чтобы выбрать PDF документ."],"Could not load PDF: Missing PDF file.":["Не удалось загрузить PDF: Отсутствует файл PDF."],"An error occurred while loading the PDF (%s).":["Произошла ошибка при загрузке PDF (%s)."],"An unknown error occurred while loading the PDF.":["Произошла неизвестная ошибка при загрузке PDF."],"An error occurred while loading the PDF page (%s).":["Произошла ошибка при загрузке страницы PDF (%s)."],"An unknown error occurred while loading the PDF page.":["Произошла неизвестная ошибка при загрузке страницы PDF."],"An error occurred while rendering the PDF page (%s).":["Произошла ошибка при обработке страницы PDF (%s)."],"An unknown error occurred while rendering the PDF page.":["При обработке страницы PDF произошла неизвестная ошибка."],"Only PDF documents and OpenDocument files can be shared at this time.":["Только PDF документы и OpenDocument файлы могут быть выставлены на общий доступ."],"Failed to start screen sharing (%s).":["Не удалось запустить общий экран (%s)."],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["Было отказано в запуске общего экрана. Убедитесь, что включили доступ для совместного использования экрана для вашего браузера. Скопируйте chrome://flags/#enable-usermedia-screen-capture и откройте его в вашем браузере и включите флаг на верху. Затем перезапустить браузер, и вы готовы к работе."],"Permission to start screen sharing was denied.":["Было отказано в запуске общего экрана."],"Use browser language":["Использовать язык браузера"],"Meet with me here:":["Встретиться со мной здесь:"],"Room name":["Имя комнаты"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":["Запрос содержит недопустимое значение параметра. Пожалуйста, проверьте URL видео, с которым вы хотите поделиться, и повторите попытку."],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":["Запрашиваемое содержание не может быть воспроизведено в проигрывателе HTML5 или произошла ошибка, связанная с плеером HTML5. Пожалуйста, повторите попытку позже."],"The video requested was not found. Please check the URL of the video you want to share and try again.":["Запрашиваемое видео не было найдено. Пожалуйста, проверьте URL видео, с которым вы хотите поделиться и повторите попытку."],"The owner of the requested video does not allow it to be played in embedded players.":["Владелец запрашиваемого видео не позволяет его воспроизвести ввстроенном проигрывателе."],"An unknown error occurred while playing back the video (%s). Please try again later.":["Произошла неизвестная ошибка при воспроизведении видео (%s). Пожалуйста, позже попробуйте снова."],"An unknown error occurred while playing back the video. Please try again later.":["Произошла неизвестная ошибка при воспроизведении видео. Пожалуйста, позже попробуйте снова."],"Unknown URL format. Please make sure to enter a valid YouTube URL.":["Неизвестный формат URL. Пожалуйста, убедитесь, что действительно ввели URL YouTube."],"Error":["Ошибка"],"Hint":["Подсказка"],"Please confirm":["Пожалуйста подтвердите"],"More information required":["Требуется больше информации"],"Ok":["Ok"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":["Совместное использование экрана требует расширение для браузера. Пожалуйста, добавьте расширение Spreed WebRTC в Chrome и повторите попытку."],"Access code required":["требуется код доступа"],"Access denied":["Доступ закрыт"],"Please provide a valid access code.":["Укажите действительный код доступа."],"Failed to verify access code. Check your Internet connection and try again.":["Не удалось проверить код доступа. Проверьте подключение к Интернету и попробуйте еще раз."],"PIN for room %s is now '%s'.":["PIN для комнаты %s теперь '%s'."],"PIN lock has been removed from room %s.":["Замок с PIN был удален от комнаты %s."],"Enter the PIN for room %s":["Введите PIN для комнаты %s"],"Please sign in to create rooms.":["Пожалуйста, войдите, чтобы создавать комнаты."],"and %s":["и %s"],"and %d others":["и %d других "],"User":["Пользователь"],"Someone":["Кто то"],"Me":["Я"],"":{"domain":"messages","plural_forms":"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)"}}}} \ No newline at end of file +{"domain":"messages","locale_data":{"messages":{"Standard view":["Стандартный вид"],"Large view":["Увеличенный вид"],"Kiosk view":["Мобильный вид"],"Auditorium":["Актовый зал"],"Start chat":["Начать чат"],"Start video call":["Начать видео вызов"],"Start audio conference":["Начать аудио конференцию"],"No one else here":["Никого здесь нет"],"Take":["Снять"],"Retake":["Снять заново"],"Cancel":["Отменить"],"Set as Profile Picture":["Установить как фото в профиль"],"Take picture":["Сделать фотографию"],"Upload picture":["Загрузить фотографию"],"Waiting for camera":["Ожидание камеры"],"Picture":["Фото"],"The file couldn't be read.":["Файл не может быть прочитан."],"The file is not an image.":["Файл не является рисунком."],"The file is too large. Max. %d MB.":["Файл слишком велик. Макс. %d МБ."],"Select file":["Выберите файл"],"Chat sessions":["Чаты"],"Room chat":["Чат комнаты"],"Peer to peer":["Пиринговый"],"Close chat":["Закрыть чат"],"Upload files":["Загрузить файлы"],"Share my location":["Доступ к местоположению"],"Clear chat":["Очистить чат"],"is typing...":["печатает..."],"has stopped typing...":["перестал печатать..."],"Type here to chat...":["Введите здесь сообщения..."],"Send":["Отправить"],"Accept":["Принять"],"Reject":["Отклонить"],"You have no contacts.":["У вас нет контактов."],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":["Для того, чтобы добавить новые контакты, присоединиться к комнате и создать контакт добавьте запрос нажав на значок звездочки рядом с элементом пользовательского."],"Edit contact":["Редактировать контакт"],"Edit":["Редактировать"],"Name":["Имя"],"Remove":["Удалить"],"Refresh":["Обновить"],"Save":["Сохранить"],"Close":["Закрыть"],"File sharing":["Общий доступ к файлам"],"File is no longer available":["Файл больше недоступна"],"Download":["Загрузить"],"Open":["Открыть"],"Unshare":["Убрать из открытого доступа"],"Retry":["Повторить"],"Download failed.":["Ошибка загрузки."],"Share a YouTube video":["Поделиться c видео YouTube"],"Share a file as presentation":["Поделиться с файлом презентации"],"Share your screen":["Поделиться со своим экраном"],"Chat":["Чат"],"Contacts":["Контакты"],"Mute microphone":["Отключение микрофона"],"Turn camera off":["Выключить камеру"],"Settings":["Установки"],"Loading presentation ...":["Загрузка презентации ..."],"Please upload a document":["Пожалуйста, загрузите документ"],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":["Документы являются общими со всеми в этом вызове. Поддерживаются следующие типы файлов PDF и OpenDocument файлы."],"Upload":["Загрузить"],"You can drag files here too.":["Вы также можете перетаскивать файлы сюда."],"Presentation controls":["Управление презентацией"],"Prev":["Пред."],"Next":["След."],"Change room":["Сменить комнату"],"Room":["Комната"],"Leave room":["Оставить комнату"],"Main":["Главная"],"Current room":["Текущая комната"],"Screen sharing options":["Парамеры совместного использования экрана"],"Fit screen.":["Разместить в экран."],"Share screen":["Поделиться экраном"],"Please select what to share.":["Пожалуйста выберите чем поделиться."],"Screen":["Экран"],"Window":["Окно"],"Application":["Приложение"],"Share the whole screen. Click share to select the screen.":["Поделиться полным экраном. Нажмите поделиться, чтобы выбрать экран."],"Share a single window. Click share to select the window.":["Поделиться одним окном. Нажмите поделиться, чтобы выбрать окно."],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":["Поделиться со всеми окнами приложения. Это может привести к утечке содержимого за окна когда окна перемещаются. Нажмите поделиться, чтобы выбрать приложение."],"Share":["Поделиться"],"OK":["OK"],"Profile":["Профиль"],"Your name":["Ваше имя"],"Your picture":["Ваше фото"],"Status message":["Сообщение о статусе"],"What's on your mind?":["О чем ты думаешь?"],"Your picture, name and status message identify yourself in calls, chats and rooms.":["Ваше фото, имя и сообщение о статусе идентифицируют вас в вызовах, чатах и комнатах."],"Your ID":["Ваш ID"],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":["Удостоверен сертификатом. Чтобы выйти вы должны удалить ваш сертификат от браузера."],"Sign in":["Войти в систему"],"Create an account":["Завести аккаунт"],"Sign out":["Выйти"],"Manage account":["Управлять аккаунтом"],"Media":["Медиа"],"Microphone":["Микрофон"],"Camera":["Камера"],"Video quality":["Качество видео"],"Low":["Низкое"],"High":["Высокое"],"HD":["HD"],"Full HD":["Полное HD"],"General":["Общие"],"Language":["Язык"],"Language changes become active on reload.":["Изменение язака становится активным при перезагрузке."],"Default room":["Комната по умолчанию"],"Set alternative room to join at start.":["Установить альтернативный номер, чтобы присоединиться в начале."],"Notifications":["Уведомления"],"Desktop notification":["уведомление рабочего стола"],"Enable":["Включить"],"Denied - check your browser settings":["Запрещено - проверьте настройки Вашего браузера"],"Allowed":["Разрешено"],"Sounds for incoming messages":["Звуки для входящих сообщений"],"Ring on incoming calls":["Звонок на входящие звонки"],"Sounds for users in current room":["Звуки для пользователей в текущей комнате"],"Advanced settings":["Расширенные настройки"],"Play audio on same device as selected microphone":["Воспроизведение аудио на одном устройстве, как выбрано микрофон"],"Experimental AEC":["Экспериментальное AEC"],"Experimental AGC":["Экспериментальное AGC"],"Experimental noise suppression":["Экспериментальное подавление шума"],"Max video frame rate":["Максимальная частота кадров видео"],"auto":["авто"],"Send stereo audio":["Использовать стереозвук"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":["Использование стереозвука отключает подавление эха. Включить только если у вас есть стерео вход."],"Detect CPU over use":["Обнаружение перегрузки процессора"],"Automatically reduces video quality as needed.":["Автоматически уменьшить качество видео по мере необходимости."],"Optimize for high resolution video":["Оптимизировать для видео высокого разрешения"],"Reduce video noise":["Уменьшить уровень шума видеоизображения"],"Prefer VP9 video codec":["Предпочесть видео кодек VP9"],"Enable experiments":["Разрешить эксперименты"],"Show advanced settings":["Показать дополнительные настройки"],"Hide advanced settings":["Скрыть дополнительные параметры"],"Remember settings":["Запомнить настройки"],"Your ID will still be kept - press the log out button above to delete the ID.":["Ваш ID-прежнему будут храниться - нажмите кнопку выхода из системы выше, чтобы удалить ID."],"Room link":["Ссылка комнаты"],"Invite by Email":["Пригласить по электронной почте"],"Invite with Facebook":["Пригласить с Facebook"],"Invite with Twitter":["Пригласить с Twitter"],"Invite with Google Plus":["Пригласить с Google Plus"],"Invite with XING":["Пригласить с XING"],"Initializing":["Инициализация"],"Online":["В сети"],"Calling":["Вызывает"],"Hangup":["Сбросить"],"In call with":["В разговоре с"],"Conference with":["Конференция с"],"Your are offline":["Вы не в сети"],"Go online":["Войти в онлайн"],"Connection interrupted":["Подключение прервано"],"An error occured":["Произошла ошибка"],"Incoming call":["Входящий звонок"],"from":["от"],"Accept call":["Принять вызов"],"Waiting for camera/microphone access":["Ожидание камеры/микрофона"],"Your audio level":["Ваш уровень звука"],"Checking camera and microphone access.":["Проверка доступа камеры и микрофона."],"Please allow access to your camera and microphone.":["Пожалуйста разрешите доступ к камере и микрофону."],"Camera / microphone access required.":["Требуется доступ камеры / микрофона."],"Please check your browser settings and allow camera and microphone access for this site.":["Пожалуйста, проверьте настройки Вашего браузера и разрешите доступ к камере и микрофону для этого сайта."],"Skip check":["Пропустить проверку"],"Click here for help (Google Chrome).":["Нажмите здесь для помощи (Google Chrome)."],"Please set your user details and settings.":["Пожалуйста, установите свои пользовательские данные и настройки."],"Enter a room name":["Введите название комнаты"],"Random room name":["Случайное имя комнаты"],"Enter room":["Войти в комнату"],"Enter the name of an existing room. You can create new rooms when you are signed in.":["Введите имя существующей комнаты. Вы можете создавать новые номера, когда вы вошли."],"Room history":["История комнат"],"Please sign in.":["Пожалуйста войдите."],"Videos play simultaneously for everyone in this call.":["Видео проигрывается одновременно для всех в этом вызове."],"YouTube URL":["URL YouTube"],"Could not load YouTube player API, please check your network / firewall settings.":["Не удалось загрузить API проигрывателя YouTube, пожалуйста, проверьте настройки своей сети / файрволла."],"Currently playing":["Сейчас проигрывает"],"YouTube controls":["управления YouTube"],"YouTube video to share":["Видео YouTube, чтобы поделиться"],"Peer to peer chat active.":["Пиринговый чат активен."],"Peer to peer chat is now off.":["Пиринговый чат теперь выключена."]," is now offline.":[" вышел."]," is now online.":[" вошел."],"You share file:":["Вы делитесь файлом:"],"Incoming file:":["Входящий файл:"],"You shared your location:":["Вы поделились своим местоположением:"],"Location received:":["Местоположение получено:"],"You accepted the contact request.":["Вы приняли запрос контакта."],"You rejected the contact request.":["Вы отклонил запрос контакта."],"You sent a contact request.":["Вы отправили запрос на получение контакта."],"Your contact request was accepted.":["Ваш запрос на контакт был принят."],"Incoming contact request.":["Входящий на запрос контакт."],"Your contact request was rejected.":["Ваш запрос на контакт был отклонен."],"Edit Contact":["Редактировать контакт"],"Your browser does not support WebRTC. No calls possible.":["Ваш браузер не поддерживает WebRTC. Вызовы не возможны."],"Close this window and disconnect?":["Закрыть это окно отключиться?"],"Contacts Manager":["Менеджер конактов"],"Restart required to apply updates. Click ok to restart now.":["Требуется перезапуск для применения обновлений. Нажмите кнопку ОК, чтобы перезапустить сейчас."],"Failed to access camera/microphone.":["Не удалось получить доступ к камере/микрофону."],"Failed to establish peer connection.":["Не удалось установить пиринговое соединение."],"We are sorry but something went wrong. Boo boo.":["Извините, но что-то пошло не так. Ай-Ай."],"Oops":["Ой"],"Peer connection failed. Check your settings.":["Пиринговое соединение не удалось. Проверьте настройки."],"User hung up because of error.":["Пользователь сбросил из-за ошибки."]," is busy. Try again later.":[" занят. Попробуйте позже."]," rejected your call.":[" отклонил вызов."]," does not pick up.":[" не берет."]," tried to call you":[" пытался звонить вам"]," called you":[" звонил вам"],"Your browser is not supported. Please upgrade to a current version.":["Ваш браузер не поддерживается. Обновите до текущей версии."],"Chat with":["Чат с"],"Message from ":["Сообщение от "],"You are now in room %s ...":["Теперь вы находитесь в комнате %s ..."],"Your browser does not support file transfer.":["Ваш браузер не поддерживает передачу файлов."],"Could not load PDF: Please make sure to select a PDF document.":["Не удалось загрузить PDF: Пожалуйста, убедитесь, чтобы выбрать PDF документ."],"Could not load PDF: Missing PDF file.":["Не удалось загрузить PDF: Отсутствует файл PDF."],"An error occurred while loading the PDF (%s).":["Произошла ошибка при загрузке PDF (%s)."],"An unknown error occurred while loading the PDF.":["Произошла неизвестная ошибка при загрузке PDF."],"An error occurred while loading the PDF page (%s).":["Произошла ошибка при загрузке страницы PDF (%s)."],"An unknown error occurred while loading the PDF page.":["Произошла неизвестная ошибка при загрузке страницы PDF."],"An error occurred while rendering the PDF page (%s).":["Произошла ошибка при обработке страницы PDF (%s)."],"An unknown error occurred while rendering the PDF page.":["При обработке страницы PDF произошла неизвестная ошибка."],"Only PDF documents and OpenDocument files can be shared at this time.":["Только PDF документы и OpenDocument файлы могут быть выставлены на общий доступ."],"Failed to start screen sharing (%s).":["Не удалось запустить общий экран (%s)."],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["Было отказано в запуске общего экрана. Убедитесь, что включили доступ для совместного использования экрана для вашего браузера. Скопируйте chrome://flags/#enable-usermedia-screen-capture и откройте его в вашем браузере и включите флаг на верху. Затем перезапустить браузер, и вы готовы к работе."],"Permission to start screen sharing was denied.":["Было отказано в запуске общего экрана."],"Use browser language":["Использовать язык браузера"],"Meet with me here:":["Встретиться со мной здесь:"],"Please enter a new Room PIN to lock the room":[""],"Do you want to unlock the room?":[""],"Room name":["Имя комнаты"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":["Запрос содержит недопустимое значение параметра. Пожалуйста, проверьте URL видео, с которым вы хотите поделиться, и повторите попытку."],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":["Запрашиваемое содержание не может быть воспроизведено в проигрывателе HTML5 или произошла ошибка, связанная с плеером HTML5. Пожалуйста, повторите попытку позже."],"The video requested was not found. Please check the URL of the video you want to share and try again.":["Запрашиваемое видео не было найдено. Пожалуйста, проверьте URL видео, с которым вы хотите поделиться и повторите попытку."],"The owner of the requested video does not allow it to be played in embedded players.":["Владелец запрашиваемого видео не позволяет его воспроизвести ввстроенном проигрывателе."],"An unknown error occurred while playing back the video (%s). Please try again later.":["Произошла неизвестная ошибка при воспроизведении видео (%s). Пожалуйста, позже попробуйте снова."],"An unknown error occurred while playing back the video. Please try again later.":["Произошла неизвестная ошибка при воспроизведении видео. Пожалуйста, позже попробуйте снова."],"Unknown URL format. Please make sure to enter a valid YouTube URL.":["Неизвестный формат URL. Пожалуйста, убедитесь, что действительно ввели URL YouTube."],"Error":["Ошибка"],"Hint":["Подсказка"],"Please confirm":["Пожалуйста подтвердите"],"More information required":["Требуется больше информации"],"Ok":["Ok"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":["Совместное использование экрана требует расширение для браузера. Пожалуйста, добавьте расширение Spreed WebRTC в Chrome и повторите попытку."],"Access code required":["требуется код доступа"],"Access denied":["Доступ закрыт"],"Please provide a valid access code.":["Укажите действительный код доступа."],"Failed to verify access code. Check your Internet connection and try again.":["Не удалось проверить код доступа. Проверьте подключение к Интернету и попробуйте еще раз."],"PIN for room %s is now '%s'.":["PIN для комнаты %s теперь '%s'."],"PIN lock has been removed from room %s.":["Замок с PIN был удален от комнаты %s."],"Enter the PIN for room %s":["Введите PIN для комнаты %s"],"Please sign in to create rooms.":["Пожалуйста, войдите, чтобы создавать комнаты."],"and %s":["и %s"],"and %d others":["и %d других "],"User":["Пользователь"],"Someone":["Кто то"],"Me":["Я"],"":{"domain":"messages","plural_forms":"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)"}}}} \ No newline at end of file diff --git a/static/translation/messages-tr.po b/static/translation/messages-tr.po new file mode 100644 index 00000000..c2312ce3 --- /dev/null +++ b/static/translation/messages-tr.po @@ -0,0 +1,853 @@ +# Turkish translations for Spreed WebRTC. +# Copyright (C) 2017 +# This file is distributed under the same license as the Spreed WebRTC +# project. +# +#, fuzzy + +msgid "" +msgstr "" +"Project-Id-Version: Spreed WebRTC 1.0\n" +"Report-Msgid-Bugs-To: simon@struktur.de\n" +"POT-Creation-Date: 2016-08-18 18:21+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +msgid "Standard view" +msgstr "Standart görünüm" + +msgid "Large view" +msgstr "Büyük görüntüler" + +msgid "Kiosk view" +msgstr "Kiosk görünümü" + +msgid "Auditorium" +msgstr "Toplantı görünümü" + +msgid "Start chat" +msgstr "Chate başla" + +msgid "Start video call" +msgstr "Görüntülü arama" + +msgid "Start audio conference" +msgstr "Sesli arama" + +msgid "No one else here" +msgstr "Burada başka kimse yok" + +msgid "Take" +msgstr "Cevapla" + +msgid "Retake" +msgstr "Tekrar" + +msgid "Cancel" +msgstr "İptal" + +msgid "Set as Profile Picture" +msgstr "Profil görüntüsü yap" + +msgid "Take picture" +msgstr "Resim çek" + +msgid "Upload picture" +msgstr "Resim yükle" + +msgid "Waiting for camera" +msgstr "Kamerayı bekliyor" + +msgid "Picture" +msgstr "Resim" + +msgid "The file couldn't be read." +msgstr "Dosya okunamadı." + +msgid "The file is not an image." +msgstr "Bu bir resim dosyası değil." + +#, python-format +msgid "The file is too large. Max. %d MB." +msgstr "Dosya çok büyükç Maksç %d MB" + +msgid "Select file" +msgstr "Dosya seç" + +msgid "Chat sessions" +msgstr "Chat oturumları" + +msgid "Room chat" +msgstr "Chat odası" + +msgid "Peer to peer" +msgstr "peer-to-peer" + +msgid "Close chat" +msgstr "Chati sonlandır" + +msgid "Upload files" +msgstr "Dosya yükle" + +msgid "Share my location" +msgstr "Konumumu paylaş" + +msgid "Clear chat" +msgstr "Geçmiş yazıları sil" + +msgid "is typing..." +msgstr "yazıyor..." + +msgid "has stopped typing..." +msgstr "yazmayı bitirdi..." + +msgid "Type here to chat..." +msgstr "Chatleşmek için buraya yazın..." + +msgid "Send" +msgstr "Gönder" + +msgid "Accept" +msgstr "Kabul et" + +msgid "Reject" +msgstr "Reddet" + +msgid "You have no contacts." +msgstr "Hiç tanıdığınız yok" + +msgid "" +"To add new contacts, join a room and create a contact add request by " +"clicking on the star icon next to a user entry." +msgstr "Yeni tanıdıklar eklemek için bir odaya girin ve kullanıcının girdisinin yanındaki yıldıza basarak tanışma istemi gönderin. " + +msgid "Edit contact" +msgstr "Tanıdığı değiştir" + +msgid "Edit" +msgstr "Değiştir" + +msgid "Name" +msgstr "Ad" + +msgid "Remove" +msgstr "Sil" + +msgid "Refresh" +msgstr "Güncelle" + +msgid "Save" +msgstr "Kaydet" + +msgid "Close" +msgstr "Kapat" + +msgid "File sharing" +msgstr "Dosya paylaşımı" + +msgid "File is no longer available" +msgstr "Bu dosya artık kullanılabilir değil" + +msgid "Download" +msgstr "İndir" + +msgid "Open" +msgstr "Aç" + +msgid "Unshare" +msgstr "Paylaşmayı bırak" + +msgid "Retry" +msgstr "Tekrar dene" + +msgid "Download failed." +msgstr "İndirme başarısız." + +msgid "Share a YouTube video" +msgstr "YouTube videosu paylaş" + +msgid "Share a file as presentation" +msgstr "Bir dosyadan sunum yap" + +msgid "Share your screen" +msgstr "Ekranı paylaş" + +msgid "Chat" +msgstr "Chat" + +msgid "Contacts" +msgstr "Tanıdıklar" + +msgid "Mute microphone" +msgstr "Mikrofonu kapat" + +msgid "Turn camera off" +msgstr "Kamerayı kapat" + +msgid "Settings" +msgstr "Ayarlar" + +msgid "Loading presentation ..." +msgstr "Sunum yükleniyor..." + +msgid "Please upload a document" +msgstr "Lütfen bir dosya yükleyin" + +msgid "" +"Documents are shared with everyone in this call. The supported file types" +" are PDF and OpenDocument files." +msgstr "Dosyalar bu oturumdaki herkesle paylaşılacak. Desteklenen dosya türleri: PDF ve OpenDocument." + +msgid "Upload" +msgstr "Yükle" + +msgid "You can drag files here too." +msgstr "Dosyaları buraya sürükleyebilirisiniz de." + +msgid "Presentation controls" +msgstr "Sunum kontrolleri" + +msgid "Prev" +msgstr "Önceki" + +msgid "Next" +msgstr "Sonraki" + +msgid "Change room" +msgstr "Odayı değiştir" + +msgid "Room" +msgstr "Oda" + +msgid "Leave room" +msgstr "Odadan çık" + +msgid "Main" +msgstr "Ana oda" + +msgid "Current room" +msgstr "Şu anki oda" + +msgid "Screen sharing options" +msgstr "Ekran paylaşım seçenekleri" + +msgid "Fit screen." +msgstr "Ekrana sığdır" + +msgid "Share screen" +msgstr "Ekranı paylaş" + +msgid "Please select what to share." +msgstr "Paylaşmak istediğinizi seçin." + +msgid "Screen" +msgstr "Ekran" + +msgid "Window" +msgstr "Pencere" + +msgid "Application" +msgstr "Uygulama" + +msgid "Share the whole screen. Click share to select the screen." +msgstr "Tüm ekranı paylaş. Seçmek için paylaşa basın." + +msgid "Share a single window. Click share to select the window." +msgstr "Sadece bir pencereyi paylaş. Seçmek için paylaşa basın." + +msgid "" +"Share all windows of a application. This can leak content behind windows " +"when windows get moved. Click share to select the application." +msgstr "Bir uygulamanın tüm pencerelerini paylaş. Bu seçim pencereler " +"oynatıldığında arkalarındaki nesnelerin görünmesine yol açabilir. Seçmek için paylaşa basın." + +msgid "Share" +msgstr "Paylaş" + +msgid "OK" +msgstr "Tamam" + +msgid "Profile" +msgstr "Profil" + +msgid "Your name" +msgstr "Adınız" + +msgid "Your picture" +msgstr "Resminiz" + +msgid "Status message" +msgstr "Durum bildirimi" + +msgid "What's on your mind?" +msgstr "Aklınızdan neler geçiyor?" + +msgid "" +"Your picture, name and status message identify yourself in calls, chats " +"and rooms." +msgstr "Resminiz, adınız ve durum bildiriminiz arama ve odalarda sizi tanıtır." + +msgid "Your ID" +msgstr "Kullanıcı adınız" + +msgid "" +"Authenticated by certificate. To log out you have to remove your " +"certificate from the browser." +msgstr "Sertıfıka ile doğrulama yapıldı. Hesabınızdan çıkmak istediğinizde sertifikayı taraıcınızdan kaldırmalısınız." + +msgid "Sign in" +msgstr "Gir" + +msgid "Create an account" +msgstr "Hesap oluştur" + +msgid "Sign out" +msgstr "Güvenli çıkış" + +msgid "Manage account" +msgstr "Hesabım" + +msgid "Media" +msgstr "Media" + +msgid "Microphone" +msgstr "Mikrofon" + +msgid "Camera" +msgstr "Kamera" + +msgid "Video quality" +msgstr "Görüntü kalitesi" + +msgid "Low" +msgstr "Düşük" + +msgid "High" +msgstr "Yüksek" + +msgid "HD" +msgstr "HD" + +msgid "Full HD" +msgstr "Full HD" + +msgid "General" +msgstr "Genel" + +msgid "Language" +msgstr "Dil" + +msgid "Language changes become active on reload." +msgstr "Dil değişiklikleri sayfa yeniden yüklendiğinde yürülüğe girer." + +msgid "Default room" +msgstr "Temel oda" + +msgid "Set alternative room to join at start." +msgstr "Başlangıçta girilecek başka bir oda seçin." + +msgid "Notifications" +msgstr "Bilgilendirmeler" + +msgid "Desktop notification" +msgstr "Masaüstü bilgilendirmeleri" + +msgid "Enable" +msgstr "Aktifle" + +msgid "Denied - check your browser settings" +msgstr "Reddedildi - tarayıcı ayarlarınızı kontrol edin." + +msgid "Allowed" +msgstr "Onaylandı" + +msgid "Sounds for incoming messages" +msgstr "Gelen mesajlar için ses" + +msgid "Ring on incoming calls" +msgstr "Gelen arama olursa sesli uyar" + +msgid "Sounds for users in current room" +msgstr "Odadaki mevcut kullanıcılar için sesli uyarılar" + +msgid "Advanced settings" +msgstr "Gelişmiş ayarlar" + +msgid "Play audio on same device as selected microphone" +msgstr "Mikrofonla aynı cihazdaki hoparlörü kullan" + +msgid "Experimental AEC" +msgstr "Deneysel AEC" + +msgid "Experimental AGC" +msgstr "Deneysel AGC" + +msgid "Experimental noise suppression" +msgstr "Deneysel gürültü filtresi" + +msgid "Max video frame rate" +msgstr "Maks. çerçeve hızı" + +msgid "auto" +msgstr "Otomatik" + +msgid "Send stereo audio" +msgstr "Stereo ses gönder" + +msgid "" +"Sending stereo audio disables echo cancellation. Enable only if you have " +"stereo input." +msgstr "Stereo ses gönderimi yankı baskılamayı kaldırır. Sadece stereo ses alıcınız varsa kullanınız." + +msgid "Detect CPU over use" +msgstr "İşlemci aşırı kullanımını tespit et" + +msgid "Automatically reduces video quality as needed." +msgstr "Gerektiğinde görüntü kalitesini otomatik olarak düşür." + +msgid "Optimize for high resolution video" +msgstr "Yüksek çözünürlüklü görüntü için en iyi hale getir" + +msgid "Reduce video noise" +msgstr "Görüntüdeki gürültüyü azalt" + +msgid "Prefer VP9 video codec" +msgstr "VP9 codec tercih et" + +msgid "Enable experiments" +msgstr "Deneysel fonksiyonları kullan" + +msgid "Show advanced settings" +msgstr "Gelişmiş seçenekleri göster" + +msgid "Hide advanced settings" +msgstr "Gelişmiş seçenekleri sakla" + +msgid "Remember settings" +msgstr "Ayarları hatırla" + +msgid "" +"Your ID will still be kept - press the log out button above to delete the" +" ID." +msgstr "Kullanıcı adınız saklanacak - silmek için yukarıdaki çıkış tuşuna basın" + +msgid "Room PIN" +msgstr "Oda anahtarı" + +msgid "Room link" +msgstr "Oda bağlantısı" + +msgid "Invite by Email" +msgstr "E-posta ile çağır" + +msgid "Invite with Facebook" +msgstr "Facebook ile çağır" + +msgid "Invite with Twitter" +msgstr "Twıtter ile çağır" + +msgid "Invite with Google Plus" +msgstr "Google Plus ile çağıt" + +msgid "Invite with XING" +msgstr "XING ile çağır" + +msgid "Initializing" +msgstr "Başlatılıyor" + +msgid "Online" +msgstr "Online" + +msgid "Calling" +msgstr "Arıyor" + +msgid "Hangup" +msgstr "Sonlandır" + +msgid "In call with" +msgstr "Konuştuğu kişi" + +msgid "Conference with" +msgstr "Görüştüğü kişi" + +msgid "Your are offline" +msgstr "Çevrimdışısınız" + +msgid "Go online" +msgstr "Bağlan" + +msgid "Connection interrupted" +msgstr "Bağlantı koptu" + +msgid "An error occured" +msgstr "Bir hata oluştu" + +msgid "Incoming call" +msgstr "Gelen arama" + +msgid "from" +msgstr "arayan" + +msgid "Accept call" +msgstr "Aç" + +msgid "Waiting for camera/microphone access" +msgstr "Kamera/mikrofon bekleniyor" + +msgid "Your audio level" +msgstr "Ses seviyeniz" + +msgid "Checking camera and microphone access." +msgstr "Kamera ve mikrofon bağlantısı deneniyor" + +msgid "Please allow access to your camera and microphone." +msgstr "Lütfen kamera ve mikrofon bağlantısına izin verin." + +msgid "Camera / microphone access required." +msgstr "Kamera / mikrofon erişimi gerekli." + +msgid "" +"Please check your browser settings and allow camera and microphone access" +" for this site." +msgstr "Tarayıcı ayarlarınızı konrol ederek kamera ve mikrofona bu site" +" için erişim izni verin" + +msgid "Skip check" +msgstr "Kontrolü atla" + +msgid "Click here for help (Google Chrome)." +msgstr "Yardım için buraya tıklayın (Google Chrome)." + +msgid "Please set your user details and settings." +msgstr "Kullanıcı bilgi ve ayarlarınızı yapın." + +msgid "Enter a room name" +msgstr "Oda adı girin" + +msgid "Random room name" +msgstr "Rastgele bir oda adı" + +msgid "Enter room" +msgstr "Odaya gir" + +msgid "" +"Enter the name of an existing room. You can create new rooms when you are" +" signed in." +msgstr "Mevcut odalardan birinin adını yazın. Yeni bir odayı ancak giriş" +" yaptıktan sonra oluşturabilirsiniz." + +msgid "Room history" +msgstr "Oda geçmişi" + +msgid "Please sign in." +msgstr "Lütfen giriş yapın." + +msgid "Videos play simultaneously for everyone in this call." +msgstr "Videolar bu aramadaki herkese eşzamanlı gösterilir." + +msgid "YouTube URL" +msgstr "YouTube URL" + +msgid "" +"Could not load YouTube player API, please check your network / firewall " +"settings." +msgstr "" +"YouTube-çalar yükelenemedi, lütfen bağlantı ve firewall ayarlarınızı kontrol edin." + +msgid "Currently playing" +msgstr "Şu an çalan" + +msgid "YouTube controls" +msgstr "YouTube ayarları" + +msgid "YouTube video to share" +msgstr "Paylaşılacak YouTube videosu" + +msgid "Peer to peer chat active." +msgstr "Peer to peer chat aktif." + +msgid "Peer to peer chat is now off." +msgstr "Peer to peer chat inaktif." + +msgid " is now offline." +msgstr " şu anda çevrim dışı." + +msgid " is now online." +msgstr " şimdi online." + +msgid "You share file:" +msgstr "Şu dosyayı paylaşıyorsunuz:" + +msgid "Incoming file:" +msgstr "Gelen dosya:" + +msgid "You shared your location:" +msgstr "Konumunuzu paylaştınız:" + +msgid "Location received:" +msgstr "Konum alındı:" + +msgid "You accepted the contact request." +msgstr "Tanışma isteğini kabul ettiniz." + +msgid "You rejected the contact request." +msgstr "Tanışma isteğini reddettiniz." + +msgid "You sent a contact request." +msgstr "Tanışma isteği gönderdiniz." + +msgid "Your contact request was accepted." +msgstr "Tanışma isteğiniz kabul edildi." + +msgid "Incoming contact request." +msgstr "Sizinle tanışmak isteyen biri var." + +msgid "Your contact request was rejected." +msgstr "Tanışma isteğiniz reddedildi." + +msgid "Edit Contact" +msgstr "Tanıdığı değiştir" + +msgid "Your browser does not support WebRTC. No calls possible." +msgstr "Tarayıcınızın WebRTC desteği yok. Hiçbir arama yapılamaz." + +msgid "Close this window and disconnect?" +msgstr "Pencereyi kapat ve çık?" + +msgid "Contacts Manager" +msgstr "Tanıdık yöneticisi" + +msgid "Restart required to apply updates. Click ok to restart now." +msgstr "Güncellemeler için yeniden başlatmanız gerekli. Şimdi yeniden " +"başlatmak için tamama basın." + +msgid "Failed to access camera/microphone." +msgstr "Kamera/mikrofon bağlantısı başarısız." + +msgid "Failed to establish peer connection." +msgstr "Kişiye bağlantı başarısız." + +msgid "We are sorry but something went wrong. Boo boo." +msgstr "Üzgünüz ama bir terslik oldu. Yuuuuuh." + +msgid "Oops" +msgstr "Eyvah" + +msgid "Peer connection failed. Check your settings." +msgstr "Kişiye bağlantı başarısız. Ayarlarınızı kontrol edin." + +msgid "User hung up because of error." +msgstr "Bir hata sebebiyle kullanıcı bağlantıyı sonlandırdı" + +msgid " is busy. Try again later." +msgstr " şu an meşgul. Daha sonra tekrar deneyin." + +msgid " rejected your call." +msgstr " aramanızı reddetti." + +msgid " does not pick up." +msgstr " telefonu açmıyor." + +msgid " tried to call you" +msgstr " sizi aramaya çalıştı" + +msgid " called you" +msgstr " sizi aradı" + +msgid "Your browser is not supported. Please upgrade to a current version." +msgstr "Tarayıcınız uyumsuz. Lütfen güncelleyin. " + +msgid "Chat with" +msgstr "Chat arkadaşınız" + +msgid "Message from " +msgstr "Mesaj gönderen " + +#, python-format +msgid "You are now in room %s ..." +msgstr "Şimdi %s odadasındasınız..." + +msgid "Your browser does not support file transfer." +msgstr "Tarayıcınız dosya alışverişine uyumlu değil." + +msgid "Could not load PDF: Please make sure to select a PDF document." +msgstr "PDF yüklenemedi: lütfen bir PDF dosyası seçtiğinizden emin olun." + +msgid "Could not load PDF: Missing PDF file." +msgstr "PDF yüklenemedi: dosya bulunamadı." + +#, python-format +msgid "An error occurred while loading the PDF (%s)." +msgstr "PDFyi yüklerken bir hata oluştu (%s)" + +msgid "An unknown error occurred while loading the PDF." +msgstr "PDFyi yüklerken bilinmeyen bir hata oluştu." + +#, python-format +msgid "An error occurred while loading the PDF page (%s)." +msgstr "PDF sayfasını yüklerken bir hata oluştu (%s)" + +msgid "An unknown error occurred while loading the PDF page." +msgstr "PDF sayfasını yüklerken bilinmeyen bir hata oluştu." + +#, python-format +msgid "An error occurred while rendering the PDF page (%s)." +msgstr "PDF sayfasını işlerken bir hata oluştu (%s)" + +msgid "An unknown error occurred while rendering the PDF page." +msgstr "PDF sayfasını işlerken bilinmeyen bir hata oluştu." + +msgid "Only PDF documents and OpenDocument files can be shared at this time." +msgstr "Şu anda sadece PDF ve OpenDocument dosyaları paylaşılabilmektedir." + +#, python-format +msgid "Failed to start screen sharing (%s)." +msgstr "Ekran paylaşımı başarısız (%s)." + +msgid "" +"Permission to start screen sharing was denied. Make sure to have enabled " +"screen sharing access for your browser. Copy chrome://flags/#enable-" +"usermedia-screen-capture and open it with your browser and enable the " +"flag on top. Then restart the browser and you are ready to go." +msgstr "Ekran paylaşma izni reddedildi. Tarayıcınızın ekran paylaşımına " +"izin verdiğinden emin olun. chrome://flags/#enable-usermedia-screen-capture" +" adresini tarayıcınızda açin ve en üstteki kutucuğu seçin. Tarayıcınızı tekrar" +" başlattıktan sonra her şey hazır." + +msgid "Permission to start screen sharing was denied." +msgstr "Ekran paylaşımı denemesi engellendi." + +msgid "Use browser language" +msgstr "Tarayıcının dilini kullan" + +msgid "Meet with me here:" +msgstr "Şurada buluşalım:" + +msgid "Please enter a new Room PIN to lock the room" +msgstr "Odayı kilitlemek için bir şifre verin" + +msgid "Do you want to unlock the room?" +msgstr "Odayı herkese açmak istiyor musunuz?" + +msgid "Room name" +msgstr "Oda adı" + +msgid "" +"The request contains an invalid parameter value. Please check the URL of " +"the video you want to share and try again." +msgstr "" +"İsteminiz geçersiz bir parametre içeriyor. Video URLsini kontrol ettikten " +"sonra tekrar deneyin." + +msgid "" +"The requested content cannot be played in an HTML5 player or another " +"error related to the HTML5 player has occurred. Please try again later." +msgstr "" +"İstediğiniz obje HTML5-çalar ile gösterime uygun değil veya başka bir" +" HTML5-çalar hatası oluştı. Daha sonra tekrar deneyin." + +msgid "" +"The video requested was not found. Please check the URL of the video you " +"want to share and try again." +msgstr "" +"İstediğiniz video bulunamadı. Paylaşmak istediğiniz videonun URLsini" +" kontrol edip tekrar deneyin." + +msgid "" +"The owner of the requested video does not allow it to be played in " +"embedded players." +msgstr "" +"İstediğiniz videonun sahibi gömülü programlar ile gösterilmesine" +" izin vermiyor." + +#, python-format +msgid "" +"An unknown error occurred while playing back the video (%s). Please try " +"again later." +msgstr "" +"Video gösterimi sırasında bilinmeyen bir hata oluştu (%s). Lütfen daha" +" sonra tekrar deneyin." + +msgid "" +"An unknown error occurred while playing back the video. Please try again " +"later." +msgstr "" +"Video gösterimi sırasında bilinmeyen bir hata oluştu. Lütfen daha" +" sonra tekrar deneyin." + +msgid "Unknown URL format. Please make sure to enter a valid YouTube URL." +msgstr "Bilinmeyen URL formatı. geçerli bir YouTube linki girdiğinizi kontrol edin." + +msgid "Error" +msgstr "Hata" + +msgid "Hint" +msgstr "İpucu" + +msgid "Please confirm" +msgstr "Teyit ediniz" + +msgid "More information required" +msgstr "Daha fazla bilgi gerekli" + +msgid "Ok" +msgstr "Tamam" + +msgid "" +"Screen sharing requires a browser extension. Please add the Spreed WebRTC" +" screen sharing extension to Chrome and try again." +msgstr "" +"Ekran paylaşımı bir tarayıcı eklentisi gerektiriyor. Spreed WebRTC" +" eklentisini Chrome'a ekledikten sonra tekrar deneyin." + +msgid "Access code required" +msgstr "Şifre gerekli" + +msgid "Access denied" +msgstr "Erişim reddedildi" + +msgid "Please provide a valid access code." +msgstr "Lütfen geçerli bir şifre girin." + +msgid "" +"Failed to verify access code. Check your Internet connection and try " +"again." +msgstr "" +"Şifre doğrulanamadı. İnternet bağlantınızı kontrol edip tekrar deneyin." + +#, python-format +msgid "PIN for room %s is now '%s'." +msgstr "%s odasının şifresi artık '%s'." + +#, python-format +msgid "PIN lock has been removed from room %s." +msgstr "%s odasının şifre koruması kaldırıldı." + +#, python-format +msgid "Enter the PIN for room %s" +msgstr "%s odasının şifresini girin" + +msgid "Please sign in to create rooms." +msgstr "Yeni bir oda oluşturabilmek için giriş yapın." + +#, python-format +msgid "and %s" +msgstr "ve %s" + +#, python-format +msgid "and %d others" +msgstr "ve diğer %d kişi" + +msgid "User" +msgstr "Kullanıcı" + +msgid "Someone" +msgstr "Birisi" + +msgid "Me" +msgstr "Ben" diff --git a/static/translation/messages-zh-cn.json b/static/translation/messages-zh-cn.json index cf11a9c3..0484a4f8 100644 --- a/static/translation/messages-zh-cn.json +++ b/static/translation/messages-zh-cn.json @@ -1 +1 @@ -{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=1; plural=0"},"Standard view":[""],"Large view":[""],"Kiosk view":[""],"Auditorium":[""],"Start chat":["开始聊天"],"Start video call":["开始视频通话"],"Start audio conference":["开始语音会议"],"No one else here":[""],"Take":[""],"Retake":[""],"Cancel":["取消"],"Set as Profile Picture":[""],"Take picture":["拍照"],"Waiting for camera":["等待启动摄像头"],"The file couldn't be read.":[""],"The file is not an image.":[""],"The file is too large. Max. %d MB.":[""],"Select file":[""],"Chat sessions":["会话"],"Room chat":["房间聊天"],"Peer to peer":["P2P"],"Close chat":["关闭聊天"],"Share my location":[""],"is typing...":["正在输入..."],"has stopped typing...":["停止输入..."],"Type here to chat...":["在此输入开始聊天..."],"Send":["发送"],"Accept":[""],"Reject":["拒绝"],"You have no contacts.":[""],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":[""],"Edit contact":[""],"Edit":[""],"Name":["名字"],"Remove":[""],"Refresh":[""],"Save":[""],"Close":["关闭"],"File sharing":["分享文件"],"File is no longer available":["文件已不存在"],"Download":["下载"],"Open":["打开"],"Unshare":["停止分享"],"Retry":["重试"],"Download failed.":["下载失败"],"Share a YouTube video":[""],"Share a file as presentation":[""],"Share your screen":["共享您的屏幕"],"Chat":["聊天"],"Contacts":[""],"Mute microphone":["关闭麦克风"],"Turn camera off":["关闭摄像头"],"Settings":["系统设置"],"Loading presentation ...":[""],"Please upload a document":[""],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":[""],"Upload":[""],"You can drag files here too.":[""],"Presentation controls":[""],"Prev":[""],"Next":[""],"Change room":["更换房间"],"Room":["房间"],"Leave room":["离开房间"],"Main":["主房间"],"Current room":["當前房间"],"Screen sharing options":["屏幕共享设置"],"Fit screen.":["适合屏幕"],"Please select what to share.":[""],"Window":[""],"Application":[""],"Share the whole screen. Click share to select the screen.":[""],"Share a single window. Click share to select the window.":[""],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":[""],"OK":[""],"Profile":[""],"Your name":["您的名字"],"Your picture":["您的图片"],"Status message":[""],"What's on your mind?":[""],"Your picture, name and status message identify yourself in calls, chats and rooms.":[""],"Your ID":[""],"Register":[""],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":[""],"Sign in":[""],"Create an account":[""],"Sign out":[""],"Manage account":[""],"Media":[""],"Microphone":["麦克风"],"Camera":["摄像头"],"Video quality":["视频质量"],"Low":["低"],"High":["高"],"HD":["高清"],"Full HD":[""],"General":[""],"Language":["语言"],"Language changes become active on reload.":["转换语言需重启程序"],"Default room":["系统默认房间"],"Set alternative room to join at start.":["重设初始默认房间"],"Desktop notification":["桌面提醒"],"Enable":["开启"],"Denied - check your browser settings":["被拒绝--请检查浏览器设置"],"Allowed":["启用"],"Sounds for incoming messages":[""],"Sounds for users in current room":[""],"Advanced settings":["高级设置"],"Play audio on same device as selected microphone":[""],"Experimental AEC":[""],"Experimental AGC":[""],"Experimental noise suppression":[""],"Max video frame rate":["最大视频帧速率"],"auto":["自动"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":[""],"Detect CPU over use":[""],"Automatically reduces video quality as needed.":[""],"Optimize for high resolution video":[""],"Reduce video noise":[""],"Prefer VP9 video codec":[""],"Enable experiments":[""],"Show advanced settings":["展开高级设置"],"Hide advanced settings":["隐藏高级设置"],"Remember settings":["记住设置"],"Your ID will still be kept - press the log out button above to delete the ID.":[""],"Room link":[""],"Invite with Facebook":[""],"Invite with Twitter":[""],"Invite with Google Plus":[""],"Invite with XING":[""],"Initializing":["初始化"],"Online":["在线"],"Calling":["呼叫中"],"Hangup":["挂断"],"In call with":["正在和**通话"],"Conference with":["和**会议通话"],"Your are offline":["您不在线"],"Go online":["上线"],"Connection interrupted":["连接已中断"],"An error occured":["出现错误"],"Incoming call":["来电"],"from":["来自"],"Accept call":["接受通话"],"Waiting for camera/microphone access":["等待摄像头/麦克风连接"],"Your audio level":["您的通话音量"],"Checking camera and microphone access.":["正在检查摄像头及麦克风连接"],"Please allow access to your camera and microphone.":["请允许连接您的摄像头及麦克风"],"Camera / microphone access required.":["需连接摄像头/麦克风"],"Please check your browser settings and allow camera and microphone access for this site.":["请检查浏览器设置并允许摄像头及麦克风连接此网站"],"Skip check":["越过检查"],"Click here for help (Google Chrome).":["点击这里获取帮助 (Google Chrome)"],"Please set your user details and settings.":["请设定您的用户信息及设置"],"Enter a room name":[""],"Random room name":[""],"Enter the name of an existing room. You can create new rooms when you are signed in.":[""],"Room history":[""],"Please sign in.":[""],"Videos play simultaneously for everyone in this call.":[""],"YouTube URL":[""],"Could not load YouTube player API, please check your network / firewall settings.":[""],"Currently playing":[""],"YouTube controls":[""],"YouTube video to share":[""],"Peer to peer chat active.":["P2P聊天已启动"],"Peer to peer chat is now off.":["P2P现在未启动"]," is now offline.":[" 不在线"]," is now online.":[" 现在在线"],"You share file:":["分享文件:"],"Incoming file:":["发来文件:"],"You shared your location:":[""],"Location received:":[""],"You accepted the contact request.":[""],"You rejected the contact request.":[""],"You sent a contact request.":[""],"Your contact request was accepted.":[""],"Incoming contact request.":[""],"Your contact request was rejected.":[""],"Edit Contact":[""],"Your browser does not support WebRTC. No calls possible.":["您的浏览器不支持WebRTC。不能进行通话。"],"Close this window and disconnect?":[""],"Contacts Manager":[""],"Restart required to apply updates. Click ok to restart now.":["适用更新需重启,现在点击Ok重新启动。"],"Failed to access camera/microphone.":["摄像头/麦克风连接失败"],"Failed to establish peer connection.":["对等连接建立失败"],"We are sorry but something went wrong. Boo boo.":["很抱歉,有错误发生。"],"Oops":["Oops"],"Peer connection failed. Check your settings.":["对等连接失败,请检查设置。"],"User hung up because of error.":["用户因错误挂断"]," is busy. Try again later.":[" 正在通话,请稍后再试。"]," rejected your call.":[" 拒绝了您的呼叫。"]," does not pick up.":[" 无人接听。"],"Chat with":["与**聊天"],"Message from ":["来自于**的信息"],"You are now in room %s ...":["您在 %s 房间"],"Your browser does not support file transfer.":["您的浏览器不支持文件传输"],"Could not load PDF: Please make sure to select a PDF document.":[""],"Could not load PDF: Missing PDF file.":[""],"An error occurred while loading the PDF (%s).":[""],"An unknown error occurred while loading the PDF.":[""],"An error occurred while loading the PDF page (%s).":[""],"An unknown error occurred while loading the PDF page.":[""],"An error occurred while rendering the PDF page (%s).":[""],"An unknown error occurred while rendering the PDF page.":[""],"Only PDF documents and OpenDocument files can be shared at this time.":[""],"Failed to start screen sharing (%s).":[""],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["启动屏幕共享许可被拒绝。请确认您已开启浏览器屏幕共享连接。请复制chrome://flags/#enable-usermedia-screen-capture并用您的浏览器打开,启用最上端的功能。然后重启浏览器,操作完成。"],"Permission to start screen sharing was denied.":[""],"Use browser language":["使用浏览器语言"],"Meet with me here:":["我们这里见:"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":[""],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":[""],"The video requested was not found. Please check the URL of the video you want to share and try again.":[""],"The owner of the requested video does not allow it to be played in embedded players.":[""],"An unknown error occurred while playing back the video (%s). Please try again later.":[""],"An unknown error occurred while playing back the video. Please try again later.":[""],"Unknown URL format. Please make sure to enter a valid YouTube URL.":[""],"Error":["错误"],"Hint":["提示"],"Please confirm":["请确认"],"More information required":["需要更多信息"],"Ok":["Ok"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":[""],"Access code required":["需要接入码"],"Access denied":["连接被拒绝"],"Please provide a valid access code.":["请提供有效接入码"],"Failed to verify access code. Check your Internet connection and try again.":["接入码认证失败。请检查您的网络连接并重试。"],"PIN for room %s is now '%s'.":[""],"PIN lock has been removed from room %s.":[""],"Enter the PIN for room %s":[""],"Please sign in to create rooms.":[""],"and %s":[""],"and %d others":[""],"User":["用户"],"Someone":["某人"],"Me":["我"]}}} \ No newline at end of file +{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=1; plural=0"},"Standard view":[""],"Large view":[""],"Kiosk view":[""],"Auditorium":[""],"Start chat":["开始聊天"],"Start video call":["开始视频通话"],"Start audio conference":["开始语音会议"],"No one else here":[""],"Take":[""],"Retake":[""],"Cancel":["取消"],"Set as Profile Picture":[""],"Take picture":["拍照"],"Waiting for camera":["等待启动摄像头"],"The file couldn't be read.":[""],"The file is not an image.":[""],"The file is too large. Max. %d MB.":[""],"Select file":[""],"Chat sessions":["会话"],"Room chat":["房间聊天"],"Peer to peer":["P2P"],"Close chat":["关闭聊天"],"Share my location":[""],"is typing...":["正在输入..."],"has stopped typing...":["停止输入..."],"Type here to chat...":["在此输入开始聊天..."],"Send":["发送"],"Accept":[""],"Reject":["拒绝"],"You have no contacts.":[""],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":[""],"Edit contact":[""],"Edit":[""],"Name":["名字"],"Remove":[""],"Refresh":[""],"Save":[""],"Close":["关闭"],"File sharing":["分享文件"],"File is no longer available":["文件已不存在"],"Download":["下载"],"Open":["打开"],"Unshare":["停止分享"],"Retry":["重试"],"Download failed.":["下载失败"],"Share a YouTube video":[""],"Share a file as presentation":[""],"Share your screen":["共享您的屏幕"],"Chat":["聊天"],"Contacts":[""],"Mute microphone":["关闭麦克风"],"Turn camera off":["关闭摄像头"],"Settings":["系统设置"],"Loading presentation ...":[""],"Please upload a document":[""],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":[""],"Upload":[""],"You can drag files here too.":[""],"Presentation controls":[""],"Prev":[""],"Next":[""],"Change room":["更换房间"],"Room":["房间"],"Leave room":["离开房间"],"Main":["主房间"],"Current room":["當前房间"],"Screen sharing options":["屏幕共享设置"],"Fit screen.":["适合屏幕"],"Please select what to share.":[""],"Window":[""],"Application":[""],"Share the whole screen. Click share to select the screen.":[""],"Share a single window. Click share to select the window.":[""],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":[""],"OK":[""],"Profile":[""],"Your name":["您的名字"],"Your picture":["您的图片"],"Status message":[""],"What's on your mind?":[""],"Your picture, name and status message identify yourself in calls, chats and rooms.":[""],"Your ID":[""],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":[""],"Sign in":[""],"Create an account":[""],"Sign out":[""],"Manage account":[""],"Media":[""],"Microphone":["麦克风"],"Camera":["摄像头"],"Video quality":["视频质量"],"Low":["低"],"High":["高"],"HD":["高清"],"Full HD":[""],"General":[""],"Language":["语言"],"Language changes become active on reload.":["转换语言需重启程序"],"Default room":["系统默认房间"],"Set alternative room to join at start.":["重设初始默认房间"],"Desktop notification":["桌面提醒"],"Enable":["开启"],"Denied - check your browser settings":["被拒绝--请检查浏览器设置"],"Allowed":["启用"],"Sounds for incoming messages":[""],"Sounds for users in current room":[""],"Advanced settings":["高级设置"],"Play audio on same device as selected microphone":[""],"Experimental AEC":[""],"Experimental AGC":[""],"Experimental noise suppression":[""],"Max video frame rate":["最大视频帧速率"],"auto":["自动"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":[""],"Detect CPU over use":[""],"Automatically reduces video quality as needed.":[""],"Optimize for high resolution video":[""],"Reduce video noise":[""],"Prefer VP9 video codec":[""],"Enable experiments":[""],"Show advanced settings":["展开高级设置"],"Hide advanced settings":["隐藏高级设置"],"Remember settings":["记住设置"],"Your ID will still be kept - press the log out button above to delete the ID.":[""],"Room PIN":[""],"Room link":[""],"Invite with Facebook":[""],"Invite with Twitter":[""],"Invite with Google Plus":[""],"Invite with XING":[""],"Initializing":["初始化"],"Online":["在线"],"Calling":["呼叫中"],"Hangup":["挂断"],"In call with":["正在和**通话"],"Conference with":["和**会议通话"],"Your are offline":["您不在线"],"Go online":["上线"],"Connection interrupted":["连接已中断"],"An error occured":["出现错误"],"Incoming call":["来电"],"from":["来自"],"Accept call":["接受通话"],"Waiting for camera/microphone access":["等待摄像头/麦克风连接"],"Your audio level":["您的通话音量"],"Checking camera and microphone access.":["正在检查摄像头及麦克风连接"],"Please allow access to your camera and microphone.":["请允许连接您的摄像头及麦克风"],"Camera / microphone access required.":["需连接摄像头/麦克风"],"Please check your browser settings and allow camera and microphone access for this site.":["请检查浏览器设置并允许摄像头及麦克风连接此网站"],"Skip check":["越过检查"],"Click here for help (Google Chrome).":["点击这里获取帮助 (Google Chrome)"],"Please set your user details and settings.":["请设定您的用户信息及设置"],"Enter a room name":[""],"Random room name":[""],"Enter the name of an existing room. You can create new rooms when you are signed in.":[""],"Room history":[""],"Please sign in.":[""],"Videos play simultaneously for everyone in this call.":[""],"YouTube URL":[""],"Could not load YouTube player API, please check your network / firewall settings.":[""],"Currently playing":[""],"YouTube controls":[""],"YouTube video to share":[""],"Peer to peer chat active.":["P2P聊天已启动"],"Peer to peer chat is now off.":["P2P现在未启动"]," is now offline.":[" 不在线"]," is now online.":[" 现在在线"],"You share file:":["分享文件:"],"Incoming file:":["发来文件:"],"You shared your location:":[""],"Location received:":[""],"You accepted the contact request.":[""],"You rejected the contact request.":[""],"You sent a contact request.":[""],"Your contact request was accepted.":[""],"Incoming contact request.":[""],"Your contact request was rejected.":[""],"Edit Contact":[""],"Your browser does not support WebRTC. No calls possible.":["您的浏览器不支持WebRTC。不能进行通话。"],"Close this window and disconnect?":[""],"Contacts Manager":[""],"Restart required to apply updates. Click ok to restart now.":["适用更新需重启,现在点击Ok重新启动。"],"Failed to access camera/microphone.":["摄像头/麦克风连接失败"],"Failed to establish peer connection.":["对等连接建立失败"],"We are sorry but something went wrong. Boo boo.":["很抱歉,有错误发生。"],"Oops":["Oops"],"Peer connection failed. Check your settings.":["对等连接失败,请检查设置。"],"User hung up because of error.":["用户因错误挂断"]," is busy. Try again later.":[" 正在通话,请稍后再试。"]," rejected your call.":[" 拒绝了您的呼叫。"]," does not pick up.":[" 无人接听。"],"Chat with":["与**聊天"],"Message from ":["来自于**的信息"],"You are now in room %s ...":["您在 %s 房间"],"Your browser does not support file transfer.":["您的浏览器不支持文件传输"],"Could not load PDF: Please make sure to select a PDF document.":[""],"Could not load PDF: Missing PDF file.":[""],"An error occurred while loading the PDF (%s).":[""],"An unknown error occurred while loading the PDF.":[""],"An error occurred while loading the PDF page (%s).":[""],"An unknown error occurred while loading the PDF page.":[""],"An error occurred while rendering the PDF page (%s).":[""],"An unknown error occurred while rendering the PDF page.":[""],"Only PDF documents and OpenDocument files can be shared at this time.":[""],"Failed to start screen sharing (%s).":[""],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["启动屏幕共享许可被拒绝。请确认您已开启浏览器屏幕共享连接。请复制chrome://flags/#enable-usermedia-screen-capture并用您的浏览器打开,启用最上端的功能。然后重启浏览器,操作完成。"],"Permission to start screen sharing was denied.":[""],"Use browser language":["使用浏览器语言"],"Meet with me here:":["我们这里见:"],"Please enter a new Room PIN to lock the room":[""],"Do you want to unlock the room?":[""],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":[""],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":[""],"The video requested was not found. Please check the URL of the video you want to share and try again.":[""],"The owner of the requested video does not allow it to be played in embedded players.":[""],"An unknown error occurred while playing back the video (%s). Please try again later.":[""],"An unknown error occurred while playing back the video. Please try again later.":[""],"Unknown URL format. Please make sure to enter a valid YouTube URL.":[""],"Error":["错误"],"Hint":["提示"],"Please confirm":["请确认"],"More information required":["需要更多信息"],"Ok":["Ok"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":[""],"Access code required":["需要接入码"],"Access denied":["连接被拒绝"],"Please provide a valid access code.":["请提供有效接入码"],"Failed to verify access code. Check your Internet connection and try again.":["接入码认证失败。请检查您的网络连接并重试。"],"PIN for room %s is now '%s'.":[""],"PIN lock has been removed from room %s.":[""],"Enter the PIN for room %s":[""],"Please sign in to create rooms.":[""],"and %s":[""],"and %d others":[""],"User":["用户"],"Someone":["某人"],"Me":["我"]}}} \ No newline at end of file diff --git a/static/translation/messages-zh-tw.json b/static/translation/messages-zh-tw.json index 013d2ace..18c681dd 100644 --- a/static/translation/messages-zh-tw.json +++ b/static/translation/messages-zh-tw.json @@ -1 +1 @@ -{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=1; plural=0"},"Standard view":[""],"Large view":[""],"Kiosk view":[""],"Auditorium":[""],"Start chat":["開始聊天"],"Start video call":["開始視頻通話"],"Start audio conference":["開始語音會議"],"No one else here":[""],"Take":[""],"Retake":[""],"Cancel":["取消"],"Set as Profile Picture":[""],"Take picture":["拍照"],"Waiting for camera":["等待啟動攝像頭"],"The file couldn't be read.":[""],"The file is not an image.":[""],"The file is too large. Max. %d MB.":[""],"Select file":[""],"Chat sessions":["會話"],"Room chat":["房間聊天"],"Peer to peer":["P2P"],"Close chat":["關閉聊天"],"Share my location":[""],"is typing...":["正在輸入..."],"has stopped typing...":["停止輸入..."],"Type here to chat...":["在此輸入開始聊天..."],"Send":["發送"],"Accept":[""],"Reject":["拒絕"],"You have no contacts.":[""],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":[""],"Edit contact":[""],"Edit":[""],"Name":["名字"],"Remove":[""],"Refresh":[""],"Save":[""],"Close":["關閉"],"File sharing":["分享文件"],"File is no longer available":["文件已不存在"],"Download":["下載"],"Open":["打開"],"Unshare":["停止分享"],"Retry":["重試"],"Download failed.":["下載失敗"],"Share a YouTube video":[""],"Share a file as presentation":[""],"Share your screen":["共享您的屏幕"],"Chat":["聊天"],"Contacts":[""],"Mute microphone":["關閉麥克風"],"Turn camera off":["關閉攝像頭"],"Settings":["系統設置"],"Loading presentation ...":[""],"Please upload a document":[""],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":[""],"Upload":[""],"You can drag files here too.":[""],"Presentation controls":[""],"Prev":[""],"Next":[""],"Change room":["更換房間"],"Room":["房間"],"Leave room":["離開房間"],"Main":["住房間"],"Current room":["當前房間"],"Screen sharing options":["屏幕共享設置"],"Fit screen.":["適合屏幕"],"Please select what to share.":[""],"Window":[""],"Application":[""],"Share the whole screen. Click share to select the screen.":[""],"Share a single window. Click share to select the window.":[""],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":[""],"OK":[""],"Profile":[""],"Your name":["您的名字"],"Your picture":["您的圖片"],"Status message":[""],"What's on your mind?":[""],"Your picture, name and status message identify yourself in calls, chats and rooms.":[""],"Your ID":[""],"Register":[""],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":[""],"Sign in":[""],"Create an account":[""],"Sign out":[""],"Manage account":[""],"Media":[""],"Microphone":["麥克風"],"Camera":["攝像頭"],"Video quality":["視頻質量"],"Low":["低"],"High":["高"],"HD":["高清"],"Full HD":[""],"General":[""],"Language":["語言"],"Language changes become active on reload.":["轉換語言需要重啟程序"],"Default room":["系統默認房間"],"Set alternative room to join at start.":["重設初始默認房間"],"Desktop notification":["桌面提醒"],"Enable":["開啟"],"Denied - check your browser settings":["被拒絕﹣請檢查瀏覽器設置"],"Allowed":["啟用"],"Sounds for incoming messages":[""],"Sounds for users in current room":[""],"Advanced settings":["高級設置"],"Play audio on same device as selected microphone":[""],"Experimental AEC":[""],"Experimental AGC":[""],"Experimental noise suppression":[""],"Max video frame rate":["最大視頻幀速率"],"auto":["自動"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":[""],"Detect CPU over use":[""],"Automatically reduces video quality as needed.":[""],"Optimize for high resolution video":[""],"Reduce video noise":[""],"Prefer VP9 video codec":[""],"Enable experiments":[""],"Show advanced settings":["展開高級設置"],"Hide advanced settings":["隐藏高级设置"],"Remember settings":["記住設置"],"Your ID will still be kept - press the log out button above to delete the ID.":[""],"Room link":[""],"Invite with Facebook":[""],"Invite with Twitter":[""],"Invite with Google Plus":[""],"Invite with XING":[""],"Initializing":["初始化"],"Online":["在線"],"Calling":["呼叫中"],"Hangup":["掛斷"],"In call with":["正在和**通電話"],"Conference with":["和**會議通話"],"Your are offline":["您不在線"],"Go online":["上線"],"Connection interrupted":["連接已終端"],"An error occured":["出現錯誤"],"Incoming call":["來電"],"from":["來自"],"Accept call":["接受通話"],"Waiting for camera/microphone access":["等待攝像頭/麥克風連接"],"Your audio level":["您的通話音量"],"Checking camera and microphone access.":["正在檢查攝像頭及麥克風連接"],"Please allow access to your camera and microphone.":["請允許連接您的攝像頭及麥克風"],"Camera / microphone access required.":["需連接攝像頭/麥克風"],"Please check your browser settings and allow camera and microphone access for this site.":["請檢查瀏覽器設置並允許攝像頭及麥克風連接此網站"],"Skip check":["越过检查"],"Click here for help (Google Chrome).":["點擊這裡獲取幫助 (Google Chrome)"],"Please set your user details and settings.":["請設定您的用戶信息及設置"],"Enter a room name":[""],"Random room name":[""],"Enter the name of an existing room. You can create new rooms when you are signed in.":[""],"Room history":[""],"Please sign in.":[""],"Videos play simultaneously for everyone in this call.":[""],"YouTube URL":[""],"Could not load YouTube player API, please check your network / firewall settings.":[""],"Currently playing":[""],"YouTube controls":[""],"YouTube video to share":[""],"Peer to peer chat active.":["P2P聊天啟動"],"Peer to peer chat is now off.":["P2P現在未啟動"]," is now offline.":[" 不在線"]," is now online.":[" 現在在線"],"You share file:":["分享文件:"],"Incoming file:":["發來文件:"],"You shared your location:":[""],"Location received:":[""],"You accepted the contact request.":[""],"You rejected the contact request.":[""],"You sent a contact request.":[""],"Your contact request was accepted.":[""],"Incoming contact request.":[""],"Your contact request was rejected.":[""],"Edit Contact":[""],"Your browser does not support WebRTC. No calls possible.":["您的遊覽器不支持WebRTC。不能進行通話。"],"Close this window and disconnect?":[""],"Contacts Manager":[""],"Restart required to apply updates. Click ok to restart now.":["適用更新需重啟,現在點擊Ok重新啟動。"],"Failed to access camera/microphone.":["攝像頭/麥克風連接失敗"],"Failed to establish peer connection.":["對等連接建立失敗"],"We are sorry but something went wrong. Boo boo.":["很抱歉,有序哦嗚發生......"],"Oops":["Oops"],"Peer connection failed. Check your settings.":["對等連接失敗,請檢查設置。"],"User hung up because of error.":["用戶因錯誤掛斷"]," is busy. Try again later.":[" 正在通話,請您稍後。"]," rejected your call.":[" 拒絕了您的呼叫"]," does not pick up.":[" 無人接聽。"],"Chat with":["于**聊天"],"Message from ":["來自於**的信息"],"You are now in room %s ...":["您在 %s 房間"],"Your browser does not support file transfer.":["您的遊覽器不支持文件傳輸"],"Could not load PDF: Please make sure to select a PDF document.":[""],"Could not load PDF: Missing PDF file.":[""],"An error occurred while loading the PDF (%s).":[""],"An unknown error occurred while loading the PDF.":[""],"An error occurred while loading the PDF page (%s).":[""],"An unknown error occurred while loading the PDF page.":[""],"An error occurred while rendering the PDF page (%s).":[""],"An unknown error occurred while rendering the PDF page.":[""],"Only PDF documents and OpenDocument files can be shared at this time.":[""],"Failed to start screen sharing (%s).":[""],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["啟動屏幕共享許可被拒絕。請確認您已開啟瀏覽器屏幕共享連接。請復制chrome://flags/#enable-usermedia-screen-capture並用您的瀏覽器打開,啟用最上端的功能。然後重啟瀏覽器,操作完成。"],"Permission to start screen sharing was denied.":[""],"Use browser language":["使用瀏覽器語言"],"Meet with me here:":["我們這裡見:"],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":[""],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":[""],"The video requested was not found. Please check the URL of the video you want to share and try again.":[""],"The owner of the requested video does not allow it to be played in embedded players.":[""],"An unknown error occurred while playing back the video (%s). Please try again later.":[""],"An unknown error occurred while playing back the video. Please try again later.":[""],"Unknown URL format. Please make sure to enter a valid YouTube URL.":[""],"Error":["錯誤"],"Hint":["提示"],"Please confirm":["請確認"],"More information required":["需要更多信息"],"Ok":["Ok"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":[""],"Access code required":["需要接入碼"],"Access denied":["連接被拒絕"],"Please provide a valid access code.":["請提供有效接入碼"],"Failed to verify access code. Check your Internet connection and try again.":["接入碼認證錯誤。請檢查您的網絡連接并重試。"],"PIN for room %s is now '%s'.":[""],"PIN lock has been removed from room %s.":[""],"Enter the PIN for room %s":[""],"Please sign in to create rooms.":[""],"and %s":[""],"and %d others":[""],"User":["用戶"],"Someone":["某人"],"Me":["我"]}}} \ No newline at end of file +{"domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural_forms":"nplurals=1; plural=0"},"Standard view":[""],"Large view":[""],"Kiosk view":[""],"Auditorium":[""],"Start chat":["開始聊天"],"Start video call":["開始視頻通話"],"Start audio conference":["開始語音會議"],"No one else here":[""],"Take":[""],"Retake":[""],"Cancel":["取消"],"Set as Profile Picture":[""],"Take picture":["拍照"],"Waiting for camera":["等待啟動攝像頭"],"The file couldn't be read.":[""],"The file is not an image.":[""],"The file is too large. Max. %d MB.":[""],"Select file":[""],"Chat sessions":["會話"],"Room chat":["房間聊天"],"Peer to peer":["P2P"],"Close chat":["關閉聊天"],"Share my location":[""],"is typing...":["正在輸入..."],"has stopped typing...":["停止輸入..."],"Type here to chat...":["在此輸入開始聊天..."],"Send":["發送"],"Accept":[""],"Reject":["拒絕"],"You have no contacts.":[""],"To add new contacts, join a room and create a contact add request by clicking on the star icon next to a user entry.":[""],"Edit contact":[""],"Edit":[""],"Name":["名字"],"Remove":[""],"Refresh":[""],"Save":[""],"Close":["關閉"],"File sharing":["分享文件"],"File is no longer available":["文件已不存在"],"Download":["下載"],"Open":["打開"],"Unshare":["停止分享"],"Retry":["重試"],"Download failed.":["下載失敗"],"Share a YouTube video":[""],"Share a file as presentation":[""],"Share your screen":["共享您的屏幕"],"Chat":["聊天"],"Contacts":[""],"Mute microphone":["關閉麥克風"],"Turn camera off":["關閉攝像頭"],"Settings":["系統設置"],"Loading presentation ...":[""],"Please upload a document":[""],"Documents are shared with everyone in this call. The supported file types are PDF and OpenDocument files.":[""],"Upload":[""],"You can drag files here too.":[""],"Presentation controls":[""],"Prev":[""],"Next":[""],"Change room":["更換房間"],"Room":["房間"],"Leave room":["離開房間"],"Main":["住房間"],"Current room":["當前房間"],"Screen sharing options":["屏幕共享設置"],"Fit screen.":["適合屏幕"],"Please select what to share.":[""],"Window":[""],"Application":[""],"Share the whole screen. Click share to select the screen.":[""],"Share a single window. Click share to select the window.":[""],"Share all windows of a application. This can leak content behind windows when windows get moved. Click share to select the application.":[""],"OK":[""],"Profile":[""],"Your name":["您的名字"],"Your picture":["您的圖片"],"Status message":[""],"What's on your mind?":[""],"Your picture, name and status message identify yourself in calls, chats and rooms.":[""],"Your ID":[""],"Authenticated by certificate. To log out you have to remove your certificate from the browser.":[""],"Sign in":[""],"Create an account":[""],"Sign out":[""],"Manage account":[""],"Media":[""],"Microphone":["麥克風"],"Camera":["攝像頭"],"Video quality":["視頻質量"],"Low":["低"],"High":["高"],"HD":["高清"],"Full HD":[""],"General":[""],"Language":["語言"],"Language changes become active on reload.":["轉換語言需要重啟程序"],"Default room":["系統默認房間"],"Set alternative room to join at start.":["重設初始默認房間"],"Desktop notification":["桌面提醒"],"Enable":["開啟"],"Denied - check your browser settings":["被拒絕﹣請檢查瀏覽器設置"],"Allowed":["啟用"],"Sounds for incoming messages":[""],"Sounds for users in current room":[""],"Advanced settings":["高級設置"],"Play audio on same device as selected microphone":[""],"Experimental AEC":[""],"Experimental AGC":[""],"Experimental noise suppression":[""],"Max video frame rate":["最大視頻幀速率"],"auto":["自動"],"Sending stereo audio disables echo cancellation. Enable only if you have stereo input.":[""],"Detect CPU over use":[""],"Automatically reduces video quality as needed.":[""],"Optimize for high resolution video":[""],"Reduce video noise":[""],"Prefer VP9 video codec":[""],"Enable experiments":[""],"Show advanced settings":["展開高級設置"],"Hide advanced settings":["隐藏高级设置"],"Remember settings":["記住設置"],"Your ID will still be kept - press the log out button above to delete the ID.":[""],"Room PIN":[""],"Room link":[""],"Invite with Facebook":[""],"Invite with Twitter":[""],"Invite with Google Plus":[""],"Invite with XING":[""],"Initializing":["初始化"],"Online":["在線"],"Calling":["呼叫中"],"Hangup":["掛斷"],"In call with":["正在和**通電話"],"Conference with":["和**會議通話"],"Your are offline":["您不在線"],"Go online":["上線"],"Connection interrupted":["連接已終端"],"An error occured":["出現錯誤"],"Incoming call":["來電"],"from":["來自"],"Accept call":["接受通話"],"Waiting for camera/microphone access":["等待攝像頭/麥克風連接"],"Your audio level":["您的通話音量"],"Checking camera and microphone access.":["正在檢查攝像頭及麥克風連接"],"Please allow access to your camera and microphone.":["請允許連接您的攝像頭及麥克風"],"Camera / microphone access required.":["需連接攝像頭/麥克風"],"Please check your browser settings and allow camera and microphone access for this site.":["請檢查瀏覽器設置並允許攝像頭及麥克風連接此網站"],"Skip check":["越过检查"],"Click here for help (Google Chrome).":["點擊這裡獲取幫助 (Google Chrome)"],"Please set your user details and settings.":["請設定您的用戶信息及設置"],"Enter a room name":[""],"Random room name":[""],"Enter the name of an existing room. You can create new rooms when you are signed in.":[""],"Room history":[""],"Please sign in.":[""],"Videos play simultaneously for everyone in this call.":[""],"YouTube URL":[""],"Could not load YouTube player API, please check your network / firewall settings.":[""],"Currently playing":[""],"YouTube controls":[""],"YouTube video to share":[""],"Peer to peer chat active.":["P2P聊天啟動"],"Peer to peer chat is now off.":["P2P現在未啟動"]," is now offline.":[" 不在線"]," is now online.":[" 現在在線"],"You share file:":["分享文件:"],"Incoming file:":["發來文件:"],"You shared your location:":[""],"Location received:":[""],"You accepted the contact request.":[""],"You rejected the contact request.":[""],"You sent a contact request.":[""],"Your contact request was accepted.":[""],"Incoming contact request.":[""],"Your contact request was rejected.":[""],"Edit Contact":[""],"Your browser does not support WebRTC. No calls possible.":["您的遊覽器不支持WebRTC。不能進行通話。"],"Close this window and disconnect?":[""],"Contacts Manager":[""],"Restart required to apply updates. Click ok to restart now.":["適用更新需重啟,現在點擊Ok重新啟動。"],"Failed to access camera/microphone.":["攝像頭/麥克風連接失敗"],"Failed to establish peer connection.":["對等連接建立失敗"],"We are sorry but something went wrong. Boo boo.":["很抱歉,有序哦嗚發生......"],"Oops":["Oops"],"Peer connection failed. Check your settings.":["對等連接失敗,請檢查設置。"],"User hung up because of error.":["用戶因錯誤掛斷"]," is busy. Try again later.":[" 正在通話,請您稍後。"]," rejected your call.":[" 拒絕了您的呼叫"]," does not pick up.":[" 無人接聽。"],"Chat with":["于**聊天"],"Message from ":["來自於**的信息"],"You are now in room %s ...":["您在 %s 房間"],"Your browser does not support file transfer.":["您的遊覽器不支持文件傳輸"],"Could not load PDF: Please make sure to select a PDF document.":[""],"Could not load PDF: Missing PDF file.":[""],"An error occurred while loading the PDF (%s).":[""],"An unknown error occurred while loading the PDF.":[""],"An error occurred while loading the PDF page (%s).":[""],"An unknown error occurred while loading the PDF page.":[""],"An error occurred while rendering the PDF page (%s).":[""],"An unknown error occurred while rendering the PDF page.":[""],"Only PDF documents and OpenDocument files can be shared at this time.":[""],"Failed to start screen sharing (%s).":[""],"Permission to start screen sharing was denied. Make sure to have enabled screen sharing access for your browser. Copy chrome://flags/#enable-usermedia-screen-capture and open it with your browser and enable the flag on top. Then restart the browser and you are ready to go.":["啟動屏幕共享許可被拒絕。請確認您已開啟瀏覽器屏幕共享連接。請復制chrome://flags/#enable-usermedia-screen-capture並用您的瀏覽器打開,啟用最上端的功能。然後重啟瀏覽器,操作完成。"],"Permission to start screen sharing was denied.":[""],"Use browser language":["使用瀏覽器語言"],"Meet with me here:":["我們這裡見:"],"Please enter a new Room PIN to lock the room":[""],"Do you want to unlock the room?":[""],"The request contains an invalid parameter value. Please check the URL of the video you want to share and try again.":[""],"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. Please try again later.":[""],"The video requested was not found. Please check the URL of the video you want to share and try again.":[""],"The owner of the requested video does not allow it to be played in embedded players.":[""],"An unknown error occurred while playing back the video (%s). Please try again later.":[""],"An unknown error occurred while playing back the video. Please try again later.":[""],"Unknown URL format. Please make sure to enter a valid YouTube URL.":[""],"Error":["錯誤"],"Hint":["提示"],"Please confirm":["請確認"],"More information required":["需要更多信息"],"Ok":["Ok"],"Screen sharing requires a browser extension. Please add the Spreed WebRTC screen sharing extension to Chrome and try again.":[""],"Access code required":["需要接入碼"],"Access denied":["連接被拒絕"],"Please provide a valid access code.":["請提供有效接入碼"],"Failed to verify access code. Check your Internet connection and try again.":["接入碼認證錯誤。請檢查您的網絡連接并重試。"],"PIN for room %s is now '%s'.":[""],"PIN lock has been removed from room %s.":[""],"Enter the PIN for room %s":[""],"Please sign in to create rooms.":[""],"and %s":[""],"and %d others":[""],"User":["用戶"],"Someone":["某人"],"Me":["我"]}}} \ No newline at end of file