The designs actually never want us to show the settings button in the footer if an app bar is in use (as in Element X mobile apps), so just avoid showing it at all in that case.
Because the type of header that we use in Element X (an 'app bar') lives in a different place in the document than the other headers, it needs a special branch to propagate the right insets.
* Posthog: drop $initial_person_info from outgoing events
* Posthog: migrate from sanitize_properties to before_send
* strip URL fields from $set / $set_once
* enable mask_personal_data_properties
* review
* update tests to check for `delete` (not anymore `=null`)
rename: `applyPrivacyFilters`->`santizeSensitiveData`
---------
Co-authored-by: Timo K <toger5@hotmail.de>
* Add Posthog events for Call reconnect including the reason
* Expose single trackCallReconnecting() entry point on PosthogAnalytics
* Track reconnect duration and align with existing analytics pattern
* Refactor combined$ to return [connected, reason] tuple
* Update firefoxUserPrefs to allow getUserMedia and enumerateDevices on CI
---------
Co-authored-by: Valere <bill.carson@valrsoft.com>
Co-authored-by: Robin <robin@robin.town>
Co-authored-by: Timo K <toger5@hotmail.de>
* add MeidaMuteAndSwitchButton
* User button in footer
* Add tests
* update styling (dark bg on menu open + chevron white + chevron up)
* fix tests
* add storybook to CI
only add storybook with storybook label
test names
another env name test
TestName
new default name
remove label condition
Update pr-deploy.yaml
* Update pr-deploy.yaml
* add toggle example to default component
* hook up footer select actions
* fix video audio button (swapped) and lable in story
* make `delayed_leave_event_delay_ms` and `network_error_retry_ms` mandatory
* Support delegation for legacy jwt request
* Calculate `maximumNetworkErrorRetryCount` based on timeouts
* add storybook to CI
only add storybook with storybook label
test names
another env name test
TestName
new default name
remove label condition
Update pr-deploy.yaml
* rename things to check if we actually run the latests ci
* cleanup things used for testing
* Update deploy-to-netlify.yaml
* use package instead of custom environment_name
* final cleanup
By adding viewport-fit=cover to the <meta name="viewport"> header, the page now requests to be displayed edge-to-edge across the entire screen. This gives us control over what we display around camera cut-outs and system navigation UI, if the user agent supports it. I then adjusted the styles of various UI elements to ensure that they still lie within the screen's safe area.
* Update compound-web to 9.3.0 and update Buttons from "sm" to "md".
* Clean up the liast bits
* Update snaps too
* fix test, need to dismiss a new dialog
---------
Co-authored-by: Valere <bill.carson@valrsoft.com>
They were not properly being contained to where the MediaView is supposed to appear, causing them to all stack up on the first screen share in the spotlight tile.
6667fc54c0 changed this CSS selector that shows buttons on hover to only target the buttons in the bottom right corner of the spotlight tile, causing the forward/back buttons to stay invisible.
This approach is more flexible in that it allows even the local participant to share their screen in CallViewModel tests, and more rigorous in that it ensures that application code is reacting specifically to track publications.
If you manage to move your floating video tile to the bottom of the screen in a small landscape window, the footer obscures the tile when shown. The designs want us to smoothly move the floating tile out of the way in this case.
This adds two new intents: start_call_voice and join_existing_voice. I need the latter in order to implement Element Web's new incoming call toasts, in which you can turn off your video before joining a group call. The other one, start_call_voice, exists more for completeness than anything; we don't currently want to allow users to start voice calls in group chats in our messenger clients, but maybe Cinny would, for instance.
- use the new domain logic to discover the transport
- then try to authenticate
- Also fix the bug in multi sfu where active$ not updated on delayId change
If you are the only participant in the call, the expanded spotlight layout would redundantly show your media in both the spotlight and PiP tiles. This is a regression; in versions 0.16.1 and earlier we would avoid showing the same user twice.
Taking Valere's suggestion of giving them the 'switch' role. Also, the aria-label attributes were redundant (having tooltips already gives the buttons aria-labelledby).
Add comments on existing code
Extracted a specific android controller for isolation and better testing
lint fixes
Fix device update logic and more tests
better typescript
In landscape orientation the button would be buried underneath the footer, which would block interaction with it. This commit changes the footer to not show in cases where a button has been pressed.
Timo and I agreed previously that we should ditch the class pattern for view models and instead have them be interfaces which are simply created by functions. They're more straightforward to write, mock, and instantiate this way.
The code for media view models and media items is pretty much the last remaining instance of the class pattern. Since I was about to introduce a new media view model for ringing, I wanted to get this refactor out of the way first rather than add to the technical debt.
This refactor also makes things a little easier for https://github.com/element-hq/element-call/pull/3747 by extracting volume controls into their own module.
To correctly implement the legacy "oldest membership" mode, we need the code to be more nuanced about the local transport. Specifically, it needs to allow for the transport we advertise in our membership to be different from the transport that we connect to and publish media on. Otherwise, if these two are yoked together, members will resend their memberships whenever an SFU hop occurs, which an attacker could use to cause an amplified wave of state changes.
It's always worth having logs for when state holders are created or destroyed (these are often the most interesting things happening in the application), so I thought it would be nice to have generateItems always log for you when it's doing that.
once)
The local jwt token needs to be aquired via the right endpoint. The
endpoint defines how our rtcBackendIdentity is computed. Based on us
using sticky events or state events we also need to use the right
endpoint. This cannot be done generically in the connection manager. The
jwt token now is computed in the localTransport and the resolved sfu
config is passed to the connection manager.
Add JWT endpoint version and SFU config support Pin matrix-js-sdk to a
specific commit and update dev auth image tag. Propagate SFU config and
JWT endpoint choice through local transport, ConnectionManager and
Connection; add JwtEndpointVersion enum and LocalTransportWithSFUConfig
type. Add NO_MATRIX_2 auth error and locale string, thread
rtcBackendIdentity through UI props, and include related test, CSS and
minor imports updates
On second glance, the way that we determined a media tile to be 'waiting for media' was too implicit for my taste. It would appear on a surface reading to depend on whether a participant was currently publishing any video. But in reality, the 'video' object was always defined as long as a LiveKit participant existed, so in reality it depended on just the participant. We should show this relationship more explicitly by moving the computation into the view model, where it can depend on the participant directly.
We would show 'waiting for media' on participants that were connected but had no published tracks, because we were filtering them out of the remote participants list on connections. I believe this was done in an attempt to limit our view to only the participants that have a matching MatrixRTC membership. But that's fully redundant to the "Matrix-LiveKit members" module, which actually has the right information to do this (the MatrixRTC memberships).
This fixes a regression on the development branch: the layout switcher would not respond to input while the window mode is 'flat' (i.e. while a mobile phone is in landscape orientation). See https://github.com/element-hq/element-call/pull/3605#discussion_r2586226422 for more context.
I was having a little trouble interpreting the emergent behavior of the layout switching code, so I refactored it in the process into a form that I think is a more direct description of the behavior we want (while not making it as terse as my original implementation).
Semantically, behaviors are only meaningful for as long as their scope is running. Setting a behavior's value to an empty array once its scope ends is not guaranteed to work (as it depends on execution order of how the scope is ended), and subscribers should be robust enough to handle clean-up of all connections at the end of the scope either way.
Since we now bundle a trusted Element Call widget with our messenger applications and this widget reports analytics to an endpoint determined by the messenger app, there is no longer any reason to compute a different analytics ID from the one used by the messenger app.
While looking into what had regressed https://github.com/element-hq/element-call/issues/3588, I found that 28047217b8 had filled in a couple of behaviors with non-reactive default values, the "natural window mode" behavior being among them. This meant that the app would no longer determine the correct window mode upon joining a call, instead always guessing "normal" as the value. This change restores its reactivity.
* playwright: Fix error boundary mgmt or openId errors
* do not use tap for important logic
* fix lint
---------
Co-authored-by: Timo K <toger5@hotmail.de>
* Update docs for 'rageshake.submit_url' to use the dedicated subdomain
* Update Netlify preview deployment to use the dedicated subdomain for 'rageshake.submit_url'
Rename several classes/behaviors to factory-style creators and adapt
call wiring and tests accordingly:
- Replace ConnectionManager class with createConnectionManager$ which
returns transports$, connectionManagerData$, connections$
- Convert MatrixLivekitMerger to createMatrixLivekitMembers$
(matrixLivekitMerger$)
- Rename sessionBehaviors$, localMembership$, localTransport$ to
createSessionMembershipsAndTransports$, createLocalMembership$,
createLocalTransport$
- Adjust participant types and hook up connectOptions$; expose join via
localMembership.requestConnect
- Update tests to use the new factory APIs
- Replace MatrixLivekitItem with MatrixLivekitMember, add displayName$
and participantId, and use explicit LiveKit participant types
- Make sessionBehaviors$ accept a props object and return a typed
RxRtcSession
- Update CallViewModel to use the new session behaviors, rebuild media
items from matrixLivekitMembers, handle missing connections and use
participantId-based keys
- Change localMembership/localTransport to accept Behavior-based
options, read options.value for enterRTCSession, and fix advertised
transport selection order
- Update tests and minor UI adjustments (settings modal livekitRooms
stubbed) and fix JSON formatting in locales
Remove preferStickyEvents and multiSfu in favor of a MatrixRTCMode
enum/setting (Legacy, Compatibil, Matrix_2_0). Move session join/leave,
track pause/resume, and config error handling out of CallViewModel into
the localMembership module. Update developer settings UI, i18n strings,
and related RTC session helpers and wiring accordingly.
npm has recently limited the lifetime of all access tokens to 90 days (https://gh.io/npm-token-changes), so it would be a bit inconvenient to stick to our current access token-based method of publishing releases. Meanwhile npm has implemented a more secure publishing method based on OIDC in which you tell the registry that a particular GitHub Actions workflow should be a "trusted publisher" for a given package, and then the CLI will authenticate automatically. (https://docs.npmjs.com/trusted-publishers)
I've already set trusted publishing up on the registry side, and since we're already granting the job permission to generate ID tokens for provenance, there should be no additional lines of config needed to make it work. Let's take away the access token and see how this goes next time we release.
While we still ought to eventually port these tests in some way, the presence of these empty test files is causing a Vitest failure, so it's easiest to just let them go and refer to Git history when we do want to reference them next.
* add sticky event support
- use new js-sdk
- use custom synapse
- don't filter rooms by existing call state events
Signed-off-by: Timo K <toger5@hotmail.de>
* enable sticky events in the joinSessionConfig
Signed-off-by: Timo K <toger5@hotmail.de>
* Remove unused useNewMembershipmanager setting
* Add prefer sticky setting]
* Fixup call detection logic to allow sticky events
* lint
* update docker image
* More tidy
* update checksum
* bump js-sdk fix sticky events type
Signed-off-by: Timo K <toger5@hotmail.de>
* fix demo
Signed-off-by: Timo K <toger5@hotmail.de>
* always use multi sfu if we are using sticky events.
Signed-off-by: Timo K <toger5@hotmail.de>
* review
Signed-off-by: Timo K <toger5@hotmail.de>
* lint
Signed-off-by: Timo K <toger5@hotmail.de>
* Always consider multi-SFU mode enabled when using sticky events
CallViewModel would pass the wrong transport to enterRtcSession when the user enabled sticky events but didn't manually enable multi-SFU mode as well. This likely would've added some confusion to our attempts to test these modes.
* Fix test type errors
* add todo comment
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
Co-authored-by: Half-Shot <will@half-shot.uk>
Co-authored-by: Robin <robin@robin.town>
The execution of certain Observables related to a local or remote connection would continue even after we stopped caring about said connection because we were failing to give these state holders a proper ObservableScope of their own, separate from the CallViewModel's longer-lived scope. With this commit they now have scopes managed by generateKeyed$.
Previously we had a ViewModel class which was responsible for little more than creating an ObservableScope. However, since this ObservableScope would be created implicitly upon view model construction, it became a tad bit harder for callers to remember to eventually end the scope (as you wouldn't just have to remember to end ObservableScopes, but also to destroy ViewModels). Requiring the scope to be specified explicitly by the caller also makes it possible for the caller to reuse the scope for other purposes, reducing the number of scopes mentally in flight that need tending to, and for all state holders (not just view models) to be handled uniformly by helper functions such as generateKeyed$.
Note that this effectively *reverts* 3ac2aa8526 because this branch now has what is a better UX (at least I think so): the in-call view is presented instantly when pressing the join button. Errors that occur during initial connection procedures will be surfaced more uniformly.
useCallViewKeyboardShortcuts() changed a param from `setMicrophoneMuted` to `setAudioEnabled`, the boolean arg of the callback is inverse tht it used to be
* Add media hints for notification events.
* Prevent showing calling view when disconnected from Livekit. (#3491)
* Refactor disconnection handling
* Use "unknown"
* Update signature
* Add tests
* Expose livekitConnectionState directly
* fix whoopsie
* Update dependency livekit-client to v2.15.7 (#3496)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* Fix the interactivity of buttons while reconnecting or in earpiece mode (#3486)
* Fix the interactivity of buttons while reconnecting or in earpiece mode
When we're in one of these modes, we need to ensure that everything above the overlay (the header and footer buttons) is interactive, while everything obscured by the overlay (the media tiles) is non-interactive and removed from the accessibility tree. It's not a very easy task to trap focus *outside* an element, so the best solution I could come up with is to set tabindex="-1" manually on all interactive elements belonging to the media tiles.
* Write a Playwright test for reconnecting
* fix lints
Signed-off-by: Timo K <toger5@hotmail.de>
* fix test
Signed-off-by: Timo K <toger5@hotmail.de>
* enable http2 for matrx-rtc host to allow the jwt service to talk to the SFU
* remove rate limit for delayed events
* more time to connect to livekit SFU
* Due to a Firefox issue we set the start anchor for the tab test to the Mute microphone button
* adapt to most recent Element Web version
* Use the "End call" button as proofe for a started call
* Currrenty disabled due to recent Element Web
- not indicating the number of participants
- bypassing Lobby
* linting
* disable 'can only interact with header and footer while reconnecting' for firefox
---------
Signed-off-by: Timo K <toger5@hotmail.de>
Co-authored-by: Timo <16718859+toger5@users.noreply.github.com>
Co-authored-by: Timo K <toger5@hotmail.de>
Co-authored-by: fkwp <github-fkwp@w4ve.de>
* Log when a track is unpublished or runs into an error (#3495)
* default mute states (unmuted!) in widget mode (embedded + intent) (#3494)
* default mute states (unmuted!) in widget mode (embedded + intent)
Signed-off-by: Timo K <toger5@hotmail.de>
* review
Signed-off-by: Timo K <toger5@hotmail.de>
* introduce a cache for the url params.
Signed-off-by: Timo K <toger5@hotmail.de>
* Add an option to skip the cache.
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* Apply new hint code
* missed a bit
* fix intent
* Automatically update intent on mute change
* update packages
* lint
* Fix tests
* fix merge fails
---------
Signed-off-by: Timo K <toger5@hotmail.de>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robin <robin@robin.town>
Co-authored-by: Timo <16718859+toger5@users.noreply.github.com>
Co-authored-by: Timo K <toger5@hotmail.de>
Co-authored-by: fkwp <github-fkwp@w4ve.de>
This ensures that we don't see a mistaken 'reconnecting' toast while we're hanging up (and also that the leave sound gets a chance to play in widgets once again).
* remove redis, since we dont use it
* update localhost TLS certificat to add *.othersite.m.localhost wildcard
* allow for federation
* Add services and config files for Matrix site othersite.m.localhost
* add element web instance app.othersite.m.localhost
* update README
* exclude synapse database for othersite.m.localhost
* linting
* make ring$ a behavior and add code comments to justify/explain the change.
Signed-off-by: Timo K <toger5@hotmail.de>
* Add test: reproduce "ring does not stop" race.
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* Add ring notification to UserIntent.StartNewCallDM
Signed-off-by: Timo K <toger5@hotmail.de>
* Add more tests (refactor to compute + get)
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* default mute states (unmuted!) in widget mode (embedded + intent)
Signed-off-by: Timo K <toger5@hotmail.de>
* review
Signed-off-by: Timo K <toger5@hotmail.de>
* introduce a cache for the url params.
Signed-off-by: Timo K <toger5@hotmail.de>
* Add an option to skip the cache.
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* Fix the interactivity of buttons while reconnecting or in earpiece mode
When we're in one of these modes, we need to ensure that everything above the overlay (the header and footer buttons) is interactive, while everything obscured by the overlay (the media tiles) is non-interactive and removed from the accessibility tree. It's not a very easy task to trap focus *outside* an element, so the best solution I could come up with is to set tabindex="-1" manually on all interactive elements belonging to the media tiles.
* Write a Playwright test for reconnecting
* fix lints
Signed-off-by: Timo K <toger5@hotmail.de>
* fix test
Signed-off-by: Timo K <toger5@hotmail.de>
* enable http2 for matrx-rtc host to allow the jwt service to talk to the SFU
* remove rate limit for delayed events
* more time to connect to livekit SFU
* Due to a Firefox issue we set the start anchor for the tab test to the Mute microphone button
* adapt to most recent Element Web version
* Use the "End call" button as proofe for a started call
* Currrenty disabled due to recent Element Web
- not indicating the number of participants
- bypassing Lobby
* linting
* disable 'can only interact with header and footer while reconnecting' for firefox
---------
Signed-off-by: Timo K <toger5@hotmail.de>
Co-authored-by: Timo <16718859+toger5@users.noreply.github.com>
Co-authored-by: Timo K <toger5@hotmail.de>
Co-authored-by: fkwp <github-fkwp@w4ve.de>
* add wait for pickup overlay
Signed-off-by: Timo K <toger5@hotmail.de>
* refactor and leave logic
Signed-off-by: Timo K <toger5@hotmail.de>
* recursive play sound logic
Signed-off-by: Timo K <toger5@hotmail.de>
* review
Signed-off-by: Timo K <toger5@hotmail.de>
* text color
Signed-off-by: Timo K <toger5@hotmail.de>
* overlay styling and interval fixes
Signed-off-by: Timo K <toger5@hotmail.de>
* fix permissions and styling
Signed-off-by: Timo K <toger5@hotmail.de>
* fix always getting pickup sound
Signed-off-by: Timo K <toger5@hotmail.de>
* Add sound effects for declined,timeout and ringtone
* better ringtone
* Integrate sounds
* Ensure leave sound does not play
* Remove unused blocked sound
* fix test
* Improve tests
* Loop ring sound inside Audio context for better perf.
* lint
* better ringtone
* Update to delay ringtone logic.
* lint + fix test
* Tidy up ring sync and add comments.
* lint
* Refactor onLeave to take a sound so we don't need to repeat the sound
* fix import
---------
Signed-off-by: Timo K <toger5@hotmail.de>
Co-authored-by: Timo K <toger5@hotmail.de>
After a membership manager error, clicking the 'reconnect' button did nothing. This is because we were forgetting to clear the external error state, causing it to transition directly back to the same error state.
With this change I'm also taking care to not show the standard "Connection to the server has been lost" banner in the call view, since that is now covered by the 'reconnecting' message.
* bump js-sdk to Allow multiple rtc sessions per room (with different sessionDescriptions)
* Allow new state key string-packing format for widget mode
* bump js-sdk to latest version (with merged multi session PR)
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
Co-authored-by: Timo K <toger5@hotmail.de>
* Introduce condigurable auto leave option
* Read url params for auto leave
* add tests
* rename url param to `autoLeave`
* lint
Signed-off-by: Timo K <toger5@hotmail.de>
* fix scope in CallViewModel tests
Signed-off-by: Timo K <toger5@hotmail.de>
* use auto leave in DM case
Signed-off-by: Timo K <toger5@hotmail.de>
* Make last once leave logic based on matrix user id (was participant id before)
Signed-off-by: Timo K <toger5@hotmail.de>
* add test for multi device auto leave
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* Add a fullscreen button that uses the element request Fullscreen browser api
Signed-off-by: Timo K <toger5@hotmail.de>
* use body instead of root node
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* Stop reading deprecated config options
* add PR-Breaking-Change as one of the possible PR- prefix labels
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* Set available devices to empty map on safari.
Signed-off-by: Timo K <toger5@hotmail.de>
* better safari check
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
I believe that the issue we were originally investigating using these increased timeouts was the fault of my earlier ISP in SW Virginia. I can't recall reproducing the exact issue on other networks.
0e0fba6575 added the ability to send call notification events when starting a call, but I forgot to give the widget the right capabilities to do this. The effect was that notifications just wouldn't send in widget mode.
* refactor UrlParams to use a preset intent system
* change defaults for intend headers
* add: getEnumParam to ParamParser
* remove deprecated url params
* only allow skip lobby in widget (more strict needs test adjustment)
* fix tests that now require the url to be a widget url
Co-authored-by: Robin <robin@robin.town>
---------
Co-authored-by: Robin <robin@robin.town>
* Send notification events when starting a call
Previously this has been the responsibility of the hosting application (Element Web / Element X), but I would like to move this responsibility to Element Call itself to make it even more lightweight to integrate Element Call into a widget-capable client.
* use RTCNotification event
* add url param
* bump to latest js-sdk
* remove everything decline related
* use notification type in url params
* fix url .md docs
* back to `head=develop` and using js-sdk with send notification feature
* format
---------
Co-authored-by: Timo <toger5@hotmail.de>
This hook is simpler in its implementation (therefore hopefully more correct & performant) and enforces a type-level distinction between raw Observables and Behaviors.
Rather than the 'share screen' button. Small screens are most likely to be mobile devices which wouldn't have the ability to share their screen, anyways.
* Add a global control for toggling earpiece mode
This will be used by Element X to show an earpiece toggle button in the header.
* Add an earpiece overlay
* Fix header
The header needs to be passed forward as a string to some components and as a bool (hideHeader) to others.
Also use a enum instead of string options.
* fix top clipping with header
* hide app bar in pip
* revert android overlay app_bar
* Modernize AppBarContext
* Style header icon color as desired and switch earpice/speaker icon
* fix initial selection when using controlled media
* Add "Back to video" button
* fix tests
* remove dead code
* add snapshot test
* fix back to video button
* Request capability to learn the room name
We now need the room name in order to implement the mobile (widget-based) designs with the app bar.
* Test the CallViewModel output switcher directly
---------
Co-authored-by: Timo <toger5@hotmail.de>
* bugfix: #3344 Reconnecting to the same SFU on membership change
* fixup! commit error
* Keep useActiveLivekitFocus from changing focus spuriously
* Remove redundant fix for spurious focus changes
We've now fixed it at the source by prohibiting state changes in useActiveLivekitFocus itself.
---------
Co-authored-by: Robin <robin@robin.town>
* Replace useContext with use
The docs recommend the use hook because it is simpler and allows itself to be called conditionally.
* Simplify our context providers
React 19 lets you omit the '.Provider' bit.
* Add `onBackButtonPressed` controls api
* Update docs/controls.md
Co-authored-by: Robin <robin@robin.town>
---------
Co-authored-by: Robin <robin@robin.town>
* Refactor media devices to live outside React as Observables
This moves the media devices state out of React to further our transition to a MVVM architecture in which we can more easily model and store complex application state. I have created an AppViewModel to act as the overarching state holder for any future non-React state we end up creating, and the MediaDevices reside within this. We should move more application logic (including the CallViewModel itself) there in the future.
* Address review feedback
* Fixes from ios debugging session: (#3342)
- dont use preferred vs selected concept in controlled media. Its not needed since we dont use the id for actual browser media devices (the id's are not even actual browser media devices)
- add more logging
- add more conditions to not accidently set a deviceId that is not a browser deviceId but one provided via controlled.
---------
Co-authored-by: Timo <16718859+toger5@users.noreply.github.com>
We didn't need the complexity of the (admittedly very small) React hook, and the package hasn't declared compatibility with React 19, so let's just switch to copying things manually via copy-to-clipboard.
* Build Docker image on slim base
* Run Playwright tests against Docker container
For Playwright end-to-end tests in CI, instead of running a development
webserver with `yarn dev`, build and deploy a Docker container for
Element Call and use that as the webserver to test against.
* Shut down playwright webserver gracefully
When using a containerized webserver, this stops the container once
tests finish.
* Increase Playwright timeout in CI
---------
Co-authored-by: fkwp <github-fkwp@w4ve.de>
* Avoid reactivity bugs in how we track external state
Many of our hooks which attempt to bridge external state from an EventEmitter or EventTarget into React had subtle bugs which could cause them to fail to react to certain updates. The conditions necessary for triggering these bugs are explained by the tests that I've included.
In the majority of cases, I don't think we were triggering these bugs in practice. They could've become problems if we refactored our components in certain ways. The one concrete case I'm aware of in which we actually triggered such a bug was the race condition with the useRoomEncryptionSystem shared secret logic (addressed by a1110af6d5).
But, particularly with all the weird reactivity issues we're debugging this week, I think we need to eliminate the possibility that any of the bugs in these hooks are the cause of our current headaches.
* Reuse useTypedEventEmitterState in useLocalStorage
* Fix type error
We forgot to tell React that we need the audio renderer to react to changes in the set of MatrixRTC participants; instead we had it referencing rtcSession.memberships non-reactively.
Now, I'm not 100% confident that this is going to fix the "speaking from the void" issues observed in the wild, because I can't reproduce them and, in my testing, the InCallView component always seemed to be rendered redundantly when the MatrixRTC participants change, even though we hadn't explicitly stated that it needs to react. (This makes sense as we haven't memoized the component.) But it's worth a shot.
* Simplify key local storage management.
* Refactor useLivekit to only ever connect to one room.
This change also tries to make the code more explicit so that we only do the things we really need to do and rely less on react updating everything correctly.
It also surfaces, that we are currently implementing useLivekit in a way, so that we can change the encryption system on the fly and recreate the room. I am not sure this is a case we need to support?
* simplify the useLivekit hook even more
This is possible because we concluded that we do not need to be able to hot reload the e2ee system.
* review
* linter
* Update src/room/InCallView.tsx
Co-authored-by: Robin <robin@robin.town>
---------
Co-authored-by: Robin <robin@robin.town>
This gives us the additional insurance of breaking the Safari media acquisition loop at the source by admitting that they can be spurious in practice. Safari, why!?
Because we're now requiring the 'Prevent blocked' check to pass before merging a PR, GitHub Actions now expects it to be associated with the latest Git ref of the PR's branch whenever the branch is updated. Therefore we need to re-run the workflow on the 'synchronize' event.
Because the latest version requires eslint-plugin-unicorn v57, which requires eslint v9, and eslint-plugin-matrix-org is not yet compatible with eslint v9.
* Disable device switching when in controlled audio devices mode
* Temporarily switch matrix-js-sdk to robin/embedded-no-update-state
To allow us to test this change on Element X, which does not yet support the update_state action.
* Also add a check for controlled audio devices in useAudioContext
* use develop branch
* fix tests
---------
Co-authored-by: Robin <robin@robin.town>
Now that the toger5/add-room-key-fallback-on-encryption-manager-not-supported branch has been merged, we can reset to develop. (And need to, actually, because that branch is deleted.)
* Update RTCSession configuration to non deprecated names.
* bump js-sdk
* es2024 and array buffer adaptions
* Alternative without `createKeyMaterialFromBuffer`
* Add custom audio renderer to only render joined participants & add ios earpice workaround
fix left right to match chromium + safari
(firefox is swapped)
earpice as setting
Simpler code and documentation
The doc explains, what this class actually does and why it is so complicated.
Signed-off-by: Timo K <toger5@hotmail.de>
use only one audioContext, remove (non working) standby fallback
* Add tests
* use optional audio context and effect to initiate it + review
- `MediaDevice`->`MediaDeviceHandle`
- use just one provider and switch inside the
MediaDevicesProvider between: controlledAudioOutput, webViewAudioOutput
- fix muteAllAudio
* Better logs for connection/component lifecycle
* fix: `AudioCaptureOptions` was causing un-necessary effect render
AudioCaptureOptions was a different object but with same internal values, use directly deviceId so that Object.is works properly
* fix: Livekit openned connection leaks
* review: rename to AbortHandles
* review: rename variable
---------
Co-authored-by: Timo <toger5@hotmail.de>
fix left right to match chromium + safari
(firefox is swapped)
earpice as setting
Simpler code and documentation
The doc explains, what this class actually does and why it is so complicated.
Signed-off-by: Timo K <toger5@hotmail.de>
use only one audioContext, remove (non working) standby fallback
* Only show to device encryption label if developer mode on
* Add tests for developer mode to device label
---------
Co-authored-by: Timo <toger5@hotmail.de>
* Fix to-device encryption info label
The label was shown also without checking that we use PerParticipantE2EE. Which is a prerequisite for toDevice transport. As a result the label was shown when not desired.
* rename: useLiveKit -> useLivekit
* make the settings naming consistent
* Refactor version calculation to use separate step and track version for each platform
* Set tag for NPM and SNAPSHOT for AAR appropriately
* Log output versions for each platform
* Fix tarball name
* Just use npm tag of `latest` or `other`
* Attempt to fix AAR snapshot publishing
* enable to-device-encryption
* add logging for key provider
* make rooms encrypted
* add dev setting to choose to-device or room encryption
* add indicator when to-device is used.
* Devex: Default vite config to support using local build of crypto wasm
* use realpathSync and make it work with linked and not-linked
We need to use sync because an async defineConfig fails for the embedded exports.
* also allow just linking matrix-sdk-crypto-wasm (without js-sdk linking)
---------
Co-authored-by: Timo <toger5@hotmail.de>
Co-authored-by: Timo <16718859+toger5@users.noreply.github.com>
Co-authored-by: Robin <robin@robin.town>
* Use correct rageshake URL when running in embedded package
It was incorrectly trying to use the one from config.json
* Refactor to add tests
* Empty mock config
* Expose version string in embedded SwiftPM and AAR
Implements https://github.com/element-hq/element-call/issues/3143
* Fix filename
* Fix location of `Version.kt`
* Use the right path for the sed replacement in the publishing workflow for Android
---------
Co-authored-by: Jorge Martín <jorgem@element.io>
* Change EULA to SSLA
- rename i18n fields
- update the config property to `ssla` and deprecate `eula`
- use `eula` instead of ssla in case it is provided in the config.
* fix default config
* completely remove eula fallback
# echo "$FILE exists. -> moving to .links.disabled.yaml"
mv .links.yaml .links.disabled.yaml
# echo "running yarn"
x=$(yarn)
y=$(git add yarn.lock)
echo "[yarn-linker] The pre-commit hook has disabled .links.yaml and MODIFIED the yarn.lock file. Review the staged changes (the hook added yarn.lock, was this desired?) and run \`git commit \` again if they look okay. The post-commit hook will re-enable your links."
# Checks if there currently is linking configured. Informs the user to disable linking before committing.
PNPMFILE=.pnpmfile.cjs
if test -f "$PNPMFILE"; then
echo "[pnpm-linker] The pre-commit hook detected $PNPMFILE which implies you have linked packages in your pnpm-lock.yaml. Run pnpm links:off and commit again. See also linking.md."
The file is located at `backend/dev_tls_local-ca.crt`. Transfer it via:
- Matrix room
- AirDrop for iphone
### IOS Setup
**Install the certificate profile on iPhone**
- Open the `dev_tls_local-ca.crt` file on your iPhone
- You'll see "Profile Downloaded"
- Go to **Settings → General → VPN & Device Management** (or **Settings → General → Profiles**)
- Tap the "Element Call Dev CA" profile
- Tap **Install** and enter your passcode
- Confirm by tapping **Install** again
**Enable full trust (Critical!)**
- Go to **Settings → General → About → Certificate Trust Settings**
- Under "Enable Full Trust for Root Certificates"
- Toggle **ON** for "Element Call Dev CA"
- Confirm the security warning
**Access Element Call**
Find your laptop's IP address (e.g., `192.168.0.122`) and use one of these URLs in Safari to validate:
```
https://192-168-0-122.nip.io:3000/
```
**For Element X iOS Developer Tools**
In Element X's developer settings, set the Element Call URL to the nip.io url (replace . with - in the IP address):
```
https://192-168-0-122.nip.io:3000/room
```
### Android Setup
**Transfer the CA certificate to your Android device**
The file is located at `backend/dev_tls_local-ca.crt`.
**Install the certificate**
This might vary by Android version and manufacturer, but generally:
- Open **Settings** search for "CA Certificate"/"Certificate"
- Tap **Install a certificate** or **Install from storage**
- Select **CA certificate**
- Confirm the security warning
- Navigate to and select the `dev_tls_local-ca.crt` file
- Give it a name like "Element Call Dev CA"
**Access Element Call**
Find your laptop's IP address (e.g., `192.168.0.122`) and use one of these URLs in Chrome to validate:
```
https://192-168-0-122.nip.io:3000/
```
**For Element X Android Developer Tools**
In Element X's developer settings, set the Element Call URL to the nip.io url (replace . with - in the IP address):
```
https://192-168-0-122.nip.io:3000/room
```
### Why nip.io?
[nip.io](https://nip.io) is a free wildcard DNS service that automatically resolves domain names containing IP addresses. For example, `192-168-0-122.nip.io` automatically resolves to `192.168.0.122`. This means:
- No need to regenerate certificates when your laptop's IP changes
- Works from any device without DNS configuration
- iOS/Android treat it as a proper domain name, not an IP address
- One-time certificate setup works for all future IP addresses
> [!IMPORTANT]
> Make sure your network router doesn't enforce DNS rebinding protection (which will
> break nip.io). If it does, try allow-listing nip.io in your router's administration interface.
A few aspects of Element Call's interface can be controlled through a global API on the `window`:
A few aspects of Element Call's interface can be controlled through a global API on the `window`.
## Picture-in-picture
-`controls.canEnterPip(): boolean` Determines whether it's possible to enter picture-in-picture mode.
-`controls.enablePip(): void` Puts the call interface into picture-in-picture mode. Throws if not in a call.
-`controls.disablePip(): void` Takes the call interface out of picture-in-picture mode, restoring it to its natural display mode. Throws if not in a call.
## Audio devices
On mobile platforms (iOS, Android), web views do not reliably support selecting audio output devices such as the main speaker, earpiece, or headset. To address this limitation, the following functions allow the hosting application (e.g., Element Web, Element X) to manage audio devices via exposed JavaScript interfaces. These functions must be enabled using the URL parameter `controlledAudioDevices` to take effect.
-`controls.setAvailableAudioDevices(devices: { id: string, name: string, forEarpiece?: boolean, isEarpiece?: boolean isSpeaker?: boolean, isExternalHeadset?: boolean }[]): void` Sets the list of available audio outputs. `forEarpiece` is used on iOS only.
It flags the device that should be used if the user selects earpiece mode. This should be the main stereo loudspeaker of the device.
-`controls.onAudioDeviceSelect: ((id: string) => void) | undefined` Callback called whenever the user or application selects a new audio output.
-`controls.setAudioDevice(id: string): void` Sets the selected audio device in Element Call's menu. This should be used if the OS decides to automatically switch to Bluetooth, for example.
-`controls.setAudioEnabled(enabled: boolean)` Enables/disables all audio output from the application. Output is enabled by default.
-`controls.onAudioPlaybackStarted: ((id: string) => void) | undefined`: This will be called the first time we start
playing audio in the webview. It can be helpful to do device setup on the native app when the webviews audio is ready.
In particular android is using it to setup the output channel so that the call volume can
be controlled by the hardware volume rocker.
## Element Call button delegation
Callbacks for buttons in EC that are handled by the native application
-`showNativeAudioDevicePicker: (() => void) | undefined`. Callback called whenever the user presses the output button in the settings menu.
This button is only shown on iOS. (`/iPad|iPhone|iPod|Mac/.test(navigator.userAgent)`)
-`onBackButtonPressed: (() => void) | undefined`. Callback when the webview detects a tab on the header's back button.
Element Call is available as two different packages: Full Package and Embedded Package. The Full Package is designed for standalone use, while the Embedded Package is designed for widget mode only. The table below provides a comparison of the two packages:
| **Deployment mode** | Hosted as a static web page and accessed via a URL when used as a widget | Bundled within a messenger app for seamless integration |
| **Release artifacts** | Docker Image, Tarball | Tarball, NPM for Web, Android AAR, SwiftPM for iOS |
For examples of how to use the platform specific release artifacts (e.g. Android AAR) see
the Element Messenger apps for: [Web](https://github.com/element-hq/element-web), [iOS](https://github.com/element-hq/element-x-ios) and [Android](https://github.com/element-hq/element-x-android).
## Widget vs standalone mode
Element Call is developed using the [js-sdk](https://github.com/matrix-org/matrix-js-sdk) with matroska mode. This means the app can run either as a standalone app directly connected to a homeserver providing login interfaces or it can be used as a widget within a Matrix client.
As a widget, the app only uses the core calling (MatrixRTC) parts. The rest (authentication, sending events, getting room state updates about calls) is done by the hosting client.
Element Call and the hosting client are connected via the widget API.
Element Call detects that it is run as a widget if a widgetId is defined in the url parameters. If `widgetId` is present then Element Call will try to connect to the client via the widget postMessage API using the parameters provided in [Url Format and parameters
| **Deployment mode** | Hosted as a static web page and accessed via a URL when used as a widget | Bundled within a messenger app for seamless integration |
| **Release artifacts** | Docker Image, Tarball | Tarball, NPM for Web, Android AAR, SwiftPM for iOS |
| **Responsibility for regulatory compliance** | The administrator that is deploying the app is responsible for compliance with any applicable regulations (e.g. privacy) | The developer of the messenger app is responsible for compliance |
| **Analytics consent** | Element Call will show a consent UI. | Element Call will not show a consent UI. The messenger app should only provide the embedded Element Call with the [analytics URL parameters](./url_params.md#embedded-only-parameters) if consent has been granted. |
| **Analytics data** | Element Call will send data to the Posthog, Sentry and Open Telemetry targets specified by the administrator in the `config.json` | Element Call will send data to the Posthog and Sentry targets specified in the URL parameters by the messenger app |
### Using the embedded package within a messenger app
Currently the best way to understand the necessary steps is to look at the implementations in the Element Messenger apps: [Web](https://github.com/element-hq/element-web/pull/29309), [iOS](https://github.com/element-hq/element-x-ios/pull/3939) and [Android](https://github.com/element-hq/element-x-android/pull/4470).
The basics are:
1. Add the appropriate platform dependency as given for a [release](https://github.com/element-hq/element-call/releases), or use the embedded tarball. e.g. `npm install @element-hq/element-call-embedded@0.9.0`
2. Include the assets from the platform dependency in the build process. e.g. copy the assets during a [Webpack](https://github.com/element-hq/element-web/blob/247cd8d56d832d006d7dfb919d1042529d712b59/webpack.config.js#L677-L682) build.
3. Use the `index.html` entrypoint of the imported assets when you are constructing the WebView or iframe. e.g. using a [relative path in a webapp](https://github.com/element-hq/element-web/blob/247cd8d56d832d006d7dfb919d1042529d712b59/src/models/Call.ts#L680), or on the the Android [WebViewAssetLoader](https://github.com/element-hq/element-x-android/blob/fe5aab6588ecdcf9354a3bfbd9e97c1b31175a8f/features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/DefaultCallWidgetProvider.kt#L20)
4. Set any of the [embedded-only URL parameters](./url_params.md#embedded-only-parameters) that you need.
## Widget vs standalone mode
Element Call is developed using the [js-sdk](https://github.com/matrix-org/matrix-js-sdk) with matroska mode. This means the app can run either as a standalone app directly connected to a homeserver providing login interfaces or it can be used as a widget within a Matrix client.
As a widget, the app only uses the core calling (MatrixRTC) parts. The rest (authentication, sending events, getting room state updates about calls) is done by the hosting client.
Element Call and the hosting client are connected via the widget API.
Element Call detects that it is run as a widget if `widgetId` is defined in the url parameters. If `widgetId` is present then Element Call will try to connect to the client via the widget postMessage API using the parameters provided in [Url Format and parameters
If you want to make changes to a package that Element Call depends on and see those changes applied in real time, you can create a link to a local copy of the package. Yarn has a command for this (`yarn link`), but it's not recommended to use it as it ends up modifying package.json with details specific to your development environment.
Run:
Instead, you can use our little 'linker' plugin. Create a file named `.links.yaml` in the Element Call project directory, listing the names and paths of any dependencies you want to link. For example:
Run: 'git commit' with links enabled to test the git pre-commit hook.
Run: 'pnpm links:off' to be able to commit again
Run: 'git config --local core.hooksPath ""' to allow committing with linking (not recommended)
Run: 'rm links.cjs' & 'git config --local core.hooksPath ""' to fully revert what this script did
```
# Developing with linked packages
If you want to make changes to a package that Element Call depends on and see those changes applied in real time, you can create a link to a local copy of the package. `pnpm` has a command for this (`pnpm link`), but it's not recommended to use it as it ends up modifying package.json with details specific to your development environment.
Instead, create a file named `.links.cjs` in the Element Call project directory (or run `./scripts/setup-linking.sh` to create a template), listing the names and paths of any dependencies you want to link. For example:
Background: The presence of the `.pnpmfile.cjs` adds a field to the `pnpm-lock.yaml` called: `pnpmfileChecksum`. This field is a checksum of the content of the `.pnpmfile.cjs` file.
`pnpm install --frozen-lockfile`**fails** if there is a `.pnpmfile.cjs` but no `pnpmfileChecksum` or vice versa (or on mismatch).
_TLDR: running with `--ignore-pnpmfile` will fail if `pnpmfileChecksum` is present._
#### `pnpmfileChecksum` + renovate bot
When the renovate bot creates a PR it runs `pnpm install --ignore-pnpmfile`. This means that the `pnpmfileChecksum` in the lockfile will be **empty**.
This breaks builds that **don't** ignore the `.pnpmfile.cjs`-file. (CI that runs on the renovate PR)
From here we have two possible paths:
- ignore `.pnpmfile.cjs` in all CI builds (CI will also fail if we accidently add it locally).
- fixup the `pnpm-lock.yaml` in the renovate PR to contain the correct `pnpmfileChecksum`.
Ignoring in all CI builds means that CI will always fail if we enable the linking system.
This is annoying but can be worked around with the git hook we provide that at least lets us know that we are
commiting with enabled linking.
Only if we remember setting it back/disbale linking (or let ourselves remember by the git hook) the CI will work.
#### Summary
- We will always run into conflicts with the `pnpmfileChecksum` because in renovate prs it will be empty (`--ignore-pnpmfile`)
- To keep it simple we set `--ignore-pnpmfile` in all of our CI builds to see issues immediately.
- The only solution is to never have a `.pnpmfile.cjs` in the repository when pushing.
- This way there will never be a commit with `pnpmfileChecksum` in the lockfile.
- renovate (which uses `--ignore-pnpmfile` which we cannot disable) and other CI will work.
- We are able to use the linking system locally if we `cp` this file from the scripts folder into `./` on demand.
-`pnpm links:on` and `pnpm links:off` + `./scripts/setup-linking.sh` will help us with this.
[MSC4195: MatrixRTC using LiveKit backend](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md).
@@ -79,11 +89,11 @@ the example above, this results in:
- [MatrixRTC with Synology Container Manager (Docker)](https://ztfr.de/matrixrtc-with-synology-container-manager-docker/)
- [Encrypted & Scalable Video Calls: How to deploy an Element Call backend with Synapse Using Docker-Compose](https://willlewis.co.uk/blog/posts/deploy-element-call-backend-with-synapse-and-docker-compose/)
- [Element Call einrichten: Verschlüsselte Videoanrufe mit Element X und Matrix Synapse](https://www.cleveradmin.de/blog/2025/04/matrixrtc-element-call-backend-einrichten/)
- [MatrixRTC Back-End for Synapse with Docker Compose and Traefik](https://forge.avontech.net/kstro1/matrixrtc-docker-traefik/)
## 🛠️ Tools
- [A Matrix server sanity tester including tests for proper MatrixRTC setup](https://codeberg.org/spaetz/testmatrix)
## 🤝 Want to Contribute?
Have a guide or blog post you'd like to share? Open a
[PR](https://github.com/element-hq/element-call/pulls) to add it here, or drop a
link in the [#webrtc:matrix.org](https://matrix.to/#/#webrtc:matrix.org) room.
| [Full](./embedded-standalone.md) | All | `https://element_call.domain/room` |
| [Embedded](./embedded-standalone.md) | Remote URL | `https://element_call.domain/` n.b. no `/room` part |
| [Embedded](./embedded-standalone.md) | Embedded within messenger app | Platform dependent, but you load the `index.html` file without a `/room` part |
| [Full](./embedded_standalone.md) | All | `https://element_call.domain/room` |
| [Embedded](./embedded_standalone.md) | Remote URL | `https://element_call.domain/` n.b. no `/room` part |
| [Embedded](./embedded_standalone.md) | Embedded within messenger app | Platform dependent, but you load the `index.html` file without a `/room` part |
## Parameters
### Common Parameters
These parameters are relevant to both [widget](./embedded-standalone.md) and [standalone](./embedded-standalone.md) modes:
These parameters are relevant to both [widget](./embedded_standalone.md) and [standalone](./embedded_standalone.md) modes:
| Name | Values | Required for widget | Required for SPA | Description |
| `allowIceFallback` | `true` or `false` | No, defaults to `false` | No, defaults to `false` | Allows use of fallback STUN servers for ICE if the user's homeserver doesn’t provide any. |
| `analyticsID` (deprecated: use `posthogUserId` instead) | Posthog analytics ID | No| No | Available only with user's consent for sharing telemetry in Element Web. |
| `appPrompt` | `true` or `false` | No, defaults to `true` | No, defaults to `true` | Prompts the user to launch the native mobile app upon entering a room, applicable only on Android and iOS, and must be enabled in config. |
| `confineToRoom`| `true` or `false` | No, defaults to `false` | No, defaults to `false` | Keeps the user confined to the current call/room. |
| `displayName`| | No | No | Display name used for auto-registration. |
| `enableE2EE` (deprecated) | `true` or `false` | No, defaults to `true` | No, defaults to `true` | Legacy flag to enable end-to-end encryption, not used in the `livekit` branch. |
| `fontScale`| A decimal number such as `0.9` | No, defaults to `1.0` | No, defaults to `1.0` | Factor by which to scale the interface's font size. |
| `fonts`| | No | No | Defines the font(s) used by the interface. Multiple font parameters can be specified: `?font=font-one&font=font-two...`. |
| `hideHeader` | `true` or `false`| No, defaults to `false` | No, defaults to `false` | Hides the room header when in a call. |
| `hideScreensharing`| `true` or `false` | No, defaults to `false` | No, defaults to `false` | Hides the screen-sharing button. |
| `homeserver`| | Not applicable | No | Homeserver for registering a new (guest) user, configures non-default guest user server when creating a spa link. |
| `intent` | `start_call` or `join_existing`| No, defaults to `start_call` | No, defaults to `start_call` | The intent of the user with respect to the call. e.g. if they clicked a Start Call button, this would be `start_call`. If it was a Join Call button, it would be `join_existing`. |
| `lang` | [BCP 47](https://www.rfc-editor.org/info/bcp47) code| No | No | The language the app should use. |
| `password`| | No | No | E2EE password when using a shared secret. (For individual sender keys in embedded mode this is not required.) |
| `perParticipantE2EE`| `true` or `false` | No, defaults to `false` | No, defaults to `false`| Enables per participant encryption with Keys exchanged over encrypted matrix room messages. |
| `roomId`| [Matrix Room ID](https://spec.matrix.org/v1.12/appendices/#room-ids) | Yes | No | Anything about what room we're pointed to should be from useRoomIdentifier which parses the path and resolves alias with respect to the default server name, however roomId is an exception as we need the room ID in embedded widget mode, and not the room alias (or even the via params because we are not trying to join it). This is also not validated, where it is in `useRoomIdentifier()`. |
| `showControls`| `true` or `false` | No, defaults to `true` | No, defaults to `true` | Displays controls like mute, screen-share, invite, and hangup buttons during a call. |
| `skipLobby` (deprecated: use `intent` instead) | `true` or `false` | No. If `intent` is explicitly `start_call` then defaults to `true`. Otherwise defaults to `false` | No, defaults to `false` | Skips the lobby to join a call directly, can be combined with preload in widget. When `true` the audio and video inputs will be muted by default. (This means there currently is no way to start without muted video if one wants to skip the lobby. Also not in widget mode.) |
| `theme`| One of: `light`, `dark`, `light-high-contrast`, `dark-high-contrast` | No, defaults to `dark` | No, defaults to `dark` | UI theme to use. |
| `viaServers`| Comma separated list of [Matrix Server Names](https://spec.matrix.org/v1.12/appendices/#server-name) | Not applicable | No | Homeserver for joining a room, non-empty value required for rooms not on the user’s default homeserver. |
| Name | Values | Required for widget | Required for SPA | Description |
| `intent` | `start_call`, `join_existing`, `start_call_voice`, `join_existing_voice`, `start_call_dm`, `join_existing_dm`, `start_call_dm_voice`, or `join_existing_dm_voice`. | No, defaults to `start_call` | No, defaults to `start_call` | The intent is a special url parameter that defines the defaults for all the other parameters. In most cases it should be enough to only set the intent to setup element-call. |
| `allowIceFallback` | `true` or `false` | No, defaults to `false` | No, defaults to `false` | Allows use of fallback STUN servers for ICE if the user's homeserver doesn’t provide any. |
| `posthogUserId`| Posthog analytics ID | No| No | Available only with user's consent for sharing telemetry in Element Web. |
| `confineToRoom` | `true` or `false` | No, defaults to `false` | No, defaults to `false` | Keeps the user confined to the current call/room. |
| `displayName`| | No | No | Display name used for auto-registration. |
| `enableE2EE` (deprecated) | `true` or `false` | No, defaults to `true` | No, defaults to `true` | Legacy flag to enable end-to-end encryption, not used in the `livekit` branch. |
| `fontScale` | A decimal number such as `0.9` | No, defaults to `1.0` | No, defaults to `1.0` | Factor by which to scale the interface's font size. |
| `fonts`| | No | No | Defines the font(s) used by the interface. Multiple font parameters can be specified: `?font=font-one&font=font-two...`. |
| `header`| `none`, `standard` or `app_bar`| No, defaults to `standard` | No, defaults to `standard` | The style of headers to show. `standard` is the default arrangement, `none` hides the header entirely, and `app_bar` produces a header with a back button like you might see in mobile apps. The callback for the back button is `window.controls.onBackButtonPressed`. |
| `hideScreensharing` | `true` or `false` | No, defaults to `false` | No, defaults to `false` | Hides the screen-sharing button. |
| `homeserver`| | Not applicable | No | Homeserver for registering a new (guest) user, configures non-default guest user server when creating a spa link. |
| `lang` | [BCP 47](https://www.rfc-editor.org/info/bcp47) code | No | No | The language the app should use. |
| `password` | | No | No| E2EE password when using a shared secret. (For individual sender keys in embedded mode this is not required.) |
| `perParticipantE2EE`| `true` or `false` | No, defaults to `false` | No, defaults to `false` | Enables per participant encryption with Keys exchanged over encrypted matrix room messages. |
| `controlledAudioDevices` | `true` or `false` | No, defaults to `false` | No, defaults to `false` | Whether the [global JS controls for audio devices](./controls.md#audio-devices) should be enabled, allowing the list of audio devices to be controlled by the app hosting Element Call. |
| `roomId` | [Matrix Room ID](https://spec.matrix.org/v1.12/appendices/#room-ids) | Yes | No | Anything about what room we're pointed to should be from useRoomIdentifier which parses the path and resolves alias with respect to the default server name, however roomId is an exception as we need the room ID in embedded widget mode, and not the room alias (or even the via params because we are not trying to join it). This is also not validated, where it is in `useRoomIdentifier()`. |
| `showControls` | `true` or `false` | No, defaults to `true` | No, defaults to `true` | Displays controls like mute, screen-share, invite, and hangup buttons during a call. |
| `skipLobby` (deprecated: use `intent` instead) | `true` or `false` | No. If `intent` is explicitly `start_call` then defaults to `true`. Otherwise defaults to `false` | No, defaults to `false` | Skips the lobby to join a call directly, can be combined with preload in widget. When `true` the audio and video inputs will be muted by default. (This means there currently is no way to start without muted video if one wants to skip the lobby. Also not in widget mode.) |
| `theme` | One of: `light`, `dark`, `light-high-contrast`, `dark-high-contrast` | No, defaults to `dark` | No, defaults to `dark` | UI theme to use. |
| `viaServers` | Comma separated list of [Matrix Server Names](https://spec.matrix.org/v1.12/appendices/#server-name) | Not applicable | No | Homeserver for joining a room, non-empty value required for rooms not on the user’s default homeserver. |
| `sendNotificationType` | `ring` or `notification` | No | No | Will send a "ring" or "notification" `m.rtc.notification` event if the user is the first one in the call. |
| `autoLeaveWhenOthersLeft` | `true` or `false` | No, defaults to `false` | No, defaults to `false` | Whether the app should automatically leave the call when there is no one left in the call. |
| `waitForCallPickup` | `true` or `false` | No, defaults to `false` | No, defaults to `false` | When sending a notification, show UI that the app is awaiting an answer, play a dial tone, and (in widget mode) auto-close the widget once the notification expires. |
### Widget-only parameters
These parameters are only supported in [widget](./embedded-standalone.md) mode.
These parameters are only supported in [widget](./embedded_standalone.md) mode.
| `baseUrl` | | Yes | The base URL of the homeserver to use for media lookups. |
| `deviceId` | Matrix device ID | Yes | The Matrix device ID for the widget host. |
| `parentUrl` | | Yes | The url used to send widget action postMessages. This should be the domain of the client or the webview the widget is hosted in. (in case the widget is not in an Iframe but in a dedicated webview we send the postMessages same WebView the widget lives in. Filtering is done in the widget so it ignores the messages it receives from itself) |
| `posthogUserId` | Posthog user identifier | No | This replaces the `analyticsID` parameter |
| `preload` | `true` or `false` | No, defaults to `false` | Pauses app before joining a call until an `io.element.join` widget action is seen, allowing preloading. |
| `returnToLobby` | `true` or `false` | No, defaults to `false` | Displays the lobby in widget mode after leaving a call; shows a blank page if set to `false`. Useful for video rooms. |
| `userId` | [Matrix User Identifier](https://spec.matrix.org/v1.12/appendices/#user-identifiers) | Yes | The Matrix user ID. |
| `widgetId` | [MSC2774](https://github.com/matrix-org/matrix-spec-proposals/pull/2774) format widget ID | Yes | The id used by the widget. The presence of this parameter implies that element call will not connect to a homeserver directly and instead tries to establish postMessage communication via the `parentUrl`. |
| `baseUrl` | | Yes | The base URL of the homeserver to use for media lookups. |
| `deviceId` | Matrix device ID | Yes | The Matrix device ID for the widget host. |
| `parentUrl` | | Yes | The url used to send widget action postMessages. This should be the domain of the client or the webview the widget is hosted in. (In case the widget is not in an Iframe but in a dedicated webview, we send the postMessages in the same WebView the widget lives in. Filtering is done in the widget so it ignores the messages it receives from itself.) |
| `posthogUserId` | Posthog user identifier | No | This replaces the `analyticsID` parameter |
| `preload` | `true` or `false` | No, defaults to `false` | Pauses app before joining a call until an `io.element.join` widget action is seen, allowing preloading. |
| `returnToLobby` | `true` or `false` | No, defaults to `false` | Displays the lobby in widget mode after leaving a call; shows a blank page if set to `false`. Useful for video rooms. |
| `userId` | [Matrix User Identifier](https://spec.matrix.org/v1.12/appendices/#user-identifiers) | Yes | The Matrix user ID. |
| `widgetId` | [MSC2774](https://github.com/matrix-org/matrix-spec-proposals/pull/2774) format widget ID | Yes | The id used by the widget. The presence of this parameter implies that element call will not connect to a homeserver directly and instead tries to establish postMessage communication via the `parentUrl`. |
### Embedded-only parameters
These parameters are only supported in the [embedded](./embedded-standalone.md) package of Element Call and will be ignored in the [full](./embedded-standalone.md) package.
These parameters are only supported in the [embedded](./embedded_standalone.md) package of Element Call and will be ignored in the [full](./embedded_standalone.md) package.
| `posthogApiHost` | Posthog server URL | No | e.g. `https://posthog-element-call.element.io`. Only supported in embedded package. In full package the value from config is used. |
| `posthogApiKey` | Posthog project API key | No | Only supported in embedded package. In full package the value from config is used. |
| `rageshakeSubmitUrl` | Rageshake server URL endpoint | No | e.g. `https://element.io/bugreports/submit`. In full package the value from config is used. |
| `rageshakeSubmitUrl` | Rageshake server URL endpoint | No | e.g. `https://rageshakes.element.io/api/submit`. In full package the value from config is used. |
| `sentryDsn` | Sentry [DSN](https://docs.sentry.io/concepts/key-terms/dsn-explainer/) | No | In full package the value from config is used. |
| `sentryEnvironment` | Sentry [environment](https://docs.sentry.io/concepts/key-terms/key-terms/) | No | In full package the value from config is used. |
"analytics_notice":"Účastí v této beta verzi souhlasíte se shromažďováním anonymních údajů, které používáme ke zlepšování produktu. Více informací o tom, které údaje sledujeme, najdete v našich <2>Zásadách ochrany osobních údajů</2> a <6>Zásadách používání souborů cookie</6>.",
"call_ended_view":{
"create_account_button":"Vytvořit účet",
"create_account_prompt":"<0>Proč neskončit nastavením hesla, abyste mohli účet použít znovu?</0><1>Budete si moci nechat své jméno a nastavit si avatar pro budoucí hovory </1>",
"not_now_button":"Teď ne, vrátit se na domovskou obrazovku"
"feedback_done":"<0>Děkujeme za vaši zpětnou vazbu! </0>",
"feedback_prompt":"<0>Rádi si vyslechneme vaši zpětnou vazbu, abychom mohli vaše prostředí vylepšit. </0>",
"headline":"{{displayName}}, váš hovor skončil.",
"not_now_button":"Teď ne, vrátit se na domovskou obrazovku",
"reconnect_button":"Znovu připojit",
"survey_prompt":"Jak to probíhalo?"
},
"call_name":"Název hovoru",
"common":{
"analytics":"Analytika",
"audio":"Zvuk",
"avatar":"Avatar",
"back":"Zpět",
"display_name":"Zobrazované jméno",
"encrypted":"Šifrováno",
"home":"Domov",
"loading":"Načítání…",
"next":"Další",
"options":"Možnosti",
"password":"Heslo",
"preferences":"Předvolby",
"profile":"Profil",
"reaction":"Reakce",
"reactions":"Reakce",
"settings":"Nastavení",
"username":"Uživatelské jméno"
"unencrypted":"Nešifrováno",
"username":"Uživatelské jméno",
"video":"Video"
},
"developer_mode":{
"always_show_iphone_earpiece":"Zobrazit možnost sluchátek pro iPhone na všech platformách",
"show_non_member_tiles":"Zobrazit dlaždice pro nečlenská média",
"url_params":"Parametry URL",
"use_new_membership_manager":"Použijte novou implementaci volání MembershipManager",
"use_to_device_key_transport":"Použít přenos klíčů do zařízení. Tím se vrátíte k přenosu klíčů do místnosti, když jiný účastník hovoru pošle klíč místnosti"
},
"disconnected_banner":"Připojení k serveru bylo ztraceno.",
"error":{
"call_is_not_supported":"Volání není podporováno",
"call_not_found":"Volání nebylo nalezeno",
"call_not_found_description":"<0>Zdá se, že tento odkaz nepatří k žádnému existujícímu hovoru. Zkontrolujte, zda máte správný odkaz, nebo<2> vytvořte nový</2>.</0>",
"connection_lost":"Spojení ztraceno",
"connection_lost_description":"Hovor byl přerušen.",
"e2ee_unsupported":"Nekompatibilní prohlížeč",
"e2ee_unsupported_description":"Váš webový prohlížeč nepodporuje šifrované hovory. Mezi podporované prohlížeče patří Chrome, Safari a Firefox 117+.",
"generic":"Něco se pokazilo.",
"generic_description":"Odeslání protokolů ladění nám pomůže vystopovat problém.",
"insufficient_capacity":"Nedostatečná kapacita",
"insufficient_capacity_description":"Server dosáhl své maximální kapacity a v tuto chvíli se nemůžete připojit k hovoru. Zkuste to později nebo se obraťte na správce serveru, pokud problém přetrvává.",
"matrix_rtc_focus_missing":"Server není nakonfigurován pro práci s {{brand}}. Obraťte se na správce serveru (Doména: {{domain}}, Kód chyby: {{ errorCode }}).",
"open_elsewhere":"Otevřeno na jiné kartě",
"open_elsewhere_description":"{{brand}} byl otevřen v jiné záložce. Pokud to nezní správně, zkuste stránku znovu načíst.",
"unexpected_ec_error":"Došlo k neočekávané chybě (<0>Error Code:</0> <1>{{ errorCode }}</1>). Obraťte se prosím na správce serveru."
},
"group_call_loader":{
"banned_body":"Byl jste vykázán z místnosti.",
"banned_heading":"Zabanován",
"call_ended_body":"Byl jste vyřazen z hovoru.",
"call_ended_heading":"Hovor ukončen",
"knock_reject_body":"Vaše žádost o připojení byla zamítnuta.",
"knock_reject_heading":"Přístup odepřen",
"reason":"Důvod"
},
"handset":{
"overlay_back_button":"Zpět do režimu reproduktoru",
"overlay_description":"Funguje pouze při používání aplikace",
"overlay_title":"Režim sluchátka"
},
"hangup_button_label":"Ukončit hovor",
"header_label":"Domov Element Call",
"header_participants_label":"Účastníci",
"invite_modal":{
"link_copied_toast":"Odkaz zkopírován do schránky",
"title":"Pozvat na tento hovor"
},
"join_existing_call_modal":{
"join_button":"Ano, připojit se",
"text":"Tento hovor již existuje, chcete se připojit?",
"title":"Připojit se k existujícimu hovoru?"
},
"layout_grid_label":"Mřížka",
"layout_spotlight_label":"Soustředěný mód",
"lobby":{
"join_button":"Připojit se k hovoru"
"ask_to_join":"Žádost o připojení k hovoru",
"join_as_guest":"Připojte se jako host",
"join_button":"Připojit se k hovoru",
"leave_button":"Zpět na poslední",
"waiting_for_invite":"Žádost odeslána! Čekáme na povolení k připojení..."
},
"log_in":"Přihlášení",
"logging_in":"Přihlašování se…",
"login_auth_links":"<0>Vytvořit účet</0> Or <2>Jako host</2>",
"recaptcha_ssla_caption":"Tato stránka je chráněna ReCAPTCHA a platí zde <2>Ochrana osobních údajů</2> a <6>Podmínky služby</6> od Google.<9></9>Kliknutím na \"Registrovat\" souhlasíte s naší <12>Licenční smlouvou na software a služby (SSLA)</12>",
"register":{
"passwords_must_match":"Hesla se musí shodovat",
"registering":"Registrování…"
},
"register_auth_links":"<0>Už máte účet?</0><1><0>Přihlásit se</0> Or <2>Jako host</2></1>",
"feedback_tab_thank_you":"Děkujeme, obdrželi jsme vaši zpětnou vazbu!",
"feedback_tab_title":"Zpětná vazba",
"opt_in_description":"<0></0><1></1>Souhlas můžete odvolat zrušením zaškrtnutí tohoto políčka. Pokud jste právě v hovoru, toto nastavení se projeví po jeho skončení.",
"preferences_tab":{
"developer_mode_label":"Vývojářský režim",
"developer_mode_label_description":"Povolte vývojářský režim a zobrazte kartu nastavení vývojáře.",
"introduction":"Zde můžete nakonfigurovat další možnosti pro lepší zážitek.",
"reactions_play_sound_description":"Přehrát zvukový efekt, když někdo odešle reakci do hovoru.",
"analytics_notice":"Ved at deltage i denne beta giver du samtykke til indsamling af anonyme data, som vi bruger til at forbedre produktet. Du kan finde flere oplysninger om, hvilke data vi sporer, i vores <2>fortrolighedspolitik</2> og vores <6>cookiepolitik</6>.",
"call_ended_view":{
"create_account_button":"Opret konto",
"create_account_prompt":"<0>Hvorfor ikke afslutte med at oprette en adgangskode for at beholde din konto? </0><1>Du kan beholde dit navn og indstille en avatar til brug ved fremtidige opkald </1>",
"feedback_done":"<0>Tak for din feedback! </0>",
"feedback_prompt":"<0>Vi vil meget gerne høre din feedback, så vi kan forbedre din oplevelse.</0>",
"headline":"{{displayName}}, dit opkald er afsluttet.",
"not_now_button":"Ikke nu, vend tilbage til startskærmen",
"reconnect_button":"Tilslut igen",
"survey_prompt":"Hvordan gik det?"
},
"call_name":"Navn på opkald",
"common":{
"analytics":"Analyse-værktøj",
"audio":"Lyd",
"avatar":"Avatar",
"back":"Tilbage",
"display_name":"Vist navn",
"encrypted":"Krypteret",
"home":"Hjem",
"loading":"Indlæser...",
"next":"Næste",
"options":"Valgmuligheder",
"password":"Adgangskode",
"preferences":"Foretrukne",
"profile":"Profil",
"reaction":"Reaktion",
"reactions":"Reaktioner",
"settings":"Indstillinger",
"unencrypted":"Ikke krypteret",
"username":"Brugernavn",
"video":"Video"
},
"developer_mode":{
"always_show_iphone_earpiece":"Vis mulighed for iPhone-høretelefon på alle platforme",
"crypto_version":"Krypto-version: {{version}}",
"debug_tile_layout_label":"Fejlfinding af fliselayout",
"device_id":"Enheds-id: {{id}}",
"duplicate_tiles_label":"Antal ekstra flisekopier pr. deltager",
"environment_variables":"Miljøvariabler",
"hostname":"Værtsnavn: {{hostname}}",
"livekit_server_info":"LiveKit Serverinfo",
"livekit_sfu":"LiveKit SFU: {{url}}",
"matrix_id":"Matrix ID: {{id}}",
"mute_all_audio":"Slå al lyd fra (deltagere, reaktioner, deltagelseslyde)",
"show_non_member_tiles":"Vis fliser for medier fra ikke-medlemmer",
"url_params":"URL-parametre",
"use_new_membership_manager":"Brug den nye implementering af opkaldet MembershipManager",
"use_to_device_key_transport":"Bruges til at transportere enhedsnøgler. Dette vil falde tilbage til transport af værelsesnøgler, når et andet opkaldsmedlem sender en rumnøgle"
},
"disconnected_banner":"Forbindelsen til serveren er gået tabt.",
"error":{
"call_is_not_supported":"Opkald er ikke understøttet",
"call_not_found":"Opkald ikke fundet",
"call_not_found_description":"<0>Det link ser ikke ud til at høre til et eksisterende opkald. Tjek at du har det rigtige link, eller <2> opret et nyt</2>.</0>",
"connection_lost":"Forbindelsen gik tabt",
"connection_lost_description":"Du blev afbrudt fra opkaldet.",
"e2ee_unsupported":"Inkompatibel browser",
"e2ee_unsupported_description":"Din webbrowser understøtter ikke krypterede opkald. Understøttede browsere inkluderer Chrome, Safari og Firefox 117+.",
"generic":"Noget gik galt",
"generic_description":"Indsendelse af fejlfindingslogfiler hjælper os med at spore problemet.",
"insufficient_capacity_description":"Serveren har nået sin maksimale kapacitet, og du kan ikke deltage i opkaldet på dette tidspunkt. Prøv igen senere, eller kontakt din serveradministrator, hvis problemet fortsætter.",
"matrix_rtc_focus_missing":"Serveren er ikke konfigureret til at arbejde med {{brand}}{{domain}}. Kontakt venligst din serveradministrator (domæne:{{domain}}, fejlkode: {{ errorCode }}).",
"open_elsewhere":"Åbnet i en anden fane",
"open_elsewhere_description":"{{brand}} er blevet åbnet i en anden fane. Hvis det ikke lyder rigtigt, kan du prøve at genindlæse siden.",
"room_creation_restricted":"Kunne ikke oprette opkald",
"room_creation_restricted_description":"Oprettelse af opkald er muligvis begrænset til autoriserede brugere. Prøv igen senere, eller kontakt din serveradministrator, hvis problemet fortsætter.",
"unexpected_ec_error":"Der opstod en uventet fejl (<0>Fejlkode:</0> <1> {{ errorCode }}</1>). Kontakt venligst din serveradministrator."
},
"group_call_loader":{
"banned_body":"Du er blevet spærret fra rummet.",
"banned_heading":"Spærret",
"call_ended_body":"Du er blevet fjernet fra opkaldet.",
"call_ended_heading":"Opkaldet afsluttet",
"knock_reject_body":"Din anmodning om at deltage blev afvist.",
"knock_reject_heading":"Adgang nægtet",
"reason":"Årsag: {{reason}}"
},
"handset":{
"overlay_back_button":"Tilbage til højttalertilstand",
"overlay_description":"Virker kun, når du bruger appen",
"overlay_title":"Telefon-højtaler"
},
"hangup_button_label":"Afslut opkald",
"header_label":"Element Ring hjem",
"header_participants_label":"Deltagere",
"invite_modal":{
"link_copied_toast":"Link kopieret til udklipsholder",
"title":"Inviter til dette opkald"
},
"join_existing_call_modal":{
"join_button":"Ja, deltag i opkald",
"text":"Dette opkald findes allerede, vil du være med?",
"title":"Deltag i eksisterende opkald?"
},
"layout_grid_label":"Gitter",
"layout_spotlight_label":"Spotlys",
"lobby":{
"ask_to_join":"Anmod om at deltage i opkaldet",
"join_as_guest":"Deltag som gæst",
"join_button":"Deltag i opkald",
"leave_button":"Tilbage til seneste",
"waiting_for_invite":"Anmodning sendt! Venter på tilladelse til at deltage..."
},
"log_in":"Log ind",
"logging_in":"Logger ind...",
"login_auth_links":"<0>Opret en konto </0> eller <2> få adgang som gæst </2>",
"rageshake_button_error_caption":"Prøv at sende logfiler igen",
"rageshake_request_modal":{
"body":"En anden bruger på dette opkald har et problem. For bedre at kunne diagnosticere sådanne problemer, vil vi gerne indsamle en fejlfindingslog.",
"rageshake_sending_logs":"Afsendelse af fejlfindingslogfiler...",
"rageshake_sent":"Tak!",
"recaptcha_dismissed":"Recaptcha afvist",
"recaptcha_not_loaded":"Recaptcha ikke indlæst",
"recaptcha_ssla_caption":"Dette websted er beskyttet af ReCAPTCHA og Googles <2>Privatlivspolitik</2> og <6>Servicevilkår</6> gælder.<9></9>Ved at klikke på \"Registrer\" accepterer du vores <12>Software og Services Licensaftale (SSLA)</12>",
"register":{
"passwords_must_match":"Adgangskoderne skal være identiske",
"registering":"Registrering..."
},
"register_auth_links":"<0>Har du allerede en konto? </0><1><0>Log ind </0> eller <2> få adgang som gæst </2> </1>",
"feedback_tab_thank_you":"Tak, vi har modtaget din feedback!",
"feedback_tab_title":"Feedback",
"opt_in_description":"<0></0><1></1>Du kan trække dit samtykke tilbage ved at fjerne markeringen i dette felt. Hvis du i øjeblikket er i gang med et opkald, træder denne indstilling i kraft ved afslutningen af opkaldet.",
"preferences_tab":{
"developer_mode_label":"Udviklertilstand",
"developer_mode_label_description":"Aktivér udviklertilstand og vis fanen udviklerindstillinger.",
"introduction":"Her kan du konfigurere ekstra muligheder for en forbedret oplevelse.",
"reactions_play_sound_description":"Afspil en lydeffekt, når nogen sender en reaktion i et opkald.",
"analytics_notice":"Mit der Teilnahme an der Beta akzeptierst du die Sammlung von anonymen Daten, die wir zur Verbesserung des Produkts verwenden. Weitere Informationen zu den von uns erhobenen Daten findest du in unserer <2>Datenschutzerklärung</2> und unseren <6>Cookie-Richtlinien</6>.",
"app_selection_modal":{
"continue_in_browser":"Weiter im Browser",
"open_in_app":"In der App öffnen",
"text":"Bereit, beizutreten?",
"title":"App auswählen"
},
"call_ended_view":{
"create_account_button":"Konto erstellen",
"create_account_prompt":"<0>Warum vergibst du nicht abschließend ein Passwort, um dein Konto zu erhalten?</0><1>Du kannst deinen Namen behalten und ein Profilbild für zukünftige Anrufe festlegen.</1>",
@@ -55,29 +49,35 @@
"profile":"Profil",
"reaction":"Reaktion",
"reactions":"Reaktionen",
"reconnecting":"Verbindung wird wiederhergestellt...",
"settings":"Einstellungen",
"unencrypted":"Nicht verschlüsselt",
"username":"Benutzername",
"video":"Video"
},
"developer_mode":{
"always_show_iphone_earpiece":"iPhone-Ohrhörer-Option auf allen Plattformen anzeigen",
"use_to_device_key_transport":"To-Device media E2EE Schlüssel-Transport verwenden. Falls ein anderer Teilnehmer bereits den Raumschlüssel-Transport verwendet, wird automatisch auf Raumschlüssel-Transport zurückgegriffen."
},
"disconnected_banner":"Die Verbindung zum Server wurde getrennt.",
"error":{
"call_is_not_supported":"Anrufe werden nicht unterstützt",
"call_not_found":"Anruf nicht gefunden",
"call_not_found_description":"<0>Dieser Link scheint zu keinem bestehenden Anruf zu gehören. Vergewissern Sie sich, dass Sie den richtigen Link haben, oder <1> erstellen Sie einen neuen</1>.</0>",
"call_not_found_description":"<0>Dieser Link scheint zu keinem bestehenden Anruf zu gehören. Es sollte geprüft werden, ob der Link korrekt ist, oder <2>ein neuer erstellt werden</2>.</0>",
"connection_lost":"Verbindung verloren",
"connection_lost_description":"Ihre Verbindung zum Anruf wurde unterbrochen.",
"e2ee_unsupported":"Inkompatibler Browser",
@@ -89,6 +89,8 @@
"matrix_rtc_focus_missing":"Der Server ist nicht für die Verwendung mit {{brand}} konfiguriert. Bitte den Serveradministrator kontaktieren (Domain: {{domain}}, Fehlercode: {{ errorCode }}).",
"open_elsewhere":"In einem anderen Tab geöffnet",
"open_elsewhere_description":"{{brand}} wurde in einem anderen Tab geöffnet. Wenn das nicht richtig klingt, versuchen Sie, die Seite neu zu laden.",
"room_creation_restricted":"Anruf konnte nicht erstellt werden",
"room_creation_restricted_description":"Das Erstellen von Anrufen ist nur für autorisierte Nutzer möglich. Versuche es später erneut oder kontaktiere deinen Serveradministrator, falls das Problem weiterhin besteht.",
"unexpected_ec_error":"Ein unerwarteter Fehler ist aufgetreten (<0>Fehlercode: </0> <1>{{ errorCode }}</1>). Bitte den Serveradministrator kontaktieren."
},
"group_call_loader":{
@@ -100,6 +102,11 @@
"knock_reject_heading":"Zugriff verweigert",
"reason":"Grund: {{reason}}"
},
"handset":{
"overlay_back_button":"Zurück zum Lautsprechermodus",
"overlay_description":"Nur wenn App im Vordergrund nutzbar",
"recaptcha_caption":"Diese Seite wird durch reCAPTCHA geschützt und es gelten Googles <2>Datenschutzerklärung</2> und <6>Nutzungsbedingungen</6>. <9></9>Mit einem Klick auf „Registrieren“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)</2>",
"recaptcha_dismissed":"Recaptcha abgelehnt",
"recaptcha_not_loaded":"Recaptcha nicht geladen",
"recaptcha_ssla_caption":"Diese Website wird durch ReCAPTCHA geschützt, und es gelten die Google <2>Datenschutzbestimmungen</2> sowie die <6>Nutzungsbedingungen</6>.<9></9> Durch das Klicken auf \"Registrieren\" wird der <12>Software- und Dienstleistungslizenzvereinbarung (SSLA)</12> zugestimmt.",
"room_auth_view_eula_caption":"Mit einem Klick auf „Weiter“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)</2>",
"room_auth_view_ssla_caption":"Durch das Klicken auf \"Anruf jetzt beitreten\" wird dem <2>Software and Services License Agreement (SSLA)</2> zugestimmt.",
"screenshare_button_label":"Bildschirm teilen",
"settings":{
"audio_tab":{
"effect_volume_description":"Lautstärke anpassen, mit der Reaktionen und Handmeldungen abgespielt werden.",
"effect_volume_label":"Lautstärke der Soundeffekte"
},
"background_blur_header":"Hintergrund",
"background_blur_label":"Unschärfeeffekt für den Hintergrund aktivieren",
"blur_not_supported_by_browser":"(Hintergrundunschärfe wird von diesem Gerät nicht unterstützt.)",
"developer_tab_title":"Entwickler",
"devices":{
"camera":"Kamera",
"camera_numbered":"Kamera {{n}}",
"change_device_button":"Audiogerät wechseln",
"default":"Standard",
"default_named":"Standard<2> ({{name}} )</2>",
"handset":"Ohrhörer",
"loudspeaker":"Lautsprecher",
"microphone":"Mikrofon",
"microphone_numbered":"Mikrofon{{n}}",
"speaker":"Lautsprecher",
@@ -200,8 +213,8 @@
"submitting":"Sende…",
"switch_camera":"Kamera wechseln",
"unauthenticated_view_body":"Noch nicht registriert? <2>Konto erstellen</2>",
"unauthenticated_view_eula_caption":"Mit einem Klick auf „Los geht’s“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)</2>",
"unauthenticated_view_login_button":"Melde dich mit deinem Konto an",
"unauthenticated_view_ssla_caption":"Durch das Klicken auf \"Weiter\" wird dem <2>Software and Services License Agreement (SSLA)</2> zugestimmt.",
"analytics_notice":"Συμμετέχοντας σε αυτή τη δοκιμαστική έκδοση, συναινείτε στη συλλογή ανώνυμων δεδομένων, τα οποία χρησιμοποιούμε για τη βελτίωση του προϊόντος. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το ποια δεδομένα καταγράφουμε στην <2>Πολιτική απορρήτου</2> και στην <5>Πολιτική cookies</5>.",
"analytics_notice":"Συμμετέχοντας σε αυτή τη δοκιμαστική έκδοση, συναινείτε στη συλλογή ανώνυμων δεδομένων, τα οποία χρησιμοποιούμε για τη βελτίωση του προϊόντος. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το ποια δεδομένα καταγράφουμε στην <2>Πολιτική απορρήτου</2> και στην <6>Πολιτική cookies</6>.",
"call_ended_view":{
"create_account_button":"Δημιουργία λογαριασμού",
"create_account_prompt":"<0>Γιατί να μην ολοκληρώσετε με τη δημιουργία ενός κωδικού πρόσβασης για τη διατήρηση του λογαριασμού σας;</0><1>Θα μπορείτε να διατηρήσετε το όνομά σας και να ορίσετε ένα avatar για χρήση σε μελλοντικές κλήσεις.</1>",
@@ -20,19 +29,45 @@
"feedback_prompt":"<0>Θα θέλαμε να ακούσουμε τα σχόλιά σας ώστε να βελτιώσουμε την εμπειρία σας.</0>",
"headline":"{{displayName}}, η κλήση σας τερματίστηκε.",
"not_now_button":"Όχι τώρα, επιστροφή στην αρχική οθόνη",
"analytics_notice":"By participating in this beta, you consent to the collection of anonymous data, which we use to improve the product. You can find more information about which data we track in our <2>Privacy Policy</2> and our <6>Cookie Policy</6>.",
"app_selection_modal":{
"continue_in_browser":"Continue in browser",
"open_in_app":"Open in the app",
"text":"Ready to join?",
"title":"Select app"
},
"call_ended_view":{
"create_account_button":"Create account",
"create_account_prompt":"<0>Why not finish by setting up a password to keep your account?</0><1>You'll be able to keep your name and set an avatar for use on future calls</1>",
@@ -55,40 +50,72 @@
"profile":"Profile",
"reaction":"Reaction",
"reactions":"Reactions",
"reconnecting":"Reconnecting…",
"settings":"Settings",
"unencrypted":"Not encrypted",
"username":"Username",
"video":"Video"
},
"developer_mode":{
"always_show_iphone_earpiece":"Show iPhone earpiece option on all platforms",
"crypto_version":"Crypto version: {{version}}",
"custom_livekit_url":{
"current_url":"Currently set to: ",
"from_config":"Currently, no overwrite is set. Url from well-known or config is used.",
"label":"Custom Livekit-url",
"reset":"Reset overwrite",
"save":"Save",
"saving":"Saving..."
},
"debug_tile_layout_label":"Debug tile layout",
"device_id":"Device ID: {{id}}",
"duplicate_tiles_label":"Number of additional tile copies per participant",
"environment_variables":"Environment variables",
"hostname":"Hostname: {{hostname}}",
"livekit_server_info":"LiveKit Server Info",
"livekit_sfu":"LiveKit SFU: {{url}}",
"matrix_id":"Matrix ID: {{id}}",
"matrixRTCMode":{
"Comptibility":{
"description":"Compatible with homeservers that do not support sticky events (but all other EC clients are v0.17.0 or later)",
"label":"Compatibility: state events & multi SFU"
},
"Legacy":{
"description":"Compatible with old versions of EC that do not support multi SFU",
"label":"Legacy: state events & oldest membership SFU"
},
"Matrix_2_0":{
"description":"Compatible only with homservers supporting sticky events and all EC clients v0.17.0 or later",
"label":"Matrix 2.0: sticky events & multi SFU"
},
"title":"MatrixRTC mode"
},
"mute_all_audio":"Mute all audio (participants, reactions, join sounds)",
"show_non_member_tiles":"Show tiles for non-member media",
"use_new_membership_manager":"Use the new implementation of the call MembershipManager"
"url_params":"URL parameters"
},
"disconnected_banner":"Connectivity to the server has been lost.",
"error":{
"call_is_not_supported":"Call is not supported",
"call_not_found":"Call not found",
"call_not_found_description":"<0>That link doesn't appear to belong to any existing call. Check that you have the right link, or <1>create a new one</1>.</0>",
"call_not_found_description":"<0>That link doesn't appear to belong to any existing call. Check that you have the right link, or <2>create a new one</2>.</0>",
"connection_lost":"Connection lost",
"connection_lost_description":"You were disconnected from the call.",
"e2ee_unsupported":"Incompatible browser",
"e2ee_unsupported_description":"Your web browser does not support encrypted calls. Supported browsers include Chrome, Safari, and Firefox 117+.",
"failed_to_start_livekit":"Failed to start Livekit connection",
"generic":"Something went wrong",
"generic_description":"Submitting debug logs will help us track down the problem.",
"insufficient_capacity":"Insufficient capacity",
"insufficient_capacity_description":"The server has reached its maximum capacity and you cannot join the call at this time. Try again later, or contact your server admin if the problem persists.",
"matrix_rtc_focus_missing":"The server is not configured to work with {{brand}}. Please contact your server admin (Domain: {{domain}}, Error Code: {{ errorCode }}).",
"matrix_rtc_transport_missing":"The server is not configured to work with {{brand}}. Please contact your server admin (Domain: {{domain}}, Error Code: {{ errorCode }}).",
"membership_manager":"Membership Manager Error",
"membership_manager_description":"The Membership Manager had to shut down. This is caused by many consequtive failed network requests.",
"no_matrix_2_authorization_service":"The authorization service for your media server (SFU) is out of date.",
"open_elsewhere":"Opened in another tab",
"open_elsewhere_description":"{{brand}} has been opened in another tab. If that doesn't sound right, try reloading the page.",
"room_creation_restricted":"Failed to create call",
"room_creation_restricted_description":"Call creation might be restricted to authorized users only. Try again later, or contact your server admin if the problem persists.",
"unexpected_ec_error":"An unexpected error occurred (<0>Error Code:</0> <1>{{ errorCode }}</1>). Please contact your server admin."
},
"group_call_loader":{
@@ -100,6 +127,11 @@
"knock_reject_heading":"Access denied",
"reason":"Reason: {{reason}}"
},
"handset":{
"overlay_back_button":"Back to Speaker Mode",
"overlay_description":"Only works while using app",
"overlay_title":"Handset Mode"
},
"hangup_button_label":"End call",
"header_label":"Element Call Home",
"header_participants_label":"Participants",
@@ -114,6 +146,7 @@
},
"layout_grid_label":"Grid",
"layout_spotlight_label":"Spotlight",
"layout_switch_label":"Layout",
"lobby":{
"ask_to_join":"Request to join call",
"join_as_guest":"Join as guest",
@@ -142,9 +175,9 @@
"rageshake_sending":"Sending…",
"rageshake_sending_logs":"Sending debug logs…",
"rageshake_sent":"Thanks!",
"recaptcha_caption":"This site is protected by ReCAPTCHA and the Google <2>Privacy Policy</2> and <6>Terms of Service</6> apply.<9></9>By clicking \"Register\", you agree to our <12>End User Licensing Agreement (EULA)</12>",
"recaptcha_dismissed":"Recaptcha dismissed",
"recaptcha_not_loaded":"Recaptcha not loaded",
"recaptcha_ssla_caption":"This site is protected by ReCAPTCHA and the Google <2>Privacy Policy</2> and <6>Terms of Service</6> apply.<9></9>By clicking \"Register\", you agree to our <12>Software and Services License Agreement (SSLA)</12>",
"register":{
"passwords_must_match":"Passwords must match",
"registering":"Registering…"
@@ -154,19 +187,25 @@
"register_heading":"Create your account",
"return_home_button":"Return to home screen",
"room_auth_view_continue_button":"Continue",
"room_auth_view_eula_caption":"By clicking \"Continue\", you agree to our <2>End User Licensing Agreement (EULA)</2>",
"room_auth_view_ssla_caption":"By clicking \"Join call now\", you agree to our <2>Software and Services License Agreement (SSLA)</2>",
"screenshare_button_label":"Share screen",
"settings":{
"audio_tab":{
"effect_volume_description":"Adjust the volume at which reactions and hand raised effects play.",
"effect_volume_label":"Sound effect volume"
},
"background_blur_header":"Background",
"background_blur_label":"Blur the background of the video",
"blur_not_supported_by_browser":"(Background blur is not supported by this device.)",
"developer_tab_title":"Developer",
"devices":{
"camera":"Camera",
"camera_numbered":"Camera {{n}}",
"change_device_button":"Change audio device",
"default":"Default",
"default_named":"Default <2>({{name}})</2>",
"handset":"Handset",
"loudspeaker":"Loudspeaker",
"microphone":"Microphone",
"microphone_numbered":"Microphone {{n}}",
"speaker":"Speaker",
@@ -200,18 +239,20 @@
"submitting":"Submitting…",
"switch_camera":"Switch camera",
"unauthenticated_view_body":"Not registered yet? <2>Create an account</2>",
"unauthenticated_view_eula_caption":"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>",
"unauthenticated_view_login_button":"Login to your account",
"unauthenticated_view_ssla_caption":"By clicking \"Go\", you agree to our <2>Software and Services License Agreement (SSLA)</2>",
"rageshake_send_logs":"Enviar registros de depuración",
"rageshake_sending":"Enviando…",
"rageshake_sending_logs":"Enviando registros de depuración…",
"recaptcha_caption":"Este sitio está protegido por ReCAPTCHA y se aplican la <2>Política de Privacidad</2> y los <6>Términos de Servicio de Google.<9></9>Al hacer clic en \"Registrar\", aceptas nuestro <12>Contrato de Licencia de Usuario Final (CLUF)</12>",
"recaptcha_dismissed":"Recaptcha cancelado",
"recaptcha_not_loaded":"No se ha cargado el Recaptcha",
"register":{
@@ -60,7 +62,6 @@
"register_auth_links":"<0>¿Ya tienes una cuenta?</0><1><0>Iniciar sesión</0> o <2>Acceder como invitado</2></1>",
"analytics_notice":"Nõustudes selle beetaversiooni kasutamisega sa nõustud ka toote arendamiseks kasutatavate anonüümsete andmete kogumisega. Täpsemat teavet kogutavate andmete kohta leiad meie <2>Privaatsuspoliitikast</2> ja meie <5>Küpsiste kasutamise reeglitest</5>.",
"app_selection_modal":{
"continue_in_browser":"Jätka veebibrauseris",
"open_in_app":"Ava rakenduses",
"text":"Oled valmis liituma?",
"title":"Vali rakendus"
"submit":"Saada",
"upload_file":"Laadi fail üles"
},
"analytics_notice":"Nõustudes selle beetaversiooni kasutamisega, sa nõustud ka toote arendamiseks kasutatavate anonüümsete andmete kogumisega. Täpsemat teavet kogutavate andmete kohta leiad meie <2>Privaatsuspoliitikast</2> ja meie <6>Küpsiste kasutamise reeglitest</6>.",
"call_ended_view":{
"create_account_button":"Loo konto",
"create_account_prompt":"<0>Kas soovid salasõna seadistada ja sellega oma kasutajakonto alles jätta?</0><1>Nii saad säilitada oma nime ja määrata profiilipildi, mida saad kasutada tulevastes kõnedes</1>",
@@ -33,20 +34,79 @@
},
"call_name":"Kõne nimi",
"common":{
"analytics":"Analüütika",
"audio":"Heli",
"avatar":"Tunnuspilt",
"back":"Tagasi",
"display_name":"Kuvatav nimi",
"encrypted":"Krüptitud",
"home":"Avavaatesse",
"home":"Kodu",
"loading":"Laadimine …",
"next":"Edasi",
"options":"Valikud",
"password":"Salasõna",
"preferences":"Eelistused",
"profile":"Profiil",
"reaction":"Reaktsioon",
"reactions":"Reageerimised",
"settings":"Seadistused",
"unencrypted":"Krüptimata",
"username":"Kasutajanimi"
"username":"Kasutajanimi",
"video":"Video"
},
"developer_mode":{
"always_show_iphone_earpiece":"Näita iPhone'i kuulari valikut kõikidel platvormidel",
"mute_all_audio":"Summuta kõik helid (osalejad, regeerimised, liitumise helid)",
"show_connection_stats":"Näita ühenduse statistikat",
"show_non_member_tiles":"Näita ka mitteseotud meedia paane",
"url_params":"Võrguaadressi parameetrid",
"use_new_membership_manager":"Kasuta kõne liikmelisuse halduri (MembershipManager) uut implementatsiooni",
"use_to_device_key_transport":"Kasuta seadmepõhist krüptovõtmete vahetust. Kui jututoa liige peaks saatma jututoakohase krüptovõtme, siis kasuta jututoakohast võtmevahetust"
},
"disconnected_banner":"Võrguühendus serveriga on katkenud.",
"error":{
"call_is_not_supported":"Kõne pole toetatud",
"call_not_found":"Kõnet ei leidu",
"call_not_found_description":"<0>See link ei tundu olema seotud ühegi olemasoleva kõnega. Kontrolli, et sul on õige link või <2>loo uus</2>.</0>",
"connection_lost":"Ühendus on katkenud",
"connection_lost_description":"Sinu ühendus selle kõnega on katkenud.",
"e2ee_unsupported":"Mitteühilduv brauser",
"e2ee_unsupported_description":"Sinu veebibrauser ei toeta krüptitud kõnesid. Toimivad veebibrauserid on Chrome, Safari, ja Firefox 117+.",
"generic":"Midagi läks valesti",
"generic_description":"Silumis- ja vealogide saatmine võib aidata meid vea põhjuseni jõuda.",
"insufficient_capacity":"Mittepiisav jõudlus",
"insufficient_capacity_description":"Serveri jõudluse ülempiir on hetkel ületatud ja sa ei saa hetkel selle kõnega liituda. Proovi hiljem uuesti või kui probleem kestab kauem, siis võta ühendust serveri haldajaga.",
"matrix_rtc_focus_missing":"See server pole seadistatud töötama rakendusega {{brand}}. Palun võta ühendust serveri halduriga (domeen: {{domain}}, veakood: {{ errorCode }}).",
"open_elsewhere":"Avatud teisel vahekaardil",
"open_elsewhere_description":"{{brand}} on avatud teisel vahekaardil. Kui see ei tundu olema õige, proovi selle lehe uuesti laadimist.",
"room_creation_restricted":"Kõne loomine ei õnnestunud",
"room_creation_restricted_description":"Kõne loomine võib olla lubatud ainult volitatud kasutajatele. Proovi hiljem uuesti või probleemi püsimisel võta ühendust oma serveri haldajaga.",
"rageshake_button_error_caption":"Proovi uuesti logisid saata",
"rageshake_request_modal":{
"body":"Ühel teisel selles kõnes osalejal on lahenduse kasutamisel tekkinud probleem ning selle põhjuse leidmiseks me sooviksime koguda silumislogisid.",
"recaptcha_caption":"Selles saidis on kasutusel ReCAPTCHA ja kehtivad Google'i <2>Privaatsuspoliitika</2> ning <6>Teenusetingimused</6>.<9></9>Klõpsides „Registreeru“, sa nõustud meie <12>Lõppkasutaja litsentsilepingu (EULA) tingimustega</12>",
"recaptcha_dismissed":"Robotilõks on vahele jäetud",
"recaptcha_not_loaded":"Robotilõks pole laetud",
"recaptcha_ssla_caption":"Selle saidi kaitsmiseks on kasutusel ReCAPTCHA ning rakenduvad Google'i <2>Privaatusreeglid</2> ja <6>Kasutustingimused</6>.<9></9>Klõpsides „Registreeru“ nõustud sa meie <12>Tarkvara ja teenuste litsentseerimise lepinguga (Software and Services License Agreement - SSLA)</12>",
"register":{
"passwords_must_match":"Salasõnad ei klapi",
"registering":"Registreerimine…"
},
"register_auth_links":"<0>On sul juba konto?</0><1><0>Logi sisse</0> Või <2>Logi sisse külalisena</2></1>",
"register_auth_links":"<0>On sul juba konto?</0><1><0>Logi sisse</0> või <2>Logi sisse külalisena</2></1>",
"room_auth_view_eula_caption":"Klõpsides „Liitu kõnega kohe“, nõustud sa meie <2>Lõppkasutaja litsentsilepinguga (EULA)</2>",
"room_auth_view_continue_button":"Jätka",
"room_auth_view_ssla_caption":"Klõpsides „Liitu kõnega“ nõustud sa meie <2>Tarkvara ja teenuste litsentseerimise lepinguga (Software and Services License Agreement - SSLA)</2>",
"screenshare_button_label":"Jaga ekraani",
"settings":{
"audio_tab":{
"effect_volume_description":"Häälesta helivaljust, mida kasutatakse käe tõstmisel ja regeerimisel",
"effect_volume_label":"Efektide helivajlus"
},
"background_blur_header":"Taust",
"background_blur_label":"Hägusta video taust",
"blur_not_supported_by_browser":"(Tausta hägustamine pole selles seadmes toetatud.)",
"developer_tab_title":"Arendaja",
"devices":{
"camera":"Kaamera",
"camera_numbered":"Kaamera {{n}}",
"change_device_button":"Muuda heliseadet",
"default":"Vaikimisi",
"default_named":"Vaikimisi <2>({{name}})</2>",
"loudspeaker":"Valjuhääldi",
"microphone":"Mikrofon",
"microphone_numbered":"Mikrofon {{n}}",
"speaker":"Kõlar",
"speaker_numbered":"Kõlar {{n}}"
},
"feedback_tab_body":"Kui selle rakenduse kasutamisel tekib sul probleeme või lihtsalt soovid oma arvamust avaldada, siis palun täida alljärgnev lühike kirjeldus.",
"feedback_tab_thank_you":"Tänud, me oleme sinu tagasiside kätte saanud!",
"feedback_tab_title":"Tagasiside",
"opt_in_description":"<0></0><1></1>Sa võid selle valiku eelmaldamisega alati oma nõusoleku tagasi võtta. Kui sul parasjagu on kõne pooleli, siis seadistuste muudatus jõustub pärast kõne lõppu."
"opt_in_description":"<0></0><1></1>Sa võid selle valiku eelmaldamisega alati oma nõusoleku tagasi võtta. Kui sul parasjagu on kõne pooleli, siis seadistuste muudatus jõustub pärast kõne lõppu.",
"preferences_tab":{
"developer_mode_label":"Arendajate režiim",
"developer_mode_label_description":"Kasuta arendusrežiimi ja näita asjakohaseid seadistusi.",
"introduction":"Parema kasutuskogemuse nimel saad siin seadistada täiendavaid eelistusi.",
"reactions_play_sound_description":"Kui keegi lisab käimasolevale kõnele reaktsiooni, siis täienda seda heliefektiga.",
"stop_screenshare_button_label":"Ekraanivaade on jagamisel",
"stop_video_button_label":"Peata videovoog",
"submitting":"Saadan…",
"switch_camera":"Vaheta kaamerat",
"unauthenticated_view_body":"Sa pole veel registreerunud? <2>Loo kasutajakonto</2>",
"unauthenticated_view_eula_caption":"Klõpsides „Jätka“, nõustud sa meie <2>Lõppkasutaja litsentsilepinguga (EULA)</2>",
"unauthenticated_view_login_button":"Logi oma kontosse sisse",
"unauthenticated_view_ssla_caption":"Klõpsides „Jätka“ nõustud sa meie <2>Tarkvara ja teenuste litsentseerimise lepinguga (Software and Services License Agreement - SSLA)</2>",
"analytics_notice":"Osallistumalla tähän betaan hyväksyt nimettömien tietojen keräämisen, joita käytämme tuotteen parantamiseen. Löydät lisätietoa siitä, mitä tietoja seuraamme meidän <2> Tietosuojakäytännöstä</2> ja <6>Evästekäytännöstä</6> .",
"call_ended_view":{
"create_account_button":"Luo tili",
"create_account_prompt":"<0>Miksi et viimeistelisi määrittämällä salasanaa tilisi säilyttämiseksi?</0><1>Voit säilyttää nimesi ja asettaa avatarin käytettäväksi tulevissa puheluissa</1>",
"feedback_done":"<0>Kiitos palautteestasi!</0>",
"feedback_prompt":"<0>Haluaisimme kuulla palautteesi, jotta voimme parantaa käyttökokemustasi.</0>",
"headline":"{{displayName}}, puhelusi on päättynyt.",
"use_new_membership_manager":"Käytä uutta puhelun MembershipManagerin toteutusta",
"use_to_device_key_transport":"Käytä laitteen avainten kuljetusta. Tämä palaa huoneen avainten siirtoon, kun toinen puhelun jäsen lähettää huoneavaimen"
},
"disconnected_banner":"Yhteys palvelimeen on katkennut.",
"error":{
"call_is_not_supported":"Puhelua ei tueta",
"call_not_found":"Puhelua ei löydy",
"call_not_found_description":"<0>Kyseinen linkki ei näytä kuuluvan mihinkään olemassa olevaan puheluun. Tarkista, että sinulla on oikea linkki, tai <1>luo uusi linkki</1>.</0>",
"insufficient_capacity_description":"Palvelin on saavuttanut maksimikapasiteettinsa, etkä voi liittyä puheluun tällä hetkellä. Yritä myöhemmin uudelleen tai ota yhteyttä palvelimen ylläpitäjään, jos ongelma jatkuu.",
"matrix_rtc_focus_missing":"Palvelinta ei ole määritetty toimimaan {{brand}} -sovelluksen kanssa. Ota yhteyttä palvelimen ylläpitäjään (Verkkotunnus: {{domain}}, Virhekoodi: {{ errorCode }}).",
"open_elsewhere":"Avattu toisessa välilehdessä",
"open_elsewhere_description":"{{brand}} on avattu toisessa välilehdessä. Jos tämä ei kuulosta oikealta, yritä ladata sivu uudelleen.",
"unexpected_ec_error":"Tapahtui odottamaton virhe (<0>Virhekoodi:</0> <1>{{ errorCode }}</1>). Ota yhteyttä palvelimen ylläpitäjään."
},
"group_call_loader":{
"banned_body":"Sinulle on annettu porttikielto huoneesta.",
"banned_heading":"Kielletty",
"call_ended_body":"Sinut on poistettu puhelusta.",
"recaptcha_not_loaded":"Recaptcha ei ole ladattu",
"recaptcha_ssla_caption":"Tämä sivusto on suojattu ReCAPTCHA:lla, ja siihen sovelletaan Googlen <2>Tietosuojakäytäntöä</2> ja <6>Palveluehtoja</6>.<9></9>Klikkaamalla \"Rekisteröidy\" hyväksyt <12>ohjelmisto- ja palvelulisenssisopimuksen (SSLA)</12>",
"register":{
"passwords_must_match":"Salasanojen on täsmättävä",
"registering":"Rekisteröidään…"
},
"register_auth_links":"<0>Onko sinulla jo tili?</0><1><0>Kirjaudu sisään</0> tai <2>Käytä vieraana</2></1>",
"opt_in_description":"<0></0><1></1>Voit peruuttaa suostumuksesi poistamalla tämän ruudun valinnan. Jos puhelu on käynnissä, tämä asetus tulee voimaan puhelun lopussa.",
"preferences_tab":{
"developer_mode_label":"Kehittäjätila",
"developer_mode_label_description":"Ota kehittäjätila käyttöön ja näytä kehittäjäasetukset-välilehti.",
"introduction":"Täällä voit määrittää lisävaihtoehtoja parempaa käyttökokemusta varten.",
"reactions_play_sound_description":"Toista äänitefekti, kun joku lähettää reaktion puheluun.",
"analytics_notice":"En participant à cette beta, vous consentez à la collecte de données anonymes, qui seront utilisées pour améliorer le produit. Vous trouverez plus d’informations sur les données collectées dans notre <2>Politique de vie privée</2> et notre <5>Politique de cookies</5>.",
"app_selection_modal":{
"continue_in_browser":"Continuer dans le navigateur",
"open_in_app":"Ouvrir dans l’application",
"text":"Prêt à rejoindre?",
"title":"Choisissez l’application"
},
"call_ended_view":{
"create_account_button":"Créer un compte",
"create_account_prompt":"<0>Pourquoi ne pas créer un mot de passe pour conserver votre compte?</0><1>Vous pourrez garder votre nom et définir un avatar pour vos futurs appels</1>",
@@ -77,7 +71,6 @@
"rageshake_sending":"Envoi…",
"rageshake_sending_logs":"Envoi des journaux de débogage…",
"rageshake_sent":"Merci!",
"recaptcha_caption":"Ce site est protégé par ReCAPTCHA, la <2>politique de confidentialité</2> et les <6>conditions d’utilisation</6> de Google s’appliquent.<9></9>En cliquant sur « S’enregistrer» vous acceptez également notre <12>Contrat de Licence Utilisateur Final (CLUF)</12>",
"recaptcha_dismissed":"Recaptcha refusé",
"recaptcha_not_loaded":"Recaptcha non chargé",
"register":{
@@ -87,7 +80,6 @@
"register_auth_links":"<0>Vous avez déjà un compte?</0><1><0>Se connecter</0> Ou <2>Accès invité</2></1>",
"register_confirm_password_label":"Confirmer le mot de passe",
"return_home_button":"Retour à l’accueil",
"room_auth_view_eula_caption":"En cliquant sur «Rejoindre l’appel maintenant», vous acceptez notre <2>Contrat de Licence Utilisateur Final (CLUF)</2>",
"screenshare_button_label":"Partage d’écran",
"settings":{
"developer_tab_title":"Développeur",
@@ -107,7 +99,6 @@
"stop_video_button_label":"Arrêter la vidéo",
"submitting":"Envoi…",
"unauthenticated_view_body":"Pas encore de compte? <2>En créer un</2>",
"unauthenticated_view_eula_caption":"En cliquant sur «Commencer», vous acceptez notre <2>Contrat de Licence Utilisateur Final (CLUF)</2>",
"unauthenticated_view_login_button":"Connectez vous à votre compte",
"unmute_microphone_button_label":"Allumer le microphone",
"analytics_notice":"Dengan bergabung dalam beta ini, Anda mengizinkan kami untuk mengumpulkan data anonim, yang kami gunakan untuk meningkatkan produk ini. Anda dapat mempelajari lebih lanjut tentang data apa yang kami lacak dalam <2>Kebijakan Privasi</2> dan <5>Kebijakan Kuki</5> kami.",
"app_selection_modal":{
"continue_in_browser":"Lanjutkan dalam peramban",
"open_in_app":"Buka dalam aplikasi",
"text":"Siap untuk bergabung?",
"title":"Pilih plikasi"
},
"call_ended_view":{
"create_account_button":"Buat akun",
"create_account_prompt":"<0>Kenapa tidak selesaikan dengan mengatur sebuah kata sandi untuk menjaga akun Anda?</0><1>Anda akan dapat tetap menggunakan nama Anda dan atur sebuah avatar untuk digunakan dalam panggilan di masa mendatang</1>",
"duplicate_tiles_label":"Jumlah salinan ubin tambahan per peserta",
"environment_variables":"Variabel lingkungan",
"hostname":"Nama hos: {{hostname}}",
"livekit_server_info":"Info Server LiveKit",
"livekit_sfu":"SFU LiveKit: {{url}}",
"matrix_id":"ID Matrix: {{id}}",
"show_connection_stats":"Tampilkan statistik koneksi",
"show_non_member_tiles":"Tampilkan ubin untuk media non-anggota",
"url_params":"Parameter URL",
"use_new_membership_manager":"Gunakan implementasi baru dari panggilan MembershipManager",
"use_to_device_key_transport":"Gunakan untuk transportasi kunci perangkat. Ini akan kembali ke transportasi kunci ruangan ketika anggota panggilan lain mengirim kunci ruangan"
},
"disconnected_banner":"Koneksi ke server telah hilang.",
"error":{
"call_is_not_supported":"Panggilan tidak didukung",
"call_not_found":"Panggilan tidak ditemukan",
"call_not_found_description":"<0>Tautan itu tampaknya bukan milik panggilan yang ada. Periksa apakah Anda memiliki tautan yang tepat, atau <1> buat yang baru</1>.</0>",
"connection_lost":"Koneksi terputus",
"connection_lost_description":"Anda terputus dari panggilan.",
"e2ee_unsupported":"Peramban tidak kompatibel",
"e2ee_unsupported_description":"Peramban web Anda tidak mendukung panggilan terenkripsi. Peramban yang didukung meliputi Chrome, Safari, dan Firefox 117+.",
"generic":"Ada yang salah",
"generic_description":"Mengirimkan log awakutu akan membantu kami melacak masalah.",
"insufficient_capacity":"Kapasitas tidak mencukupi",
"insufficient_capacity_description":"Server telah mencapai kapasitas maksimum dan Anda tidak dapat bergabung dalam panggilan saat ini. Coba lagi nanti, atau hubungi admin server Anda jika masalah masih berlanjut.",
"matrix_rtc_focus_missing":"Server tidak dikonfigurasi untuk bekerja dengan {{brand}}. Silakan hubungi admin server Anda (Domain: {{domain}}, Kode Kesalahan: {{ errorCode }}).",
"open_elsewhere":"Dibuka di tab lain",
"open_elsewhere_description":"{{brand}} telah dibuka di tab lain. Jika sepertinya tidak benar, coba muat ulang halaman.",
"unexpected_ec_error":"Terjadi kesalahan tak terduga (<0> Kode Kesalahan:</0><1>{{ errorCode }}</1>). Silakan hubungi admin server Anda."
},
"group_call_loader":{
"banned_body":"Anda telah dilarang dari ruangan.",
"banned_heading":"Dilarang",
"call_ended_body":"Anda telah dikeluarkan dari panggilan.",
"call_ended_heading":"Panggilan berakhir",
"knock_reject_body":"Permintaan Anda untuk bergabung ditolak.",
"knock_reject_heading":"Akses ditolak",
"reason":"Alasan: {{reason}}"
},
"hangup_button_label":"Akhiri panggilan",
"header_label":"Beranda Element Call",
"header_participants_label":"Peserta",
@@ -59,15 +112,23 @@
"layout_grid_label":"Kisi",
"layout_spotlight_label":"Sorotan",
"lobby":{
"ask_to_join":"Permintaan untuk bergabung dalam panggilan",
"join_as_guest":"Bergabung sebagai tamu",
"join_button":"Bergabung ke panggilan",
"leave_button":"Kembali ke terkini"
"leave_button":"Kembali ke terkini",
"waiting_for_invite":"Permintaan terkirim! Menunggu izin untuk bergabung…"
},
"log_in":"Masuk",
"logging_in":"Memasuki…",
"login_auth_links":"<0>Buat akun</0> Atau <2>Akses sebagai tamu</2>",
"login_auth_links_prompt":"Belum terdaftar?",
"login_subheading":"Untuk melanjutkan ke Element",
"rageshake_button_error_caption":"Kirim ulang catatan",
"rageshake_request_modal":{
"body":"Pengguna yang lain di panggilan ini sedang mengalami masalah. Supaya dapat mendiagnosa masalah ini, kami ingin mengumpulkan sebuah catatan pengawakutuan.",
"recaptcha_caption":"Situs ini dilindungi oleh reCAPTCHA dan <2>Kebijakan Privasi</2> dan <6>Ketentuan Layanan</6> Google berlaku.<9></9>Dengan mengeklik \"Daftar\", Anda menyetujui <12>Perjanjian Lisensi Pengguna Akhir (EULA)</12> kami",
"recaptcha_dismissed":"Recaptcha ditutup",
"recaptcha_not_loaded":"Recaptcha tidak dimuat",
"recaptcha_ssla_caption":"Situs ini dilindungi oleh ReCAPTCHA dan <2>Kebijakan Privasi</2> dan <6>Ketentuan Layanan</6> Google berlaku.<9></9>Dengan mengeklik \"Daftar\", Anda menyetujui <12>Perjanjian Lisensi Perangkat Lunak dan Layanan (SSLA) kami</12>",
"register":{
"passwords_must_match":"Kata sandi harus cocok",
"registering":"Mendaftarkan…"
},
"register_auth_links":"<0>Sudah punya akun?</0><1><0>Masuk</0> Atau <2>Akses sebagai tamu</2></1>",
"register_confirm_password_label":"Konfirmasi kata sandi",
"register_heading":"Buat akun Anda",
"return_home_button":"Kembali ke layar beranda",
"room_auth_view_eula_caption":"Dengan mengeklik \"Bergabung ke panggilan sekarang\", Anda menyetujui <2>Perjanjian Lisensi Pengguna Akhir (EULA)</2> kami",
"room_auth_view_continue_button":"Lanjutkan",
"room_auth_view_ssla_caption":"Dengan mengeklik “Gabung panggilan sekarang”, Anda menyetujui <2>Perjanjian Lisensi Perangkat Lunak dan Layanan (SSLA) kami</2>",
"screenshare_button_label":"Bagikan layar",
"settings":{
"audio_tab":{
"effect_volume_description":"Sesuaikan volume saat reaksi dan efek tangan terangkat diputar.",
"effect_volume_label":"Volume efek suara"
},
"background_blur_header":"Latar belakang",
"background_blur_label":"Buramkan latar belakang video",
"blur_not_supported_by_browser":"(Pemburaman latar belakang tidak didukung oleh perangkat ini.)",
"developer_tab_title":"Pengembang",
"devices":{
"camera":"Kamera",
"camera_numbered":"Kamera {{n}}",
"default":"Bawaan",
"default_named":"Bawaan <2>({{name}})</2>",
"microphone":"Mikrofon",
"microphone_numbered":"Mikrofon {{n}}",
"speaker":"Speaker",
"speaker_numbered":"Speaker {{n}}"
},
"feedback_tab_body":"Jika Anda mengalami masalah atau hanya ingin memberikan masukan, silakan kirimkan kami deskripsi pendek di bawah.",
"feedback_tab_thank_you":"Terima kasih, kami telah menerima masukan Anda!",
"feedback_tab_title":"Masukan",
"opt_in_description":"<0></0><1></1>Anda dapat mengurungkan kembali izin dengan mencentang kotak ini. Jika Anda saat ini dalam panggilan, pengaturan ini akan diterapkan di akhir panggilan."
"opt_in_description":"<0></0><1></1>Anda dapat mengurungkan kembali izin dengan mencentang kotak ini. Jika Anda saat ini dalam panggilan, pengaturan ini akan diterapkan di akhir panggilan.",
"preferences_tab":{
"developer_mode_label":"Mode pengembang",
"developer_mode_label_description":"Aktifkan mode pengembang dan tampilkan tab pengaturan pengembang.",
"introduction":"Di sini Anda dapat mengonfigurasi opsi tambahan untuk pengalaman yang lebih baik.",
"reactions_play_sound_description":"Mainkan efek suara ketika seseorang mengirim reaksi ke panggilan.",
"reactions_play_sound_label":"Putar suara reaksi",
"reactions_show_description":"Tampilkan animasi ketika ada yang mengirimkan reaksi.",
"reactions_show_label":"Tampilkan reaksi",
"show_hand_raised_timer_description":"Tampilkan pengatur waktu saat peserta mengangkat tangannya",
"analytics_notice":"Partecipando a questa beta, acconsenti alla raccolta di dati anonimi che usiamo per migliorare il prodotto. Puoi trovare più informazioni su quali dati monitoriamo nella nostra <2>informativa sulla privacy</2> e nell'<5>informativa sui cookie</5>.",
"app_selection_modal":{
"continue_in_browser":"Continua nel browser",
"open_in_app":"Apri nell'app",
"text":"Tutto pronto per entrare?",
"title":"Seleziona app"
},
"call_ended_view":{
"create_account_button":"Crea profilo",
"create_account_prompt":"<0>Ti va di terminare impostando una password per mantenere il profilo?</0><1>Potrai mantenere il tuo nome e impostare un avatar da usare in chiamate future</1>",
"debug_tile_layout_label":"Debug della disposizione dei riquadri",
"device_id":"ID dispositivo: {{id}}",
"duplicate_tiles_label":"Numero di copie di riquadri aggiuntivi per partecipante",
"hostname":"Nome host: {{hostname}}",
"livekit_server_info":"Informazioni sul server LiveKit",
"livekit_sfu":"SFU LiveKit: {{url}}",
"matrix_id":"ID Matrix: {{id}}",
"show_connection_stats":"Mostra le statistiche di connessione",
"show_non_member_tiles":"Mostra i riquadri per i file multimediali non-membri",
"use_new_membership_manager":"Usa la nuova implementazione della chiamata MembershipManager"
},
"disconnected_banner":"La connessione al server è stata persa.",
"error":{
"call_is_not_supported":"La chiamata non è supportata",
"call_not_found":"Chiamata non trovata",
"call_not_found_description":"<0>Quel link non sembra appartenere a nessuna chiamata esistente. Controlla di avere il link giusto, oppure <1> creane uno nuovo</1> .</0>",
"connection_lost":"Connessione persa",
"connection_lost_description":"Sei stato disconnesso dalla chiamata.",
"e2ee_unsupported":"Browser incompatibile",
"e2ee_unsupported_description":"Il tuo browser non supporta le chiamate crittografate. I browser supportati sono Chrome, Safari e Firefox 117+.",
"generic":"Qualcosa è andato storto",
"generic_description":"L'invio dei registri di debug ci aiuterà a rintracciare il problema.",
"insufficient_capacity":"Capacità insufficiente",
"insufficient_capacity_description":"Il server ha raggiunto la capacità massima e non è possibile partecipare alla chiamata in questo momento. Riprova più tardi o contatta l'amministratore del server se il problema persiste.",
"matrix_rtc_focus_missing":"Il server non è configurato per funzionare con {{brand}}. Contatta l'amministratore del tuo server (Dominio: {{domain}}, codice di errore: {{ errorCode }}).",
"open_elsewhere":"Aperto in un'altra scheda",
"open_elsewhere_description":"{{brand}} è stato aperto in un'altra scheda. Se non ti sembra corretto, prova a ricaricare la pagina.",
"unexpected_ec_error":"Si è verificato un errore imprevisto (<0>Codice errore:</0> <1>{{ errorCode }}</1>). Contatta l'amministratore del tuo server."
},
"group_call_loader":{
"banned_body":"Sei stato bandito dalla stanza.",
"banned_heading":"Bandito",
"call_ended_body":"Sei stato rimosso dalla chiamata.",
"call_ended_heading":"Chiamata terminata",
"knock_reject_body":"I membri della stanza hanno rifiutato la tua richiesta di partecipazione.",
"knock_reject_heading":"Partecipazione non consentita",
"reason":"Motivo"
},
"hangup_button_label":"Termina chiamata",
"header_label":"Inizio di Element Call",
"header_participants_label":"Partecipanti",
@@ -57,15 +109,24 @@
"layout_grid_label":"Griglia",
"layout_spotlight_label":"In primo piano",
"lobby":{
"ask_to_join":"Chiedi di partecipare alla chiamata",
"join_as_guest":"Partecipa come ospite",
"join_button":"Entra in chiamata",
"leave_button":"Torna ai recenti"
"leave_button":"Torna ai recenti",
"waiting_for_invite":"Richiesta inviata"
},
"log_in":"Accedi",
"logging_in":"Accesso…",
"login_auth_links":"<0>Crea un profilo</0> o <2>Accedi come ospite</2>",
"login_auth_links_prompt":"Non sei ancora registrato?",
"login_subheading":"Per continuare su Element",
"login_title":"Accedi",
"microphone_off":"Microfono spento",
"microphone_on":"Microfono acceso",
"mute_microphone_button_label":"Spegni il microfono",
"participant_count_one":"{{count, number}}",
"participant_count_other":"{{count, number}}",
"qr_code":"Codice QR",
"rageshake_button_error_caption":"Riprova l'invio dei registri",
"rageshake_request_modal":{
"body":"Un altro utente in questa chiamata sta avendo problemi. Per diagnosticare meglio questi problemi, vorremmo raccogliere un registro di debug.",
@@ -75,7 +136,6 @@
"rageshake_sending":"Invio…",
"rageshake_sending_logs":"Invio dei registri di debug…",
"rageshake_sent":"Grazie!",
"recaptcha_caption":"Questo sito è protetto da ReCAPTCHA e si applicano l'<2>informativa sulla privacy</2> e i <6>termini di servizio</6> di Google.<9></9>Cliccando \"Registra\", accetti il nostro <12>accordo di licenza con l'utente finale (EULA)</12>",
"recaptcha_dismissed":"Recaptcha annullato",
"recaptcha_not_loaded":"Recaptcha non caricato",
"register":{
@@ -84,17 +144,44 @@
},
"register_auth_links":"<0>Hai già un profilo?</0><1><0>Accedi</0> o <2>Accedi come ospite</2></1>",
"return_home_button":"Torna alla schermata di iniziale",
"room_auth_view_eula_caption":"Cliccando \"Entra in chiamata ora\", accetti il nostro <2>accordo di licenza con l'utente finale (EULA)</2>",
"room_auth_view_continue_button":"Continua",
"screenshare_button_label":"Condividi schermo",
"settings":{
"audio_tab":{
"effect_volume_description":"Regola il volume delle reazioni e degli effetti di alzata di mani.",
"effect_volume_label":"Volume degli effetti sonori"
},
"developer_tab_title":"Sviluppatore",
"devices":{
"camera":"Fotocamera",
"camera_numbered":"Fotocamera {{n}}",
"default":"Predefinito",
"default_named":"Predefinito <2>({{name}})</2>",
"microphone":"Microfono",
"microphone_numbered":"Microfono {{n}}",
"speaker":"Altoparlante",
"speaker_numbered":"Altoparlante {{n}}"
},
"feedback_tab_body":"Se stai riscontrando problemi o semplicemente vuoi dare un'opinione, inviaci una breve descrizione qua sotto.",
"feedback_tab_description_label":"Il tuo commento",
"feedback_tab_h4":"Invia commento",
"feedback_tab_send_logs_label":"Includi registri di debug",
"feedback_tab_thank_you":"Grazie, abbiamo ricevuto il tuo commento!",
"opt_in_description":"<0></0><1></1>Puoi revocare il consenso deselezionando questa casella. Se attualmente sei in una chiamata, avrà effetto al termine di essa."
"feedback_tab_title":"Commenti",
"opt_in_description":"<0></0><1></1>Puoi revocare il consenso deselezionando questa casella. Se attualmente sei in una chiamata, avrà effetto al termine di essa.",
"preferences_tab":{
"developer_mode_label":"Modalità sviluppatore",
"developer_mode_label_description":"Attiva la modalità sviluppatore e mostra la scheda di impostazioni sviluppatore.",
"introduction":"Qui puoi configurare opzioni extra per un'esperienza migliore.",
"reactions_play_sound_description":"Riprodurre un effetto sonoro quando qualcuno invia una reazione in una chiamata.",
"reactions_play_sound_label":"Riproduci suoni di reazione",
"reactions_show_description":"Mostra un'animazione quando qualcuno invia una reazione.",
"reactions_show_label":"Mostra reazioni",
"show_hand_raised_timer_description":"Mostra un contatore quando un partecipante alza la mano",
"show_hand_raised_timer_label":"Mostra la durata dell'alzata di mano"
"analytics_notice":"Piedalīšanās šajā beta apliecina piekrišanu anonīmu datu ievākšanai, ko mēs izmantojam, lai uzlabotu izstrādājumu. Vairāk informācijas par datiem, ko mēs ievācam, var atrast mūsu <2>privātuma nosacījumos</2> un <5>sīkdatņu nosacījumos</5>.",
"analytics_notice":"Piedaloties šajā beta versijā, jūs piekrītat anonīmu datu vākšanai, ko mēs izmantojam produkta uzlabošanai. Plašāku informāciju par to, kādus datus mēs izsekojam, varat atrast mūsu <2>konfidencialitātes politikā</2> un mūsu <6>sīkfailu politikā</6>.",
"call_ended_view":{
"create_account_button":"Izveidot kontu",
"create_account_prompt":"<0>Kādēļ nepabeigt ar paroles iestatīšanu, lai paturētu savu kontu?</0><1>Būs iespējams paturēt savu vārdu un iestatīt attēlu izmantošanai turpmākajos zvanos</1>",
"show_non_member_tiles":"Rādīt vietu medijiem no ne-dalībniekiem",
"url_params":"URL parametri",
"use_new_membership_manager":"Izmantojiet jauno zvana MembershipManager versiju"
},
"disconnected_banner":"Ir zaudēts savienojums ar serveri.",
"error":{
"call_is_not_supported":"Zvans netiek atbalstīts",
"call_not_found":"Zvans nav atrasts",
"call_not_found_description":"<0>Šķiet, ka šī saite nepieder nevienam esošam zvaniem. Pārbaudiet, vai jums ir pareizā saite, vai <1> izveidojiet jaunu</1>. </0>",
"connection_lost":"Savienojums zaudēts",
"connection_lost_description":"Jūs tikāt atvienots no zvana.",
"e2ee_unsupported":"Nesaderīgs pārlūks",
"e2ee_unsupported_description":"Jūsu tīmekļa pārlūkprogramma neatbalsta encrypted zvanus. Atbalstītās pārlūkprogrammas ir Chrome, Safari un Firefox 117+.",
"generic":"Kaut kas nogāja greizi",
"generic_description":"Atkļūdošanas žurnālu iesniegšana palīdzēs mums izsekot problēmu.",
"insufficient_capacity":"Nepietiekama jauda",
"insufficient_capacity_description":"Serveris ir sasniedzis maksimālo ietilpību, un jūs šobrīd nevarat pievienoties zvanam. Mēģiniet vēlreiz vēlāk vai sazinieties ar servera administratoru, ja problēma joprojām pastāv.",
"matrix_rtc_focus_missing":"Serveris nav konfigurēts darbam ar{{brand}}. Lūdzu, sazinieties ar sava servera administratoru (Domēns: {{domain}}, Kļūdas kods: {{ errorCode }}).",
"open_elsewhere":"Atvērts citā cilnē",
"open_elsewhere_description":"{{brand}} ir atvērts citā cilnē. Ja tas neizklausās pareizi, mēģiniet atkārtoti ielādēt lapu.",
"recaptcha_caption":"Šo vietni aizsargā ReCAPTCHA, un ir attiecināmi Google <2>privātuma nosacījumi</2> un <6>pakalpojuma noteikumi</6>.<9></9>Klikšķināšana uz \"Reģistrēties\" sniedz piekrišanu mūsu <12>galalietotāja licencēšanas nolīgumam (GLLN)</12>",
"recaptcha_dismissed":"ReCaptcha atmesta",
"recaptcha_not_loaded":"ReCaptcha nav ielādēta",
"recaptcha_ssla_caption":"Šo vietni aizsargā ReCAPTCHA un tiek piemēroti Google <2>konfidencialitātes politika</2> un <6>Pakalpojuma noteikumi</6>.<9></9>Noklikšķinot uz \"Reģistrēties\", jūs piekrītat mūsu <12>Programmatūras un pakalpojumu licences līgumam (SSLA)</12>",
"register":{
"passwords_must_match":"Parolēm ir jāsakrīt",
"registering":"Reģistrē…"
},
"register_auth_links":"<0>Jau ir konts?</0><1><0>Pieteikties</0> vai <2>Piekļūt kā viesim</2></1>",
"room_auth_view_eula_caption":"Klikšķināšana uz \"Pievienoties zvanam tagad\" apliecina piekrišanu mūsu <2>galalietotāja licencēšanas nolīgumam (GLLN)</2>",
"room_auth_view_continue_button":"Turpināt",
"room_auth_view_ssla_caption":"Noklikšķinot uz “Pievienoties zvanam tūlīt”, jūs piekrītat mūsu <2> programmatūras un pakalpojumu licences līgumam (SSLA) </2>",
"screenshare_button_label":"Kopīgot ekrānu",
"settings":{
"audio_tab":{
"effect_volume_description":"Pielāgojiet skaļumu, kurā tiek atskaņotas reakcijas un paceltas rokas skaņas.",
"feedback_tab_thank_you":"Paldies, mēs saņēmām atsauksmi!",
"feedback_tab_title":"Atsauksmes",
"opt_in_description":"<0></0><1></1>Savu piekrišanu var atsaukt ar atzīmes noņemšanu no šīs rūtiņas. Ja pašreiz atrodies zvanā, šis iestatījums stāsies spēkā zvana beigās."
"opt_in_description":"<0></0><1></1>Savu piekrišanu var atsaukt ar atzīmes noņemšanu no šīs rūtiņas. Ja pašreiz atrodies zvanā, šis iestatījums stāsies spēkā zvana beigās.",
"preferences_tab":{
"developer_mode_label":"Izstrādātāja režīms",
"developer_mode_label_description":"Iespējot izstrādātāja režīmu un rādīt cilni izstrādātāja iestatījumi.",
"introduction":"Šeit varat konfigurēt papildu opcijas, lai uzlabotu pieredzi.",
"reactions_play_sound_description":"Atskaņojiet skaņas efektu, kad kāds sūta reakciju uz zvanu.",
"reactions_play_sound_label":"Atskaņojiet reakcijas skaņas",
"reactions_show_description":"Rādīt animāciju, kad kāds nosūta reakciju.",
"reactions_show_label":"Rādīt reakcijas",
"show_hand_raised_timer_description":"Rādīt taimeri, kad dalībnieks paceļ roku",
"show_hand_raised_timer_label":"Rādīt rokas pacelšanas ilgumu"
"analytics_notice":"Uczestnicząc w tej becie, upoważniasz nas do zbierania anonimowych danych, które wykorzystamy do ulepszenia produktu. Dowiedz się więcej na temat danych, które zbieramy w naszej <2>Polityce prywatności</2> i <5>Polityce ciasteczek</5>.",
"app_selection_modal":{
"continue_in_browser":"Kontynuuj w przeglądarce",
"open_in_app":"Otwórz w aplikacji",
"text":"Gotowy, by dołączyć?",
"title":"Wybierz aplikację"
},
"call_ended_view":{
"create_account_button":"Utwórz konto",
"create_account_prompt":"<0>Może zechcesz ustawić hasło, aby zachować swoje konto?</0><1>Będziesz w stanie utrzymać swojąnazwę i ustawić awatar do wyświetlania podczas połączeń w przyszłości</1>",
@@ -33,20 +34,68 @@
},
"call_name":"Nazwa połączenia",
"common":{
"analytics":"Dane analityczne",
"audio":"Dźwięk",
"avatar":"Awatar",
"back":"Wstecz",
"display_name":"Nazwa wyświetlana",
"encrypted":"Szyfrowane",
"home":"Strona domowa",
"loading":"Ładowanie…",
"next":"Dalej",
"options":"Opcje",
"password":"Hasło",
"preferences":"Preferencje",
"profile":"Profil",
"reaction":"Reakcja",
"reactions":"Reakcje",
"settings":"Ustawienia",
"unencrypted":"Nie szyfrowane",
"username":"Nazwa użytkownika",
"video":"Wideo"
},
"developer_mode":{
"crypto_version":"Wersja krypto: {{version}}",
"debug_tile_layout_label":"Układ kafelków Debug",
"device_id":"ID urządzenia: {{id}}",
"duplicate_tiles_label":"Liczba dodatkowych kopii kafelków na uczestnika",
"show_non_member_tiles":"Pokaż kafelki dla mediów, które nie są od członków",
"url_params":"Parametry URL",
"use_new_membership_manager":"Użyj nowej implementacji połączenia MembershipManager"
},
"disconnected_banner":"Utracono połączenie z serwerem.",
"error":{
"call_is_not_supported":"Połączenie nie jest obsługiwane",
"call_not_found":"Nie znaleziono połączenia",
"call_not_found_description":"<0>Wygląda na to, że ten link nie należy do żadnego istniejącego połączenia. Sprawdź, czy posiadasz prawidłowy link lub <1>utwórz nowy</1>.</0>",
"connection_lost":"Utracono połączenie",
"connection_lost_description":"Zostałeś rozłączony z rozmowy.",
"e2ee_unsupported_description":"Twoja przeglądarka nie wspiera szyfrowanych połączeń. Obsługiwane przeglądarki obejmują Chrome, Safari i Firefox 117+.",
"generic":"Coś poszło nie tak",
"generic_description":"Wysłanie dziennika debug, pozwoli nam namierzyć problem.",
"insufficient_capacity":"Za mało miejsca",
"insufficient_capacity_description":"Serwer osiągnął maksymalną pojemność, przez co nie możesz dołączyć do połączenia. Spróbuj ponownie później lub skontaktuj się z administratorem serwera, jeśli problem nie zniknie.",
"matrix_rtc_focus_missing":"Serwer nie jest skonfigurowany do pracy z {{brand}}. Prosimy o kontakt z administratorem serwera (Domena: {{domain}}, Kod błędu: {{ errorCode }}).",
"open_elsewhere":"Otwarto w innej karcie",
"open_elsewhere_description":"{{brand}} został otwarty w innej karcie. Jeśli tak nie jest, spróbuj odświeżyć stronę.",
"unexpected_ec_error":"Wystąpił nieoczekiwany błąd (<0>Kod błędu:</0> <1>{{ errorCode }}</1>). Skontaktuj się z administratorem serwera."
},
"group_call_loader":{
"banned_body":"Zostałeś zbanowany z pokoju.",
"banned_heading":"Zbanowany",
"call_ended_body":"Zostałeś usunięty z rozmowy.",
"call_ended_heading":"Połączenie zakończone",
"knock_reject_body":"Członkowie pokoju odrzucili Twoją prośbę o dołączenie.",
"knock_reject_heading":"Nie możesz dołączyć",
"reason":"Powód: {{reason}}"
},
"hangup_button_label":"Zakończ połączenie",
"header_label":"Strona główna Element Call",
"header_participants_label":"Uczestnicy",
@@ -62,15 +111,25 @@
"layout_grid_label":"Siatka",
"layout_spotlight_label":"Centrum uwagi",
"lobby":{
"ask_to_join":"Poproś o dołączenie do rozmowy",
"join_as_guest":"Dołącz jako gość",
"join_button":"Dołącz do połączenia",
"leave_button":"Wróć do ostatnie"
"leave_button":"Wróć do ostatnie",
"waiting_for_invite":"Żądanie wysłane"
},
"log_in":"Zaloguj",
"logging_in":"Logowanie…",
"login_auth_links":"<0>Utwórz konto</0> lub <2>Dołącz jako gość</2>",
"recaptcha_caption":"Ta witryna jest chroniona przez ReCAPTCHA, więc obowiązują <2>Polityka prywatności</2> i <6>Warunki usług</6> Google. Klikając \"Zarejestruj\", zgadzasz się na naszą <12>Umowę licencyjną (EULA)</12>",
"recaptcha_dismissed":"Recaptcha odrzucona",
"recaptcha_not_loaded":"Recaptcha nie została załadowana",
"recaptcha_ssla_caption":"Ta strona jest chroniona przez reCAPTCHA i obowiązują <2> Polityka prywatności Google </2> i <6>Warunki korzystania z usługi</6>. <9></9>Klikając „Zarejestruj się”, wyrażasz zgodę na naszą <12>umowę licencyjną oprogramowania i usług (SSLA)</12>",
"register":{
"passwords_must_match":"Hasła muszą pasować",
"registering":"Rejestrowanie…"
},
"register_auth_links":"<0>Masz jużkonto?</0><1><0>Zaloguj się</0> lub <2>Dołącz jako gość</2></1>",
"room_auth_view_eula_caption":"Klikając \"Dołącz teraz do rozmowy\", zgadzasz się na naszą <2>Umowę licencyjną (EULA)</2>",
"room_auth_view_continue_button":"Kontynuuj",
"room_auth_view_ssla_caption":"Klikając \"Dołącz teraz do połączenia\", wyrażasz zgodę na naszą <2>Umowę licencyjną oprogramowania i usług (SSLA)</2>",
"screenshare_button_label":"Udostępnij ekran",
"settings":{
"audio_tab":{
"effect_volume_description":"Dostosuj głośność, z jaką odtwarzane są efekty reakcji i podniesionej ręki",
"opt_in_description":"<0></0><1></1>Możesz wycofać swoją zgodę poprzez odznaczenie tego pola. Jeśli już jesteś w trakcie rozmowy, opcja zostanie zastosowana po jej zakończeniu."
"opt_in_description":"<0></0><1></1>Możesz wycofać swoją zgodę poprzez odznaczenie tego pola. Jeśli już jesteś w trakcie rozmowy, opcja zostanie zastosowana po jej zakończeniu.",
"preferences_tab":{
"developer_mode_label":"Tryb programisty",
"developer_mode_label_description":"Włącz tryb programisty i wyświetl kartę ustawień programisty.",
"introduction":"Tutaj możesz skonfigurować dodatkowe opcje dla lepszych doświadczeń.",
"reactions_play_sound_description":"Odtwórz efekt dźwiękowy, gdy ktoś wyślę reakcję w trakcie połączenia.",
"analytics_notice":"Prin participarea la această versiune beta, sunteți de acord cu colectarea de date anonime, pe care le folosim pentru a îmbunătăți produsul. Puteți găsi mai multe informații despre datele pe care le urmărim în Politica noastră de <2> confidențialitate </2> și Politica noastră <6> privind cookie-urile</6>.",
"app_selection_modal":{
"continue_in_browser":"Continuați în browser",
"open_in_app":"Deschideți în aplicație",
"text":"Sunteți gata să vă alăturați?",
"title":"Selectați aplicația"
},
"call_ended_view":{
"create_account_button":"Creează cont",
"create_account_button":"Creaţi un cont",
"create_account_prompt":"<0>De ce să nu terminați prin configurarea unei parole pentru a vă păstra contul? </0><1>Veți putea să vă păstrați numele și să setați un avatar pentru a fi utilizat la apelurile viitoare </1>",
"feedback_done":"<0>Vă mulțumim pentru feedback! </0>",
"feedback_prompt":"<0>Ne-ar plăcea să auzim feedback-ul dvs., astfel încât să vă putem îmbunătăți experiența. </0>",
"headline":"{{displayName}}, apelul tău s-a încheiat.",
"not_now_button":"Nu acum, reveniți la ecranul de pornire",
"reconnect_button":"Reconecta",
"survey_prompt":"Cum a mers?"
"not_now_button":"Nu acum, reveniți la ecranul principal",
"duplicate_tiles_label":"Numărul de exemplare suplimentare de cartonașe per participant",
"environment_variables":"Variabile de mediu",
"hostname":"Numele gazdei: {{hostname}}",
"matrix_id":"ID-ul matricei: {{id}}"
"matrix_id":"ID-ul matricei: {{id}}",
"show_connection_stats":"Afişaţi informaţii cu privire la starea conexiunii",
"show_non_member_tiles":"Afişaţi pictograme pentru fluxul media care nu aparţine participanţilor apelului",
"url_params":"Parametrii linkului",
"use_new_membership_manager":"Folosiţi noua versiune de administrator pentru participanţi ai apelului",
"use_to_device_key_transport":"Folosiţi metoda de transport direct către dispozitiv. Aceasta va reveni la transportul prin intermediul evenimentelor din cameră doar dacă un alt participant la apel recurge la acel mod de transport mai întâi."
},
"disconnected_banner":"Conexiunea către server s-a încheiat abrupt",
"error":{
"call_is_not_supported":"Acest tip de apel nu este suportat",
"call_not_found":"Apelul nu a fost găsit",
"call_not_found_description":"<0>Acel link nu pare să aparţină unui apel existent. Verificaţi dacă aţi introdus linkul corect, sau <1>creaţi unul nou</1>.</0>",
"connection_lost":"Conexiunea s-a pierdut",
"connection_lost_description":"Aţi fost deconectat/ă de la apel",
"e2ee_unsupported":"Navigatorul dumneavoastră este incompatibil cu criptarea integrală",
"e2ee_unsupported_description":"Navigatorul/browserul dumneavoastră web nu suportă apeluri în conversaţii cu criptare integrală. Printre navigatoarele suportate, se numără Chrome, Safari şi Firefox 117+.",
"generic":"A apărut o eroare neaşteptată",
"generic_description":"Dacă ne trimiteţi jurnalele de depanare generate de aplicaţie, ne puteţi ajuta să rezolvăm problema.",
"insufficient_capacity_description":"Serverul a ajuns la capacitatea maximă și nu vă puteți alătura apelului în acest moment. Încercați din nou in câteva minute, sau contactați administratorul serverului dumneavoastră dacă problema persistă.",
"matrix_rtc_focus_missing":"Serverul nu este configurat să funcționeze cu{{brand}}. Vă rugăm să contactați administratorul serverului dumneavoastră pentru a raporta o eroare în configurare. Detalii: Domeniu: {{domain}}. Cod de eroare: {{ errorCode }}.",
"open_elsewhere":"Aplicaţia este deschisă intr-o altă pagină",
"open_elsewhere_description":"{{brand}} a fost deschis într-o altă pagină. Dacă credeți că acest mesaj a fost emis in eroare, încercați să reîncărcați pagina.",
"unexpected_ec_error":"A apărut o eroare neașteptată (Cod de <0> eroare: </0> <1> {{ errorCode }}</1>). Vă rugăm să contactați administratorul serverului dumneavoastră."
},
"disconnected_banner":"Conectivitatea la server a fost pierdută.",
"group_call_loader":{
"banned_body":"Ai fost interzis să ieși din cameră.",
"banned_heading":"Interzis",
@@ -117,7 +135,6 @@
"rageshake_sending":"Trimiterea...",
"rageshake_sending_logs":"Trimiterea jurnalelor de depanare...",
"rageshake_sent":"Multumesc!",
"recaptcha_caption":"Acest site este protejat de reCAPTCHA și se aplică Politica de <2> confidențialitate Google </2> și <6> Termenii și condițiile. </6> <9></9>Făcând clic pe „Înregistrare”, sunteți de acord cu Acordul nostru de licențiere pentru utilizatorul <12> final (EULA) </12>",
"recaptcha_dismissed":"Recaptcha a fost respins",
"recaptcha_not_loaded":"Recaptcha nu a fost încărcat",
"register":{
@@ -129,7 +146,6 @@
"register_heading":"Creează-ți contul",
"return_home_button":"Reveniți la ecranul de pornire",
"room_auth_view_continue_button":"Continuă",
"room_auth_view_eula_caption":"Făcând clic pe „Continuați”, sunteți de acord cu Acordul nostru de licențiere pentru utilizatorul <2> final (EULA) </2>",
"screenshare_button_label":"Partajare ecran",
"settings":{
"audio_tab":{
@@ -137,6 +153,10 @@
"effect_volume_label":"Volumul efectului sonor"
},
"developer_tab_title":"dezvoltator",
"devices":{
"microphone":"Microfon",
"speaker":"Difuzor"
},
"feedback_tab_body":"Dacă întâmpinați probleme sau pur și simplu doriți să oferiți feedback, vă rugăm să ne trimiteți o scurtă descriere mai jos.",
"opt_in_description":"<0></0><1></1>Puteți retrage consimțământul debifând această casetă. Dacă sunteți în prezent la un apel, această setare va intra în vigoare la sfârșitul apelului.",
"preferences_tab":{
"developer_mode_label":"Modul dezvoltator",
"developer_mode_label_description":"Activați modul dezvoltator și afișați pagina specifică setărilor pentru dezvoltatori",
"introduction":"Aici puteți configura opțiuni suplimentare pentru o experiență îmbunătățită.",
"reactions_play_sound_description":"Redați un efect sonor atunci când cineva trimite o reacție la un apel.",
"reactions_play_sound_label":"Redați sunete de reacție",
"reactions_show_description":"Afișați o animație atunci când cineva trimite o reacție.",
"reactions_show_label":"Afișați reacțiile"
"reactions_show_label":"Afișați reacțiile",
"show_hand_raised_timer_description":"Afișați un cronometru atunci când un participant ridică mâna.",
"analytics_notice":"Участвуя в этой бета-версии, вы соглашаетесь на сбор анонимных данных, которые мы используем для улучшения продукта. Более подробную информацию о том, какие данные мы отслеживаем, вы можете найти в нашей <2> Политике конфиденциальности</2> и нашей <5> Политике использования файлов cookie</5>.",
"analytics_notice":"Участвуя в этой бета-версии, вы соглашаетесь на сбор анонимных данных, которые мы используем для улучшения продукта. Дополнительную информацию о том, какие данные мы отслеживаем, можно найти в нашей <2> Политике конфиденциальности</2> и Политике <6> использования файлов cookie</6>.",
"call_ended_view":{
"create_account_button":"Создать аккаунт",
"create_account_prompt":"<0>Почему бы не задать пароль, тем самым сохранив аккаунт?</0><1>Так вы можете оставить своё имя и задать аватар для будущих звонков.</1>",
@@ -20,33 +29,111 @@
"feedback_prompt":"<0>Мы будем рады видеть ваши отзывы, чтобы мы могли улучшить ваш опыт.</0>",
"show_non_member_tiles":"Показать плитки для медиафайлов, не являющихся участниками",
"url_params":"Параметры URL-адреса",
"use_new_membership_manager":"Используйте новую реализацию вызова MembershipManager",
"use_to_device_key_transport":"Используйте для передачи ключей устройства. Это позволит вернуться к передаче ключей комнаты, когда другой участник вызова отправит ключ комнаты"
},
"disconnected_banner":"Связь с сервером была потеряна.",
"error":{
"call_is_not_supported":"Вызов не поддерживается",
"call_not_found":"Звонок не найден",
"call_not_found_description":"<0>Эта ссылка, похоже, не принадлежит ни к одному существующему звонку. Убедитесь, что у вас есть нужная ссылка, или <1>создайте новую</1>.</0>",
"connection_lost":"Соединение потеряно",
"connection_lost_description":"Вы были отключены от звонка.",
"e2ee_unsupported":"Несовместимый браузер",
"e2ee_unsupported_description":"Ваш веб-браузер не поддерживает зашифрованные звонки. Поддерживаются следующие браузеры: Chrome, Safari и Firefox 117+.",
"generic":"Произошла ошибка",
"generic_description":"Отправка журналов отладки поможет нам отследить проблему.",
"insufficient_capacity_description":"Сервер достиг максимальной пропускной способности, и вы не можете присоединиться к звонку в данный момент. Повторите попытку позже или обратитесь к администратору сервера, если проблема сохраняется.",
"matrix_rtc_focus_missing":"Сервер не настроен для работы с {{brand}}. Пожалуйста, свяжитесь с администратором вашего сервера (Домен: {{domain}}, Код ошибки: {{ errorCode }}).",
"open_elsewhere":"Открыто в другой вкладке",
"open_elsewhere_description":"{{brand}} был открыт в другой вкладке. Если это неверно, попробуйте перезагрузить страницу.",
"unexpected_ec_error":"Произошла непредвиденная ошибка (<0> Код ошибки:</0><1>{{ errorCode }}</1> ). Обратитесь к администратору вашего сервера."
},
"group_call_loader":{
"banned_body":"Вас заблокировали в этой комнате",
"banned_heading":"Заблокирован",
"call_ended_body":"Вы были удалены из звонка.",
"call_ended_heading":"Вызов завершен",
"knock_reject_body":"Участники комнаты отклонили ваш запрос на присоединение.",
"body":"У одного из участников звонка есть неполадки. Чтобы лучше диагностировать похожие проблемы, нам нужен журнал отладки.",
"title":"Запрос журнала отладки"
@@ -54,30 +141,83 @@
"rageshake_send_logs":"Отправить журнал отладки",
"rageshake_sending":"Отправка…",
"rageshake_sending_logs":"Отправка журнала отладки…",
"rageshake_sent":"Спасибо!",
"recaptcha_dismissed":"Проверка не пройдена",
"recaptcha_not_loaded":"Невозможно начать проверку",
"recaptcha_ssla_caption":"Этот сайт защищен reCAPTCHA, и к нему применяются <2> Политика конфиденциальности </2> и <6> Условия обслуживания Google. </6> <9></9>Нажимая «Зарегистрироваться», вы соглашаетесь с нашим лицензионным соглашением на <12> программное обеспечение и услуги (SSLA) </12>",
"register":{
"passwords_must_match":"Пароли должны совпадать",
"registering":"Регистрация…"
},
"register_auth_links":"<0>Уже есть аккаунт?</0><1><0>Войти с ним</0> или <2>Зайти как гость</2></1>",
"room_auth_view_ssla_caption":"Нажимая кнопку \"Присоединиться к звонку\", вы соглашаетесь с нашим <2>Лицензионное соглашение на программное обеспечение и услуги (SSLA)</2>",
"screenshare_button_label":"Поделиться экраном",
"settings":{
"audio_tab":{
"effect_volume_description":"Отрегулируйте громкость воспроизведения реакций и эффектов поднятия руки.",
"feedback_tab_body":"Если у вас возникли проблемы или вы просто хотите оставить отзыв, отправьте нам краткое описание ниже.",
"feedback_tab_description_label":"Ваш отзыв",
"feedback_tab_h4":"Отправить отзыв",
"feedback_tab_send_logs_label":"Приложить журнал отладки",
"feedback_tab_thank_you":"Спасибо. Мы получили ваш отзыв!",
"feedback_tab_title":"Отзыв",
"opt_in_description":"<0></0><1></1>Вы можете отозвать согласие, сняв этот флажок. Если вы в данный момент находитесь в разговоре, эта настройка вступит в силу по окончании разговора."
"opt_in_description":"<0></0><1></1>Вы можете отозвать согласие, сняв этот флажок. Если вы в данный момент находитесь в разговоре, эта настройка вступит в силу по окончании разговора.",
"preferences_tab":{
"developer_mode_label":"Режим разработчика",
"developer_mode_label_description":"Включить режим разработчика и показать настройки.",
"introduction":"Здесь вы можете настроить дополнительные параметры для улучшения качества работы.",
"reactions_play_sound_description":"Воспроизведите звуковой эффект, когда кто-либо отреагирует на звонок.",
"unauthenticated_view_body":"Ещё не зарегистрированы? <2>Создайте аккаунт</2>",
"unauthenticated_view_login_button":"Войдите в свой аккаунт",
"version":"Версия: {{version}}"
"unauthenticated_view_ssla_caption":"Нажимая «Перейти», вы соглашаетесь с нашим лицензионным соглашением на <2> программное обеспечение и услуги (SSLA) </2>",
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.