Compare commits
289 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e196f049de | ||
|
|
3c7130f2bb | ||
|
|
4040ac2251 | ||
|
|
e0e99331be | ||
|
|
108e64328c | ||
|
|
54c364919b | ||
|
|
047fce8661 | ||
|
|
f9257379f1 | ||
|
|
c9c3ed6c8b | ||
|
|
2989d1467c | ||
|
|
db522c75f5 | ||
|
|
56cb8a5ee0 | ||
|
|
e531ff4f79 | ||
|
|
6e67a0cfc5 | ||
|
|
0688b0e9b5 | ||
|
|
0a57ea6bec | ||
|
|
00cafa9006 | ||
|
|
b950fd44d4 | ||
|
|
2382ce7ffb | ||
|
|
61e0dda100 | ||
|
|
793736c9d7 | ||
|
|
bf7b9c2b19 | ||
|
|
fb21920126 | ||
|
|
a2a5a3f71c | ||
|
|
7e13eeb288 | ||
|
|
f80c36eb7f | ||
|
|
2865a6c77e | ||
|
|
bb081f4241 | ||
|
|
477d0e4c81 | ||
|
|
98f78d3196 | ||
|
|
d4780b2d63 | ||
|
|
d3825648f2 | ||
|
|
1240a6d012 | ||
|
|
c954582a03 | ||
|
|
34d5cc3959 | ||
|
|
8e867f8fd3 | ||
|
|
02016bb950 | ||
|
|
e7a79932b9 | ||
|
|
e8c13043eb | ||
|
|
b29a576890 | ||
|
|
a2243e9984 | ||
|
|
1bf9070e6e | ||
|
|
170e2d1c02 | ||
|
|
b9544def44 | ||
|
|
ca325a2f06 | ||
|
|
33006d2321 | ||
|
|
e202785458 | ||
|
|
bf843adeac | ||
|
|
16ad91e48c | ||
|
|
2f474f4ae4 | ||
|
|
069dd4a47e | ||
|
|
e1b6b9291f | ||
|
|
722c4c72ba | ||
|
|
dea17db6f9 | ||
|
|
efea2198af | ||
|
|
fef02ab6de | ||
|
|
175f3ee638 | ||
|
|
d9fc616da6 | ||
|
|
a03126c989 | ||
|
|
7089d12681 | ||
|
|
f5b63ef0c6 | ||
|
|
76d94f4563 | ||
|
|
d13f2484b7 | ||
|
|
1dee3f4a5a | ||
|
|
ff8cf1b5a9 | ||
|
|
1cf72c3008 | ||
|
|
c2e70f6b7e | ||
|
|
a7c5558718 | ||
|
|
65895bb37b | ||
|
|
76c3125900 | ||
|
|
d4dcf18bfb | ||
|
|
1865ccbaf6 | ||
|
|
35acd83df8 | ||
|
|
11db5d2217 | ||
|
|
ced0d14a54 | ||
|
|
3d9b6283ef | ||
|
|
6e73807ca9 | ||
|
|
64486934ea | ||
|
|
90c2daf7dd | ||
|
|
3dfc6ba29e | ||
|
|
353e69449f | ||
|
|
996c13ff10 | ||
|
|
cd5cd380d3 | ||
|
|
21b91c503e | ||
|
|
ec06c84fea | ||
|
|
765d434b16 | ||
|
|
14e7bafd93 | ||
|
|
c6604f2d37 | ||
|
|
a8a5035457 | ||
|
|
2f5d024e14 | ||
|
|
918bd2fb82 | ||
|
|
feae7ba558 | ||
|
|
50c2545c7e | ||
|
|
c3a09e0b49 | ||
|
|
b0e22573b1 | ||
|
|
83142a85bc | ||
|
|
54dad9430a | ||
|
|
76d3658061 | ||
|
|
f25f5776a0 | ||
|
|
bc4166e742 | ||
|
|
3455dd7418 | ||
|
|
d95336a7a0 | ||
|
|
9853de3852 | ||
|
|
b2bc8edcc1 | ||
|
|
1f71f2c910 | ||
|
|
c450bcebf5 | ||
|
|
0ab3e0e090 | ||
|
|
980b0fe1c5 | ||
|
|
8013c95e3b | ||
|
|
9be2eef9fb | ||
|
|
4e30758e6c | ||
|
|
1c874ef4bb | ||
|
|
d8d37923a2 | ||
|
|
726845d690 | ||
|
|
74cc970a0e | ||
|
|
5e75eddfe2 | ||
|
|
75b71c38db | ||
|
|
863937d0db | ||
|
|
07289380c5 | ||
|
|
634ee2baa9 | ||
|
|
bf5e9457c5 | ||
|
|
2ea62d6590 | ||
|
|
eae1b2926d | ||
|
|
e7cb51a20b | ||
|
|
b0dc53c2ad | ||
|
|
d532b3193a | ||
|
|
5961e44a11 | ||
|
|
3b2b1ed094 | ||
|
|
73d699393a | ||
|
|
76c8181d22 | ||
|
|
e27959911d | ||
|
|
62dea32d0d | ||
|
|
6c1663a6c6 | ||
|
|
8406193da4 | ||
|
|
699cdceafe | ||
|
|
22ecb65d5f | ||
|
|
3e11f63ce5 | ||
|
|
b2f7f5ac41 | ||
|
|
4ab7e572da | ||
|
|
e8c9444c9c | ||
|
|
89aed0bdd7 | ||
|
|
e964dce740 | ||
|
|
8f0e7a4585 | ||
|
|
145f79690a | ||
|
|
f387916a52 | ||
|
|
4db5e42bf2 | ||
|
|
a46c043b3f | ||
|
|
c25d54ef75 | ||
|
|
46999cf22b | ||
|
|
132e0be753 | ||
|
|
6dafa274b8 | ||
|
|
94f3e64182 | ||
|
|
d7b353032c | ||
|
|
a1df36368f | ||
|
|
0683387ed6 | ||
|
|
169ccd9de5 | ||
|
|
445c7c4e0c | ||
|
|
b9f946a71a | ||
|
|
74a8495750 | ||
|
|
be56ade561 | ||
|
|
607c44ba5e | ||
|
|
dec92a479d | ||
|
|
195ef859ee | ||
|
|
63d905ed63 | ||
|
|
9226b87c88 | ||
|
|
f3daeeffc2 | ||
|
|
c7d582983f | ||
|
|
c661c916ed | ||
|
|
14d9802db8 | ||
|
|
80a7f81760 | ||
|
|
a2e932b73f | ||
|
|
48c4df9cd6 | ||
|
|
1d6eaa0e53 | ||
|
|
d77ad87c45 | ||
|
|
ddcec5497d | ||
|
|
74ea1c88bb | ||
|
|
5c3deeb063 | ||
|
|
9c89f85634 | ||
|
|
27cb39d3c5 | ||
|
|
7b4e3ddbc0 | ||
|
|
8c8430c67d | ||
|
|
97488a4787 | ||
|
|
b05b57e744 | ||
|
|
e813df8dcd | ||
|
|
2795bc3a94 | ||
|
|
c433069f90 | ||
|
|
ab07d657c6 | ||
|
|
87a215102a | ||
|
|
1324ff5a69 | ||
|
|
64f2bd3315 | ||
|
|
cfdb9b4638 | ||
|
|
7730b9aebc | ||
|
|
eb45149f16 | ||
|
|
a6373c23f3 | ||
|
|
3083fff480 | ||
|
|
53732b99bf | ||
|
|
3a2dba7a13 | ||
|
|
d7dbc3d096 | ||
|
|
0ce408899c | ||
|
|
36056b17e1 | ||
|
|
7697a14a65 | ||
|
|
1f4c599a36 | ||
|
|
d232eece5a | ||
|
|
72a23c5d1a | ||
|
|
2db2aa9947 | ||
|
|
54302ca6c6 | ||
|
|
b16aeb31be | ||
|
|
37ee555e0a | ||
|
|
1790818f3a | ||
|
|
c821cadac2 | ||
|
|
d0ec052641 | ||
|
|
bbe1043289 | ||
|
|
22ac156085 | ||
|
|
544c50743e | ||
|
|
8ab623b9e2 | ||
|
|
468dffcf98 | ||
|
|
bd5b547483 | ||
|
|
3b2e0acb99 | ||
|
|
a631f83a7f | ||
|
|
c40ee6b8cc | ||
|
|
e017468f4d | ||
|
|
57ed732ba8 | ||
|
|
50d792c6c9 | ||
|
|
55acbee9dc | ||
|
|
6af52a32fd | ||
|
|
a0cdafcd7c | ||
|
|
00487324b1 | ||
|
|
2d8aaf0a3b | ||
|
|
48900f3921 | ||
|
|
e35cae9430 | ||
|
|
dbfe7f36c5 | ||
|
|
16498e4548 | ||
|
|
8bb114d7d4 | ||
|
|
db859d43e9 | ||
|
|
712f320d28 | ||
|
|
0e42099088 | ||
|
|
b17a76ac1a | ||
|
|
c24d20f540 | ||
|
|
005b0bfa5e | ||
|
|
115dfea521 | ||
|
|
d328fc2625 | ||
|
|
7051c11411 | ||
|
|
2b39fa930e | ||
|
|
326d2b128e | ||
|
|
f3220ab597 | ||
|
|
7e6c69ce65 | ||
|
|
8c45b5963b | ||
|
|
9cf5b7c868 | ||
|
|
de3a3b6c22 | ||
|
|
0c2a410033 | ||
|
|
95a44f5462 | ||
|
|
59387e5b96 | ||
|
|
b0dac561d5 | ||
|
|
0ba550f56b | ||
|
|
6ebef28ad8 | ||
|
|
49a50514fd | ||
|
|
09481d1e44 | ||
|
|
fcfb818a27 | ||
|
|
aa8ef57ee0 | ||
|
|
861d8ec016 | ||
|
|
a31d1a5ff0 | ||
|
|
0144aafee5 | ||
|
|
70dbf95429 | ||
|
|
1f461643a6 | ||
|
|
42c73e8685 | ||
|
|
d5f546a093 | ||
|
|
e6073ec8ef | ||
|
|
f0436654c0 | ||
|
|
bcb9765df0 | ||
|
|
cd78f25936 | ||
|
|
cdbf4cac01 | ||
|
|
71664f5f8e | ||
|
|
42c8677be1 | ||
|
|
9746764f81 | ||
|
|
85250e6ea3 | ||
|
|
4f17c62338 | ||
|
|
dd6f679a41 | ||
|
|
23db052460 | ||
|
|
49544f5aed | ||
|
|
9fad8dc080 | ||
|
|
548d2e4d63 | ||
|
|
1598818db6 | ||
|
|
3e7a800424 | ||
|
|
68f31ed52d | ||
|
|
92d61fa0f1 | ||
|
|
dd914ace20 | ||
|
|
ebfd79dfea | ||
|
|
0a2ea8315b | ||
|
|
cd490a44fd |
@@ -38,6 +38,16 @@ module.exports = {
|
||||
"jsx-a11y/media-has-caption": "off",
|
||||
// We should use the js-sdk logger, never console directly.
|
||||
"no-console": ["error"],
|
||||
"no-restricted-imports": [
|
||||
"error",
|
||||
{
|
||||
name: "@react-rxjs/core",
|
||||
importNames: ["Subscribe", "RemoveSubscribe"],
|
||||
message:
|
||||
"These components are easy to misuse, please use the 'subscribe' component wrapper instead",
|
||||
},
|
||||
],
|
||||
"react/display-name": "error",
|
||||
},
|
||||
settings: {
|
||||
react: {
|
||||
|
||||
2
.github/CODEOWNERS
vendored
@@ -1 +1 @@
|
||||
* @vector-im/element-call-reviewers
|
||||
* @element-hq/element-call-reviewers
|
||||
|
||||
2
.github/workflows/build.yaml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
VITE_APP_VERSION: ${{ github.sha }}
|
||||
NODE_OPTIONS: "--max-old-space-size=4096"
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: build
|
||||
path: dist
|
||||
|
||||
2
.github/workflows/e2e.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
- name: Check out test private repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: vector-im/static-call-participant
|
||||
repository: element-hq/static-call-participant
|
||||
ref: refs/heads/main
|
||||
path: static-call-participant
|
||||
token: ${{ secrets.GH_E2E_TEST_TOKEN }}
|
||||
|
||||
6
.github/workflows/netlify-pr.yaml
vendored
@@ -36,7 +36,7 @@ jobs:
|
||||
# There's a 'download artifact' action, but it hasn't been updated for the workflow_run action
|
||||
# (https://github.com/actions/download-artifact/issues/60) so instead we get this mess:
|
||||
- name: 📥 Download artifact
|
||||
uses: dawidd6/action-download-artifact@v2
|
||||
uses: dawidd6/action-download-artifact@v3
|
||||
with:
|
||||
run_id: ${{ github.event.workflow_run.id }}
|
||||
name: build
|
||||
@@ -44,12 +44,12 @@ jobs:
|
||||
|
||||
- name: Add redirects file
|
||||
# We fetch from github directly as we don't bother checking out the repo
|
||||
run: curl -s https://raw.githubusercontent.com/vector-im/element-call/main/config/netlify_redirects > webapp/_redirects
|
||||
run: curl -s https://raw.githubusercontent.com/element-hq/element-call/main/config/netlify_redirects > webapp/_redirects
|
||||
|
||||
- name: Add config file
|
||||
env:
|
||||
HEADBRACH: ${{ github.event.workflow_run.head_branch }}
|
||||
run: curl -s "https://raw.githubusercontent.com/vector-im/element-call/${HEADBRACH}/config/element_io_preview.json" > webapp/config.json
|
||||
run: curl -s "https://raw.githubusercontent.com/element-hq/element-call/${HEADBRACH}/config/element_io_preview.json" > webapp/config.json
|
||||
|
||||
- name: ☁️ Deploy to Netlify
|
||||
id: netlify
|
||||
|
||||
10
.github/workflows/publish.yaml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Log in to container registry
|
||||
uses: docker/login-action@1f401f745bf57e30b3a2800ad308a87d2ebdf14b
|
||||
uses: docker/login-action@3d58c274f17dffee475a5520cbe67f0a882c4dbb
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
@@ -54,7 +54,7 @@ jobs:
|
||||
tar --numeric-owner --transform "s/dist/element-call-${TARBALL_VERSION}/" -cvzf element-call-${TARBALL_VERSION}.tar.gz dist
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
||||
uses: actions/upload-artifact@1eb3cb2b3e0f29609092a73eb033bb759a334595
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
with:
|
||||
@@ -62,7 +62,7 @@ jobs:
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@62339db73c56dd749060f65a6ebb93a6e056b755
|
||||
uses: docker/metadata-action@dbef88086f6cef02e264edb7dbf63250c17cef6c
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
@@ -72,10 +72,10 @@ jobs:
|
||||
type=raw,value=latest-ci_${{steps.current-time.outputs.unix_time}},enable={{is_default_branch}}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@6d5347c4025fdf2bb05167a2519cac535a14a408
|
||||
uses: docker/setup-buildx-action@edfb0fe6204400c56fbfd3feba3fe9ad1adfa345
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@fdf7f43ecf7c1a5c7afe936410233728a8c2d9c2
|
||||
uses: docker/build-push-action@9f6f8c940b91232557f8699b21341a08624a8dce
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
|
||||
56
.github/workflows/translations-download.yaml
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
name: Download translation files from Localazy
|
||||
on:
|
||||
workflow_dispatch:
|
||||
secrets:
|
||||
ELEMENT_BOT_TOKEN:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
download:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- name: Checkout the code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
cache: "yarn"
|
||||
|
||||
- name: Install Deps
|
||||
run: "yarn install --frozen-lockfile"
|
||||
|
||||
- name: Prune i18n
|
||||
run: "rm -R public/locales"
|
||||
|
||||
- name: Download translation files
|
||||
uses: localazy/download@v1.1.0
|
||||
with:
|
||||
groups: "-p includeSourceLang:true"
|
||||
|
||||
- name: Fix the owner of the downloaded files
|
||||
run: "sudo chown runner:docker -R public/locales"
|
||||
|
||||
- name: Prettier
|
||||
run: yarn prettier:format
|
||||
|
||||
- name: Create Pull Request
|
||||
id: cpr
|
||||
uses: peter-evans/create-pull-request@v5.0.2
|
||||
with:
|
||||
token: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
branch: actions/localazy-download
|
||||
delete-branch: true
|
||||
title: Localazy Download
|
||||
commit-message: Translations updates
|
||||
labels: |
|
||||
T-Task
|
||||
|
||||
- name: Enable automerge
|
||||
run: gh pr merge --merge --auto "$PR_NUMBER"
|
||||
if: steps.cpr.outputs.pull-request-operation == 'created'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
PR_NUMBER: ${{ steps.cpr.outputs.pull-request-number }}
|
||||
20
.github/workflows/translations-upload.yaml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
name: Upload translation files to Localazy
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- livekit
|
||||
|
||||
jobs:
|
||||
upload:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- name: Checkout the code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Upload
|
||||
uses: localazy/upload@v1
|
||||
with:
|
||||
write_key: ${{ secrets.LOCALAZY_WRITE_KEY }}
|
||||
18
README.md
@@ -1,11 +1,11 @@
|
||||
# Element Call
|
||||
|
||||
[](https://matrix.to/#/#webrtc:matrix.org)
|
||||
[](https://translate.element.io/engage/element-call/)
|
||||
[](https://localazy.com/p/element-call)
|
||||
|
||||
Group calls with WebRTC that leverage [Matrix](https://matrix.org) and an open-source WebRTC toolkit from [LiveKit](https://livekit.io/).
|
||||
|
||||
For prior version of the Element Call that relied solely on full-mesh logic, check [`full-mesh`](https://github.com/vector-im/element-call/tree/full-mesh) branch.
|
||||
For prior version of the Element Call that relied solely on full-mesh logic, check [`full-mesh`](https://github.com/element-hq/element-call/tree/full-mesh) branch.
|
||||
|
||||

|
||||
|
||||
@@ -16,7 +16,7 @@ To try it out, visit our hosted version at [call.element.io](https://call.elemen
|
||||
Until prebuilt tarballs are available, you'll need to build Element Call from source. First, clone and install the package:
|
||||
|
||||
```
|
||||
git clone https://github.com/vector-im/element-call.git
|
||||
git clone https://github.com/element-hq/element-call.git
|
||||
cd element-call
|
||||
yarn
|
||||
yarn build
|
||||
@@ -56,7 +56,7 @@ There are currently two different config files. `.env` holds variables that are
|
||||
|
||||
## Translation
|
||||
|
||||
If you'd like to help translate Element Call, head over to [translate.element.io](https://translate.element.io/engage/element-call/). You're also encouraged to join the [Element Translators](https://matrix.to/#/#translators:element.io) space to discuss and coordinate translation efforts.
|
||||
If you'd like to help translate Element Call, head over to [Localazy](https://localazy.com/p/element-call). You're also encouraged to join the [Element Translators](https://matrix.to/#/#translators:element.io) space to discuss and coordinate translation efforts.
|
||||
|
||||
## Development
|
||||
|
||||
@@ -74,7 +74,7 @@ yarn link
|
||||
Next, we can set up this project:
|
||||
|
||||
```
|
||||
git clone https://github.com/vector-im/element-call.git
|
||||
git clone https://github.com/element-hq/element-call.git
|
||||
cd element-call
|
||||
yarn
|
||||
yarn link matrix-js-sdk
|
||||
@@ -93,12 +93,12 @@ service for development. These use a test 'secret' published in this
|
||||
repository, so this must be used only for local development and
|
||||
**_never be exposed to the public Internet._**
|
||||
|
||||
To use it, add SFU parameter in your local config `./public/config.yml`:
|
||||
To use it, add SFU parameter in your local config `./public/config.json`:
|
||||
|
||||
```yaml
|
||||
```json
|
||||
"livekit": {
|
||||
"jwt_service_url": "http://localhost:8881"
|
||||
},
|
||||
"livekit_service_url": "http://localhost:8881"
|
||||
},
|
||||
```
|
||||
|
||||
Run backend components:
|
||||
|
||||
@@ -5,7 +5,7 @@ networks:
|
||||
|
||||
services:
|
||||
auth-service:
|
||||
image: ghcr.io/vector-im/lk-jwt-service:latest-ci
|
||||
image: ghcr.io/element-hq/lk-jwt-service:latest-ci
|
||||
hostname: auth-server
|
||||
ports:
|
||||
- 8881:8080
|
||||
|
||||
@@ -112,8 +112,9 @@ Whether to hide the screen-sharing button.
|
||||
hideScreensharing: boolean; (default: false)
|
||||
```
|
||||
|
||||
**enableE2EE**
|
||||
Whether to use end-to-end encryption.
|
||||
**enableE2EE** (Deprecated)
|
||||
Whether to use end-to-end encryption. This is a legacy flag for the full mesh branch.
|
||||
It is not used on the livekit branch and has no impact there!
|
||||
|
||||
```
|
||||
enableE2EE: boolean; (default: true)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
export default {
|
||||
keySeparator: false,
|
||||
keySeparator: ".",
|
||||
namespaceSeparator: false,
|
||||
contextSeparator: "|",
|
||||
pluralSeparator: "|",
|
||||
pluralSeparator: "_",
|
||||
createOldCatalogs: false,
|
||||
defaultNamespace: "app",
|
||||
lexers: {
|
||||
@@ -10,7 +10,14 @@ export default {
|
||||
{
|
||||
lexer: "JavascriptLexer",
|
||||
functions: ["t", "translatedError"],
|
||||
functionsNamespace: ["useTranslation", "withTranslation"],
|
||||
namespaceFunctions: ["useTranslation", "withTranslation"],
|
||||
},
|
||||
],
|
||||
tsx: [
|
||||
{
|
||||
lexer: "JsxLexer",
|
||||
functions: ["t", "translatedError"],
|
||||
namespaceFunctions: ["useTranslation", "withTranslation"],
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -18,6 +25,4 @@ export default {
|
||||
output: "public/locales/$LOCALE/$NAMESPACE.json",
|
||||
input: ["src/**/*.{ts,tsx}"],
|
||||
sort: true,
|
||||
// The key becomes the English version of the string
|
||||
defaultValue: (_l, _ns, key) => key,
|
||||
};
|
||||
33
localazy.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"readKey": "a7580769542256117579-70975387172511848f4c6533943d776547bad4853931ba352ee684b738f4494e",
|
||||
|
||||
"upload": {
|
||||
"type": "json",
|
||||
"deprecate": "file",
|
||||
"features": ["plural_postfix_us", "filter_untranslated"],
|
||||
"files": [
|
||||
{
|
||||
"pattern": "public/locales/en-GB/*.json",
|
||||
"lang": "inherited"
|
||||
},
|
||||
{
|
||||
"group": "existing",
|
||||
"pattern": "public/locales/*/*.json",
|
||||
"excludes": ["public/locales/en-GB/*.json"],
|
||||
"lang": "${autodetectLang}"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
"download": {
|
||||
"files": [
|
||||
{
|
||||
"output": "public/locales/${langLsrDash}/${file}"
|
||||
}
|
||||
],
|
||||
"includeSourceLang": "${includeSourceLang|false}",
|
||||
"langAliases": {
|
||||
"en": "en_GB"
|
||||
}
|
||||
}
|
||||
}
|
||||
22
package.json
@@ -18,16 +18,18 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@juggle/resize-observer": "^3.3.1",
|
||||
"@livekit/components-core": "^0.8.0",
|
||||
"@livekit/components-react": "^1.1.0",
|
||||
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz",
|
||||
"@opentelemetry/api": "^1.4.0",
|
||||
"@opentelemetry/context-zone": "^1.9.1",
|
||||
"@opentelemetry/exporter-jaeger": "^1.9.1",
|
||||
"@opentelemetry/exporter-trace-otlp-http": "^0.45.0",
|
||||
"@opentelemetry/instrumentation-document-load": "^0.33.0",
|
||||
"@opentelemetry/instrumentation-user-interaction": "^0.33.0",
|
||||
"@opentelemetry/exporter-trace-otlp-http": "^0.47.0",
|
||||
"@opentelemetry/instrumentation-document-load": "^0.34.0",
|
||||
"@opentelemetry/instrumentation-user-interaction": "^0.34.0",
|
||||
"@opentelemetry/sdk-trace-web": "^1.9.1",
|
||||
"@radix-ui/react-dialog": "^1.0.4",
|
||||
"@radix-ui/react-slider": "^1.1.2",
|
||||
"@radix-ui/react-visually-hidden": "^1.0.3",
|
||||
"@react-aria/button": "^3.3.4",
|
||||
"@react-aria/focus": "^3.5.0",
|
||||
@@ -37,6 +39,7 @@
|
||||
"@react-aria/tabs": "^3.1.0",
|
||||
"@react-aria/tooltip": "^3.1.3",
|
||||
"@react-aria/utils": "^3.10.0",
|
||||
"@react-rxjs/core": "^0.10.7",
|
||||
"@react-spring/web": "^9.4.4",
|
||||
"@react-stately/collections": "^3.3.4",
|
||||
"@react-stately/select": "^3.1.3",
|
||||
@@ -47,7 +50,7 @@
|
||||
"@types/lodash": "^4.14.199",
|
||||
"@use-gesture/react": "^10.2.11",
|
||||
"@vector-im/compound-design-tokens": "^0.1.0",
|
||||
"@vector-im/compound-web": "^0.6.0",
|
||||
"@vector-im/compound-web": "^2.0.0",
|
||||
"@vitejs/plugin-basic-ssl": "^1.0.1",
|
||||
"@vitejs/plugin-react": "^4.0.1",
|
||||
"buffer": "^6.0.3",
|
||||
@@ -58,7 +61,7 @@
|
||||
"i18next-http-backend": "^2.0.0",
|
||||
"livekit-client": "^1.12.3",
|
||||
"lodash": "^4.17.21",
|
||||
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#107e28e1145c8b2667701e1f75b9f09b5d2ac3d6",
|
||||
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#2cd63ca4b90eb2e4d22b45ae281a81c4514e757a",
|
||||
"matrix-widget-api": "^1.3.1",
|
||||
"normalize.css": "^8.0.1",
|
||||
"pako": "^2.0.4",
|
||||
@@ -66,15 +69,16 @@
|
||||
"posthog-js": "^1.29.0",
|
||||
"react": "18",
|
||||
"react-dom": "18",
|
||||
"react-i18next": "^13.0.0",
|
||||
"react-i18next": "^14.0.0",
|
||||
"react-router-dom": "^5.2.0",
|
||||
"react-use-clipboard": "^1.0.7",
|
||||
"react-use-measure": "^2.1.1",
|
||||
"rxjs": "^7.8.1",
|
||||
"sdp-transform": "^2.14.1",
|
||||
"tinyqueue": "^2.0.3",
|
||||
"unique-names-generator": "^4.6.0",
|
||||
"uuid": "9",
|
||||
"vaul": "^0.7.0"
|
||||
"vaul": "^0.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.16.5",
|
||||
@@ -110,7 +114,7 @@
|
||||
"eslint-plugin-matrix-org": "^1.2.1",
|
||||
"eslint-plugin-react": "^7.29.4",
|
||||
"eslint-plugin-react-hooks": "^4.5.0",
|
||||
"eslint-plugin-unicorn": "^49.0.0",
|
||||
"eslint-plugin-unicorn": "^50.0.0",
|
||||
"i18next-parser": "^8.0.0",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"jest": "^29.2.2",
|
||||
@@ -120,7 +124,7 @@
|
||||
"sass": "^1.42.1",
|
||||
"typescript": "^5.1.6",
|
||||
"typescript-eslint-language-service": "^5.0.5",
|
||||
"vite": "^4.2.0",
|
||||
"vite": "^5.0.0",
|
||||
"vite-plugin-html-template": "^1.1.0",
|
||||
"vite-plugin-svgr": "^4.0.0"
|
||||
},
|
||||
|
||||
@@ -1,60 +1,78 @@
|
||||
{
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Вече имате акаунт?</0><1><0>Влезте с него</0> или <2>Влезте като гост</2></1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Създайте акаунт</0> или <2>Влезте като гост</2>",
|
||||
"<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>": "<0>Защо не настройте парола за да запазите акаунта си?</0><1>Ще можете да запазите името и аватара си за бъдещи разговори</1>",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Друг потребител в този разговор има проблем. За да диагностицираме този проблем по-добре ни се иска да съберем debug логове.",
|
||||
"Audio": "Звук",
|
||||
"Avatar": "Аватар",
|
||||
"Camera": "Камера",
|
||||
"Close": "Затвори",
|
||||
"Confirm password": "Потвърди паролата",
|
||||
"Copied!": "Копирано!",
|
||||
"Create account": "Създай акаунт",
|
||||
"Debug log request": "Заявка за debug логове",
|
||||
"Developer": "Разработчик",
|
||||
"Display name": "Име/псевдоним",
|
||||
"Exit full screen": "Излез от цял екран",
|
||||
"Full screen": "Цял екран",
|
||||
"Go": "Напред",
|
||||
"Home": "Начало",
|
||||
"Include debug logs": "Включи debug логове",
|
||||
"Join call": "Влез в разговора",
|
||||
"Join call now": "Влез в разговора сега",
|
||||
"Join existing call?": "Присъединяване към съществуващ разговор?",
|
||||
"Loading…": "Зареждане…",
|
||||
"Local volume": "Локална сила на звука",
|
||||
"Logging in…": "Влизане…",
|
||||
"Login": "Влез",
|
||||
"Login to your account": "Влезте в акаунта си",
|
||||
"Microphone": "Микрофон",
|
||||
"More": "Още",
|
||||
"No": "Не",
|
||||
"Not now, return to home screen": "Не сега, върни се на началния екран",
|
||||
"Not registered yet? <2>Create an account</2>": "Все още не сте регистрирани? <2>Създайте акаунт</2>",
|
||||
"Password": "Парола",
|
||||
"Passwords must match": "Паролите не съвпадат",
|
||||
"Profile": "Профил",
|
||||
"Recaptcha dismissed": "Recaptcha отхвърлена",
|
||||
"Recaptcha not loaded": "Recaptcha не е заредена",
|
||||
"Register": "Регистрация",
|
||||
"Registering…": "Регистриране…",
|
||||
"Remove": "Премахни",
|
||||
"Return to home screen": "Връщане на началния екран",
|
||||
"Select an option": "Изберете опция",
|
||||
"Send debug logs": "Изпратете debug логове",
|
||||
"Sending…": "Изпращане…",
|
||||
"Settings": "Настройки",
|
||||
"Share screen": "Сподели екрана",
|
||||
"Sign in": "Влез",
|
||||
"Sign out": "Излез",
|
||||
"Speaker": "Говорител",
|
||||
"Spotlight": "Прожектор",
|
||||
"Submit feedback": "Изпрати обратна връзка",
|
||||
"This call already exists, would you like to join?": "Този разговор вече съществува, искате ли да се присъедините?",
|
||||
"User menu": "Потребителско меню",
|
||||
"Username": "Потребителско име",
|
||||
"Version: {{version}}": "Версия: {{version}}",
|
||||
"Video": "Видео",
|
||||
"Waiting for other participants…": "Изчакване на други участници…",
|
||||
"Yes, join call": "Да, присъедини се"
|
||||
"a11y": {
|
||||
"user_menu": "Потребителско меню"
|
||||
},
|
||||
"action": {
|
||||
"close": "Затвори",
|
||||
"go": "Напред",
|
||||
"no": "Не",
|
||||
"register": "Регистрация",
|
||||
"remove": "Премахни",
|
||||
"sign_in": "Влез",
|
||||
"sign_out": "Излез"
|
||||
},
|
||||
"call_ended_view": {
|
||||
"create_account_button": "Създай акаунт",
|
||||
"create_account_prompt": "<0>Защо не настройте парола за да запазите акаунта си?</0><1>Ще можете да запазите името и аватара си за бъдещи разговори</1>",
|
||||
"not_now_button": "Не сега, върни се на началния екран"
|
||||
},
|
||||
"common": {
|
||||
"audio": "Звук",
|
||||
"avatar": "Аватар",
|
||||
"camera": "Камера",
|
||||
"copied": "Копирано!",
|
||||
"display_name": "Име/псевдоним",
|
||||
"home": "Начало",
|
||||
"loading": "Зареждане…",
|
||||
"microphone": "Микрофон",
|
||||
"password": "Парола",
|
||||
"profile": "Профил",
|
||||
"settings": "Настройки",
|
||||
"username": "Потребителско име",
|
||||
"video": "Видео"
|
||||
},
|
||||
"exit_fullscreen_button_label": "Излез от цял екран",
|
||||
"fullscreen_button_label": "Цял екран",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Да, присъедини се",
|
||||
"text": "Този разговор вече съществува, искате ли да се присъедините?",
|
||||
"title": "Присъединяване към съществуващ разговор?"
|
||||
},
|
||||
"layout_spotlight_label": "Прожектор",
|
||||
"lobby": {
|
||||
"join_button": "Влез в разговора"
|
||||
},
|
||||
"local_volume_label": "Локална сила на звука",
|
||||
"logging_in": "Влизане…",
|
||||
"login_auth_links": "<0>Създайте акаунт</0> или <2>Влезте като гост</2>",
|
||||
"login_title": "Влез",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Друг потребител в този разговор има проблем. За да диагностицираме този проблем по-добре ни се иска да съберем debug логове.",
|
||||
"title": "Заявка за debug логове"
|
||||
},
|
||||
"rageshake_send_logs": "Изпратете debug логове",
|
||||
"rageshake_sending": "Изпращане…",
|
||||
"recaptcha_dismissed": "Recaptcha отхвърлена",
|
||||
"recaptcha_not_loaded": "Recaptcha не е заредена",
|
||||
"register": {
|
||||
"passwords_must_match": "Паролите не съвпадат",
|
||||
"registering": "Регистриране…"
|
||||
},
|
||||
"register_auth_links": "<0>Вече имате акаунт?</0><1><0>Влезте с него</0> или <2>Влезте като гост</2></1>",
|
||||
"register_confirm_password_label": "Потвърди паролата",
|
||||
"return_home_button": "Връщане на началния екран",
|
||||
"room_auth_view_join_button": "Влез в разговора сега",
|
||||
"screenshare_button_label": "Сподели екрана",
|
||||
"select_input_unset_button": "Изберете опция",
|
||||
"settings": {
|
||||
"developer_tab_title": "Разработчик",
|
||||
"feedback_tab_h4": "Изпрати обратна връзка",
|
||||
"feedback_tab_send_logs_label": "Включи debug логове",
|
||||
"more_tab_title": "Още",
|
||||
"speaker_device_selection_label": "Говорител"
|
||||
},
|
||||
"unauthenticated_view_body": "Все още не сте регистрирани? <2>Създайте акаунт</2>",
|
||||
"unauthenticated_view_login_button": "Влезте в акаунта си",
|
||||
"version": "Версия: {{version}}",
|
||||
"waiting_for_participants": "Изчакване на други участници…"
|
||||
}
|
||||
|
||||
@@ -1,67 +1,82 @@
|
||||
{
|
||||
"Copied!": "Zkopírováno!",
|
||||
"Confirm password": "Potvrdit heslo",
|
||||
"Close": "Zavřít",
|
||||
"Camera": "Kamera",
|
||||
"Avatar": "Avatar",
|
||||
"Audio": "Audio",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Vytvořit účet</0> Or <2>Jako host</2>",
|
||||
"Yes, join call": "Ano, připojit se",
|
||||
"Waiting for other participants…": "Čekání na další účastníky…",
|
||||
"Video": "Video",
|
||||
"Version: {{version}}": "Verze: {{version}}",
|
||||
"Username": "Uživatelské jméno",
|
||||
"User menu": "Uživatelské menu",
|
||||
"This call already exists, would you like to join?": "Tento hovor již existuje, chcete se připojit?",
|
||||
"Submit feedback": "Dát feedback",
|
||||
"Speaker": "Reproduktor",
|
||||
"Sign out": "Odhlásit se",
|
||||
"Sign in": "Přihlásit se",
|
||||
"Share screen": "Sdílet obrazovku",
|
||||
"Settings": "Nastavení",
|
||||
"Sending…": "Posílání…",
|
||||
"Sending debug logs…": "Posílání ladícího záznamu…",
|
||||
"Send debug logs": "Poslat ladící záznam",
|
||||
"Select an option": "Vyberte možnost",
|
||||
"Return to home screen": "Vrátit se na domácí obrazovku",
|
||||
"Remove": "Odstranit",
|
||||
"Registering…": "Registrování…",
|
||||
"Register": "Registrace",
|
||||
"Profile": "Profil",
|
||||
"Passwords must match": "Hesla se musí shodovat",
|
||||
"Password": "Heslo",
|
||||
"Not now, return to home screen": "Teď ne, vrátit se na domovskou obrazovku",
|
||||
"No": "Ne",
|
||||
"More": "Více",
|
||||
"Microphone": "Mikrofon",
|
||||
"Login to your account": "Přihlásit se ke svému účtu",
|
||||
"Login": "Přihlášení",
|
||||
"Logging in…": "Přihlašování se…",
|
||||
"Local volume": "Lokální hlasitost",
|
||||
"Loading…": "Načítání…",
|
||||
"Join call now": "Připojit se k hovoru",
|
||||
"Join call": "Připojit se k hovoru",
|
||||
"Spotlight": "Soustředěný mód",
|
||||
"Recaptcha not loaded": "Recaptcha se nenačetla",
|
||||
"Recaptcha dismissed": "Recaptcha byla zamítnuta",
|
||||
"Not registered yet? <2>Create an account</2>": "Nejste registrovaní? <2>Vytvořit účet</2>",
|
||||
"Join existing call?": "Připojit se k existujícimu hovoru?",
|
||||
"Include debug logs": "Zahrnout ladící záznamy",
|
||||
"Home": "Domov",
|
||||
"Go": "Pokračovat",
|
||||
"Full screen": "Zvětšit na celou obrazovku",
|
||||
"Exit full screen": "Ukončit režim celé obrazovky",
|
||||
"Element Call Home": "Domov Element Call",
|
||||
"Display name": "Zobrazované jméno",
|
||||
"Developer": "Vývojář",
|
||||
"Debug log request": "Žádost o protokoly ladění",
|
||||
"Create account": "Vytvořit účet",
|
||||
"Copy": "Kopírovat",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Jiný uživatel v tomto hovoru má problémy. Abychom mohli diagnostikovat problém, rádi bychom shromáždili protokoly ladění.",
|
||||
"<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>": "<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>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Už máte účet?</0><1><0>Přihlásit se</0> Or <2>Jako host</2></1>",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Odeslání ladících záznamů nám pomůže diagnostikovat problém.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Oops, něco se pokazilo.</0>",
|
||||
"Expose developer settings in the settings window.": "Zobrazit vývojářské nastavení.",
|
||||
"Developer Settings": "Vývojářské nastavení"
|
||||
"a11y": {
|
||||
"user_menu": "Uživatelské menu"
|
||||
},
|
||||
"action": {
|
||||
"close": "Zavřít",
|
||||
"copy": "Kopírovat",
|
||||
"go": "Pokračovat",
|
||||
"no": "Ne",
|
||||
"register": "Registrace",
|
||||
"remove": "Odstranit",
|
||||
"sign_in": "Přihlásit se",
|
||||
"sign_out": "Odhlásit se"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"common": {
|
||||
"camera": "Kamera",
|
||||
"copied": "Zkopírováno!",
|
||||
"display_name": "Zobrazované jméno",
|
||||
"home": "Domov",
|
||||
"loading": "Načítání…",
|
||||
"microphone": "Mikrofon",
|
||||
"password": "Heslo",
|
||||
"profile": "Profil",
|
||||
"settings": "Nastavení",
|
||||
"username": "Uživatelské jméno"
|
||||
},
|
||||
"exit_fullscreen_button_label": "Ukončit režim celé obrazovky",
|
||||
"full_screen_view_description": "<0>Odeslání ladících záznamů nám pomůže diagnostikovat problém.</0>",
|
||||
"full_screen_view_h1": "<0>Oops, něco se pokazilo.</0>",
|
||||
"fullscreen_button_label": "Zvětšit na celou obrazovku",
|
||||
"header_label": "Domov Element Call",
|
||||
"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_spotlight_label": "Soustředěný mód",
|
||||
"lobby": {
|
||||
"join_button": "Připojit se k hovoru"
|
||||
},
|
||||
"local_volume_label": "Lokální hlasitost",
|
||||
"logging_in": "Přihlašování se…",
|
||||
"login_auth_links": "<0>Vytvořit účet</0> Or <2>Jako host</2>",
|
||||
"login_title": "Přihlášení",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Jiný uživatel v tomto hovoru má problémy. Abychom mohli diagnostikovat problém, rádi bychom shromáždili protokoly ladění.",
|
||||
"title": "Žádost o protokoly ladění"
|
||||
},
|
||||
"rageshake_send_logs": "Poslat ladící záznam",
|
||||
"rageshake_sending": "Posílání…",
|
||||
"rageshake_sending_logs": "Posílání ladícího záznamu…",
|
||||
"recaptcha_dismissed": "Recaptcha byla zamítnuta",
|
||||
"recaptcha_not_loaded": "Recaptcha se nenačetla",
|
||||
"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>",
|
||||
"register_confirm_password_label": "Potvrdit heslo",
|
||||
"return_home_button": "Vrátit se na domácí obrazovku",
|
||||
"room_auth_view_join_button": "Připojit se k hovoru",
|
||||
"screenshare_button_label": "Sdílet obrazovku",
|
||||
"select_input_unset_button": "Vyberte možnost",
|
||||
"settings": {
|
||||
"developer_settings_label": "Vývojářské nastavení",
|
||||
"developer_settings_label_description": "Zobrazit vývojářské nastavení.",
|
||||
"developer_tab_title": "Vývojář",
|
||||
"feedback_tab_h4": "Dát feedback",
|
||||
"feedback_tab_send_logs_label": "Zahrnout ladící záznamy",
|
||||
"more_tab_title": "Více",
|
||||
"speaker_device_selection_label": "Reproduktor"
|
||||
},
|
||||
"unauthenticated_view_body": "Nejste registrovaní? <2>Vytvořit účet</2>",
|
||||
"unauthenticated_view_login_button": "Přihlásit se ke svému účtu",
|
||||
"version": "Verze: {{version}}",
|
||||
"waiting_for_participants": "Čekání na další účastníky…"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,148 @@
|
||||
{
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Du hast bereits ein Konto?</0><1><0>Anmelden</0> Oder <2>Als Gast betreten</2></1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Konto erstellen</0> Oder <2>Als Gast betreten</2>",
|
||||
"<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>": "<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>",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Ein anderer Benutzer dieses Anrufs hat ein Problem. Um es besser diagnostizieren zu können, würden wir gerne ein Debug-Protokoll erstellen.",
|
||||
"Audio": "Audio",
|
||||
"Avatar": "Avatar",
|
||||
"Camera": "Kamera",
|
||||
"Close": "Schließen",
|
||||
"Confirm password": "Passwort bestätigen",
|
||||
"Copied!": "Kopiert!",
|
||||
"Create account": "Konto erstellen",
|
||||
"Debug log request": "Debug-Log Anfrage",
|
||||
"Developer": "Entwickler",
|
||||
"Display name": "Anzeigename",
|
||||
"Exit full screen": "Vollbildmodus verlassen",
|
||||
"Full screen": "Vollbild",
|
||||
"Go": "Los geht’s",
|
||||
"Home": "Startseite",
|
||||
"Include debug logs": "Debug-Protokolle einschließen",
|
||||
"Join call": "Anruf beitreten",
|
||||
"Join call now": "Anruf beitreten",
|
||||
"Join existing call?": "An bestehendem Anruf teilnehmen?",
|
||||
"Loading…": "Lade …",
|
||||
"Local volume": "Lokale Lautstärke",
|
||||
"Logging in…": "Anmelden …",
|
||||
"Login": "Anmelden",
|
||||
"Login to your account": "Melde dich mit deinem Konto an",
|
||||
"Microphone": "Mikrofon",
|
||||
"More": "Mehr",
|
||||
"No": "Nein",
|
||||
"Not now, return to home screen": "Nicht jetzt, zurück zur Startseite",
|
||||
"Not registered yet? <2>Create an account</2>": "Noch nicht registriert? <2>Konto erstellen</2>",
|
||||
"Password": "Passwort",
|
||||
"Passwords must match": "Passwörter müssen übereinstimmen",
|
||||
"Profile": "Profil",
|
||||
"Recaptcha dismissed": "Recaptcha abgelehnt",
|
||||
"Recaptcha not loaded": "Recaptcha nicht geladen",
|
||||
"Register": "Registrieren",
|
||||
"Registering…": "Registrierung …",
|
||||
"Remove": "Entfernen",
|
||||
"Return to home screen": "Zurück zur Startseite",
|
||||
"Select an option": "Wähle eine Option",
|
||||
"Send debug logs": "Debug-Logs senden",
|
||||
"Sending…": "Senden …",
|
||||
"Settings": "Einstellungen",
|
||||
"Share screen": "Bildschirm teilen",
|
||||
"Sign in": "Anmelden",
|
||||
"Sign out": "Abmelden",
|
||||
"Speaker": "Wiedergabegerät",
|
||||
"Spotlight": "Rampenlicht",
|
||||
"Submit feedback": "Rückmeldung geben",
|
||||
"This call already exists, would you like to join?": "Dieser Aufruf existiert bereits, möchtest Du teilnehmen?",
|
||||
"User menu": "Benutzermenü",
|
||||
"Username": "Benutzername",
|
||||
"Version: {{version}}": "Version: {{version}}",
|
||||
"Video": "Video",
|
||||
"Waiting for other participants…": "Warte auf weitere Teilnehmer …",
|
||||
"Yes, join call": "Ja, Anruf beitreten",
|
||||
"Sending debug logs…": "Sende Debug-Protokolle …",
|
||||
"Copy": "Kopieren",
|
||||
"Element Call Home": "Element Call-Startseite",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Übermittelte Problemberichte helfen uns, Fehler zu beheben.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Hoppla, etwas ist schiefgelaufen.</0>",
|
||||
"Expose developer settings in the settings window.": "Zeige die Entwicklereinstellungen im Einstellungsfenster.",
|
||||
"Developer Settings": "Entwicklereinstellungen",
|
||||
"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 <5>Cookie Policy</5>.": "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 <5>Cookie-Richtlinien</5>.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>Du kannst deine Zustimmung durch Abwählen dieses Kästchens zurückziehen. Falls du dich aktuell in einem Anruf befindest, wird diese Einstellung nach dem Ende des Anrufs wirksam.",
|
||||
"Feedback": "Rückmeldung",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Falls du auf Probleme stößt oder einfach nur eine Rückmeldung geben möchtest, sende uns bitte eine kurze Beschreibung.",
|
||||
"Your feedback": "Deine Rückmeldung",
|
||||
"Thanks, we received your feedback!": "Danke, wir haben deine Rückmeldung erhalten!",
|
||||
"Submitting…": "Sende …",
|
||||
"Submit": "Absenden",
|
||||
"{{count}} stars|other": "{{count}} Sterne",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, dein Anruf wurde beendet.",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Wir würden uns freuen, deine Rückmeldung zu hören, um deine Erfahrung verbessern zu können.</0>",
|
||||
"How did it go?": "Wie ist es gelaufen?",
|
||||
"{{count}} stars|one": "{{count}} Stern",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Danke für deine Rückmeldung!</0>",
|
||||
"{{displayName}} is presenting": "{{displayName}} präsentiert",
|
||||
"Show connection stats": "Verbindungsstatistiken zeigen",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Mit einem Klick auf „Anruf beitreten“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)</2>",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Mit einem Klick auf „Los geht’s“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)</2>",
|
||||
"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>": "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>",
|
||||
"Connectivity to the server has been lost.": "Die Verbindung zum Server wurde getrennt.",
|
||||
"Thanks!": "Danke!",
|
||||
"You were disconnected from the call": "Deine Verbindung wurde getrennt",
|
||||
"Reconnect": "Erneut verbinden",
|
||||
"Retry sending logs": "Protokolle erneut senden",
|
||||
"Encrypted": "Verschlüsselt",
|
||||
"End call": "Anruf beenden",
|
||||
"Grid": "Raster",
|
||||
"Not encrypted": "Nicht verschlüsselt",
|
||||
"Microphone off": "Mikrofon aus",
|
||||
"Microphone on": "Mikrofon an",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"Sharing screen": "Bildschirm wird geteilt",
|
||||
"You": "Du",
|
||||
"Continue in browser": "Weiter im Browser",
|
||||
"Name of call": "Name des Anrufs",
|
||||
"Open in the app": "In der App öffnen",
|
||||
"Ready to join?": "Bereit, beizutreten?",
|
||||
"Unmute microphone": "Mikrofon aktivieren",
|
||||
"Start video": "Video aktivieren",
|
||||
"Stop video": "Video deaktivieren",
|
||||
"Back to recents": "Zurück zu kürzlichen Anrufen",
|
||||
"Select app": "App auswählen",
|
||||
"Mute microphone": "Mikrofon deaktivieren",
|
||||
"Start new call": "Neuen Anruf beginnen",
|
||||
"Call not found": "Anruf nicht gefunden",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Anrufe sind nun Ende-zu-Ende-verschlüsselt und müssen auf der Startseite erstellt werden. Damit stellen wir sicher, dass alle denselben Schlüssel verwenden.",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Dein Webbrowser unterstützt keine Medien-Ende-zu-Ende-Verschlüsselung. Unterstützte Browser sind Chrome, Safari, Firefox >=117",
|
||||
"Copy link": "Link kopieren",
|
||||
"Invite": "Einladen",
|
||||
"Invite to this call": "Zu diesem Anruf einladen",
|
||||
"Link copied to clipboard": "Link in Zwischenablage kopiert",
|
||||
"Participants": "Teilnehmende"
|
||||
"a11y": {
|
||||
"user_menu": "Benutzermenü"
|
||||
},
|
||||
"action": {
|
||||
"close": "Schließen",
|
||||
"copy": "Kopieren",
|
||||
"copy_link": "Link kopieren",
|
||||
"go": "Los geht’s",
|
||||
"invite": "Einladen",
|
||||
"no": "Nein",
|
||||
"register": "Registrieren",
|
||||
"remove": "Entfernen",
|
||||
"sign_in": "Anmelden",
|
||||
"sign_out": "Abmelden",
|
||||
"submit": "Absenden"
|
||||
},
|
||||
"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 <5>Cookie-Richtlinien</5>.",
|
||||
"app_selection_modal": {
|
||||
"continue_in_browser": "Weiter im Browser",
|
||||
"open_in_app": "In der App öffnen",
|
||||
"text": "Bereit, beizutreten?",
|
||||
"title": "App auswählen"
|
||||
},
|
||||
"application_opened_another_tab": "Diese Anwendung wurde in einem anderen Tab geöffnet.",
|
||||
"browser_media_e2ee_unsupported": "Dein Webbrowser unterstützt keine Medien-Ende-zu-Ende-Verschlüsselung. Unterstützte Browser sind Chrome, Safari, Firefox >=117",
|
||||
"browser_media_e2ee_unsupported_heading": "Inkompatibler Browser",
|
||||
"call_ended_view": {
|
||||
"body": "Deine Verbindung wurde getrennt",
|
||||
"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>",
|
||||
"feedback_done": "<0>Danke für deine Rückmeldung!</0>",
|
||||
"feedback_prompt": "<0>Wir würden uns freuen, deine Rückmeldung zu hören, um deine Erfahrung verbessern zu können.</0>",
|
||||
"headline": "{{displayName}}, dein Anruf wurde beendet.",
|
||||
"not_now_button": "Nicht jetzt, zurück zur Startseite",
|
||||
"reconnect_button": "Erneut verbinden",
|
||||
"survey_prompt": "Wie ist es gelaufen?"
|
||||
},
|
||||
"call_name": "Name des Anrufs",
|
||||
"common": {
|
||||
"audio": "Audio",
|
||||
"avatar": "Profilbild",
|
||||
"camera": "Kamera",
|
||||
"copied": "Kopiert!",
|
||||
"display_name": "Anzeigename",
|
||||
"encrypted": "Verschlüsselt",
|
||||
"error": "Fehler",
|
||||
"home": "Startseite",
|
||||
"loading": "Lade …",
|
||||
"microphone": "Mikrofon",
|
||||
"password": "Passwort",
|
||||
"profile": "Profil",
|
||||
"settings": "Einstellungen",
|
||||
"unencrypted": "Nicht verschlüsselt",
|
||||
"username": "Benutzername",
|
||||
"video": "Video"
|
||||
},
|
||||
"disconnected_banner": "Die Verbindung zum Server wurde getrennt.",
|
||||
"exit_fullscreen_button_label": "Vollbildmodus verlassen",
|
||||
"full_screen_view_description": "<0>Übermittelte Problemberichte helfen uns, Fehler zu beheben.</0>",
|
||||
"full_screen_view_h1": "<0>Hoppla, etwas ist schiefgelaufen.</0>",
|
||||
"fullscreen_button_label": "Vollbild",
|
||||
"group_call_loader_failed_heading": "Anruf nicht gefunden",
|
||||
"group_call_loader_failed_text": "Anrufe sind nun Ende-zu-Ende-verschlüsselt und müssen auf der Startseite erstellt werden. Damit stellen wir sicher, dass alle denselben Schlüssel verwenden.",
|
||||
"hangup_button_label": "Anruf beenden",
|
||||
"header_label": "Element Call-Startseite",
|
||||
"header_participants_label": "Teilnehmende",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Link in Zwischenablage kopiert",
|
||||
"title": "Zu diesem Anruf einladen"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Ja, Anruf beitreten",
|
||||
"text": "Dieser Aufruf existiert bereits, möchtest Du teilnehmen?",
|
||||
"title": "An bestehendem Anruf teilnehmen?"
|
||||
},
|
||||
"layout_grid_label": "Raster",
|
||||
"layout_spotlight_label": "Rampenlicht",
|
||||
"lobby": {
|
||||
"join_button": "Anruf beitreten",
|
||||
"leave_button": "Zurück zu kürzlichen Anrufen"
|
||||
},
|
||||
"local_volume_label": "Lokale Lautstärke",
|
||||
"log_in": "Anmelden",
|
||||
"logging_in": "Anmelden …",
|
||||
"login_auth_links": "<0>Konto erstellen</0> Oder <2>Als Gast betreten</2>",
|
||||
"login_auth_links_prompt": "Noch nicht registriert?",
|
||||
"login_subheading": "Weiter zu Element",
|
||||
"login_title": "Anmelden",
|
||||
"microphone_off": "Mikrofon aus",
|
||||
"microphone_on": "Mikrofon an",
|
||||
"mute_microphone_button_label": "Mikrofon deaktivieren",
|
||||
"rageshake_button_error_caption": "Protokolle erneut senden",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Ein anderer Benutzer dieses Anrufs hat ein Problem. Um es besser diagnostizieren zu können, würden wir gerne ein Debug-Protokoll erstellen.",
|
||||
"title": "Debug-Log Anfrage"
|
||||
},
|
||||
"rageshake_send_logs": "Debug-Logs senden",
|
||||
"rageshake_sending": "Senden …",
|
||||
"rageshake_sending_logs": "Sende Debug-Protokolle …",
|
||||
"rageshake_sent": "Danke!",
|
||||
"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",
|
||||
"register": {
|
||||
"passwords_must_match": "Passwörter müssen übereinstimmen",
|
||||
"registering": "Registrierung …"
|
||||
},
|
||||
"register_auth_links": "<0>Du hast bereits ein Konto?</0><1><0>Anmelden</0> Oder <2>Als Gast betreten</2></1>",
|
||||
"register_confirm_password_label": "Passwort bestätigen",
|
||||
"return_home_button": "Zurück zur Startseite",
|
||||
"room_auth_view_eula_caption": "Mit einem Klick auf „Anruf beitreten“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)</2>",
|
||||
"room_auth_view_join_button": "Anruf beitreten",
|
||||
"screenshare_button_label": "Bildschirm teilen",
|
||||
"select_input_unset_button": "Wähle eine Option",
|
||||
"settings": {
|
||||
"developer_settings_label": "Entwicklereinstellungen",
|
||||
"developer_settings_label_description": "Zeige die Entwicklereinstellungen im Einstellungsfenster.",
|
||||
"developer_tab_title": "Entwickler",
|
||||
"feedback_tab_body": "Falls du auf Probleme stößt oder einfach nur eine Rückmeldung geben möchtest, sende uns bitte eine kurze Beschreibung.",
|
||||
"feedback_tab_description_label": "Deine Rückmeldung",
|
||||
"feedback_tab_h4": "Rückmeldung geben",
|
||||
"feedback_tab_send_logs_label": "Debug-Protokolle einschließen",
|
||||
"feedback_tab_thank_you": "Danke, wir haben deine Rückmeldung erhalten!",
|
||||
"feedback_tab_title": "Rückmeldung",
|
||||
"more_tab_title": "Mehr",
|
||||
"opt_in_description": "<0></0><1></1>Du kannst deine Zustimmung durch Abwählen dieses Kästchens zurückziehen. Falls du dich aktuell in einem Anruf befindest, wird diese Einstellung nach dem Ende des Anrufs wirksam.",
|
||||
"show_connection_stats_label": "Verbindungsstatistiken zeigen",
|
||||
"speaker_device_selection_label": "Wiedergabegerät"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} Stern",
|
||||
"star_rating_input_label_other": "{{count}} Sterne",
|
||||
"start_new_call": "Neuen Anruf beginnen",
|
||||
"start_video_button_label": "Video aktivieren",
|
||||
"stop_screenshare_button_label": "Bildschirm wird geteilt",
|
||||
"stop_video_button_label": "Video deaktivieren",
|
||||
"submitting": "Sende …",
|
||||
"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",
|
||||
"unmute_microphone_button_label": "Mikrofon aktivieren",
|
||||
"version": "Version: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} präsentiert",
|
||||
"sfu_participant_local": "Du"
|
||||
},
|
||||
"waiting_for_participants": "Warte auf weitere Teilnehmer …"
|
||||
}
|
||||
|
||||
@@ -1,83 +1,101 @@
|
||||
{
|
||||
"Version: {{version}}": "Έκδοση: {{version}}",
|
||||
"User menu": "Μενού χρήστη",
|
||||
"Submit feedback": "Υποβάλετε σχόλια",
|
||||
"Sign in": "Σύνδεση",
|
||||
"Share screen": "Κοινή χρήση οθόνης",
|
||||
"Sending…": "Αποστολή…",
|
||||
"Select an option": "Επιλέξτε μια επιλογή",
|
||||
"Remove": "Αφαίρεση",
|
||||
"Registering…": "Εγγραφή…",
|
||||
"Not registered yet? <2>Create an account</2>": "Δεν έχετε εγγραφεί ακόμα; <2>Δημιουργήστε λογαριασμό</2>",
|
||||
"Login to your account": "Συνδεθείτε στον λογαριασμό σας",
|
||||
"Logging in…": "Σύνδεση…",
|
||||
"Display name": "Εμφανιζόμενο όνομα",
|
||||
"Developer Settings": "Ρυθμίσεις προγραμματιστή",
|
||||
"Debug log request": "Αίτημα αρχείου καταγραφής",
|
||||
"Avatar": "Avatar",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Ωχ, κάτι πήγε στραβά.</0>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Δημιουργήστε λογαριασμό</0> Ή <2>Συμμετέχετε ως επισκέπτης</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Έχετε ήδη λογαριασμό;</0><1><0>Συνδεθείτε</0> Ή <2>Συμμετέχετε ως επισκέπτης</2></1>",
|
||||
"Yes, join call": "Ναι, συμμετοχή στην κλήση",
|
||||
"Waiting for other participants…": "Αναμονή για άλλους συμμετέχοντες…",
|
||||
"Video": "Βίντεο",
|
||||
"Username": "Όνομα χρήστη",
|
||||
"This call already exists, would you like to join?": "Αυτή η κλήση υπάρχει ήδη, θα θέλατε να συμμετάσχετε;",
|
||||
"Speaker": "Ηχείο",
|
||||
"Sign out": "Αποσύνδεση",
|
||||
"Settings": "Ρυθμίσεις",
|
||||
"Return to home screen": "Επιστροφή στην αρχική οθόνη",
|
||||
"Register": "Εγγραφή",
|
||||
"Profile": "Προφίλ",
|
||||
"Passwords must match": "Οι κωδικοί πρέπει να ταιριάζουν",
|
||||
"Password": "Κωδικός",
|
||||
"Not now, return to home screen": "Όχι τώρα, επιστροφή στην αρχική οθόνη",
|
||||
"No": "Όχι",
|
||||
"More": "Περισσότερα",
|
||||
"Microphone": "Μικρόφωνο",
|
||||
"Login": "Σύνδεση",
|
||||
"Loading…": "Φόρτωση…",
|
||||
"Join existing call?": "Συμμετοχή στην υπάρχουσα κλήση;",
|
||||
"Join call now": "Συμμετοχή στην κλήση τώρα",
|
||||
"Join call": "Συμμετοχή στην κλήση",
|
||||
"Go": "Μετάβαση",
|
||||
"Full screen": "Πλήρη οθόνη",
|
||||
"Exit full screen": "Έξοδος από πλήρη οθόνη",
|
||||
"Create account": "Δημιουργία λογαριασμού",
|
||||
"Copy": "Αντιγραφή",
|
||||
"Copied!": "Αντιγράφηκε!",
|
||||
"Confirm password": "Επιβεβαίωση κωδικού",
|
||||
"Close": "Κλείσιμο",
|
||||
"Camera": "Κάμερα",
|
||||
"Audio": "Ήχος",
|
||||
"Send debug logs": "Αποστολή αρχείων καταγραφής",
|
||||
"Recaptcha dismissed": "Το recaptcha απορρίφθηκε",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Ευχαριστώ για τα σχόλιά σας!</0>",
|
||||
"Local volume": "Τοπική ένταση",
|
||||
"Home": "Αρχική",
|
||||
"Show connection stats": "Εμφάνιση στατιστικών σύνδεσης",
|
||||
"{{displayName}} is presenting": "{{displayName}} παρουσιάζει",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>Μπορείτε να ανακαλέσετε τη συγκατάθεσή σας αποεπιλέγοντας αυτό το πλαίσιο. Εάν βρίσκεστε σε κλήση, η ρύθμιση αυτή θα τεθεί σε ισχύ στο τέλος της.",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Θα θέλαμε να ακούσουμε τα σχόλιά σας ώστε να βελτιώσουμε την εμπειρία σας.</0>",
|
||||
"<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>": "<0>Γιατί να μην ολοκληρώσετε με τη δημιουργία ενός κωδικού πρόσβασης για τη διατήρηση του λογαριασμού σας;</0><1>Θα μπορείτε να διατηρήσετε το όνομά σας και να ορίσετε ένα avatar για χρήση σε μελλοντικές κλήσεις.</1>",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Ένας άλλος χρήστης σε αυτή την κλήση έχει ένα πρόβλημα. Για την καλύτερη διάγνωση αυτών των προβλημάτων θα θέλαμε να συλλέξουμε ένα αρχείο καταγραφής σφαλμάτων.",
|
||||
"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 <5>Cookie Policy</5>.": "Συμμετέχοντας σε αυτή τη δοκιμαστική έκδοση, συναινείτε στη συλλογή ανώνυμων δεδομένων, τα οποία χρησιμοποιούμε για τη βελτίωση του προϊόντος. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το ποια δεδομένα καταγράφουμε στην <2>Πολιτική απορρήτου</2> και στην <5>Πολιτική cookies</5>.",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Εάν αντιμετωπίζετε προβλήματα ή απλά θέλετε να μας δώσετε κάποια σχόλια, παρακαλούμε στείλτε μας μια σύντομη περιγραφή παρακάτω.",
|
||||
"Expose developer settings in the settings window.": "Εμφάνιση ρυθμίσεων προγραμματιστή στο παράθυρο ρυθμίσεων.",
|
||||
"Feedback": "Ανατροφοδότηση",
|
||||
"Submitting…": "Υποβολή…",
|
||||
"Thanks, we received your feedback!": "Ευχαριστούμε, λάβαμε τα σχόλιά σας!",
|
||||
"{{count}} stars|other": "{{count}} αστέρια",
|
||||
"{{count}} stars|one": "{{count}} αστέρι",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, η κλήση σας τερματίστηκε.",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Η υποβολή αρχείων καταγραφής σφαλμάτων θα μας βοηθήσει να εντοπίσουμε το πρόβλημα.</0>",
|
||||
"How did it go?": "Πώς σας φάνηκε;",
|
||||
"Include debug logs": "Να συμπεριληφθούν αρχεία καταγραφής",
|
||||
"Recaptcha not loaded": "Το Recaptcha δεν φορτώθηκε",
|
||||
"Developer": "Προγραμματιστής",
|
||||
"Sending debug logs…": "Αποστολή αρχείων καταγραφής…",
|
||||
"Submit": "Υποβολή",
|
||||
"Your feedback": "Τα σχόλιά σας",
|
||||
"Spotlight": "Spotlight",
|
||||
"Element Call Home": "Element Κεντρική Οθόνη Κλήσεων"
|
||||
"a11y": {
|
||||
"user_menu": "Μενού χρήστη"
|
||||
},
|
||||
"action": {
|
||||
"close": "Κλείσιμο",
|
||||
"copy": "Αντιγραφή",
|
||||
"go": "Μετάβαση",
|
||||
"no": "Όχι",
|
||||
"register": "Εγγραφή",
|
||||
"remove": "Αφαίρεση",
|
||||
"sign_in": "Σύνδεση",
|
||||
"sign_out": "Αποσύνδεση",
|
||||
"submit": "Υποβολή"
|
||||
},
|
||||
"analytics_notice": "Συμμετέχοντας σε αυτή τη δοκιμαστική έκδοση, συναινείτε στη συλλογή ανώνυμων δεδομένων, τα οποία χρησιμοποιούμε για τη βελτίωση του προϊόντος. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το ποια δεδομένα καταγράφουμε στην <2>Πολιτική απορρήτου</2> και στην <5>Πολιτική cookies</5>.",
|
||||
"call_ended_view": {
|
||||
"create_account_button": "Δημιουργία λογαριασμού",
|
||||
"create_account_prompt": "<0>Γιατί να μην ολοκληρώσετε με τη δημιουργία ενός κωδικού πρόσβασης για τη διατήρηση του λογαριασμού σας;</0><1>Θα μπορείτε να διατηρήσετε το όνομά σας και να ορίσετε ένα avatar για χρήση σε μελλοντικές κλήσεις.</1>",
|
||||
"feedback_done": "<0>Ευχαριστώ για τα σχόλιά σας!</0>",
|
||||
"feedback_prompt": "<0>Θα θέλαμε να ακούσουμε τα σχόλιά σας ώστε να βελτιώσουμε την εμπειρία σας.</0>",
|
||||
"headline": "{{displayName}}, η κλήση σας τερματίστηκε.",
|
||||
"not_now_button": "Όχι τώρα, επιστροφή στην αρχική οθόνη",
|
||||
"survey_prompt": "Πώς σας φάνηκε;"
|
||||
},
|
||||
"common": {
|
||||
"audio": "Ήχος",
|
||||
"camera": "Κάμερα",
|
||||
"copied": "Αντιγράφηκε!",
|
||||
"display_name": "Εμφανιζόμενο όνομα",
|
||||
"home": "Αρχική",
|
||||
"loading": "Φόρτωση…",
|
||||
"microphone": "Μικρόφωνο",
|
||||
"password": "Κωδικός",
|
||||
"profile": "Προφίλ",
|
||||
"settings": "Ρυθμίσεις",
|
||||
"username": "Όνομα χρήστη",
|
||||
"video": "Βίντεο"
|
||||
},
|
||||
"exit_fullscreen_button_label": "Έξοδος από πλήρη οθόνη",
|
||||
"full_screen_view_description": "<0>Η υποβολή αρχείων καταγραφής σφαλμάτων θα μας βοηθήσει να εντοπίσουμε το πρόβλημα.</0>",
|
||||
"full_screen_view_h1": "<0>Ωχ, κάτι πήγε στραβά.</0>",
|
||||
"fullscreen_button_label": "Πλήρη οθόνη",
|
||||
"header_label": "Element Κεντρική Οθόνη Κλήσεων",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Ναι, συμμετοχή στην κλήση",
|
||||
"text": "Αυτή η κλήση υπάρχει ήδη, θα θέλατε να συμμετάσχετε;",
|
||||
"title": "Συμμετοχή στην υπάρχουσα κλήση;"
|
||||
},
|
||||
"lobby": {
|
||||
"join_button": "Συμμετοχή στην κλήση"
|
||||
},
|
||||
"local_volume_label": "Τοπική ένταση",
|
||||
"logging_in": "Σύνδεση…",
|
||||
"login_auth_links": "<0>Δημιουργήστε λογαριασμό</0> Ή <2>Συμμετέχετε ως επισκέπτης</2>",
|
||||
"login_title": "Σύνδεση",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Ένας άλλος χρήστης σε αυτή την κλήση έχει ένα πρόβλημα. Για την καλύτερη διάγνωση αυτών των προβλημάτων θα θέλαμε να συλλέξουμε ένα αρχείο καταγραφής σφαλμάτων.",
|
||||
"title": "Αίτημα αρχείου καταγραφής"
|
||||
},
|
||||
"rageshake_send_logs": "Αποστολή αρχείων καταγραφής",
|
||||
"rageshake_sending": "Αποστολή…",
|
||||
"rageshake_sending_logs": "Αποστολή αρχείων καταγραφής…",
|
||||
"recaptcha_dismissed": "Το recaptcha απορρίφθηκε",
|
||||
"recaptcha_not_loaded": "Το Recaptcha δεν φορτώθηκε",
|
||||
"register": {
|
||||
"passwords_must_match": "Οι κωδικοί πρέπει να ταιριάζουν",
|
||||
"registering": "Εγγραφή…"
|
||||
},
|
||||
"register_auth_links": "<0>Έχετε ήδη λογαριασμό;</0><1><0>Συνδεθείτε</0> Ή <2>Συμμετέχετε ως επισκέπτης</2></1>",
|
||||
"register_confirm_password_label": "Επιβεβαίωση κωδικού",
|
||||
"return_home_button": "Επιστροφή στην αρχική οθόνη",
|
||||
"room_auth_view_join_button": "Συμμετοχή στην κλήση τώρα",
|
||||
"screenshare_button_label": "Κοινή χρήση οθόνης",
|
||||
"select_input_unset_button": "Επιλέξτε μια επιλογή",
|
||||
"settings": {
|
||||
"developer_settings_label": "Ρυθμίσεις προγραμματιστή",
|
||||
"developer_settings_label_description": "Εμφάνιση ρυθμίσεων προγραμματιστή στο παράθυρο ρυθμίσεων.",
|
||||
"developer_tab_title": "Προγραμματιστής",
|
||||
"feedback_tab_body": "Εάν αντιμετωπίζετε προβλήματα ή απλά θέλετε να μας δώσετε κάποια σχόλια, παρακαλούμε στείλτε μας μια σύντομη περιγραφή παρακάτω.",
|
||||
"feedback_tab_description_label": "Τα σχόλιά σας",
|
||||
"feedback_tab_h4": "Υποβάλετε σχόλια",
|
||||
"feedback_tab_send_logs_label": "Να συμπεριληφθούν αρχεία καταγραφής",
|
||||
"feedback_tab_thank_you": "Ευχαριστούμε, λάβαμε τα σχόλιά σας!",
|
||||
"feedback_tab_title": "Ανατροφοδότηση",
|
||||
"more_tab_title": "Περισσότερα",
|
||||
"opt_in_description": "<0></0><1></1>Μπορείτε να ανακαλέσετε τη συγκατάθεσή σας αποεπιλέγοντας αυτό το πλαίσιο. Εάν βρίσκεστε σε κλήση, η ρύθμιση αυτή θα τεθεί σε ισχύ στο τέλος της.",
|
||||
"show_connection_stats_label": "Εμφάνιση στατιστικών σύνδεσης",
|
||||
"speaker_device_selection_label": "Ηχείο"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} αστέρι",
|
||||
"star_rating_input_label_other": "{{count}} αστέρια",
|
||||
"submitting": "Υποβολή…",
|
||||
"unauthenticated_view_body": "Δεν έχετε εγγραφεί ακόμα; <2>Δημιουργήστε λογαριασμό</2>",
|
||||
"unauthenticated_view_login_button": "Συνδεθείτε στον λογαριασμό σας",
|
||||
"version": "Έκδοση: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} παρουσιάζει"
|
||||
},
|
||||
"waiting_for_participants": "Αναμονή για άλλους συμμετέχοντες…"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,153 @@
|
||||
{
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"{{count}} stars|one": "{{count}} stars",
|
||||
"{{count}} stars|other": "{{count}} stars",
|
||||
"{{displayName}} is presenting": "{{displayName}} is presenting",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, your call has ended.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Create an account</0> Or <2>Access as a guest</2>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Oops, something's gone wrong.</0>",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Submitting debug logs will help us track down the problem.</0>",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Thanks for your feedback!</0>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>We'd love to hear your feedback so we can improve your experience.</0>",
|
||||
"<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>": "<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>",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.",
|
||||
"Audio": "Audio",
|
||||
"Avatar": "Avatar",
|
||||
"Back to recents": "Back to recents",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>",
|
||||
"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 <5>Cookie Policy</5>.": "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 <5>Cookie Policy</5>.",
|
||||
"Call not found": "Call not found",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.",
|
||||
"Camera": "Camera",
|
||||
"Close": "Close",
|
||||
"Confirm password": "Confirm password",
|
||||
"Connectivity to the server has been lost.": "Connectivity to the server has been lost.",
|
||||
"Continue in browser": "Continue in browser",
|
||||
"Copied!": "Copied!",
|
||||
"Copy": "Copy",
|
||||
"Copy link": "Copy link",
|
||||
"Create account": "Create account",
|
||||
"Debug log request": "Debug log request",
|
||||
"Developer": "Developer",
|
||||
"Developer Settings": "Developer Settings",
|
||||
"Display name": "Display name",
|
||||
"Element Call Home": "Element Call Home",
|
||||
"Encrypted": "Encrypted",
|
||||
"End call": "End call",
|
||||
"Exit full screen": "Exit full screen",
|
||||
"Expose developer settings in the settings window.": "Expose developer settings in the settings window.",
|
||||
"Feedback": "Feedback",
|
||||
"Full screen": "Full screen",
|
||||
"Go": "Go",
|
||||
"Grid": "Grid",
|
||||
"Home": "Home",
|
||||
"How did it go?": "How did it go?",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.",
|
||||
"Include debug logs": "Include debug logs",
|
||||
"Invite": "Invite",
|
||||
"Invite to this call": "Invite to this call",
|
||||
"Join call": "Join call",
|
||||
"Join call now": "Join call now",
|
||||
"Join existing call?": "Join existing call?",
|
||||
"Link copied to clipboard": "Link copied to clipboard",
|
||||
"Loading…": "Loading…",
|
||||
"Local volume": "Local volume",
|
||||
"Logging in…": "Logging in…",
|
||||
"Login": "Login",
|
||||
"Login to your account": "Login to your account",
|
||||
"Microphone": "Microphone",
|
||||
"Microphone off": "Microphone off",
|
||||
"Microphone on": "Microphone on",
|
||||
"More": "More",
|
||||
"Mute microphone": "Mute microphone",
|
||||
"Name of call": "Name of call",
|
||||
"No": "No",
|
||||
"Not encrypted": "Not encrypted",
|
||||
"Not now, return to home screen": "Not now, return to home screen",
|
||||
"Not registered yet? <2>Create an account</2>": "Not registered yet? <2>Create an account</2>",
|
||||
"Open in the app": "Open in the app",
|
||||
"Participants": "Participants",
|
||||
"Password": "Password",
|
||||
"Passwords must match": "Passwords must match",
|
||||
"Profile": "Profile",
|
||||
"Ready to join?": "Ready to join?",
|
||||
"Recaptcha dismissed": "Recaptcha dismissed",
|
||||
"Recaptcha not loaded": "Recaptcha not loaded",
|
||||
"Reconnect": "Reconnect",
|
||||
"Register": "Register",
|
||||
"Registering…": "Registering…",
|
||||
"Remove": "Remove",
|
||||
"Retry sending logs": "Retry sending logs",
|
||||
"Return to home screen": "Return to home screen",
|
||||
"Select an option": "Select an option",
|
||||
"Select app": "Select app",
|
||||
"Send debug logs": "Send debug logs",
|
||||
"Sending debug logs…": "Sending debug logs…",
|
||||
"Sending…": "Sending…",
|
||||
"Settings": "Settings",
|
||||
"Share screen": "Share screen",
|
||||
"Sharing screen": "Sharing screen",
|
||||
"Show connection stats": "Show connection stats",
|
||||
"Sign in": "Sign in",
|
||||
"Sign out": "Sign out",
|
||||
"Speaker": "Speaker",
|
||||
"Spotlight": "Spotlight",
|
||||
"Start new call": "Start new call",
|
||||
"Start video": "Start video",
|
||||
"Stop video": "Stop video",
|
||||
"Submit": "Submit",
|
||||
"Submit feedback": "Submit feedback",
|
||||
"Submitting…": "Submitting…",
|
||||
"Thanks, we received your feedback!": "Thanks, we received your feedback!",
|
||||
"Thanks!": "Thanks!",
|
||||
"This call already exists, would you like to join?": "This call already exists, would you like to join?",
|
||||
"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>": "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>",
|
||||
"Unmute microphone": "Unmute microphone",
|
||||
"User menu": "User menu",
|
||||
"Username": "Username",
|
||||
"Version: {{version}}": "Version: {{version}}",
|
||||
"Video": "Video",
|
||||
"Waiting for other participants…": "Waiting for other participants…",
|
||||
"Yes, join call": "Yes, join call",
|
||||
"You": "You",
|
||||
"You were disconnected from the call": "You were disconnected from the call",
|
||||
"Your feedback": "Your feedback",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117"
|
||||
"a11y": {
|
||||
"user_menu": "User menu"
|
||||
},
|
||||
"action": {
|
||||
"close": "Close",
|
||||
"copy": "Copy",
|
||||
"copy_link": "Copy link",
|
||||
"go": "Go",
|
||||
"invite": "Invite",
|
||||
"no": "No",
|
||||
"register": "Register",
|
||||
"remove": "Remove",
|
||||
"sign_in": "Sign in",
|
||||
"sign_out": "Sign out",
|
||||
"submit": "Submit"
|
||||
},
|
||||
"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 <5>Cookie Policy</5>.",
|
||||
"app_selection_modal": {
|
||||
"continue_in_browser": "Continue in browser",
|
||||
"open_in_app": "Open in the app",
|
||||
"text": "Ready to join?",
|
||||
"title": "Select app"
|
||||
},
|
||||
"application_opened_another_tab": "This application has been opened in another tab.",
|
||||
"browser_media_e2ee_unsupported": "Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117",
|
||||
"browser_media_e2ee_unsupported_heading": "Incompatible Browser",
|
||||
"call_ended_view": {
|
||||
"body": "You were disconnected from the call",
|
||||
"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>",
|
||||
"feedback_done": "<0>Thanks for your feedback!</0>",
|
||||
"feedback_prompt": "<0>We'd love to hear your feedback so we can improve your experience.</0>",
|
||||
"headline": "{{displayName}}, your call has ended.",
|
||||
"not_now_button": "Not now, return to home screen",
|
||||
"reconnect_button": "Reconnect",
|
||||
"survey_prompt": "How did it go?"
|
||||
},
|
||||
"call_name": "Name of call",
|
||||
"common": {
|
||||
"analytics": "Analytics",
|
||||
"audio": "Audio",
|
||||
"avatar": "Avatar",
|
||||
"camera": "Camera",
|
||||
"copied": "Copied!",
|
||||
"display_name": "Display name",
|
||||
"encrypted": "Encrypted",
|
||||
"error": "Error",
|
||||
"home": "Home",
|
||||
"loading": "Loading…",
|
||||
"microphone": "Microphone",
|
||||
"options": "Options",
|
||||
"password": "Password",
|
||||
"profile": "Profile",
|
||||
"settings": "Settings",
|
||||
"unencrypted": "Not encrypted",
|
||||
"username": "Username",
|
||||
"video": "Video"
|
||||
},
|
||||
"disconnected_banner": "Connectivity to the server has been lost.",
|
||||
"full_screen_view_description": "<0>Submitting debug logs will help us track down the problem.</0>",
|
||||
"full_screen_view_h1": "<0>Oops, something's gone wrong.</0>",
|
||||
"group_call_loader_failed_heading": "Call not found",
|
||||
"group_call_loader_failed_text": "Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.",
|
||||
"hangup_button_label": "End call",
|
||||
"header_label": "Element Call Home",
|
||||
"header_participants_label": "Participants",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Link copied to clipboard",
|
||||
"title": "Invite to this call"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Yes, join call",
|
||||
"text": "This call already exists, would you like to join?",
|
||||
"title": "Join existing call?"
|
||||
},
|
||||
"layout_grid_label": "Grid",
|
||||
"layout_spotlight_label": "Spotlight",
|
||||
"lobby": {
|
||||
"join_button": "Join call",
|
||||
"leave_button": "Back to recents"
|
||||
},
|
||||
"log_in": "Log In",
|
||||
"logging_in": "Logging in…",
|
||||
"login_auth_links": "<0>Create an account</0> Or <2>Access as a guest</2>",
|
||||
"login_auth_links_prompt": "Not registered yet?",
|
||||
"login_subheading": "To continue to Element",
|
||||
"login_title": "Login",
|
||||
"microphone_off": "Microphone off",
|
||||
"microphone_on": "Microphone on",
|
||||
"mute_microphone_button_label": "Mute microphone",
|
||||
"participant_count_one": "{{count, number}}",
|
||||
"participant_count_other": "{{count, number}}",
|
||||
"rageshake_button_error_caption": "Retry sending logs",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.",
|
||||
"title": "Debug log request"
|
||||
},
|
||||
"rageshake_send_logs": "Send debug logs",
|
||||
"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",
|
||||
"register": {
|
||||
"passwords_must_match": "Passwords must match",
|
||||
"registering": "Registering…"
|
||||
},
|
||||
"register_auth_links": "<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>",
|
||||
"register_confirm_password_label": "Confirm password",
|
||||
"register_heading": "Create your account",
|
||||
"return_home_button": "Return to home screen",
|
||||
"room_auth_view_eula_caption": "By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>",
|
||||
"room_auth_view_join_button": "Join call now",
|
||||
"screenshare_button_label": "Share screen",
|
||||
"select_input_unset_button": "Select an option",
|
||||
"settings": {
|
||||
"developer_settings_label": "Developer Settings",
|
||||
"developer_settings_label_description": "Expose developer settings in the settings window.",
|
||||
"developer_tab_title": "Developer",
|
||||
"feedback_tab_body": "If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.",
|
||||
"feedback_tab_description_label": "Your feedback",
|
||||
"feedback_tab_h4": "Submit feedback",
|
||||
"feedback_tab_send_logs_label": "Include debug logs",
|
||||
"feedback_tab_thank_you": "Thanks, we received your feedback!",
|
||||
"feedback_tab_title": "Feedback",
|
||||
"more_tab_title": "More",
|
||||
"opt_in_description": "<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.",
|
||||
"show_connection_stats_label": "Show connection stats",
|
||||
"speaker_device_selection_label": "Speaker"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} stars",
|
||||
"star_rating_input_label_other": "{{count}} stars",
|
||||
"start_new_call": "Start new call",
|
||||
"start_video_button_label": "Start video",
|
||||
"stop_screenshare_button_label": "Sharing screen",
|
||||
"stop_video_button_label": "Stop video",
|
||||
"submitting": "Submitting…",
|
||||
"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",
|
||||
"unmute_microphone_button_label": "Unmute microphone",
|
||||
"version": "Version: {{version}}",
|
||||
"video_tile": {
|
||||
"exit_full_screen": "Exit full screen",
|
||||
"full_screen": "Full screen",
|
||||
"mute_for_me": "Mute for me",
|
||||
"sfu_participant_local": "You",
|
||||
"volume": "Volume"
|
||||
},
|
||||
"waiting_for_participants": "Waiting for other participants…"
|
||||
}
|
||||
|
||||
@@ -1,86 +1,102 @@
|
||||
{
|
||||
"<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>": "<0>¿Por qué no mantienes tu cuenta estableciendo una contraseña?</0><1>Podrás mantener tu nombre y establecer un avatar para usarlo en futuras llamadas</1>",
|
||||
"This call already exists, would you like to join?": "Esta llamada ya existe, ¿te gustaría unirte?",
|
||||
"Register": "Registrarse",
|
||||
"Not registered yet? <2>Create an account</2>": "¿No estás registrado todavía? <2>Crear una cuenta</2>",
|
||||
"Login to your account": "Iniciar sesión en tu cuenta",
|
||||
"Yes, join call": "Si, unirse a la llamada",
|
||||
"Waiting for other participants…": "Esperando a los otros participantes…",
|
||||
"Video": "Video",
|
||||
"Version: {{version}}": "Versión: {{version}}",
|
||||
"Username": "Nombre de usuario",
|
||||
"User menu": "Menú de usuario",
|
||||
"Submit feedback": "Enviar comentarios",
|
||||
"Spotlight": "Foco",
|
||||
"Speaker": "Altavoz",
|
||||
"Sign out": "Cerrar sesión",
|
||||
"Sign in": "Iniciar sesión",
|
||||
"Share screen": "Compartir pantalla",
|
||||
"Settings": "Ajustes",
|
||||
"Sending…": "Enviando…",
|
||||
"Sending debug logs…": "Enviando registros de depuración…",
|
||||
"Send debug logs": "Enviar registros de depuración",
|
||||
"Select an option": "Selecciona una opción",
|
||||
"Return to home screen": "Volver a la pantalla de inicio",
|
||||
"Remove": "Eliminar",
|
||||
"Registering…": "Registrando…",
|
||||
"Recaptcha not loaded": "No se ha cargado el Recaptcha",
|
||||
"Recaptcha dismissed": "Recaptcha cancelado",
|
||||
"Profile": "Perfil",
|
||||
"Passwords must match": "Las contraseñas deben coincidir",
|
||||
"Password": "Contraseña",
|
||||
"Not now, return to home screen": "Ahora no, volver a la pantalla de inicio",
|
||||
"No": "No",
|
||||
"More": "Más",
|
||||
"Microphone": "Micrófono",
|
||||
"Login": "Iniciar sesión",
|
||||
"Logging in…": "Iniciando sesión…",
|
||||
"Local volume": "Volumen local",
|
||||
"Loading…": "Cargando…",
|
||||
"Join existing call?": "¿Unirse a llamada existente?",
|
||||
"Join call now": "Unirse a la llamada ahora",
|
||||
"Join call": "Unirse a la llamada",
|
||||
"Include debug logs": "Incluir registros de depuración",
|
||||
"Home": "Inicio",
|
||||
"Go": "Comenzar",
|
||||
"Full screen": "Pantalla completa",
|
||||
"Exit full screen": "Salir de pantalla completa",
|
||||
"Display name": "Nombre a mostrar",
|
||||
"Developer": "Desarrollador",
|
||||
"Debug log request": "Petición de registros de depuración",
|
||||
"Create account": "Crear cuenta",
|
||||
"Copied!": "¡Copiado!",
|
||||
"Confirm password": "Confirmar contraseña",
|
||||
"Close": "Cerrar",
|
||||
"Camera": "Cámara",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Otro usuario en esta llamada está teniendo problemas. Para diagnosticar estos problemas nos gustaría recopilar un registro de depuración.",
|
||||
"Audio": "Audio",
|
||||
"Avatar": "Avatar",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Crear una cuenta</0> o <2>Acceder como invitado</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>¿Ya tienes una cuenta?</0><1><0>Iniciar sesión</0> o <2>Acceder como invitado</2></1>",
|
||||
"Element Call Home": "Inicio de Element Call",
|
||||
"Copy": "Copiar",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Subir los registros de depuración nos ayudará a encontrar el problema.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Ups, algo ha salido mal.</0>",
|
||||
"Expose developer settings in the settings window.": "Muestra los ajustes de desarrollador en la ventana de ajustes.",
|
||||
"Developer Settings": "Ajustes de desarrollador",
|
||||
"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 <5>Cookie Policy</5>.": "Al participar en esta beta, consientes a la recogida de datos anónimos, los cuales usaremos para mejorar el producto. Puedes encontrar más información sobre que datos recogemos en nuestra <2>Política de privacidad</2> y en nuestra <5>Política sobre Cookies</5>.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>Puedes retirar tu consentimiento desmarcando esta casilla. Si estás en una llamada, este ajuste se aplicará al final de esta.",
|
||||
"{{displayName}} is presenting": "{{displayName}} está presentando",
|
||||
"<0>Thanks for your feedback!</0>": "<0>¡Gracias por tus comentarios!</0>",
|
||||
"How did it go?": "¿Cómo ha ido?",
|
||||
"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>": "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>",
|
||||
"Show connection stats": "Mostrar estadísticas de conexión",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Al hacer clic en \"Comenzar\", aceptas nuestro <2>Contrato de Licencia de Usuario Final (CLUF)</2>",
|
||||
"Thanks, we received your feedback!": "¡Gracias, hemos recibido tus comentarios!",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Si tienes algún problema o simplemente quieres darnos tu opinión, por favor envíanos una breve descripción.",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Al hacer clic en \"Unirse a la llamada ahora\", aceptas nuestro <2>Contrato de Licencia de Usuario Final (CLUF)</2>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Nos encantaría conocer tu opinión para que podamos mejorar tu experiencia</0>",
|
||||
"Feedback": "Danos tu opinión",
|
||||
"Submit": "Enviar",
|
||||
"{{count}} stars|one": "{{count}} estrella",
|
||||
"{{count}} stars|other": "{{count}} estrellas",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, tu llamada ha finalizado.",
|
||||
"Submitting…": "Enviando…",
|
||||
"Your feedback": "Tus comentarios"
|
||||
"a11y": {
|
||||
"user_menu": "Menú de usuario"
|
||||
},
|
||||
"action": {
|
||||
"close": "Cerrar",
|
||||
"copy": "Copiar",
|
||||
"go": "Comenzar",
|
||||
"register": "Registrarse",
|
||||
"remove": "Eliminar",
|
||||
"sign_in": "Iniciar sesión",
|
||||
"sign_out": "Cerrar sesión",
|
||||
"submit": "Enviar"
|
||||
},
|
||||
"analytics_notice": "Al participar en esta beta, consientes a la recogida de datos anónimos, los cuales usaremos para mejorar el producto. Puedes encontrar más información sobre que datos recogemos en nuestra <2>Política de privacidad</2> y en nuestra <5>Política sobre Cookies</5>.",
|
||||
"call_ended_view": {
|
||||
"create_account_button": "Crear cuenta",
|
||||
"create_account_prompt": "<0>¿Por qué no mantienes tu cuenta estableciendo una contraseña?</0><1>Podrás mantener tu nombre y establecer un avatar para usarlo en futuras llamadas</1>",
|
||||
"feedback_done": "<0>¡Gracias por tus comentarios!</0>",
|
||||
"feedback_prompt": "<0>Nos encantaría conocer tu opinión para que podamos mejorar tu experiencia</0>",
|
||||
"headline": "{{displayName}}, tu llamada ha finalizado.",
|
||||
"not_now_button": "Ahora no, volver a la pantalla de inicio",
|
||||
"survey_prompt": "¿Cómo ha ido?"
|
||||
},
|
||||
"common": {
|
||||
"camera": "Cámara",
|
||||
"copied": "¡Copiado!",
|
||||
"display_name": "Nombre a mostrar",
|
||||
"home": "Inicio",
|
||||
"loading": "Cargando…",
|
||||
"microphone": "Micrófono",
|
||||
"password": "Contraseña",
|
||||
"profile": "Perfil",
|
||||
"settings": "Ajustes",
|
||||
"username": "Nombre de usuario"
|
||||
},
|
||||
"exit_fullscreen_button_label": "Salir de pantalla completa",
|
||||
"full_screen_view_description": "<0>Subir los registros de depuración nos ayudará a encontrar el problema.</0>",
|
||||
"full_screen_view_h1": "<0>Ups, algo ha salido mal.</0>",
|
||||
"fullscreen_button_label": "Pantalla completa",
|
||||
"header_label": "Inicio de Element Call",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Si, unirse a la llamada",
|
||||
"text": "Esta llamada ya existe, ¿te gustaría unirte?",
|
||||
"title": "¿Unirse a llamada existente?"
|
||||
},
|
||||
"layout_spotlight_label": "Foco",
|
||||
"lobby": {
|
||||
"join_button": "Unirse a la llamada"
|
||||
},
|
||||
"local_volume_label": "Volumen local",
|
||||
"logging_in": "Iniciando sesión…",
|
||||
"login_auth_links": "<0>Crear una cuenta</0> o <2>Acceder como invitado</2>",
|
||||
"login_title": "Iniciar sesión",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Otro usuario en esta llamada está teniendo problemas. Para diagnosticar estos problemas nos gustaría recopilar un registro de depuración.",
|
||||
"title": "Petición de registros de depuración"
|
||||
},
|
||||
"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": {
|
||||
"passwords_must_match": "Las contraseñas deben coincidir",
|
||||
"registering": "Registrando…"
|
||||
},
|
||||
"register_auth_links": "<0>¿Ya tienes una cuenta?</0><1><0>Iniciar sesión</0> o <2>Acceder como invitado</2></1>",
|
||||
"register_confirm_password_label": "Confirmar contraseña",
|
||||
"return_home_button": "Volver a la pantalla de inicio",
|
||||
"room_auth_view_eula_caption": "Al hacer clic en \"Unirse a la llamada ahora\", aceptas nuestro <2>Contrato de Licencia de Usuario Final (CLUF)</2>",
|
||||
"room_auth_view_join_button": "Unirse a la llamada ahora",
|
||||
"screenshare_button_label": "Compartir pantalla",
|
||||
"select_input_unset_button": "Selecciona una opción",
|
||||
"settings": {
|
||||
"developer_settings_label": "Ajustes de desarrollador",
|
||||
"developer_settings_label_description": "Muestra los ajustes de desarrollador en la ventana de ajustes.",
|
||||
"developer_tab_title": "Desarrollador",
|
||||
"feedback_tab_body": "Si tienes algún problema o simplemente quieres darnos tu opinión, por favor envíanos una breve descripción.",
|
||||
"feedback_tab_description_label": "Tus comentarios",
|
||||
"feedback_tab_h4": "Enviar comentarios",
|
||||
"feedback_tab_send_logs_label": "Incluir registros de depuración",
|
||||
"feedback_tab_thank_you": "¡Gracias, hemos recibido tus comentarios!",
|
||||
"feedback_tab_title": "Danos tu opinión",
|
||||
"more_tab_title": "Más",
|
||||
"opt_in_description": "<0></0><1></1>Puedes retirar tu consentimiento desmarcando esta casilla. Si estás en una llamada, este ajuste se aplicará al final de esta.",
|
||||
"show_connection_stats_label": "Mostrar estadísticas de conexión",
|
||||
"speaker_device_selection_label": "Altavoz"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} estrella",
|
||||
"star_rating_input_label_other": "{{count}} estrellas",
|
||||
"submitting": "Enviando…",
|
||||
"unauthenticated_view_body": "¿No estás registrado todavía? <2>Crear una cuenta</2>",
|
||||
"unauthenticated_view_eula_caption": "Al hacer clic en \"Comenzar\", aceptas nuestro <2>Contrato de Licencia de Usuario Final (CLUF)</2>",
|
||||
"unauthenticated_view_login_button": "Iniciar sesión en tu cuenta",
|
||||
"version": "Versión: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} está presentando"
|
||||
},
|
||||
"waiting_for_participants": "Esperando a los otros participantes…"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,140 @@
|
||||
{
|
||||
"<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>": "<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>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Loo konto</0> Või <2>Sisene külalisena</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>On sul juba konto?</0><1><0>Logi sisse</0> Või <2>Logi sisse külalisena</2></1>",
|
||||
"Include debug logs": "Lisa veatuvastuslogid",
|
||||
"Home": "Avavaatesse",
|
||||
"Go": "Jätka",
|
||||
"Full screen": "Täisekraan",
|
||||
"Exit full screen": "Välju täisekraanivaatest",
|
||||
"Display name": "Kuvatav nimi",
|
||||
"Developer": "Arendaja",
|
||||
"Debug log request": "Veaotsingulogi päring",
|
||||
"Create account": "Loo konto",
|
||||
"Copied!": "Kopeeritud!",
|
||||
"Confirm password": "Kinnita salasõna",
|
||||
"Close": "Sulge",
|
||||
"Camera": "Kaamera",
|
||||
"Avatar": "Tunnuspilt",
|
||||
"Audio": "Heli",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Ühel teisel selles kõnes osalejal on lahenduse kasutamisel tekkinud probleem ning selle põhjuse leidmiseks me sooviksime koguda silumislogisid.",
|
||||
"Passwords must match": "Salasõnad ei klapi",
|
||||
"Password": "Salasõna",
|
||||
"Not registered yet? <2>Create an account</2>": "Sa pole veel registreerunud? <2>Loo kasutajakonto</2>",
|
||||
"Not now, return to home screen": "Mitte praegu, mine tagasi avalehele",
|
||||
"No": "Ei",
|
||||
"More": "Rohkem",
|
||||
"Microphone": "Mikrofon",
|
||||
"Login to your account": "Logi oma kontosse sisse",
|
||||
"Login": "Sisselogimine",
|
||||
"Logging in…": "Sisselogimine …",
|
||||
"Local volume": "Kohalik helitugevus",
|
||||
"Loading…": "Laadimine …",
|
||||
"Join existing call?": "Liitu juba käimasoleva kõnega?",
|
||||
"Join call now": "Liitu kõnega kohe",
|
||||
"Join call": "Kõnega liitumine",
|
||||
"Submit feedback": "Jaga tagasisidet",
|
||||
"Spotlight": "Rambivalgus",
|
||||
"Speaker": "Kõlar",
|
||||
"Sign out": "Logi välja",
|
||||
"Sign in": "Logi sisse",
|
||||
"Share screen": "Jaga ekraani",
|
||||
"Settings": "Seadistused",
|
||||
"Sending…": "Saatmine…",
|
||||
"Sending debug logs…": "Veaotsingulogide saatmine…",
|
||||
"Send debug logs": "Saada veaotsingulogid",
|
||||
"Select an option": "Vali oma eelistus",
|
||||
"Return to home screen": "Tagasi avalehele",
|
||||
"Remove": "Eemalda",
|
||||
"Registering…": "Registreerimine…",
|
||||
"Register": "Registreeru",
|
||||
"Recaptcha not loaded": "Robotilõks pole laetud",
|
||||
"Recaptcha dismissed": "Robotilõks on vahele jäetud",
|
||||
"Profile": "Profiil",
|
||||
"Waiting for other participants…": "Ootame teiste osalejate lisandumist…",
|
||||
"Video": "Video",
|
||||
"Version: {{version}}": "Versioon: {{version}}",
|
||||
"Username": "Kasutajanimi",
|
||||
"This call already exists, would you like to join?": "See kõne on juba olemas, kas soovid liituda?",
|
||||
"User menu": "Kasutajamenüü",
|
||||
"Yes, join call": "Jah, liitu kõnega",
|
||||
"Element Call Home": "Element Call Home",
|
||||
"Copy": "Kopeeri",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Kui saadad meile vealogid, siis on lihtsam vea põhjust otsida.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Ohoo, midagi on nüüd katki.</0>",
|
||||
"Expose developer settings in the settings window.": "Näita seadistuste aknas arendajale vajalikke seadeid.",
|
||||
"Developer Settings": "Arendaja seadistused",
|
||||
"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 <5>Cookie Policy</5>.": "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>.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<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.",
|
||||
"Your feedback": "Sinu tagasiside",
|
||||
"Thanks, we received your feedback!": "Tänud, me oleme sinu tagasiside kätte saanud!",
|
||||
"Submitting…": "Saadan…",
|
||||
"Submit": "Saada",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Kui selle rakenduse kasutamisel tekib sul probleeme või lihtsalt soovid oma arvamust avaldada, siis palun täida alljärgnev lühike kirjeldus.",
|
||||
"Feedback": "Tagasiside",
|
||||
"{{count}} stars|one": "{{count}} tärni",
|
||||
"{{count}} stars|other": "{{count}} tärni",
|
||||
"How did it go?": "Kuidas sujus?",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, sinu kõne on lõppenud.",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Täname Sind tagasiside eest!</0>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Meie rakenduse paremaks muutmiseks me hea meelega ootame Sinu arvamusi.</0>",
|
||||
"Show connection stats": "Näita ühenduse statistikat",
|
||||
"{{displayName}} is presenting": "{{displayName}} on esitlemas",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Klõpsides „Jätka“, nõustud sa meie <2>Lõppkasutaja litsentsilepinguga (EULA)</2>",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Klõpsides „Liitu kõnega kohe“, nõustud sa meie <2>Lõppkasutaja litsentsilepinguga (EULA)</2>",
|
||||
"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>": "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>",
|
||||
"Connectivity to the server has been lost.": "Võrguühendus serveriga on katkenud.",
|
||||
"Retry sending logs": "Proovi uuesti logisid saata",
|
||||
"You were disconnected from the call": "Sinu ühendus kõnega katkes",
|
||||
"Reconnect": "Ühenda uuesti",
|
||||
"Thanks!": "Tänud!",
|
||||
"Encrypted": "Krüptitud",
|
||||
"End call": "Lõpeta kõne",
|
||||
"Grid": "Ruudustik",
|
||||
"Microphone off": "Mikrofon ei tööta",
|
||||
"Microphone on": "Mikrofon töötab",
|
||||
"Not encrypted": "Krüptimata",
|
||||
"Sharing screen": "Ekraanivaade on jagamisel",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"You": "Sina",
|
||||
"Continue in browser": "Jätka veebibrauseris",
|
||||
"Mute microphone": "Summuta mikrofon",
|
||||
"Name of call": "Kõne nimi",
|
||||
"Open in the app": "Ava rakenduses",
|
||||
"Ready to join?": "Oled valmis liituma?",
|
||||
"Select app": "Vali rakendus",
|
||||
"Start new call": "Algata uus kõne",
|
||||
"Back to recents": "Tagasi hiljutiste kõnede juurde",
|
||||
"Stop video": "Peata videovoog",
|
||||
"Start video": "Lülita videovoog sisse",
|
||||
"Unmute microphone": "Lülita mikrofon sisse",
|
||||
"Call not found": "Kõnet ei leidu",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Kõned on nüüd läbivalt krüptitud ning need pead looma kodulehelt. Sellega tagad, et kõik kasutavad samu krüptovõtmeid.",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Sinu veebibrauser ei toeta meedia läbivat krüptimist. Toetatud brauserid on Chrome, Chromium, Safari ja Firefox >=117",
|
||||
"Invite": "Kutsu",
|
||||
"Link copied to clipboard": "Link on kopeeritud lõikelauale",
|
||||
"Participants": "Osalejad",
|
||||
"Copy link": "Kopeeri link",
|
||||
"Invite to this call": "Kutsu liituma selle kõnaga"
|
||||
"a11y": {
|
||||
"user_menu": "Kasutajamenüü"
|
||||
},
|
||||
"action": {
|
||||
"close": "Sulge",
|
||||
"copy": "Kopeeri",
|
||||
"copy_link": "Kopeeri link",
|
||||
"go": "Jätka",
|
||||
"invite": "Kutsu",
|
||||
"no": "Ei",
|
||||
"register": "Registreeru",
|
||||
"remove": "Eemalda",
|
||||
"sign_in": "Logi sisse",
|
||||
"sign_out": "Logi välja",
|
||||
"submit": "Saada"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "Sinu veebibrauser ei toeta meedia läbivat krüptimist. Toetatud brauserid on Chrome, Chromium, Safari ja Firefox >=117",
|
||||
"call_ended_view": {
|
||||
"body": "Sinu ühendus kõnega katkes",
|
||||
"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>",
|
||||
"feedback_done": "<0>Täname Sind tagasiside eest!</0>",
|
||||
"feedback_prompt": "<0>Meie rakenduse paremaks muutmiseks me hea meelega ootame Sinu arvamusi.</0>",
|
||||
"headline": "{{displayName}}, sinu kõne on lõppenud.",
|
||||
"not_now_button": "Mitte praegu, mine tagasi avalehele",
|
||||
"reconnect_button": "Ühenda uuesti",
|
||||
"survey_prompt": "Kuidas sujus?"
|
||||
},
|
||||
"call_name": "Kõne nimi",
|
||||
"common": {
|
||||
"audio": "Heli",
|
||||
"avatar": "Tunnuspilt",
|
||||
"camera": "Kaamera",
|
||||
"copied": "Kopeeritud!",
|
||||
"display_name": "Kuvatav nimi",
|
||||
"encrypted": "Krüptitud",
|
||||
"home": "Avavaatesse",
|
||||
"loading": "Laadimine …",
|
||||
"microphone": "Mikrofon",
|
||||
"password": "Salasõna",
|
||||
"profile": "Profiil",
|
||||
"settings": "Seadistused",
|
||||
"unencrypted": "Krüptimata",
|
||||
"username": "Kasutajanimi"
|
||||
},
|
||||
"disconnected_banner": "Võrguühendus serveriga on katkenud.",
|
||||
"exit_fullscreen_button_label": "Välju täisekraanivaatest",
|
||||
"full_screen_view_description": "<0>Kui saadad meile vealogid, siis on lihtsam vea põhjust otsida.</0>",
|
||||
"full_screen_view_h1": "<0>Ohoo, midagi on nüüd katki.</0>",
|
||||
"fullscreen_button_label": "Täisekraan",
|
||||
"group_call_loader_failed_heading": "Kõnet ei leidu",
|
||||
"group_call_loader_failed_text": "Kõned on nüüd läbivalt krüptitud ning need pead looma kodulehelt. Sellega tagad, et kõik kasutavad samu krüptovõtmeid.",
|
||||
"hangup_button_label": "Lõpeta kõne",
|
||||
"header_participants_label": "Osalejad",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Link on kopeeritud lõikelauale",
|
||||
"title": "Kutsu liituma selle kõnaga"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Jah, liitu kõnega",
|
||||
"text": "See kõne on juba olemas, kas soovid liituda?",
|
||||
"title": "Liitu juba käimasoleva kõnega?"
|
||||
},
|
||||
"layout_grid_label": "Ruudustik",
|
||||
"layout_spotlight_label": "Rambivalgus",
|
||||
"lobby": {
|
||||
"join_button": "Kõnega liitumine",
|
||||
"leave_button": "Tagasi hiljutiste kõnede juurde"
|
||||
},
|
||||
"local_volume_label": "Kohalik helitugevus",
|
||||
"logging_in": "Sisselogimine …",
|
||||
"login_auth_links": "<0>Loo konto</0> Või <2>Sisene külalisena</2>",
|
||||
"login_title": "Sisselogimine",
|
||||
"microphone_off": "Mikrofon ei tööta",
|
||||
"microphone_on": "Mikrofon töötab",
|
||||
"mute_microphone_button_label": "Summuta mikrofon",
|
||||
"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.",
|
||||
"title": "Veaotsingulogi päring"
|
||||
},
|
||||
"rageshake_send_logs": "Saada veaotsingulogid",
|
||||
"rageshake_sending": "Saatmine…",
|
||||
"rageshake_sending_logs": "Veaotsingulogide saatmine…",
|
||||
"rageshake_sent": "Tänud!",
|
||||
"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",
|
||||
"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_confirm_password_label": "Kinnita salasõna",
|
||||
"return_home_button": "Tagasi avalehele",
|
||||
"room_auth_view_eula_caption": "Klõpsides „Liitu kõnega kohe“, nõustud sa meie <2>Lõppkasutaja litsentsilepinguga (EULA)</2>",
|
||||
"room_auth_view_join_button": "Liitu kõnega kohe",
|
||||
"screenshare_button_label": "Jaga ekraani",
|
||||
"select_input_unset_button": "Vali oma eelistus",
|
||||
"settings": {
|
||||
"developer_settings_label": "Arendaja seadistused",
|
||||
"developer_settings_label_description": "Näita seadistuste aknas arendajale vajalikke seadeid.",
|
||||
"developer_tab_title": "Arendaja",
|
||||
"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_description_label": "Sinu tagasiside",
|
||||
"feedback_tab_h4": "Jaga tagasisidet",
|
||||
"feedback_tab_send_logs_label": "Lisa veatuvastuslogid",
|
||||
"feedback_tab_thank_you": "Tänud, me oleme sinu tagasiside kätte saanud!",
|
||||
"feedback_tab_title": "Tagasiside",
|
||||
"more_tab_title": "Rohkem",
|
||||
"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.",
|
||||
"show_connection_stats_label": "Näita ühenduse statistikat",
|
||||
"speaker_device_selection_label": "Kõlar"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} tärni",
|
||||
"star_rating_input_label_other": "{{count}} tärni",
|
||||
"start_new_call": "Algata uus kõne",
|
||||
"start_video_button_label": "Lülita videovoog sisse",
|
||||
"stop_screenshare_button_label": "Ekraanivaade on jagamisel",
|
||||
"stop_video_button_label": "Peata videovoog",
|
||||
"submitting": "Saadan…",
|
||||
"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",
|
||||
"unmute_microphone_button_label": "Lülita mikrofon sisse",
|
||||
"version": "Versioon: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} on esitlemas",
|
||||
"sfu_participant_local": "Sina"
|
||||
},
|
||||
"waiting_for_participants": "Ootame teiste osalejate lisandumist…"
|
||||
}
|
||||
|
||||
@@ -1,63 +1,81 @@
|
||||
{
|
||||
"Video": "ویدیو",
|
||||
"Username": "نام کاربری",
|
||||
"Speaker": "بلندگو",
|
||||
"Sign out": "خروج",
|
||||
"Sign in": "ورود",
|
||||
"Settings": "تنظیمات",
|
||||
"Profile": "پروفایل",
|
||||
"Password": "رمز عبور",
|
||||
"No": "خیر",
|
||||
"More": "بیشتر",
|
||||
"Microphone": "میکروفون",
|
||||
"Login to your account": "به حساب کاربری خود وارد شوید",
|
||||
"Login": "ورود",
|
||||
"Loading…": "بارگزاری…",
|
||||
"Join existing call?": "پیوست به تماس؟",
|
||||
"Join call now": "الان به تماس بپیوند",
|
||||
"Join call": "پیوستن به تماس",
|
||||
"Home": "خانه",
|
||||
"Go": "رفتن",
|
||||
"Full screen": "تمام صحفه",
|
||||
"Exit full screen": "خروج از حالت تمام صفحه",
|
||||
"Display name": "نام نمایشی",
|
||||
"Developer": "توسعه دهنده",
|
||||
"Debug log request": "درخواست لاگ عیبیابی",
|
||||
"Create account": "ساخت حساب کاربری",
|
||||
"Copied!": "کپی شد!",
|
||||
"Confirm password": "تایید رمزعبور",
|
||||
"Close": "بستن",
|
||||
"Camera": "دوربین",
|
||||
"Avatar": "آواتار",
|
||||
"Audio": "صدا",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "کاربر دیگری در این تماس مشکلی دارد. برای تشخیص بهتر مشکل، بهتر است ما لاگ عیبیابی را جمعآوری کنیم.",
|
||||
"<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>": "<0>چرا یک رمز عبور برای حساب کاربری خود تنظیم نمیکنید؟</0><1>شما میتوانید نام خود را حفظ کنید و یک آواتار برای تماسهای آینده بسازید</1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>ساخت حساب کاربری</0> Or <2>دسترسی به عنوان میهمان</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>از قبل حساب کاربری دارید؟</0><1><0>ورود</0> Or <2>به عنوان یک میهمان وارد شوید</2></1>",
|
||||
"Local volume": "حجم داخلی",
|
||||
"Spotlight": "نور افکن",
|
||||
"Share screen": "اشتراک گذاری صفحه نمایش",
|
||||
"Sending…": "در حال ارسال…",
|
||||
"Sending debug logs…": "در حال ارسال باگهای عیبیابی…",
|
||||
"Send debug logs": "ارسال لاگهای عیبیابی",
|
||||
"Select an option": "یک گزینه را انتخاب کنید",
|
||||
"Return to home screen": "برگشت به صفحه اصلی",
|
||||
"Remove": "حذف",
|
||||
"Registering…": "ثبتنام…",
|
||||
"Register": "ثبتنام",
|
||||
"Recaptcha not loaded": "کپچا بارگیری نشد",
|
||||
"Recaptcha dismissed": "ریکپچا رد شد",
|
||||
"Passwords must match": "رمز عبور باید همخوانی داشته باشد",
|
||||
"Not registered yet? <2>Create an account</2>": "هنوز ثبتنام نکردهاید؟ <2>ساخت حساب کاربری</2>",
|
||||
"Not now, return to home screen": "الان نه، به صفحه اصلی برگردید",
|
||||
"Logging in…": "ورود…",
|
||||
"Include debug logs": "شامل لاگهای عیبیابی",
|
||||
"Yes, join call": "بله، به تماس بپیوندید",
|
||||
"Waiting for other participants…": "در انتظار برای دیگر شرکتکنندگان…",
|
||||
"Version: {{version}}": "نسخه: {{نسخه}}",
|
||||
"User menu": "فهرست کاربر",
|
||||
"This call already exists, would you like to join?": "این تماس از قبل وجود دارد، میخواهید بپیوندید؟",
|
||||
"Submit feedback": "بازخورد ارائه دهید",
|
||||
"Element Call Home": "خانهٔ تماس المنت",
|
||||
"Copy": "رونوشت"
|
||||
"a11y": {
|
||||
"user_menu": "فهرست کاربر"
|
||||
},
|
||||
"action": {
|
||||
"close": "بستن",
|
||||
"copy": "رونوشت",
|
||||
"go": "رفتن",
|
||||
"no": "خیر",
|
||||
"register": "ثبتنام",
|
||||
"remove": "حذف",
|
||||
"sign_in": "ورود",
|
||||
"sign_out": "خروج"
|
||||
},
|
||||
"call_ended_view": {
|
||||
"create_account_button": "ساخت حساب کاربری",
|
||||
"create_account_prompt": "<0>چرا یک رمز عبور برای حساب کاربری خود تنظیم نمیکنید؟</0><1>شما میتوانید نام خود را حفظ کنید و یک آواتار برای تماسهای آینده بسازید</1>",
|
||||
"not_now_button": "الان نه، به صفحه اصلی برگردید"
|
||||
},
|
||||
"common": {
|
||||
"audio": "صدا",
|
||||
"avatar": "آواتار",
|
||||
"camera": "دوربین",
|
||||
"copied": "کپی شد!",
|
||||
"display_name": "نام نمایشی",
|
||||
"home": "خانه",
|
||||
"loading": "بارگزاری…",
|
||||
"microphone": "میکروفون",
|
||||
"password": "رمز عبور",
|
||||
"profile": "پروفایل",
|
||||
"settings": "تنظیمات",
|
||||
"username": "نام کاربری",
|
||||
"video": "ویدیو"
|
||||
},
|
||||
"exit_fullscreen_button_label": "خروج از حالت تمام صفحه",
|
||||
"fullscreen_button_label": "تمام صحفه",
|
||||
"header_label": "خانهٔ تماس المنت",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "بله، به تماس بپیوندید",
|
||||
"text": "این تماس از قبل وجود دارد، میخواهید بپیوندید؟",
|
||||
"title": "پیوست به تماس؟"
|
||||
},
|
||||
"layout_spotlight_label": "نور افکن",
|
||||
"lobby": {
|
||||
"join_button": "پیوستن به تماس"
|
||||
},
|
||||
"local_volume_label": "حجم داخلی",
|
||||
"logging_in": "ورود…",
|
||||
"login_auth_links": "<0>ساخت حساب کاربری</0> Or <2>دسترسی به عنوان میهمان</2>",
|
||||
"login_title": "ورود",
|
||||
"rageshake_request_modal": {
|
||||
"body": "کاربر دیگری در این تماس مشکلی دارد. برای تشخیص بهتر مشکل، بهتر است ما لاگ عیبیابی را جمعآوری کنیم.",
|
||||
"title": "درخواست لاگ عیبیابی"
|
||||
},
|
||||
"rageshake_send_logs": "ارسال لاگهای عیبیابی",
|
||||
"rageshake_sending": "در حال ارسال…",
|
||||
"rageshake_sending_logs": "در حال ارسال باگهای عیبیابی…",
|
||||
"recaptcha_dismissed": "ریکپچا رد شد",
|
||||
"recaptcha_not_loaded": "کپچا بارگیری نشد",
|
||||
"register": {
|
||||
"passwords_must_match": "رمز عبور باید همخوانی داشته باشد",
|
||||
"registering": "ثبتنام…"
|
||||
},
|
||||
"register_auth_links": "<0>از قبل حساب کاربری دارید؟</0><1><0>ورود</0> Or <2>به عنوان یک میهمان وارد شوید</2></1>",
|
||||
"register_confirm_password_label": "تایید رمزعبور",
|
||||
"return_home_button": "برگشت به صفحه اصلی",
|
||||
"room_auth_view_join_button": "الان به تماس بپیوند",
|
||||
"screenshare_button_label": "اشتراک گذاری صفحه نمایش",
|
||||
"select_input_unset_button": "یک گزینه را انتخاب کنید",
|
||||
"settings": {
|
||||
"developer_tab_title": "توسعه دهنده",
|
||||
"feedback_tab_h4": "بازخورد ارائه دهید",
|
||||
"feedback_tab_send_logs_label": "شامل لاگهای عیبیابی",
|
||||
"more_tab_title": "بیشتر",
|
||||
"speaker_device_selection_label": "بلندگو"
|
||||
},
|
||||
"unauthenticated_view_body": "هنوز ثبتنام نکردهاید؟ <2>ساخت حساب کاربری</2>",
|
||||
"unauthenticated_view_login_button": "به حساب کاربری خود وارد شوید",
|
||||
"version": "نسخه: {{نسخه}}",
|
||||
"waiting_for_participants": "در انتظار برای دیگر شرکتکنندگان…"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,138 @@
|
||||
{
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Créer un compte</0> Or <2>Accès invité</2>",
|
||||
"<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>": "<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>",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Un autre utilisateur dans cet appel a un problème. Pour nous permettre de résoudre le problème, nous aimerions récupérer un journal de débogage.",
|
||||
"Audio": "Audio",
|
||||
"Avatar": "Avatar",
|
||||
"Camera": "Caméra",
|
||||
"Close": "Fermer",
|
||||
"Confirm password": "Confirmer le mot de passe",
|
||||
"Copied!": "Copié !",
|
||||
"Create account": "Créer un compte",
|
||||
"Debug log request": "Demande d’un journal de débogage",
|
||||
"Developer": "Développeur",
|
||||
"Display name": "Nom d’affichage",
|
||||
"Exit full screen": "Quitter le plein écran",
|
||||
"Full screen": "Plein écran",
|
||||
"Go": "Commencer",
|
||||
"Home": "Accueil",
|
||||
"Include debug logs": "Inclure les journaux de débogage",
|
||||
"Join call": "Rejoindre l’appel",
|
||||
"Join call now": "Rejoindre l’appel maintenant",
|
||||
"Join existing call?": "Rejoindre un appel existant ?",
|
||||
"Loading…": "Chargement…",
|
||||
"Local volume": "Volume local",
|
||||
"Logging in…": "Connexion…",
|
||||
"Login": "Connexion",
|
||||
"Login to your account": "Connectez vous à votre compte",
|
||||
"Microphone": "Microphone",
|
||||
"More": "Plus",
|
||||
"No": "Non",
|
||||
"Not now, return to home screen": "Pas maintenant, retourner à l’accueil",
|
||||
"Not registered yet? <2>Create an account</2>": "Pas encore de compte ? <2>En créer un</2>",
|
||||
"Password": "Mot de passe",
|
||||
"Passwords must match": "Les mots de passe doivent correspondre",
|
||||
"Profile": "Profil",
|
||||
"Recaptcha dismissed": "Recaptcha refusé",
|
||||
"Recaptcha not loaded": "Recaptcha non chargé",
|
||||
"Register": "S’enregistrer",
|
||||
"Registering…": "Enregistrement…",
|
||||
"Remove": "Supprimer",
|
||||
"Return to home screen": "Retour à l’accueil",
|
||||
"Select an option": "Sélectionnez une option",
|
||||
"Send debug logs": "Envoyer les journaux de débogage",
|
||||
"Sending…": "Envoi…",
|
||||
"Settings": "Paramètres",
|
||||
"Share screen": "Partage d’écran",
|
||||
"Sign in": "Connexion",
|
||||
"Sign out": "Déconnexion",
|
||||
"Spotlight": "Premier plan",
|
||||
"Submit feedback": "Envoyer un commentaire",
|
||||
"This call already exists, would you like to join?": "Cet appel existe déjà, voulez-vous le rejoindre ?",
|
||||
"Yes, join call": "Oui, rejoindre l’appel",
|
||||
"Waiting for other participants…": "En attente d’autres participants…",
|
||||
"Video": "Vidéo",
|
||||
"Version: {{version}}": "Version : {{version}}",
|
||||
"Username": "Nom d’utilisateur",
|
||||
"User menu": "Menu utilisateur",
|
||||
"Speaker": "Intervenant",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Vous avez déjà un compte ?</0><1><0>Se connecter</0> Ou <2>Accès invité</2></1>",
|
||||
"Sending debug logs…": "Envoi des journaux de débogage…",
|
||||
"Element Call Home": "Accueil Element Call",
|
||||
"Copy": "Copier",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Soumettre les journaux de débogage nous aidera à déterminer le problème.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Oups, quelque chose s’est mal passé.</0>",
|
||||
"Expose developer settings in the settings window.": "Affiche les paramètres développeurs dans la fenêtre des paramètres.",
|
||||
"Developer Settings": "Paramètres développeurs",
|
||||
"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 <5>Cookie Policy</5>.": "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>.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>Vous pouvez retirer votre consentement en décochant cette case. Si vous êtes actuellement en communication, ce paramètre prendra effet à la fin de l’appel.",
|
||||
"Your feedback": "Votre commentaire",
|
||||
"Thanks, we received your feedback!": "Merci, nous avons reçu vos commentaires !",
|
||||
"Submitting…": "Envoi…",
|
||||
"Submit": "Envoyer",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Si vous rencontrez des problèmes, ou vous voulez simplement faire un commentaire, faites-en une courte description ci-dessous.",
|
||||
"Feedback": "Commentaires",
|
||||
"{{count}} stars|other": "{{count}} favoris",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Nous aimerions avoir vos commentaires afin que nous puissions améliorer votre expérience.</0>",
|
||||
"{{count}} stars|one": "{{count}} favori",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, votre appel est terminé.",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Merci pour votre commentaire !</0>",
|
||||
"How did it go?": "Comment cela s’est-il passé ?",
|
||||
"{{displayName}} is presenting": "{{displayName}} est à l’écran",
|
||||
"Show connection stats": "Afficher les statistiques de la connexion",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "En cliquant sur « Rejoindre l’appel maintenant », vous acceptez notre <2>Contrat de Licence Utilisateur Final (CLUF)</2>",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "En cliquant sur « Commencer », vous acceptez notre <2>Contrat de Licence Utilisateur Final (CLUF)</2>",
|
||||
"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>": "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>",
|
||||
"Reconnect": "Se reconnecter",
|
||||
"Retry sending logs": "Réessayer d’envoyer les journaux",
|
||||
"Thanks!": "Merci !",
|
||||
"You were disconnected from the call": "Vous avez été déconnecté de l’appel",
|
||||
"Connectivity to the server has been lost.": "La connexion avec le serveur a été perdue.",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"Encrypted": "Chiffré",
|
||||
"End call": "Terminer l’appel",
|
||||
"Grid": "Grille",
|
||||
"Microphone off": "Microphone éteint",
|
||||
"Microphone on": "Microphone allumé",
|
||||
"Sharing screen": "L’écran est partagé",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"Not encrypted": "Non chiffré",
|
||||
"You": "Vous",
|
||||
"Continue in browser": "Continuer dans le navigateur",
|
||||
"Mute microphone": "Couper le microphone",
|
||||
"Name of call": "Nom de l’appel",
|
||||
"Open in the app": "Ouvrir dans l’application",
|
||||
"Ready to join?": "Prêt à rejoindre ?",
|
||||
"Select app": "Choisissez l’application",
|
||||
"Start new call": "Démarrer un nouvel appel",
|
||||
"Back to recents": "Revenir à l’historique des appels",
|
||||
"Start video": "Démarrer la vidéo",
|
||||
"Stop video": "Arrêter la vidéo",
|
||||
"Unmute microphone": "Allumer le microphone",
|
||||
"Call not found": "Appel non trouvé",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Les appels sont maintenant chiffrés de bout-en-bout et doivent être créés depuis la page d’accueil. Cela permet d’être sûr que tout le monde utilise la même clé de chiffrement.",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Votre navigateur web ne prend pas en charge le chiffrement de bout-en-bout des médias. Les navigateurs pris en charge sont Chrome, Safari, Firefox >= 117",
|
||||
"Copy link": "Copier le lien",
|
||||
"Invite": "Inviter",
|
||||
"Invite to this call": "Inviter dans cet appel",
|
||||
"Link copied to clipboard": "Lien copié dans le presse-papier",
|
||||
"Participants": "Participants"
|
||||
"a11y": {
|
||||
"user_menu": "Menu utilisateur"
|
||||
},
|
||||
"action": {
|
||||
"close": "Fermer",
|
||||
"copy": "Copier",
|
||||
"copy_link": "Copier le lien",
|
||||
"go": "Commencer",
|
||||
"invite": "Inviter",
|
||||
"no": "Non",
|
||||
"register": "S’enregistrer",
|
||||
"remove": "Supprimer",
|
||||
"sign_in": "Connexion",
|
||||
"sign_out": "Déconnexion",
|
||||
"submit": "Envoyer"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "Votre navigateur web ne prend pas en charge le chiffrement de bout-en-bout des médias. Les navigateurs pris en charge sont Chrome, Safari, Firefox >= 117",
|
||||
"call_ended_view": {
|
||||
"body": "Vous avez été déconnecté de l’appel",
|
||||
"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>",
|
||||
"feedback_done": "<0>Merci pour votre commentaire !</0>",
|
||||
"feedback_prompt": "<0>Nous aimerions avoir vos commentaires afin que nous puissions améliorer votre expérience.</0>",
|
||||
"headline": "{{displayName}}, votre appel est terminé.",
|
||||
"not_now_button": "Pas maintenant, retourner à l’accueil",
|
||||
"reconnect_button": "Se reconnecter",
|
||||
"survey_prompt": "Comment cela s’est-il passé ?"
|
||||
},
|
||||
"call_name": "Nom de l’appel",
|
||||
"common": {
|
||||
"camera": "Caméra",
|
||||
"copied": "Copié !",
|
||||
"display_name": "Nom d’affichage",
|
||||
"encrypted": "Chiffré",
|
||||
"home": "Accueil",
|
||||
"loading": "Chargement…",
|
||||
"password": "Mot de passe",
|
||||
"profile": "Profil",
|
||||
"settings": "Paramètres",
|
||||
"unencrypted": "Non chiffré",
|
||||
"username": "Nom d’utilisateur",
|
||||
"video": "Vidéo"
|
||||
},
|
||||
"disconnected_banner": "La connexion avec le serveur a été perdue.",
|
||||
"exit_fullscreen_button_label": "Quitter le plein écran",
|
||||
"full_screen_view_description": "<0>Soumettre les journaux de débogage nous aidera à déterminer le problème.</0>",
|
||||
"full_screen_view_h1": "<0>Oups, quelque chose s’est mal passé.</0>",
|
||||
"fullscreen_button_label": "Plein écran",
|
||||
"group_call_loader_failed_heading": "Appel non trouvé",
|
||||
"group_call_loader_failed_text": "Les appels sont maintenant chiffrés de bout-en-bout et doivent être créés depuis la page d’accueil. Cela permet d’être sûr que tout le monde utilise la même clé de chiffrement.",
|
||||
"hangup_button_label": "Terminer l’appel",
|
||||
"header_label": "Accueil Element Call",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Lien copié dans le presse-papier",
|
||||
"title": "Inviter dans cet appel"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Oui, rejoindre l’appel",
|
||||
"text": "Cet appel existe déjà, voulez-vous le rejoindre ?",
|
||||
"title": "Rejoindre un appel existant ?"
|
||||
},
|
||||
"layout_grid_label": "Grille",
|
||||
"layout_spotlight_label": "Premier plan",
|
||||
"lobby": {
|
||||
"join_button": "Rejoindre l’appel",
|
||||
"leave_button": "Revenir à l’historique des appels"
|
||||
},
|
||||
"local_volume_label": "Volume local",
|
||||
"logging_in": "Connexion…",
|
||||
"login_auth_links": "<0>Créer un compte</0> Or <2>Accès invité</2>",
|
||||
"login_title": "Connexion",
|
||||
"microphone_off": "Microphone éteint",
|
||||
"microphone_on": "Microphone allumé",
|
||||
"mute_microphone_button_label": "Couper le microphone",
|
||||
"rageshake_button_error_caption": "Réessayer d’envoyer les journaux",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Un autre utilisateur dans cet appel a un problème. Pour nous permettre de résoudre le problème, nous aimerions récupérer un journal de débogage.",
|
||||
"title": "Demande d’un journal de débogage"
|
||||
},
|
||||
"rageshake_send_logs": "Envoyer les journaux de débogage",
|
||||
"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": {
|
||||
"passwords_must_match": "Les mots de passe doivent correspondre",
|
||||
"registering": "Enregistrement…"
|
||||
},
|
||||
"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>",
|
||||
"room_auth_view_join_button": "Rejoindre l’appel maintenant",
|
||||
"screenshare_button_label": "Partage d’écran",
|
||||
"select_input_unset_button": "Sélectionnez une option",
|
||||
"settings": {
|
||||
"developer_settings_label": "Paramètres développeurs",
|
||||
"developer_settings_label_description": "Affiche les paramètres développeurs dans la fenêtre des paramètres.",
|
||||
"developer_tab_title": "Développeur",
|
||||
"feedback_tab_body": "Si vous rencontrez des problèmes, ou vous voulez simplement faire un commentaire, faites-en une courte description ci-dessous.",
|
||||
"feedback_tab_description_label": "Votre commentaire",
|
||||
"feedback_tab_h4": "Envoyer un commentaire",
|
||||
"feedback_tab_send_logs_label": "Inclure les journaux de débogage",
|
||||
"feedback_tab_thank_you": "Merci, nous avons reçu vos commentaires !",
|
||||
"feedback_tab_title": "Commentaires",
|
||||
"more_tab_title": "Plus",
|
||||
"opt_in_description": "<0></0><1></1>Vous pouvez retirer votre consentement en décochant cette case. Si vous êtes actuellement en communication, ce paramètre prendra effet à la fin de l’appel.",
|
||||
"show_connection_stats_label": "Afficher les statistiques de la connexion",
|
||||
"speaker_device_selection_label": "Intervenant"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} favori",
|
||||
"star_rating_input_label_other": "{{count}} favoris",
|
||||
"start_new_call": "Démarrer un nouvel appel",
|
||||
"start_video_button_label": "Démarrer la vidéo",
|
||||
"stop_screenshare_button_label": "L’écran est partagé",
|
||||
"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",
|
||||
"version": "Version : {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} est à l’écran",
|
||||
"sfu_participant_local": "Vous"
|
||||
},
|
||||
"waiting_for_participants": "En attente d’autres participants…"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,139 @@
|
||||
{
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Sudah punya akun?</0><1><0>Masuk</0> Atau <2>Akses sebagai tamu</2></1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Buat akun</0> Atau <2>Akses sebagai tamu</2>",
|
||||
"<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>": "<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>",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Pengguna yang lain di panggilan ini sedang mengalami masalah. Supaya dapat mendiagnosa masalah ini, kami ingin mengumpulkan sebuah catatan pengawakutuan.",
|
||||
"Audio": "Audio",
|
||||
"Avatar": "Avatar",
|
||||
"Camera": "Kamera",
|
||||
"Close": "Tutup",
|
||||
"Confirm password": "Konfirmasi kata sandi",
|
||||
"Copied!": "Disalin!",
|
||||
"Create account": "Buat akun",
|
||||
"Debug log request": "Permintaan catatan pengawakutuan",
|
||||
"Developer": "Pengembang",
|
||||
"Display name": "Nama tampilan",
|
||||
"Exit full screen": "Keluar dari layar penuh",
|
||||
"Full screen": "Layar penuh",
|
||||
"Go": "Bergabung",
|
||||
"Home": "Beranda",
|
||||
"Include debug logs": "Termasuk catatan pengawakutuan",
|
||||
"Join call": "Bergabung ke panggilan",
|
||||
"Join call now": "Bergabung ke panggilan sekarang",
|
||||
"Join existing call?": "Bergabung ke panggilan yang sudah ada?",
|
||||
"Loading…": "Memuat…",
|
||||
"Local volume": "Volume lokal",
|
||||
"Logging in…": "Memasuki…",
|
||||
"Login": "Masuk",
|
||||
"Login to your account": "Masuk ke akun Anda",
|
||||
"Microphone": "Mikrofon",
|
||||
"More": "Lainnya",
|
||||
"No": "Tidak",
|
||||
"Not now, return to home screen": "Tidak sekarang, kembali ke layar beranda",
|
||||
"Not registered yet? <2>Create an account</2>": "Belum terdaftar? <2>Buat sebuah akun</2>",
|
||||
"Password": "Kata sandi",
|
||||
"Passwords must match": "Kata sandi harus cocok",
|
||||
"Profile": "Profil",
|
||||
"Recaptcha dismissed": "Recaptcha ditutup",
|
||||
"Recaptcha not loaded": "Recaptcha tidak dimuat",
|
||||
"Register": "Daftar",
|
||||
"Registering…": "Mendaftarkan…",
|
||||
"Remove": "Hapus",
|
||||
"Return to home screen": "Kembali ke layar beranda",
|
||||
"Select an option": "Pilih sebuah opsi",
|
||||
"Send debug logs": "Kirim catatan pengawakutuan",
|
||||
"Sending…": "Mengirimkan…",
|
||||
"Settings": "Pengaturan",
|
||||
"Share screen": "Bagikan layar",
|
||||
"Sign in": "Masuk",
|
||||
"Sign out": "Keluar",
|
||||
"Speaker": "Pembicara",
|
||||
"Spotlight": "Sorotan",
|
||||
"Submit feedback": "Kirim masukan",
|
||||
"This call already exists, would you like to join?": "Panggilan ini sudah ada, apakah Anda ingin bergabung?",
|
||||
"User menu": "Menu pengguna",
|
||||
"Username": "Nama pengguna",
|
||||
"Version: {{version}}": "Versi: {{version}}",
|
||||
"Video": "Video",
|
||||
"Waiting for other participants…": "Menunggu peserta lain…",
|
||||
"Yes, join call": "Ya, bergabung ke panggilan",
|
||||
"Sending debug logs…": "Mengirimkan catatan pengawakutuan…",
|
||||
"Element Call Home": "Beranda Element Call",
|
||||
"Copy": "Salin",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Mengirim catatan pengawakutuan akan membantu kami melacak masalahnya.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Aduh, ada yang salah.</0>",
|
||||
"Expose developer settings in the settings window.": "Ekspos pengaturan pengembang dalam jendela pengaturan.",
|
||||
"Developer Settings": "Pengaturan Pengembang",
|
||||
"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 <5>Cookie Policy</5>.": "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.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<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.",
|
||||
"Feedback": "Masukan",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Jika Anda mengalami masalah atau hanya ingin memberikan masukan, silakan kirimkan kami deskripsi pendek di bawah.",
|
||||
"Submit": "Kirim",
|
||||
"Submitting…": "Mengirim…",
|
||||
"Thanks, we received your feedback!": "Terima kasih, kami telah menerima masukan Anda!",
|
||||
"Your feedback": "Masukan Anda",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, panggilan Anda telah berakhir.",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Terima kasih atas masukan Anda!</0>",
|
||||
"How did it go?": "Bagaimana rasanya?",
|
||||
"{{count}} stars|one": "{{count}} bintang",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Kami ingin mendengar masukan Anda supaya kami bisa meningkatkan pengalaman Anda.</0>",
|
||||
"Show connection stats": "Tampilkan statistik koneksi",
|
||||
"{{displayName}} is presenting": "{{displayName}} sedang menampilkan",
|
||||
"{{count}} stars|other": "{{count}} bintang",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Dengan mengeklik \"Bergabung\", Anda menyetujui <2>Perjanjian Lisensi Pengguna Akhir (EULA)</2>",
|
||||
"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>": "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",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Dengan mengeklik \"Bergabung ke panggilan sekarang\", Anda menyetujui <2>Perjanjian Lisensi Pengguna Akhir (EULA)</2> kami",
|
||||
"Connectivity to the server has been lost.": "Koneksi ke server telah hilang.",
|
||||
"Retry sending logs": "Kirim ulang catatan",
|
||||
"You were disconnected from the call": "Anda terputus dari panggilan",
|
||||
"Reconnect": "Hubungkan ulang",
|
||||
"Thanks!": "Terima kasih!",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"Encrypted": "Terenkripsi",
|
||||
"End call": "Akhiri panggilan",
|
||||
"Grid": "Kisi",
|
||||
"Microphone off": "Mikrofon dimatikan",
|
||||
"Microphone on": "Mikrofon dinyalakan",
|
||||
"Not encrypted": "Tidak terenkripsi",
|
||||
"Sharing screen": "Berbagi layar",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"You": "Anda",
|
||||
"Continue in browser": "Lanjutkan dalam peramban",
|
||||
"Mute microphone": "Matikan mikrofon",
|
||||
"Name of call": "Nama panggilan",
|
||||
"Open in the app": "Buka dalam aplikasi",
|
||||
"Ready to join?": "Siap untuk bergabung?",
|
||||
"Select app": "Pilih plikasi",
|
||||
"Start new call": "Mulai panggilan baru",
|
||||
"Start video": "Nyalakan video",
|
||||
"Stop video": "Matikan video",
|
||||
"Unmute microphone": "Nyalakan mikrofon",
|
||||
"Back to recents": "Kembali ke terkini",
|
||||
"Call not found": "Panggilan tidak ditemukan",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Panggilan sekarang terenkripsi secara ujung ke ujung dan harus dibuat dari laman beranda. Ini memastikan bahwa semuanya menggunakan kunci enkripsi yang sama.",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Peramban web Anda tidak mendukung enkripsi media ujung ke ujung. Peramban yang didukung adalah Chrome, Safari, dan Firefox >=117",
|
||||
"Invite": "Undang",
|
||||
"Invite to this call": "Undang ke panggilan ini",
|
||||
"Participants": "Peserta",
|
||||
"Copy link": "Salin tautan",
|
||||
"Link copied to clipboard": "Tautan disalin ke papan klip"
|
||||
"a11y": {
|
||||
"user_menu": "Menu pengguna"
|
||||
},
|
||||
"action": {
|
||||
"close": "Tutup",
|
||||
"copy": "Salin",
|
||||
"copy_link": "Salin tautan",
|
||||
"go": "Bergabung",
|
||||
"invite": "Undang",
|
||||
"no": "Tidak",
|
||||
"register": "Daftar",
|
||||
"remove": "Hapus",
|
||||
"sign_in": "Masuk",
|
||||
"sign_out": "Keluar",
|
||||
"submit": "Kirim"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "Peramban web Anda tidak mendukung enkripsi media ujung ke ujung. Peramban yang didukung adalah Chrome, Safari, dan Firefox >=117",
|
||||
"call_ended_view": {
|
||||
"body": "Anda terputus dari panggilan",
|
||||
"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>",
|
||||
"feedback_done": "<0>Terima kasih atas masukan Anda!</0>",
|
||||
"feedback_prompt": "<0>Kami ingin mendengar masukan Anda supaya kami bisa meningkatkan pengalaman Anda.</0>",
|
||||
"headline": "{{displayName}}, panggilan Anda telah berakhir.",
|
||||
"not_now_button": "Tidak sekarang, kembali ke layar beranda",
|
||||
"reconnect_button": "Hubungkan ulang",
|
||||
"survey_prompt": "Bagaimana rasanya?"
|
||||
},
|
||||
"call_name": "Nama panggilan",
|
||||
"common": {
|
||||
"camera": "Kamera",
|
||||
"copied": "Disalin!",
|
||||
"display_name": "Nama tampilan",
|
||||
"encrypted": "Terenkripsi",
|
||||
"home": "Beranda",
|
||||
"loading": "Memuat…",
|
||||
"microphone": "Mikrofon",
|
||||
"password": "Kata sandi",
|
||||
"profile": "Profil",
|
||||
"settings": "Pengaturan",
|
||||
"unencrypted": "Tidak terenkripsi",
|
||||
"username": "Nama pengguna"
|
||||
},
|
||||
"disconnected_banner": "Koneksi ke server telah hilang.",
|
||||
"exit_fullscreen_button_label": "Keluar dari layar penuh",
|
||||
"full_screen_view_description": "<0>Mengirim catatan pengawakutuan akan membantu kami melacak masalahnya.</0>",
|
||||
"full_screen_view_h1": "<0>Aduh, ada yang salah.</0>",
|
||||
"fullscreen_button_label": "Layar penuh",
|
||||
"group_call_loader_failed_heading": "Panggilan tidak ditemukan",
|
||||
"group_call_loader_failed_text": "Panggilan sekarang terenkripsi secara ujung ke ujung dan harus dibuat dari laman beranda. Ini memastikan bahwa semuanya menggunakan kunci enkripsi yang sama.",
|
||||
"hangup_button_label": "Akhiri panggilan",
|
||||
"header_label": "Beranda Element Call",
|
||||
"header_participants_label": "Peserta",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Tautan disalin ke papan klip",
|
||||
"title": "Undang ke panggilan ini"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Ya, bergabung ke panggilan",
|
||||
"text": "Panggilan ini sudah ada, apakah Anda ingin bergabung?",
|
||||
"title": "Bergabung ke panggilan yang sudah ada?"
|
||||
},
|
||||
"layout_grid_label": "Kisi",
|
||||
"layout_spotlight_label": "Sorotan",
|
||||
"lobby": {
|
||||
"join_button": "Bergabung ke panggilan",
|
||||
"leave_button": "Kembali ke terkini"
|
||||
},
|
||||
"local_volume_label": "Volume lokal",
|
||||
"logging_in": "Memasuki…",
|
||||
"login_auth_links": "<0>Buat akun</0> Atau <2>Akses sebagai tamu</2>",
|
||||
"login_title": "Masuk",
|
||||
"microphone_off": "Mikrofon dimatikan",
|
||||
"microphone_on": "Mikrofon dinyalakan",
|
||||
"mute_microphone_button_label": "Matikan mikrofon",
|
||||
"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.",
|
||||
"title": "Permintaan catatan pengawakutuan"
|
||||
},
|
||||
"rageshake_send_logs": "Kirim catatan pengawakutuan",
|
||||
"rageshake_sending": "Mengirimkan…",
|
||||
"rageshake_sending_logs": "Mengirimkan catatan pengawakutuan…",
|
||||
"rageshake_sent": "Terima kasih!",
|
||||
"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",
|
||||
"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",
|
||||
"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_join_button": "Bergabung ke panggilan sekarang",
|
||||
"screenshare_button_label": "Bagikan layar",
|
||||
"select_input_unset_button": "Pilih sebuah opsi",
|
||||
"settings": {
|
||||
"developer_settings_label": "Pengaturan Pengembang",
|
||||
"developer_settings_label_description": "Ekspos pengaturan pengembang dalam jendela pengaturan.",
|
||||
"developer_tab_title": "Pengembang",
|
||||
"feedback_tab_body": "Jika Anda mengalami masalah atau hanya ingin memberikan masukan, silakan kirimkan kami deskripsi pendek di bawah.",
|
||||
"feedback_tab_description_label": "Masukan Anda",
|
||||
"feedback_tab_h4": "Kirim masukan",
|
||||
"feedback_tab_send_logs_label": "Termasuk catatan pengawakutuan",
|
||||
"feedback_tab_thank_you": "Terima kasih, kami telah menerima masukan Anda!",
|
||||
"feedback_tab_title": "Masukan",
|
||||
"more_tab_title": "Lainnya",
|
||||
"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.",
|
||||
"show_connection_stats_label": "Tampilkan statistik koneksi",
|
||||
"speaker_device_selection_label": "Pembicara"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} bintang",
|
||||
"star_rating_input_label_other": "{{count}} bintang",
|
||||
"start_new_call": "Mulai panggilan baru",
|
||||
"start_video_button_label": "Nyalakan video",
|
||||
"stop_screenshare_button_label": "Berbagi layar",
|
||||
"stop_video_button_label": "Matikan video",
|
||||
"submitting": "Mengirim…",
|
||||
"unauthenticated_view_body": "Belum terdaftar? <2>Buat sebuah akun</2>",
|
||||
"unauthenticated_view_eula_caption": "Dengan mengeklik \"Bergabung\", Anda menyetujui <2>Perjanjian Lisensi Pengguna Akhir (EULA)</2>",
|
||||
"unauthenticated_view_login_button": "Masuk ke akun Anda",
|
||||
"unmute_microphone_button_label": "Nyalakan mikrofon",
|
||||
"version": "Versi: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} sedang menampilkan",
|
||||
"sfu_participant_local": "Anda"
|
||||
},
|
||||
"waiting_for_participants": "Menunggu peserta lain…"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,136 @@
|
||||
{
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"{{count}} stars|one": "{{count}} stelle",
|
||||
"{{count}} stars|other": "{{count}} stelle",
|
||||
"{{displayName}} is presenting": "{{displayName}} sta presentando",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Hai già un profilo?</0><1><0>Accedi</0> o <2>Accedi come ospite</2></1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Crea un profilo</0> o <2>Accedi come ospite</2>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Ops, qualcosa è andato storto.</0>",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>L'invio di registri di debug ci aiuterà ad individuare il problema.</0>",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Grazie per la tua opinione!</0>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Vorremmo sapere la tua opinione in modo da migliorare l'esperienza.</0>",
|
||||
"Audio": "Audio",
|
||||
"Avatar": "Avatar",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Cliccando \"Vai\", accetti il nostro <2>accordo di licenza con l'utente finale (EULA)</2>",
|
||||
"Camera": "Fotocamera",
|
||||
"Close": "Chiudi",
|
||||
"Confirm password": "Conferma password",
|
||||
"Connectivity to the server has been lost.": "La connessione al server è stata persa.",
|
||||
"Copied!": "Copiato!",
|
||||
"Copy": "Copia",
|
||||
"Create account": "Crea profilo",
|
||||
"Debug log request": "Richiesta registro di debug",
|
||||
"Developer": "Sviluppatore",
|
||||
"Developer Settings": "Impostazioni per sviluppatori",
|
||||
"Display name": "Il tuo nome",
|
||||
"Element Call Home": "Inizio di Element Call",
|
||||
"Encrypted": "Cifrata",
|
||||
"End call": "Termina chiamata",
|
||||
"Exit full screen": "Esci da schermo intero",
|
||||
"Expose developer settings in the settings window.": "Mostra le impostazioni per sviluppatori nella finestra delle impostazioni.",
|
||||
"Feedback": "Feedback",
|
||||
"Full screen": "Schermo intero",
|
||||
"Go": "Vai",
|
||||
"Grid": "Griglia",
|
||||
"Home": "Pagina iniziale",
|
||||
"How did it go?": "Com'è andata?",
|
||||
"Include debug logs": "Includi registri di debug",
|
||||
"Join call": "Entra in chiamata",
|
||||
"Join call now": "Entra in chiamata ora",
|
||||
"Loading…": "Caricamento…",
|
||||
"Local volume": "Volume locale",
|
||||
"Logging in…": "Accesso…",
|
||||
"Login": "Accedi",
|
||||
"Login to your account": "Accedi al tuo profilo",
|
||||
"Microphone": "Microfono",
|
||||
"Microphone off": "Microfono spento",
|
||||
"Microphone on": "Microfono acceso",
|
||||
"More": "Altro",
|
||||
"No": "No",
|
||||
"Not encrypted": "Non cifrata",
|
||||
"Join existing call?": "Entrare in una chiamata esistente?",
|
||||
"Not registered yet? <2>Create an account</2>": "Non hai ancora un profilo? <2>Creane uno</2>",
|
||||
"Password": "Password",
|
||||
"Passwords must match": "Le password devono coincidere",
|
||||
"Profile": "Profilo",
|
||||
"Recaptcha dismissed": "Recaptcha annullato",
|
||||
"Recaptcha not loaded": "Recaptcha non caricato",
|
||||
"Reconnect": "Riconnetti",
|
||||
"Register": "Registra",
|
||||
"Registering…": "Registrazione…",
|
||||
"Remove": "Rimuovi",
|
||||
"Retry sending logs": "Riprova l'invio dei registri",
|
||||
"Return to home screen": "Torna alla schermata di iniziale",
|
||||
"Select an option": "Seleziona un'opzione",
|
||||
"Send debug logs": "Invia registri di debug",
|
||||
"Sending debug logs…": "Invio dei registri di debug…",
|
||||
"Sending…": "Invio…",
|
||||
"Settings": "Impostazioni",
|
||||
"Share screen": "Condividi schermo",
|
||||
"Sharing screen": "Condivisione schermo",
|
||||
"Show connection stats": "Mostra statistiche connessione",
|
||||
"Sign in": "Accedi",
|
||||
"Sign out": "Disconnetti",
|
||||
"Speaker": "Altoparlante",
|
||||
"Submit": "Invia",
|
||||
"Submit feedback": "Invia commento",
|
||||
"Spotlight": "In primo piano",
|
||||
"Thanks, we received your feedback!": "Grazie, abbiamo ricevuto il tuo commento!",
|
||||
"Thanks!": "Grazie!",
|
||||
"This call already exists, would you like to join?": "Questa chiamata esiste già, vuoi entrare?",
|
||||
"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>": "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>",
|
||||
"User menu": "Menu utente",
|
||||
"Username": "Nome utente",
|
||||
"Version: {{version}}": "Versione: {{version}}",
|
||||
"Video": "Video",
|
||||
"Waiting for other participants…": "In attesa di altri partecipanti…",
|
||||
"Yes, join call": "Sì, entra in chiamata",
|
||||
"You were disconnected from the call": "Sei stato disconnesso dalla chiamata",
|
||||
"Your feedback": "Il tuo commento",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, la chiamata è terminata.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>Puoi revocare il consenso deselezionando questa casella. Se attualmente sei in una chiamata, avrà effetto al termine di essa.",
|
||||
"<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>": "<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>",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Se stai riscontrando problemi o semplicemente vuoi dare un'opinione, inviaci una breve descrizione qua sotto.",
|
||||
"Not now, return to home screen": "Non ora, torna alla schermata principale",
|
||||
"Submitting…": "Invio…",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Un altro utente in questa chiamata sta avendo problemi. Per diagnosticare meglio questi problemi, vorremmo raccogliere un registro di debug.",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Cliccando \"Entra in chiamata ora\", accetti il nostro <2>accordo di licenza con l'utente finale (EULA)</2>",
|
||||
"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 <5>Cookie Policy</5>.": "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>.",
|
||||
"You": "Tu",
|
||||
"Continue in browser": "Continua nel browser",
|
||||
"Mute microphone": "Spegni il microfono",
|
||||
"Select app": "Seleziona app",
|
||||
"Name of call": "Nome della chiamata",
|
||||
"Open in the app": "Apri nell'app",
|
||||
"Ready to join?": "Tutto pronto per entrare?",
|
||||
"Start video": "Avvia video",
|
||||
"Stop video": "Ferma video",
|
||||
"Unmute microphone": "Riaccendi il microfono",
|
||||
"Back to recents": "Torna ai recenti",
|
||||
"Start new call": "Inizia una nuova chiamata",
|
||||
"Call not found": "Chiamata non trovata",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Le chiamate ora sono cifrate end-to-end e devono essere create dalla pagina principale. Ciò assicura che chiunque usi la stessa chiave di crittografia.",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Il tuo browser non supporta la crittografia end-to-end dei media. I browser supportati sono Chrome, Safari, Firefox >=117",
|
||||
"Copy link": "Copia collegamento",
|
||||
"Invite": "Invita",
|
||||
"Invite to this call": "Invita a questa chiamata",
|
||||
"Participants": "Partecipanti",
|
||||
"Link copied to clipboard": "Collegamento copiato negli appunti"
|
||||
"a11y": {
|
||||
"user_menu": "Menu utente"
|
||||
},
|
||||
"action": {
|
||||
"close": "Chiudi",
|
||||
"copy": "Copia",
|
||||
"copy_link": "Copia collegamento",
|
||||
"go": "Vai",
|
||||
"invite": "Invita",
|
||||
"register": "Registra",
|
||||
"remove": "Rimuovi",
|
||||
"sign_in": "Accedi",
|
||||
"sign_out": "Disconnetti",
|
||||
"submit": "Invia"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "Il tuo browser non supporta la crittografia end-to-end dei media. I browser supportati sono Chrome, Safari, Firefox >=117",
|
||||
"call_ended_view": {
|
||||
"body": "Sei stato disconnesso dalla chiamata",
|
||||
"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>",
|
||||
"feedback_done": "<0>Grazie per la tua opinione!</0>",
|
||||
"feedback_prompt": "<0>Vorremmo sapere la tua opinione in modo da migliorare l'esperienza.</0>",
|
||||
"headline": "{{displayName}}, la chiamata è terminata.",
|
||||
"not_now_button": "Non ora, torna alla schermata principale",
|
||||
"reconnect_button": "Riconnetti",
|
||||
"survey_prompt": "Com'è andata?"
|
||||
},
|
||||
"call_name": "Nome della chiamata",
|
||||
"common": {
|
||||
"camera": "Fotocamera",
|
||||
"copied": "Copiato!",
|
||||
"display_name": "Il tuo nome",
|
||||
"encrypted": "Cifrata",
|
||||
"home": "Pagina iniziale",
|
||||
"loading": "Caricamento…",
|
||||
"microphone": "Microfono",
|
||||
"profile": "Profilo",
|
||||
"settings": "Impostazioni",
|
||||
"unencrypted": "Non cifrata",
|
||||
"username": "Nome utente"
|
||||
},
|
||||
"disconnected_banner": "La connessione al server è stata persa.",
|
||||
"exit_fullscreen_button_label": "Esci da schermo intero",
|
||||
"full_screen_view_description": "<0>L'invio di registri di debug ci aiuterà ad individuare il problema.</0>",
|
||||
"full_screen_view_h1": "<0>Ops, qualcosa è andato storto.</0>",
|
||||
"fullscreen_button_label": "Schermo intero",
|
||||
"group_call_loader_failed_heading": "Chiamata non trovata",
|
||||
"group_call_loader_failed_text": "Le chiamate ora sono cifrate end-to-end e devono essere create dalla pagina principale. Ciò assicura che chiunque usi la stessa chiave di crittografia.",
|
||||
"hangup_button_label": "Termina chiamata",
|
||||
"header_label": "Inizio di Element Call",
|
||||
"header_participants_label": "Partecipanti",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Collegamento copiato negli appunti",
|
||||
"title": "Invita a questa chiamata"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Sì, entra in chiamata",
|
||||
"text": "Questa chiamata esiste già, vuoi entrare?",
|
||||
"title": "Entrare in una chiamata esistente?"
|
||||
},
|
||||
"layout_grid_label": "Griglia",
|
||||
"layout_spotlight_label": "In primo piano",
|
||||
"lobby": {
|
||||
"join_button": "Entra in chiamata",
|
||||
"leave_button": "Torna ai recenti"
|
||||
},
|
||||
"local_volume_label": "Volume locale",
|
||||
"logging_in": "Accesso…",
|
||||
"login_auth_links": "<0>Crea un profilo</0> o <2>Accedi come ospite</2>",
|
||||
"login_title": "Accedi",
|
||||
"microphone_off": "Microfono spento",
|
||||
"microphone_on": "Microfono acceso",
|
||||
"mute_microphone_button_label": "Spegni il microfono",
|
||||
"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.",
|
||||
"title": "Richiesta registro di debug"
|
||||
},
|
||||
"rageshake_send_logs": "Invia registri di debug",
|
||||
"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": {
|
||||
"passwords_must_match": "Le password devono coincidere",
|
||||
"registering": "Registrazione…"
|
||||
},
|
||||
"register_auth_links": "<0>Hai già un profilo?</0><1><0>Accedi</0> o <2>Accedi come ospite</2></1>",
|
||||
"register_confirm_password_label": "Conferma password",
|
||||
"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_join_button": "Entra in chiamata ora",
|
||||
"screenshare_button_label": "Condividi schermo",
|
||||
"select_input_unset_button": "Seleziona un'opzione",
|
||||
"settings": {
|
||||
"developer_settings_label": "Impostazioni per sviluppatori",
|
||||
"developer_settings_label_description": "Mostra le impostazioni per sviluppatori nella finestra delle impostazioni.",
|
||||
"developer_tab_title": "Sviluppatore",
|
||||
"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!",
|
||||
"more_tab_title": "Altro",
|
||||
"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.",
|
||||
"show_connection_stats_label": "Mostra statistiche connessione",
|
||||
"speaker_device_selection_label": "Altoparlante"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} stelle",
|
||||
"star_rating_input_label_other": "{{count}} stelle",
|
||||
"start_new_call": "Inizia una nuova chiamata",
|
||||
"start_video_button_label": "Avvia video",
|
||||
"stop_screenshare_button_label": "Condivisione schermo",
|
||||
"stop_video_button_label": "Ferma video",
|
||||
"submitting": "Invio…",
|
||||
"unauthenticated_view_body": "Non hai ancora un profilo? <2>Creane uno</2>",
|
||||
"unauthenticated_view_eula_caption": "Cliccando \"Vai\", accetti il nostro <2>accordo di licenza con l'utente finale (EULA)</2>",
|
||||
"unauthenticated_view_login_button": "Accedi al tuo profilo",
|
||||
"unmute_microphone_button_label": "Riaccendi il microfono",
|
||||
"version": "Versione: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} sta presentando",
|
||||
"sfu_participant_local": "Tu"
|
||||
},
|
||||
"waiting_for_participants": "In attesa di altri partecipanti…"
|
||||
}
|
||||
|
||||
@@ -1,57 +1,75 @@
|
||||
{
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>既にアカウントをお持ちですか?</0><1><0>ログイン</0>または<2>ゲストとしてアクセス</2></1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>アカウントを作成</0>または<2>ゲストとしてアクセス</2>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>何かがうまく行きませんでした。</0>",
|
||||
"Camera": "カメラ",
|
||||
"Avatar": "アバター",
|
||||
"Audio": "音声",
|
||||
"Confirm password": "パスワードを確認",
|
||||
"Close": "閉じる",
|
||||
"Copied!": "コピーしました!",
|
||||
"Copy": "コピー",
|
||||
"Create account": "アカウントを作成",
|
||||
"Go": "続行",
|
||||
"Element Call Home": "Element Call ホーム",
|
||||
"Display name": "表示名",
|
||||
"Developer": "開発者",
|
||||
"Full screen": "全画面表示",
|
||||
"Exit full screen": "全画面表示を終了",
|
||||
"Include debug logs": "デバッグログを含める",
|
||||
"Home": "ホーム",
|
||||
"Join existing call?": "既存の通話に参加しますか?",
|
||||
"Join call now": "今すぐ通話に参加",
|
||||
"Join call": "通話に参加",
|
||||
"Not registered yet? <2>Create an account</2>": "アカウントがありませんか? <2>アカウントを作成</2>",
|
||||
"Microphone": "マイク",
|
||||
"Login": "ログイン",
|
||||
"Logging in…": "ログインしています…",
|
||||
"Loading…": "読み込んでいます…",
|
||||
"Version: {{version}}": "バージョン:{{version}}",
|
||||
"Username": "ユーザー名",
|
||||
"User menu": "ユーザーメニュー",
|
||||
"Submit feedback": "フィードバックを送信",
|
||||
"Spotlight": "スポットライト",
|
||||
"Send debug logs": "デバッグログを送信",
|
||||
"Sign out": "サインアウト",
|
||||
"Sign in": "サインイン",
|
||||
"Share screen": "画面共有",
|
||||
"Settings": "設定",
|
||||
"Sending…": "送信しています…",
|
||||
"Sending debug logs…": "デバッグログを送信しています…",
|
||||
"Return to home screen": "ホーム画面に戻る",
|
||||
"Registering…": "登録しています…",
|
||||
"Register": "登録",
|
||||
"Profile": "プロフィール",
|
||||
"Passwords must match": "パスワードが一致する必要があります",
|
||||
"Password": "パスワード",
|
||||
"Speaker": "スピーカー",
|
||||
"Video": "ビデオ",
|
||||
"Waiting for other participants…": "他の参加者を待機しています…",
|
||||
"Yes, join call": "はい、通話に参加",
|
||||
"Select an option": "オプションを選択",
|
||||
"Debug log request": "デバッグログを要求",
|
||||
"Login to your account": "アカウントにログイン",
|
||||
"Remove": "削除",
|
||||
"No": "いいえ",
|
||||
"This call already exists, would you like to join?": "この通話は既に存在します。参加しますか?"
|
||||
"a11y": {
|
||||
"user_menu": "ユーザーメニュー"
|
||||
},
|
||||
"action": {
|
||||
"close": "閉じる",
|
||||
"copy": "コピー",
|
||||
"go": "続行",
|
||||
"no": "いいえ",
|
||||
"register": "登録",
|
||||
"remove": "削除",
|
||||
"sign_in": "サインイン",
|
||||
"sign_out": "サインアウト"
|
||||
},
|
||||
"call_ended_view": {
|
||||
"create_account_button": "アカウントを作成"
|
||||
},
|
||||
"common": {
|
||||
"audio": "音声",
|
||||
"avatar": "アバター",
|
||||
"camera": "カメラ",
|
||||
"copied": "コピーしました!",
|
||||
"display_name": "表示名",
|
||||
"home": "ホーム",
|
||||
"loading": "読み込んでいます…",
|
||||
"microphone": "マイク",
|
||||
"password": "パスワード",
|
||||
"profile": "プロフィール",
|
||||
"settings": "設定",
|
||||
"username": "ユーザー名",
|
||||
"video": "ビデオ"
|
||||
},
|
||||
"exit_fullscreen_button_label": "全画面表示を終了",
|
||||
"full_screen_view_h1": "<0>何かがうまく行きませんでした。</0>",
|
||||
"fullscreen_button_label": "全画面表示",
|
||||
"header_label": "Element Call ホーム",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "はい、通話に参加",
|
||||
"text": "この通話は既に存在します。参加しますか?",
|
||||
"title": "既存の通話に参加しますか?"
|
||||
},
|
||||
"layout_spotlight_label": "スポットライト",
|
||||
"lobby": {
|
||||
"join_button": "通話に参加"
|
||||
},
|
||||
"logging_in": "ログインしています…",
|
||||
"login_auth_links": "<0>アカウントを作成</0>または<2>ゲストとしてアクセス</2>",
|
||||
"login_title": "ログイン",
|
||||
"rageshake_request_modal": {
|
||||
"title": "デバッグログを要求"
|
||||
},
|
||||
"rageshake_send_logs": "デバッグログを送信",
|
||||
"rageshake_sending": "送信しています…",
|
||||
"rageshake_sending_logs": "デバッグログを送信しています…",
|
||||
"register": {
|
||||
"passwords_must_match": "パスワードが一致する必要があります",
|
||||
"registering": "登録しています…"
|
||||
},
|
||||
"register_auth_links": "<0>既にアカウントをお持ちですか?</0><1><0>ログイン</0>または<2>ゲストとしてアクセス</2></1>",
|
||||
"register_confirm_password_label": "パスワードを確認",
|
||||
"return_home_button": "ホーム画面に戻る",
|
||||
"room_auth_view_join_button": "今すぐ通話に参加",
|
||||
"screenshare_button_label": "画面共有",
|
||||
"select_input_unset_button": "オプションを選択",
|
||||
"settings": {
|
||||
"developer_tab_title": "開発者",
|
||||
"feedback_tab_h4": "フィードバックを送信",
|
||||
"feedback_tab_send_logs_label": "デバッグログを含める",
|
||||
"speaker_device_selection_label": "スピーカー"
|
||||
},
|
||||
"unauthenticated_view_body": "アカウントがありませんか? <2>アカウントを作成</2>",
|
||||
"unauthenticated_view_login_button": "アカウントにログイン",
|
||||
"version": "バージョン:{{version}}",
|
||||
"waiting_for_participants": "他の参加者を待機しています…"
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": ""
|
||||
}
|
||||
@@ -1,91 +1,110 @@
|
||||
{
|
||||
"{{count}} stars|one": "{{count}} zvaigzne",
|
||||
"{{count}} stars|other": "{{count}} zvaigznes",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Jau ir konts?</0><1><0>Pieteikties</0> vai <2>Piekļūt kā viesim</2></1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Izveidot kontu</0> vai <2>Piekļūt kā viesim</2>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Ak vai, kaut kas nogāja greizi!</0>",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Atkļūdošanas žurnāla ierakstu iesūtīšana palīdzēs mums atklāt nepilnību.</0>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Mums patiktu saņemt Tavu atsauksmi, lai mēs varētu uzlabot Tavu pieredzi.</0>",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Paldies par atsauksmi!</0>",
|
||||
"Audio": "Skaņa",
|
||||
"Avatar": "Attēls",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Klikšķināšana uz \"Aiziet\" apliecina piekrišanu mūsu <2>galalietotāja licencēšanas nolīgumam (GLLN)</2>",
|
||||
"Camera": "Kamera",
|
||||
"Close": "Aizvērt",
|
||||
"Confirm password": "Apstiprināt paroli",
|
||||
"Connectivity to the server has been lost.": "Ir zaudēts savienojums ar serveri.",
|
||||
"Copied!": "Ievietots starpliktuvē.",
|
||||
"Copy": "Ievietot starpliktuvē",
|
||||
"Create account": "Izveidot kontu",
|
||||
"Debug log request": "Atkļūdošanas žurnāla pieprasījums",
|
||||
"Developer": "Izstrādātājs",
|
||||
"Developer Settings": "Izstrādātāja iestatījumi",
|
||||
"Display name": "Attēlojamais vārds",
|
||||
"Element Call Home": "Element Call sākums",
|
||||
"Exit full screen": "Iziet no pilnekrāna",
|
||||
"Expose developer settings in the settings window.": "Izstādīt izstrādātāja iestatījumus iestatījumu logā.",
|
||||
"Feedback": "Atsauksmes",
|
||||
"Full screen": "Pilnekrāns",
|
||||
"Go": "Aiziet",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Klikšķināšana uz \"Pievienoties zvanam tagad\" apliecina piekrišanu mūsu <2>galalietotāja licencēšanas nolīgumam (GLLN)</2>",
|
||||
"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 <5>Cookie Policy</5>.": "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>.",
|
||||
"{{displayName}} is presenting": "{{displayName}} uzstājas",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, Tavs zvans ir beidzies.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<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.",
|
||||
"<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>": "<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>",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Citam lietotājam šajā zvanā ir sarežģījumi. Lai labāk atklātu šīs nepilnības, mēs gribētu iegūt atkļūdošanas žurnālu.",
|
||||
"Home": "Sākums",
|
||||
"Waiting for other participants…": "Gaida citus dalībniekus…",
|
||||
"Yes, join call": "Jā, pievienoties zvanam",
|
||||
"Your feedback": "Tava atsauksme",
|
||||
"How did it go?": "Kā Tev veicās?",
|
||||
"Include debug logs": "Iekļaut atkļūdošanas žurnāla ierakstus",
|
||||
"Join call": "Pievienoties zvanam",
|
||||
"Join call now": "Pievienoties zvanam tagad",
|
||||
"Join existing call?": "Pievienoties esošam zvanam?",
|
||||
"Loading…": "Lādējas…",
|
||||
"Local volume": "Vietējais skaļums",
|
||||
"Logging in…": "Piesakās…",
|
||||
"Login": "Pieteikties",
|
||||
"Login to your account": "Pieteikties kontā",
|
||||
"Microphone": "Mikrofons",
|
||||
"More": "Vairāk",
|
||||
"No": "Nē",
|
||||
"Not now, return to home screen": "Ne tagad, atgriezties sākuma ekrānā",
|
||||
"Password": "Parole",
|
||||
"Passwords must match": "Parolēm ir jāsakrīt",
|
||||
"Profile": "Profils",
|
||||
"Recaptcha dismissed": "ReCaptcha atmesta",
|
||||
"Recaptcha not loaded": "ReCaptcha nav ielādēta",
|
||||
"Reconnect": "Atkārtoti savienoties",
|
||||
"Register": "Reģistrēties",
|
||||
"Registering…": "Reģistrē…",
|
||||
"Remove": "Noņemt",
|
||||
"Retry sending logs": "Atkārtoti mēģināt žurnāla ierakstu nosūtīšanu",
|
||||
"Return to home screen": "Atgriezties sākuma ekrānā",
|
||||
"Select an option": "Atlasīt iespēju",
|
||||
"Send debug logs": "Nosūtīt atkļūdošanas žurnāla ierakstus",
|
||||
"Sending debug logs…": "Nosūta atkļūdošanas žurnāla ierakstus…",
|
||||
"Sending…": "Nosūta…",
|
||||
"Settings": "Iestatījumi",
|
||||
"Share screen": "Kopīgot ekrānu",
|
||||
"Show connection stats": "Rādīt savienojuma apkopojumu",
|
||||
"Sign in": "Pieteikties",
|
||||
"Sign out": "Atteikties",
|
||||
"Speaker": "Runātājs",
|
||||
"Spotlight": "Starmešu gaisma",
|
||||
"Submit": "Iesniegt",
|
||||
"Submit feedback": "Iesniegt atsauksmi",
|
||||
"Submitting…": "Iesniedz…",
|
||||
"Thanks, we received your feedback!": "Paldies, mēs saņēmām atsauksmi!",
|
||||
"Thanks!": "Paldies!",
|
||||
"This call already exists, would you like to join?": "Šis zvans jau pastāv. Vai vēlies pievienoties?",
|
||||
"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>": "Š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>",
|
||||
"User menu": "Lietotāja izvēlne",
|
||||
"Username": "Lietotājvārds",
|
||||
"Video": "Video",
|
||||
"You were disconnected from the call": "Tu tiki atvienots no zvana",
|
||||
"Version: {{version}}": "Versija: {{version}}",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Ja tiek piedzīvoti sarežģījumi vai vienkārši ir vēlme sniegt kādu atsauksmi, lūgums zemāk nosūtīt mums īsu aprakstu.",
|
||||
"Not registered yet? <2>Create an account</2>": "Vēl neesi reģistrējies? <2>Izveidot kontu</2>"
|
||||
"a11y": {
|
||||
"user_menu": "Lietotāja izvēlne"
|
||||
},
|
||||
"action": {
|
||||
"close": "Aizvērt",
|
||||
"copy": "Ievietot starpliktuvē",
|
||||
"go": "Aiziet",
|
||||
"no": "Nē",
|
||||
"register": "Reģistrēties",
|
||||
"remove": "Noņemt",
|
||||
"sign_in": "Pieteikties",
|
||||
"sign_out": "Atteikties",
|
||||
"submit": "Iesniegt"
|
||||
},
|
||||
"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>.",
|
||||
"call_ended_view": {
|
||||
"body": "Tu tiki atvienots no zvana",
|
||||
"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>",
|
||||
"feedback_done": "<0>Paldies par atsauksmi!</0>",
|
||||
"feedback_prompt": "<0>Mums patiktu saņemt Tavu atsauksmi, lai mēs varētu uzlabot Tavu pieredzi.</0>",
|
||||
"headline": "{{displayName}}, Tavs zvans ir beidzies.",
|
||||
"not_now_button": "Ne tagad, atgriezties sākuma ekrānā",
|
||||
"reconnect_button": "Atkārtoti savienoties",
|
||||
"survey_prompt": "Kā Tev veicās?"
|
||||
},
|
||||
"common": {
|
||||
"audio": "Skaņa",
|
||||
"avatar": "Attēls",
|
||||
"camera": "Kamera",
|
||||
"copied": "Ievietots starpliktuvē.",
|
||||
"display_name": "Attēlojamais vārds",
|
||||
"home": "Sākums",
|
||||
"loading": "Lādējas…",
|
||||
"microphone": "Mikrofons",
|
||||
"password": "Parole",
|
||||
"profile": "Profils",
|
||||
"settings": "Iestatījumi",
|
||||
"username": "Lietotājvārds"
|
||||
},
|
||||
"disconnected_banner": "Ir zaudēts savienojums ar serveri.",
|
||||
"exit_fullscreen_button_label": "Iziet no pilnekrāna",
|
||||
"full_screen_view_description": "<0>Atkļūdošanas žurnāla ierakstu iesūtīšana palīdzēs mums atklāt nepilnību.</0>",
|
||||
"full_screen_view_h1": "<0>Ak vai, kaut kas nogāja greizi!</0>",
|
||||
"fullscreen_button_label": "Pilnekrāns",
|
||||
"header_label": "Element Call sākums",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Jā, pievienoties zvanam",
|
||||
"text": "Šis zvans jau pastāv. Vai vēlies pievienoties?",
|
||||
"title": "Pievienoties esošam zvanam?"
|
||||
},
|
||||
"layout_spotlight_label": "Starmešu gaisma",
|
||||
"lobby": {
|
||||
"join_button": "Pievienoties zvanam"
|
||||
},
|
||||
"local_volume_label": "Vietējais skaļums",
|
||||
"logging_in": "Piesakās…",
|
||||
"login_auth_links": "<0>Izveidot kontu</0> vai <2>Piekļūt kā viesim</2>",
|
||||
"login_title": "Pieteikties",
|
||||
"rageshake_button_error_caption": "Atkārtoti mēģināt žurnāla ierakstu nosūtīšanu",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Citam lietotājam šajā zvanā ir sarežģījumi. Lai labāk atklātu šīs nepilnības, mēs gribētu iegūt atkļūdošanas žurnālu.",
|
||||
"title": "Atkļūdošanas žurnāla pieprasījums"
|
||||
},
|
||||
"rageshake_send_logs": "Nosūtīt atkļūdošanas žurnāla ierakstus",
|
||||
"rageshake_sending": "Nosūta…",
|
||||
"rageshake_sending_logs": "Nosūta atkļūdošanas žurnāla ierakstus…",
|
||||
"rageshake_sent": "Paldies!",
|
||||
"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",
|
||||
"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>",
|
||||
"register_confirm_password_label": "Apstiprināt paroli",
|
||||
"return_home_button": "Atgriezties sākuma ekrānā",
|
||||
"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_join_button": "Pievienoties zvanam tagad",
|
||||
"screenshare_button_label": "Kopīgot ekrānu",
|
||||
"select_input_unset_button": "Atlasīt iespēju",
|
||||
"settings": {
|
||||
"developer_settings_label": "Izstrādātāja iestatījumi",
|
||||
"developer_settings_label_description": "Izstādīt izstrādātāja iestatījumus iestatījumu logā.",
|
||||
"developer_tab_title": "Izstrādātājs",
|
||||
"feedback_tab_body": "Ja tiek piedzīvoti sarežģījumi vai vienkārši ir vēlme sniegt kādu atsauksmi, lūgums zemāk nosūtīt mums īsu aprakstu.",
|
||||
"feedback_tab_description_label": "Tava atsauksme",
|
||||
"feedback_tab_h4": "Iesniegt atsauksmi",
|
||||
"feedback_tab_send_logs_label": "Iekļaut atkļūdošanas žurnāla ierakstus",
|
||||
"feedback_tab_thank_you": "Paldies, mēs saņēmām atsauksmi!",
|
||||
"feedback_tab_title": "Atsauksmes",
|
||||
"more_tab_title": "Vairāk",
|
||||
"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.",
|
||||
"show_connection_stats_label": "Rādīt savienojuma apkopojumu",
|
||||
"speaker_device_selection_label": "Runātājs"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} zvaigzne",
|
||||
"star_rating_input_label_other": "{{count}} zvaigznes",
|
||||
"submitting": "Iesniedz…",
|
||||
"unauthenticated_view_body": "Vēl neesi reģistrējies? <2>Izveidot kontu</2>",
|
||||
"unauthenticated_view_eula_caption": "Klikšķināšana uz \"Aiziet\" apliecina piekrišanu mūsu <2>galalietotāja licencēšanas nolīgumam (GLLN)</2>",
|
||||
"unauthenticated_view_login_button": "Pieteikties kontā",
|
||||
"version": "Versija: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} uzstājas"
|
||||
},
|
||||
"waiting_for_participants": "Gaida citus dalībniekus…"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,142 @@
|
||||
{
|
||||
"Login": "Zaloguj się",
|
||||
"Go": "Przejdź",
|
||||
"Yes, join call": "Tak, dołącz do połączenia",
|
||||
"Waiting for other participants…": "Oczekiwanie na pozostałych uczestników…",
|
||||
"Video": "Wideo",
|
||||
"Version: {{version}}": "Wersja: {{version}}",
|
||||
"Username": "Nazwa użytkownika",
|
||||
"User menu": "Menu użytkownika",
|
||||
"This call already exists, would you like to join?": "Te połączenie już istnieje, czy chcesz do niego dołączyć?",
|
||||
"Submit feedback": "Prześlij opinię",
|
||||
"Spotlight": "Centrum uwagi",
|
||||
"Speaker": "Głośnik",
|
||||
"Sign out": "Wyloguj się",
|
||||
"Sign in": "Zaloguj się",
|
||||
"Share screen": "Udostępnij ekran",
|
||||
"Settings": "Ustawienia",
|
||||
"Sending…": "Wysyłanie…",
|
||||
"Sending debug logs…": "Wysyłanie dzienników debugowania…",
|
||||
"Send debug logs": "Wyślij dzienniki debugowania",
|
||||
"Select an option": "Wybierz opcję",
|
||||
"Return to home screen": "Powróć do strony głównej",
|
||||
"Remove": "Usuń",
|
||||
"Registering…": "Rejestrowanie…",
|
||||
"Register": "Zarejestruj",
|
||||
"Recaptcha not loaded": "Recaptcha nie została załadowana",
|
||||
"Recaptcha dismissed": "Recaptcha odrzucona",
|
||||
"Profile": "Profil",
|
||||
"Passwords must match": "Hasła muszą pasować",
|
||||
"Password": "Hasło",
|
||||
"Not registered yet? <2>Create an account</2>": "Nie masz konta? <2>Utwórz je</2>",
|
||||
"Not now, return to home screen": "Nie teraz, powróć do ekranu domowego",
|
||||
"No": "Nie",
|
||||
"More": "Więcej",
|
||||
"Microphone": "Mikrofon",
|
||||
"Login to your account": "Zaloguj się do swojego konta",
|
||||
"Logging in…": "Logowanie…",
|
||||
"Local volume": "Głośność lokalna",
|
||||
"Loading…": "Ładowanie…",
|
||||
"Join existing call?": "Dołączyć do istniejącego połączenia?",
|
||||
"Join call now": "Dołącz do połączenia teraz",
|
||||
"Join call": "Dołącz do połączenia",
|
||||
"Include debug logs": "Dołącz dzienniki debugowania",
|
||||
"Home": "Strona domowa",
|
||||
"Full screen": "Pełny ekran",
|
||||
"Exit full screen": "Opuść pełny ekran",
|
||||
"Display name": "Nazwa wyświetlana",
|
||||
"Developer": "Programista",
|
||||
"Debug log request": "Prośba o dzienniki debugowania",
|
||||
"Create account": "Utwórz konto",
|
||||
"Copied!": "Skopiowano!",
|
||||
"Confirm password": "Potwierdź hasło",
|
||||
"Close": "Zamknij",
|
||||
"Camera": "Kamera",
|
||||
"Avatar": "Awatar",
|
||||
"Audio": "Dźwięk",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Inny użytkownik w tym połączeniu napotkał problem. Aby lepiej zdiagnozować tę usterkę, chcielibyśmy zebrać dzienniki debugowania.",
|
||||
"<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>": "<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>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Utwórz konto</0> lub <2>Dołącz jako gość</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Masz już konto?</0><1><0>Zaloguj się</0> lub <2>Dołącz jako gość</2></1>",
|
||||
"Copy": "Kopiuj",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Wysłanie dzienników debuggowania pomoże nam ustalić przyczynę problemu.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Ojej, coś poszło nie tak.</0>",
|
||||
"Expose developer settings in the settings window.": "Wyświetl opcje programisty w oknie ustawień.",
|
||||
"Element Call Home": "Strona główna Element Call",
|
||||
"Developer Settings": "Opcje programisty",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<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.",
|
||||
"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 <5>Cookie Policy</5>.": "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>.",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Jeśli posiadasz problemy lub chciałbyś zgłosić swoją opinię, wyślij nam krótki opis.",
|
||||
"Thanks, we received your feedback!": "Dziękujemy, otrzymaliśmy Twoją opinię!",
|
||||
"Feedback": "Opinia użytkownika",
|
||||
"Submitting…": "Wysyłanie…",
|
||||
"Submit": "Wyślij",
|
||||
"Your feedback": "Twoje opinie",
|
||||
"{{count}} stars|other": "{{count}} gwiazdki",
|
||||
"{{count}} stars|one": "{{count}} gwiazdki",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, Twoje połączenie zostało zakończone.",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Dziękujemy za Twoją opinię!</0>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Z przyjemnością wysłuchamy Twojej opinii, aby poprawić Twoje doświadczenia.</0>",
|
||||
"How did it go?": "Jak poszło?",
|
||||
"{{displayName}} is presenting": "{{displayName}} prezentuje",
|
||||
"Show connection stats": "Pokaż statystyki połączenia",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Klikając \"Przejdź\", zgadzasz się na naszą <2>Umowę licencyjną (EULA)</2>",
|
||||
"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>": "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>",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Klikając \"Dołącz teraz do rozmowy\", zgadzasz się na naszą <2>Umowę licencyjną (EULA)</2>",
|
||||
"Retry sending logs": "Wyślij logi ponownie",
|
||||
"Thanks!": "Dziękujemy!",
|
||||
"You were disconnected from the call": "Rozłączono Cię z połączenia",
|
||||
"Connectivity to the server has been lost.": "Utracono połączenie z serwerem.",
|
||||
"Reconnect": "Połącz ponownie",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"Encrypted": "Szyfrowane",
|
||||
"End call": "Zakończ połączenie",
|
||||
"Grid": "Siatka",
|
||||
"Microphone off": "Mikrofon wyłączony",
|
||||
"Microphone on": "Mikrofon włączony",
|
||||
"Not encrypted": "Nie szyfrowane",
|
||||
"Sharing screen": "Udostępnianie ekranu",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"Continue in browser": "Kontynuuj w przeglądarce",
|
||||
"Mute microphone": "Wycisz mikrofon",
|
||||
"Name of call": "Nazwa połączenia",
|
||||
"Open in the app": "Otwórz w aplikacji",
|
||||
"Ready to join?": "Gotowy, by dołączyć?",
|
||||
"Select app": "Wybierz aplikację",
|
||||
"Start new call": "Rozpocznij nowe połączenie",
|
||||
"Start video": "Rozpocznij wideo",
|
||||
"Back to recents": "Wróć do ostatnie",
|
||||
"Stop video": "Zakończ wideo",
|
||||
"Unmute microphone": "Odcisz mikrofon",
|
||||
"Call not found": "Nie znaleziono połączenia",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Połączenia są teraz szyfrowane end-to-end i muszą zostać utworzone ze strony głównej. Pomaga to upewnić się, że każdy korzysta z tego samego klucza szyfrującego.",
|
||||
"You": "Ty",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Twoja przeglądarka nie wspiera szyfrowania end-to-end. Wspierane przeglądarki to Chrome, Safari, Firefox >=117",
|
||||
"Invite": "Zaproś",
|
||||
"Link copied to clipboard": "Skopiowano link do schowka",
|
||||
"Participants": "Uczestnicy",
|
||||
"Copy link": "Kopiuj link",
|
||||
"Invite to this call": "Zaproś do połączenia"
|
||||
"a11y": {
|
||||
"user_menu": "Menu użytkownika"
|
||||
},
|
||||
"action": {
|
||||
"close": "Zamknij",
|
||||
"copy": "Kopiuj",
|
||||
"copy_link": "Kopiuj link",
|
||||
"go": "Przejdź",
|
||||
"invite": "Zaproś",
|
||||
"no": "Nie",
|
||||
"register": "Zarejestruj",
|
||||
"remove": "Usuń",
|
||||
"sign_in": "Zaloguj się",
|
||||
"sign_out": "Wyloguj się",
|
||||
"submit": "Wyślij"
|
||||
},
|
||||
"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ę"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "Twoja przeglądarka nie wspiera szyfrowania end-to-end. Wspierane przeglądarki to Chrome, Safari, Firefox >=117",
|
||||
"call_ended_view": {
|
||||
"body": "Rozłączono Cię z połączenia",
|
||||
"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>",
|
||||
"feedback_done": "<0>Dziękujemy za Twoją opinię!</0>",
|
||||
"feedback_prompt": "<0>Z przyjemnością wysłuchamy Twojej opinii, aby poprawić Twoje doświadczenia.</0>",
|
||||
"headline": "{{displayName}}, Twoje połączenie zostało zakończone.",
|
||||
"not_now_button": "Nie teraz, powróć do ekranu domowego",
|
||||
"reconnect_button": "Połącz ponownie",
|
||||
"survey_prompt": "Jak poszło?"
|
||||
},
|
||||
"call_name": "Nazwa połączenia",
|
||||
"common": {
|
||||
"audio": "Dźwięk",
|
||||
"avatar": "Awatar",
|
||||
"camera": "Kamera",
|
||||
"copied": "Skopiowano!",
|
||||
"display_name": "Nazwa wyświetlana",
|
||||
"encrypted": "Szyfrowane",
|
||||
"home": "Strona domowa",
|
||||
"loading": "Ładowanie…",
|
||||
"microphone": "Mikrofon",
|
||||
"password": "Hasło",
|
||||
"profile": "Profil",
|
||||
"settings": "Ustawienia",
|
||||
"unencrypted": "Nie szyfrowane",
|
||||
"username": "Nazwa użytkownika",
|
||||
"video": "Wideo"
|
||||
},
|
||||
"disconnected_banner": "Utracono połączenie z serwerem.",
|
||||
"exit_fullscreen_button_label": "Opuść pełny ekran",
|
||||
"full_screen_view_description": "<0>Wysłanie dzienników debuggowania pomoże nam ustalić przyczynę problemu.</0>",
|
||||
"full_screen_view_h1": "<0>Ojej, coś poszło nie tak.</0>",
|
||||
"fullscreen_button_label": "Pełny ekran",
|
||||
"group_call_loader_failed_heading": "Nie znaleziono połączenia",
|
||||
"group_call_loader_failed_text": "Połączenia są teraz szyfrowane end-to-end i muszą zostać utworzone ze strony głównej. Pomaga to upewnić się, że każdy korzysta z tego samego klucza szyfrującego.",
|
||||
"hangup_button_label": "Zakończ połączenie",
|
||||
"header_label": "Strona główna Element Call",
|
||||
"header_participants_label": "Uczestnicy",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Skopiowano link do schowka",
|
||||
"title": "Zaproś do połączenia"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Tak, dołącz do połączenia",
|
||||
"text": "Te połączenie już istnieje, czy chcesz do niego dołączyć?",
|
||||
"title": "Dołączyć do istniejącego połączenia?"
|
||||
},
|
||||
"layout_grid_label": "Siatka",
|
||||
"layout_spotlight_label": "Centrum uwagi",
|
||||
"lobby": {
|
||||
"join_button": "Dołącz do połączenia",
|
||||
"leave_button": "Wróć do ostatnie"
|
||||
},
|
||||
"local_volume_label": "Głośność lokalna",
|
||||
"logging_in": "Logowanie…",
|
||||
"login_auth_links": "<0>Utwórz konto</0> lub <2>Dołącz jako gość</2>",
|
||||
"login_title": "Zaloguj się",
|
||||
"microphone_off": "Mikrofon wyłączony",
|
||||
"microphone_on": "Mikrofon włączony",
|
||||
"mute_microphone_button_label": "Wycisz mikrofon",
|
||||
"rageshake_button_error_caption": "Wyślij logi ponownie",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Inny użytkownik w tym połączeniu napotkał problem. Aby lepiej zdiagnozować tę usterkę, chcielibyśmy zebrać dzienniki debugowania.",
|
||||
"title": "Prośba o dzienniki debugowania"
|
||||
},
|
||||
"rageshake_send_logs": "Wyślij dzienniki debugowania",
|
||||
"rageshake_sending": "Wysyłanie…",
|
||||
"rageshake_sending_logs": "Wysyłanie dzienników debugowania…",
|
||||
"rageshake_sent": "Dziękujemy!",
|
||||
"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",
|
||||
"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>",
|
||||
"register_confirm_password_label": "Potwierdź hasło",
|
||||
"return_home_button": "Powróć do strony głównej",
|
||||
"room_auth_view_eula_caption": "Klikając \"Dołącz teraz do rozmowy\", zgadzasz się na naszą <2>Umowę licencyjną (EULA)</2>",
|
||||
"room_auth_view_join_button": "Dołącz do połączenia teraz",
|
||||
"screenshare_button_label": "Udostępnij ekran",
|
||||
"select_input_unset_button": "Wybierz opcję",
|
||||
"settings": {
|
||||
"developer_settings_label": "Opcje programisty",
|
||||
"developer_settings_label_description": "Wyświetl opcje programisty w oknie ustawień.",
|
||||
"developer_tab_title": "Programista",
|
||||
"feedback_tab_body": "Jeśli posiadasz problemy lub chciałbyś zgłosić swoją opinię, wyślij nam krótki opis.",
|
||||
"feedback_tab_description_label": "Twoje opinie",
|
||||
"feedback_tab_h4": "Prześlij opinię",
|
||||
"feedback_tab_send_logs_label": "Dołącz dzienniki debugowania",
|
||||
"feedback_tab_thank_you": "Dziękujemy, otrzymaliśmy Twoją opinię!",
|
||||
"feedback_tab_title": "Opinia użytkownika",
|
||||
"more_tab_title": "Więcej",
|
||||
"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.",
|
||||
"show_connection_stats_label": "Pokaż statystyki połączenia",
|
||||
"speaker_device_selection_label": "Głośnik"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} gwiazdki",
|
||||
"star_rating_input_label_other": "{{count}} gwiazdki",
|
||||
"start_new_call": "Rozpocznij nowe połączenie",
|
||||
"start_video_button_label": "Rozpocznij wideo",
|
||||
"stop_screenshare_button_label": "Udostępnianie ekranu",
|
||||
"stop_video_button_label": "Zakończ wideo",
|
||||
"submitting": "Wysyłanie…",
|
||||
"unauthenticated_view_body": "Nie masz konta? <2>Utwórz je</2>",
|
||||
"unauthenticated_view_eula_caption": "Klikając \"Przejdź\", zgadzasz się na naszą <2>Umowę licencyjną (EULA)</2>",
|
||||
"unauthenticated_view_login_button": "Zaloguj się do swojego konta",
|
||||
"unmute_microphone_button_label": "Odcisz mikrofon",
|
||||
"version": "Wersja: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} prezentuje",
|
||||
"sfu_participant_local": "Ty"
|
||||
},
|
||||
"waiting_for_participants": "Oczekiwanie na pozostałych uczestników…"
|
||||
}
|
||||
|
||||
@@ -1,83 +1,103 @@
|
||||
{
|
||||
"Register": "Зарегистрироваться",
|
||||
"Registering…": "Регистрация…",
|
||||
"Logging in…": "Вход…",
|
||||
"Waiting for other participants…": "Ожидание других участников…",
|
||||
"This call already exists, would you like to join?": "Этот звонок уже существует, хотите присоединиться?",
|
||||
"Submit feedback": "Отправить отзыв",
|
||||
"Sending debug logs…": "Отправка журнала отладки…",
|
||||
"Select an option": "Выберите вариант",
|
||||
"<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>": "<0>Почему бы не задать пароль, тем самым сохранив аккаунт?</0><1>Так вы можете оставить своё имя и задать аватар для будущих звонков.</1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Создать аккаунт</0> или <2>Зайти как гость</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Уже есть аккаунт?</0><1><0>Войти с ним</0> или <2>Зайти как гость</2></1>",
|
||||
"Yes, join call": "Да, присоединиться",
|
||||
"Video": "Видео",
|
||||
"Version: {{version}}": "Версия: {{version}}",
|
||||
"Username": "Имя пользователя",
|
||||
"User menu": "Меню пользователя",
|
||||
"Spotlight": "Внимание",
|
||||
"Speaker": "Динамик",
|
||||
"Sign out": "Выйти",
|
||||
"Sign in": "Войти",
|
||||
"Share screen": "Поделиться экраном",
|
||||
"Settings": "Настройки",
|
||||
"Sending…": "Отправка…",
|
||||
"Local volume": "Местная громкость",
|
||||
"Include debug logs": "Приложить журнал отладки",
|
||||
"Debug log request": "Запрос журнала отладки",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "У одного из участников звонка есть неполадки. Чтобы лучше диагностировать похожие проблемы, нам нужен журнал отладки.",
|
||||
"Send debug logs": "Отправить журнал отладки",
|
||||
"Return to home screen": "Вернуться в Начало",
|
||||
"Remove": "Удалить",
|
||||
"Recaptcha not loaded": "Невозможно начать проверку",
|
||||
"Recaptcha dismissed": "Проверка не пройдена",
|
||||
"Profile": "Профиль",
|
||||
"Passwords must match": "Пароли должны совпадать",
|
||||
"Password": "Пароль",
|
||||
"Not registered yet? <2>Create an account</2>": "Ещё не зарегистрированы? <2>Создайте аккаунт</2>",
|
||||
"Not now, return to home screen": "Не сейчас, вернуться в Начало",
|
||||
"No": "Нет",
|
||||
"More": "Больше",
|
||||
"Microphone": "Микрофон",
|
||||
"Login to your account": "Войдите в свой аккаунт",
|
||||
"Login": "Вход",
|
||||
"Loading…": "Загрузка…",
|
||||
"Join existing call?": "Присоединиться к существующему звонку?",
|
||||
"Join call now": "Присоединиться сейчас",
|
||||
"Join call": "Присоединиться",
|
||||
"Home": "Начало",
|
||||
"Go": "Далее",
|
||||
"Full screen": "Полноэкранный режим",
|
||||
"Exit full screen": "Выйти из полноэкранного режима",
|
||||
"Display name": "Видимое имя",
|
||||
"Developer": "Разработчику",
|
||||
"Create account": "Создать аккаунт",
|
||||
"Copied!": "Скопировано!",
|
||||
"Confirm password": "Подтвердите пароль",
|
||||
"Close": "Закрыть",
|
||||
"Camera": "Камера",
|
||||
"Avatar": "Аватар",
|
||||
"Audio": "Аудио",
|
||||
"Element Call Home": "Главная Element Call",
|
||||
"Copy": "Копировать",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Отправка журналов поможет нам найти и устранить проблему.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Упс, что-то пошло не так.</0>",
|
||||
"Expose developer settings in the settings window.": "Раскрыть настройки разработчика в окне настроек.",
|
||||
"Developer Settings": "Настройки Разработчика",
|
||||
"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 <5>Cookie Policy</5>.": "Участвуя в этой бета-версии, вы соглашаетесь на сбор анонимных данных, которые мы используем для улучшения продукта. Более подробную информацию о том, какие данные мы отслеживаем, вы можете найти в нашей <2> Политике конфиденциальности</2> и нашей <5> Политике использования файлов cookie</5>.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>Вы можете отозвать согласие, сняв этот флажок. Если вы в данный момент находитесь в разговоре, эта настройка вступит в силу по окончании разговора.",
|
||||
"{{displayName}} is presenting": "{{displayName}} представляет",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Мы будем рады видеть ваши отзывы, чтобы мы могли улучшить ваш опыт.</0>",
|
||||
"Thanks, we received your feedback!": "Спасибо. Мы получили ваш отзыв!",
|
||||
"Feedback": "Отзыв",
|
||||
"Submit": "Отправить",
|
||||
"Submitting…": "Отправляем…",
|
||||
"{{count}} stars|one": "{{count}} отмечен",
|
||||
"{{count}} stars|other": "{{count}} отмеченных",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, ваш звонок окончен.",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Спасибо за обратную связь!</0>",
|
||||
"Your feedback": "Ваш отзыв",
|
||||
"How did it go?": "Как всё прошло?",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Если у вас возникли проблемы или вы просто хотите оставить отзыв, отправьте нам краткое описание ниже.",
|
||||
"Show connection stats": "Показать статистику соединения"
|
||||
"a11y": {
|
||||
"user_menu": "Меню пользователя"
|
||||
},
|
||||
"action": {
|
||||
"close": "Закрыть",
|
||||
"copy": "Копировать",
|
||||
"go": "Далее",
|
||||
"no": "Нет",
|
||||
"register": "Зарегистрироваться",
|
||||
"remove": "Удалить",
|
||||
"sign_in": "Войти",
|
||||
"sign_out": "Выйти",
|
||||
"submit": "Отправить"
|
||||
},
|
||||
"analytics_notice": "Участвуя в этой бета-версии, вы соглашаетесь на сбор анонимных данных, которые мы используем для улучшения продукта. Более подробную информацию о том, какие данные мы отслеживаем, вы можете найти в нашей <2> Политике конфиденциальности</2> и нашей <5> Политике использования файлов cookie</5>.",
|
||||
"call_ended_view": {
|
||||
"create_account_button": "Создать аккаунт",
|
||||
"create_account_prompt": "<0>Почему бы не задать пароль, тем самым сохранив аккаунт?</0><1>Так вы можете оставить своё имя и задать аватар для будущих звонков.</1>",
|
||||
"feedback_done": "<0>Спасибо за обратную связь!</0>",
|
||||
"feedback_prompt": "<0>Мы будем рады видеть ваши отзывы, чтобы мы могли улучшить ваш опыт.</0>",
|
||||
"headline": "{{displayName}}, ваш звонок окончен.",
|
||||
"not_now_button": "Не сейчас, вернуться в Начало",
|
||||
"survey_prompt": "Как всё прошло?"
|
||||
},
|
||||
"common": {
|
||||
"audio": "Аудио",
|
||||
"avatar": "Аватар",
|
||||
"camera": "Камера",
|
||||
"copied": "Скопировано!",
|
||||
"display_name": "Видимое имя",
|
||||
"home": "Начало",
|
||||
"loading": "Загрузка…",
|
||||
"microphone": "Микрофон",
|
||||
"password": "Пароль",
|
||||
"profile": "Профиль",
|
||||
"settings": "Настройки",
|
||||
"username": "Имя пользователя",
|
||||
"video": "Видео"
|
||||
},
|
||||
"exit_fullscreen_button_label": "Выйти из полноэкранного режима",
|
||||
"full_screen_view_description": "<0>Отправка журналов поможет нам найти и устранить проблему.</0>",
|
||||
"full_screen_view_h1": "<0>Упс, что-то пошло не так.</0>",
|
||||
"fullscreen_button_label": "Полноэкранный режим",
|
||||
"header_label": "Главная Element Call",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Да, присоединиться",
|
||||
"text": "Этот звонок уже существует, хотите присоединиться?",
|
||||
"title": "Присоединиться к существующему звонку?"
|
||||
},
|
||||
"layout_spotlight_label": "Внимание",
|
||||
"lobby": {
|
||||
"join_button": "Присоединиться"
|
||||
},
|
||||
"local_volume_label": "Местная громкость",
|
||||
"logging_in": "Вход…",
|
||||
"login_auth_links": "<0>Создать аккаунт</0> или <2>Зайти как гость</2>",
|
||||
"login_title": "Вход",
|
||||
"rageshake_request_modal": {
|
||||
"body": "У одного из участников звонка есть неполадки. Чтобы лучше диагностировать похожие проблемы, нам нужен журнал отладки.",
|
||||
"title": "Запрос журнала отладки"
|
||||
},
|
||||
"rageshake_send_logs": "Отправить журнал отладки",
|
||||
"rageshake_sending": "Отправка…",
|
||||
"rageshake_sending_logs": "Отправка журнала отладки…",
|
||||
"recaptcha_dismissed": "Проверка не пройдена",
|
||||
"recaptcha_not_loaded": "Невозможно начать проверку",
|
||||
"register": {
|
||||
"passwords_must_match": "Пароли должны совпадать",
|
||||
"registering": "Регистрация…"
|
||||
},
|
||||
"register_auth_links": "<0>Уже есть аккаунт?</0><1><0>Войти с ним</0> или <2>Зайти как гость</2></1>",
|
||||
"register_confirm_password_label": "Подтвердите пароль",
|
||||
"return_home_button": "Вернуться в Начало",
|
||||
"room_auth_view_join_button": "Присоединиться сейчас",
|
||||
"screenshare_button_label": "Поделиться экраном",
|
||||
"select_input_unset_button": "Выберите вариант",
|
||||
"settings": {
|
||||
"developer_settings_label": "Настройки Разработчика",
|
||||
"developer_settings_label_description": "Раскрыть настройки разработчика в окне настроек.",
|
||||
"developer_tab_title": "Разработчику",
|
||||
"feedback_tab_body": "Если у вас возникли проблемы или вы просто хотите оставить отзыв, отправьте нам краткое описание ниже.",
|
||||
"feedback_tab_description_label": "Ваш отзыв",
|
||||
"feedback_tab_h4": "Отправить отзыв",
|
||||
"feedback_tab_send_logs_label": "Приложить журнал отладки",
|
||||
"feedback_tab_thank_you": "Спасибо. Мы получили ваш отзыв!",
|
||||
"feedback_tab_title": "Отзыв",
|
||||
"more_tab_title": "Больше",
|
||||
"opt_in_description": "<0></0><1></1>Вы можете отозвать согласие, сняв этот флажок. Если вы в данный момент находитесь в разговоре, эта настройка вступит в силу по окончании разговора.",
|
||||
"show_connection_stats_label": "Показать статистику соединения",
|
||||
"speaker_device_selection_label": "Динамик"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} отмечен",
|
||||
"star_rating_input_label_other": "{{count}} отмеченных",
|
||||
"submitting": "Отправляем…",
|
||||
"unauthenticated_view_body": "Ещё не зарегистрированы? <2>Создайте аккаунт</2>",
|
||||
"unauthenticated_view_login_button": "Войдите в свой аккаунт",
|
||||
"version": "Версия: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} представляет"
|
||||
},
|
||||
"waiting_for_participants": "Ожидание других участников…"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,140 @@
|
||||
{
|
||||
"Spotlight": "Stredobod",
|
||||
"Local volume": "Lokálna hlasitosť",
|
||||
"Include debug logs": "Zahrnúť záznamy o ladení",
|
||||
"Element Call Home": "Domov Element Call",
|
||||
"Waiting for other participants…": "Čaká sa na ďalších účastníkov…",
|
||||
"Submit feedback": "Odoslať spätnú väzbu",
|
||||
"Share screen": "Zdieľať obrazovku",
|
||||
"Sending…": "Odosielanie…",
|
||||
"Sending debug logs…": "Odosielanie záznamov o ladení…",
|
||||
"Send debug logs": "Odoslať záznamy o ladení",
|
||||
"Select an option": "Vyberte možnosť",
|
||||
"Return to home screen": "Návrat na domovskú obrazovku",
|
||||
"Remove": "Odstrániť",
|
||||
"Registering…": "Registrácia…",
|
||||
"Register": "Registrovať sa",
|
||||
"Recaptcha not loaded": "Recaptcha sa nenačítala",
|
||||
"Recaptcha dismissed": "Recaptcha zamietnutá",
|
||||
"Profile": "Profil",
|
||||
"Passwords must match": "Heslá sa musia zhodovať",
|
||||
"Password": "Heslo",
|
||||
"Not registered yet? <2>Create an account</2>": "Ešte nie ste zaregistrovaný? <2>Vytvorte si účet</2>",
|
||||
"Not now, return to home screen": "Teraz nie, vrátiť sa na domovskú obrazovku",
|
||||
"No": "Nie",
|
||||
"More": "Viac",
|
||||
"Microphone": "Mikrofón",
|
||||
"Login to your account": "Prihláste sa do svojho konta",
|
||||
"Login": "Prihlásiť sa",
|
||||
"Logging in…": "Prihlasovanie…",
|
||||
"Loading…": "Načítanie…",
|
||||
"Join existing call?": "Pripojiť sa k existujúcemu hovoru?",
|
||||
"Join call now": "Pripojiť sa k hovoru teraz",
|
||||
"Join call": "Pripojiť sa k hovoru",
|
||||
"Home": "Domov",
|
||||
"Go": "Prejsť",
|
||||
"Full screen": "Zobrazenie na celú obrazovku",
|
||||
"Exit full screen": "Ukončiť zobrazenie na celú obrazovku",
|
||||
"Yes, join call": "Áno, pripojiť sa k hovoru",
|
||||
"Video": "Video",
|
||||
"Version: {{version}}": "Verzia: {{version}}",
|
||||
"Username": "Meno používateľa",
|
||||
"User menu": "Používateľské menu",
|
||||
"This call already exists, would you like to join?": "Tento hovor už existuje, chceli by ste sa k nemu pripojiť?",
|
||||
"Speaker": "Reproduktor",
|
||||
"Sign out": "Odhlásiť sa",
|
||||
"Sign in": "Prihlásiť sa",
|
||||
"Settings": "Nastavenia",
|
||||
"Display name": "Zobrazované meno",
|
||||
"Developer": "Vývojár",
|
||||
"Debug log request": "Žiadosť o záznam ladenia",
|
||||
"Create account": "Vytvoriť účet",
|
||||
"Copy": "Kopírovať",
|
||||
"Copied!": "Skopírované!",
|
||||
"Confirm password": "Potvrdiť heslo",
|
||||
"Close": "Zatvoriť",
|
||||
"Camera": "Kamera",
|
||||
"Avatar": "Obrázok",
|
||||
"Audio": "Audio",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Ďalší používateľ v tomto hovore má problém. Aby sme mohli lepšie diagnostikovať tieto problémy, chceli by sme získať záznam o ladení.",
|
||||
"<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>": "<0>Prečo neskončiť nastavením hesla, aby ste si zachovali svoj účet? </0><1>Budete si môcť ponechať svoje meno a nastaviť obrázok, ktorý sa bude používať pri budúcich hovoroch</1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Vytvoriť konto</0> Alebo <2>Prihlásiť sa ako hosť</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Už máte konto?</0><1><0>Prihláste sa</0> Alebo <2>Prihlásiť sa ako hosť</2></1>",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Odoslanie záznamov ladenia nám pomôže nájsť problém.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Hups, niečo sa pokazilo.</0>",
|
||||
"Expose developer settings in the settings window.": "Zobraziť nastavenia pre vývojárov v okne nastavení.",
|
||||
"Developer Settings": "Nastavenia pre vývojárov",
|
||||
"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 <5>Cookie Policy</5>.": "Účasťou v tejto beta verzii súhlasíte so zhromažďovaním anonymných údajov, ktoré použijeme na zlepšenie produktu. Viac informácií o tom, ktoré údaje sledujeme, nájdete v našich <2>Zásadách ochrany osobných údajov</2> a <5>Zásadách používania súborov cookie</5>.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>Súhlas môžete odvolať zrušením označenia tohto políčka. Ak práve prebieha hovor, toto nastavenie nadobudne platnosť po skončení hovoru.",
|
||||
"Your feedback": "Vaša spätná väzba",
|
||||
"Thanks, we received your feedback!": "Ďakujeme, dostali sme vašu spätnú väzbu!",
|
||||
"Submitting…": "Odosielanie…",
|
||||
"Submit": "Odoslať",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Ak máte problémy alebo jednoducho chcete poskytnúť spätnú väzbu, pošlite nám krátky popis nižšie.",
|
||||
"Feedback": "Spätná väzba",
|
||||
"{{count}} stars|one": "{{count}} hviezdička",
|
||||
"How did it go?": "Ako to išlo?",
|
||||
"{{count}} stars|other": "{{count}} hviezdičiek",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, váš hovor skončil.",
|
||||
"<0>Thanks for your feedback!</0>": "<0> Ďakujeme za vašu spätnú väzbu!</0>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0> Radi si vypočujeme vašu spätnú väzbu, aby sme mohli zlepšiť vaše skúsenosti.</0>",
|
||||
"{{displayName}} is presenting": "{{displayName}} prezentuje",
|
||||
"Show connection stats": "Zobraziť štatistiky pripojenia",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Kliknutím na \"Pripojiť sa k hovoru teraz\" súhlasíte s našou <2>Licenčnou zmluvou s koncovým používateľom (EULA)</2>",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Kliknutím na tlačidlo \"Prejsť\" vyjadrujete súhlas s našou <2>Licenčnou zmluvou s koncovým používateľom (EULA)</2>",
|
||||
"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>": "Táto stránka je chránená systémom ReCAPTCHA a platia na ňu <2>Pravidlá ochrany osobných údajov spoločnosti Google</2> a <6>Podmienky poskytovania služieb</6>.<9></9>Kliknutím na tlačidlo \"Registrovať sa\" súhlasíte s našou <12>Licenčnou zmluvou s koncovým používateľom (EULA)</12>",
|
||||
"Connectivity to the server has been lost.": "Spojenie so serverom sa stratilo.",
|
||||
"Retry sending logs": "Opakovať odoslanie záznamov",
|
||||
"Reconnect": "Znovu pripojiť",
|
||||
"Thanks!": "Ďakujeme!",
|
||||
"You were disconnected from the call": "Boli ste odpojení z hovoru",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"Encrypted": "Šifrované",
|
||||
"End call": "Ukončiť hovor",
|
||||
"Microphone off": "Mikrofón vypnutý",
|
||||
"Microphone on": "Mikrofón zapnutý",
|
||||
"Grid": "Sieť",
|
||||
"Not encrypted": "Nie je zašifrované",
|
||||
"Sharing screen": "Zdieľanie obrazovky",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"You": "Vy",
|
||||
"Continue in browser": "Pokračovať v prehliadači",
|
||||
"Mute microphone": "Stlmiť mikrofón",
|
||||
"Name of call": "Názov hovoru",
|
||||
"Open in the app": "Otvoriť v aplikácii",
|
||||
"Ready to join?": "Ste pripravení sa pridať?",
|
||||
"Select app": "Vybrať aplikáciu",
|
||||
"Start new call": "Spustiť nový hovor",
|
||||
"Start video": "Spustiť video",
|
||||
"Stop video": "Zastaviť video",
|
||||
"Back to recents": "Späť k nedávnym",
|
||||
"Unmute microphone": "Zrušiť stlmenie mikrofónu",
|
||||
"Call not found": "Hovor nebol nájdený",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Hovory sú teraz end-to-end šifrované a je potrebné ich vytvoriť z domovskej stránky. To pomáha zabezpečiť, aby všetci používali rovnaký šifrovací kľúč.",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Váš webový prehliadač nepodporuje end-to-end šifrovanie médií. Podporované prehliadače sú Chrome, Safari, Firefox >=117",
|
||||
"Invite": "Pozvať",
|
||||
"Link copied to clipboard": "Odkaz skopírovaný do schránky",
|
||||
"Participants": "Účastníci",
|
||||
"Copy link": "Kopírovať odkaz",
|
||||
"Invite to this call": "Pozvať na tento hovor"
|
||||
"a11y": {
|
||||
"user_menu": "Používateľské menu"
|
||||
},
|
||||
"action": {
|
||||
"close": "Zatvoriť",
|
||||
"copy": "Kopírovať",
|
||||
"copy_link": "Kopírovať odkaz",
|
||||
"go": "Prejsť",
|
||||
"invite": "Pozvať",
|
||||
"no": "Nie",
|
||||
"register": "Registrovať sa",
|
||||
"remove": "Odstrániť",
|
||||
"sign_in": "Prihlásiť sa",
|
||||
"sign_out": "Odhlásiť sa",
|
||||
"submit": "Odoslať"
|
||||
},
|
||||
"analytics_notice": "Účasťou v tejto beta verzii súhlasíte so zhromažďovaním anonymných údajov, ktoré použijeme na zlepšenie produktu. Viac informácií o tom, ktoré údaje sledujeme, nájdete v našich <2>Zásadách ochrany osobných údajov</2> a <5>Zásadách používania súborov cookie</5>.",
|
||||
"app_selection_modal": {
|
||||
"continue_in_browser": "Pokračovať v prehliadači",
|
||||
"open_in_app": "Otvoriť v aplikácii",
|
||||
"text": "Ste pripravení sa pridať?",
|
||||
"title": "Vybrať aplikáciu"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "Váš webový prehliadač nepodporuje end-to-end šifrovanie médií. Podporované prehliadače sú Chrome, Safari, Firefox >=117",
|
||||
"call_ended_view": {
|
||||
"body": "Boli ste odpojení z hovoru",
|
||||
"create_account_button": "Vytvoriť účet",
|
||||
"create_account_prompt": "<0>Prečo neskončiť nastavením hesla, aby ste si zachovali svoj účet? </0><1>Budete si môcť ponechať svoje meno a nastaviť obrázok, ktorý sa bude používať pri budúcich hovoroch</1>",
|
||||
"feedback_done": "<0> Ďakujeme za vašu spätnú väzbu!</0>",
|
||||
"feedback_prompt": "<0> Radi si vypočujeme vašu spätnú väzbu, aby sme mohli zlepšiť vaše skúsenosti.</0>",
|
||||
"headline": "{{displayName}}, váš hovor skončil.",
|
||||
"not_now_button": "Teraz nie, vrátiť sa na domovskú obrazovku",
|
||||
"reconnect_button": "Znovu pripojiť",
|
||||
"survey_prompt": "Ako to išlo?"
|
||||
},
|
||||
"call_name": "Názov hovoru",
|
||||
"common": {
|
||||
"avatar": "Obrázok",
|
||||
"camera": "Kamera",
|
||||
"copied": "Skopírované!",
|
||||
"display_name": "Zobrazované meno",
|
||||
"encrypted": "Šifrované",
|
||||
"home": "Domov",
|
||||
"loading": "Načítanie…",
|
||||
"microphone": "Mikrofón",
|
||||
"password": "Heslo",
|
||||
"profile": "Profil",
|
||||
"settings": "Nastavenia",
|
||||
"unencrypted": "Nie je zašifrované",
|
||||
"username": "Meno používateľa"
|
||||
},
|
||||
"disconnected_banner": "Spojenie so serverom sa stratilo.",
|
||||
"exit_fullscreen_button_label": "Ukončiť zobrazenie na celú obrazovku",
|
||||
"full_screen_view_description": "<0>Odoslanie záznamov ladenia nám pomôže nájsť problém.</0>",
|
||||
"full_screen_view_h1": "<0>Hups, niečo sa pokazilo.</0>",
|
||||
"fullscreen_button_label": "Zobrazenie na celú obrazovku",
|
||||
"group_call_loader_failed_heading": "Hovor nebol nájdený",
|
||||
"group_call_loader_failed_text": "Hovory sú teraz end-to-end šifrované a je potrebné ich vytvoriť z domovskej stránky. To pomáha zabezpečiť, aby všetci používali rovnaký šifrovací kľúč.",
|
||||
"hangup_button_label": "Ukončiť hovor",
|
||||
"header_label": "Domov Element Call",
|
||||
"header_participants_label": "Účastníci",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Odkaz skopírovaný do schránky",
|
||||
"title": "Pozvať na tento hovor"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Áno, pripojiť sa k hovoru",
|
||||
"text": "Tento hovor už existuje, chceli by ste sa k nemu pripojiť?",
|
||||
"title": "Pripojiť sa k existujúcemu hovoru?"
|
||||
},
|
||||
"layout_grid_label": "Sieť",
|
||||
"layout_spotlight_label": "Stredobod",
|
||||
"lobby": {
|
||||
"join_button": "Pripojiť sa k hovoru",
|
||||
"leave_button": "Späť k nedávnym"
|
||||
},
|
||||
"local_volume_label": "Lokálna hlasitosť",
|
||||
"logging_in": "Prihlasovanie…",
|
||||
"login_auth_links": "<0>Vytvoriť konto</0> Alebo <2>Prihlásiť sa ako hosť</2>",
|
||||
"login_title": "Prihlásiť sa",
|
||||
"microphone_off": "Mikrofón vypnutý",
|
||||
"microphone_on": "Mikrofón zapnutý",
|
||||
"mute_microphone_button_label": "Stlmiť mikrofón",
|
||||
"rageshake_button_error_caption": "Opakovať odoslanie záznamov",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Ďalší používateľ v tomto hovore má problém. Aby sme mohli lepšie diagnostikovať tieto problémy, chceli by sme získať záznam o ladení.",
|
||||
"title": "Žiadosť o záznam ladenia"
|
||||
},
|
||||
"rageshake_send_logs": "Odoslať záznamy o ladení",
|
||||
"rageshake_sending": "Odosielanie…",
|
||||
"rageshake_sending_logs": "Odosielanie záznamov o ladení…",
|
||||
"rageshake_sent": "Ďakujeme!",
|
||||
"recaptcha_caption": "Táto stránka je chránená systémom ReCAPTCHA a platia na ňu <2>Pravidlá ochrany osobných údajov spoločnosti Google</2> a <6>Podmienky poskytovania služieb</6>.<9></9>Kliknutím na tlačidlo \"Registrovať sa\" súhlasíte s našou <12>Licenčnou zmluvou s koncovým používateľom (EULA)</12>",
|
||||
"recaptcha_dismissed": "Recaptcha zamietnutá",
|
||||
"recaptcha_not_loaded": "Recaptcha sa nenačítala",
|
||||
"register": {
|
||||
"passwords_must_match": "Heslá sa musia zhodovať",
|
||||
"registering": "Registrácia…"
|
||||
},
|
||||
"register_auth_links": "<0>Už máte konto?</0><1><0>Prihláste sa</0> Alebo <2>Prihlásiť sa ako hosť</2></1>",
|
||||
"register_confirm_password_label": "Potvrdiť heslo",
|
||||
"return_home_button": "Návrat na domovskú obrazovku",
|
||||
"room_auth_view_eula_caption": "Kliknutím na \"Pripojiť sa k hovoru teraz\" súhlasíte s našou <2>Licenčnou zmluvou s koncovým používateľom (EULA)</2>",
|
||||
"room_auth_view_join_button": "Pripojiť sa k hovoru teraz",
|
||||
"screenshare_button_label": "Zdieľať obrazovku",
|
||||
"select_input_unset_button": "Vyberte možnosť",
|
||||
"settings": {
|
||||
"developer_settings_label": "Nastavenia pre vývojárov",
|
||||
"developer_settings_label_description": "Zobraziť nastavenia pre vývojárov v okne nastavení.",
|
||||
"developer_tab_title": "Vývojár",
|
||||
"feedback_tab_body": "Ak máte problémy alebo jednoducho chcete poskytnúť spätnú väzbu, pošlite nám krátky popis nižšie.",
|
||||
"feedback_tab_description_label": "Vaša spätná väzba",
|
||||
"feedback_tab_h4": "Odoslať spätnú väzbu",
|
||||
"feedback_tab_send_logs_label": "Zahrnúť záznamy o ladení",
|
||||
"feedback_tab_thank_you": "Ďakujeme, dostali sme vašu spätnú väzbu!",
|
||||
"feedback_tab_title": "Spätná väzba",
|
||||
"more_tab_title": "Viac",
|
||||
"opt_in_description": "<0></0><1></1>Súhlas môžete odvolať zrušením označenia tohto políčka. Ak práve prebieha hovor, toto nastavenie nadobudne platnosť po skončení hovoru.",
|
||||
"show_connection_stats_label": "Zobraziť štatistiky pripojenia",
|
||||
"speaker_device_selection_label": "Reproduktor"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} hviezdička",
|
||||
"star_rating_input_label_other": "{{count}} hviezdičiek",
|
||||
"start_new_call": "Spustiť nový hovor",
|
||||
"start_video_button_label": "Spustiť video",
|
||||
"stop_screenshare_button_label": "Zdieľanie obrazovky",
|
||||
"stop_video_button_label": "Zastaviť video",
|
||||
"submitting": "Odosielanie…",
|
||||
"unauthenticated_view_body": "Ešte nie ste zaregistrovaný? <2>Vytvorte si účet</2>",
|
||||
"unauthenticated_view_eula_caption": "Kliknutím na tlačidlo \"Prejsť\" vyjadrujete súhlas s našou <2>Licenčnou zmluvou s koncovým používateľom (EULA)</2>",
|
||||
"unauthenticated_view_login_button": "Prihláste sa do svojho konta",
|
||||
"unmute_microphone_button_label": "Zrušiť stlmenie mikrofónu",
|
||||
"version": "Verzia: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} prezentuje",
|
||||
"sfu_participant_local": "Vy"
|
||||
},
|
||||
"waiting_for_participants": "Čaká sa na ďalších účastníkov…"
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
{}
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"{{count}} stars|one": "{{count}} stjärna",
|
||||
"{{count}} stars|other": "{{count}} stjärnor",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"{{displayName}} is presenting": "{{displayName}} presenterar",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, ditt samtal har avslutats."
|
||||
"call_ended_view": {
|
||||
"headline": "{{displayName}}, ditt samtal har avslutats."
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} stjärna",
|
||||
"star_rating_input_label_other": "{{count}} stjärnor",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} presenterar"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,51 +1,66 @@
|
||||
{
|
||||
"<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>": "<0>Hesabınızı tutmak için niye bir parola açmıyorsunuz?</0><1>Böylece ileriki aramalarda adınızı ve avatarınızı kullanabileceksiniz</1>",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Bu aramadaki başka bir kullanıcı sorun yaşıyor. Sorunu daha iyi çözebilmemiz için hata ayıklama kütüğünü almak isteriz.",
|
||||
"Audio": "Ses",
|
||||
"Avatar": "Avatar",
|
||||
"Camera": "Kamera",
|
||||
"Close": "Kapat",
|
||||
"Confirm password": "Parolayı tekrar edin",
|
||||
"Copied!": "Kopyalandı",
|
||||
"Create account": "Hesap aç",
|
||||
"Debug log request": "Hata ayıklama kütük istemi",
|
||||
"Developer": "Geliştirici",
|
||||
"Display name": "Ekran adı",
|
||||
"Exit full screen": "Tam ekranı terk et",
|
||||
"Full screen": "Tam ekran",
|
||||
"Go": "Git",
|
||||
"Home": "Ev",
|
||||
"Include debug logs": "Hata ayıklama kütüğünü dahil et",
|
||||
"Join call": "Aramaya katıl",
|
||||
"Join call now": "Aramaya katıl",
|
||||
"Join existing call?": "Mevcut aramaya katıl?",
|
||||
"Loading…": "Yükleniyor…",
|
||||
"Local volume": "Yerel ses seviyesi",
|
||||
"Logging in…": "Giriliyor…",
|
||||
"Login": "Gir",
|
||||
"Login to your account": "Hesabınıza girin",
|
||||
"Microphone": "Mikrofon",
|
||||
"More": "Daha",
|
||||
"No": "Hayır",
|
||||
"Not now, return to home screen": "Şimdi değil, ev ekranına dön",
|
||||
"Not registered yet? <2>Create an account</2>": "Kaydolmadınız mı? <2>Hesap açın</2>",
|
||||
"Password": "Parola",
|
||||
"Passwords must match": "Parolalar aynı olmalı",
|
||||
"Recaptcha dismissed": "reCAPTCHA atlandı",
|
||||
"Recaptcha not loaded": "reCAPTCHA yüklenmedi",
|
||||
"Register": "Kaydol",
|
||||
"Registering…": "Kaydediyor…",
|
||||
"Remove": "Çıkar",
|
||||
"Return to home screen": "Ev ekranına geri dön",
|
||||
"Select an option": "Bir seçenek seç",
|
||||
"Send debug logs": "Hata ayıklama kütüğünü gönder",
|
||||
"Sending…": "Gönderiliyor…",
|
||||
"Settings": "Ayarlar",
|
||||
"Share screen": "Ekran paylaş",
|
||||
"Sign in": "Gir",
|
||||
"Sign out": "Çık",
|
||||
"Submit feedback": "Geri bildirim ver",
|
||||
"This call already exists, would you like to join?": "Bu arama zaten var, katılmak ister misiniz?",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Hesap oluştur</0> yahut <2>Konuk olarak gir</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Mevcut hesabınız mı var?</0><1><0>Gir</0> yahut <2>Konuk girişi</2></1>"
|
||||
"action": {
|
||||
"close": "Kapat",
|
||||
"go": "Git",
|
||||
"no": "Hayır",
|
||||
"register": "Kaydol",
|
||||
"remove": "Çıkar",
|
||||
"sign_in": "Gir",
|
||||
"sign_out": "Çık"
|
||||
},
|
||||
"call_ended_view": {
|
||||
"create_account_button": "Hesap aç",
|
||||
"create_account_prompt": "<0>Hesabınızı tutmak için niye bir parola açmıyorsunuz?</0><1>Böylece ileriki aramalarda adınızı ve avatarınızı kullanabileceksiniz</1>",
|
||||
"not_now_button": "Şimdi değil, ev ekranına dön"
|
||||
},
|
||||
"common": {
|
||||
"audio": "Ses",
|
||||
"camera": "Kamera",
|
||||
"copied": "Kopyalandı",
|
||||
"display_name": "Ekran adı",
|
||||
"home": "Ev",
|
||||
"loading": "Yükleniyor…",
|
||||
"microphone": "Mikrofon",
|
||||
"password": "Parola",
|
||||
"settings": "Ayarlar"
|
||||
},
|
||||
"exit_fullscreen_button_label": "Tam ekranı terk et",
|
||||
"fullscreen_button_label": "Tam ekran",
|
||||
"join_existing_call_modal": {
|
||||
"text": "Bu arama zaten var, katılmak ister misiniz?",
|
||||
"title": "Mevcut aramaya katıl?"
|
||||
},
|
||||
"lobby": {
|
||||
"join_button": "Aramaya katıl"
|
||||
},
|
||||
"local_volume_label": "Yerel ses seviyesi",
|
||||
"logging_in": "Giriliyor…",
|
||||
"login_auth_links": "<0>Hesap oluştur</0> yahut <2>Konuk olarak gir</2>",
|
||||
"login_title": "Gir",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Bu aramadaki başka bir kullanıcı sorun yaşıyor. Sorunu daha iyi çözebilmemiz için hata ayıklama kütüğünü almak isteriz.",
|
||||
"title": "Hata ayıklama kütük istemi"
|
||||
},
|
||||
"rageshake_send_logs": "Hata ayıklama kütüğünü gönder",
|
||||
"rageshake_sending": "Gönderiliyor…",
|
||||
"recaptcha_dismissed": "reCAPTCHA atlandı",
|
||||
"recaptcha_not_loaded": "reCAPTCHA yüklenmedi",
|
||||
"register": {
|
||||
"passwords_must_match": "Parolalar aynı olmalı",
|
||||
"registering": "Kaydediyor…"
|
||||
},
|
||||
"register_auth_links": "<0>Mevcut hesabınız mı var?</0><1><0>Gir</0> yahut <2>Konuk girişi</2></1>",
|
||||
"register_confirm_password_label": "Parolayı tekrar edin",
|
||||
"return_home_button": "Ev ekranına geri dön",
|
||||
"room_auth_view_join_button": "Aramaya katıl",
|
||||
"screenshare_button_label": "Ekran paylaş",
|
||||
"select_input_unset_button": "Bir seçenek seç",
|
||||
"settings": {
|
||||
"developer_tab_title": "Geliştirici",
|
||||
"feedback_tab_h4": "Geri bildirim ver",
|
||||
"feedback_tab_send_logs_label": "Hata ayıklama kütüğünü dahil et",
|
||||
"more_tab_title": "Daha"
|
||||
},
|
||||
"unauthenticated_view_body": "Kaydolmadınız mı? <2>Hesap açın</2>",
|
||||
"unauthenticated_view_login_button": "Hesabınıza girin"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,142 @@
|
||||
{
|
||||
"Loading…": "Завантаження…",
|
||||
"Yes, join call": "Так, приєднатися до виклику",
|
||||
"Waiting for other participants…": "Очікування на інших учасників…",
|
||||
"Video": "Відео",
|
||||
"Version: {{version}}": "Версія: {{version}}",
|
||||
"Username": "Ім'я користувача",
|
||||
"User menu": "Меню користувача",
|
||||
"This call already exists, would you like to join?": "Цей виклик уже існує, бажаєте приєднатися?",
|
||||
"Submit feedback": "Надіслати відгук",
|
||||
"Spotlight": "У центрі уваги",
|
||||
"Speaker": "Динамік",
|
||||
"Sign out": "Вийти",
|
||||
"Sign in": "Увійти",
|
||||
"Share screen": "Поділитися екраном",
|
||||
"Settings": "Налаштування",
|
||||
"Sending…": "Надсилання…",
|
||||
"Sending debug logs…": "Надсилання журналу налагодження…",
|
||||
"Send debug logs": "Надіслати журнал налагодження",
|
||||
"Select an option": "Вибрати опцію",
|
||||
"Return to home screen": "Повернутися на екран домівки",
|
||||
"Remove": "Вилучити",
|
||||
"Registering…": "Реєстрація…",
|
||||
"Register": "Зареєструватися",
|
||||
"Recaptcha not loaded": "Recaptcha не завантажено",
|
||||
"Recaptcha dismissed": "Recaptcha не пройдено",
|
||||
"Profile": "Профіль",
|
||||
"Passwords must match": "Паролі відрізняються",
|
||||
"Password": "Пароль",
|
||||
"Not registered yet? <2>Create an account</2>": "Ще не зареєстровані? <2>Створіть обліковий запис</2>",
|
||||
"Not now, return to home screen": "Не зараз, повернутися на екран домівки",
|
||||
"No": "Ні",
|
||||
"More": "Докладніше",
|
||||
"Microphone": "Мікрофон",
|
||||
"Login to your account": "Увійдіть до свого облікового запису",
|
||||
"Login": "Увійти",
|
||||
"Logging in…": "Вхід…",
|
||||
"Local volume": "Локальна гучність",
|
||||
"Join existing call?": "Приєднатися до наявного виклику?",
|
||||
"Join call now": "Приєднатися до виклику зараз",
|
||||
"Join call": "Приєднатися до виклику",
|
||||
"Include debug logs": "Долучити журнали налагодження",
|
||||
"Home": "Домівка",
|
||||
"Go": "Далі",
|
||||
"Full screen": "Повноекранний режим",
|
||||
"Exit full screen": "Вийти з повноекранного режиму",
|
||||
"Display name": "Псевдонім",
|
||||
"Developer": "Розробнику",
|
||||
"Debug log request": "Запит журналу налагодження",
|
||||
"Create account": "Створити обліковий запис",
|
||||
"Copied!": "Скопійовано!",
|
||||
"Confirm password": "Підтвердити пароль",
|
||||
"Close": "Закрити",
|
||||
"Camera": "Камера",
|
||||
"Avatar": "Аватар",
|
||||
"Audio": "Звук",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Інший користувач у цьому виклику має проблему. Щоб краще визначити ці проблеми, ми хотіли б зібрати журнал налагодження.",
|
||||
"<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>": "<0>Чому б не завершити, налаштувавши пароль для збереження свого облікового запису?</0><1>Ви зможете зберегти своє ім'я та встановити аватарку для подальшого користування під час майбутніх викликів</1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Створити обліковий запис</0> або <2>Отримати доступ як гість</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Уже маєте обліковий запис?</0><1><0>Увійти</0> Or <2>Отримати доступ як гість</2></1>",
|
||||
"Element Call Home": "Домівка Element Call",
|
||||
"Copy": "Копіювати",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Надсилання журналів налагодження допоможе нам виявити проблему.</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Йой, щось пішло не за планом.</0>",
|
||||
"Expose developer settings in the settings window.": "Відкрийте налаштування розробника у вікні налаштувань.",
|
||||
"Developer Settings": "Налаштування розробника",
|
||||
"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 <5>Cookie Policy</5>.": "Користуючись дочасним доступом, ви даєте згоду на збір анонімних даних, які ми використовуємо для вдосконалення продукту. Ви можете знайти більше інформації про те, які дані ми відстежуємо в нашій <2>Політиці Приватності</2> і нашій <5>Політиці про куки</5>.",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>Ви можете відкликати згоду, прибравши цей прапорець. Якщо ви зараз розмовляєте, це налаштування застосується після завершення виклику.",
|
||||
"Your feedback": "Ваш відгук",
|
||||
"Thanks, we received your feedback!": "Дякуємо, ми отримали ваш відгук!",
|
||||
"Submitting…": "Надсилання…",
|
||||
"Submit": "Надіслати",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Якщо у вас виникли проблеми або ви просто хочете залишити відгук, надішліть нам короткий опис нижче.",
|
||||
"Feedback": "Відгук",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Дякуємо за ваш відгук!</0>",
|
||||
"{{count}} stars|one": "{{count}} зірок",
|
||||
"{{count}} stars|other": "{{count}} зірок",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, ваш виклик завершено.",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Ми будемо раді почути ваші відгуки, щоб поліпшити роботу застосунку.</0>",
|
||||
"How did it go?": "Вам усе сподобалось?",
|
||||
"{{displayName}} is presenting": "{{displayName}} представляє",
|
||||
"Show connection stats": "Показати стан з'єднання",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Натискаючи \"Далі\", ви погоджуєтеся з нашою <2>Ліцензійною угодою з кінцевим користувачем (EULA)</2>",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Натискаючи \"Приєднатися до виклику зараз\", ви погоджуєтеся з нашою <2>Ліцензійною угодою з кінцевим користувачем (EULA)</2>",
|
||||
"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 і до нього застосовується <2>Політика приватності</2> і <6>Умови надання послуг</6> Google.<9></9>Натискаючи \"Зареєструватися\", ви погоджуєтеся з нашою <12>Ліцензійною угодою з кінцевим користувачем (EULA)</12>",
|
||||
"Connectivity to the server has been lost.": "Втрачено зв'язок з сервером.",
|
||||
"Reconnect": "Під'єднати повторно",
|
||||
"Retry sending logs": "Повторити надсилання журналів",
|
||||
"You were disconnected from the call": "Вас від'єднано від виклику",
|
||||
"Thanks!": "Дякуємо!",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"Encrypted": "Зашифровано",
|
||||
"Microphone on": "Мікрофон увімкнено",
|
||||
"Not encrypted": "Не зашифровано",
|
||||
"Sharing screen": "Презентація екрана",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"End call": "Завершити виклик",
|
||||
"Grid": "Сітка",
|
||||
"Microphone off": "Мікрофон вимкнено",
|
||||
"You": "Ви",
|
||||
"Mute microphone": "Вимкнути мікрофон",
|
||||
"Open in the app": "Відкрити у застосунку",
|
||||
"Ready to join?": "Готові приєднатися?",
|
||||
"Select app": "Вибрати застосунок",
|
||||
"Start video": "Розпочати відео",
|
||||
"Stop video": "Зупинити відео",
|
||||
"Unmute microphone": "Увімкнути мікрофон",
|
||||
"Continue in browser": "Продовжити у браузері",
|
||||
"Name of call": "Назва виклику",
|
||||
"Start new call": "Розпочати новий виклик",
|
||||
"Back to recents": "Повернутися до недавніх",
|
||||
"Call not found": "Виклик не знайдено",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "Відтепер виклики захищено наскрізним шифруванням, і їх потрібно створювати з домашньої сторінки. Це допомагає переконатися, що всі користувачі використовують один і той самий ключ шифрування.",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Ваш браузер не підтримує наскрізне шифрування мультимедійних даних. Підтримувані браузери: Chrome, Safari, Firefox >=117",
|
||||
"Invite": "Запросити",
|
||||
"Link copied to clipboard": "Посилання скопійовано до буфера обміну",
|
||||
"Participants": "Учасники",
|
||||
"Copy link": "Скопіювати посилання",
|
||||
"Invite to this call": "Запросити до цього виклику"
|
||||
"a11y": {
|
||||
"user_menu": "Меню користувача"
|
||||
},
|
||||
"action": {
|
||||
"close": "Закрити",
|
||||
"copy": "Копіювати",
|
||||
"copy_link": "Скопіювати посилання",
|
||||
"go": "Далі",
|
||||
"invite": "Запросити",
|
||||
"no": "Ні",
|
||||
"register": "Зареєструватися",
|
||||
"remove": "Вилучити",
|
||||
"sign_in": "Увійти",
|
||||
"sign_out": "Вийти",
|
||||
"submit": "Надіслати"
|
||||
},
|
||||
"analytics_notice": "Користуючись дочасним доступом, ви даєте згоду на збір анонімних даних, які ми використовуємо для вдосконалення продукту. Ви можете знайти більше інформації про те, які дані ми відстежуємо в нашій <2>Політиці Приватності</2> і нашій <5>Політиці про куки</5>.",
|
||||
"app_selection_modal": {
|
||||
"continue_in_browser": "Продовжити у браузері",
|
||||
"open_in_app": "Відкрити у застосунку",
|
||||
"text": "Готові приєднатися?",
|
||||
"title": "Вибрати застосунок"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "Ваш браузер не підтримує наскрізне шифрування мультимедійних даних. Підтримувані браузери: Chrome, Safari, Firefox >=117",
|
||||
"call_ended_view": {
|
||||
"body": "Вас від'єднано від виклику",
|
||||
"create_account_button": "Створити обліковий запис",
|
||||
"create_account_prompt": "<0>Чому б не завершити, налаштувавши пароль для збереження свого облікового запису?</0><1>Ви зможете зберегти своє ім'я та встановити аватарку для подальшого користування під час майбутніх викликів</1>",
|
||||
"feedback_done": "<0>Дякуємо за ваш відгук!</0>",
|
||||
"feedback_prompt": "<0>Ми будемо раді почути ваші відгуки, щоб поліпшити роботу застосунку.</0>",
|
||||
"headline": "{{displayName}}, ваш виклик завершено.",
|
||||
"not_now_button": "Не зараз, повернутися на екран домівки",
|
||||
"reconnect_button": "Під'єднати повторно",
|
||||
"survey_prompt": "Вам усе сподобалось?"
|
||||
},
|
||||
"call_name": "Назва виклику",
|
||||
"common": {
|
||||
"audio": "Звук",
|
||||
"avatar": "Аватар",
|
||||
"camera": "Камера",
|
||||
"copied": "Скопійовано!",
|
||||
"display_name": "Псевдонім",
|
||||
"encrypted": "Зашифровано",
|
||||
"home": "Домівка",
|
||||
"loading": "Завантаження…",
|
||||
"microphone": "Мікрофон",
|
||||
"password": "Пароль",
|
||||
"profile": "Профіль",
|
||||
"settings": "Налаштування",
|
||||
"unencrypted": "Не зашифровано",
|
||||
"username": "Ім'я користувача",
|
||||
"video": "Відео"
|
||||
},
|
||||
"disconnected_banner": "Втрачено зв'язок з сервером.",
|
||||
"exit_fullscreen_button_label": "Вийти з повноекранного режиму",
|
||||
"full_screen_view_description": "<0>Надсилання журналів налагодження допоможе нам виявити проблему.</0>",
|
||||
"full_screen_view_h1": "<0>Йой, щось пішло не за планом.</0>",
|
||||
"fullscreen_button_label": "Повноекранний режим",
|
||||
"group_call_loader_failed_heading": "Виклик не знайдено",
|
||||
"group_call_loader_failed_text": "Відтепер виклики захищено наскрізним шифруванням, і їх потрібно створювати з домашньої сторінки. Це допомагає переконатися, що всі користувачі використовують один і той самий ключ шифрування.",
|
||||
"hangup_button_label": "Завершити виклик",
|
||||
"header_label": "Домівка Element Call",
|
||||
"header_participants_label": "Учасники",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "Посилання скопійовано до буфера обміну",
|
||||
"title": "Запросити до цього виклику"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Так, приєднатися до виклику",
|
||||
"text": "Цей виклик уже існує, бажаєте приєднатися?",
|
||||
"title": "Приєднатися до наявного виклику?"
|
||||
},
|
||||
"layout_grid_label": "Сітка",
|
||||
"layout_spotlight_label": "У центрі уваги",
|
||||
"lobby": {
|
||||
"join_button": "Приєднатися до виклику",
|
||||
"leave_button": "Повернутися до недавніх"
|
||||
},
|
||||
"local_volume_label": "Локальна гучність",
|
||||
"logging_in": "Вхід…",
|
||||
"login_auth_links": "<0>Створити обліковий запис</0> або <2>Отримати доступ як гість</2>",
|
||||
"login_title": "Увійти",
|
||||
"microphone_off": "Мікрофон вимкнено",
|
||||
"microphone_on": "Мікрофон увімкнено",
|
||||
"mute_microphone_button_label": "Вимкнути мікрофон",
|
||||
"rageshake_button_error_caption": "Повторити надсилання журналів",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Інший користувач у цьому виклику має проблему. Щоб краще визначити ці проблеми, ми хотіли б зібрати журнал налагодження.",
|
||||
"title": "Запит журналу налагодження"
|
||||
},
|
||||
"rageshake_send_logs": "Надіслати журнал налагодження",
|
||||
"rageshake_sending": "Надсилання…",
|
||||
"rageshake_sending_logs": "Надсилання журналу налагодження…",
|
||||
"rageshake_sent": "Дякуємо!",
|
||||
"recaptcha_caption": "Цей сайт захищений ReCAPTCHA і до нього застосовується <2>Політика приватності</2> і <6>Умови надання послуг</6> Google.<9></9>Натискаючи \"Зареєструватися\", ви погоджуєтеся з нашою <12>Ліцензійною угодою з кінцевим користувачем (EULA)</12>",
|
||||
"recaptcha_dismissed": "Recaptcha не пройдено",
|
||||
"recaptcha_not_loaded": "Recaptcha не завантажено",
|
||||
"register": {
|
||||
"passwords_must_match": "Паролі відрізняються",
|
||||
"registering": "Реєстрація…"
|
||||
},
|
||||
"register_auth_links": "<0>Уже маєте обліковий запис?</0><1><0>Увійти</0> Or <2>Отримати доступ як гість</2></1>",
|
||||
"register_confirm_password_label": "Підтвердити пароль",
|
||||
"return_home_button": "Повернутися на екран домівки",
|
||||
"room_auth_view_eula_caption": "Натискаючи \"Приєднатися до виклику зараз\", ви погоджуєтеся з нашою <2>Ліцензійною угодою з кінцевим користувачем (EULA)</2>",
|
||||
"room_auth_view_join_button": "Приєднатися до виклику зараз",
|
||||
"screenshare_button_label": "Поділитися екраном",
|
||||
"select_input_unset_button": "Вибрати опцію",
|
||||
"settings": {
|
||||
"developer_settings_label": "Налаштування розробника",
|
||||
"developer_settings_label_description": "Відкрийте налаштування розробника у вікні налаштувань.",
|
||||
"developer_tab_title": "Розробнику",
|
||||
"feedback_tab_body": "Якщо у вас виникли проблеми або ви просто хочете залишити відгук, надішліть нам короткий опис нижче.",
|
||||
"feedback_tab_description_label": "Ваш відгук",
|
||||
"feedback_tab_h4": "Надіслати відгук",
|
||||
"feedback_tab_send_logs_label": "Долучити журнали налагодження",
|
||||
"feedback_tab_thank_you": "Дякуємо, ми отримали ваш відгук!",
|
||||
"feedback_tab_title": "Відгук",
|
||||
"more_tab_title": "Докладніше",
|
||||
"opt_in_description": "<0></0><1></1>Ви можете відкликати згоду, прибравши цей прапорець. Якщо ви зараз розмовляєте, це налаштування застосується після завершення виклику.",
|
||||
"show_connection_stats_label": "Показати стан з'єднання",
|
||||
"speaker_device_selection_label": "Динамік"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} зірок",
|
||||
"star_rating_input_label_other": "{{count}} зірок",
|
||||
"start_new_call": "Розпочати новий виклик",
|
||||
"start_video_button_label": "Розпочати відео",
|
||||
"stop_screenshare_button_label": "Презентація екрана",
|
||||
"stop_video_button_label": "Зупинити відео",
|
||||
"submitting": "Надсилання…",
|
||||
"unauthenticated_view_body": "Ще не зареєстровані? <2>Створіть обліковий запис</2>",
|
||||
"unauthenticated_view_eula_caption": "Натискаючи \"Далі\", ви погоджуєтеся з нашою <2>Ліцензійною угодою з кінцевим користувачем (EULA)</2>",
|
||||
"unauthenticated_view_login_button": "Увійдіть до свого облікового запису",
|
||||
"unmute_microphone_button_label": "Увімкнути мікрофон",
|
||||
"version": "Версія: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} представляє",
|
||||
"sfu_participant_local": "Ви"
|
||||
},
|
||||
"waiting_for_participants": "Очікування на інших учасників…"
|
||||
}
|
||||
|
||||
@@ -1,62 +1,80 @@
|
||||
{
|
||||
"Login": "Đăng nhập",
|
||||
"Join call": "Tham gia cuộc gọi",
|
||||
"Password": "Mật khẩu",
|
||||
"Settings": "Cài đặt",
|
||||
"Sending…": "Đang gửi…",
|
||||
"Sign in": "Đăng nhập",
|
||||
"Submit": "Gửi",
|
||||
"Video": "Truyền hình",
|
||||
"Username": "Tên người dùng",
|
||||
"Yes, join call": "Vâng, tham gia cuộc gọi",
|
||||
"Your feedback": "Phản hồi của bạn",
|
||||
"Waiting for other participants…": "Đang đợi những người khác…",
|
||||
"Version: {{version}}": "Phiên bản: {{version}}",
|
||||
"Submit feedback": "Gửi phản hồi",
|
||||
"Speaker": "Loa",
|
||||
"Sign out": "Đăng xuất",
|
||||
"Share screen": "Chia sẻ màn hình",
|
||||
"No": "Không",
|
||||
"Join call now": "Tham gia cuộc gọi",
|
||||
"Create account": "Tạo tài khoản",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Tạo tài khoản</0> Hay <2>Tham gia dưới tên khác</2>",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>Gửi nhật ký gỡ lỗi sẽ giúp chúng tôi theo dõi vấn đề.</0>",
|
||||
"Avatar": "Ảnh đại diện",
|
||||
"Audio": "Âm thanh",
|
||||
"Camera": "Máy quay",
|
||||
"Copied!": "Đã sao chép!",
|
||||
"Confirm password": "Xác nhận mật khẩu",
|
||||
"Close": "Đóng",
|
||||
"Copy": "Sao chép",
|
||||
"Display name": "Tên hiển thị",
|
||||
"Developer Settings": "Cài đặt phát triển",
|
||||
"Developer": "Nhà phát triển",
|
||||
"Feedback": "Phản hồi",
|
||||
"Full screen": "Toàn màn hình",
|
||||
"Include debug logs": "Kèm theo nhật ký gỡ lỗi",
|
||||
"Join existing call?": "Tham gia cuộc gọi?",
|
||||
"Loading…": "Đang tải…",
|
||||
"Logging in…": "Đang đăng nhập…",
|
||||
"Login to your account": "Đăng nhập vào tài khoản của bạn",
|
||||
"Microphone": "Micrô",
|
||||
"Not registered yet? <2>Create an account</2>": "Chưa đăng ký? <2>Tạo tài khoản</2>",
|
||||
"Passwords must match": "Mật khẩu phải khớp",
|
||||
"Register": "Đăng ký",
|
||||
"Spotlight": "Tiêu điểm",
|
||||
"Submitting…": "Đang gửi…",
|
||||
"Thanks, we received your feedback!": "Cảm ơn, chúng tôi đã nhận được phản hồi!",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>Đã có tài khoản?</0><1><0>Đăng nhập</0> Hay <2>Tham gia dưới tên Khách</2></1>",
|
||||
"Exit full screen": "Rời chế độ toàn màn hình",
|
||||
"Profile": "Hồ sơ",
|
||||
"Registering…": "Đang đăng ký…",
|
||||
"This call already exists, would you like to join?": "Cuộc gọi đã tồn tại, bạn có muốn tham gia không?",
|
||||
"Recaptcha not loaded": "Chưa tải được Recaptcha",
|
||||
"Debug log request": "Yêu cầu nhật ký gỡ lỗi",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Một người dùng khác trong cuộc gọi đang gặp vấn đề. Để có thể chẩn đoán tốt hơn chúng tôi muốn thu thập nhật ký gỡ lỗi.",
|
||||
"<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>": "<0>Tại sao lại không hoàn thiện bằng cách đặt mật khẩu để giữ tài khoản của bạn?</0><1>Bạn sẽ có thể giữ tên và đặt ảnh đại diện cho những cuộc gọi tiếp theo.</1>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>Ối, có cái gì đó sai.</0>",
|
||||
"{{displayName}} is presenting": "{{displayName}} đang trình bày",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}}, cuộc gọi đã kết thúc.",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Chúng tôi muốn nghe phản hồi của bạn để còn cải thiện trải nghiệm cho bạn.</0>",
|
||||
"<0>Thanks for your feedback!</0>": "<0>Cảm hơn vì đã phản hồi!</0>"
|
||||
"action": {
|
||||
"close": "Đóng",
|
||||
"copy": "Sao chép",
|
||||
"no": "Không",
|
||||
"register": "Đăng ký",
|
||||
"sign_in": "Đăng nhập",
|
||||
"sign_out": "Đăng xuất",
|
||||
"submit": "Gửi"
|
||||
},
|
||||
"call_ended_view": {
|
||||
"create_account_button": "Tạo tài khoản",
|
||||
"create_account_prompt": "<0>Tại sao lại không hoàn thiện bằng cách đặt mật khẩu để giữ tài khoản của bạn?</0><1>Bạn sẽ có thể giữ tên và đặt ảnh đại diện cho những cuộc gọi tiếp theo.</1>",
|
||||
"feedback_done": "<0>Cảm hơn vì đã phản hồi!</0>",
|
||||
"feedback_prompt": "<0>Chúng tôi muốn nghe phản hồi của bạn để còn cải thiện trải nghiệm cho bạn.</0>",
|
||||
"headline": "{{displayName}}, cuộc gọi đã kết thúc."
|
||||
},
|
||||
"common": {
|
||||
"audio": "Âm thanh",
|
||||
"avatar": "Ảnh đại diện",
|
||||
"camera": "Máy quay",
|
||||
"copied": "Đã sao chép!",
|
||||
"display_name": "Tên hiển thị",
|
||||
"loading": "Đang tải…",
|
||||
"microphone": "Micrô",
|
||||
"password": "Mật khẩu",
|
||||
"profile": "Hồ sơ",
|
||||
"settings": "Cài đặt",
|
||||
"username": "Tên người dùng",
|
||||
"video": "Truyền hình"
|
||||
},
|
||||
"exit_fullscreen_button_label": "Rời chế độ toàn màn hình",
|
||||
"full_screen_view_description": "<0>Gửi nhật ký gỡ lỗi sẽ giúp chúng tôi theo dõi vấn đề.</0>",
|
||||
"full_screen_view_h1": "<0>Ối, có cái gì đó sai.</0>",
|
||||
"fullscreen_button_label": "Toàn màn hình",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "Vâng, tham gia cuộc gọi",
|
||||
"text": "Cuộc gọi đã tồn tại, bạn có muốn tham gia không?",
|
||||
"title": "Tham gia cuộc gọi?"
|
||||
},
|
||||
"layout_spotlight_label": "Tiêu điểm",
|
||||
"lobby": {
|
||||
"join_button": "Tham gia cuộc gọi"
|
||||
},
|
||||
"logging_in": "Đang đăng nhập…",
|
||||
"login_auth_links": "<0>Tạo tài khoản</0> Hay <2>Tham gia dưới tên khác</2>",
|
||||
"login_title": "Đăng nhập",
|
||||
"rageshake_request_modal": {
|
||||
"body": "Một người dùng khác trong cuộc gọi đang gặp vấn đề. Để có thể chẩn đoán tốt hơn chúng tôi muốn thu thập nhật ký gỡ lỗi.",
|
||||
"title": "Yêu cầu nhật ký gỡ lỗi"
|
||||
},
|
||||
"rageshake_sending": "Đang gửi…",
|
||||
"recaptcha_not_loaded": "Chưa tải được Recaptcha",
|
||||
"register": {
|
||||
"passwords_must_match": "Mật khẩu phải khớp",
|
||||
"registering": "Đang đăng ký…"
|
||||
},
|
||||
"register_auth_links": "<0>Đã có tài khoản?</0><1><0>Đăng nhập</0> Hay <2>Tham gia dưới tên Khách</2></1>",
|
||||
"register_confirm_password_label": "Xác nhận mật khẩu",
|
||||
"room_auth_view_join_button": "Tham gia cuộc gọi",
|
||||
"screenshare_button_label": "Chia sẻ màn hình",
|
||||
"settings": {
|
||||
"developer_settings_label": "Cài đặt phát triển",
|
||||
"developer_tab_title": "Nhà phát triển",
|
||||
"feedback_tab_description_label": "Phản hồi của bạn",
|
||||
"feedback_tab_h4": "Gửi phản hồi",
|
||||
"feedback_tab_send_logs_label": "Kèm theo nhật ký gỡ lỗi",
|
||||
"feedback_tab_thank_you": "Cảm ơn, chúng tôi đã nhận được phản hồi!",
|
||||
"feedback_tab_title": "Phản hồi",
|
||||
"speaker_device_selection_label": "Loa"
|
||||
},
|
||||
"submitting": "Đang gửi…",
|
||||
"unauthenticated_view_body": "Chưa đăng ký? <2>Tạo tài khoản</2>",
|
||||
"unauthenticated_view_login_button": "Đăng nhập vào tài khoản của bạn",
|
||||
"version": "Phiên bản: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} đang trình bày"
|
||||
},
|
||||
"waiting_for_participants": "Đang đợi những người khác…"
|
||||
}
|
||||
|
||||
@@ -1,115 +1,135 @@
|
||||
{
|
||||
"Yes, join call": "是,加入通话",
|
||||
"Waiting for other participants…": "等待其他参与者……",
|
||||
"Video": "视频",
|
||||
"Version: {{version}}": "版本:{{version}}",
|
||||
"Username": "用户名",
|
||||
"User menu": "用户菜单",
|
||||
"This call already exists, would you like to join?": "该通话已存在,你想加入吗?",
|
||||
"Submit feedback": "提交反馈",
|
||||
"Spotlight": "聚焦模式",
|
||||
"Speaker": "发言人",
|
||||
"Sign out": "登出",
|
||||
"Sign in": "登录",
|
||||
"Audio": "音频",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "这个通话中的另一个用户出现了问题。为了更好地诊断这些问题,我们想收集调试日志。",
|
||||
"<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>": "<0>为何不设置密码来保留你的账户?</0><1>保留昵称并设置头像,以便在未来的通话中使用。</1>",
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>创建账户</0> Or <2>以访客身份继续</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>已有账户?</0><1><0>登录</0> Or <2>以访客身份继续</2></1>",
|
||||
"Share screen": "屏幕共享",
|
||||
"Settings": "设置",
|
||||
"Sending…": "正在发送……",
|
||||
"Sending debug logs…": "正在发送调试日志……",
|
||||
"Send debug logs": "发送调试日志",
|
||||
"Select an option": "选择一个选项",
|
||||
"Return to home screen": "返回主页",
|
||||
"Remove": "移除",
|
||||
"Registering…": "正在注册……",
|
||||
"Register": "注册",
|
||||
"Recaptcha not loaded": "recaptcha未加载",
|
||||
"Recaptcha dismissed": "人机验证失败",
|
||||
"Profile": "个人信息",
|
||||
"Passwords must match": "密码必须匹配",
|
||||
"Password": "密码",
|
||||
"Not registered yet? <2>Create an account</2>": "还没有注册? <2>创建账户<2>",
|
||||
"Not now, return to home screen": "暂不,返回主页",
|
||||
"No": "否",
|
||||
"More": "更多",
|
||||
"Microphone": "麦克风",
|
||||
"Login to your account": "登录你的账户",
|
||||
"Login": "登录",
|
||||
"Logging in…": "登录中……",
|
||||
"Local volume": "本地音量",
|
||||
"Loading…": "加载中……",
|
||||
"Join existing call?": "是否加入现有的通话?",
|
||||
"Join call now": "现在加入通话",
|
||||
"Join call": "加入通话",
|
||||
"Include debug logs": "包含调试日志",
|
||||
"Home": "主页",
|
||||
"Go": "开始",
|
||||
"Full screen": "全屏",
|
||||
"Exit full screen": "退出全屏",
|
||||
"Element Call Home": "Element Call主页",
|
||||
"Display name": "显示名称",
|
||||
"Developer": "开发者",
|
||||
"Debug log request": "调试日志请求",
|
||||
"Create account": "创建账户",
|
||||
"Copy": "复制",
|
||||
"Copied!": "已复制!",
|
||||
"Confirm password": "确认密码",
|
||||
"Close": "关闭",
|
||||
"Camera": "摄像头",
|
||||
"Avatar": "头像",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>哎哟,出问题了。</0>",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>您可以取消选中复选框来撤回同意。如果正在通话中,此设置将在通话结束时生效。",
|
||||
"Encrypted": "已加密",
|
||||
"End call": "通话结束",
|
||||
"Grid": "网格",
|
||||
"Microphone off": "麦克风关闭",
|
||||
"Microphone on": "麦克风开启",
|
||||
"Not encrypted": "未加密",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"Sharing screen": "屏幕共享",
|
||||
"You": "你",
|
||||
"Continue in browser": "在浏览器中继续",
|
||||
"Mute microphone": "静音麦克风",
|
||||
"Name of call": "通话名称",
|
||||
"Open in the app": "在应用中打开",
|
||||
"Ready to join?": "准备好加入了吗?",
|
||||
"Back to recents": "返回最近通话",
|
||||
"Select app": "选择应用程序",
|
||||
"Start new call": "开始新通话",
|
||||
"Start video": "开始视频",
|
||||
"Stop video": "停止视频",
|
||||
"Unmute microphone": "取消麦克风静音",
|
||||
"Call not found": "未找到通话",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "现在,通话是端对端加密的,需要从主页创建。这有助于确保每个人都使用相同的加密密钥。",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "您的浏览器不支持媒体端对端加密。支持的浏览器有 Chrome、Safari、Firefox >=117",
|
||||
"{{count}} stars|other": "{{count}} 个星",
|
||||
"{{displayName}} is presenting": "{{displayName}}正在展示",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}},通话已结束。",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>提交日志以帮助我们修复问题。</0>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>我们需要您的反馈以提升用户体验。</0>",
|
||||
"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 <5>Cookie Policy</5>.": "参与测试即表示您同意我们收集匿名数据,用于改进产品。您可以在我们的<2>隐私政策</2>和<5>Cookie政策</5>中找到有关我们跟踪哪些数据以及更多信息。",
|
||||
"Expose developer settings in the settings window.": "在设置中显示开发者设置。",
|
||||
"Show connection stats": "显示连接统计信息",
|
||||
"Thanks, we received your feedback!": "谢谢,我们收到了反馈!",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "点击 \"开始\",即表示您同意我们的<2>最终用户许可协议 (EULA)</2>",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "点击 \"加入通话\",即表示您同意我们的<2>最终用户许可协议 (EULA)</2>",
|
||||
"{{count}} stars|one": "{{count}} 个星",
|
||||
"<0>Thanks for your feedback!</0>": "<0>感谢反馈!</0>",
|
||||
"Your feedback": "您的反馈",
|
||||
"Connectivity to the server has been lost.": "与服务器的连接中断。",
|
||||
"Developer Settings": "开发者设置",
|
||||
"Feedback": "反馈",
|
||||
"Submit": "提交",
|
||||
"Reconnect": "重新连接",
|
||||
"How did it go?": "进展如何?",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "如果遇到问题或想提供一些反馈意见,请在下面向我们发送简短描述。",
|
||||
"Retry sending logs": "重传日志",
|
||||
"Submitting…": "提交中…",
|
||||
"Thanks!": "谢谢!",
|
||||
"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 保护,适用于Google的 <2>隐私政策</2>和 <6>服务条款</6>。 <9></9>点击 \"注册\",即表示您同意我们的 <12>最终用户许可协议 (EULA)</12>",
|
||||
"You were disconnected from the call": "通话已中断"
|
||||
"a11y": {
|
||||
"user_menu": "用户菜单"
|
||||
},
|
||||
"action": {
|
||||
"close": "关闭",
|
||||
"copy": "复制",
|
||||
"go": "开始",
|
||||
"no": "否",
|
||||
"register": "注册",
|
||||
"remove": "移除",
|
||||
"sign_in": "登录",
|
||||
"sign_out": "登出",
|
||||
"submit": "提交"
|
||||
},
|
||||
"analytics_notice": "参与测试即表示您同意我们收集匿名数据,用于改进产品。您可以在我们的<2>隐私政策</2>和<5>Cookie政策</5>中找到有关我们跟踪哪些数据以及更多信息。",
|
||||
"app_selection_modal": {
|
||||
"continue_in_browser": "在浏览器中继续",
|
||||
"open_in_app": "在应用中打开",
|
||||
"text": "准备好加入了吗?",
|
||||
"title": "选择应用程序"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "您的浏览器不支持媒体端对端加密。支持的浏览器有 Chrome、Safari、Firefox >=117",
|
||||
"call_ended_view": {
|
||||
"body": "通话已中断",
|
||||
"create_account_button": "创建账户",
|
||||
"create_account_prompt": "<0>为何不设置密码来保留你的账户?</0><1>保留昵称并设置头像,以便在未来的通话中使用。</1>",
|
||||
"feedback_done": "<0>感谢反馈!</0>",
|
||||
"feedback_prompt": "<0>我们需要您的反馈以提升用户体验。</0>",
|
||||
"headline": "{{displayName}},通话已结束。",
|
||||
"not_now_button": "暂不,返回主页",
|
||||
"reconnect_button": "重新连接",
|
||||
"survey_prompt": "进展如何?"
|
||||
},
|
||||
"call_name": "通话名称",
|
||||
"common": {
|
||||
"audio": "音频",
|
||||
"avatar": "头像",
|
||||
"camera": "摄像头",
|
||||
"copied": "已复制!",
|
||||
"display_name": "显示名称",
|
||||
"encrypted": "已加密",
|
||||
"home": "主页",
|
||||
"loading": "加载中……",
|
||||
"microphone": "麦克风",
|
||||
"password": "密码",
|
||||
"profile": "个人信息",
|
||||
"settings": "设置",
|
||||
"unencrypted": "未加密",
|
||||
"username": "用户名",
|
||||
"video": "视频"
|
||||
},
|
||||
"disconnected_banner": "与服务器的连接中断。",
|
||||
"exit_fullscreen_button_label": "退出全屏",
|
||||
"full_screen_view_description": "<0>提交日志以帮助我们修复问题。</0>",
|
||||
"full_screen_view_h1": "<0>哎哟,出问题了。</0>",
|
||||
"fullscreen_button_label": "全屏",
|
||||
"group_call_loader_failed_heading": "未找到通话",
|
||||
"group_call_loader_failed_text": "现在,通话是端对端加密的,需要从主页创建。这有助于确保每个人都使用相同的加密密钥。",
|
||||
"hangup_button_label": "通话结束",
|
||||
"header_label": "Element Call主页",
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "是,加入通话",
|
||||
"text": "该通话已存在,你想加入吗?",
|
||||
"title": "是否加入现有的通话?"
|
||||
},
|
||||
"layout_grid_label": "网格",
|
||||
"layout_spotlight_label": "聚焦模式",
|
||||
"lobby": {
|
||||
"join_button": "加入通话",
|
||||
"leave_button": "返回最近通话"
|
||||
},
|
||||
"local_volume_label": "本地音量",
|
||||
"logging_in": "登录中……",
|
||||
"login_auth_links": "<0>创建账户</0> Or <2>以访客身份继续</2>",
|
||||
"login_title": "登录",
|
||||
"microphone_off": "麦克风关闭",
|
||||
"microphone_on": "麦克风开启",
|
||||
"mute_microphone_button_label": "静音麦克风",
|
||||
"rageshake_button_error_caption": "重传日志",
|
||||
"rageshake_request_modal": {
|
||||
"body": "这个通话中的另一个用户出现了问题。为了更好地诊断这些问题,我们想收集调试日志。",
|
||||
"title": "调试日志请求"
|
||||
},
|
||||
"rageshake_send_logs": "发送调试日志",
|
||||
"rageshake_sending": "正在发送……",
|
||||
"rageshake_sending_logs": "正在发送调试日志……",
|
||||
"rageshake_sent": "谢谢!",
|
||||
"recaptcha_caption": "该站点受 ReCAPTCHA 保护,适用于Google的 <2>隐私政策</2>和 <6>服务条款</6>。 <9></9>点击 \"注册\",即表示您同意我们的 <12>最终用户许可协议 (EULA)</12>",
|
||||
"recaptcha_dismissed": "人机验证失败",
|
||||
"recaptcha_not_loaded": "recaptcha未加载",
|
||||
"register": {
|
||||
"passwords_must_match": "密码必须匹配",
|
||||
"registering": "正在注册……"
|
||||
},
|
||||
"register_auth_links": "<0>已有账户?</0><1><0>登录</0> Or <2>以访客身份继续</2></1>",
|
||||
"register_confirm_password_label": "确认密码",
|
||||
"return_home_button": "返回主页",
|
||||
"room_auth_view_eula_caption": "点击 \"加入通话\",即表示您同意我们的<2>最终用户许可协议 (EULA)</2>",
|
||||
"room_auth_view_join_button": "现在加入通话",
|
||||
"screenshare_button_label": "屏幕共享",
|
||||
"select_input_unset_button": "选择一个选项",
|
||||
"settings": {
|
||||
"developer_settings_label": "开发者设置",
|
||||
"developer_settings_label_description": "在设置中显示开发者设置。",
|
||||
"developer_tab_title": "开发者",
|
||||
"feedback_tab_body": "如果遇到问题或想提供一些反馈意见,请在下面向我们发送简短描述。",
|
||||
"feedback_tab_description_label": "您的反馈",
|
||||
"feedback_tab_h4": "提交反馈",
|
||||
"feedback_tab_send_logs_label": "包含调试日志",
|
||||
"feedback_tab_thank_you": "谢谢,我们收到了反馈!",
|
||||
"feedback_tab_title": "反馈",
|
||||
"more_tab_title": "更多",
|
||||
"opt_in_description": "<0></0><1></1>您可以取消选中复选框来撤回同意。如果正在通话中,此设置将在通话结束时生效。",
|
||||
"show_connection_stats_label": "显示连接统计信息",
|
||||
"speaker_device_selection_label": "发言人"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} 个星",
|
||||
"star_rating_input_label_other": "{{count}} 个星",
|
||||
"start_new_call": "开始新通话",
|
||||
"start_video_button_label": "开始视频",
|
||||
"stop_screenshare_button_label": "屏幕共享",
|
||||
"stop_video_button_label": "停止视频",
|
||||
"submitting": "提交中…",
|
||||
"unauthenticated_view_body": "还没有注册? <2>创建账户<2>",
|
||||
"unauthenticated_view_eula_caption": "点击 \"开始\",即表示您同意我们的<2>最终用户许可协议 (EULA)</2>",
|
||||
"unauthenticated_view_login_button": "登录你的账户",
|
||||
"unmute_microphone_button_label": "取消麦克风静音",
|
||||
"version": "版本:{{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}}正在展示",
|
||||
"sfu_participant_local": "你"
|
||||
},
|
||||
"waiting_for_participants": "等待其他参与者……"
|
||||
}
|
||||
|
||||
@@ -1,120 +1,142 @@
|
||||
{
|
||||
"<0>Create an account</0> Or <2>Access as a guest</2>": "<0>建立帳號</0> 或<2>以訪客身份登入</2>",
|
||||
"<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>": "<0>已經有帳號?</0><1><0>登入</0> 或<2>以訪客身份登入</2></1>",
|
||||
"Expose developer settings in the settings window.": "在設定視窗中顯示開發者設定。",
|
||||
"Developer Settings": "開發者設定",
|
||||
"<0>Submitting debug logs will help us track down the problem.</0>": "<0>送出除錯紀錄,可幫助我們修正問題。</0>",
|
||||
"<0>Oops, something's gone wrong.</0>": "<0>喔喔,有些地方怪怪的。</0>",
|
||||
"Yes, join call": "是,加入對話",
|
||||
"Waiting for other participants…": "等待其他參加者…",
|
||||
"Video": "視訊",
|
||||
"Version: {{version}}": "版本: {{version}}",
|
||||
"Username": "使用者名稱",
|
||||
"User menu": "使用者選單",
|
||||
"This call already exists, would you like to join?": "通話已經開始,請問您要加入嗎?",
|
||||
"Submit feedback": "遞交回覆",
|
||||
"Spotlight": "聚焦",
|
||||
"Speaker": "發言者",
|
||||
"Sign out": "登出",
|
||||
"Sign in": "登入",
|
||||
"Share screen": "分享畫面",
|
||||
"Settings": "設定",
|
||||
"Sending…": "傳送中…",
|
||||
"Sending debug logs…": "傳送除錯記錄檔中…",
|
||||
"Send debug logs": "傳送除錯紀錄",
|
||||
"Select an option": "選擇一個選項",
|
||||
"Return to home screen": "回到首頁",
|
||||
"Remove": "移除",
|
||||
"Registering…": "註冊中…",
|
||||
"Register": "註冊",
|
||||
"Recaptcha not loaded": "驗證碼未載入",
|
||||
"Recaptcha dismissed": "略過驗證碼",
|
||||
"Profile": "個人檔案",
|
||||
"Passwords must match": "密碼必須相符",
|
||||
"Password": "密碼",
|
||||
"Not registered yet? <2>Create an account</2>": "還沒註冊嗎?<2>建立帳號</2>",
|
||||
"Not now, return to home screen": "現在不行,回到首頁",
|
||||
"No": "否",
|
||||
"More": "更多",
|
||||
"Microphone": "麥克風",
|
||||
"Login to your account": "登入您的帳號",
|
||||
"Login": "登入",
|
||||
"Logging in…": "登入中…",
|
||||
"Local volume": "您的音量",
|
||||
"Loading…": "載入中…",
|
||||
"Join existing call?": "加入已開始的通話嗎?",
|
||||
"Join call now": "現在加入通話",
|
||||
"Join call": "加入通話",
|
||||
"Include debug logs": "包含除錯紀錄",
|
||||
"Home": "首頁",
|
||||
"Go": "前往",
|
||||
"Full screen": "全螢幕",
|
||||
"Exit full screen": "退出全螢幕",
|
||||
"Element Call Home": "Element Call 首頁",
|
||||
"Display name": "顯示名稱",
|
||||
"Developer": "開發者",
|
||||
"Debug log request": "請求偵錯報告",
|
||||
"Create account": "建立帳號",
|
||||
"Copy": "複製",
|
||||
"Copied!": "已複製!",
|
||||
"Confirm password": "確認密碼",
|
||||
"Close": "關閉",
|
||||
"Camera": "相機",
|
||||
"Avatar": "大頭照",
|
||||
"Audio": "語音",
|
||||
"Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "這通對話中的另一位使用者遇到了某些問題。為了診斷問題,我們將會建立除錯紀錄。",
|
||||
"<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>": "<0>何不設定密碼以保留此帳號?</0><1>您可以保留暱稱並設定頭像,以便未來通話時使用</1>",
|
||||
"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 <5>Cookie Policy</5>.": "參與此測試版即表示您同意蒐集匿名資料,我們使用這些資料來改進產品。您可以在我們的<2>隱私政策</2>與我們的 <5>Cookie 政策</5> 中找到關於我們追蹤哪些資料的更多資訊。",
|
||||
"<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.": "<0></0><1></1>您可以透過取消核取此方塊來撤回同意。若您目前正在通話中,此設定將在通話結束時生效。",
|
||||
"Your feedback": "您的回饋",
|
||||
"Thanks, we received your feedback!": "感謝,我們已經收到您的回饋了!",
|
||||
"Submitting…": "正在遞交……",
|
||||
"Submit": "遞交",
|
||||
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "若您遇到問題或只是想提供一些回饋,請在下方傳送簡短說明給我們。",
|
||||
"Feedback": "回饋",
|
||||
"{{count}} stars|other": "{{count}} 個星星",
|
||||
"<0>Thanks for your feedback!</0>": "<0>感謝您的回饋!</0>",
|
||||
"<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>我們想要聽到您的回饋,如此我們才能改善您的體驗。</0>",
|
||||
"{{count}} stars|one": "{{count}} 個星星",
|
||||
"{{displayName}}, your call has ended.": "{{displayName}},您的通話已結束。",
|
||||
"How did it go?": "進展如何?",
|
||||
"{{displayName}} is presenting": "{{displayName}} 正在展示",
|
||||
"Show connection stats": "顯示連線統計資料",
|
||||
"By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "點擊「前往」即表示您同意我們的<2>終端使用者授權協議 (EULA)</2>",
|
||||
"By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "點擊「立刻加入通話」即表示您同意我們的<2>終端使用者授權協議 (EULA)</2>",
|
||||
"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 保護,並適用 Google 的<2>隱私權政策</2>與<6>服務條款</6>。<9></9>點擊「註冊」即表示您同意我們的<12>終端使用者授權協議 (EULA)</12>",
|
||||
"Connectivity to the server has been lost.": "到伺服器的連線已遺失。",
|
||||
"Reconnect": "重新連線",
|
||||
"Retry sending logs": "重試傳送紀錄檔",
|
||||
"Thanks!": "感謝!",
|
||||
"You were disconnected from the call": "您已從通話斷線",
|
||||
"{{count, number}}|one": "{{count, number}}",
|
||||
"{{count, number}}|other": "{{count, number}}",
|
||||
"Encrypted": "已加密",
|
||||
"End call": "結束通話",
|
||||
"Grid": "網格",
|
||||
"Microphone off": "麥克風關閉",
|
||||
"Microphone on": "麥克風開啟",
|
||||
"Not encrypted": "未加密",
|
||||
"Sharing screen": "分享畫面",
|
||||
"You": "您",
|
||||
"Continue in browser": "在瀏覽器中繼續",
|
||||
"Mute microphone": "將麥克風靜音",
|
||||
"Name of call": "通話名稱",
|
||||
"Open in the app": "在應用程式中開啟",
|
||||
"Ready to join?": "準備好加入了?",
|
||||
"Select app": "選取應用程式",
|
||||
"Start new call": "開始新通話",
|
||||
"Start video": "開始影片",
|
||||
"Back to recents": "回到最近的通話",
|
||||
"Stop video": "停止影片",
|
||||
"Unmute microphone": "將麥克風取消靜音",
|
||||
"Call not found": "找不到通話",
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.": "通話現在是端對端加密的,必須從首頁建立。這有助於確保每個人都使用相同的加密金鑰。",
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "您的網路瀏覽器不支援媒體端到端加密。支援的瀏覽器包含了 Chrome、Safari、Firefox >=117",
|
||||
"Copy link": "複製連結",
|
||||
"Invite": "邀請",
|
||||
"Invite to this call": "邀請到此通話",
|
||||
"Link copied to clipboard": "連結已複製到剪貼簿",
|
||||
"Participants": "參與者"
|
||||
"a11y": {
|
||||
"user_menu": "使用者選單"
|
||||
},
|
||||
"action": {
|
||||
"close": "關閉",
|
||||
"copy": "複製",
|
||||
"copy_link": "複製連結",
|
||||
"go": "前往",
|
||||
"invite": "邀請",
|
||||
"no": "否",
|
||||
"register": "註冊",
|
||||
"remove": "移除",
|
||||
"sign_in": "登入",
|
||||
"sign_out": "登出",
|
||||
"submit": "遞交"
|
||||
},
|
||||
"analytics_notice": "參與此測試版即表示您同意蒐集匿名資料,我們使用這些資料來改進產品。您可以在我們的<2>隱私政策</2>與我們的 <5>Cookie 政策</5> 中找到關於我們追蹤哪些資料的更多資訊。",
|
||||
"app_selection_modal": {
|
||||
"continue_in_browser": "在瀏覽器中繼續",
|
||||
"open_in_app": "在應用程式中開啟",
|
||||
"text": "準備好加入了?",
|
||||
"title": "選取應用程式"
|
||||
},
|
||||
"browser_media_e2ee_unsupported": "您的網路瀏覽器不支援媒體端到端加密。支援的瀏覽器包含了 Chrome、Safari、Firefox >=117",
|
||||
"call_ended_view": {
|
||||
"body": "您已從通話斷線",
|
||||
"create_account_button": "建立帳號",
|
||||
"create_account_prompt": "<0>何不設定密碼以保留此帳號?</0><1>您可以保留暱稱並設定頭像,以便未來通話時使用</1>",
|
||||
"feedback_done": "<0>感謝您的回饋!</0>",
|
||||
"feedback_prompt": "<0>我們想要聽到您的回饋,如此我們才能改善您的體驗。</0>",
|
||||
"headline": "{{displayName}},您的通話已結束。",
|
||||
"not_now_button": "現在不行,回到首頁",
|
||||
"reconnect_button": "重新連線",
|
||||
"survey_prompt": "進展如何?"
|
||||
},
|
||||
"call_name": "通話名稱",
|
||||
"common": {
|
||||
"audio": "語音",
|
||||
"avatar": "大頭照",
|
||||
"camera": "相機",
|
||||
"copied": "已複製!",
|
||||
"display_name": "顯示名稱",
|
||||
"encrypted": "已加密",
|
||||
"home": "首頁",
|
||||
"loading": "載入中…",
|
||||
"microphone": "麥克風",
|
||||
"password": "密碼",
|
||||
"profile": "個人檔案",
|
||||
"settings": "設定",
|
||||
"unencrypted": "未加密",
|
||||
"username": "使用者名稱",
|
||||
"video": "視訊"
|
||||
},
|
||||
"disconnected_banner": "到伺服器的連線已遺失。",
|
||||
"exit_fullscreen_button_label": "退出全螢幕",
|
||||
"full_screen_view_description": "<0>送出除錯紀錄,可幫助我們修正問題。</0>",
|
||||
"full_screen_view_h1": "<0>喔喔,有些地方怪怪的。</0>",
|
||||
"fullscreen_button_label": "全螢幕",
|
||||
"group_call_loader_failed_heading": "找不到通話",
|
||||
"group_call_loader_failed_text": "通話現在是端對端加密的,必須從首頁建立。這有助於確保每個人都使用相同的加密金鑰。",
|
||||
"hangup_button_label": "結束通話",
|
||||
"header_label": "Element Call 首頁",
|
||||
"header_participants_label": "參與者",
|
||||
"invite_modal": {
|
||||
"link_copied_toast": "連結已複製到剪貼簿",
|
||||
"title": "邀請到此通話"
|
||||
},
|
||||
"join_existing_call_modal": {
|
||||
"join_button": "是,加入對話",
|
||||
"text": "通話已經開始,請問您要加入嗎?",
|
||||
"title": "加入已開始的通話嗎?"
|
||||
},
|
||||
"layout_grid_label": "網格",
|
||||
"layout_spotlight_label": "聚焦",
|
||||
"lobby": {
|
||||
"join_button": "加入通話",
|
||||
"leave_button": "回到最近的通話"
|
||||
},
|
||||
"local_volume_label": "您的音量",
|
||||
"logging_in": "登入中…",
|
||||
"login_auth_links": "<0>建立帳號</0> 或<2>以訪客身份登入</2>",
|
||||
"login_title": "登入",
|
||||
"microphone_off": "麥克風關閉",
|
||||
"microphone_on": "麥克風開啟",
|
||||
"mute_microphone_button_label": "將麥克風靜音",
|
||||
"rageshake_button_error_caption": "重試傳送紀錄檔",
|
||||
"rageshake_request_modal": {
|
||||
"body": "這通對話中的另一位使用者遇到了某些問題。為了診斷問題,我們將會建立除錯紀錄。",
|
||||
"title": "請求偵錯報告"
|
||||
},
|
||||
"rageshake_send_logs": "傳送除錯紀錄",
|
||||
"rageshake_sending": "傳送中…",
|
||||
"rageshake_sending_logs": "傳送除錯記錄檔中…",
|
||||
"rageshake_sent": "感謝!",
|
||||
"recaptcha_caption": "此網站被 ReCAPTCHA 保護,並適用 Google 的<2>隱私權政策</2>與<6>服務條款</6>。<9></9>點擊「註冊」即表示您同意我們的<12>終端使用者授權協議 (EULA)</12>",
|
||||
"recaptcha_dismissed": "略過驗證碼",
|
||||
"recaptcha_not_loaded": "驗證碼未載入",
|
||||
"register": {
|
||||
"passwords_must_match": "密碼必須相符",
|
||||
"registering": "註冊中…"
|
||||
},
|
||||
"register_auth_links": "<0>已經有帳號?</0><1><0>登入</0> 或<2>以訪客身份登入</2></1>",
|
||||
"register_confirm_password_label": "確認密碼",
|
||||
"return_home_button": "回到首頁",
|
||||
"room_auth_view_eula_caption": "點擊「立刻加入通話」即表示您同意我們的<2>終端使用者授權協議 (EULA)</2>",
|
||||
"room_auth_view_join_button": "現在加入通話",
|
||||
"screenshare_button_label": "分享畫面",
|
||||
"select_input_unset_button": "選擇一個選項",
|
||||
"settings": {
|
||||
"developer_settings_label": "開發者設定",
|
||||
"developer_settings_label_description": "在設定視窗中顯示開發者設定。",
|
||||
"developer_tab_title": "開發者",
|
||||
"feedback_tab_body": "若您遇到問題或只是想提供一些回饋,請在下方傳送簡短說明給我們。",
|
||||
"feedback_tab_description_label": "您的回饋",
|
||||
"feedback_tab_h4": "遞交回覆",
|
||||
"feedback_tab_send_logs_label": "包含除錯紀錄",
|
||||
"feedback_tab_thank_you": "感謝,我們已經收到您的回饋了!",
|
||||
"feedback_tab_title": "回饋",
|
||||
"more_tab_title": "更多",
|
||||
"opt_in_description": "<0></0><1></1>您可以透過取消核取此方塊來撤回同意。若您目前正在通話中,此設定將在通話結束時生效。",
|
||||
"show_connection_stats_label": "顯示連線統計資料",
|
||||
"speaker_device_selection_label": "發言者"
|
||||
},
|
||||
"star_rating_input_label_one": "{{count}} 個星星",
|
||||
"star_rating_input_label_other": "{{count}} 個星星",
|
||||
"start_new_call": "開始新通話",
|
||||
"start_video_button_label": "開始影片",
|
||||
"stop_screenshare_button_label": "分享畫面",
|
||||
"stop_video_button_label": "停止影片",
|
||||
"submitting": "正在遞交……",
|
||||
"unauthenticated_view_body": "還沒註冊嗎?<2>建立帳號</2>",
|
||||
"unauthenticated_view_eula_caption": "點擊「前往」即表示您同意我們的<2>終端使用者授權協議 (EULA)</2>",
|
||||
"unauthenticated_view_login_button": "登入您的帳號",
|
||||
"unmute_microphone_button_label": "將麥克風取消靜音",
|
||||
"version": "版本: {{version}}",
|
||||
"video_tile": {
|
||||
"presenter_label": "{{displayName}} 正在展示",
|
||||
"sfu_participant_local": "您"
|
||||
},
|
||||
"waiting_for_participants": "等待其他參加者…"
|
||||
}
|
||||
|
||||
@@ -7,5 +7,19 @@
|
||||
"matchPackagePatterns": ["matrix-js-sdk"],
|
||||
"enabled": false
|
||||
}
|
||||
],
|
||||
"ignoreDeps": [
|
||||
"@react-aria/button",
|
||||
"@react-aria/focus",
|
||||
"@react-aria/menu",
|
||||
"@react-aria/overlays",
|
||||
"@react-aria/select",
|
||||
"@react-aria/tabs",
|
||||
"@react-aria/tooltip",
|
||||
"@react-aria/utils",
|
||||
"@react-stately/collections",
|
||||
"@react-stately/select",
|
||||
"@react-stately/tooltip",
|
||||
"@react-stately/tree"
|
||||
]
|
||||
}
|
||||
|
||||
29
src/@types/i18next.d.ts
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
Copyright 2023 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import "i18next";
|
||||
// import all namespaces (for the default language, only)
|
||||
import app from "../../public/locales/en-GB/app.json";
|
||||
|
||||
declare module "i18next" {
|
||||
interface CustomTypeOptions {
|
||||
defaultNS: "app";
|
||||
keySeparator: ".";
|
||||
resources: {
|
||||
app: typeof app;
|
||||
};
|
||||
}
|
||||
}
|
||||
61
src/App.tsx
@@ -24,6 +24,7 @@ import {
|
||||
import * as Sentry from "@sentry/react";
|
||||
import { OverlayProvider } from "@react-aria/overlays";
|
||||
import { History } from "history";
|
||||
import { TooltipProvider } from "@vector-im/compound-web";
|
||||
|
||||
import { HomePage } from "./home/HomePage";
|
||||
import { LoginPage } from "./auth/LoginPage";
|
||||
@@ -77,35 +78,37 @@ export const App: FC<AppProps> = ({ history }) => {
|
||||
// @ts-ignore
|
||||
<Router history={history}>
|
||||
<BackgroundProvider>
|
||||
{loaded ? (
|
||||
<Suspense fallback={null}>
|
||||
<ClientProvider>
|
||||
<MediaDevicesProvider>
|
||||
<Sentry.ErrorBoundary fallback={errorPage}>
|
||||
<OverlayProvider>
|
||||
<DisconnectedBanner />
|
||||
<Switch>
|
||||
<SentryRoute exact path="/">
|
||||
<HomePage />
|
||||
</SentryRoute>
|
||||
<SentryRoute exact path="/login">
|
||||
<LoginPage />
|
||||
</SentryRoute>
|
||||
<SentryRoute exact path="/register">
|
||||
<RegisterPage />
|
||||
</SentryRoute>
|
||||
<SentryRoute path="*">
|
||||
<RoomPage />
|
||||
</SentryRoute>
|
||||
</Switch>
|
||||
</OverlayProvider>
|
||||
</Sentry.ErrorBoundary>
|
||||
</MediaDevicesProvider>
|
||||
</ClientProvider>
|
||||
</Suspense>
|
||||
) : (
|
||||
<LoadingView />
|
||||
)}
|
||||
<TooltipProvider>
|
||||
{loaded ? (
|
||||
<Suspense fallback={null}>
|
||||
<ClientProvider>
|
||||
<MediaDevicesProvider>
|
||||
<Sentry.ErrorBoundary fallback={errorPage}>
|
||||
<OverlayProvider>
|
||||
<DisconnectedBanner />
|
||||
<Switch>
|
||||
<SentryRoute exact path="/">
|
||||
<HomePage />
|
||||
</SentryRoute>
|
||||
<SentryRoute exact path="/login">
|
||||
<LoginPage />
|
||||
</SentryRoute>
|
||||
<SentryRoute exact path="/register">
|
||||
<RegisterPage />
|
||||
</SentryRoute>
|
||||
<SentryRoute path="*">
|
||||
<RoomPage />
|
||||
</SentryRoute>
|
||||
</Switch>
|
||||
</OverlayProvider>
|
||||
</Sentry.ErrorBoundary>
|
||||
</MediaDevicesProvider>
|
||||
</ClientProvider>
|
||||
</Suspense>
|
||||
) : (
|
||||
<LoadingView />
|
||||
)}
|
||||
</TooltipProvider>
|
||||
</BackgroundProvider>
|
||||
</Router>
|
||||
);
|
||||
|
||||
@@ -257,9 +257,7 @@ export const ClientProvider: FC<Props> = ({ children }) => {
|
||||
"message",
|
||||
useCallback(() => {
|
||||
initClientState?.client.stopClient();
|
||||
setAlreadyOpenedErr(
|
||||
translatedError("This application has been opened in another tab.", t),
|
||||
);
|
||||
setAlreadyOpenedErr(translatedError("application_opened_another_tab", t));
|
||||
}, [initClientState?.client, setAlreadyOpenedErr, t]),
|
||||
);
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ export const DisconnectedBanner: FC<Props> = ({
|
||||
{shouldShowBanner && (
|
||||
<div className={classNames(styles.banner, className)} {...rest}>
|
||||
{children}
|
||||
{t("Connectivity to the server has been lost.")}
|
||||
{t("disconnected_banner")}
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
|
||||
@@ -71,7 +71,7 @@ export const ErrorView: FC<ErrorViewProps> = ({ error }) => {
|
||||
|
||||
return (
|
||||
<FullScreenView>
|
||||
<h1>Error</h1>
|
||||
<h1>{t("common.error")}</h1>
|
||||
<p>
|
||||
{error instanceof TranslatedError
|
||||
? error.translatedMessage
|
||||
@@ -85,7 +85,7 @@ export const ErrorView: FC<ErrorViewProps> = ({ error }) => {
|
||||
className={styles.homeLink}
|
||||
onPress={onReload}
|
||||
>
|
||||
{t("Return to home screen")}
|
||||
{t("return_home_button")}
|
||||
</Button>
|
||||
) : (
|
||||
<LinkButton
|
||||
@@ -94,7 +94,7 @@ export const ErrorView: FC<ErrorViewProps> = ({ error }) => {
|
||||
className={styles.homeLink}
|
||||
to="/"
|
||||
>
|
||||
{t("Return to home screen")}
|
||||
{t("return_home_button")}
|
||||
</LinkButton>
|
||||
)}
|
||||
</FullScreenView>
|
||||
@@ -110,11 +110,11 @@ export const CrashView: FC = () => {
|
||||
|
||||
return (
|
||||
<FullScreenView>
|
||||
<Trans>
|
||||
<Trans i18nKey="full_screen_view_h1">
|
||||
<h1>Oops, something's gone wrong.</h1>
|
||||
</Trans>
|
||||
{Config.get().rageshake?.submit_url && (
|
||||
<Trans>
|
||||
<Trans i18nKey="full_screen_view_description">
|
||||
<p>Submitting debug logs will help us track down the problem.</p>
|
||||
</Trans>
|
||||
)}
|
||||
@@ -126,7 +126,7 @@ export const CrashView: FC = () => {
|
||||
className={styles.wideButton}
|
||||
onPress={onReload}
|
||||
>
|
||||
{t("Return to home screen")}
|
||||
{t("return_home_button")}
|
||||
</Button>
|
||||
</FullScreenView>
|
||||
);
|
||||
@@ -137,7 +137,7 @@ export const LoadingView: FC = () => {
|
||||
|
||||
return (
|
||||
<FullScreenView>
|
||||
<h1>{t("Loading…")}</h1>
|
||||
<h1>{t("common.loading")}</h1>
|
||||
</FullScreenView>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -105,7 +105,7 @@ export const HeaderLogo: FC<HeaderLogoProps> = ({ className }) => {
|
||||
<Link
|
||||
className={classNames(styles.headerLogo, className)}
|
||||
to="/"
|
||||
aria-label={t("Element Call Home")}
|
||||
aria-label={t("header_label")}
|
||||
>
|
||||
<Logo />
|
||||
</Link>
|
||||
@@ -155,10 +155,10 @@ export const RoomHeaderInfo: FC<RoomHeaderInfoProps> = ({
|
||||
<UserProfileIcon
|
||||
width={20}
|
||||
height={20}
|
||||
aria-label={t("Participants")}
|
||||
aria-label={t("header_participants_label")}
|
||||
/>
|
||||
<Text as="span" size="sm" weight="medium">
|
||||
{t("{{count, number}}", { count: participantCount })}
|
||||
{t("participant_count", { count: participantCount })}
|
||||
</Text>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -136,7 +136,7 @@ export const Modal: FC<Props> = ({
|
||||
<DialogClose
|
||||
className={styles.close}
|
||||
data-testid="modal_close"
|
||||
aria-label={t("Close")}
|
||||
aria-label={t("action.close")}
|
||||
>
|
||||
<CloseIcon width={20} height={20} />
|
||||
</DialogClose>
|
||||
|
||||
@@ -16,7 +16,6 @@ limitations under the License.
|
||||
|
||||
.bg {
|
||||
position: fixed;
|
||||
z-index: 100;
|
||||
inset: 0;
|
||||
background: rgba(3, 12, 27, 0.528);
|
||||
}
|
||||
@@ -49,7 +48,6 @@ limitations under the License.
|
||||
|
||||
.overlay {
|
||||
position: fixed;
|
||||
z-index: 101;
|
||||
}
|
||||
|
||||
.overlay.animate {
|
||||
|
||||
66
src/Slider.module.css
Normal file
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
Copyright 2023 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
.slider {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.track {
|
||||
flex-grow: 1;
|
||||
border-radius: var(--cpd-radius-pill-effect);
|
||||
background: var(--cpd-color-bg-subtle-primary);
|
||||
height: var(--cpd-space-2x);
|
||||
outline: var(--cpd-border-width-1) solid
|
||||
var(--cpd-color-border-interactive-primary);
|
||||
outline-offset: calc(-1 * var(--cpd-border-width-1));
|
||||
cursor: pointer;
|
||||
transition: outline-color ease 0.15s;
|
||||
}
|
||||
|
||||
.track[data-disabled] {
|
||||
cursor: initial;
|
||||
outline-color: var(--cpd-color-border-disabled);
|
||||
}
|
||||
|
||||
.highlight {
|
||||
background: var(--cpd-color-bg-action-primary-rest);
|
||||
position: absolute;
|
||||
block-size: 100%;
|
||||
border-radius: var(--cpd-radius-pill-effect);
|
||||
transition: background-color ease 0.15s;
|
||||
}
|
||||
|
||||
.highlight[data-disabled] {
|
||||
background: var(--cpd-color-bg-action-primary-disabled);
|
||||
}
|
||||
|
||||
.handle {
|
||||
display: block;
|
||||
block-size: var(--cpd-space-4x);
|
||||
inline-size: var(--cpd-space-4x);
|
||||
border-radius: var(--cpd-radius-pill-effect);
|
||||
background: var(--cpd-color-bg-action-primary-rest);
|
||||
box-shadow: 0 0 0 2px var(--cpd-color-bg-canvas-default);
|
||||
cursor: pointer;
|
||||
transition: background-color ease 0.15s;
|
||||
}
|
||||
|
||||
.handle[data-disabled] {
|
||||
cursor: initial;
|
||||
background: var(--cpd-color-bg-action-primary-disabled);
|
||||
}
|
||||
68
src/Slider.tsx
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
Copyright 2023 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { FC, useCallback } from "react";
|
||||
import { Root, Track, Range, Thumb } from "@radix-ui/react-slider";
|
||||
import classNames from "classnames";
|
||||
|
||||
import styles from "./Slider.module.css";
|
||||
|
||||
interface Props {
|
||||
className?: string;
|
||||
label: string;
|
||||
value: number;
|
||||
onValueChange: (value: number) => void;
|
||||
min: number;
|
||||
max: number;
|
||||
step: number;
|
||||
disabled?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* A slider control allowing a value to be selected from a range.
|
||||
*/
|
||||
export const Slider: FC<Props> = ({
|
||||
className,
|
||||
label,
|
||||
value,
|
||||
onValueChange: onValueChangeProp,
|
||||
min,
|
||||
max,
|
||||
step,
|
||||
disabled,
|
||||
}) => {
|
||||
const onValueChange = useCallback(
|
||||
([v]: number[]) => onValueChangeProp(v),
|
||||
[onValueChangeProp],
|
||||
);
|
||||
|
||||
return (
|
||||
<Root
|
||||
className={classNames(className, styles.slider)}
|
||||
value={[value]}
|
||||
onValueChange={onValueChange}
|
||||
min={min}
|
||||
max={max}
|
||||
step={step}
|
||||
disabled={disabled}
|
||||
>
|
||||
<Track className={styles.track}>
|
||||
<Range className={styles.highlight} />
|
||||
</Track>
|
||||
<Thumb className={styles.handle} aria-label={label} />
|
||||
</Root>
|
||||
);
|
||||
};
|
||||
@@ -59,6 +59,8 @@ const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
|
||||
},
|
||||
);
|
||||
|
||||
Tooltip.displayName = "Tooltip";
|
||||
|
||||
interface TooltipTriggerProps {
|
||||
children: ReactElement;
|
||||
placement?: Placement;
|
||||
@@ -112,3 +114,5 @@ export const TooltipTrigger = forwardRef<HTMLElement, TooltipTriggerProps>(
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
TooltipTrigger.displayName = "TooltipTrigger";
|
||||
|
||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import i18n from "i18next";
|
||||
import type { DefaultNamespace, ParseKeys, TFunction, TOptions } from "i18next";
|
||||
|
||||
/**
|
||||
* An error with messages in both English and the user's preferred language.
|
||||
@@ -27,8 +27,11 @@ export abstract class TranslatedError extends Error {
|
||||
*/
|
||||
public readonly translatedMessage: string;
|
||||
|
||||
public constructor(messageKey: string, translationFn: typeof i18n.t) {
|
||||
super(translationFn(messageKey, { lng: "en-GB" }));
|
||||
public constructor(
|
||||
messageKey: ParseKeys<DefaultNamespace, TOptions>,
|
||||
translationFn: TFunction<DefaultNamespace>,
|
||||
) {
|
||||
super(translationFn(messageKey, { lng: "en-GB" } as TOptions));
|
||||
this.translatedMessage = translationFn(messageKey);
|
||||
}
|
||||
}
|
||||
@@ -38,6 +41,6 @@ class TranslatedErrorImpl extends TranslatedError {}
|
||||
// i18next-parser can't detect calls to a constructor, so we expose a bare
|
||||
// function instead
|
||||
export const translatedError = (
|
||||
messageKey: string,
|
||||
t: typeof i18n.t,
|
||||
messageKey: ParseKeys<DefaultNamespace, TOptions>,
|
||||
t: TFunction<"app", undefined>,
|
||||
): TranslatedError => new TranslatedErrorImpl(messageKey, t);
|
||||
|
||||
@@ -32,7 +32,7 @@ interface RoomIdentifier {
|
||||
// the situations that call for this behavior ('isEmbedded'). This makes it
|
||||
// clearer what each flag means, and helps us avoid coupling Element Call's
|
||||
// behavior to the needs of specific consumers.
|
||||
interface UrlParams {
|
||||
export interface UrlParams {
|
||||
// Widget api related params
|
||||
widgetId: string | null;
|
||||
parentUrl: string | null;
|
||||
|
||||
@@ -66,13 +66,13 @@ export const UserMenu: FC<Props> = ({
|
||||
arr.push({
|
||||
key: "settings",
|
||||
icon: SettingsIcon,
|
||||
label: t("Settings"),
|
||||
label: t("common.settings"),
|
||||
});
|
||||
|
||||
if (isPasswordlessUser && !preventNavigation) {
|
||||
arr.push({
|
||||
key: "login",
|
||||
label: t("Sign in"),
|
||||
label: t("action.sign_in"),
|
||||
icon: LoginIcon,
|
||||
dataTestid: "usermenu_login",
|
||||
});
|
||||
@@ -81,7 +81,7 @@ export const UserMenu: FC<Props> = ({
|
||||
if (!isPasswordlessUser && !preventNavigation) {
|
||||
arr.push({
|
||||
key: "logout",
|
||||
label: t("Sign out"),
|
||||
label: t("action.sign_out"),
|
||||
icon: LogoutIcon,
|
||||
dataTestid: "usermenu_logout",
|
||||
});
|
||||
@@ -91,12 +91,12 @@ export const UserMenu: FC<Props> = ({
|
||||
return arr;
|
||||
}, [isAuthenticated, isPasswordlessUser, displayName, preventNavigation, t]);
|
||||
|
||||
const tooltip = useCallback(() => t("Profile"), [t]);
|
||||
const tooltip = useCallback(() => t("common.profile"), [t]);
|
||||
|
||||
if (!isAuthenticated) {
|
||||
return (
|
||||
<LinkButton to={{ pathname: "/login", state: { from: location } }}>
|
||||
Log in
|
||||
{t("log_in")}
|
||||
</LinkButton>
|
||||
);
|
||||
}
|
||||
@@ -124,7 +124,7 @@ export const UserMenu: FC<Props> = ({
|
||||
{
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(props: any): ReactNode => (
|
||||
<Menu {...props} label={t("User menu")} onAction={onAction}>
|
||||
<Menu {...props} label={t("a11y.user_menu")} onAction={onAction}>
|
||||
{items.map(({ key, icon: Icon, label, dataTestid }) => (
|
||||
<Item key={key} textValue={label}>
|
||||
<Icon
|
||||
|
||||
@@ -19,7 +19,7 @@ import { useHistory, useLocation } from "react-router-dom";
|
||||
|
||||
import { useClientLegacy } from "./ClientContext";
|
||||
import { useProfile } from "./profile/useProfile";
|
||||
import { SettingsModal } from "./settings/SettingsModal";
|
||||
import { defaultSettingsTab, SettingsModal } from "./settings/SettingsModal";
|
||||
import { UserMenu } from "./UserMenu";
|
||||
|
||||
interface Props {
|
||||
@@ -37,17 +37,17 @@ export const UserMenuContainer: FC<Props> = ({ preventNavigation = false }) => {
|
||||
[setSettingsModalOpen],
|
||||
);
|
||||
|
||||
const [defaultSettingsTab, setDefaultSettingsTab] = useState<string>();
|
||||
const [settingsTab, setSettingsTab] = useState(defaultSettingsTab);
|
||||
|
||||
const onAction = useCallback(
|
||||
async (value: string) => {
|
||||
switch (value) {
|
||||
case "user":
|
||||
setDefaultSettingsTab("profile");
|
||||
setSettingsTab("profile");
|
||||
setSettingsModalOpen(true);
|
||||
break;
|
||||
case "settings":
|
||||
setDefaultSettingsTab("audio");
|
||||
setSettingsTab("audio");
|
||||
setSettingsModalOpen(true);
|
||||
break;
|
||||
case "logout":
|
||||
@@ -76,9 +76,10 @@ export const UserMenuContainer: FC<Props> = ({ preventNavigation = false }) => {
|
||||
{client && (
|
||||
<SettingsModal
|
||||
client={client}
|
||||
defaultTab={defaultSettingsTab}
|
||||
open={settingsModalOpen}
|
||||
onDismiss={onDismissSettingsModal}
|
||||
tab={settingsTab}
|
||||
onTabChange={setSettingsTab}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
|
||||
@@ -20,7 +20,7 @@ import { Trans } from "react-i18next";
|
||||
import { Link } from "../typography/Typography";
|
||||
|
||||
export const AnalyticsNotice: FC = () => (
|
||||
<Trans>
|
||||
<Trans i18nKey="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{" "}
|
||||
|
||||
@@ -30,7 +30,7 @@ import { Config } from "../config/Config";
|
||||
|
||||
export const LoginPage: FC = () => {
|
||||
const { t } = useTranslation();
|
||||
usePageTitle(t("Login"));
|
||||
usePageTitle(t("login_title"));
|
||||
|
||||
const { setClient } = useClient();
|
||||
const login = useInteractiveLogin();
|
||||
@@ -90,15 +90,15 @@ export const LoginPage: FC = () => {
|
||||
<div className={styles.formContainer}>
|
||||
<Logo width="auto" height="auto" className={styles.logo} />
|
||||
|
||||
<h2>Log In</h2>
|
||||
<h4>To continue to Element</h4>
|
||||
<h2>{t("log_in")}</h2>
|
||||
<h4>{t("login_subheading")}</h4>
|
||||
<form onSubmit={onSubmitLoginForm}>
|
||||
<FieldRow>
|
||||
<InputField
|
||||
type="text"
|
||||
ref={usernameRef}
|
||||
placeholder={t("Username")}
|
||||
label={t("Username")}
|
||||
placeholder={t("common.username")}
|
||||
label={t("common.username")}
|
||||
autoCorrect="off"
|
||||
autoCapitalize="none"
|
||||
prefix="@"
|
||||
@@ -110,8 +110,8 @@ export const LoginPage: FC = () => {
|
||||
<InputField
|
||||
type="password"
|
||||
ref={passwordRef}
|
||||
placeholder={t("Password")}
|
||||
label={t("Password")}
|
||||
placeholder={t("common.password")}
|
||||
label={t("common.password")}
|
||||
data-testid="login_password"
|
||||
/>
|
||||
</FieldRow>
|
||||
@@ -126,15 +126,15 @@ export const LoginPage: FC = () => {
|
||||
disabled={loading}
|
||||
data-testid="login_login"
|
||||
>
|
||||
{loading ? t("Logging in…") : t("Login")}
|
||||
{loading ? t("logging_in") : t("login_title")}
|
||||
</Button>
|
||||
</FieldRow>
|
||||
</form>
|
||||
</div>
|
||||
<div className={styles.authLinks}>
|
||||
<p>Not registered yet?</p>
|
||||
<p>{t("login_auth_links_prompt")}</p>
|
||||
<p>
|
||||
<Trans>
|
||||
<Trans i18nKey="login_auth_links">
|
||||
<Link to="/register">Create an account</Link>
|
||||
{" Or "}
|
||||
<Link to="/">Access as a guest</Link>
|
||||
|
||||
@@ -44,7 +44,7 @@ import { Config } from "../config/Config";
|
||||
|
||||
export const RegisterPage: FC = () => {
|
||||
const { t } = useTranslation();
|
||||
usePageTitle(t("Register"));
|
||||
usePageTitle(t("action.register"));
|
||||
|
||||
const { loading, authenticated, passwordlessUser, client, setClient } =
|
||||
useClientLegacy();
|
||||
@@ -140,7 +140,9 @@ export const RegisterPage: FC = () => {
|
||||
|
||||
useEffect(() => {
|
||||
if (password && passwordConfirmation && password !== passwordConfirmation) {
|
||||
confirmPasswordRef.current?.setCustomValidity(t("Passwords must match"));
|
||||
confirmPasswordRef.current?.setCustomValidity(
|
||||
t("register.passwords_must_match"),
|
||||
);
|
||||
} else {
|
||||
confirmPasswordRef.current?.setCustomValidity("");
|
||||
}
|
||||
@@ -164,14 +166,14 @@ export const RegisterPage: FC = () => {
|
||||
<div className={styles.content}>
|
||||
<div className={styles.formContainer}>
|
||||
<Logo width="auto" height="auto" className={styles.logo} />
|
||||
<h2>Create your account</h2>
|
||||
<h2>{t("register_heading")}</h2>
|
||||
<form onSubmit={onSubmitRegisterForm}>
|
||||
<FieldRow>
|
||||
<InputField
|
||||
type="text"
|
||||
name="userName"
|
||||
placeholder={t("Username")}
|
||||
label={t("Username")}
|
||||
placeholder={t("common.username")}
|
||||
label={t("common.username")}
|
||||
autoCorrect="off"
|
||||
autoCapitalize="none"
|
||||
prefix="@"
|
||||
@@ -188,8 +190,8 @@ export const RegisterPage: FC = () => {
|
||||
setPassword(e.target.value)
|
||||
}
|
||||
value={password}
|
||||
placeholder={t("Password")}
|
||||
label={t("Password")}
|
||||
placeholder={t("common.password")}
|
||||
label={t("common.password")}
|
||||
data-testid="register_password"
|
||||
/>
|
||||
</FieldRow>
|
||||
@@ -202,14 +204,14 @@ export const RegisterPage: FC = () => {
|
||||
setPasswordConfirmation(e.target.value)
|
||||
}
|
||||
value={passwordConfirmation}
|
||||
placeholder={t("Confirm password")}
|
||||
label={t("Confirm password")}
|
||||
placeholder={t("register_confirm_password_label")}
|
||||
label={t("register_confirm_password_label")}
|
||||
ref={confirmPasswordRef}
|
||||
data-testid="register_confirm_password"
|
||||
/>
|
||||
</FieldRow>
|
||||
<Caption>
|
||||
<Trans>
|
||||
<Trans i18nKey="recaptcha_caption">
|
||||
This site is protected by ReCAPTCHA and the Google{" "}
|
||||
<Link href="https://www.google.com/policies/privacy/">
|
||||
Privacy Policy
|
||||
@@ -237,14 +239,16 @@ export const RegisterPage: FC = () => {
|
||||
disabled={registering}
|
||||
data-testid="register_register"
|
||||
>
|
||||
{registering ? t("Registering…") : t("Register")}
|
||||
{registering
|
||||
? t("register.registering")
|
||||
: t("action.register")}
|
||||
</Button>
|
||||
</FieldRow>
|
||||
<div id={recaptchaId} />
|
||||
</form>
|
||||
</div>
|
||||
<div className={styles.authLinks}>
|
||||
<Trans>
|
||||
<Trans i18nKey="register_auth_links">
|
||||
<p>Already have an account?</p>
|
||||
<p>
|
||||
<Link to="/login">Log in</Link>
|
||||
|
||||
@@ -80,14 +80,14 @@ export function useRecaptcha(sitekey?: string): {
|
||||
|
||||
if (!window.grecaptcha) {
|
||||
logger.log("Recaptcha not loaded");
|
||||
return Promise.reject(translatedError("Recaptcha not loaded", t));
|
||||
return Promise.reject(translatedError("recaptcha_not_loaded", t));
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const observer = new MutationObserver((mutationsList) => {
|
||||
for (const item of mutationsList) {
|
||||
if ((item.target as HTMLElement)?.style?.visibility !== "visible") {
|
||||
reject(translatedError("Recaptcha dismissed", t));
|
||||
reject(translatedError("recaptcha_dismissed", t));
|
||||
observer.disconnect();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -30,9 +30,6 @@ import SettingsSolidIcon from "@vector-im/compound-design-tokens/icons/settings-
|
||||
import ChevronDownIcon from "@vector-im/compound-design-tokens/icons/chevron-down.svg?react";
|
||||
|
||||
import styles from "./Button.module.css";
|
||||
import Fullscreen from "../icons/Fullscreen.svg?react";
|
||||
import FullscreenExit from "../icons/FullscreenExit.svg?react";
|
||||
import { VolumeIcon } from "./VolumeIcon";
|
||||
|
||||
export type ButtonVariant =
|
||||
| "default"
|
||||
@@ -80,6 +77,7 @@ interface Props {
|
||||
// TODO: add all props for <Button>
|
||||
[index: string]: unknown;
|
||||
}
|
||||
|
||||
export const Button = forwardRef<HTMLButtonElement, Props>(
|
||||
(
|
||||
{
|
||||
@@ -135,6 +133,8 @@ export const Button = forwardRef<HTMLButtonElement, Props>(
|
||||
},
|
||||
);
|
||||
|
||||
Button.displayName = "Button";
|
||||
|
||||
export const MicButton: FC<{
|
||||
muted: boolean;
|
||||
// TODO: add all props for <Button>
|
||||
@@ -142,7 +142,9 @@ export const MicButton: FC<{
|
||||
}> = ({ muted, ...rest }) => {
|
||||
const { t } = useTranslation();
|
||||
const Icon = muted ? MicOffSolidIcon : MicOnSolidIcon;
|
||||
const label = muted ? t("Unmute microphone") : t("Mute microphone");
|
||||
const label = muted
|
||||
? t("unmute_microphone_button_label")
|
||||
: t("mute_microphone_button_label");
|
||||
|
||||
return (
|
||||
<Tooltip label={label}>
|
||||
@@ -160,7 +162,9 @@ export const VideoButton: FC<{
|
||||
}> = ({ muted, ...rest }) => {
|
||||
const { t } = useTranslation();
|
||||
const Icon = muted ? VideoCallOffSolidIcon : VideoCallSolidIcon;
|
||||
const label = muted ? t("Start video") : t("Stop video");
|
||||
const label = muted
|
||||
? t("start_video_button_label")
|
||||
: t("stop_video_button_label");
|
||||
|
||||
return (
|
||||
<Tooltip label={label}>
|
||||
@@ -178,7 +182,9 @@ export const ScreenshareButton: FC<{
|
||||
[index: string]: unknown;
|
||||
}> = ({ enabled, className, ...rest }) => {
|
||||
const { t } = useTranslation();
|
||||
const label = enabled ? t("Sharing screen") : t("Share screen");
|
||||
const label = enabled
|
||||
? t("stop_screenshare_button_label")
|
||||
: t("screenshare_button_label");
|
||||
|
||||
return (
|
||||
<Tooltip label={label}>
|
||||
@@ -197,13 +203,13 @@ export const HangupButton: FC<{
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<Tooltip label={t("End call")}>
|
||||
<Tooltip label={t("hangup_button_label")}>
|
||||
<Button
|
||||
variant="toolbar"
|
||||
className={classNames(styles.hangupButton, className)}
|
||||
{...rest}
|
||||
>
|
||||
<EndCallIcon aria-label={t("End call")} />
|
||||
<EndCallIcon aria-label={t("hangup_button_label")} />
|
||||
</Button>
|
||||
</Tooltip>
|
||||
);
|
||||
@@ -217,49 +223,9 @@ export const SettingsButton: FC<{
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<Tooltip label={t("Settings")}>
|
||||
<Tooltip label={t("common.settings")}>
|
||||
<Button variant="toolbar" {...rest}>
|
||||
<SettingsSolidIcon aria-label={t("Settings")} />
|
||||
</Button>
|
||||
</Tooltip>
|
||||
);
|
||||
};
|
||||
|
||||
interface AudioButtonProps extends Omit<Props, "variant"> {
|
||||
/**
|
||||
* A number between 0 and 1
|
||||
*/
|
||||
volume: number;
|
||||
}
|
||||
|
||||
export const AudioButton: FC<AudioButtonProps> = ({ volume, ...rest }) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<Tooltip label={t("Local volume")}>
|
||||
<Button variant="icon" {...rest}>
|
||||
<VolumeIcon volume={volume} aria-label={t("Local volume")} />
|
||||
</Button>
|
||||
</Tooltip>
|
||||
);
|
||||
};
|
||||
|
||||
interface FullscreenButtonProps extends Omit<Props, "variant"> {
|
||||
fullscreen?: boolean;
|
||||
}
|
||||
|
||||
export const FullscreenButton: FC<FullscreenButtonProps> = ({
|
||||
fullscreen,
|
||||
...rest
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const Icon = fullscreen ? FullscreenExit : Fullscreen;
|
||||
const label = fullscreen ? t("Exit full screen") : t("Full screen");
|
||||
|
||||
return (
|
||||
<Tooltip label={label}>
|
||||
<Button variant="icon" {...rest}>
|
||||
<Icon aria-label={label} />
|
||||
<SettingsSolidIcon aria-label={t("common.settings")} />
|
||||
</Button>
|
||||
</Tooltip>
|
||||
);
|
||||
|
||||
@@ -49,11 +49,13 @@ export const CopyButton: FC<Props> = ({
|
||||
className={className}
|
||||
onPress={setCopied}
|
||||
iconStyle={isCopied ? "stroke" : "fill"}
|
||||
aria-label={t("Copy")}
|
||||
aria-label={t("action.copy")}
|
||||
>
|
||||
{isCopied ? (
|
||||
<>
|
||||
{variant !== "icon" && <span>{copiedMessage || t("Copied!")}</span>}
|
||||
{variant !== "icon" && (
|
||||
<span>{copiedMessage || t("common.copied")}</span>
|
||||
)}
|
||||
<CheckIcon />
|
||||
</>
|
||||
) : (
|
||||
|
||||
@@ -25,7 +25,7 @@ export const InviteButton: FC<
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<Button kind="secondary" size="sm" Icon={UserAddIcon} {...props}>
|
||||
{t("Invite")}
|
||||
{t("action.invite")}
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -15,13 +15,18 @@ limitations under the License.
|
||||
*/
|
||||
|
||||
import { useEffect, useMemo } from "react";
|
||||
import { Room } from "matrix-js-sdk";
|
||||
|
||||
import { setLocalStorageItem, useLocalStorage } from "../useLocalStorage";
|
||||
import { useClient } from "../ClientContext";
|
||||
import { useUrlParams } from "../UrlParams";
|
||||
import { UrlParams, getUrlParams, useUrlParams } from "../UrlParams";
|
||||
import { widget } from "../widget";
|
||||
|
||||
export const getRoomSharedKeyLocalStorageKey = (roomId: string): string =>
|
||||
export function saveKeyForRoom(roomId: string, password: string): void {
|
||||
setLocalStorageItem(getRoomSharedKeyLocalStorageKey(roomId), password);
|
||||
}
|
||||
|
||||
const getRoomSharedKeyLocalStorageKey = (roomId: string): string =>
|
||||
`room-shared-key-${roomId}`;
|
||||
|
||||
const useInternalRoomSharedKey = (roomId: string): string | null => {
|
||||
@@ -31,6 +36,22 @@ const useInternalRoomSharedKey = (roomId: string): string | null => {
|
||||
return roomSharedKey;
|
||||
};
|
||||
|
||||
export function getKeyForRoom(roomId: string): string | null {
|
||||
saveKeyFromUrlParams(getUrlParams());
|
||||
const key = getRoomSharedKeyLocalStorageKey(roomId);
|
||||
return localStorage.getItem(key);
|
||||
}
|
||||
|
||||
function saveKeyFromUrlParams(urlParams: UrlParams): void {
|
||||
if (!urlParams.password || !urlParams.roomId) return;
|
||||
|
||||
// Take the key from the URL and save it.
|
||||
// It's important to always use the room ID specified in the URL
|
||||
// when saving keys rather than whatever the current room ID might be,
|
||||
// in case we've moved to a different room but the URL hasn't changed.
|
||||
saveKeyForRoom(urlParams.roomId, urlParams.password);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the room password from the URL if one is present, saving it in localstorage
|
||||
* and returning it in a tuple with the corresponding room ID from the URL.
|
||||
@@ -40,18 +61,7 @@ const useInternalRoomSharedKey = (roomId: string): string | null => {
|
||||
const useKeyFromUrl = (): [string, string] | [undefined, undefined] => {
|
||||
const urlParams = useUrlParams();
|
||||
|
||||
useEffect(() => {
|
||||
if (!urlParams.password || !urlParams.roomId) return;
|
||||
if (!urlParams.roomId) return;
|
||||
|
||||
setLocalStorageItem(
|
||||
// We set the Item by only using data from the url. This way we
|
||||
// make sure, we always have matching pairs in the LocalStorage,
|
||||
// as they occur in the call links.
|
||||
getRoomSharedKeyLocalStorageKey(urlParams.roomId),
|
||||
urlParams.password,
|
||||
);
|
||||
}, [urlParams]);
|
||||
useEffect(() => saveKeyFromUrlParams(urlParams), [urlParams]);
|
||||
|
||||
return urlParams.roomId && urlParams.password
|
||||
? [urlParams.roomId, urlParams.password]
|
||||
@@ -74,12 +84,14 @@ export const useRoomSharedKey = (roomId: string): string | undefined => {
|
||||
|
||||
export const useIsRoomE2EE = (roomId: string): boolean | null => {
|
||||
const { client } = useClient();
|
||||
const room = useMemo(() => client?.getRoom(roomId) ?? null, [roomId, client]);
|
||||
const room = useMemo(() => client?.getRoom(roomId), [roomId, client]);
|
||||
|
||||
return useMemo(() => !room || isRoomE2EE(room), [room]);
|
||||
};
|
||||
|
||||
export function isRoomE2EE(room: Room): boolean {
|
||||
// For now, rooms in widget mode are never considered encrypted.
|
||||
// In the future, when widget mode gains encryption support, then perhaps we
|
||||
// should inspect the e2eEnabled URL parameter here?
|
||||
return useMemo(
|
||||
() => widget === null && (room === null || !room.getCanonicalAlias()),
|
||||
[room],
|
||||
);
|
||||
};
|
||||
return widget === null && !room.getCanonicalAlias();
|
||||
}
|
||||
|
||||
@@ -38,3 +38,5 @@ export const Form = forwardRef<HTMLFormElement, FormProps>(
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Form.displayName = "Form";
|
||||
|
||||
@@ -25,7 +25,7 @@ import { usePageTitle } from "../usePageTitle";
|
||||
|
||||
export const HomePage: FC = () => {
|
||||
const { t } = useTranslation();
|
||||
usePageTitle(t("Home"));
|
||||
usePageTitle(t("common.home"));
|
||||
|
||||
const clientState = useClientState();
|
||||
|
||||
|
||||
@@ -37,12 +37,16 @@ export const JoinExistingCallModal: FC<Props> = ({
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<Modal title={t("Join existing call?")} open={open} onDismiss={onDismiss}>
|
||||
<p>{t("This call already exists, would you like to join?")}</p>
|
||||
<Modal
|
||||
title={t("join_existing_call_modal.title")}
|
||||
open={open}
|
||||
onDismiss={onDismiss}
|
||||
>
|
||||
<p>{t("join_existing_call_modal.text")}</p>
|
||||
<FieldRow rightAlign className={styles.buttons}>
|
||||
<Button onPress={onDismiss}>{t("No")}</Button>
|
||||
<Button onPress={onDismiss}>{t("action.no")}</Button>
|
||||
<Button onPress={onJoin} data-testid="home_joinExistingRoom">
|
||||
{t("Yes, join call")}
|
||||
{t("join_existing_call_modal.join_button")}
|
||||
</Button>
|
||||
</FieldRow>
|
||||
</Modal>
|
||||
|
||||
@@ -125,15 +125,15 @@ export const RegisteredView: FC<Props> = ({ client }) => {
|
||||
<main className={commonStyles.main}>
|
||||
<HeaderLogo className={commonStyles.logo} />
|
||||
<Heading size="lg" weight="semibold">
|
||||
{t("Start new call")}
|
||||
{t("start_new_call")}
|
||||
</Heading>
|
||||
<Form className={styles.form} onSubmit={onSubmit}>
|
||||
<FieldRow className={styles.fieldRow}>
|
||||
<InputField
|
||||
id="callName"
|
||||
name="callName"
|
||||
label={t("Name of call")}
|
||||
placeholder={t("Name of call")}
|
||||
label={t("call_name")}
|
||||
placeholder={t("call_name")}
|
||||
type="text"
|
||||
required
|
||||
autoComplete="off"
|
||||
@@ -147,7 +147,7 @@ export const RegisteredView: FC<Props> = ({ client }) => {
|
||||
disabled={loading}
|
||||
data-testid="home_go"
|
||||
>
|
||||
{loading ? t("Loading…") : t("Go")}
|
||||
{loading ? t("common.loading") : t("action.go")}
|
||||
</Button>
|
||||
</FieldRow>
|
||||
{optInAnalytics === null && (
|
||||
|
||||
@@ -158,15 +158,15 @@ export const UnauthenticatedView: FC = () => {
|
||||
<main className={commonStyles.main}>
|
||||
<HeaderLogo className={commonStyles.logo} />
|
||||
<Heading size="lg" weight="semibold">
|
||||
{t("Start new call")}
|
||||
{t("start_new_call")}
|
||||
</Heading>
|
||||
<Form className={styles.form} onSubmit={onSubmit}>
|
||||
<FieldRow>
|
||||
<InputField
|
||||
id="callName"
|
||||
name="callName"
|
||||
label={t("Name of call")}
|
||||
placeholder={t("Name of call")}
|
||||
label={t("call_name")}
|
||||
placeholder={t("call_name")}
|
||||
type="text"
|
||||
required
|
||||
autoComplete="off"
|
||||
@@ -177,8 +177,8 @@ export const UnauthenticatedView: FC = () => {
|
||||
<InputField
|
||||
id="displayName"
|
||||
name="displayName"
|
||||
label={t("Display name")}
|
||||
placeholder={t("Display name")}
|
||||
label={t("common.display_name")}
|
||||
placeholder={t("common.display_name")}
|
||||
type="text"
|
||||
required
|
||||
data-testid="home_displayName"
|
||||
@@ -191,7 +191,7 @@ export const UnauthenticatedView: FC = () => {
|
||||
</Caption>
|
||||
)}
|
||||
<Caption className={styles.notice}>
|
||||
<Trans>
|
||||
<Trans i18nKey="unauthenticated_view_eula_caption">
|
||||
By clicking "Go", you agree to our{" "}
|
||||
<Link href={Config.get().eula}>
|
||||
End User Licensing Agreement (EULA)
|
||||
@@ -209,7 +209,7 @@ export const UnauthenticatedView: FC = () => {
|
||||
disabled={loading}
|
||||
data-testid="home_go"
|
||||
>
|
||||
{loading ? t("Loading…") : t("Go")}
|
||||
{loading ? t("common.loading") : t("action.go")}
|
||||
</Button>
|
||||
<div id={recaptchaId} />
|
||||
</Form>
|
||||
@@ -217,11 +217,11 @@ export const UnauthenticatedView: FC = () => {
|
||||
<footer className={styles.footer}>
|
||||
<Body className={styles.mobileLoginLink}>
|
||||
<Link color="primary" to="/login" data-testid="home_login">
|
||||
{t("Login to your account")}
|
||||
{t("unauthenticated_view_login_button")}
|
||||
</Link>
|
||||
</Body>
|
||||
<Body>
|
||||
<Trans>
|
||||
<Trans i18nKey="unauthenticated_view_body">
|
||||
Not registered yet?{" "}
|
||||
<Link color="primary" to="/register" data-testid="home_register">
|
||||
Create an account
|
||||
|
||||
@@ -21,6 +21,8 @@ import { RoomMember } from "matrix-js-sdk/src/models/room-member";
|
||||
import { GroupCallEventHandlerEvent } from "matrix-js-sdk/src/webrtc/groupCallEventHandler";
|
||||
import { useState, useEffect } from "react";
|
||||
|
||||
import { getKeyForRoom, isRoomE2EE } from "../e2ee/sharedKeyManagement";
|
||||
|
||||
export interface GroupCallRoom {
|
||||
roomAlias?: string;
|
||||
roomName: string;
|
||||
@@ -78,6 +80,14 @@ function sortRooms(client: MatrixClient, rooms: Room[]): Room[] {
|
||||
});
|
||||
}
|
||||
|
||||
function roomIsJoinable(room: Room): boolean {
|
||||
if (isRoomE2EE(room)) {
|
||||
return Boolean(getKeyForRoom(room.roomId));
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export function useGroupCallRooms(client: MatrixClient): GroupCallRoom[] {
|
||||
const [rooms, setRooms] = useState<GroupCallRoom[]>([]);
|
||||
|
||||
@@ -88,7 +98,9 @@ export function useGroupCallRooms(client: MatrixClient): GroupCallRoom[] {
|
||||
}
|
||||
|
||||
const groupCalls = client.groupCallEventHandler.groupCalls.values();
|
||||
const rooms = Array.from(groupCalls).map((groupCall) => groupCall.room);
|
||||
const rooms = Array.from(groupCalls)
|
||||
.map((groupCall) => groupCall.room)
|
||||
.filter(roomIsJoinable);
|
||||
const sortedRooms = sortRooms(client, rooms);
|
||||
const items = sortedRooms.map((room) => {
|
||||
const groupCall = client.getGroupCallForRoom(room.roomId)!;
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.9699 2.22605L6 7.20093L1.5 7.20093C0.671573 7.20093 0 7.8725 0 8.70093V15.3009C0 16.1294 0.671571 16.8009 1.5 16.8009L6 16.8009L11.9699 21.7758C12.4584 22.1829 13.2 21.8355 13.2 21.1996V2.80221C13.2 2.16634 12.4584 1.81897 11.9699 2.22605Z" fill="white"/>
|
||||
<path d="M17.5896 7.78682C17.2506 7.35087 16.6223 7.27234 16.1864 7.61141C15.7515 7.94959 15.6723 8.57548 16.0083 9.01128L16.0117 9.01586C16.0162 9.02185 16.0246 9.03334 16.0365 9.05007C16.0603 9.08359 16.0977 9.13784 16.1441 9.21085C16.2374 9.3574 16.3654 9.57639 16.4941 9.85222C16.7544 10.4099 17.0003 11.1627 17.0003 12.0008C17.0003 12.8388 16.7544 13.5916 16.4941 14.1493C16.3654 14.4251 16.2374 14.6441 16.1441 14.7907C16.0977 14.8637 16.0603 14.9179 16.0365 14.9514C16.0246 14.9682 16.0162 14.9797 16.0117 14.9857L16.0083 14.9903C15.6723 15.4261 15.7515 16.0519 16.1864 16.3901C16.6223 16.7292 17.2506 16.6506 17.5896 16.2147L16.8003 15.6008C17.5896 16.2147 17.5896 16.2147 17.5896 16.2147L17.5914 16.2124L17.5936 16.2095L17.5994 16.2021L17.6158 16.1802C17.6289 16.1626 17.6463 16.1389 17.6672 16.1094C17.709 16.0505 17.7654 15.9682 17.8315 15.8644C17.9632 15.6574 18.1352 15.3621 18.3065 14.9951C18.6462 14.267 19.0003 13.2199 19.0003 12.0008C19.0003 10.7816 18.6462 9.73448 18.3065 9.00645C18.1352 8.63942 17.9632 8.34412 17.8315 8.1371C17.7654 8.03333 17.709 7.95097 17.6672 7.89207C17.6463 7.8626 17.6289 7.83893 17.6158 7.82132L17.5994 7.79946L17.5936 7.79198L17.5914 7.78911L17.5905 7.78789C17.5905 7.78789 17.5896 7.78682 16.8003 8.40076L17.5896 7.78682Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.63174 0.583224C2.15798 0.109466 1.38987 0.109466 0.91611 0.583224C0.442351 1.05698 0.442351 1.8251 0.91611 2.29885L5.3958 6.77855H5.37083L15.3629 16.7706V16.7456L20.7144 22.0972C21.1882 22.5709 21.9563 22.5709 22.4301 22.0972C22.9038 21.6234 22.9038 20.8553 22.4301 20.3816L2.63174 0.583224ZM15.3629 3.23319V9.88521L10.2275 4.74987L13.2404 2.2391C14.0833 1.53675 15.3629 2.13608 15.3629 3.23319ZM4.07191 16.8718H7.7929V16.872L13.2404 21.4116C14.0833 22.114 15.3629 21.5146 15.3629 20.4175V20.2018L2.4839 7.32287C1.87536 7.79641 1.48389 8.53577 1.48389 9.36657V14.2838C1.48389 15.7131 2.64258 16.8718 4.07191 16.8718Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 788 B |
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21 8.59V4C21 3.45 20.55 3 20 3H15.41C14.52 3 14.07 4.08 14.7 4.71L16.29 6.3L6.29 16.3L4.7 14.71C4.08 14.08 3 14.52 3 15.41V20C3 20.55 3.45 21 4 21H8.59C9.48 21 9.93 19.92 9.3 19.29L7.71 17.7L17.71 7.7L19.3 9.29C19.92 9.92 21 9.48 21 8.59Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 368 B |
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21.29 4.12L16.7 8.71L18.29 10.3C18.92 10.93 18.47 12.01 17.58 12.01H13C12.45 12.01 12 11.56 12 11.01V6.41C12 5.52 13.08 5.07 13.71 5.7L15.3 7.29L19.89 2.7C20.28 2.31 20.91 2.31 21.3 2.7C21.68 3.1 21.68 3.73 21.29 4.12ZM4.11997 21.29L8.70997 16.7L10.3 18.29C10.93 18.92 12.01 18.47 12.01 17.58V13C12.01 12.45 11.56 12 11.01 12H6.40997C5.51997 12 5.06997 13.08 5.69997 13.71L7.28997 15.3L2.69997 19.89C2.30997 20.28 2.30997 20.91 2.69997 21.3C3.09997 21.68 3.72997 21.68 4.11997 21.29Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 613 B |
@@ -1,4 +0,0 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.37785 4.70549C6.37785 2.79707 7.99961 1.25 10.0001 1.25C12.0007 1.25 13.6224 2.79707 13.6224 4.70548V9.87324C13.6224 11.7817 12.0007 13.3287 10.0001 13.3287C7.99961 13.3287 6.37785 11.7817 6.37785 9.87324V4.70549Z" fill="white"/>
|
||||
<path d="M3.66099 8.77015C4.30219 8.77015 4.82198 9.266 4.82198 9.87768C4.82198 12.5957 7.1314 14.8024 9.98617 14.8095C9.99084 14.8094 9.99552 14.8094 10.0002 14.8094C10.0049 14.8094 10.0095 14.8094 10.0141 14.8095C12.8688 14.8022 15.178 12.5956 15.178 9.87768C15.178 9.266 15.6978 8.77015 16.339 8.77015C16.9802 8.77015 17.5 9.266 17.5 9.87768C17.5 13.4496 14.7509 16.4077 11.1612 16.9394V17.6425C11.1612 18.2541 10.6414 18.75 10.0002 18.75C9.359 18.75 8.83921 18.2541 8.83921 17.6425V16.9395C5.24925 16.4079 2.5 13.4497 2.5 9.87768C2.5 9.266 3.01979 8.77015 3.66099 8.77015Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 938 B |
@@ -1,5 +0,0 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1.9206 1.0544C1.68141 0.815201 1.29359 0.815201 1.0544 1.0544C0.815201 1.29359 0.815201 1.68141 1.0544 1.9206L4.55 5.41621V7C4.55 8.3531 5.6469 9.45 7 9.45C7.45436 9.45 7.87983 9.32632 8.24458 9.11079L9.12938 9.99558C8.52863 10.4234 7.7937 10.675 7 10.675C4.97035 10.675 3.325 9.02965 3.325 7C3.325 6.66173 3.05077 6.3875 2.7125 6.3875C2.37423 6.3875 2.1 6.66173 2.1 7C2.1 9.49877 3.97038 11.5607 6.3875 11.8621V12.5125C6.3875 12.8508 6.66173 13.125 7 13.125C7.33827 13.125 7.6125 12.8508 7.6125 12.5125V11.8621C8.50718 11.7505 9.32696 11.3978 10.0047 10.8709L12.0794 12.9456C12.3186 13.1848 12.7064 13.1848 12.9456 12.9456C13.1848 12.7064 13.1848 12.3186 12.9456 12.0794L1.9206 1.0544Z" fill="white"/>
|
||||
<path d="M10.5474 7.96338L11.5073 8.92525C11.7601 8.33424 11.9 7.68346 11.9 7C11.9 6.66173 11.6258 6.3875 11.2875 6.3875C10.9492 6.3875 10.675 6.66173 10.675 7C10.675 7.33336 10.6306 7.65634 10.5474 7.96338Z" fill="white"/>
|
||||
<path d="M4.81385 2.21784L9.45 6.86366V3.325C9.45 1.9719 8.3531 0.875 7 0.875C6.04532 0.875 5.21818 1.42104 4.81385 2.21784Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@@ -1,5 +0,0 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2.74372 1.50628C2.40201 1.16457 1.84799 1.16457 1.50628 1.50628C1.16457 1.84799 1.16457 2.40201 1.50628 2.74372L6.5 7.73744V10C6.5 11.933 8.067 13.5 10 13.5C10.6491 13.5 11.2569 13.3233 11.778 13.0154L13.042 14.2794C12.1838 14.8906 11.1339 15.25 10 15.25C7.10051 15.25 4.75 12.8995 4.75 10C4.75 9.51675 4.35825 9.125 3.875 9.125C3.39175 9.125 3 9.51675 3 10C3 13.5697 5.67198 16.5153 9.125 16.9458V17.875C9.125 18.3582 9.51675 18.75 10 18.75C10.4832 18.75 10.875 18.3582 10.875 17.875V16.9458C12.1531 16.7865 13.3242 16.2825 14.2924 15.5299L17.2563 18.4937C17.598 18.8354 18.152 18.8354 18.4937 18.4937C18.8354 18.152 18.8354 17.598 18.4937 17.2563L2.74372 1.50628Z" fill="#394049"/>
|
||||
<path d="M15.0678 11.3763L16.439 12.7504C16.8001 11.9061 17 10.9764 17 10C17 9.51675 16.6082 9.125 16.125 9.125C15.6418 9.125 15.25 9.51675 15.25 10C15.25 10.4762 15.1866 10.9376 15.0678 11.3763Z" fill="#394049"/>
|
||||
<path d="M6.87692 3.16834L13.5 9.80523V4.75C13.5 2.817 11.933 1.25 10 1.25C8.63618 1.25 7.45455 2.03005 6.87692 3.16834Z" fill="#394049"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -170,6 +170,9 @@ body,
|
||||
#root {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
/* The root should be a separate stacking context so that portalled elements
|
||||
like modals and menus always appear over top of it */
|
||||
isolation: isolate;
|
||||
}
|
||||
|
||||
/* On Android and iOS, prefer native system fonts. The global.css file of
|
||||
|
||||
@@ -72,9 +72,9 @@ export class Initializer {
|
||||
.init({
|
||||
fallbackLng: "en-GB",
|
||||
defaultNS: "app",
|
||||
keySeparator: false,
|
||||
keySeparator: ".",
|
||||
nsSeparator: false,
|
||||
pluralSeparator: "|",
|
||||
pluralSeparator: "_",
|
||||
contextSeparator: "|",
|
||||
interpolation: {
|
||||
escapeValue: false, // React has built-in XSS protections
|
||||
|
||||
@@ -105,6 +105,8 @@ export const AvatarInputField = forwardRef<HTMLInputElement, Props>(
|
||||
aria-label={label}
|
||||
{...rest}
|
||||
/>
|
||||
{/* https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/issues/966 */}
|
||||
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
|
||||
<label htmlFor={id} className={styles.fileInputButton}>
|
||||
<EditIcon />
|
||||
</label>
|
||||
@@ -115,10 +117,12 @@ export const AvatarInputField = forwardRef<HTMLInputElement, Props>(
|
||||
variant="icon"
|
||||
onPress={onPressRemoveAvatar}
|
||||
>
|
||||
{t("Remove")}
|
||||
{t("action.remove")}
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
AvatarInputField.displayName = "AvatarInputField";
|
||||
|
||||
@@ -166,6 +166,8 @@ export const InputField = forwardRef<
|
||||
},
|
||||
);
|
||||
|
||||
InputField.displayName = "InputField";
|
||||
|
||||
interface ErrorMessageProps {
|
||||
error: Error;
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ export function SelectInput(props: Props): JSX.Element {
|
||||
<span {...valueProps} className={styles.selectedItem}>
|
||||
{state.selectedItem
|
||||
? state.selectedItem.rendered
|
||||
: t("Select an option")}
|
||||
: t("select_input_unset_button")}
|
||||
</span>
|
||||
<ArrowDownIcon />
|
||||
</button>
|
||||
|
||||
@@ -62,7 +62,7 @@ export function StarRatingInput({
|
||||
id={"starInvisibleLabel" + String(index)}
|
||||
htmlFor={"starInput" + String(index)}
|
||||
>
|
||||
{t("{{count}} stars", {
|
||||
{t("star_rating_input_label", {
|
||||
count: index,
|
||||
})}
|
||||
</label>
|
||||
|
||||
@@ -26,6 +26,7 @@ import {
|
||||
} from "react";
|
||||
import { createMediaDeviceObserver } from "@livekit/components-core";
|
||||
import { Observable } from "rxjs";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
|
||||
import {
|
||||
isFirefox,
|
||||
@@ -82,21 +83,29 @@ function useMediaDevice(
|
||||
// Tragically, the only way to get device names out of LiveKit is to specify a
|
||||
// kind, which then results in multiple permissions requests.
|
||||
const deviceObserver = useMemo(
|
||||
() => createMediaDeviceObserver(kind, requestPermissions),
|
||||
() =>
|
||||
createMediaDeviceObserver(
|
||||
kind,
|
||||
() => logger.error("Error creating MediaDeviceObserver"),
|
||||
requestPermissions,
|
||||
),
|
||||
[kind, requestPermissions],
|
||||
);
|
||||
const available = useObservableState(deviceObserver, []);
|
||||
const [selectedId, select] = useState(fallbackDevice);
|
||||
|
||||
return useMemo(() => {
|
||||
const devId = available.some((d) => d.deviceId === selectedId)
|
||||
? selectedId
|
||||
: available.some((d) => d.deviceId === fallbackDevice)
|
||||
? fallbackDevice
|
||||
: available.at(0)?.deviceId;
|
||||
let devId;
|
||||
if (available) {
|
||||
devId = available.some((d) => d.deviceId === selectedId)
|
||||
? selectedId
|
||||
: available.some((d) => d.deviceId === fallbackDevice)
|
||||
? fallbackDevice
|
||||
: available.at(0)?.deviceId;
|
||||
}
|
||||
|
||||
return {
|
||||
available,
|
||||
available: available ?? [],
|
||||
selectedId: alwaysDefault ? undefined : devId,
|
||||
select,
|
||||
};
|
||||
|
||||
@@ -72,35 +72,37 @@ async function doConnect(
|
||||
}
|
||||
|
||||
logger.info("Pre-creating microphone track");
|
||||
const audioTracks = await livekitRoom!.localParticipant.createTracks({
|
||||
audio: audioOptions,
|
||||
});
|
||||
if (audioTracks.length < 1) {
|
||||
logger.info("Tried to pre-create local audio track but got no tracks");
|
||||
return;
|
||||
let preCreatedAudioTrack: LocalTrack | undefined;
|
||||
try {
|
||||
const audioTracks = await livekitRoom!.localParticipant.createTracks({
|
||||
audio: audioOptions,
|
||||
});
|
||||
if (audioTracks.length < 1) {
|
||||
logger.info("Tried to pre-create local audio track but got no tracks");
|
||||
} else {
|
||||
preCreatedAudioTrack = audioTracks[0];
|
||||
}
|
||||
logger.info("Pre-created microphone track");
|
||||
} catch (e) {
|
||||
logger.error("Failed to pre-create microphone track", e);
|
||||
}
|
||||
if (!audioEnabled) await audioTracks[0].mute();
|
||||
|
||||
logger.info("Pre-created microphone track");
|
||||
if (!audioEnabled) await preCreatedAudioTrack?.mute();
|
||||
|
||||
// check again having awaited for the track to create
|
||||
if (livekitRoom!.localParticipant.getTrack(Track.Source.Microphone)) {
|
||||
logger.warn(
|
||||
"Publishing pre-created audio track but participant already appears to have an microphone track: this shouldn't happen!",
|
||||
"Pre-created audio track but participant already appears to have an microphone track: this shouldn't happen!",
|
||||
);
|
||||
for (const t of audioTracks) {
|
||||
t.stop();
|
||||
}
|
||||
preCreatedAudioTrack?.stop();
|
||||
return;
|
||||
}
|
||||
|
||||
logger.info("Connecting & publishing");
|
||||
try {
|
||||
await connectAndPublish(livekitRoom, sfuConfig, audioTracks[0], []);
|
||||
await connectAndPublish(livekitRoom, sfuConfig, preCreatedAudioTrack, []);
|
||||
} catch (e) {
|
||||
for (const t of audioTracks) {
|
||||
t.stop();
|
||||
}
|
||||
preCreatedAudioTrack?.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,6 +248,6 @@ export function useECConnectionState(
|
||||
return isSwitchingFocus
|
||||
? ECAddonConnectionState.ECSwitchingFocus
|
||||
: isInDoConnect
|
||||
? ConnectionState.Connecting
|
||||
: connState;
|
||||
? ConnectionState.Connecting
|
||||
: connState;
|
||||
}
|
||||
|
||||
@@ -107,8 +107,6 @@ export function useLiveKit(
|
||||
...defaultLiveKitOptions.audioCaptureDefaults,
|
||||
deviceId: initialDevices.current.audioInput.selectedId,
|
||||
},
|
||||
// XXX Setting the audio output here doesn't seem to do anything… a bug in
|
||||
// LiveKit?
|
||||
audioOutput: {
|
||||
deviceId: initialDevices.current.audioOutput.selectedId,
|
||||
},
|
||||
@@ -245,11 +243,25 @@ export function useLiveKit(
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
logger.error(
|
||||
"Failed to sync audio mute state with LiveKit (will retry to sync in 1s):",
|
||||
e,
|
||||
);
|
||||
setTimeout(() => syncMuteState(iterCount + 1, type), 1000);
|
||||
if ((e as DOMException).name === "NotAllowedError") {
|
||||
logger.error(
|
||||
"Fatal errror while syncing mute state: resetting",
|
||||
e,
|
||||
);
|
||||
if (type === MuteDevice.Microphone) {
|
||||
audioMuteUpdating.current = false;
|
||||
muteStates.audio.setEnabled?.(false);
|
||||
} else {
|
||||
videoMuteUpdating.current = false;
|
||||
muteStates.video.setEnabled?.(false);
|
||||
}
|
||||
} else {
|
||||
logger.error(
|
||||
"Failed to sync audio mute state with LiveKit (will retry to sync in 1s):",
|
||||
e,
|
||||
);
|
||||
setTimeout(() => syncMuteState(iterCount + 1, type), 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -36,9 +36,8 @@ import IndexedDBWorker from "./IndexedDBWorker?worker";
|
||||
import { getUrlParams, PASSWORD_STRING } from "./UrlParams";
|
||||
import { loadOlm } from "./olm";
|
||||
import { Config } from "./config/Config";
|
||||
import { setLocalStorageItem } from "./useLocalStorage";
|
||||
import { getRoomSharedKeyLocalStorageKey } from "./e2ee/sharedKeyManagement";
|
||||
import { E2eeType } from "./e2ee/e2eeType";
|
||||
import { saveKeyForRoom } from "./e2ee/sharedKeyManagement";
|
||||
|
||||
export const fallbackICEServerAllowed =
|
||||
import.meta.env.VITE_FALLBACK_STUN_ALLOWED === "true";
|
||||
@@ -359,10 +358,7 @@ export async function createRoom(
|
||||
let password;
|
||||
if (e2ee == E2eeType.SHARED_KEY) {
|
||||
password = secureRandomBase64Url(16);
|
||||
setLocalStorageItem(
|
||||
getRoomSharedKeyLocalStorageKey(result.room_id),
|
||||
password,
|
||||
);
|
||||
saveKeyForRoom(result.room_id, password);
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
37
src/observable-utils.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
Copyright 2023 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { Observable, defer, finalize, tap } from "rxjs";
|
||||
|
||||
const nothing = Symbol("nothing");
|
||||
|
||||
/**
|
||||
* RxJS operator that invokes a callback when the Observable is finalized,
|
||||
* passing the most recently emitted value. If no value was emitted, the
|
||||
* callback will not be invoked.
|
||||
*/
|
||||
export function finalizeValue<T>(callback: (finalValue: T) => void) {
|
||||
return (source: Observable<T>): Observable<T> =>
|
||||
defer(() => {
|
||||
let finalValue: T | typeof nothing = nothing;
|
||||
return source.pipe(
|
||||
tap((value) => (finalValue = value)),
|
||||
finalize(() => {
|
||||
if (finalValue !== nothing) callback(finalValue);
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -58,3 +58,5 @@ export const Popover = forwardRef<HTMLDivElement, Props>(
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Popover.displayName = "Popover";
|
||||
|
||||
@@ -94,3 +94,5 @@ export const PopoverMenuTrigger = forwardRef<
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
||||
PopoverMenuTrigger.displayName = "PopoverMenuTrigger";
|
||||
|
||||
@@ -76,15 +76,19 @@ export const AppSelectionModal: FC<Props> = ({ roomId }) => {
|
||||
}, [roomId, roomSharedKey]);
|
||||
|
||||
return (
|
||||
<Modal className={styles.modal} title={t("Select app")} open={open}>
|
||||
<Modal
|
||||
className={styles.modal}
|
||||
title={t("app_selection_modal.title")}
|
||||
open={open}
|
||||
>
|
||||
<Text size="md" weight="semibold">
|
||||
{t("Ready to join?")}
|
||||
{t("app_selection_modal.text")}
|
||||
</Text>
|
||||
<Button kind="secondary" onClick={onBrowserClick}>
|
||||
{t("Continue in browser")}
|
||||
{t("app_selection_modal.continue_in_browser")}
|
||||
</Button>
|
||||
<Button as="a" href={appUrl} Icon={PopOutIcon}>
|
||||
{t("Open in the app")}
|
||||
{t("app_selection_modal.open_in_app")}
|
||||
</Button>
|
||||
</Modal>
|
||||
);
|
||||
|
||||
@@ -88,7 +88,7 @@ export const CallEndedView: FC<Props> = ({
|
||||
|
||||
const createAccountDialog = isPasswordlessUser && (
|
||||
<div className={styles.callEndedContent}>
|
||||
<Trans>
|
||||
<Trans i18nKey="call_ended_view.create_account_prompt">
|
||||
<p>Why not finish by setting up a password to keep your account?</p>
|
||||
<p>
|
||||
You'll be able to keep your name and set an avatar for use on future
|
||||
@@ -101,14 +101,14 @@ export const CallEndedView: FC<Props> = ({
|
||||
variant="default"
|
||||
to="/register"
|
||||
>
|
||||
{t("Create account")}
|
||||
{t("call_ended_view.create_account_button")}
|
||||
</LinkButton>
|
||||
</div>
|
||||
);
|
||||
|
||||
const qualitySurveyDialog = (
|
||||
<div className={styles.callEndedContent}>
|
||||
<Trans>
|
||||
<Trans i18nKey="call_ended_view.feedback_prompt">
|
||||
<p>
|
||||
We'd love to hear your feedback so we can improve your experience.
|
||||
</p>
|
||||
@@ -122,14 +122,14 @@ export const CallEndedView: FC<Props> = ({
|
||||
className={feedbackStyle.feedback}
|
||||
id="feedbackText"
|
||||
name="feedbackText"
|
||||
label={t("Your feedback")}
|
||||
placeholder={t("Your feedback")}
|
||||
label={t("settings.feedback_tab_description_label")}
|
||||
placeholder={t("settings.feedback_tab_description_label")}
|
||||
type="textarea"
|
||||
/>
|
||||
</FieldRow>{" "}
|
||||
<FieldRow>
|
||||
{submitDone ? (
|
||||
<Trans>
|
||||
<Trans i18nKey="call_ended_view.feedback_done">
|
||||
<p>Thanks for your feedback!</p>
|
||||
</Trans>
|
||||
) : (
|
||||
@@ -140,7 +140,7 @@ export const CallEndedView: FC<Props> = ({
|
||||
variant="default"
|
||||
data-testid="home_go"
|
||||
>
|
||||
{submitting ? t("Submitting…") : t("Submit")}
|
||||
{submitting ? t("submitting") : t("action.submit")}
|
||||
</Button>
|
||||
)}
|
||||
</FieldRow>
|
||||
@@ -154,11 +154,13 @@ export const CallEndedView: FC<Props> = ({
|
||||
<>
|
||||
<main className={styles.main}>
|
||||
<Headline className={styles.headline}>
|
||||
<Trans>You were disconnected from the call</Trans>
|
||||
<Trans i18nKey="call_ended_view.body">
|
||||
You were disconnected from the call
|
||||
</Trans>
|
||||
</Headline>
|
||||
<div className={styles.disconnectedButtons}>
|
||||
<Button size="lg" variant="default" onClick={reconnect}>
|
||||
{t("Reconnect")}
|
||||
{t("call_ended_view.reconnect_button")}
|
||||
</Button>
|
||||
<div className={styles.rageshakeButton}>
|
||||
<RageshakeButton description="***Call disconnected***" />
|
||||
@@ -168,7 +170,7 @@ export const CallEndedView: FC<Props> = ({
|
||||
{!confineToRoom && (
|
||||
<Body className={styles.footer}>
|
||||
<Link color="primary" to="/">
|
||||
{t("Return to home screen")}
|
||||
{t("return_home_button")}
|
||||
</Link>
|
||||
</Body>
|
||||
)}
|
||||
@@ -180,14 +182,14 @@ export const CallEndedView: FC<Props> = ({
|
||||
<main className={styles.main}>
|
||||
<Headline className={styles.headline}>
|
||||
{surveySubmitted
|
||||
? t("{{displayName}}, your call has ended.", {
|
||||
? t("call_ended_view.headline", {
|
||||
displayName,
|
||||
})
|
||||
: t("{{displayName}}, your call has ended.", {
|
||||
: t("call_ended_view.headline", {
|
||||
displayName,
|
||||
}) +
|
||||
"\n" +
|
||||
t("How did it go?")}
|
||||
t("call_ended_view.survey_prompt")}
|
||||
</Headline>
|
||||
{(!surveySubmitted || confineToRoom) &&
|
||||
PosthogAnalytics.instance.isEnabled()
|
||||
@@ -197,7 +199,7 @@ export const CallEndedView: FC<Props> = ({
|
||||
{!confineToRoom && (
|
||||
<Body className={styles.footer}>
|
||||
<Link color="primary" to="/">
|
||||
{t("Not now, return to home screen")}
|
||||
{t("call_ended_view.not_now_button")}
|
||||
</Link>
|
||||
</Body>
|
||||
)}
|
||||
|
||||
@@ -15,6 +15,7 @@ limitations under the License.
|
||||
*/
|
||||
|
||||
.lock {
|
||||
display: block;
|
||||
padding: var(--cpd-space-1x);
|
||||
border-radius: var(--cpd-radius-pill-effect);
|
||||
}
|
||||
|
||||
@@ -29,17 +29,16 @@ interface Props {
|
||||
export const EncryptionLock: FC<Props> = ({ encrypted }) => {
|
||||
const { t } = useTranslation();
|
||||
const Icon = encrypted ? LockIcon : LockOffIcon;
|
||||
const label = encrypted ? t("common.encrypted") : t("common.unencrypted");
|
||||
|
||||
return (
|
||||
<Tooltip
|
||||
label={encrypted ? t("Encrypted") : t("Not encrypted")}
|
||||
side="right"
|
||||
>
|
||||
<Tooltip label={label} side="right" isTriggerInteractive={false}>
|
||||
<Icon
|
||||
width={16}
|
||||
height={16}
|
||||
className={styles.lock}
|
||||
data-encrypted={encrypted}
|
||||
aria-label={label}
|
||||
/>
|
||||
</Tooltip>
|
||||
);
|
||||
|
||||
@@ -54,7 +54,7 @@ export function GroupCallLoader({
|
||||
case "loading":
|
||||
return (
|
||||
<FullScreenView>
|
||||
<h1>{t("Loading…")}</h1>
|
||||
<h1>{t("common.loading")}</h1>
|
||||
</FullScreenView>
|
||||
);
|
||||
case "loaded":
|
||||
@@ -63,16 +63,12 @@ export function GroupCallLoader({
|
||||
if ((groupCallState.error as MatrixError).errcode === "M_NOT_FOUND") {
|
||||
return (
|
||||
<FullScreenView>
|
||||
<Heading>{t("Call not found")}</Heading>
|
||||
<Text>
|
||||
{t(
|
||||
"Calls are now end-to-end encrypted and need to be created from the home page. This helps make sure everyone's using the same encryption key.",
|
||||
)}
|
||||
</Text>
|
||||
<Heading>{t("group_call_loader_failed_heading")}</Heading>
|
||||
<Text>{t("group_call_loader_failed_text")}</Text>
|
||||
{/* XXX: A 'create it for me' button would be the obvious UX here. Two screens already have
|
||||
dupes of this flow, let's make a common component and put it here. */}
|
||||
<Link href="/" onClick={onHomeClick}>
|
||||
{t("Home")}
|
||||
{t("common.home")}
|
||||
</Link>
|
||||
</FullScreenView>
|
||||
);
|
||||
|
||||
@@ -76,9 +76,6 @@ export const GroupCallView: FC<Props> = ({
|
||||
const memberships = useMatrixRTCSessionMemberships(rtcSession);
|
||||
const isJoined = useMatrixRTCSessionJoinState(rtcSession);
|
||||
|
||||
const e2eeSharedKey = useRoomSharedKey(rtcSession.room.roomId);
|
||||
const isRoomE2EE = useIsRoomE2EE(rtcSession.room.roomId);
|
||||
|
||||
useEffect(() => {
|
||||
window.rtcSession = rtcSession;
|
||||
return () => {
|
||||
@@ -89,8 +86,10 @@ export const GroupCallView: FC<Props> = ({
|
||||
const { displayName, avatarUrl } = useProfile(client);
|
||||
const roomName = useRoomName(rtcSession.room);
|
||||
const roomAvatar = useRoomAvatar(rtcSession.room);
|
||||
const roomEncrypted = useIsRoomE2EE(rtcSession.room.roomId)!;
|
||||
const e2eeSharedKey = useRoomSharedKey(rtcSession.room.roomId);
|
||||
const { perParticipantE2EE } = useUrlParams();
|
||||
const roomEncrypted =
|
||||
useIsRoomE2EE(rtcSession.room.roomId) || perParticipantE2EE;
|
||||
|
||||
const matrixInfo = useMemo((): MatrixInfo => {
|
||||
return {
|
||||
@@ -127,6 +126,16 @@ export const GroupCallView: FC<Props> = ({
|
||||
const latestMuteStates = useRef<MuteStates>();
|
||||
latestMuteStates.current = muteStates;
|
||||
|
||||
const e2eeConfig = useMemo((): E2EEConfig => {
|
||||
if (perParticipantE2EE) {
|
||||
return { mode: E2eeType.PER_PARTICIPANT };
|
||||
} else if (e2eeSharedKey) {
|
||||
return { mode: E2eeType.SHARED_KEY, sharedKey: e2eeSharedKey };
|
||||
} else {
|
||||
return { mode: E2eeType.NONE };
|
||||
}
|
||||
}, [perParticipantE2EE, e2eeSharedKey]);
|
||||
|
||||
useEffect(() => {
|
||||
// this effect is only if we don't want to show the lobby (skipLobby = true)
|
||||
if (!skipLobby) return;
|
||||
@@ -221,6 +230,7 @@ export const GroupCallView: FC<Props> = ({
|
||||
sendInstantly,
|
||||
);
|
||||
|
||||
// Only sends matrix leave event. The Livekit session will disconnect once the ActiveCall-view unmounts.
|
||||
await leaveRTCSession(rtcSession);
|
||||
|
||||
if (
|
||||
@@ -240,6 +250,7 @@ export const GroupCallView: FC<Props> = ({
|
||||
ev: CustomEvent<IWidgetApiRequest>,
|
||||
): Promise<void> => {
|
||||
widget!.api.transport.reply(ev.detail, {});
|
||||
// Only sends matrix leave event. The Livekit session will disconnect once the ActiveCall-view unmounts.
|
||||
await leaveRTCSession(rtcSession);
|
||||
};
|
||||
widget.lazyActions.once(ElementWidgetActions.HangupCall, onHangup);
|
||||
@@ -249,16 +260,6 @@ export const GroupCallView: FC<Props> = ({
|
||||
}
|
||||
}, [isJoined, rtcSession]);
|
||||
|
||||
const e2eeConfig = useMemo((): E2EEConfig => {
|
||||
if (perParticipantE2EE) {
|
||||
return { mode: E2eeType.PER_PARTICIPANT };
|
||||
} else if (e2eeSharedKey) {
|
||||
return { mode: E2eeType.SHARED_KEY, sharedKey: e2eeSharedKey };
|
||||
} else {
|
||||
return { mode: E2eeType.NONE };
|
||||
}
|
||||
}, [perParticipantE2EE, e2eeSharedKey]);
|
||||
|
||||
const onReconnect = useCallback(() => {
|
||||
setLeft(false);
|
||||
setLeaveError(undefined);
|
||||
@@ -289,7 +290,7 @@ export const GroupCallView: FC<Props> = ({
|
||||
|
||||
const { t } = useTranslation();
|
||||
|
||||
if (isRoomE2EE && !perParticipantE2EE && !e2eeSharedKey) {
|
||||
if (roomEncrypted && !perParticipantE2EE && !e2eeSharedKey) {
|
||||
return (
|
||||
<ErrorView
|
||||
error={
|
||||
@@ -299,17 +300,13 @@ export const GroupCallView: FC<Props> = ({
|
||||
}
|
||||
/>
|
||||
);
|
||||
} else if (!isE2EESupported() && isRoomE2EE) {
|
||||
} else if (!isE2EESupported() && roomEncrypted) {
|
||||
return (
|
||||
<FullScreenView>
|
||||
<Heading>Incompatible Browser</Heading>
|
||||
<Text>
|
||||
{t(
|
||||
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117",
|
||||
)}
|
||||
</Text>
|
||||
<Heading>{t("browser_media_e2ee_unsupported_heading")}</Heading>
|
||||
<Text>{t("browser_media_e2ee_unsupported")}</Text>
|
||||
<Link href="/" onClick={onHomeClick}>
|
||||
{t("Home")}
|
||||
{t("common.home")}
|
||||
</Link>
|
||||
</FullScreenView>
|
||||
);
|
||||
|
||||
@@ -28,7 +28,9 @@ limitations under the License.
|
||||
flex-direction: column;
|
||||
overflow: auto;
|
||||
overflow-inline: hidden;
|
||||
contain: strict;
|
||||
/* There used to be a contain: strict here, but due to some bugs in Firefox,
|
||||
this was causing the Z-ordering of modals to glitch out. It can be added back
|
||||
if those issues appear to be resolved. */
|
||||
}
|
||||
|
||||
.centerMessage {
|
||||
|
||||
@@ -19,14 +19,11 @@ import {
|
||||
RoomAudioRenderer,
|
||||
RoomContext,
|
||||
useLocalParticipant,
|
||||
useParticipants,
|
||||
useTracks,
|
||||
} from "@livekit/components-react";
|
||||
import { usePreventScroll } from "@react-aria/overlays";
|
||||
import { ConnectionState, Room, Track } from "livekit-client";
|
||||
import { MatrixClient } from "matrix-js-sdk/src/client";
|
||||
import { RoomMember } from "matrix-js-sdk/src/models/room-member";
|
||||
import { Room as MatrixRoom } from "matrix-js-sdk/src/models/room";
|
||||
import {
|
||||
FC,
|
||||
ReactNode,
|
||||
@@ -39,9 +36,9 @@ import {
|
||||
} from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import useMeasure from "react-use-measure";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession";
|
||||
import classNames from "classnames";
|
||||
import { useStateObservable } from "@react-rxjs/core";
|
||||
|
||||
import LogoMark from "../icons/LogoMark.svg?react";
|
||||
import LogoType from "../icons/LogoType.svg?react";
|
||||
@@ -54,22 +51,16 @@ import {
|
||||
SettingsButton,
|
||||
} from "../button";
|
||||
import { Header, LeftNav, RightNav, RoomHeaderInfo } from "../Header";
|
||||
import {
|
||||
useVideoGridLayout,
|
||||
TileDescriptor,
|
||||
VideoGrid,
|
||||
} from "../video-grid/VideoGrid";
|
||||
import { useShowConnectionStats } from "../settings/useSetting";
|
||||
import { PosthogAnalytics } from "../analytics/PosthogAnalytics";
|
||||
import { useVideoGridLayout, VideoGrid } from "../video-grid/VideoGrid";
|
||||
import { useUrlParams } from "../UrlParams";
|
||||
import { useCallViewKeyboardShortcuts } from "../useCallViewKeyboardShortcuts";
|
||||
import { usePrefersReducedMotion } from "../usePrefersReducedMotion";
|
||||
import { ElementWidgetActions, widget } from "../widget";
|
||||
import styles from "./InCallView.module.css";
|
||||
import { ItemData, TileContent, VideoTile } from "../video-grid/VideoTile";
|
||||
import { VideoTile } from "../video-grid/VideoTile";
|
||||
import { NewVideoGrid } from "../video-grid/NewVideoGrid";
|
||||
import { OTelGroupCallMembership } from "../otel/OTelGroupCallMembership";
|
||||
import { SettingsModal } from "../settings/SettingsModal";
|
||||
import { SettingsModal, defaultSettingsTab } from "../settings/SettingsModal";
|
||||
import { useRageshakeRequestModal } from "../settings/submit-rageshake";
|
||||
import { RageshakeRequestModal } from "./RageshakeRequestModal";
|
||||
import { E2EEConfig, useLiveKit } from "../livekit/useLiveKit";
|
||||
@@ -81,18 +72,14 @@ import { MuteStates } from "./MuteStates";
|
||||
import { MatrixInfo } from "./VideoPreview";
|
||||
import { InviteButton } from "../button/InviteButton";
|
||||
import { LayoutToggle } from "./LayoutToggle";
|
||||
import {
|
||||
ECAddonConnectionState,
|
||||
ECConnectionState,
|
||||
} from "../livekit/useECConnectionState";
|
||||
import { ECConnectionState } from "../livekit/useECConnectionState";
|
||||
import { useOpenIDSFU } from "../livekit/openIDSFU";
|
||||
import { useCallViewModel } from "../state/CallViewModel";
|
||||
import { subscribe } from "../state/subscribe";
|
||||
|
||||
const canScreenshare = "getDisplayMedia" in (navigator.mediaDevices ?? {});
|
||||
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
||||
|
||||
// How long we wait after a focus switch before showing the real participant list again
|
||||
const POST_FOCUS_PARTICIPANT_UPDATE_DELAY_MS = 3000;
|
||||
|
||||
export interface ActiveCallProps
|
||||
extends Omit<InCallViewProps, "livekitRoom" | "connState"> {
|
||||
e2eeConfig: E2EEConfig;
|
||||
@@ -107,9 +94,14 @@ export const ActiveCall: FC<ActiveCallProps> = (props) => {
|
||||
props.e2eeConfig,
|
||||
);
|
||||
|
||||
if (!livekitRoom) {
|
||||
return null;
|
||||
}
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
livekitRoom?.disconnect();
|
||||
};
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
if (!livekitRoom) return null;
|
||||
|
||||
return (
|
||||
<RoomContext.Provider value={livekitRoom}>
|
||||
@@ -132,477 +124,342 @@ export interface InCallViewProps {
|
||||
onShareClick: (() => void) | null;
|
||||
}
|
||||
|
||||
export const InCallView: FC<InCallViewProps> = ({
|
||||
client,
|
||||
matrixInfo,
|
||||
rtcSession,
|
||||
livekitRoom,
|
||||
muteStates,
|
||||
participantCount,
|
||||
onLeave,
|
||||
hideHeader,
|
||||
otelGroupCallMembership,
|
||||
connState,
|
||||
onShareClick,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
usePreventScroll();
|
||||
useWakeLock();
|
||||
export const InCallView: FC<InCallViewProps> = subscribe(
|
||||
({
|
||||
client,
|
||||
matrixInfo,
|
||||
rtcSession,
|
||||
livekitRoom,
|
||||
muteStates,
|
||||
participantCount,
|
||||
onLeave,
|
||||
hideHeader,
|
||||
otelGroupCallMembership,
|
||||
connState,
|
||||
onShareClick,
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
usePreventScroll();
|
||||
useWakeLock();
|
||||
|
||||
useEffect(() => {
|
||||
if (connState === ConnectionState.Disconnected) {
|
||||
// annoyingly we don't get the disconnection reason this way,
|
||||
// only by listening for the emitted event
|
||||
onLeave(new Error("Disconnected from call server"));
|
||||
}
|
||||
}, [connState, onLeave]);
|
||||
useEffect(() => {
|
||||
if (connState === ConnectionState.Disconnected) {
|
||||
// annoyingly we don't get the disconnection reason this way,
|
||||
// only by listening for the emitted event
|
||||
onLeave(new Error("Disconnected from call server"));
|
||||
}
|
||||
}, [connState, onLeave]);
|
||||
|
||||
const containerRef1 = useRef<HTMLDivElement | null>(null);
|
||||
const [containerRef2, bounds] = useMeasure({ polyfill: ResizeObserver });
|
||||
const boundsValid = bounds.height > 0;
|
||||
// Merge the refs so they can attach to the same element
|
||||
const containerRef = useMergedRefs(containerRef1, containerRef2);
|
||||
const containerRef1 = useRef<HTMLDivElement | null>(null);
|
||||
const [containerRef2, bounds] = useMeasure({ polyfill: ResizeObserver });
|
||||
const boundsValid = bounds.height > 0;
|
||||
// Merge the refs so they can attach to the same element
|
||||
const containerRef = useMergedRefs(containerRef1, containerRef2);
|
||||
|
||||
const screenSharingTracks = useTracks(
|
||||
[{ source: Track.Source.ScreenShare, withPlaceholder: false }],
|
||||
{
|
||||
room: livekitRoom,
|
||||
},
|
||||
);
|
||||
const { layout, setLayout } = useVideoGridLayout(
|
||||
screenSharingTracks.length > 0,
|
||||
);
|
||||
|
||||
const [showConnectionStats] = useShowConnectionStats();
|
||||
|
||||
const { hideScreensharing, showControls } = useUrlParams();
|
||||
|
||||
const { isScreenShareEnabled, localParticipant } = useLocalParticipant({
|
||||
room: livekitRoom,
|
||||
});
|
||||
|
||||
const toggleMicrophone = useCallback(
|
||||
() => muteStates.audio.setEnabled?.((e) => !e),
|
||||
[muteStates],
|
||||
);
|
||||
const toggleCamera = useCallback(
|
||||
() => muteStates.video.setEnabled?.((e) => !e),
|
||||
[muteStates],
|
||||
);
|
||||
|
||||
// This function incorrectly assumes that there is a camera and microphone, which is not always the case.
|
||||
// TODO: Make sure that this module is resilient when it comes to camera/microphone availability!
|
||||
useCallViewKeyboardShortcuts(
|
||||
containerRef1,
|
||||
toggleMicrophone,
|
||||
toggleCamera,
|
||||
(muted) => muteStates.audio.setEnabled?.(!muted),
|
||||
);
|
||||
|
||||
const onLeavePress = useCallback(() => {
|
||||
// Disconnect from the room. We don't do this in onLeave because that's
|
||||
// also called on an unintentional disconnect. Plus we don't have the
|
||||
// livekit room in onLeave anyway.
|
||||
livekitRoom.disconnect();
|
||||
onLeave();
|
||||
}, [livekitRoom, onLeave]);
|
||||
|
||||
useEffect(() => {
|
||||
widget?.api.transport.send(
|
||||
layout === "grid"
|
||||
? ElementWidgetActions.TileLayout
|
||||
: ElementWidgetActions.SpotlightLayout,
|
||||
{},
|
||||
const screenSharingTracks = useTracks(
|
||||
[{ source: Track.Source.ScreenShare, withPlaceholder: false }],
|
||||
{
|
||||
room: livekitRoom,
|
||||
},
|
||||
);
|
||||
const { layout, setLayout } = useVideoGridLayout(
|
||||
screenSharingTracks.length > 0,
|
||||
);
|
||||
}, [layout]);
|
||||
|
||||
useEffect(() => {
|
||||
if (widget) {
|
||||
const onTileLayout = (ev: CustomEvent<IWidgetApiRequest>): void => {
|
||||
setLayout("grid");
|
||||
widget!.api.transport.reply(ev.detail, {});
|
||||
};
|
||||
const onSpotlightLayout = (ev: CustomEvent<IWidgetApiRequest>): void => {
|
||||
setLayout("spotlight");
|
||||
widget!.api.transport.reply(ev.detail, {});
|
||||
};
|
||||
const { hideScreensharing, showControls } = useUrlParams();
|
||||
|
||||
widget.lazyActions.on(ElementWidgetActions.TileLayout, onTileLayout);
|
||||
widget.lazyActions.on(
|
||||
ElementWidgetActions.SpotlightLayout,
|
||||
onSpotlightLayout,
|
||||
const { isScreenShareEnabled, localParticipant } = useLocalParticipant({
|
||||
room: livekitRoom,
|
||||
});
|
||||
|
||||
const toggleMicrophone = useCallback(
|
||||
() => muteStates.audio.setEnabled?.((e) => !e),
|
||||
[muteStates],
|
||||
);
|
||||
const toggleCamera = useCallback(
|
||||
() => muteStates.video.setEnabled?.((e) => !e),
|
||||
[muteStates],
|
||||
);
|
||||
|
||||
// This function incorrectly assumes that there is a camera and microphone, which is not always the case.
|
||||
// TODO: Make sure that this module is resilient when it comes to camera/microphone availability!
|
||||
useCallViewKeyboardShortcuts(
|
||||
containerRef1,
|
||||
toggleMicrophone,
|
||||
toggleCamera,
|
||||
(muted) => muteStates.audio.setEnabled?.(!muted),
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
widget?.api.transport.send(
|
||||
layout === "grid"
|
||||
? ElementWidgetActions.TileLayout
|
||||
: ElementWidgetActions.SpotlightLayout,
|
||||
{},
|
||||
);
|
||||
}, [layout]);
|
||||
|
||||
return () => {
|
||||
widget!.lazyActions.off(ElementWidgetActions.TileLayout, onTileLayout);
|
||||
widget!.lazyActions.off(
|
||||
useEffect(() => {
|
||||
if (widget) {
|
||||
const onTileLayout = (ev: CustomEvent<IWidgetApiRequest>): void => {
|
||||
setLayout("grid");
|
||||
widget!.api.transport.reply(ev.detail, {});
|
||||
};
|
||||
const onSpotlightLayout = (
|
||||
ev: CustomEvent<IWidgetApiRequest>,
|
||||
): void => {
|
||||
setLayout("spotlight");
|
||||
widget!.api.transport.reply(ev.detail, {});
|
||||
};
|
||||
|
||||
widget.lazyActions.on(ElementWidgetActions.TileLayout, onTileLayout);
|
||||
widget.lazyActions.on(
|
||||
ElementWidgetActions.SpotlightLayout,
|
||||
onSpotlightLayout,
|
||||
);
|
||||
};
|
||||
}
|
||||
}, [setLayout]);
|
||||
|
||||
const mobile = boundsValid && bounds.width <= 660;
|
||||
const reducedControls = boundsValid && bounds.width <= 340;
|
||||
const noControls = reducedControls && bounds.height <= 400;
|
||||
return () => {
|
||||
widget!.lazyActions.off(
|
||||
ElementWidgetActions.TileLayout,
|
||||
onTileLayout,
|
||||
);
|
||||
widget!.lazyActions.off(
|
||||
ElementWidgetActions.SpotlightLayout,
|
||||
onSpotlightLayout,
|
||||
);
|
||||
};
|
||||
}
|
||||
}, [setLayout]);
|
||||
|
||||
const items = useParticipantTiles(livekitRoom, rtcSession.room, connState);
|
||||
const { fullscreenItem, toggleFullscreen, exitFullscreen } =
|
||||
useFullscreen(items);
|
||||
const mobile = boundsValid && bounds.width <= 660;
|
||||
const reducedControls = boundsValid && bounds.width <= 340;
|
||||
const noControls = reducedControls && bounds.height <= 400;
|
||||
|
||||
// The maximised participant: either the participant that the user has
|
||||
// manually put in fullscreen, or the focused (active) participant if the
|
||||
// window is too small to show everyone
|
||||
const maximisedParticipant = useMemo(
|
||||
() =>
|
||||
fullscreenItem ??
|
||||
(noControls
|
||||
? items.find((item) => item.isSpeaker) ?? items.at(0) ?? null
|
||||
: null),
|
||||
[fullscreenItem, noControls, items],
|
||||
);
|
||||
const vm = useCallViewModel(
|
||||
rtcSession.room,
|
||||
livekitRoom,
|
||||
matrixInfo.roomEncrypted,
|
||||
connState,
|
||||
);
|
||||
const items = useStateObservable(vm.tiles);
|
||||
const { fullscreenItem, toggleFullscreen, exitFullscreen } =
|
||||
useFullscreen(items);
|
||||
|
||||
const Grid =
|
||||
items.length > 12 && layout === "grid" ? NewVideoGrid : VideoGrid;
|
||||
// The maximised participant: either the participant that the user has
|
||||
// manually put in fullscreen, or the focused (active) participant if the
|
||||
// window is too small to show everyone
|
||||
const maximisedParticipant = useMemo(
|
||||
() =>
|
||||
fullscreenItem ??
|
||||
(noControls
|
||||
? items.find((item) => item.isSpeaker) ?? items.at(0) ?? null
|
||||
: null),
|
||||
[fullscreenItem, noControls, items],
|
||||
);
|
||||
|
||||
const prefersReducedMotion = usePrefersReducedMotion();
|
||||
const Grid =
|
||||
items.length > 12 && layout === "grid" ? NewVideoGrid : VideoGrid;
|
||||
|
||||
// This state is lifted out of NewVideoGrid so that layout states can be
|
||||
// restored after a layout switch or upon exiting fullscreen
|
||||
const layoutStates = useLayoutStates();
|
||||
const prefersReducedMotion = usePrefersReducedMotion();
|
||||
|
||||
// This state is lifted out of NewVideoGrid so that layout states can be
|
||||
// restored after a layout switch or upon exiting fullscreen
|
||||
const layoutStates = useLayoutStates();
|
||||
|
||||
const renderContent = (): JSX.Element => {
|
||||
if (items.length === 0) {
|
||||
return (
|
||||
<div className={styles.centerMessage}>
|
||||
<p>{t("waiting_for_participants")}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
if (maximisedParticipant) {
|
||||
return (
|
||||
<VideoTile
|
||||
vm={maximisedParticipant.data}
|
||||
maximised={true}
|
||||
fullscreen={maximisedParticipant === fullscreenItem}
|
||||
onToggleFullscreen={toggleFullscreen}
|
||||
targetHeight={bounds.height}
|
||||
targetWidth={bounds.width}
|
||||
key={maximisedParticipant.id}
|
||||
showSpeakingIndicator={false}
|
||||
onOpenProfile={openProfile}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
const renderContent = (): JSX.Element => {
|
||||
if (items.length === 0) {
|
||||
return (
|
||||
<div className={styles.centerMessage}>
|
||||
<p>{t("Waiting for other participants…")}</p>
|
||||
</div>
|
||||
<Grid
|
||||
items={items}
|
||||
layout={layout}
|
||||
disableAnimations={prefersReducedMotion || isSafari}
|
||||
layoutStates={layoutStates}
|
||||
>
|
||||
{({ data: vm, ...props }): ReactNode => (
|
||||
<VideoTile
|
||||
vm={vm}
|
||||
maximised={false}
|
||||
fullscreen={false}
|
||||
onToggleFullscreen={toggleFullscreen}
|
||||
showSpeakingIndicator={items.length > 2}
|
||||
onOpenProfile={openProfile}
|
||||
{...props}
|
||||
ref={props.ref as Ref<HTMLDivElement>}
|
||||
/>
|
||||
)}
|
||||
</Grid>
|
||||
);
|
||||
}
|
||||
if (maximisedParticipant) {
|
||||
return (
|
||||
<VideoTile
|
||||
maximised={true}
|
||||
fullscreen={maximisedParticipant === fullscreenItem}
|
||||
onToggleFullscreen={toggleFullscreen}
|
||||
targetHeight={bounds.height}
|
||||
targetWidth={bounds.width}
|
||||
key={maximisedParticipant.id}
|
||||
data={maximisedParticipant.data}
|
||||
showSpeakingIndicator={false}
|
||||
showConnectionStats={showConnectionStats}
|
||||
/>
|
||||
};
|
||||
|
||||
const rageshakeRequestModalProps = useRageshakeRequestModal(
|
||||
rtcSession.room.roomId,
|
||||
);
|
||||
|
||||
const [settingsModalOpen, setSettingsModalOpen] = useState(false);
|
||||
const [settingsTab, setSettingsTab] = useState(defaultSettingsTab);
|
||||
|
||||
const openSettings = useCallback(
|
||||
() => setSettingsModalOpen(true),
|
||||
[setSettingsModalOpen],
|
||||
);
|
||||
const closeSettings = useCallback(
|
||||
() => setSettingsModalOpen(false),
|
||||
[setSettingsModalOpen],
|
||||
);
|
||||
|
||||
const openProfile = useCallback(() => {
|
||||
setSettingsTab("profile");
|
||||
setSettingsModalOpen(true);
|
||||
}, [setSettingsTab, setSettingsModalOpen]);
|
||||
|
||||
const toggleScreensharing = useCallback(async () => {
|
||||
exitFullscreen();
|
||||
await localParticipant.setScreenShareEnabled(!isScreenShareEnabled, {
|
||||
audio: true,
|
||||
selfBrowserSurface: "include",
|
||||
surfaceSwitching: "include",
|
||||
systemAudio: "include",
|
||||
});
|
||||
}, [localParticipant, isScreenShareEnabled, exitFullscreen]);
|
||||
|
||||
let footer: JSX.Element | null;
|
||||
|
||||
if (noControls) {
|
||||
footer = null;
|
||||
} else {
|
||||
const buttons: JSX.Element[] = [];
|
||||
|
||||
buttons.push(
|
||||
<MicButton
|
||||
key="1"
|
||||
muted={!muteStates.audio.enabled}
|
||||
onPress={toggleMicrophone}
|
||||
disabled={muteStates.audio.setEnabled === null}
|
||||
data-testid="incall_mute"
|
||||
/>,
|
||||
<VideoButton
|
||||
key="2"
|
||||
muted={!muteStates.video.enabled}
|
||||
onPress={toggleCamera}
|
||||
disabled={muteStates.video.setEnabled === null}
|
||||
data-testid="incall_videomute"
|
||||
/>,
|
||||
);
|
||||
|
||||
if (!reducedControls) {
|
||||
if (canScreenshare && !hideScreensharing) {
|
||||
buttons.push(
|
||||
<ScreenshareButton
|
||||
key="3"
|
||||
enabled={isScreenShareEnabled}
|
||||
onPress={toggleScreensharing}
|
||||
data-testid="incall_screenshare"
|
||||
/>,
|
||||
);
|
||||
}
|
||||
buttons.push(<SettingsButton key="4" onPress={openSettings} />);
|
||||
}
|
||||
|
||||
buttons.push(
|
||||
<HangupButton
|
||||
key="6"
|
||||
onPress={function (): void {
|
||||
onLeave();
|
||||
}}
|
||||
data-testid="incall_leave"
|
||||
/>,
|
||||
);
|
||||
footer = (
|
||||
<div
|
||||
className={classNames(
|
||||
showControls
|
||||
? styles.footer
|
||||
: hideHeader
|
||||
? [styles.footer, styles.footerHidden]
|
||||
: [styles.footer, styles.footerThin],
|
||||
)}
|
||||
>
|
||||
{!mobile && !hideHeader && (
|
||||
<div className={styles.logo}>
|
||||
<LogoMark width={24} height={24} aria-hidden />
|
||||
<LogoType
|
||||
width={80}
|
||||
height={11}
|
||||
aria-label={import.meta.env.VITE_PRODUCT_NAME || "Element Call"}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
{showControls && <div className={styles.buttons}>{buttons}</div>}
|
||||
{!mobile && !hideHeader && showControls && (
|
||||
<LayoutToggle
|
||||
className={styles.layout}
|
||||
layout={layout}
|
||||
setLayout={setLayout}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Grid
|
||||
items={items}
|
||||
layout={layout}
|
||||
disableAnimations={prefersReducedMotion || isSafari}
|
||||
layoutStates={layoutStates}
|
||||
>
|
||||
{(props): ReactNode => (
|
||||
<VideoTile
|
||||
maximised={false}
|
||||
fullscreen={false}
|
||||
onToggleFullscreen={toggleFullscreen}
|
||||
showSpeakingIndicator={items.length > 2}
|
||||
showConnectionStats={showConnectionStats}
|
||||
{...props}
|
||||
ref={props.ref as Ref<HTMLDivElement>}
|
||||
/>
|
||||
<div className={styles.inRoom} ref={containerRef}>
|
||||
{!hideHeader && maximisedParticipant === null && (
|
||||
<Header>
|
||||
<LeftNav>
|
||||
<RoomHeaderInfo
|
||||
id={matrixInfo.roomId}
|
||||
name={matrixInfo.roomName}
|
||||
avatarUrl={matrixInfo.roomAvatar}
|
||||
encrypted={matrixInfo.roomEncrypted}
|
||||
participantCount={participantCount}
|
||||
/>
|
||||
</LeftNav>
|
||||
<RightNav>
|
||||
{!reducedControls && showControls && onShareClick !== null && (
|
||||
<InviteButton onClick={onShareClick} />
|
||||
)}
|
||||
</RightNav>
|
||||
</Header>
|
||||
)}
|
||||
</Grid>
|
||||
);
|
||||
};
|
||||
|
||||
const rageshakeRequestModalProps = useRageshakeRequestModal(
|
||||
rtcSession.room.roomId,
|
||||
);
|
||||
|
||||
const [settingsModalOpen, setSettingsModalOpen] = useState(false);
|
||||
|
||||
const openSettings = useCallback(
|
||||
() => setSettingsModalOpen(true),
|
||||
[setSettingsModalOpen],
|
||||
);
|
||||
const closeSettings = useCallback(
|
||||
() => setSettingsModalOpen(false),
|
||||
[setSettingsModalOpen],
|
||||
);
|
||||
|
||||
const toggleScreensharing = useCallback(async () => {
|
||||
exitFullscreen();
|
||||
await localParticipant.setScreenShareEnabled(!isScreenShareEnabled, {
|
||||
audio: true,
|
||||
selfBrowserSurface: "include",
|
||||
surfaceSwitching: "include",
|
||||
systemAudio: "include",
|
||||
});
|
||||
}, [localParticipant, isScreenShareEnabled, exitFullscreen]);
|
||||
|
||||
let footer: JSX.Element | null;
|
||||
|
||||
if (noControls) {
|
||||
footer = null;
|
||||
} else {
|
||||
const buttons: JSX.Element[] = [];
|
||||
|
||||
buttons.push(
|
||||
<MicButton
|
||||
key="1"
|
||||
muted={!muteStates.audio.enabled}
|
||||
onPress={toggleMicrophone}
|
||||
disabled={muteStates.audio.setEnabled === null}
|
||||
data-testid="incall_mute"
|
||||
/>,
|
||||
<VideoButton
|
||||
key="2"
|
||||
muted={!muteStates.video.enabled}
|
||||
onPress={toggleCamera}
|
||||
disabled={muteStates.video.setEnabled === null}
|
||||
data-testid="incall_videomute"
|
||||
/>,
|
||||
);
|
||||
|
||||
if (!reducedControls) {
|
||||
if (canScreenshare && !hideScreensharing) {
|
||||
buttons.push(
|
||||
<ScreenshareButton
|
||||
key="3"
|
||||
enabled={isScreenShareEnabled}
|
||||
onPress={toggleScreensharing}
|
||||
data-testid="incall_screenshare"
|
||||
/>,
|
||||
);
|
||||
}
|
||||
buttons.push(<SettingsButton key="4" onPress={openSettings} />);
|
||||
}
|
||||
|
||||
buttons.push(
|
||||
<HangupButton
|
||||
key="6"
|
||||
onPress={onLeavePress}
|
||||
data-testid="incall_leave"
|
||||
/>,
|
||||
);
|
||||
footer = (
|
||||
<div
|
||||
className={classNames(
|
||||
showControls
|
||||
? styles.footer
|
||||
: hideHeader
|
||||
? [styles.footer, styles.footerHidden]
|
||||
: [styles.footer, styles.footerThin],
|
||||
)}
|
||||
>
|
||||
{!mobile && !hideHeader && (
|
||||
<div className={styles.logo}>
|
||||
<LogoMark width={24} height={24} aria-hidden />
|
||||
<LogoType
|
||||
width={80}
|
||||
height={11}
|
||||
aria-label={import.meta.env.VITE_PRODUCT_NAME || "Element Call"}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
{showControls && <div className={styles.buttons}>{buttons}</div>}
|
||||
{!mobile && !hideHeader && showControls && (
|
||||
<LayoutToggle
|
||||
className={styles.layout}
|
||||
layout={layout}
|
||||
setLayout={setLayout}
|
||||
/>
|
||||
<div className={styles.controlsOverlay}>
|
||||
<RoomAudioRenderer />
|
||||
{renderContent()}
|
||||
{footer}
|
||||
</div>
|
||||
{!noControls && (
|
||||
<RageshakeRequestModal {...rageshakeRequestModalProps} />
|
||||
)}
|
||||
<SettingsModal
|
||||
client={client}
|
||||
roomId={rtcSession.room.roomId}
|
||||
open={settingsModalOpen}
|
||||
onDismiss={closeSettings}
|
||||
tab={settingsTab}
|
||||
onTabChange={setSettingsTab}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={styles.inRoom} ref={containerRef}>
|
||||
{!hideHeader && maximisedParticipant === null && (
|
||||
<Header>
|
||||
<LeftNav>
|
||||
<RoomHeaderInfo
|
||||
id={matrixInfo.roomId}
|
||||
name={matrixInfo.roomName}
|
||||
avatarUrl={matrixInfo.roomAvatar}
|
||||
encrypted={matrixInfo.roomEncrypted}
|
||||
participantCount={participantCount}
|
||||
/>
|
||||
</LeftNav>
|
||||
<RightNav>
|
||||
{!reducedControls && showControls && onShareClick !== null && (
|
||||
<InviteButton onClick={onShareClick} />
|
||||
)}
|
||||
</RightNav>
|
||||
</Header>
|
||||
)}
|
||||
<div className={styles.controlsOverlay}>
|
||||
<RoomAudioRenderer />
|
||||
{renderContent()}
|
||||
{footer}
|
||||
</div>
|
||||
{!noControls && <RageshakeRequestModal {...rageshakeRequestModalProps} />}
|
||||
<SettingsModal
|
||||
client={client}
|
||||
roomId={rtcSession.room.roomId}
|
||||
open={settingsModalOpen}
|
||||
onDismiss={closeSettings}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
function findMatrixMember(
|
||||
room: MatrixRoom,
|
||||
id: string,
|
||||
): RoomMember | undefined {
|
||||
if (!id) return undefined;
|
||||
|
||||
const parts = id.split(":");
|
||||
// must be at least 3 parts because we know the first part is a userId which must necessarily contain a colon
|
||||
if (parts.length < 3) {
|
||||
logger.warn(
|
||||
"Livekit participants ID doesn't look like a userId:deviceId combination",
|
||||
);
|
||||
return undefined;
|
||||
}
|
||||
|
||||
parts.pop();
|
||||
const userId = parts.join(":");
|
||||
|
||||
return room.getMember(userId) ?? undefined;
|
||||
}
|
||||
|
||||
function useParticipantTiles(
|
||||
livekitRoom: Room,
|
||||
matrixRoom: MatrixRoom,
|
||||
connState: ECConnectionState,
|
||||
): TileDescriptor<ItemData>[] {
|
||||
const previousTiles = useRef<TileDescriptor<ItemData>[]>([]);
|
||||
|
||||
const sfuParticipants = useParticipants({
|
||||
room: livekitRoom,
|
||||
});
|
||||
|
||||
const items = useMemo(() => {
|
||||
const hasPresenter =
|
||||
sfuParticipants.find((p) => p.isScreenShareEnabled) !== undefined;
|
||||
let allGhosts = true;
|
||||
|
||||
const speakActiveTime = new Date();
|
||||
speakActiveTime.setSeconds(speakActiveTime.getSeconds() - 10);
|
||||
// Iterate over SFU participants (those who actually are present from the SFU perspective) and create tiles for them.
|
||||
const tiles: TileDescriptor<ItemData>[] = sfuParticipants.flatMap(
|
||||
(sfuParticipant) => {
|
||||
const hadSpokedInTime =
|
||||
!hasPresenter && sfuParticipant.lastSpokeAt
|
||||
? sfuParticipant.lastSpokeAt > speakActiveTime
|
||||
: false;
|
||||
|
||||
const id = sfuParticipant.identity;
|
||||
const member = findMatrixMember(matrixRoom, id);
|
||||
// We always start with a local participant wit the empty string as their ID before we're
|
||||
// connected, this is fine and we'll be in "all ghosts" mode.
|
||||
if (id !== "" && member === undefined) {
|
||||
logger.warn(
|
||||
`Ruh, roh! No matrix member found for SFU participant '${id}': creating g-g-g-ghost!`,
|
||||
);
|
||||
}
|
||||
allGhosts &&= member === undefined;
|
||||
|
||||
const userMediaTile = {
|
||||
id,
|
||||
focused: false,
|
||||
isPresenter: sfuParticipant.isScreenShareEnabled,
|
||||
isSpeaker:
|
||||
(sfuParticipant.isSpeaking || hadSpokedInTime) &&
|
||||
!sfuParticipant.isLocal,
|
||||
hasVideo: sfuParticipant.isCameraEnabled,
|
||||
local: sfuParticipant.isLocal,
|
||||
largeBaseSize: false,
|
||||
data: {
|
||||
id,
|
||||
member,
|
||||
sfuParticipant,
|
||||
content: TileContent.UserMedia,
|
||||
},
|
||||
};
|
||||
|
||||
// If there is a screen sharing enabled for this participant, create a tile for it as well.
|
||||
let screenShareTile: TileDescriptor<ItemData> | undefined;
|
||||
if (sfuParticipant.isScreenShareEnabled) {
|
||||
const screenShareId = `${id}:screen-share`;
|
||||
screenShareTile = {
|
||||
...userMediaTile,
|
||||
id: screenShareId,
|
||||
focused: true,
|
||||
largeBaseSize: true,
|
||||
placeNear: id,
|
||||
data: {
|
||||
...userMediaTile.data,
|
||||
id: screenShareId,
|
||||
content: TileContent.ScreenShare,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
return screenShareTile
|
||||
? [userMediaTile, screenShareTile]
|
||||
: [userMediaTile];
|
||||
},
|
||||
);
|
||||
|
||||
PosthogAnalytics.instance.eventCallEnded.cacheParticipantCountChanged(
|
||||
tiles.length,
|
||||
);
|
||||
|
||||
// If every item is a ghost, that probably means we're still connecting and
|
||||
// shouldn't bother showing anything yet
|
||||
return allGhosts ? [] : tiles;
|
||||
}, [matrixRoom, sfuParticipants]);
|
||||
|
||||
// We carry over old tiles from the previous focus for some time after a focus switch
|
||||
// so that the video tiles don't all disappear and reappear.
|
||||
// This is set to true when the state transitions to Switching Focus and remains
|
||||
// true for a short time after it changes (ie. connState is only switching focus for
|
||||
// the time it takes us to reconnect to the conference).
|
||||
// If there are still members that haven't reconnected after that time, they'll just
|
||||
// appear to disconnect and will reappear once they reconnect.
|
||||
const [isSwitchingFocus, setIsSwitchingFocus] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (connState === ECAddonConnectionState.ECSwitchingFocus) {
|
||||
setIsSwitchingFocus(true);
|
||||
} else if (isSwitchingFocus) {
|
||||
setTimeout(() => {
|
||||
setIsSwitchingFocus(false);
|
||||
}, POST_FOCUS_PARTICIPANT_UPDATE_DELAY_MS);
|
||||
}
|
||||
}, [connState, setIsSwitchingFocus, isSwitchingFocus]);
|
||||
|
||||
if (
|
||||
connState === ECAddonConnectionState.ECSwitchingFocus ||
|
||||
isSwitchingFocus
|
||||
) {
|
||||
logger.debug("Switching focus: injecting previous tiles");
|
||||
|
||||
// inject the previous tile for members that haven't rejoined yet
|
||||
const newItems = items.slice(0);
|
||||
const rejoined = new Set(newItems.map((p) => p.id));
|
||||
|
||||
for (const prevTile of previousTiles.current) {
|
||||
if (!rejoined.has(prevTile.id)) {
|
||||
newItems.push(prevTile);
|
||||
}
|
||||
}
|
||||
|
||||
return newItems;
|
||||
} else {
|
||||
previousTiles.current = items;
|
||||
return items;
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -18,6 +18,7 @@ limitations under the License.
|
||||
text-align: center;
|
||||
color: var(--cpd-color-text-secondary);
|
||||
margin-block-end: var(--cpd-space-8x);
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
.button {
|
||||
|
||||
@@ -58,7 +58,7 @@ export const InviteModal: FC<Props> = ({ room, open, onDismiss }) => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<Modal title={t("Invite to this call")} open={open} onDismiss={onDismiss}>
|
||||
<Modal title={t("invite_modal.title")} open={open} onDismiss={onDismiss}>
|
||||
<Text className={styles.url} size="sm" weight="semibold">
|
||||
{url}
|
||||
</Text>
|
||||
@@ -68,7 +68,7 @@ export const InviteModal: FC<Props> = ({ room, open, onDismiss }) => {
|
||||
onClick={onButtonClick}
|
||||
data-testid="modal_inviteLink"
|
||||
>
|
||||
{t("Copy link")}
|
||||
{t("action.copy_link")}
|
||||
</Button>
|
||||
</Modal>
|
||||
<Toast
|
||||
@@ -77,7 +77,7 @@ export const InviteModal: FC<Props> = ({ room, open, onDismiss }) => {
|
||||
autoDismiss={2000}
|
||||
Icon={CheckIcon}
|
||||
>
|
||||
{t("Link copied to clipboard")}
|
||||
{t("invite_modal.link_copied_toast")}
|
||||
</Toast>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -52,9 +52,9 @@ export const LayoutToggle: FC<Props> = ({ layout, setLayout, className }) => {
|
||||
checked={layout === "spotlight"}
|
||||
onChange={onChange}
|
||||
/>
|
||||
<Tooltip label={t("Spotlight")}>
|
||||
<Tooltip label={t("layout_spotlight_label")}>
|
||||
<label htmlFor={spotlightId}>
|
||||
<SpotlightIcon aria-label={t("Spotlight")} />
|
||||
<SpotlightIcon aria-label={t("layout_spotlight_label")} />
|
||||
</label>
|
||||
</Tooltip>
|
||||
<input
|
||||
@@ -65,9 +65,9 @@ export const LayoutToggle: FC<Props> = ({ layout, setLayout, className }) => {
|
||||
checked={layout === "grid"}
|
||||
onChange={onChange}
|
||||
/>
|
||||
<Tooltip label={t("Grid")}>
|
||||
<Tooltip label={t("layout_grid_label")}>
|
||||
<label htmlFor={gridId}>
|
||||
<GridIcon aria-label={t("Grid")} />
|
||||
<GridIcon aria-label={t("layout_grid_label")} />
|
||||
</label>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2022 New Vector Ltd
|
||||
Copyright 2022-2023 New Vector Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@@ -34,7 +34,7 @@ import {
|
||||
SettingsButton,
|
||||
VideoButton,
|
||||
} from "../button/Button";
|
||||
import { SettingsModal } from "../settings/SettingsModal";
|
||||
import { SettingsModal, defaultSettingsTab } from "../settings/SettingsModal";
|
||||
import { useMediaQuery } from "../useMediaQuery";
|
||||
|
||||
interface Props {
|
||||
@@ -71,6 +71,7 @@ export const LobbyView: FC<Props> = ({
|
||||
);
|
||||
|
||||
const [settingsModalOpen, setSettingsModalOpen] = useState(false);
|
||||
const [settingsTab, setSettingsTab] = useState(defaultSettingsTab);
|
||||
|
||||
const openSettings = useCallback(
|
||||
() => setSettingsModalOpen(true),
|
||||
@@ -87,7 +88,7 @@ export const LobbyView: FC<Props> = ({
|
||||
const recentsButtonInFooter = useMediaQuery("(max-height: 500px)");
|
||||
const recentsButton = !confineToRoom && (
|
||||
<Link className={styles.recents} href="#" onClick={onLeaveClick}>
|
||||
{t("Back to recents")}
|
||||
{t("lobby.leave_button")}
|
||||
</Link>
|
||||
);
|
||||
|
||||
@@ -120,7 +121,7 @@ export const LobbyView: FC<Props> = ({
|
||||
onClick={onEnter}
|
||||
data-testid="lobby_joinCall"
|
||||
>
|
||||
{t("Join call")}
|
||||
{t("lobby.join_button")}
|
||||
</Button>
|
||||
</VideoPreview>
|
||||
{!recentsButtonInFooter && recentsButton}
|
||||
@@ -148,6 +149,8 @@ export const LobbyView: FC<Props> = ({
|
||||
client={client}
|
||||
open={settingsModalOpen}
|
||||
onDismiss={closeSettings}
|
||||
tab={settingsTab}
|
||||
onTabChange={setSettingsTab}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
|
||||