Compare commits

..

2 Commits

Author SHA1 Message Date
David Baker
9ecab1d61c Merge pull request #1896 from vector-im/dbkr/revert-1772
Revert per-sender keys
2023-11-14 15:56:06 +00:00
David Baker
930cb49589 Revert per-sender keys
This reverts https://github.com/vector-im/element-call/pull/1772
on to the 1.5.11 release branch so we can test without per-sender
keys and see if we still get the same sporadic failures.
2023-11-14 15:35:52 +00:00
90 changed files with 2611 additions and 3675 deletions

View File

@@ -26,7 +26,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Log in to container registry - name: Log in to container registry
uses: docker/login-action@3d58c274f17dffee475a5520cbe67f0a882c4dbb uses: docker/login-action@1f401f745bf57e30b3a2800ad308a87d2ebdf14b
with: with:
registry: ${{ env.REGISTRY }} registry: ${{ env.REGISTRY }}
username: ${{ github.actor }} username: ${{ github.actor }}
@@ -62,7 +62,7 @@ jobs:
- name: Extract metadata (tags, labels) for Docker - name: Extract metadata (tags, labels) for Docker
id: meta id: meta
uses: docker/metadata-action@2a4836ac76fe8f5d0ee3a0d89aa12a80cc552ad3 uses: docker/metadata-action@62339db73c56dd749060f65a6ebb93a6e056b755
with: with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: | tags: |
@@ -75,7 +75,7 @@ jobs:
uses: docker/setup-buildx-action@6d5347c4025fdf2bb05167a2519cac535a14a408 uses: docker/setup-buildx-action@6d5347c4025fdf2bb05167a2519cac535a14a408
- name: Build and push Docker image - name: Build and push Docker image
uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 uses: docker/build-push-action@fdf7f43ecf7c1a5c7afe936410233728a8c2d9c2
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64

View File

@@ -1,56 +0,0 @@
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@v3
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 }}

View File

@@ -1,20 +0,0 @@
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 }}

View File

@@ -1,7 +1,7 @@
# Element Call # Element Call
[![Chat](https://img.shields.io/matrix/webrtc:matrix.org)](https://matrix.to/#/#webrtc:matrix.org) [![Chat](https://img.shields.io/matrix/webrtc:matrix.org)](https://matrix.to/#/#webrtc:matrix.org)
[![Localazy](https://img.shields.io/endpoint?url=https%3A%2F%2Fconnect.localazy.com%2Fstatus%2Felement-call%2Fdata%3Fcontent%3Dall%26title%3Dlocalazy%26logo%3Dtrue)](https://localazy.com/p/element-call) [![Translate](https://translate.element.io/widgets/element-call/-/element-call/svg-badge.svg)](https://translate.element.io/engage/element-call/)
Group calls with WebRTC that leverage [Matrix](https://matrix.org) and an open-source WebRTC toolkit from [LiveKit](https://livekit.io/). Group calls with WebRTC that leverage [Matrix](https://matrix.org) and an open-source WebRTC toolkit from [LiveKit](https://livekit.io/).
@@ -56,7 +56,7 @@ There are currently two different config files. `.env` holds variables that are
## Translation ## Translation
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. 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.
## Development ## Development

View File

@@ -112,9 +112,8 @@ Whether to hide the screen-sharing button.
hideScreensharing: boolean; (default: false) hideScreensharing: boolean; (default: false)
``` ```
**enableE2EE** (Deprecated) **enableE2EE**
Whether to use end-to-end encryption. This is a legacy flag for the full mesh branch. Whether to use end-to-end encryption.
It is not used on the livekit branch and has no impact there!
``` ```
enableE2EE: boolean; (default: true) enableE2EE: boolean; (default: true)

View File

@@ -1,8 +1,8 @@
export default { export default {
keySeparator: ".", keySeparator: false,
namespaceSeparator: false, namespaceSeparator: false,
contextSeparator: "|", contextSeparator: "|",
pluralSeparator: "_", pluralSeparator: "|",
createOldCatalogs: false, createOldCatalogs: false,
defaultNamespace: "app", defaultNamespace: "app",
lexers: { lexers: {
@@ -10,14 +10,7 @@ export default {
{ {
lexer: "JavascriptLexer", lexer: "JavascriptLexer",
functions: ["t", "translatedError"], functions: ["t", "translatedError"],
namespaceFunctions: ["useTranslation", "withTranslation"], functionsNamespace: ["useTranslation", "withTranslation"],
},
],
tsx: [
{
lexer: "JsxLexer",
functions: ["t", "translatedError"],
namespaceFunctions: ["useTranslation", "withTranslation"],
}, },
], ],
}, },
@@ -25,4 +18,6 @@ export default {
output: "public/locales/$LOCALE/$NAMESPACE.json", output: "public/locales/$LOCALE/$NAMESPACE.json",
input: ["src/**/*.{ts,tsx}"], input: ["src/**/*.{ts,tsx}"],
sort: true, sort: true,
// The key becomes the English version of the string
defaultValue: (_l, _ns, key) => key,
}; };

View File

@@ -1,33 +0,0 @@
{
"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"
}
}
}

View File

@@ -46,7 +46,7 @@
"@sentry/tracing": "^7.0.0", "@sentry/tracing": "^7.0.0",
"@types/lodash": "^4.14.199", "@types/lodash": "^4.14.199",
"@use-gesture/react": "^10.2.11", "@use-gesture/react": "^10.2.11",
"@vector-im/compound-design-tokens": "^0.1.0", "@vector-im/compound-design-tokens": "^0.0.7",
"@vector-im/compound-web": "^0.6.0", "@vector-im/compound-web": "^0.6.0",
"@vitejs/plugin-basic-ssl": "^1.0.1", "@vitejs/plugin-basic-ssl": "^1.0.1",
"@vitejs/plugin-react": "^4.0.1", "@vitejs/plugin-react": "^4.0.1",
@@ -58,7 +58,7 @@
"i18next-http-backend": "^2.0.0", "i18next-http-backend": "^2.0.0",
"livekit-client": "^1.12.3", "livekit-client": "^1.12.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#eca651c0c2ff0600bdae0bb6aba43485e48b69d5", "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#4ce837b20e638a185f9002b2388fbaf48975ee6e",
"matrix-widget-api": "^1.3.1", "matrix-widget-api": "^1.3.1",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"pako": "^2.0.4", "pako": "^2.0.4",

View File

@@ -1,78 +1,60 @@
{ {
"a11y": { "<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>",
"user_menu": "Потребителско меню" "<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>",
"action": { "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 логове.",
"close": "Затвори", "Audio": "Звук",
"go": "Напред", "Avatar": "Аватар",
"no": "Не", "Camera": "Камера",
"register": "Регистрация", "Close": "Затвори",
"remove": "Премахни", "Confirm password": "Потвърди паролата",
"sign_in": "Влез", "Copied!": "Копирано!",
"sign_out": "Излез" "Create account": "Създай акаунт",
}, "Debug log request": "Заявка за debug логове",
"call_ended_view": { "Developer": "Разработчик",
"create_account_button": "Създай акаунт", "Display name": "Име/псевдоним",
"create_account_prompt": "<0>Защо не настройте парола за да запазите акаунта си?</0><1>Ще можете да запазите името и аватара си за бъдещи разговори</1>", "Exit full screen": "Излез от цял екран",
"not_now_button": "Не сега, върни се на началния екран" "Full screen": "Цял екран",
}, "Go": "Напред",
"common": { "Home": "Начало",
"audio": "Звук", "Include debug logs": "Включи debug логове",
"avatar": "Аватар", "Join call": "Влез в разговора",
"camera": "Камера", "Join call now": "Влез в разговора сега",
"copied": "Копирано!", "Join existing call?": "Присъединяване към съществуващ разговор?",
"display_name": "Име/псевдоним", "Loading…": "Зареждане…",
"home": "Начало", "Local volume": "Локална сила на звука",
"loading": "Зареждане…", "Logging in…": "Влизане…",
"microphone": "Микрофон", "Login": "Влез",
"password": "Парола", "Login to your account": "Влезте в акаунта си",
"profile": "Профил", "Microphone": "Микрофон",
"settings": "Настройки", "More": "Още",
"username": "Потребителско име", "No": "Не",
"video": "Видео" "Not now, return to home screen": "Не сега, върни се на началния екран",
}, "Not registered yet? <2>Create an account</2>": "Все още не сте регистрирани? <2>Създайте акаунт</2>",
"exit_fullscreen_button_label": "Излез от цял екран", "Password": "Парола",
"fullscreen_button_label": "Цял екран", "Passwords must match": "Паролите не съвпадат",
"join_existing_call_modal": { "Profile": "Профил",
"join_button": "Да, присъедини се", "Recaptcha dismissed": "Recaptcha отхвърлена",
"text": "Този разговор вече съществува, искате ли да се присъедините?", "Recaptcha not loaded": "Recaptcha не е заредена",
"title": "Присъединяване към съществуващ разговор?" "Register": "Регистрация",
}, "Registering…": "Регистриране…",
"layout_spotlight_label": "Прожектор", "Remove": "Премахни",
"lobby": { "Return to home screen": "Връщане на началния екран",
"join_button": "Влез в разговора" "Select an option": "Изберете опция",
}, "Send debug logs": "Изпратете debug логове",
"local_volume_label": "Локална сила на звука", "Sending…": "Изпращане…",
"logging_in": "Влизане…", "Settings": "Настройки",
"login_auth_links": "<0>Създайте акаунт</0> или <2>Влезте като гост</2>", "Share screen": "Сподели екрана",
"login_title": "Влез", "Sign in": "Влез",
"rageshake_request_modal": { "Sign out": "Излез",
"body": "Друг потребител в този разговор има проблем. За да диагностицираме този проблем по-добре ни се иска да съберем debug логове.", "Speaker": "Говорител",
"title": "Заявка за debug логове" "Spotlight": "Прожектор",
}, "Submit feedback": "Изпрати обратна връзка",
"rageshake_send_logs": "Изпратете debug логове", "This call already exists, would you like to join?": "Този разговор вече съществува, искате ли да се присъедините?",
"rageshake_sending": "Изпращане…", "User menu": "Потребителско меню",
"recaptcha_dismissed": "Recaptcha отхвърлена", "Username": "Потребителско име",
"recaptcha_not_loaded": "Recaptcha не е заредена", "Version: {{version}}": "Версия: {{version}}",
"register": { "Video": "Видео",
"passwords_must_match": "Паролите не съвпадат", "Waiting for other participants…": "Изчакване на други участници…",
"registering": "Регистриране…" "Yes, join call": "Да, присъедини се"
},
"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": "Изчакване на други участници…"
} }

View File

@@ -1,82 +1,67 @@
{ {
"a11y": { "Copied!": "Zkopírováno!",
"user_menu": "Uživatelské menu" "Confirm password": "Potvrdit heslo",
}, "Close": "Zavřít",
"action": { "Camera": "Kamera",
"close": "Zavřít", "Avatar": "Avatar",
"copy": "Kopírovat", "Audio": "Audio",
"go": "Pokračovat", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Vytvořit účet</0> Or <2>Jako host</2>",
"no": "Ne", "Yes, join call": "Ano, připojit se",
"register": "Registrace", "Waiting for other participants…": "Čekání na další účastníky…",
"remove": "Odstranit", "Video": "Video",
"sign_in": "Přihlásit se", "Version: {{version}}": "Verze: {{version}}",
"sign_out": "Odhlásit se" "Username": "Uživatelské jméno",
}, "User menu": "Uživatelské menu",
"call_ended_view": { "This call already exists, would you like to join?": "Tento hovor již existuje, chcete se připojit?",
"create_account_button": "Vytvořit účet", "Submit feedback": "Dát feedback",
"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>", "Speaker": "Reproduktor",
"not_now_button": "Teď ne, vrátit se na domovskou obrazovku" "Sign out": "Odhlásit se",
}, "Sign in": "Přihlásit se",
"common": { "Share screen": "Sdílet obrazovku",
"camera": "Kamera", "Settings": "Nastavení",
"copied": "Zkopírováno!", "Sending…": "Posílání…",
"display_name": "Zobrazované jméno", "Sending debug logs…": "Posílání ladícího záznamu…",
"home": "Domov", "Send debug logs": "Poslat ladící záznam",
"loading": "Načítání…", "Select an option": "Vyberte možnost",
"microphone": "Mikrofon", "Return to home screen": "Vrátit se na domácí obrazovku",
"password": "Heslo", "Remove": "Odstranit",
"profile": "Profil", "Registering…": "Registrování…",
"settings": "Nastavení", "Register": "Registrace",
"username": "Uživatelské jméno" "Profile": "Profil",
}, "Passwords must match": "Hesla se musí shodovat",
"exit_fullscreen_button_label": "Ukončit režim celé obrazovky", "Password": "Heslo",
"full_screen_view_description": "<0>Odeslání ladících záznamů nám pomůže diagnostikovat problém.</0>", "Not now, return to home screen": "Teď ne, vrátit se na domovskou obrazovku",
"full_screen_view_h1": "<0>Oops, něco se pokazilo.</0>", "No": "Ne",
"fullscreen_button_label": "Zvětšit na celou obrazovku", "More": "Více",
"header_label": "Domov Element Call", "Microphone": "Mikrofon",
"join_existing_call_modal": { "Login to your account": "Přihlásit se ke svému účtu",
"join_button": "Ano, připojit se", "Login": "Přihlášení",
"text": "Tento hovor již existuje, chcete se připojit?", "Logging in…": "Přihlašování se…",
"title": "Připojit se k existujícimu hovoru?" "Local volume": "Lokální hlasitost",
}, "Loading…": "Načítání…",
"layout_spotlight_label": "Soustředěný mód", "Join call now": "Připojit se k hovoru",
"lobby": { "Join call": "Připojit se k hovoru",
"join_button": "Připojit se k hovoru" "Spotlight": "Soustředěný mód",
}, "Recaptcha not loaded": "Recaptcha se nenačetla",
"local_volume_label": "Lokální hlasitost", "Recaptcha dismissed": "Recaptcha byla zamítnuta",
"logging_in": "Přihlašová se…", "Not registered yet? <2>Create an account</2>": "Nejste registrova? <2>Vytvořit účet</2>",
"login_auth_links": "<0>Vytvořit účet</0> Or <2>Jako host</2>", "Join existing call?": "Připojit se k existujícimu hovoru?",
"login_title": "Přihlášení", "Include debug logs": "Zahrnout ladící záznamy",
"rageshake_request_modal": { "Home": "Domov",
"body": "Jiný uživatel v tomto hovoru má problémy. Abychom mohli diagnostikovat problém, rádi bychom shromáždili protokoly ladění.", "Go": "Pokračovat",
"title": "Žádost o protokoly ladění" "Full screen": "Zvětšit na celou obrazovku",
}, "Exit full screen": "Ukončit režim celé obrazovky",
"rageshake_send_logs": "Poslat ladící záznam", "Element Call Home": "Domov Element Call",
"rageshake_sending": "Posílání…", "Display name": "Zobrazované jméno",
"rageshake_sending_logs": "Posílání ladícího záznamu…", "Developer": "Vývojář",
"recaptcha_dismissed": "Recaptcha byla zamítnuta", "Debug log request": "Žádost o protokoly ladění",
"recaptcha_not_loaded": "Recaptcha se nenačetla", "Create account": "Vytvořit účet",
"register": { "Copy": "Kopírovat",
"passwords_must_match": "Hesla se musí shodovat", "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í.",
"registering": "Registrová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>",
"register_auth_links": "<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>",
"register_confirm_password_label": "Potvrdit heslo", "<0>Oops, something's gone wrong.</0>": "<0>Oops, něco se pokazilo.</0>",
"return_home_button": "Vrátit se na domácí obrazovku", "Expose developer settings in the settings window.": "Zobrazit vývojářské nastavení.",
"room_auth_view_join_button": "Připojit se k hovoru", "Developer Settings": "Vývojářské nastavení"
"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…"
} }

View File

@@ -1,148 +1,120 @@
{ {
"a11y": { "<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>",
"user_menu": "Benutzermenü" "<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>",
"action": { "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.",
"close": "Schließen", "Audio": "Audio",
"copy": "Kopieren", "Avatar": "Avatar",
"copy_link": "Link kopieren", "Camera": "Kamera",
"go": "Los gehts", "Close": "Schließen",
"invite": "Einladen", "Confirm password": "Passwort bestätigen",
"no": "Nein", "Copied!": "Kopiert!",
"register": "Registrieren", "Create account": "Konto erstellen",
"remove": "Entfernen", "Debug log request": "Debug-Log Anfrage",
"sign_in": "Anmelden", "Developer": "Entwickler",
"sign_out": "Abmelden", "Display name": "Anzeigename",
"submit": "Absenden" "Exit full screen": "Vollbildmodus verlassen",
}, "Full screen": "Vollbild",
"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>.", "Go": "Los gehts",
"app_selection_modal": { "Home": "Startseite",
"continue_in_browser": "Weiter im Browser", "Include debug logs": "Debug-Protokolle einschließen",
"open_in_app": "In der App öffnen", "Join call": "Anruf beitreten",
"text": "Bereit, beizutreten?", "Join call now": "Anruf beitreten",
"title": "App auswählen" "Join existing call?": "An bestehendem Anruf teilnehmen?",
}, "Loading…": "Lade …",
"application_opened_another_tab": "Diese Anwendung wurde in einem anderen Tab geöffnet.", "Local volume": "Lokale Lautstärke",
"browser_media_e2ee_unsupported": "Dein Webbrowser unterstützt keine Medien-Ende-zu-Ende-Verschlüsselung. Unterstützte Browser sind Chrome, Safari, Firefox >=117", "Logging in…": "Anmelden ",
"browser_media_e2ee_unsupported_heading": "Inkompatibler Browser", "Login": "Anmelden",
"call_ended_view": { "Login to your account": "Melde dich mit deinem Konto an",
"body": "Deine Verbindung wurde getrennt", "Microphone": "Mikrofon",
"create_account_button": "Konto erstellen", "More": "Mehr",
"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>", "No": "Nein",
"feedback_done": "<0>Danke für deine Rückmeldung!</0>", "Not now, return to home screen": "Nicht jetzt, zurück zur Startseite",
"feedback_prompt": "<0>Wir würden uns freuen, deine Rückmeldung zu hören, um deine Erfahrung verbessern zu können.</0>", "Not registered yet? <2>Create an account</2>": "Noch nicht registriert? <2>Konto erstellen</2>",
"headline": "{{displayName}}, dein Anruf wurde beendet.", "Password": "Passwort",
"not_now_button": "Nicht jetzt, zurück zur Startseite", "Passwords must match": "Passwörter müssen übereinstimmen",
"reconnect_button": "Erneut verbinden", "Profile": "Profil",
"survey_prompt": "Wie ist es gelaufen?" "Recaptcha dismissed": "Recaptcha abgelehnt",
}, "Recaptcha not loaded": "Recaptcha nicht geladen",
"call_name": "Name des Anrufs", "Register": "Registrieren",
"common": { "Registering…": "Registrierung …",
"audio": "Audio", "Remove": "Entfernen",
"avatar": "Profilbild", "Return to home screen": "Zurück zur Startseite",
"camera": "Kamera", "Select an option": "Wähle eine Option",
"copied": "Kopiert!", "Send debug logs": "Debug-Logs senden",
"display_name": "Anzeigename", "Sending…": "Senden ",
"encrypted": "Verschlüsselt", "Settings": "Einstellungen",
"error": "Fehler", "Share screen": "Bildschirm teilen",
"home": "Startseite", "Sign in": "Anmelden",
"loading": "Lade ", "Sign out": "Abmelden",
"microphone": "Mikrofon", "Speaker": "Wiedergabegerät",
"password": "Passwort", "Spotlight": "Rampenlicht",
"profile": "Profil", "Submit feedback": "Rückmeldung geben",
"settings": "Einstellungen", "This call already exists, would you like to join?": "Dieser Aufruf existiert bereits, möchtest Du teilnehmen?",
"unencrypted": "Nicht verschlüsselt", "User menu": "Benutzermenü",
"username": "Benutzername", "Username": "Benutzername",
"video": "Video" "Version: {{version}}": "Version: {{version}}",
}, "Video": "Video",
"disconnected_banner": "Die Verbindung zum Server wurde getrennt.", "Waiting for other participants…": "Warte auf weitere Teilnehmer ",
"exit_fullscreen_button_label": "Vollbildmodus verlassen", "Yes, join call": "Ja, Anruf beitreten",
"full_screen_view_description": "<0>Übermittelte Problemberichte helfen uns, Fehler zu beheben.</0>", "Sending debug logs…": "Sende Debug-Protokolle …",
"full_screen_view_h1": "<0>Hoppla, etwas ist schiefgelaufen.</0>", "Copy": "Kopieren",
"fullscreen_button_label": "Vollbild", "Element Call Home": "Element Call-Startseite",
"group_call_loader_failed_heading": "Anruf nicht gefunden", "<0>Submitting debug logs will help us track down the problem.</0>": "<0>Übermittelte Problemberichte helfen uns, Fehler zu beheben.</0>",
"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.", "<0>Oops, something's gone wrong.</0>": "<0>Hoppla, etwas ist schiefgelaufen.</0>",
"hangup_button_label": "Anruf beenden", "Expose developer settings in the settings window.": "Zeige die Entwicklereinstellungen im Einstellungsfenster.",
"header_label": "Element Call-Startseite", "Developer Settings": "Entwicklereinstellungen",
"header_participants_label": "Teilnehmende", "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>.",
"invite_modal": { "<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.",
"link_copied_toast": "Link in Zwischenablage kopiert", "Feedback": "Rückmeldung",
"title": "Zu diesem Anruf einladen" "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",
"join_existing_call_modal": { "Thanks, we received your feedback!": "Danke, wir haben deine Rückmeldung erhalten!",
"join_button": "Ja, Anruf beitreten", "Submitting…": "Sende ",
"text": "Dieser Aufruf existiert bereits, möchtest Du teilnehmen?", "Submit": "Absenden",
"title": "An bestehendem Anruf teilnehmen?" "{{count}} stars|other": "{{count}} Sterne",
}, "{{displayName}}, your call has ended.": "{{displayName}}, dein Anruf wurde beendet.",
"layout_grid_label": "Raster", "<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>",
"layout_spotlight_label": "Rampenlicht", "How did it go?": "Wie ist es gelaufen?",
"lobby": { "{{count}} stars|one": "{{count}} Stern",
"join_button": "Anruf beitreten", "<0>Thanks for your feedback!</0>": "<0>Danke für deine Rückmeldung!</0>",
"leave_button": "Zurück zu kürzlichen Anrufen" "{{displayName}} is presenting": "{{displayName}} präsentiert",
}, "Show connection stats": "Verbindungsstatistiken zeigen",
"local_volume_label": "Lokale Lautstärke", "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>",
"log_in": "Anmelden", "By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Mit einem Klick auf „Los gehts“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)</2>",
"logging_in": "Anmelden ", "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>",
"login_auth_links": "<0>Konto erstellen</0> Oder <2>Als Gast betreten</2>", "Connectivity to the server has been lost.": "Die Verbindung zum Server wurde getrennt.",
"login_auth_links_prompt": "Noch nicht registriert?", "Thanks!": "Danke!",
"login_subheading": "Weiter zu Element", "You were disconnected from the call": "Deine Verbindung wurde getrennt",
"login_title": "Anmelden", "Reconnect": "Erneut verbinden",
"microphone_off": "Mikrofon aus", "Retry sending logs": "Protokolle erneut senden",
"microphone_on": "Mikrofon an", "Encrypted": "Verschlüsselt",
"mute_microphone_button_label": "Mikrofon deaktivieren", "End call": "Anruf beenden",
"rageshake_button_error_caption": "Protokolle erneut senden", "Grid": "Raster",
"rageshake_request_modal": { "Not encrypted": "Nicht verschlüsselt",
"body": "Ein anderer Benutzer dieses Anrufs hat ein Problem. Um es besser diagnostizieren zu können, würden wir gerne ein Debug-Protokoll erstellen.", "Microphone off": "Mikrofon aus",
"title": "Debug-Log Anfrage" "Microphone on": "Mikrofon an",
}, "{{count, number}}|one": "{{count, number}}",
"rageshake_send_logs": "Debug-Logs senden", "{{count, number}}|other": "{{count, number}}",
"rageshake_sending": "Senden ", "Sharing screen": "Bildschirm wird geteilt",
"rageshake_sending_logs": "Sende Debug-Protokolle …", "You": "Du",
"rageshake_sent": "Danke!", "Continue in browser": "Weiter im Browser",
"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>", "Name of call": "Name des Anrufs",
"recaptcha_dismissed": "Recaptcha abgelehnt", "Open in the app": "In der App öffnen",
"recaptcha_not_loaded": "Recaptcha nicht geladen", "Ready to join?": "Bereit, beizutreten?",
"register": { "Unmute microphone": "Mikrofon aktivieren",
"passwords_must_match": "Passwörter müssen übereinstimmen", "Start video": "Video aktivieren",
"registering": "Registrierung …" "Stop video": "Video deaktivieren",
}, "Back to recents": "Zurück zu kürzlichen Anrufen",
"register_auth_links": "<0>Du hast bereits ein Konto?</0><1><0>Anmelden</0> Oder <2>Als Gast betreten</2></1>", "Select app": "App auswählen",
"register_confirm_password_label": "Passwort bestätigen", "Mute microphone": "Mikrofon deaktivieren",
"return_home_button": "Zurück zur Startseite", "Start new call": "Neuen Anruf beginnen",
"room_auth_view_eula_caption": "Mit einem Klick auf „Anruf beitreten“ akzeptierst du unseren <2>Endbenutzer-Lizenzvertrag (EULA)</2>", "Call not found": "Anruf nicht gefunden",
"room_auth_view_join_button": "Anruf beitreten", "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.",
"screenshare_button_label": "Bildschirm teilen", "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",
"select_input_unset_button": "Wähle eine Option", "Copy link": "Link kopieren",
"settings": { "Invite": "Einladen",
"developer_settings_label": "Entwicklereinstellungen", "Invite to this call": "Zu diesem Anruf einladen",
"developer_settings_label_description": "Zeige die Entwicklereinstellungen im Einstellungsfenster.", "Link copied to clipboard": "Link in Zwischenablage kopiert",
"developer_tab_title": "Entwickler", "Participants": "Teilnehmende"
"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 gehts“ 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 …"
} }

View File

@@ -1,101 +1,83 @@
{ {
"a11y": { "Version: {{version}}": "Έκδοση: {{version}}",
"user_menu": "Μενού χρήστη" "User menu": "Μενού χρήστη",
}, "Submit feedback": "Υποβάλετε σχόλια",
"action": { "Sign in": "Σύνδεση",
"close": "Κλείσιμο", "Share screen": "Κοινή χρήση οθόνης",
"copy": "Αντιγραφή", "Sending…": "Αποστολή…",
"go": "Μετάβαση", "Select an option": "Επιλέξτε μια επιλογή",
"no": "Όχι", "Remove": "Αφαίρεση",
"register": "Εγγραφή", "Registering…": "Εγγραφή",
"remove": "Αφαίρεση", "Not registered yet? <2>Create an account</2>": "Δεν έχετε εγγραφεί ακόμα; <2>Δημιουργήστε λογαριασμό</2>",
"sign_in": ύνδεση", "Login to your account": υνδεθείτε στον λογαριασμό σας",
"sign_out": "Αποσύνδεση", "Logging in…": "Σύνδεση",
"submit": "Υποβολή" "Display name": "Εμφανιζόμενο όνομα",
}, "Developer Settings": "Ρυθμίσεις προγραμματιστή",
"analytics_notice": "Συμμετέχοντας σε αυτή τη δοκιμαστική έκδοση, συναινείτε στη συλλογή ανώνυμων δεδομένων, τα οποία χρησιμοποιούμε για τη βελτίωση του προϊόντος. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το ποια δεδομένα καταγράφουμε στην <2>Πολιτική απορρήτου</2> και στην <5>Πολιτική cookies</5>.", "Debug log request": "Αίτημα αρχείου καταγραφής",
"call_ended_view": { "Avatar": "Avatar",
"create_account_button": "Δημιουργία λογαριασμού", "<0>Oops, something's gone wrong.</0>": "<0>Ωχ, κάτι πήγε στραβά.</0>",
"create_account_prompt": "<0>Γιατί να μην ολοκληρώσετε με τη δημιουργία ενός κωδικού πρόσβασης για τη διατήρηση του λογαριασμού σας;</0><1>Θα μπορείτε να διατηρήσετε το όνομά σας και να ορίσετε ένα avatar για χρήση σε μελλοντικές κλήσεις.</1>", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Δημιουργήστε λογαριασμό</0> Ή <2>Συμμετέχετε ως επισκέπτης</2>",
"feedback_done": "<0>Ευχαριστώ για τα σχόλιά σας!</0>", "<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>",
"feedback_prompt": "<0>Θα θέλαμε να ακούσουμε τα σχόλιά σας ώστε να βελτιώσουμε την εμπειρία σας.</0>", "Yes, join call": "Ναι, συμμετοχή στην κλήση",
"headline": "{{displayName}}, η κλήση σας τερματίστηκε.", "Waiting for other participants…": "Αναμονή για άλλους συμμετέχοντες…",
"not_now_button": "Όχι τώρα, επιστροφή στην αρχική οθόνη", "Video": "Βίντεο",
"survey_prompt": "Πώς σας φάνηκε;" "Username": "Όνομα χρήστη",
}, "This call already exists, would you like to join?": "Αυτή η κλήση υπάρχει ήδη, θα θέλατε να συμμετάσχετε;",
"common": { "Speaker": "Ηχείο",
"audio": "Ήχος", "Sign out": "Αποσύνδεση",
"camera": "Κάμερα", "Settings": "Ρυθμίσεις",
"copied": "Αντιγράφηκε!", "Return to home screen": "Επιστροφή στην αρχική οθόνη",
"display_name": "Εμφανιζόμενο όνομα", "Register": "Εγγραφή",
"home": "Αρχική", "Profile": "Προφίλ",
"loading": "Φόρτωση…", "Passwords must match": "Οι κωδικοί πρέπει να ταιριάζουν",
"microphone": "Μικρόφωνο", "Password": "Κωδικός",
"password": "Κωδικός", "Not now, return to home screen": "Όχι τώρα, επιστροφή στην αρχική οθόνη",
"profile": "Προφίλ", "No": "Όχι",
"settings": "Ρυθμίσεις", "More": "Περισσότερα",
"username": "Όνομα χρήστη", "Microphone": "Μικρόφωνο",
"video": "Βίντεο" "Login": "Σύνδεση",
}, "Loading…": "Φόρτωση…",
"exit_fullscreen_button_label": "Έξοδος από πλήρη οθόνη", "Join existing call?": "Συμμετοχή στην υπάρχουσα κλήση;",
"full_screen_view_description": "<0>Η υποβολή αρχείων καταγραφής σφαλμάτων θα μας βοηθήσει να εντοπίσουμε το πρόβλημα.</0>", "Join call now": "Συμμετοχή στην κλήση τώρα",
"full_screen_view_h1": "<0>Ωχ, κάτι πήγε στραβά.</0>", "Join call": "Συμμετοχή στην κλήση",
"fullscreen_button_label": "Πλήρη οθόνη", "Go": "Μετάβαση",
"header_label": "Element Κεντρική Οθόνη Κλήσεων", "Full screen": "Πλήρη οθόνη",
"join_existing_call_modal": { "Exit full screen": "Έξοδος από πλήρη οθόνη",
"join_button": "Ναι, συμμετοχή στην κλήση", "Create account": "Δημιουργία λογαριασμού",
"text": "Αυτή η κλήση υπάρχει ήδη, θα θέλατε να συμμετάσχετε;", "Copy": "Αντιγραφή",
"title": "Συμμετοχή στην υπάρχουσα κλήση;" "Copied!": "Αντιγράφηκε!",
}, "Confirm password": "Επιβεβαίωση κωδικού",
"lobby": { "Close": "Κλείσιμο",
"join_button": "Συμμετοχή στην κλήση" "Camera": "Κάμερα",
}, "Audio": "Ήχος",
"local_volume_label": "Τοπική ένταση", "Send debug logs": "Αποστολή αρχείων καταγραφής",
"logging_in": "Σύνδεση…", "Recaptcha dismissed": "Το recaptcha απορρίφθηκε",
"login_auth_links": "<0>Δημιουργήστε λογαριασμό</0> Ή <2>Συμμετέχετε ως επισκέπτης</2>", "<0>Thanks for your feedback!</0>": "<0>Ευχαριστώ για τα σχόλιά σας!</0>",
"login_title": "Σύνδεση", "Local volume": "Τοπική ένταση",
"rageshake_request_modal": { "Home": "Αρχική",
"body": "Ένας άλλος χρήστης σε αυτή την κλήση έχει ένα πρόβλημα. Για την καλύτερη διάγνωση αυτών των προβλημάτων θα θέλαμε να συλλέξουμε ένα αρχείο καταγραφής σφαλμάτων.", "Show connection stats": "Εμφάνιση στατιστικών σύνδεσης",
"title": "Αίτημα αρχείου καταγραφής" "{{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>Μπορείτε να ανακαλέσετε τη συγκατάθεσή σας αποεπιλέγοντας αυτό το πλαίσιο. Εάν βρίσκεστε σε κλήση, η ρύθμιση αυτή θα τεθεί σε ισχύ στο τέλος της.",
"rageshake_send_logs": "Αποστολή αρχείων καταγραφής", "<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Θα θέλαμε να ακούσουμε τα σχόλιά σας ώστε να βελτιώσουμε την εμπειρία σας.</0>",
"rageshake_sending": "Αποστολή…", "<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>",
"rageshake_sending_logs": "Αποστολή αρχείων καταγραφής…", "Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Ένας άλλος χρήστης σε αυτή την κλήση έχει ένα πρόβλημα. Για την καλύτερη διάγνωση αυτών των προβλημάτων θα θέλαμε να συλλέξουμε ένα αρχείο καταγραφής σφαλμάτων.",
"recaptcha_dismissed": "Το recaptcha απορρίφθηκε", "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>.",
"recaptcha_not_loaded": "Το Recaptcha δεν φορτώθηκε", "If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Εάν αντιμετωπίζετε προβλήματα ή απλά θέλετε να μας δώσετε κάποια σχόλια, παρακαλούμε στείλτε μας μια σύντομη περιγραφή παρακάτω.",
"register": { "Expose developer settings in the settings window.": "Εμφάνιση ρυθμίσεων προγραμματιστή στο παράθυρο ρυθμίσεων.",
"passwords_must_match": "Οι κωδικοί πρέπει να ταιριάζουν", "Feedback": "Ανατροφοδότηση",
"registering": "Εγγραφή…" "Submitting": "Υποβολή…",
}, "Thanks, we received your feedback!": "Ευχαριστούμε, λάβαμε τα σχόλιά σας!",
"register_auth_links": "<0>Έχετε ήδη λογαριασμό;</0><1><0>Συνδεθείτε</0> Ή <2>Συμμετέχετε ως επισκέπτης</2></1>", "{{count}} stars|other": "{{count}} αστέρια",
"register_confirm_password_label": "Επιβεβαίωση κωδικού", "{{count}} stars|one": "{{count}} αστέρι",
"return_home_button": "Επιστροφή στην αρχική οθόνη", "{{displayName}}, your call has ended.": "{{displayName}}, η κλήση σας τερματίστηκε.",
"room_auth_view_join_button": "Συμμετοχή στην κλήση τώρα", "<0>Submitting debug logs will help us track down the problem.</0>": "<0>Η υποβολή αρχείων καταγραφής σφαλμάτων θα μας βοηθήσει να εντοπίσουμε το πρόβλημα.</0>",
"screenshare_button_label": "Κοινή χρήση οθόνης", "How did it go?": "Πώς σας φάνηκε;",
"select_input_unset_button": "Επιλέξτε μια επιλογή", "Include debug logs": "Να συμπεριληφθούν αρχεία καταγραφής",
"settings": { "Recaptcha not loaded": "Το Recaptcha δεν φορτώθηκε",
"developer_settings_label": "Ρυθμίσεις προγραμματιστή", "Developer": ρογραμματιστής",
"developer_settings_label_description": "Εμφάνιση ρυθμίσεων προγραμματιστή στο παράθυρο ρυθμίσεων.", "Sending debug logs…": "Αποστολή αρχείων καταγραφής…",
"developer_tab_title": "Προγραμματιστής", "Submit": "Υποβολή",
"feedback_tab_body": "Εάν αντιμετωπίζετε προβλήματα ή απλά θέλετε να μας δώσετε κάποια σχόλια, παρακαλούμε στείλτε μας μια σύντομη περιγραφή παρακάτω.", "Your feedback": "Τα σχόλιά σας",
"feedback_tab_description_label": "Τα σχόλιά σας", "Spotlight": "Spotlight",
"feedback_tab_h4": "Υποβάλετε σχόλια", "Element Call Home": "Element Κεντρική Οθόνη Κλήσεων"
"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": "Αναμονή για άλλους συμμετέχοντες…"
} }

View File

@@ -1,152 +1,120 @@
{ {
"a11y": { "{{count, number}}|one": "{{count, number}}",
"user_menu": "User menu" "{{count, number}}|other": "{{count, number}}",
}, "{{count}} stars|one": "{{count}} stars",
"action": { "{{count}} stars|other": "{{count}} stars",
"close": "Close", "{{displayName}} is presenting": "{{displayName}} is presenting",
"copy": "Copy", "{{displayName}}, your call has ended.": "{{displayName}}, your call has ended.",
"copy_link": "Copy link", "<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.",
"go": "Go", "<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>",
"invite": "Invite", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Create an account</0> Or <2>Access as a guest</2>",
"no": "No", "<0>Oops, something's gone wrong.</0>": "<0>Oops, something's gone wrong.</0>",
"register": "Register", "<0>Submitting debug logs will help us track down the problem.</0>": "<0>Submitting debug logs will help us track down the problem.</0>",
"remove": "Remove", "<0>Thanks for your feedback!</0>": "<0>Thanks for your feedback!</0>",
"sign_in": "Sign in", "<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>",
"sign_out": "Sign out", "<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>",
"submit": "Submit" "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",
"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>.", "Avatar": "Avatar",
"app_selection_modal": { "Back to recents": "Back to recents",
"continue_in_browser": "Continue in browser", "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>",
"open_in_app": "Open in the app", "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>",
"text": "Ready to join?", "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>.",
"title": "Select app" "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.",
"application_opened_another_tab": "This application has been opened in another tab.", "Camera": "Camera",
"browser_media_e2ee_unsupported": "Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117", "Close": "Close",
"browser_media_e2ee_unsupported_heading": "Incompatible Browser", "Confirm password": "Confirm password",
"call_ended_view": { "Connectivity to the server has been lost.": "Connectivity to the server has been lost.",
"body": "You were disconnected from the call", "Continue in browser": "Continue in browser",
"create_account_button": "Create account", "Copied!": "Copied!",
"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>", "Copy": "Copy",
"feedback_done": "<0>Thanks for your feedback!</0>", "Copy link": "Copy link",
"feedback_prompt": "<0>We'd love to hear your feedback so we can improve your experience.</0>", "Create account": "Create account",
"headline": "{{displayName}}, your call has ended.", "Debug log request": "Debug log request",
"not_now_button": "Not now, return to home screen", "Developer": "Developer",
"reconnect_button": "Reconnect", "Developer Settings": "Developer Settings",
"survey_prompt": "How did it go?" "Display name": "Display name",
}, "Element Call Home": "Element Call Home",
"call_name": "Name of call", "Encrypted": "Encrypted",
"common": { "End call": "End call",
"analytics": "Analytics", "Exit full screen": "Exit full screen",
"audio": "Audio", "Expose developer settings in the settings window.": "Expose developer settings in the settings window.",
"avatar": "Avatar", "Feedback": "Feedback",
"camera": "Camera", "Full screen": "Full screen",
"copied": "Copied!", "Go": "Go",
"display_name": "Display name", "Grid": "Grid",
"encrypted": "Encrypted", "Home": "Home",
"error": "Error", "How did it go?": "How did it go?",
"home": "Home", "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.",
"loading": "Loading…", "Include debug logs": "Include debug logs",
"microphone": "Microphone", "Invite": "Invite",
"password": "Password", "Invite to this call": "Invite to this call",
"profile": "Profile", "Join call": "Join call",
"settings": "Settings", "Join call now": "Join call now",
"unencrypted": "Not encrypted", "Join existing call?": "Join existing call?",
"username": "Username", "Link copied to clipboard": "Link copied to clipboard",
"video": "Video" "Loading…": "Loading…",
}, "Local volume": "Local volume",
"disconnected_banner": "Connectivity to the server has been lost.", "Logging in…": "Logging in…",
"exit_fullscreen_button_label": "Exit full screen", "Login": "Login",
"full_screen_view_description": "<0>Submitting debug logs will help us track down the problem.</0>", "Login to your account": "Login to your account",
"full_screen_view_h1": "<0>Oops, something's gone wrong.</0>", "Microphone": "Microphone",
"fullscreen_button_label": "Full screen", "Microphone off": "Microphone off",
"group_call_loader_failed_heading": "Call not found", "Microphone on": "Microphone on",
"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.", "More": "More",
"hangup_button_label": "End call", "Mute microphone": "Mute microphone",
"header_label": "Element Call Home", "Name of call": "Name of call",
"header_participants_label": "Participants", "No": "No",
"invite_modal": { "Not encrypted": "Not encrypted",
"link_copied_toast": "Link copied to clipboard", "Not now, return to home screen": "Not now, return to home screen",
"title": "Invite to this call" "Not registered yet? <2>Create an account</2>": "Not registered yet? <2>Create an account</2>",
}, "Open in the app": "Open in the app",
"join_existing_call_modal": { "Participants": "Participants",
"join_button": "Yes, join call", "Password": "Password",
"text": "This call already exists, would you like to join?", "Passwords must match": "Passwords must match",
"title": "Join existing call?" "Profile": "Profile",
}, "Ready to join?": "Ready to join?",
"layout_grid_label": "Grid", "Recaptcha dismissed": "Recaptcha dismissed",
"layout_spotlight_label": "Spotlight", "Recaptcha not loaded": "Recaptcha not loaded",
"lobby": { "Reconnect": "Reconnect",
"join_button": "Join call", "Register": "Register",
"leave_button": "Back to recents" "Registering…": "Registering…",
}, "Remove": "Remove",
"local_volume_label": "Local volume", "Retry sending logs": "Retry sending logs",
"log_in": "Log In", "Return to home screen": "Return to home screen",
"logging_in": "Logging in…", "Select an option": "Select an option",
"login_auth_links": "<0>Create an account</0> Or <2>Access as a guest</2>", "Select app": "Select app",
"login_auth_links_prompt": "Not registered yet?", "Send debug logs": "Send debug logs",
"login_subheading": "To continue to Element", "Sending debug logs…": "Sending debug logs…",
"login_title": "Login", "Sending…": "Sending…",
"microphone_off": "Microphone off", "Settings": "Settings",
"microphone_on": "Microphone on", "Share screen": "Share screen",
"mute_microphone_button_label": "Mute microphone", "Sharing screen": "Sharing screen",
"participant_count_one": "{{count, number}}", "Show connection stats": "Show connection stats",
"participant_count_other": "{{count, number}}", "Sign in": "Sign in",
"rageshake_button_error_caption": "Retry sending logs", "Sign out": "Sign out",
"rageshake_request_modal": { "Speaker": "Speaker",
"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.", "Spotlight": "Spotlight",
"title": "Debug log request" "Start new call": "Start new call",
}, "Start video": "Start video",
"rageshake_send_logs": "Send debug logs", "Stop video": "Stop video",
"rageshake_sending": "Sending…", "Submit": "Submit",
"rageshake_sending_logs": "Sending debug logs…", "Submit feedback": "Submit feedback",
"rageshake_sent": "Thanks!", "Submitting…": "Submitting…",
"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>", "Thanks, we received your feedback!": "Thanks, we received your feedback!",
"recaptcha_dismissed": "Recaptcha dismissed", "Thanks!": "Thanks!",
"recaptcha_not_loaded": "Recaptcha not loaded", "This call already exists, would you like to join?": "This call already exists, would you like to join?",
"register": { "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>",
"passwords_must_match": "Passwords must match", "Unmute microphone": "Unmute microphone",
"registering": "Registering…" "User menu": "User menu",
}, "Username": "Username",
"register_auth_links": "<0>Already have an account?</0><1><0>Log in</0> Or <2>Access as a guest</2></1>", "Version: {{version}}": "Version: {{version}}",
"register_confirm_password_label": "Confirm password", "Video": "Video",
"register_heading": "Create your account", "Waiting for other participants…": "Waiting for other participants…",
"return_home_button": "Return to home screen", "Yes, join call": "Yes, join call",
"room_auth_view_eula_caption": "By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>", "You": "You",
"room_auth_view_join_button": "Join call now", "You were disconnected from the call": "You were disconnected from the call",
"screenshare_button_label": "Share screen", "Your feedback": "Your feedback",
"select_input_unset_button": "Select an option", "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"
"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": {
"presenter_label": "{{displayName}} is presenting",
"sfu_participant_local": "You"
},
"waiting_for_participants": "Waiting for other participants…"
} }

View File

@@ -1,102 +1,86 @@
{ {
"a11y": { "<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>",
"user_menu": "Menú de usuario" "This call already exists, would you like to join?": "Esta llamada ya existe, ¿te gustaría unirte?",
}, "Register": "Registrarse",
"action": { "Not registered yet? <2>Create an account</2>": "¿No estás registrado todavía? <2>Crear una cuenta</2>",
"close": "Cerrar", "Login to your account": "Iniciar sesión en tu cuenta",
"copy": "Copiar", "Yes, join call": "Si, unirse a la llamada",
"go": "Comenzar", "Waiting for other participants…": "Esperando a los otros participantes…",
"register": "Registrarse", "Video": "Video",
"remove": "Eliminar", "Version: {{version}}": "Versión: {{version}}",
"sign_in": "Iniciar sesión", "Username": "Nombre de usuario",
"sign_out": "Cerrar sesión", "User menu": "Menú de usuario",
"submit": "Enviar" "Submit feedback": "Enviar comentarios",
}, "Spotlight": "Foco",
"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>.", "Speaker": "Altavoz",
"call_ended_view": { "Sign out": "Cerrar sesión",
"create_account_button": "Crear cuenta", "Sign in": "Iniciar sesión",
"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>", "Share screen": "Compartir pantalla",
"feedback_done": "<0>¡Gracias por tus comentarios!</0>", "Settings": "Ajustes",
"feedback_prompt": "<0>Nos encantaría conocer tu opinión para que podamos mejorar tu experiencia</0>", "Sending…": "Enviando…",
"headline": "{{displayName}}, tu llamada ha finalizado.", "Sending debug logs…": "Enviando registros de depuración…",
"not_now_button": "Ahora no, volver a la pantalla de inicio", "Send debug logs": "Enviar registros de depuración",
"survey_prompt": "¿Cómo ha ido?" "Select an option": "Selecciona una opción",
}, "Return to home screen": "Volver a la pantalla de inicio",
"common": { "Remove": "Eliminar",
"camera": "Cámara", "Registering…": "Registrando…",
"copied": "¡Copiado!", "Recaptcha not loaded": "No se ha cargado el Recaptcha",
"display_name": "Nombre a mostrar", "Recaptcha dismissed": "Recaptcha cancelado",
"home": "Inicio", "Profile": "Perfil",
"loading": "Cargando…", "Passwords must match": "Las contraseñas deben coincidir",
"microphone": "Micrófono", "Password": "Contraseña",
"password": "Contraseña", "Not now, return to home screen": "Ahora no, volver a la pantalla de inicio",
"profile": "Perfil", "No": "No",
"settings": "Ajustes", "More": "s",
"username": "Nombre de usuario" "Microphone": "Micrófono",
}, "Login": "Iniciar sesión",
"exit_fullscreen_button_label": "Salir de pantalla completa", "Logging in…": "Iniciando sesión…",
"full_screen_view_description": "<0>Subir los registros de depuración nos ayudará a encontrar el problema.</0>", "Local volume": "Volumen local",
"full_screen_view_h1": "<0>Ups, algo ha salido mal.</0>", "Loading…": "Cargando…",
"fullscreen_button_label": "Pantalla completa", "Join existing call?": "¿Unirse a llamada existente?",
"header_label": "Inicio de Element Call", "Join call now": "Unirse a la llamada ahora",
"join_existing_call_modal": { "Join call": "Unirse a la llamada",
"join_button": "Si, unirse a la llamada", "Include debug logs": "Incluir registros de depuración",
"text": "Esta llamada ya existe, ¿te gustaría unirte?", "Home": "Inicio",
"title": "¿Unirse a llamada existente?" "Go": "Comenzar",
}, "Full screen": "Pantalla completa",
"layout_spotlight_label": "Foco", "Exit full screen": "Salir de pantalla completa",
"lobby": { "Display name": "Nombre a mostrar",
"join_button": "Unirse a la llamada" "Developer": "Desarrollador",
}, "Debug log request": "Petición de registros de depuración",
"local_volume_label": "Volumen local", "Create account": "Crear cuenta",
"logging_in": "Iniciando sesión…", "Copied!": "¡Copiado!",
"login_auth_links": "<0>Crear una cuenta</0> o <2>Acceder como invitado</2>", "Confirm password": "Confirmar contraseña",
"login_title": "Iniciar sesión", "Close": "Cerrar",
"rageshake_request_modal": { "Camera": "Cámara",
"body": "Otro usuario en esta llamada está teniendo problemas. Para diagnosticar estos problemas nos gustaría recopilar un registro de depuración.", "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.",
"title": "Petición de registros de depuración" "Audio": "Audio",
}, "Avatar": "Avatar",
"rageshake_send_logs": "Enviar registros de depuración", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Crear una cuenta</0> o <2>Acceder como invitado</2>",
"rageshake_sending": "Enviando…", "<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>",
"rageshake_sending_logs": "Enviando registros de depuración…", "Element Call Home": "Inicio de Element Call",
"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>", "Copy": "Copiar",
"recaptcha_dismissed": "Recaptcha cancelado", "<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>",
"recaptcha_not_loaded": "No se ha cargado el Recaptcha", "<0>Oops, something's gone wrong.</0>": "<0>Ups, algo ha salido mal.</0>",
"register": { "Expose developer settings in the settings window.": "Muestra los ajustes de desarrollador en la ventana de ajustes.",
"passwords_must_match": "Las contraseñas deben coincidir", "Developer Settings": "Ajustes de desarrollador",
"registering": "Registrando…" "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.",
"register_auth_links": "<0>¿Ya tienes una cuenta?</0><1><0>Iniciar sesión</0> o <2>Acceder como invitado</2></1>", "{{displayName}} is presenting": "{{displayName}} está presentando",
"register_confirm_password_label": "Confirmar contraseña", "<0>Thanks for your feedback!</0>": "<0>¡Gracias por tus comentarios!</0>",
"return_home_button": "Volver a la pantalla de inicio", "How did it go?": "¿Cómo ha ido?",
"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>", "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>",
"room_auth_view_join_button": "Unirse a la llamada ahora", "Show connection stats": "Mostrar estadísticas de conexión",
"screenshare_button_label": "Compartir pantalla", "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>",
"select_input_unset_button": "Selecciona una opción", "Thanks, we received your feedback!": "¡Gracias, hemos recibido tus comentarios!",
"settings": { "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.",
"developer_settings_label": "Ajustes de desarrollador", "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>",
"developer_settings_label_description": "Muestra los ajustes de desarrollador en la ventana de ajustes.", "<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>",
"developer_tab_title": "Desarrollador", "Feedback": "Danos tu opinión",
"feedback_tab_body": "Si tienes algún problema o simplemente quieres darnos tu opinión, por favor envíanos una breve descripción.", "Submit": "Enviar",
"feedback_tab_description_label": "Tus comentarios", "{{count}} stars|one": "{{count}} estrella",
"feedback_tab_h4": "Enviar comentarios", "{{count}} stars|other": "{{count}} estrellas",
"feedback_tab_send_logs_label": "Incluir registros de depuración", "{{displayName}}, your call has ended.": "{{displayName}}, tu llamada ha finalizado.",
"feedback_tab_thank_you": "¡Gracias, hemos recibido tus comentarios!", "Submitting…": "Enviando…",
"feedback_tab_title": "Danos tu opinión", "Your feedback": "Tus comentarios"
"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…"
} }

View File

@@ -1,140 +1,120 @@
{ {
"a11y": { "<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>",
"user_menu": "Kasutajamenüü" "<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>",
"action": { "Include debug logs": "Lisa veatuvastuslogid",
"close": "Sulge", "Home": "Avavaatesse",
"copy": "Kopeeri", "Go": "Jätka",
"copy_link": "Kopeeri link", "Full screen": "Täisekraan",
"go": "Jätka", "Exit full screen": "Välju täisekraanivaatest",
"invite": "Kutsu", "Display name": "Kuvatav nimi",
"no": "Ei", "Developer": "Arendaja",
"register": "Registreeru", "Debug log request": "Veaotsingulogi päring",
"remove": "Eemalda", "Create account": "Loo konto",
"sign_in": "Logi sisse", "Copied!": "Kopeeritud!",
"sign_out": "Logi välja", "Confirm password": "Kinnita salasõna",
"submit": "Saada" "Close": "Sulge",
}, "Camera": "Kaamera",
"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>.", "Avatar": "Tunnuspilt",
"app_selection_modal": { "Audio": "Heli",
"continue_in_browser": "Jätka veebibrauseris", "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.",
"open_in_app": "Ava rakenduses", "Passwords must match": "Salasõnad ei klapi",
"text": "Oled valmis liituma?", "Password": "Salasõna",
"title": "Vali rakendus" "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",
"browser_media_e2ee_unsupported": "Sinu veebibrauser ei toeta meedia läbivat krüptimist. Toetatud brauserid on Chrome, Chromium, Safari ja Firefox >=117", "No": "Ei",
"call_ended_view": { "More": "Rohkem",
"body": "Sinu ühendus kõnega katkes", "Microphone": "Mikrofon",
"create_account_button": "Loo konto", "Login to your account": "Logi oma kontosse sisse",
"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>", "Login": "Sisselogimine",
"feedback_done": "<0>Täname Sind tagasiside eest!</0>", "Logging in…": "Sisselogimine …",
"feedback_prompt": "<0>Meie rakenduse paremaks muutmiseks me hea meelega ootame Sinu arvamusi.</0>", "Local volume": "Kohalik helitugevus",
"headline": "{{displayName}}, sinu kõne on lõppenud.", "Loading…": "Laadimine …",
"not_now_button": "Mitte praegu, mine tagasi avalehele", "Join existing call?": "Liitu juba käimasoleva kõnega?",
"reconnect_button": "Ühenda uuesti", "Join call now": "Liitu kõnega kohe",
"survey_prompt": "Kuidas sujus?" "Join call": "Kõnega liitumine",
}, "Submit feedback": "Jaga tagasisidet",
"call_name": "Kõne nimi", "Spotlight": "Rambivalgus",
"common": { "Speaker": "Kõlar",
"audio": "Heli", "Sign out": "Logi välja",
"avatar": "Tunnuspilt", "Sign in": "Logi sisse",
"camera": "Kaamera", "Share screen": "Jaga ekraani",
"copied": "Kopeeritud!", "Settings": "Seadistused",
"display_name": "Kuvatav nimi", "Sending…": "Saatmine…",
"encrypted": "Krüptitud", "Sending debug logs…": "Veaotsingulogide saatmine…",
"home": "Avavaatesse", "Send debug logs": "Saada veaotsingulogid",
"loading": "Laadimine …", "Select an option": "Vali oma eelistus",
"microphone": "Mikrofon", "Return to home screen": "Tagasi avalehele",
"password": "Salasõna", "Remove": "Eemalda",
"profile": "Profiil", "Registering…": "Registreerimine…",
"settings": "Seadistused", "Register": "Registreeru",
"unencrypted": "Krüptimata", "Recaptcha not loaded": "Robotilõks pole laetud",
"username": "Kasutajanimi" "Recaptcha dismissed": "Robotilõks on vahele jäetud",
}, "Profile": "Profiil",
"disconnected_banner": "Võrguühendus serveriga on katkenud.", "Waiting for other participants…": "Ootame teiste osalejate lisandumist…",
"exit_fullscreen_button_label": "Välju täisekraanivaatest", "Video": "Video",
"full_screen_view_description": "<0>Kui saadad meile vealogid, siis on lihtsam vea põhjust otsida.</0>", "Version: {{version}}": "Versioon: {{version}}",
"full_screen_view_h1": "<0>Ohoo, midagi on nüüd katki.</0>", "Username": "Kasutajanimi",
"fullscreen_button_label": "Täisekraan", "This call already exists, would you like to join?": "See kõne on juba olemas, kas soovid liituda?",
"group_call_loader_failed_heading": "Kõnet ei leidu", "User menu": "Kasutajamenüü",
"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.", "Yes, join call": "Jah, liitu kõnega",
"hangup_button_label": "Lõpeta kõne", "Element Call Home": "Element Call Home",
"header_participants_label": "Osalejad", "Copy": "Kopeeri",
"invite_modal": { "<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>",
"link_copied_toast": "Link on kopeeritud lõikelauale", "<0>Oops, something's gone wrong.</0>": "<0>Ohoo, midagi on nüüd katki.</0>",
"title": "Kutsu liituma selle kõnaga" "Expose developer settings in the settings window.": "Näita seadistuste aknas arendajale vajalikke seadeid.",
}, "Developer Settings": "Arendaja seadistused",
"join_existing_call_modal": { "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>.",
"join_button": "Jah, liitu kõnega", "<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.",
"text": "See kõne on juba olemas, kas soovid liituda?", "Your feedback": "Sinu tagasiside",
"title": "Liitu juba käimasoleva kõnega?" "Thanks, we received your feedback!": "Tänud, me oleme sinu tagasiside kätte saanud!",
}, "Submitting…": "Saadan…",
"layout_grid_label": "Ruudustik", "Submit": "Saada",
"layout_spotlight_label": "Rambivalgus", "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.",
"lobby": { "Feedback": "Tagasiside",
"join_button": "Kõnega liitumine", "{{count}} stars|one": "{{count}} tärni",
"leave_button": "Tagasi hiljutiste kõnede juurde" "{{count}} stars|other": "{{count}} tärni",
}, "How did it go?": "Kuidas sujus?",
"local_volume_label": "Kohalik helitugevus", "{{displayName}}, your call has ended.": "{{displayName}}, sinu kõne on lõppenud.",
"logging_in": "Sisselogimine …", "<0>Thanks for your feedback!</0>": "<0>Täname Sind tagasiside eest!</0>",
"login_auth_links": "<0>Loo konto</0> Või <2>Sisene külalisena</2>", "<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>",
"login_title": "Sisselogimine", "Show connection stats": "Näita ühenduse statistikat",
"microphone_off": "Mikrofon ei tööta", "{{displayName}} is presenting": "{{displayName}} on esitlemas",
"microphone_on": "Mikrofon töötab", "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>",
"mute_microphone_button_label": "Summuta mikrofon", "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>",
"rageshake_button_error_caption": "Proovi uuesti logisid saata", "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>",
"rageshake_request_modal": { "Connectivity to the server has been lost.": "Võrguühendus serveriga on katkenud.",
"body": "Ühel teisel selles kõnes osalejal on lahenduse kasutamisel tekkinud probleem ning selle põhjuse leidmiseks me sooviksime koguda silumislogisid.", "Retry sending logs": "Proovi uuesti logisid saata",
"title": "Veaotsingulogi päring" "You were disconnected from the call": "Sinu ühendus kõnega katkes",
}, "Reconnect": "Ühenda uuesti",
"rageshake_send_logs": "Saada veaotsingulogid", "Thanks!": "Tänud!",
"rageshake_sending": "Saatmine…", "Encrypted": "Krüptitud",
"rageshake_sending_logs": "Veaotsingulogide saatmine", "End call": "Lõpeta kõne",
"rageshake_sent": "Tänud!", "Grid": "Ruudustik",
"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>", "Microphone off": "Mikrofon ei tööta",
"recaptcha_dismissed": "Robotilõks on vahele jäetud", "Microphone on": "Mikrofon töötab",
"recaptcha_not_loaded": "Robotilõks pole laetud", "Not encrypted": "Krüptimata",
"register": { "Sharing screen": "Ekraanivaade on jagamisel",
"passwords_must_match": "Salasõnad ei klapi", "{{count, number}}|one": "{{count, number}}",
"registering": "Registreerimine…" "{{count, number}}|other": "{{count, number}}",
}, "You": "Sina",
"register_auth_links": "<0>On sul juba konto?</0><1><0>Logi sisse</0> Või <2>Logi sisse külalisena</2></1>", "Continue in browser": "Jätka veebibrauseris",
"register_confirm_password_label": "Kinnita salasõna", "Mute microphone": "Summuta mikrofon",
"return_home_button": "Tagasi avalehele", "Name of call": "Kõne nimi",
"room_auth_view_eula_caption": "Klõpsides „Liitu kõnega kohe“, nõustud sa meie <2>Lõppkasutaja litsentsilepinguga (EULA)</2>", "Open in the app": "Ava rakenduses",
"room_auth_view_join_button": "Liitu kõnega kohe", "Ready to join?": "Oled valmis liituma?",
"screenshare_button_label": "Jaga ekraani", "Select app": "Vali rakendus",
"select_input_unset_button": "Vali oma eelistus", "Start new call": "Algata uus kõne",
"settings": { "Back to recents": "Tagasi hiljutiste kõnede juurde",
"developer_settings_label": "Arendaja seadistused", "Stop video": "Peata videovoog",
"developer_settings_label_description": "ita seadistuste aknas arendajale vajalikke seadeid.", "Start video": "Lülita videovoog sisse",
"developer_tab_title": "Arendaja", "Unmute microphone": "Lülita mikrofon sisse",
"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.", "Call not found": "Kõnet ei leidu",
"feedback_tab_description_label": "Sinu tagasiside", "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.",
"feedback_tab_h4": "Jaga tagasisidet", "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",
"feedback_tab_send_logs_label": "Lisa veatuvastuslogid", "Invite": "Kutsu",
"feedback_tab_thank_you": "Tänud, me oleme sinu tagasiside kätte saanud!", "Link copied to clipboard": "Link on kopeeritud lõikelauale",
"feedback_tab_title": "Tagasiside", "Participants": "Osalejad",
"more_tab_title": "Rohkem", "Copy link": "Kopeeri link",
"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.", "Invite to this call": "Kutsu liituma selle kõnaga"
"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…"
} }

View File

@@ -1,81 +1,63 @@
{ {
"a11y": { "Video": "ویدیو",
"user_menu": "فهرست کاربر" "Username": "نام کاربری",
}, "Speaker": "بلندگو",
"action": { "Sign out": "خروج",
"close": "بستن", "Sign in": "ورود",
"copy": "رونوشت", "Settings": "تنظیمات",
"go": "رفتن", "Profile": "پروفایل",
"no": "خیر", "Password": "رمز عبور",
"register": "ثبت‌نام", "No": "خیر",
"remove": "حذف", "More": "بیشتر",
"sign_in": "ورود", "Microphone": "میکروفون",
"sign_out": "خروج" "Login to your account": "به حساب کاربری خود وارد شوید",
}, "Login": "ورود",
"call_ended_view": { "Loading…": "بارگزاری…",
"create_account_button": "ساخت حساب کاربری", "Join existing call?": "پیوست به تماس؟",
"create_account_prompt": "<0>چرا یک رمز عبور برای حساب کاربری خود تنظیم نمی‌کنید؟</0><1>شما می‌توانید نام خود را حفظ کنید و یک آواتار برای تماس‌های آینده بسازید</1>", "Join call now": "الان به تماس بپیوند",
"not_now_button": "الان نه، به صفحه اصلی برگردید" "Join call": "پیوستن به تماس",
}, "Home": "خانه",
"common": { "Go": "رفتن",
"audio": "صدا", "Full screen": "تمام صحفه",
"avatar": "آواتار", "Exit full screen": "خروج از حالت تمام صفحه",
"camera": "دوربین", "Display name": "نام نمایشی",
"copied": "کپی شد!", "Developer": "توسعه دهنده",
"display_name": "نام نمایشی", "Debug log request": "درخواست لاگ عیب‌یابی",
"home": "خانه", "Create account": "ساخت حساب کاربری",
"loading": "بارگزاری…", "Copied!": "کپی شد!",
"microphone": "میکروفون", "Confirm password": "تایید رمزعبور",
"password": "رمز عبور", "Close": "بستن",
"profile": "پروفایل", "Camera": "دوربین",
"settings": "تنظیمات", "Avatar": "آواتار",
"username": "نام کاربری", "Audio": "صدا",
"video": "ویدیو" "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>",
"exit_fullscreen_button_label": "خروج از حالت تمام صفحه", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>ساخت حساب کاربری</0> Or <2>دسترسی به عنوان میهمان</2>",
"fullscreen_button_label": "تمام صحفه", "<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>",
"header_label": "خانهٔ تماس المنت", "Local volume": "حجم داخلی",
"join_existing_call_modal": { "Spotlight": "نور افکن",
"join_button": "بله، به تماس بپیوندید", "Share screen": "اشتراک گذاری صفحه نمایش",
"text": "این تماس از قبل وجود دارد، می‌خواهید بپیوندید؟", "Sending…": "در حال ارسال…",
"title": "پیوست به تماس؟" "Sending debug logs…": "در حال ارسال باگ‌های عیب‌یابی…",
}, "Send debug logs": "ارسال لاگ‌های عیب‌یابی",
"layout_spotlight_label": "نور افکن", "Select an option": "یک گزینه را انتخاب کنید",
"lobby": { "Return to home screen": "برگشت به صفحه اصلی",
"join_button": "پیوستن به تماس" "Remove": "حذف",
}, "Registering…": "ثبت‌نام…",
"local_volume_label": "حجم داخلی", "Register": "ثبت‌نام",
"logging_in": "ورود…", "Recaptcha not loaded": "کپچا بارگیری نشد",
"login_auth_links": "<0>ساخت حساب کاربری</0> Or <2>دسترسی به عنوان میهمان</2>", "Recaptcha dismissed": "ریکپچا رد شد",
"login_title": "ورود", "Passwords must match": "رمز عبور باید همخوانی داشته باشد",
"rageshake_request_modal": { "Not registered yet? <2>Create an account</2>": "هنوز ثبت‌نام نکرده‌اید؟ <2>ساخت حساب کاربری</2>",
"body": "کاربر دیگری در این تماس مشکلی دارد. برای تشخیص بهتر مشکل، بهتر است ما لاگ عیب‌یابی را جمع‌آوری کنیم.", "Not now, return to home screen": "الان نه، به صفحه اصلی برگردید",
"title": "درخواست لاگ عیب‌یابی" "Logging in…": "ورود…",
}, "Include debug logs": "شامل لاگ‌های عیب‌یابی",
"rageshake_send_logs": "ارسال لاگ‌های عیب‌یابی", "Yes, join call": "بله، به تماس بپیوندید",
"rageshake_sending": "در حال ارسال…", "Waiting for other participants…": "در انتظار برای دیگر شرکت‌کنندگان…",
"rageshake_sending_logs": "در حال ارسال باگ‌های عیب‌یابی…", "Version: {{version}}": "نسخه: {{نسخه}}",
"recaptcha_dismissed": "ریکپچا رد شد", "User menu": "فهرست کاربر",
"recaptcha_not_loaded": "کپچا بارگیری نشد", "This call already exists, would you like to join?": "این تماس از قبل وجود دارد، می‌خواهید بپیوندید؟",
"register": { "Submit feedback": "بازخورد ارائه دهید",
"passwords_must_match": "رمز عبور باید همخوانی داشته باشد", "Element Call Home": "خانهٔ تماس المنت",
"registering": "ثبت‌نام…" "Copy": "رونوشت"
},
"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": "در انتظار برای دیگر شرکت‌کنندگان…"
} }

View File

@@ -1,138 +1,120 @@
{ {
"a11y": { "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Créer un compte</0> Or <2>Accès invité</2>",
"user_menu": "Menu utilisateur" "<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.",
"action": { "Audio": "Audio",
"close": "Fermer", "Avatar": "Avatar",
"copy": "Copier", "Camera": "Caméra",
"copy_link": "Copier le lien", "Close": "Fermer",
"go": "Commencer", "Confirm password": "Confirmer le mot de passe",
"invite": "Inviter", "Copied!": "Copié !",
"no": "Non", "Create account": "Créer un compte",
"register": "Senregistrer", "Debug log request": "Demande dun journal de débogage",
"remove": "Supprimer", "Developer": "Développeur",
"sign_in": "Connexion", "Display name": "Nom daffichage",
"sign_out": "Déconnexion", "Exit full screen": "Quitter le plein écran",
"submit": "Envoyer" "Full screen": "Plein écran",
}, "Go": "Commencer",
"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 dinformations sur les données collectées dans notre <2>Politique de vie privée</2> et notre <5>Politique de cookies</5>.", "Home": "Accueil",
"app_selection_modal": { "Include debug logs": "Inclure les journaux de débogage",
"continue_in_browser": "Continuer dans le navigateur", "Join call": "Rejoindre lappel",
"open_in_app": "Ouvrir dans lapplication", "Join call now": "Rejoindre lappel maintenant",
"text": "Prêt à rejoindre ?", "Join existing call?": "Rejoindre un appel existant ?",
"title": "Choisissez lapplication" "Loading…": "Chargement…",
}, "Local volume": "Volume local",
"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", "Logging in…": "Connexion…",
"call_ended_view": { "Login": "Connexion",
"body": "Vous avez été déconnecté de lappel", "Login to your account": "Connectez vous à votre compte",
"create_account_button": "Créer un compte", "Microphone": "Microphone",
"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>", "More": "Plus",
"feedback_done": "<0>Merci pour votre commentaire !</0>", "No": "Non",
"feedback_prompt": "<0>Nous aimerions avoir vos commentaires afin que nous puissions améliorer votre expérience.</0>", "Not now, return to home screen": "Pas maintenant, retourner à laccueil",
"headline": "{{displayName}}, votre appel est terminé.", "Not registered yet? <2>Create an account</2>": "Pas encore de compte ? <2>En créer un</2>",
"not_now_button": "Pas maintenant, retourner à laccueil", "Password": "Mot de passe",
"reconnect_button": "Se reconnecter", "Passwords must match": "Les mots de passe doivent correspondre",
"survey_prompt": "Comment cela sest-il passé ?" "Profile": "Profil",
}, "Recaptcha dismissed": "Recaptcha refusé",
"call_name": "Nom de lappel", "Recaptcha not loaded": "Recaptcha non chargé",
"common": { "Register": "Senregistrer",
"camera": "Caméra", "Registering…": "Enregistrement…",
"copied": "Copié !", "Remove": "Supprimer",
"display_name": "Nom daffichage", "Return to home screen": "Retour à laccueil",
"encrypted": "Chiffré", "Select an option": "Sélectionnez une option",
"home": "Accueil", "Send debug logs": "Envoyer les journaux de débogage",
"loading": "Chargement…", "Sending": "Envoi…",
"password": "Mot de passe", "Settings": "Paramètres",
"profile": "Profil", "Share screen": "Partage décran",
"settings": "Paramètres", "Sign in": "Connexion",
"unencrypted": "Non chiffré", "Sign out": "Déconnexion",
"username": "Nom dutilisateur", "Spotlight": "Premier plan",
"video": "Vidéo" "Submit feedback": "Envoyer un commentaire",
}, "This call already exists, would you like to join?": "Cet appel existe déjà, voulez-vous le rejoindre ?",
"disconnected_banner": "La connexion avec le serveur a été perdue.", "Yes, join call": "Oui, rejoindre lappel",
"exit_fullscreen_button_label": "Quitter le plein écran", "Waiting for other participants…": "En attente dautres participants…",
"full_screen_view_description": "<0>Soumettre les journaux de débogage nous aidera à déterminer le problème.</0>", "Video": "Vidéo",
"full_screen_view_h1": "<0>Oups, quelque chose sest mal passé.</0>", "Version: {{version}}": "Version : {{version}}",
"fullscreen_button_label": "Plein écran", "Username": "Nom dutilisateur",
"group_call_loader_failed_heading": "Appel non trouvé", "User menu": "Menu utilisateur",
"group_call_loader_failed_text": "Les appels sont maintenant chiffrés de bout-en-bout et doivent être créés depuis la page daccueil. Cela permet dêtre sûr que tout le monde utilise la même clé de chiffrement.", "Speaker": "Intervenant",
"hangup_button_label": "Terminer lappel", "<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>",
"header_label": "Accueil Element Call", "Sending debug logs…": "Envoi des journaux de débogage…",
"invite_modal": { "Element Call Home": "Accueil Element Call",
"link_copied_toast": "Lien copié dans le presse-papier", "Copy": "Copier",
"title": "Inviter dans cet appel" "<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 sest mal passé.</0>",
"join_existing_call_modal": { "Expose developer settings in the settings window.": "Affiche les paramètres développeurs dans la fenêtre des paramètres.",
"join_button": "Oui, rejoindre lappel", "Developer Settings": "Paramètres développeurs",
"text": "Cet appel existe déjà, voulez-vous le rejoindre ?", "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 dinformations sur les données collectées dans notre <2>Politique de vie privée</2> et notre <5>Politique de cookies</5>.",
"title": "Rejoindre un appel existant ?" "<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 lappel.",
}, "Your feedback": "Votre commentaire",
"layout_grid_label": "Grille", "Thanks, we received your feedback!": "Merci, nous avons reçu vos commentaires !",
"layout_spotlight_label": "Premier plan", "Submitting…": "Envoi…",
"lobby": { "Submit": "Envoyer",
"join_button": "Rejoindre lappel", "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.",
"leave_button": "Revenir à lhistorique des appels" "Feedback": "Commentaires",
}, "{{count}} stars|other": "{{count}} favoris",
"local_volume_label": "Volume local", "<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>",
"logging_in": "Connexion…", "{{count}} stars|one": "{{count}} favori",
"login_auth_links": "<0>Créer un compte</0> Or <2>Accès invité</2>", "{{displayName}}, your call has ended.": "{{displayName}}, votre appel est terminé.",
"login_title": "Connexion", "<0>Thanks for your feedback!</0>": "<0>Merci pour votre commentaire !</0>",
"microphone_off": "Microphone éteint", "How did it go?": "Comment cela sest-il passé ?",
"microphone_on": "Microphone allumé", "{{displayName}} is presenting": "{{displayName}} est à lécran",
"mute_microphone_button_label": "Couper le microphone", "Show connection stats": "Afficher les statistiques de la connexion",
"rageshake_button_error_caption": "Réessayer denvoyer les journaux", "By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "En cliquant sur « Rejoindre lappel maintenant », vous acceptez notre <2>Contrat de Licence Utilisateur Final (CLUF)</2>",
"rageshake_request_modal": { "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>",
"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.", "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 dutilisation</6> de Google sappliquent.<9></9>En cliquant sur « Senregistrer » vous acceptez également notre <12>Contrat de Licence Utilisateur Final (CLUF)</12>",
"title": "Demande dun journal de débogage" "Reconnect": "Se reconnecter",
}, "Retry sending logs": "Réessayer denvoyer les journaux",
"rageshake_send_logs": "Envoyer les journaux de débogage", "Thanks!": "Merci !",
"rageshake_sending": "Envoi…", "You were disconnected from the call": "Vous avez été déconnecté de lappel",
"rageshake_sending_logs": "Envoi des journaux de débogage…", "Connectivity to the server has been lost.": "La connexion avec le serveur a été perdue.",
"rageshake_sent": "Merci !", "{{count, number}}|other": "{{count, number}}",
"recaptcha_caption": "Ce site est protégé par ReCAPTCHA, la <2>politique de confidentialité</2> et les <6>conditions dutilisation</6> de Google sappliquent.<9></9>En cliquant sur « Senregistrer » vous acceptez également notre <12>Contrat de Licence Utilisateur Final (CLUF)</12>", "Encrypted": "Chiffré",
"recaptcha_dismissed": "Recaptcha refusé", "End call": "Terminer lappel",
"recaptcha_not_loaded": "Recaptcha non chargé", "Grid": "Grille",
"register": { "Microphone off": "Microphone éteint",
"passwords_must_match": "Les mots de passe doivent correspondre", "Microphone on": "Microphone allumé",
"registering": "Enregistrement…" "Sharing screen": "Lécran est partagé",
}, "{{count, number}}|one": "{{count, number}}",
"register_auth_links": "<0>Vous avez déjà un compte ?</0><1><0>Se connecter</0> Ou <2>Accès invité</2></1>", "Not encrypted": "Non chiffré",
"register_confirm_password_label": "Confirmer le mot de passe", "You": "Vous",
"return_home_button": "Retour à laccueil", "Continue in browser": "Continuer dans le navigateur",
"room_auth_view_eula_caption": "En cliquant sur « Rejoindre lappel maintenant », vous acceptez notre <2>Contrat de Licence Utilisateur Final (CLUF)</2>", "Mute microphone": "Couper le microphone",
"room_auth_view_join_button": "Rejoindre lappel maintenant", "Name of call": "Nom de lappel",
"screenshare_button_label": "Partage décran", "Open in the app": "Ouvrir dans lapplication",
"select_input_unset_button": "Sélectionnez une option", "Ready to join?": "Prêt à rejoindre ?",
"settings": { "Select app": "Choisissez lapplication",
"developer_settings_label": "Paramètres développeurs", "Start new call": "Démarrer un nouvel appel",
"developer_settings_label_description": "Affiche les paramètres développeurs dans la fenêtre des paramètres.", "Back to recents": "Revenir à lhistorique des appels",
"developer_tab_title": "Développeur", "Start video": "Démarrer la vidéo",
"feedback_tab_body": "Si vous rencontrez des problèmes, ou vous voulez simplement faire un commentaire, faites-en une courte description ci-dessous.", "Stop video": "Arrêter la vidéo",
"feedback_tab_description_label": "Votre commentaire", "Unmute microphone": "Allumer le microphone",
"feedback_tab_h4": "Envoyer un commentaire", "Call not found": "Appel non trouvé",
"feedback_tab_send_logs_label": "Inclure les journaux de débogage", "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 daccueil. Cela permet dêtre sûr que tout le monde utilise la même clé de chiffrement.",
"feedback_tab_thank_you": "Merci, nous avons reçu vos commentaires !", "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",
"feedback_tab_title": "Commentaires", "Copy link": "Copier le lien",
"more_tab_title": "Plus", "Invite": "Inviter",
"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 lappel.", "Invite to this call": "Inviter dans cet appel",
"show_connection_stats_label": "Afficher les statistiques de la connexion", "Link copied to clipboard": "Lien copié dans le presse-papier",
"speaker_device_selection_label": "Intervenant" "Participants": "Participants"
},
"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 dautres participants…"
} }

View File

@@ -1,139 +1,120 @@
{ {
"a11y": { "<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>",
"user_menu": "Menu pengguna" "<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>",
"action": { "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.",
"close": "Tutup", "Audio": "Audio",
"copy": "Salin", "Avatar": "Avatar",
"copy_link": "Salin tautan", "Camera": "Kamera",
"go": "Bergabung", "Close": "Tutup",
"invite": "Undang", "Confirm password": "Konfirmasi kata sandi",
"no": "Tidak", "Copied!": "Disalin!",
"register": "Daftar", "Create account": "Buat akun",
"remove": "Hapus", "Debug log request": "Permintaan catatan pengawakutuan",
"sign_in": "Masuk", "Developer": "Pengembang",
"sign_out": "Keluar", "Display name": "Nama tampilan",
"submit": "Kirim" "Exit full screen": "Keluar dari layar penuh",
}, "Full screen": "Layar penuh",
"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.", "Go": "Bergabung",
"app_selection_modal": { "Home": "Beranda",
"continue_in_browser": "Lanjutkan dalam peramban", "Include debug logs": "Termasuk catatan pengawakutuan",
"open_in_app": "Buka dalam aplikasi", "Join call": "Bergabung ke panggilan",
"text": "Siap untuk bergabung?", "Join call now": "Bergabung ke panggilan sekarang",
"title": "Pilih plikasi" "Join existing call?": "Bergabung ke panggilan yang sudah ada?",
}, "Loading…": "Memuat…",
"browser_media_e2ee_unsupported": "Peramban web Anda tidak mendukung enkripsi media ujung ke ujung. Peramban yang didukung adalah Chrome, Safari, dan Firefox >=117", "Local volume": "Volume lokal",
"call_ended_view": { "Logging in…": "Memasuki…",
"body": "Anda terputus dari panggilan", "Login": "Masuk",
"create_account_button": "Buat akun", "Login to your account": "Masuk ke akun Anda",
"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>", "Microphone": "Mikrofon",
"feedback_done": "<0>Terima kasih atas masukan Anda!</0>", "More": "Lainnya",
"feedback_prompt": "<0>Kami ingin mendengar masukan Anda supaya kami bisa meningkatkan pengalaman Anda.</0>", "No": "Tidak",
"headline": "{{displayName}}, panggilan Anda telah berakhir.", "Not now, return to home screen": "Tidak sekarang, kembali ke layar beranda",
"not_now_button": "Tidak sekarang, kembali ke layar beranda", "Not registered yet? <2>Create an account</2>": "Belum terdaftar? <2>Buat sebuah akun</2>",
"reconnect_button": "Hubungkan ulang", "Password": "Kata sandi",
"survey_prompt": "Bagaimana rasanya?" "Passwords must match": "Kata sandi harus cocok",
}, "Profile": "Profil",
"call_name": "Nama panggilan", "Recaptcha dismissed": "Recaptcha ditutup",
"common": { "Recaptcha not loaded": "Recaptcha tidak dimuat",
"camera": "Kamera", "Register": "Daftar",
"copied": "Disalin!", "Registering…": "Mendaftarkan…",
"display_name": "Nama tampilan", "Remove": "Hapus",
"encrypted": "Terenkripsi", "Return to home screen": "Kembali ke layar beranda",
"home": "Beranda", "Select an option": "Pilih sebuah opsi",
"loading": "Memuat…", "Send debug logs": "Kirim catatan pengawakutuan",
"microphone": "Mikrofon", "Sending…": "Mengirimkan…",
"password": "Kata sandi", "Settings": "Pengaturan",
"profile": "Profil", "Share screen": "Bagikan layar",
"settings": "Pengaturan", "Sign in": "Masuk",
"unencrypted": "Tidak terenkripsi", "Sign out": "Keluar",
"username": "Nama pengguna" "Speaker": "Pembicara",
}, "Spotlight": "Sorotan",
"disconnected_banner": "Koneksi ke server telah hilang.", "Submit feedback": "Kirim masukan",
"exit_fullscreen_button_label": "Keluar dari layar penuh", "This call already exists, would you like to join?": "Panggilan ini sudah ada, apakah Anda ingin bergabung?",
"full_screen_view_description": "<0>Mengirim catatan pengawakutuan akan membantu kami melacak masalahnya.</0>", "User menu": "Menu pengguna",
"full_screen_view_h1": "<0>Aduh, ada yang salah.</0>", "Username": "Nama pengguna",
"fullscreen_button_label": "Layar penuh", "Version: {{version}}": "Versi: {{version}}",
"group_call_loader_failed_heading": "Panggilan tidak ditemukan", "Video": "Video",
"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.", "Waiting for other participants…": "Menunggu peserta lain…",
"hangup_button_label": "Akhiri panggilan", "Yes, join call": "Ya, bergabung ke panggilan",
"header_label": "Beranda Element Call", "Sending debug logs…": "Mengirimkan catatan pengawakutuan…",
"header_participants_label": "Peserta", "Element Call Home": "Beranda Element Call",
"invite_modal": { "Copy": "Salin",
"link_copied_toast": "Tautan disalin ke papan klip", "<0>Submitting debug logs will help us track down the problem.</0>": "<0>Mengirim catatan pengawakutuan akan membantu kami melacak masalahnya.</0>",
"title": "Undang ke panggilan ini" "<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.",
"join_existing_call_modal": { "Developer Settings": "Pengaturan Pengembang",
"join_button": "Ya, bergabung ke panggilan", "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.",
"text": "Panggilan ini sudah ada, apakah Anda ingin bergabung?", "<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.",
"title": "Bergabung ke panggilan yang sudah ada?" "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.",
"layout_grid_label": "Kisi", "Submit": "Kirim",
"layout_spotlight_label": "Sorotan", "Submitting…": "Mengirim…",
"lobby": { "Thanks, we received your feedback!": "Terima kasih, kami telah menerima masukan Anda!",
"join_button": "Bergabung ke panggilan", "Your feedback": "Masukan Anda",
"leave_button": "Kembali ke terkini" "{{displayName}}, your call has ended.": "{{displayName}}, panggilan Anda telah berakhir.",
}, "<0>Thanks for your feedback!</0>": "<0>Terima kasih atas masukan Anda!</0>",
"local_volume_label": "Volume lokal", "How did it go?": "Bagaimana rasanya?",
"logging_in": "Memasuki…", "{{count}} stars|one": "{{count}} bintang",
"login_auth_links": "<0>Buat akun</0> Atau <2>Akses sebagai tamu</2>", "<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>",
"login_title": "Masuk", "Show connection stats": "Tampilkan statistik koneksi",
"microphone_off": "Mikrofon dimatikan", "{{displayName}} is presenting": "{{displayName}} sedang menampilkan",
"microphone_on": "Mikrofon dinyalakan", "{{count}} stars|other": "{{count}} bintang",
"mute_microphone_button_label": "Matikan mikrofon", "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>",
"rageshake_button_error_caption": "Kirim ulang catatan", "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",
"rageshake_request_modal": { "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",
"body": "Pengguna yang lain di panggilan ini sedang mengalami masalah. Supaya dapat mendiagnosa masalah ini, kami ingin mengumpulkan sebuah catatan pengawakutuan.", "Connectivity to the server has been lost.": "Koneksi ke server telah hilang.",
"title": "Permintaan catatan pengawakutuan" "Retry sending logs": "Kirim ulang catatan",
}, "You were disconnected from the call": "Anda terputus dari panggilan",
"rageshake_send_logs": "Kirim catatan pengawakutuan", "Reconnect": "Hubungkan ulang",
"rageshake_sending": "Mengirimkan…", "Thanks!": "Terima kasih!",
"rageshake_sending_logs": "Mengirimkan catatan pengawakutuan…", "{{count, number}}|other": "{{count, number}}",
"rageshake_sent": "Terima kasih!", "Encrypted": "Terenkripsi",
"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", "End call": "Akhiri panggilan",
"recaptcha_dismissed": "Recaptcha ditutup", "Grid": "Kisi",
"recaptcha_not_loaded": "Recaptcha tidak dimuat", "Microphone off": "Mikrofon dimatikan",
"register": { "Microphone on": "Mikrofon dinyalakan",
"passwords_must_match": "Kata sandi harus cocok", "Not encrypted": "Tidak terenkripsi",
"registering": "Mendaftarkan…" "Sharing screen": "Berbagi layar",
}, "{{count, number}}|one": "{{count, number}}",
"register_auth_links": "<0>Sudah punya akun?</0><1><0>Masuk</0> Atau <2>Akses sebagai tamu</2></1>", "You": "Anda",
"register_confirm_password_label": "Konfirmasi kata sandi", "Continue in browser": "Lanjutkan dalam peramban",
"return_home_button": "Kembali ke layar beranda", "Mute microphone": "Matikan mikrofon",
"room_auth_view_eula_caption": "Dengan mengeklik \"Bergabung ke panggilan sekarang\", Anda menyetujui <2>Perjanjian Lisensi Pengguna Akhir (EULA)</2> kami", "Name of call": "Nama panggilan",
"room_auth_view_join_button": "Bergabung ke panggilan sekarang", "Open in the app": "Buka dalam aplikasi",
"screenshare_button_label": "Bagikan layar", "Ready to join?": "Siap untuk bergabung?",
"select_input_unset_button": "Pilih sebuah opsi", "Select app": "Pilih plikasi",
"settings": { "Start new call": "Mulai panggilan baru",
"developer_settings_label": "Pengaturan Pengembang", "Start video": "Nyalakan video",
"developer_settings_label_description": "Ekspos pengaturan pengembang dalam jendela pengaturan.", "Stop video": "Matikan video",
"developer_tab_title": "Pengembang", "Unmute microphone": "Nyalakan mikrofon",
"feedback_tab_body": "Jika Anda mengalami masalah atau hanya ingin memberikan masukan, silakan kirimkan kami deskripsi pendek di bawah.", "Back to recents": "Kembali ke terkini",
"feedback_tab_description_label": "Masukan Anda", "Call not found": "Panggilan tidak ditemukan",
"feedback_tab_h4": "Kirim masukan", "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.",
"feedback_tab_send_logs_label": "Termasuk catatan pengawakutuan", "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",
"feedback_tab_thank_you": "Terima kasih, kami telah menerima masukan Anda!", "Invite": "Undang",
"feedback_tab_title": "Masukan", "Invite to this call": "Undang ke panggilan ini",
"more_tab_title": "Lainnya", "Participants": "Peserta",
"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.", "Copy link": "Salin tautan",
"show_connection_stats_label": "Tampilkan statistik koneksi", "Link copied to clipboard": "Tautan disalin ke papan klip"
"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…"
} }

View File

@@ -1,136 +1,120 @@
{ {
"a11y": { "{{count, number}}|one": "{{count, number}}",
"user_menu": "Menu utente" "{{count, number}}|other": "{{count, number}}",
}, "{{count}} stars|one": "{{count}} stelle",
"action": { "{{count}} stars|other": "{{count}} stelle",
"close": "Chiudi", "{{displayName}} is presenting": "{{displayName}} sta presentando",
"copy": "Copia", "<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>",
"copy_link": "Copia collegamento", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Crea un profilo</0> o <2>Accedi come ospite</2>",
"go": "Vai", "<0>Oops, something's gone wrong.</0>": "<0>Ops, qualcosa è andato storto.</0>",
"invite": "Invita", "<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>",
"register": "Registra", "<0>Thanks for your feedback!</0>": "<0>Grazie per la tua opinione!</0>",
"remove": "Rimuovi", "<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>",
"sign_in": "Accedi", "Audio": "Audio",
"sign_out": "Disconnetti", "Avatar": "Avatar",
"submit": "Invia" "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",
"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>.", "Close": "Chiudi",
"app_selection_modal": { "Confirm password": "Conferma password",
"continue_in_browser": "Continua nel browser", "Connectivity to the server has been lost.": "La connessione al server è stata persa.",
"open_in_app": "Apri nell'app", "Copied!": "Copiato!",
"text": "Tutto pronto per entrare?", "Copy": "Copia",
"title": "Seleziona app" "Create account": "Crea profilo",
}, "Debug log request": "Richiesta registro di debug",
"browser_media_e2ee_unsupported": "Il tuo browser non supporta la crittografia end-to-end dei media. I browser supportati sono Chrome, Safari, Firefox >=117", "Developer": "Sviluppatore",
"call_ended_view": { "Developer Settings": "Impostazioni per sviluppatori",
"body": "Sei stato disconnesso dalla chiamata", "Display name": "Il tuo nome",
"create_account_button": "Crea profilo", "Element Call Home": "Inizio di Element Call",
"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>", "Encrypted": "Cifrata",
"feedback_done": "<0>Grazie per la tua opinione!</0>", "End call": "Termina chiamata",
"feedback_prompt": "<0>Vorremmo sapere la tua opinione in modo da migliorare l'esperienza.</0>", "Exit full screen": "Esci da schermo intero",
"headline": "{{displayName}}, la chiamata è terminata.", "Expose developer settings in the settings window.": "Mostra le impostazioni per sviluppatori nella finestra delle impostazioni.",
"not_now_button": "Non ora, torna alla schermata principale", "Feedback": "Feedback",
"reconnect_button": "Riconnetti", "Full screen": "Schermo intero",
"survey_prompt": "Com'è andata?" "Go": "Vai",
}, "Grid": "Griglia",
"call_name": "Nome della chiamata", "Home": "Pagina iniziale",
"common": { "How did it go?": "Com'è andata?",
"camera": "Fotocamera", "Include debug logs": "Includi registri di debug",
"copied": "Copiato!", "Join call": "Entra in chiamata",
"display_name": "Il tuo nome", "Join call now": "Entra in chiamata ora",
"encrypted": "Cifrata", "Loading…": "Caricamento…",
"home": "Pagina iniziale", "Local volume": "Volume locale",
"loading": "Caricamento…", "Logging in…": "Accesso…",
"microphone": "Microfono", "Login": "Accedi",
"profile": "Profilo", "Login to your account": "Accedi al tuo profilo",
"settings": "Impostazioni", "Microphone": "Microfono",
"unencrypted": "Non cifrata", "Microphone off": "Microfono spento",
"username": "Nome utente" "Microphone on": "Microfono acceso",
}, "More": "Altro",
"disconnected_banner": "La connessione al server è stata persa.", "No": "No",
"exit_fullscreen_button_label": "Esci da schermo intero", "Not encrypted": "Non cifrata",
"full_screen_view_description": "<0>L'invio di registri di debug ci aiuterà ad individuare il problema.</0>", "Join existing call?": "Entrare in una chiamata esistente?",
"full_screen_view_h1": "<0>Ops, qualcosa è andato storto.</0>", "Not registered yet? <2>Create an account</2>": "Non hai ancora un profilo? <2>Creane uno</2>",
"fullscreen_button_label": "Schermo intero", "Password": "Password",
"group_call_loader_failed_heading": "Chiamata non trovata", "Passwords must match": "Le password devono coincidere",
"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.", "Profile": "Profilo",
"hangup_button_label": "Termina chiamata", "Recaptcha dismissed": "Recaptcha annullato",
"header_label": "Inizio di Element Call", "Recaptcha not loaded": "Recaptcha non caricato",
"header_participants_label": "Partecipanti", "Reconnect": "Riconnetti",
"invite_modal": { "Register": "Registra",
"link_copied_toast": "Collegamento copiato negli appunti", "Registering…": "Registrazione…",
"title": "Invita a questa chiamata" "Remove": "Rimuovi",
}, "Retry sending logs": "Riprova l'invio dei registri",
"join_existing_call_modal": { "Return to home screen": "Torna alla schermata di iniziale",
"join_button": "Sì, entra in chiamata", "Select an option": "Seleziona un'opzione",
"text": "Questa chiamata esiste già, vuoi entrare?", "Send debug logs": "Invia registri di debug",
"title": "Entrare in una chiamata esistente?" "Sending debug logs…": "Invio dei registri di debug…",
}, "Sending…": "Invio…",
"layout_grid_label": "Griglia", "Settings": "Impostazioni",
"layout_spotlight_label": "In primo piano", "Share screen": "Condividi schermo",
"lobby": { "Sharing screen": "Condivisione schermo",
"join_button": "Entra in chiamata", "Show connection stats": "Mostra statistiche connessione",
"leave_button": "Torna ai recenti" "Sign in": "Accedi",
}, "Sign out": "Disconnetti",
"local_volume_label": "Volume locale", "Speaker": "Altoparlante",
"logging_in": "Accesso…", "Submit": "Invia",
"login_auth_links": "<0>Crea un profilo</0> o <2>Accedi come ospite</2>", "Submit feedback": "Invia commento",
"login_title": "Accedi", "Spotlight": "In primo piano",
"microphone_off": "Microfono spento", "Thanks, we received your feedback!": "Grazie, abbiamo ricevuto il tuo commento!",
"microphone_on": "Microfono acceso", "Thanks!": "Grazie!",
"mute_microphone_button_label": "Spegni il microfono", "This call already exists, would you like to join?": "Questa chiamata esiste già, vuoi entrare?",
"rageshake_button_error_caption": "Riprova l'invio dei registri", "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>",
"rageshake_request_modal": { "User menu": "Menu utente",
"body": "Un altro utente in questa chiamata sta avendo problemi. Per diagnosticare meglio questi problemi, vorremmo raccogliere un registro di debug.", "Username": "Nome utente",
"title": "Richiesta registro di debug" "Version: {{version}}": "Versione: {{version}}",
}, "Video": "Video",
"rageshake_send_logs": "Invia registri di debug", "Waiting for other participants…": "In attesa di altri partecipanti…",
"rageshake_sending": "Invio…", "Yes, join call": "Sì, entra in chiamata",
"rageshake_sending_logs": "Invio dei registri di debug…", "You were disconnected from the call": "Sei stato disconnesso dalla chiamata",
"rageshake_sent": "Grazie!", "Your feedback": "Il tuo commento",
"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>", "{{displayName}}, your call has ended.": "{{displayName}}, la chiamata è terminata.",
"recaptcha_dismissed": "Recaptcha annullato", "<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.",
"recaptcha_not_loaded": "Recaptcha non caricato", "<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>",
"register": { "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.",
"passwords_must_match": "Le password devono coincidere", "Not now, return to home screen": "Non ora, torna alla schermata principale",
"registering": "Registrazione…" "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.",
"register_auth_links": "<0>Hai già un profilo?</0><1><0>Accedi</0> o <2>Accedi come ospite</2></1>", "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>",
"register_confirm_password_label": "Conferma password", "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>.",
"return_home_button": "Torna alla schermata di iniziale", "You": "Tu",
"room_auth_view_eula_caption": "Cliccando \"Entra in chiamata ora\", accetti il nostro <2>accordo di licenza con l'utente finale (EULA)</2>", "Continue in browser": "Continua nel browser",
"room_auth_view_join_button": "Entra in chiamata ora", "Mute microphone": "Spegni il microfono",
"screenshare_button_label": "Condividi schermo", "Select app": "Seleziona app",
"select_input_unset_button": "Seleziona un'opzione", "Name of call": "Nome della chiamata",
"settings": { "Open in the app": "Apri nell'app",
"developer_settings_label": "Impostazioni per sviluppatori", "Ready to join?": "Tutto pronto per entrare?",
"developer_settings_label_description": "Mostra le impostazioni per sviluppatori nella finestra delle impostazioni.", "Start video": "Avvia video",
"developer_tab_title": "Sviluppatore", "Stop video": "Ferma video",
"feedback_tab_body": "Se stai riscontrando problemi o semplicemente vuoi dare un'opinione, inviaci una breve descrizione qua sotto.", "Unmute microphone": "Riaccendi il microfono",
"feedback_tab_description_label": "Il tuo commento", "Back to recents": "Torna ai recenti",
"feedback_tab_h4": "Invia commento", "Start new call": "Inizia una nuova chiamata",
"feedback_tab_send_logs_label": "Includi registri di debug", "Call not found": "Chiamata non trovata",
"feedback_tab_thank_you": "Grazie, abbiamo ricevuto il tuo commento!", "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.",
"more_tab_title": "Altro", "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",
"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.", "Copy link": "Copia collegamento",
"show_connection_stats_label": "Mostra statistiche connessione", "Invite": "Invita",
"speaker_device_selection_label": "Altoparlante" "Invite to this call": "Invita a questa chiamata",
}, "Participants": "Partecipanti",
"star_rating_input_label_one": "{{count}} stelle", "Link copied to clipboard": "Collegamento copiato negli appunti"
"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…"
} }

View File

@@ -1,75 +1,57 @@
{ {
"a11y": { "<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>",
"user_menu": "ユーザーメニュー" "<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>",
"action": { "Camera": "カメラ",
"close": "閉じる", "Avatar": "アバター",
"copy": "コピー", "Audio": "音声",
"go": "続行", "Confirm password": "パスワードを確認",
"no": "いいえ", "Close": "閉じる",
"register": "登録", "Copied!": "コピーしました!",
"remove": "削除", "Copy": "コピー",
"sign_in": "サインイン", "Create account": "アカウントを作成",
"sign_out": "サインアウト" "Go": "続行",
}, "Element Call Home": "Element Call ホーム",
"call_ended_view": { "Display name": "表示名",
"create_account_button": "アカウントを作成" "Developer": "開発者",
}, "Full screen": "全画面表示",
"common": { "Exit full screen": "全画面表示を終了",
"audio": "音声", "Include debug logs": "デバッグログを含める",
"avatar": "アバター", "Home": "ホーム",
"camera": "カメラ", "Join existing call?": "既存の通話に参加しますか?",
"copied": "コピーしました!", "Join call now": "今すぐ通話に参加",
"display_name": "表示名", "Join call": "通話に参加",
"home": "ホーム", "Not registered yet? <2>Create an account</2>": "アカウントがありませんか? <2>アカウントを作成</2>",
"loading": "読み込んでいます…", "Microphone": "マイク",
"microphone": "マイク", "Login": "ログイン",
"password": "パスワード", "Logging in…": "ログインしています…",
"profile": "プロフィール", "Loading…": "読み込んでいます…",
"settings": "設定", "Version: {{version}}": "バージョン:{{version}}",
"username": "ユーザー名", "Username": "ユーザー名",
"video": "ビデオ" "User menu": "ユーザーメニュー",
}, "Submit feedback": "フィードバックを送信",
"exit_fullscreen_button_label": "全画面表示を終了", "Spotlight": "スポットライト",
"full_screen_view_h1": "<0>何かがうまく行きませんでした。</0>", "Send debug logs": "デバッグログを送信",
"fullscreen_button_label": "全画面表示", "Sign out": "サインアウト",
"header_label": "Element Call ホーム", "Sign in": "サインイン",
"join_existing_call_modal": { "Share screen": "画面共有",
"join_button": "はい、通話に参加", "Settings": "設定",
"text": "この通話は既に存在します。参加しますか?", "Sending…": "送信しています…",
"title": "既存の通話に参加しますか?" "Sending debug logs…": "デバッグログを送信しています…",
}, "Return to home screen": "ホーム画面に戻る",
"layout_spotlight_label": "スポットライト", "Registering…": "登録しています…",
"lobby": { "Register": "登録",
"join_button": "通話に参加" "Profile": "プロフィール",
}, "Passwords must match": "パスワードが一致する必要があります",
"logging_in": "ログインしています…", "Password": "パスワード",
"login_auth_links": "<0>アカウントを作成</0>または<2>ゲストとしてアクセス</2>", "Speaker": "スピーカー",
"login_title": "ログイン", "Video": "ビデオ",
"rageshake_request_modal": { "Waiting for other participants…": "他の参加者を待機しています…",
"title": "デバッグログを要求" "Yes, join call": "はい、通話に参加",
}, "Select an option": "オプションを選択",
"rageshake_send_logs": "デバッグログを送信", "Debug log request": "デバッグログを要求",
"rageshake_sending": "送信しています…", "Login to your account": "アカウントにログイン",
"rageshake_sending_logs": "デバッグログを送信しています…", "Remove": "削除",
"register": { "No": "いいえ",
"passwords_must_match": "パスワードが一致する必要があります", "This call already exists, would you like to join?": "この通話は既に存在します。参加しますか?"
"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": "他の参加者を待機しています…"
} }

View File

@@ -0,0 +1,4 @@
{
"<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>": ""
}

View File

@@ -1,110 +1,91 @@
{ {
"a11y": { "{{count}} stars|one": "{{count}} zvaigzne",
"user_menu": "Lietotāja izvēlne" "{{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>",
"action": { "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Izveidot kontu</0> vai <2>Piekļūt kā viesim</2>",
"close": "Aizvērt", "<0>Oops, something's gone wrong.</0>": "<0>Ak vai, kaut kas nogāja greizi!</0>",
"copy": "Ievietot starpliktuvē", "<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>",
"go": "Aiziet", "<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>",
"no": "Nē", "<0>Thanks for your feedback!</0>": "<0>Paldies par atsauksmi!</0>",
"register": "Reģistrēties", "Audio": "Skaņa",
"remove": "Noņemt", "Avatar": "Attēls",
"sign_in": "Pieteikties", "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>",
"sign_out": "Atteikties", "Camera": "Kamera",
"submit": "Iesniegt" "Close": "Aizvērt",
}, "Confirm password": "Apstiprināt paroli",
"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>.", "Connectivity to the server has been lost.": "Ir zaudēts savienojums ar serveri.",
"call_ended_view": { "Copied!": "Ievietots starpliktuvē.",
"body": "Tu tiki atvienots no zvana", "Copy": "Ievietot starpliktuvē",
"create_account_button": "Izveidot kontu", "Create account": "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>", "Debug log request": "Atkļūdošanas žurnāla pieprasījums",
"feedback_done": "<0>Paldies par atsauksmi!</0>", "Developer": "Izstrādātājs",
"feedback_prompt": "<0>Mums patiktu saņemt Tavu atsauksmi, lai mēs varētu uzlabot Tavu pieredzi.</0>", "Developer Settings": "Izstrādātāja iestatījumi",
"headline": "{{displayName}}, Tavs zvans ir beidzies.", "Display name": "Attēlojamais vārds",
"not_now_button": "Ne tagad, atgriezties sākuma ekrānā", "Element Call Home": "Element Call sākums",
"reconnect_button": "Atkārtoti savienoties", "Exit full screen": "Iziet no pilnekrāna",
"survey_prompt": "Kā Tev veicās?" "Expose developer settings in the settings window.": "Izstādīt izstrādātāja iestatījumus iestatījumu logā.",
}, "Feedback": "Atsauksmes",
"common": { "Full screen": "Pilnekrāns",
"audio": "Skaņa", "Go": "Aiziet",
"avatar": "Attēls", "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>",
"camera": "Kamera", "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>.",
"copied": "Ievietots starpliktuvē.", "{{displayName}} is presenting": "{{displayName}} uzstājas",
"display_name": "Attēlojamais vārds", "{{displayName}}, your call has ended.": "{{displayName}}, Tavs zvans ir beidzies.",
"home": "Sākums", "<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.",
"loading": "Lādējas…", "<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>",
"microphone": "Mikrofons", "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.",
"password": "Parole", "Home": "Sākums",
"profile": "Profils", "Waiting for other participants…": "Gaida citus dalībniekus…",
"settings": "Iestatījumi", "Yes, join call": "Jā, pievienoties zvanam",
"username": "Lietotājvārds" "Your feedback": "Tava atsauksme",
}, "How did it go?": "Kā Tev veicās?",
"disconnected_banner": "Ir zaudēts savienojums ar serveri.", "Include debug logs": "Iekļaut atkļūdošanas žurnāla ierakstus",
"exit_fullscreen_button_label": "Iziet no pilnekrāna", "Join call": "Pievienoties zvanam",
"full_screen_view_description": "<0>Atkļūdošanas žurnāla ierakstu iesūtīšana palīdzēs mums atklāt nepilnību.</0>", "Join call now": "Pievienoties zvanam tagad",
"full_screen_view_h1": "<0>Ak vai, kaut kas nogāja greizi!</0>", "Join existing call?": "Pievienoties esošam zvanam?",
"fullscreen_button_label": "Pilnekrāns", "Loading…": "Lādējas…",
"header_label": "Element Call sākums", "Local volume": "Vietējais skaļums",
"join_existing_call_modal": { "Logging in…": "Piesakās…",
"join_button": "Jā, pievienoties zvanam", "Login": "Pieteikties",
"text": "Šis zvans jau pastāv. Vai vēlies pievienoties?", "Login to your account": "Pieteikties kontā",
"title": "Pievienoties esošam zvanam?" "Microphone": "Mikrofons",
}, "More": "Vairāk",
"layout_spotlight_label": "Starmešu gaisma", "No": "Nē",
"lobby": { "Not now, return to home screen": "Ne tagad, atgriezties sākuma ekrānā",
"join_button": "Pievienoties zvanam" "Password": "Parole",
}, "Passwords must match": "Parolēm ir jāsakrīt",
"local_volume_label": "Vietējais skaļums", "Profile": "Profils",
"logging_in": "Piesakās…", "Recaptcha dismissed": "ReCaptcha atmesta",
"login_auth_links": "<0>Izveidot kontu</0> vai <2>Piekļūt kā viesim</2>", "Recaptcha not loaded": "ReCaptcha nav ielādēta",
"login_title": "Pieteikties", "Reconnect": "Atkārtoti savienoties",
"rageshake_button_error_caption": "Atkārtoti mēģināt žurnāla ierakstu nosūtīšanu", "Register": "Reģistrēties",
"rageshake_request_modal": { "Registering…": "Reģistrē…",
"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.", "Remove": "Noņemt",
"title": "Atkļūdošanas žurnāla pieprasījums" "Retry sending logs": "Atkārtoti mēģināt žurnāla ierakstu nosūtīšanu",
}, "Return to home screen": "Atgriezties sākuma ekrānā",
"rageshake_send_logs": "Nosūtīt atkļūdošanas žurnāla ierakstus", "Select an option": "Atlasīt iespēju",
"rageshake_sending": "Nosūta…", "Send debug logs": "Nosūtīt atkļūdošanas žurnāla ierakstus",
"rageshake_sending_logs": "Nosūta atkļūdošanas žurnāla ierakstus…", "Sending debug logs": "Nosūta atkļūdošanas žurnāla ierakstus…",
"rageshake_sent": "Paldies!", "Sending…": "Nosūta…",
"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>", "Settings": "Iestatījumi",
"recaptcha_dismissed": "ReCaptcha atmesta", "Share screen": "Kopīgot ekrānu",
"recaptcha_not_loaded": "ReCaptcha nav ielādēta", "Show connection stats": "Rādīt savienojuma apkopojumu",
"register": { "Sign in": "Pieteikties",
"passwords_must_match": "Parolēm ir jāsakrīt", "Sign out": "Atteikties",
"registering": "Reģistrē…" "Speaker": "Runātājs",
}, "Spotlight": "Starmešu gaisma",
"register_auth_links": "<0>Jau ir konts?</0><1><0>Pieteikties</0> vai <2>Piekļūt kā viesim</2></1>", "Submit": "Iesniegt",
"register_confirm_password_label": "Apstiprināt paroli", "Submit feedback": "Iesniegt atsauksmi",
"return_home_button": "Atgriezties sākuma ekrānā", "Submitting…": "Iesniedz…",
"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>", "Thanks, we received your feedback!": "Paldies, mēs saņēmām atsauksmi!",
"room_auth_view_join_button": "Pievienoties zvanam tagad", "Thanks!": "Paldies!",
"screenshare_button_label": "Kopīgot ekrānu", "This call already exists, would you like to join?": "Šis zvans jau pastāv. Vai vēlies pievienoties?",
"select_input_unset_button": "Atlasīt iespēju", "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>",
"settings": { "User menu": "Lietotāja izvēlne",
"developer_settings_label": "Izstrādātāja iestatījumi", "Username": "Lietotājvārds",
"developer_settings_label_description": "Izstādīt izstrādātāja iestatījumus iestatījumu logā.", "Video": "Video",
"developer_tab_title": "Izstrādātājs", "You were disconnected from the call": "Tu tiki atvienots no zvana",
"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.", "Version: {{version}}": "Versija: {{version}}",
"feedback_tab_description_label": "Tava atsauksme", "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.",
"feedback_tab_h4": "Iesniegt atsauksmi", "Not registered yet? <2>Create an account</2>": "Vēl neesi reģistrējies? <2>Izveidot kontu</2>"
"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…"
} }

View File

@@ -1,142 +1,120 @@
{ {
"a11y": { "Login": "Zaloguj się",
"user_menu": "Menu użytkownika" "Go": "Przejdź",
}, "Yes, join call": "Tak, dołącz do połączenia",
"action": { "Waiting for other participants…": "Oczekiwanie na pozostałych uczestników…",
"close": "Zamknij", "Video": "Wideo",
"copy": "Kopiuj", "Version: {{version}}": "Wersja: {{version}}",
"copy_link": "Kopiuj link", "Username": "Nazwa użytkownika",
"go": "Przejdź", "User menu": "Menu użytkownika",
"invite": "Zaproś", "This call already exists, would you like to join?": "Te połączenie już istnieje, czy chcesz do niego dołączyć?",
"no": "Nie", "Submit feedback": "Prześlij opinię",
"register": "Zarejestruj", "Spotlight": "Centrum uwagi",
"remove": "Usuń", "Speaker": "Głośnik",
"sign_in": "Zaloguj się", "Sign out": "Wyloguj się",
"sign_out": "Wyloguj się", "Sign in": "Zaloguj się",
"submit": "Wyślij" "Share screen": "Udostępnij ekran",
}, "Settings": "Ustawienia",
"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>.", "Sending…": "Wysyłanie…",
"app_selection_modal": { "Sending debug logs…": "Wysyłanie dzienników debugowania…",
"continue_in_browser": "Kontynuuj w przeglądarce", "Send debug logs": "Wyślij dzienniki debugowania",
"open_in_app": "Otwórz w aplikacji", "Select an option": "Wybierz opcję",
"text": "Gotowy, by dołączyć?", "Return to home screen": "Powróć do strony głównej",
"title": "Wybierz aplikację" "Remove": "Usuń",
}, "Registering…": "Rejestrowanie…",
"browser_media_e2ee_unsupported": "Twoja przeglądarka nie wspiera szyfrowania end-to-end. Wspierane przeglądarki to Chrome, Safari, Firefox >=117", "Register": "Zarejestruj",
"call_ended_view": { "Recaptcha not loaded": "Recaptcha nie została załadowana",
"body": "Rozłączono Cię z połączenia", "Recaptcha dismissed": "Recaptcha odrzucona",
"create_account_button": "Utwórz konto", "Profile": "Profil",
"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>", "Passwords must match": "Hasła muszą pasować",
"feedback_done": "<0>Dziękujemy za Twoją opinię!</0>", "Password": "Hasło",
"feedback_prompt": "<0>Z przyjemnością wysłuchamy Twojej opinii, aby poprawić Twoje doświadczenia.</0>", "Not registered yet? <2>Create an account</2>": "Nie masz konta? <2>Utwórz je</2>",
"headline": "{{displayName}}, Twoje połączenie zostało zakończone.", "Not now, return to home screen": "Nie teraz, powróć do ekranu domowego",
"not_now_button": "Nie teraz, powróć do ekranu domowego", "No": "Nie",
"reconnect_button": "Połącz ponownie", "More": "Więcej",
"survey_prompt": "Jak poszło?" "Microphone": "Mikrofon",
}, "Login to your account": "Zaloguj się do swojego konta",
"call_name": "Nazwa połączenia", "Logging in…": "Logowanie…",
"common": { "Local volume": "Głośność lokalna",
"audio": "Dźwięk", "Loading…": "Ładowanie…",
"avatar": "Awatar", "Join existing call?": "Dołączyć do istniejącego połączenia?",
"camera": "Kamera", "Join call now": "Dołącz do połączenia teraz",
"copied": "Skopiowano!", "Join call": "Dołącz do połączenia",
"display_name": "Nazwa wyświetlana", "Include debug logs": "Dołącz dzienniki debugowania",
"encrypted": "Szyfrowane", "Home": "Strona domowa",
"home": "Strona domowa", "Full screen": "Pełny ekran",
"loading": "Ładowanie…", "Exit full screen": "Opuść pełny ekran",
"microphone": "Mikrofon", "Display name": "Nazwa wyświetlana",
"password": "Hasło", "Developer": "Programista",
"profile": "Profil", "Debug log request": "Prośba o dzienniki debugowania",
"settings": "Ustawienia", "Create account": "Utwórz konto",
"unencrypted": "Nie szyfrowane", "Copied!": "Skopiowano!",
"username": "Nazwa użytkownika", "Confirm password": "Potwierdź hasło",
"video": "Wideo" "Close": "Zamknij",
}, "Camera": "Kamera",
"disconnected_banner": "Utracono połączenie z serwerem.", "Avatar": "Awatar",
"exit_fullscreen_button_label": "Opuść pełny ekran", "Audio": "Dźwięk",
"full_screen_view_description": "<0>Wysłanie dzienników debuggowania pomoże nam ustalić przyczynę problemu.</0>", "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.",
"full_screen_view_h1": "<0>Ojej, coś poszło nie tak.</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>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>",
"fullscreen_button_label": "Pełny ekran", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Utwórz konto</0> lub <2>Dołącz jako gość</2>",
"group_call_loader_failed_heading": "Nie znaleziono połączenia", "<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>",
"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.", "Copy": "Kopiuj",
"hangup_button_label": "Zakończ połączenie", "<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>",
"header_label": "Strona główna Element Call", "<0>Oops, something's gone wrong.</0>": "<0>Ojej, coś poszło nie tak.</0>",
"header_participants_label": "Uczestnicy", "Expose developer settings in the settings window.": "Wyświetl opcje programisty w oknie ustawień.",
"invite_modal": { "Element Call Home": "Strona główna Element Call",
"link_copied_toast": "Skopiowano link do schowka", "Developer Settings": "Opcje programisty",
"title": "Zaproś do połączenia" "<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>.",
"join_existing_call_modal": { "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.",
"join_button": "Tak, dołącz do połączenia", "Thanks, we received your feedback!": "Dziękujemy, otrzymaliśmy Twoją opinię!",
"text": "Te połączenie już istnieje, czy chcesz do niego dołączyć?", "Feedback": "Opinia użytkownika",
"title": "Dołączyć do istniejącego połączenia?" "Submitting…": "Wysyłanie…",
}, "Submit": "Wyślij",
"layout_grid_label": "Siatka", "Your feedback": "Twoje opinie",
"layout_spotlight_label": "Centrum uwagi", "{{count}} stars|other": "{{count}} gwiazdki",
"lobby": { "{{count}} stars|one": "{{count}} gwiazdki",
"join_button": "Dołącz do połączenia", "{{displayName}}, your call has ended.": "{{displayName}}, Twoje połączenie zostało zakończone.",
"leave_button": "Wróć do ostatnie" "<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>",
"local_volume_label": "Głośność lokalna", "How did it go?": "Jak poszło?",
"logging_in": "Logowanie…", "{{displayName}} is presenting": "{{displayName}} prezentuje",
"login_auth_links": "<0>Utwórz konto</0> lub <2>Dołącz jako gość</2>", "Show connection stats": "Pokaż statystyki połączenia",
"login_title": "Zaloguj się", "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>",
"microphone_off": "Mikrofon wyłączony", "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>",
"microphone_on": "Mikrofon włączony", "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>",
"mute_microphone_button_label": "Wycisz mikrofon", "Retry sending logs": "Wyślij logi ponownie",
"rageshake_button_error_caption": "Wyślij logi ponownie", "Thanks!": "Dziękujemy!",
"rageshake_request_modal": { "You were disconnected from the call": "Rozłączono Cię z połączenia",
"body": "Inny użytkownik w tym połączeniu napotkał problem. Aby lepiej zdiagnozować tę usterkę, chcielibyśmy zebrać dzienniki debugowania.", "Connectivity to the server has been lost.": "Utracono połączenie z serwerem.",
"title": "Prośba o dzienniki debugowania" "Reconnect": "Połącz ponownie",
}, "{{count, number}}|other": "{{count, number}}",
"rageshake_send_logs": "Wyślij dzienniki debugowania", "Encrypted": "Szyfrowane",
"rageshake_sending": "Wysyłanie", "End call": "Zakończ połączenie",
"rageshake_sending_logs": "Wysyłanie dzienników debugowania…", "Grid": "Siatka",
"rageshake_sent": "Dziękujemy!", "Microphone off": "Mikrofon wyłączony",
"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>", "Microphone on": "Mikrofon włączony",
"recaptcha_dismissed": "Recaptcha odrzucona", "Not encrypted": "Nie szyfrowane",
"recaptcha_not_loaded": "Recaptcha nie została załadowana", "Sharing screen": "Udostępnianie ekranu",
"register": { "{{count, number}}|one": "{{count, number}}",
"passwords_must_match": "Hasła muszą pasować", "Continue in browser": "Kontynuuj w przeglądarce",
"registering": "Rejestrowanie…" "Mute microphone": "Wycisz mikrofon",
}, "Name of call": "Nazwa połączenia",
"register_auth_links": "<0>Masz już konto?</0><1><0>Zaloguj się</0> lub <2>Dołącz jako gość</2></1>", "Open in the app": "Otwórz w aplikacji",
"register_confirm_password_label": "Potwierdź hasło", "Ready to join?": "Gotowy, by dołączyć?",
"return_home_button": "Powróć do strony głównej", "Select app": "Wybierz aplikację",
"room_auth_view_eula_caption": "Klikając \"Dołącz teraz do rozmowy\", zgadzasz się na naszą <2>Umowę licencyjną (EULA)</2>", "Start new call": "Rozpocznij nowe połączenie",
"room_auth_view_join_button": "Dołącz do połączenia teraz", "Start video": "Rozpocznij wideo",
"screenshare_button_label": "Udostępnij ekran", "Back to recents": "Wróć do ostatnie",
"select_input_unset_button": "Wybierz opcję", "Stop video": "Zakończ wideo",
"settings": { "Unmute microphone": "Odcisz mikrofon",
"developer_settings_label": "Opcje programisty", "Call not found": "Nie znaleziono połączenia",
"developer_settings_label_description": "Wyświetl opcje programisty w oknie ustawień.", "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.",
"developer_tab_title": "Programista", "You": "Ty",
"feedback_tab_body": "Jeśli posiadasz problemy lub chciałbyś zgłosić swoją opinię, wyślij nam krótki opis.", "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",
"feedback_tab_description_label": "Twoje opinie", "Invite": "Zaproś",
"feedback_tab_h4": "Prześlij opinię", "Link copied to clipboard": "Skopiowano link do schowka",
"feedback_tab_send_logs_label": "Dołącz dzienniki debugowania", "Participants": "Uczestnicy",
"feedback_tab_thank_you": "Dziękujemy, otrzymaliśmy Twoją opinię!", "Copy link": "Kopiuj link",
"feedback_tab_title": "Opinia użytkownika", "Invite to this call": "Zaproś do połączenia"
"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…"
} }

View File

@@ -1,103 +1,83 @@
{ {
"a11y": { "Register": "Зарегистрироваться",
"user_menu": "Меню пользователя" "Registering…": "Регистрация…",
}, "Logging in…": "Вход…",
"action": { "Waiting for other participants…": "Ожидание других участников…",
"close": "Закрыть", "This call already exists, would you like to join?": "Этот звонок уже существует, хотите присоединиться?",
"copy": "Копировать", "Submit feedback": "Отправить отзыв",
"go": "Далее", "Sending debug logs…": "Отправка журнала отладки…",
"no": "Нет", "Select an option": "Выберите вариант",
"register": "Зарегистрироваться", "<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>",
"remove": "Удалить", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Создать аккаунт</0> или <2>Зайти как гость</2>",
"sign_in": "Войти", "<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>",
"sign_out": "Выйти", "Yes, join call": "Да, присоединиться",
"submit": "Отправить" "Video": "Видео",
}, "Version: {{version}}": "Версия: {{version}}",
"analytics_notice": "Участвуя в этой бета-версии, вы соглашаетесь на сбор анонимных данных, которые мы используем для улучшения продукта. Более подробную информацию о том, какие данные мы отслеживаем, вы можете найти в нашей <2> Политике конфиденциальности</2> и нашей <5> Политике использования файлов cookie</5>.", "Username": "Имя пользователя",
"call_ended_view": { "User menu": "Меню пользователя",
"create_account_button": "Создать аккаунт", "Spotlight": "Внимание",
"create_account_prompt": "<0>Почему бы не задать пароль, тем самым сохранив аккаунт?</0><1>Так вы можете оставить своё имя и задать аватар для будущих звонков.</1>", "Speaker": "Динамик",
"feedback_done": "<0>Спасибо за обратную связь!</0>", "Sign out": "Выйти",
"feedback_prompt": "<0>Мы будем рады видеть ваши отзывы, чтобы мы могли улучшить ваш опыт.</0>", "Sign in": "Войти",
"headline": "{{displayName}}, ваш звонок окончен.", "Share screen": "Поделиться экраном",
"not_now_button": "Не сейчас, вернуться в Начало", "Settings": "Настройки",
"survey_prompt": "Как всё прошло?" "Sending…": "Отправка…",
}, "Local volume": "Местная громкость",
"common": { "Include debug logs": "Приложить журнал отладки",
"audio": "Аудио", "Debug log request": "Запрос журнала отладки",
"avatar": "Аватар", "Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "У одного из участников звонка есть неполадки. Чтобы лучше диагностировать похожие проблемы, нам нужен журнал отладки.",
"camera": "Камера", "Send debug logs": "Отправить журнал отладки",
"copied": "Скопировано!", "Return to home screen": "Вернуться в Начало",
"display_name": "Видимое имя", "Remove": "Удалить",
"home": "Начало", "Recaptcha not loaded": "Невозможно начать проверку",
"loading": "Загрузка…", "Recaptcha dismissed": "Проверка не пройдена",
"microphone": "Микрофон", "Profile": "Профиль",
"password": "Пароль", "Passwords must match": "Пароли должны совпадать",
"profile": "Профиль", "Password": ароль",
"settings": "Настройки", "Not registered yet? <2>Create an account</2>": "Ещё не зарегистрированы? <2>Создайте аккаунт</2>",
"username": "Имя пользователя", "Not now, return to home screen": "Не сейчас, вернуться в Начало",
"video": "Видео" "No": "Нет",
}, "More": "Больше",
"exit_fullscreen_button_label": "Выйти из полноэкранного режима", "Microphone": "Микрофон",
"full_screen_view_description": "<0>Отправка журналов поможет нам найти и устранить проблему.</0>", "Login to your account": "Войдите в свой аккаунт",
"full_screen_view_h1": "<0>Упс, что-то пошло не так.</0>", "Login": "Вход",
"fullscreen_button_label": "Полноэкранный режим", "Loading…": "Загрузка…",
"header_label": "Главная Element Call", "Join existing call?": "Присоединиться к существующему звонку?",
"join_existing_call_modal": { "Join call now": "Присоединиться сейчас",
"join_button": "Да, присоединиться", "Join call": "Присоединиться",
"text": "Этот звонок уже существует, хотите присоединиться?", "Home": "Начало",
"title": "Присоединиться к существующему звонку?" "Go": "Далее",
}, "Full screen": "Полноэкранный режим",
"layout_spotlight_label": "Внимание", "Exit full screen": "Выйти из полноэкранного режима",
"lobby": { "Display name": "Видимое имя",
"join_button": "Присоединиться" "Developer": "Разработчику",
}, "Create account": "Создать аккаунт",
"local_volume_label": "Местная громкость", "Copied!": "Скопировано!",
"logging_in": "Вход…", "Confirm password": "Подтвердите пароль",
"login_auth_links": "<0>Создать аккаунт</0> или <2>Зайти как гость</2>", "Close": "Закрыть",
"login_title": "Вход", "Camera": "Камера",
"rageshake_request_modal": { "Avatar": "Аватар",
"body": "У одного из участников звонка есть неполадки. Чтобы лучше диагностировать похожие проблемы, нам нужен журнал отладки.", "Audio": "Аудио",
"title": "Запрос журнала отладки" "Element Call Home": "Главная Element Call",
}, "Copy": "Копировать",
"rageshake_send_logs": "Отправить журнал отладки", "<0>Submitting debug logs will help us track down the problem.</0>": "<0>Отправка журналов поможет нам найти и устранить проблему.</0>",
"rageshake_sending": "Отправка…", "<0>Oops, something's gone wrong.</0>": "<0>Упс, что-то пошло не так.</0>",
"rageshake_sending_logs": "Отправка журнала отладки…", "Expose developer settings in the settings window.": "Раскрыть настройки разработчика в окне настроек.",
"recaptcha_dismissed": "Проверка не пройдена", "Developer Settings": "Настройки Разработчика",
"recaptcha_not_loaded": "Невозможно начать проверку", "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>.",
"register": { "<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>Вы можете отозвать согласие, сняв этот флажок. Если вы в данный момент находитесь в разговоре, эта настройка вступит в силу по окончании разговора.",
"passwords_must_match": "Пароли должны совпадать", "{{displayName}} is presenting": "{{displayName}} представляет",
"registering": "Регистрация…" "<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Мы будем рады видеть ваши отзывы, чтобы мы могли улучшить ваш опыт.</0>",
}, "Thanks, we received your feedback!": "Спасибо. Мы получили ваш отзыв!",
"register_auth_links": "<0>Уже есть аккаунт?</0><1><0>Войти с ним</0> или <2>Зайти как гость</2></1>", "Feedback": "Отзыв",
"register_confirm_password_label": "Подтвердите пароль", "Submit": "Отправить",
"return_home_button": "Вернуться в Начало", "Submitting…": "Отправляем…",
"room_auth_view_join_button": "Присоединиться сейчас", "{{count}} stars|one": "{{count}} отмечен",
"screenshare_button_label": "Поделиться экраном", "{{count}} stars|other": "{{count}} отмеченных",
"select_input_unset_button": "Выберите вариант", "{{displayName}}, your call has ended.": "{{displayName}}, ваш звонок окончен.",
"settings": { "<0>Thanks for your feedback!</0>": "<0>Спасибо за обратную связь!</0>",
"developer_settings_label": "Настройки Разработчика", "Your feedback": "Ваш отзыв",
"developer_settings_label_description": "Раскрыть настройки разработчика в окне настроек.", "How did it go?": "Как всё прошло?",
"developer_tab_title": "Разработчику", "If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Если у вас возникли проблемы или вы просто хотите оставить отзыв, отправьте нам краткое описание ниже.",
"feedback_tab_body": "Если у вас возникли проблемы или вы просто хотите оставить отзыв, отправьте нам краткое описание ниже.", "Show connection stats": "Показать статистику соединения"
"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": "Ожидание других участников…"
} }

View File

@@ -1,140 +1,120 @@
{ {
"a11y": { "Spotlight": "Stredobod",
"user_menu": "Používateľské menu" "Local volume": "Lokálna hlasitosť",
}, "Include debug logs": "Zahrnúť záznamy o ladení",
"action": { "Element Call Home": "Domov Element Call",
"close": "Zatvoriť", "Waiting for other participants…": "Čaká sa na ďalších účastníkov…",
"copy": "Kopírovať", "Submit feedback": "Odoslať spätnú väzbu",
"copy_link": "Kopírovať odkaz", "Share screen": "Zdieľať obrazovku",
"go": "Prejsť", "Sending…": "Odosielanie…",
"invite": "Pozvať", "Sending debug logs…": "Odosielanie záznamov o ladení…",
"no": "Nie", "Send debug logs": "Odoslať záznamy o ladení",
"register": "Registrovať sa", "Select an option": "Vyberte možnosť",
"remove": "Odstrániť", "Return to home screen": "Návrat na domovskú obrazovku",
"sign_in": "Prihlásiť sa", "Remove": "Odstrániť",
"sign_out": "Odhlásiť sa", "Registering…": "Registrácia…",
"submit": "Odoslať" "Register": "Registrovať sa",
}, "Recaptcha not loaded": "Recaptcha sa nenačítala",
"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>.", "Recaptcha dismissed": "Recaptcha zamietnutá",
"app_selection_modal": { "Profile": "Profil",
"continue_in_browser": "Pokračovať v prehliadači", "Passwords must match": "Heslá sa musia zhodovať",
"open_in_app": "Otvoriť v aplikácii", "Password": "Heslo",
"text": "Ste pripravení sa pridať?", "Not registered yet? <2>Create an account</2>": "Ešte nie ste zaregistrovaný? <2>Vytvorte si účet</2>",
"title": "Vybrať aplikáciu" "Not now, return to home screen": "Teraz nie, vrátiť sa na domovskú obrazovku",
}, "No": "Nie",
"browser_media_e2ee_unsupported": "Váš webový prehliadač nepodporuje end-to-end šifrovanie médií. Podporované prehliadače sú Chrome, Safari, Firefox >=117", "More": "Viac",
"call_ended_view": { "Microphone": "Mikrofón",
"body": "Boli ste odpojení z hovoru", "Login to your account": "Prihláste sa do svojho konta",
"create_account_button": "Vytvoriť účet", "Login": "Prihlásiť sa",
"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>", "Logging in…": "Prihlasovanie…",
"feedback_done": "<0> Ďakujeme za vašu spätnú väzbu!</0>", "Loading…": "Načítanie…",
"feedback_prompt": "<0> Radi si vypočujeme vašu spätnú väzbu, aby sme mohli zlepšiť vaše skúsenosti.</0>", "Join existing call?": "Pripojiť sa k existujúcemu hovoru?",
"headline": "{{displayName}}, váš hovor skončil.", "Join call now": "Pripojiť sa k hovoru teraz",
"not_now_button": "Teraz nie, vrátiť sa na domovskú obrazovku", "Join call": "Pripojiť sa k hovoru",
"reconnect_button": "Znovu pripojiť", "Home": "Domov",
"survey_prompt": "Ako to išlo?" "Go": "Prejsť",
}, "Full screen": "Zobrazenie na celú obrazovku",
"call_name": "Názov hovoru", "Exit full screen": "Ukončiť zobrazenie na celú obrazovku",
"common": { "Yes, join call": "Áno, pripojiť sa k hovoru",
"avatar": "Obrázok", "Video": "Video",
"camera": "Kamera", "Version: {{version}}": "Verzia: {{version}}",
"copied": "Skopírované!", "Username": "Meno používateľa",
"display_name": "Zobrazované meno", "User menu": "Používateľské menu",
"encrypted": "Šifrované", "This call already exists, would you like to join?": "Tento hovor už existuje, chceli by ste sa k nemu pripojiť?",
"home": "Domov", "Speaker": "Reproduktor",
"loading": "Načítanie…", "Sign out": "Odhlásiť sa",
"microphone": "Mikrofón", "Sign in": "Prihlásiť sa",
"password": "Heslo", "Settings": "Nastavenia",
"profile": "Profil", "Display name": "Zobrazované meno",
"settings": "Nastavenia", "Developer": "Vývojár",
"unencrypted": "Nie je zašifrované", "Debug log request": "Žiadosť o záznam ladenia",
"username": "Meno používateľa" "Create account": "Vytvoriť účet",
}, "Copy": "Kopírovať",
"disconnected_banner": "Spojenie so serverom sa stratilo.", "Copied!": "Skopírované!",
"exit_fullscreen_button_label": "Ukončiť zobrazenie na celú obrazovku", "Confirm password": "Potvrdiť heslo",
"full_screen_view_description": "<0>Odoslanie záznamov ladenia nám pomôže nájsť problém.</0>", "Close": "Zatvoriť",
"full_screen_view_h1": "<0>Hups, niečo sa pokazilo.</0>", "Camera": "Kamera",
"fullscreen_button_label": "Zobrazenie na celú obrazovku", "Avatar": "Obrázok",
"group_call_loader_failed_heading": "Hovor nebol nájdený", "Audio": "Audio",
"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ľúč.", "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í.",
"hangup_button_label": "Ukončiť hovor", "<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>",
"header_label": "Domov Element Call", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Vytvoriť konto</0> Alebo <2>Prihlásiť sa ako hosť</2>",
"header_participants_label": "Účastníci", "<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>",
"invite_modal": { "<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>",
"link_copied_toast": "Odkaz skopírovaný do schránky", "<0>Oops, something's gone wrong.</0>": "<0>Hups, niečo sa pokazilo.</0>",
"title": "Pozvať na tento hovor" "Expose developer settings in the settings window.": "Zobraziť nastavenia pre vývojárov v okne nastavení.",
}, "Developer Settings": "Nastavenia pre vývojárov",
"join_existing_call_modal": { "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>.",
"join_button": "Áno, pripojiť sa k hovoru", "<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.",
"text": "Tento hovor už existuje, chceli by ste sa k nemu pripojiť?", "Your feedback": "Vaša spätná väzba",
"title": "Pripojiť sa k existujúcemu hovoru?" "Thanks, we received your feedback!": "Ďakujeme, dostali sme vašu spätnú väzbu!",
}, "Submitting…": "Odosielanie…",
"layout_grid_label": "Sieť", "Submit": "Odoslať",
"layout_spotlight_label": "Stredobod", "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.",
"lobby": { "Feedback": "Spätná väzba",
"join_button": "Pripojiť sa k hovoru", "{{count}} stars|one": "{{count}} hviezdička",
"leave_button": "Späť k nedávnym" "How did it go?": "Ako to išlo?",
}, "{{count}} stars|other": "{{count}} hviezdičiek",
"local_volume_label": "Lokálna hlasitosť", "{{displayName}}, your call has ended.": "{{displayName}}, váš hovor skončil.",
"logging_in": "Prihlasovanie…", "<0>Thanks for your feedback!</0>": "<0> Ďakujeme za vašu spätnú väzbu!</0>",
"login_auth_links": "<0>Vytvoriť konto</0> Alebo <2>Prihlásiť sa ako hosť</2>", "<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>",
"login_title": "Prihlásiť sa", "{{displayName}} is presenting": "{{displayName}} prezentuje",
"microphone_off": "Mikrofón vypnutý", "Show connection stats": "Zobraziť štatistiky pripojenia",
"microphone_on": "Mikrofón zapnutý", "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>",
"mute_microphone_button_label": "Stlmiť mikrofón", "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>",
"rageshake_button_error_caption": "Opakovať odoslanie záznamov", "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>",
"rageshake_request_modal": { "Connectivity to the server has been lost.": "Spojenie so serverom sa stratilo.",
"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í.", "Retry sending logs": "Opakovať odoslanie záznamov",
"title": "Žiadosť o záznam ladenia" "Reconnect": "Znovu pripojiť",
}, "Thanks!": "Ďakujeme!",
"rageshake_send_logs": "Odoslať záznamy o ladení", "You were disconnected from the call": "Boli ste odpojení z hovoru",
"rageshake_sending": "Odosielanie…", "{{count, number}}|other": "{{count, number}}",
"rageshake_sending_logs": "Odosielanie záznamov o ladení…", "Encrypted": "Šifrované",
"rageshake_sent": "Ďakujeme!", "End call": "Ukončiť hovor",
"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>", "Microphone off": "Mikrofón vypnutý",
"recaptcha_dismissed": "Recaptcha zamietnutá", "Microphone on": "Mikrofón zapnutý",
"recaptcha_not_loaded": "Recaptcha sa nenačítala", "Grid": "Sieť",
"register": { "Not encrypted": "Nie je zašifrované",
"passwords_must_match": "Heslá sa musia zhodovať", "Sharing screen": "Zdieľanie obrazovky",
"registering": "Registrácia…" "{{count, number}}|one": "{{count, number}}",
}, "You": "Vy",
"register_auth_links": "<0>Už máte konto?</0><1><0>Prihláste sa</0> Alebo <2>Prihlásiť sa ako hosť</2></1>", "Continue in browser": "Pokračovať v prehliadači",
"register_confirm_password_label": "Potvrdiť heslo", "Mute microphone": "Stlmiť mikrofón",
"return_home_button": "Návrat na domovskú obrazovku", "Name of call": "Názov hovoru",
"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>", "Open in the app": "Otvoriť v aplikácii",
"room_auth_view_join_button": "Pripojiť sa k hovoru teraz", "Ready to join?": "Ste pripravení sa pridať?",
"screenshare_button_label": "Zdieľať obrazovku", "Select app": "Vybrať aplikáciu",
"select_input_unset_button": "Vyberte možnosť", "Start new call": "Spustiť nový hovor",
"settings": { "Start video": "Spustiť video",
"developer_settings_label": "Nastavenia pre vývojárov", "Stop video": "Zastaviť video",
"developer_settings_label_description": "Zobraziť nastavenia pre vývojárov v okne nastavení.", "Back to recents": "Späť k nedávnym",
"developer_tab_title": "Vývojár", "Unmute microphone": "Zrušiť stlmenie mikrofónu",
"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.", "Call not found": "Hovor nebol nájdený",
"feedback_tab_description_label": "Vaša spätná väzba", "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ľúč.",
"feedback_tab_h4": "Odoslať spätnú väzbu", "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",
"feedback_tab_send_logs_label": "Zahrnúť záznamy o ladení", "Invite": "Pozvať",
"feedback_tab_thank_you": "Ďakujeme, dostali sme vašu spätnú väzbu!", "Link copied to clipboard": "Odkaz skopírovaný do schránky",
"feedback_tab_title": "Spätná väzba", "Participants": "Účastníci",
"more_tab_title": "Viac", "Copy link": "Kopírovať odkaz",
"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.", "Invite to this call": "Pozvať na tento hovor"
"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…"
} }

View File

@@ -0,0 +1 @@
{}

View File

@@ -1,10 +1,8 @@
{ {
"call_ended_view": { "{{count}} stars|one": "{{count}} stjärna",
"headline": "{{displayName}}, ditt samtal har avslutats." "{{count}} stars|other": "{{count}} stjärnor",
}, "{{count, number}}|one": "{{count, number}}",
"star_rating_input_label_one": "{{count}} stjärna", "{{count, number}}|other": "{{count, number}}",
"star_rating_input_label_other": "{{count}} stjärnor", "{{displayName}} is presenting": "{{displayName}} presenterar",
"video_tile": { "{{displayName}}, your call has ended.": "{{displayName}}, ditt samtal har avslutats."
"presenter_label": "{{displayName}} presenterar"
}
} }

View File

@@ -1,66 +1,51 @@
{ {
"action": { "<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>",
"close": "Kapat", "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.",
"go": "Git", "Audio": "Ses",
"no": "Hayır", "Avatar": "Avatar",
"register": "Kaydol", "Camera": "Kamera",
"remove": "Çıkar", "Close": "Kapat",
"sign_in": "Gir", "Confirm password": "Parolayı tekrar edin",
"sign_out": ık" "Copied!": "Kopyalandı",
}, "Create account": "Hesap aç",
"call_ended_view": { "Debug log request": "Hata ayıklama kütük istemi",
"create_account_button": "Hesap aç", "Developer": "Geliştirici",
"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>", "Display name": "Ekran adı",
"not_now_button": "Şimdi değil, ev ekranına dön" "Exit full screen": "Tam ekranı terk et",
}, "Full screen": "Tam ekran",
"common": { "Go": "Git",
"audio": "Ses", "Home": "Ev",
"camera": "Kamera", "Include debug logs": "Hata ayıklama kütüğünü dahil et",
"copied": "Kopyalandı", "Join call": "Aramaya katıl",
"display_name": "Ekran adı", "Join call now": "Aramaya katıl",
"home": "Ev", "Join existing call?": "Mevcut aramaya katıl?",
"loading": "Yükleniyor…", "Loading": "Yükleniyor…",
"microphone": "Mikrofon", "Local volume": "Yerel ses seviyesi",
"password": "Parola", "Logging in…": "Giriliyor…",
"settings": "Ayarlar" "Login": "Gir",
}, "Login to your account": "Hesabınıza girin",
"exit_fullscreen_button_label": "Tam ekranı terk et", "Microphone": "Mikrofon",
"fullscreen_button_label": "Tam ekran", "More": "Daha",
"join_existing_call_modal": { "No": "Hayır",
"text": "Bu arama zaten var, katılmak ister misiniz?", "Not now, return to home screen": "Şimdi değil, ev ekranına dön",
"title": "Mevcut aramaya katıl?" "Not registered yet? <2>Create an account</2>": "Kaydolmadınız mı? <2>Hesap açın</2>",
}, "Password": "Parola",
"lobby": { "Passwords must match": "Parolalar aynı olmalı",
"join_button": "Aramaya katıl" "Recaptcha dismissed": "reCAPTCHA atlandı",
}, "Recaptcha not loaded": "reCAPTCHA yüklenmedi",
"local_volume_label": "Yerel ses seviyesi", "Register": "Kaydol",
"logging_in": "Giriliyor…", "Registering…": "Kaydediyor…",
"login_auth_links": "<0>Hesap oluştur</0> yahut <2>Konuk olarak gir</2>", "Remove": ıkar",
"login_title": "Gir", "Return to home screen": "Ev ekranına geri dön",
"rageshake_request_modal": { "Select an option": "Bir seçenek seç",
"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.", "Send debug logs": "Hata ayıklama kütüğünü gönder",
"title": "Hata ayıklama kütük istemi" "Sending…": "Gönderiliyor…",
}, "Settings": "Ayarlar",
"rageshake_send_logs": "Hata ayıklama kütüğünü gönder", "Share screen": "Ekran paylaş",
"rageshake_sending": "Gönderiliyor…", "Sign in": "Gir",
"recaptcha_dismissed": "reCAPTCHA atlandı", "Sign out": ık",
"recaptcha_not_loaded": "reCAPTCHA yüklenmedi", "Submit feedback": "Geri bildirim ver",
"register": { "This call already exists, would you like to join?": "Bu arama zaten var, katılmak ister misiniz?",
"passwords_must_match": "Parolalar aynı olmalı", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Hesap oluştur</0> yahut <2>Konuk olarak gir</2>",
"registering": "Kaydediyor…" "<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>"
},
"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"
} }

View File

@@ -1,142 +1,120 @@
{ {
"a11y": { "Loading…": "Завантаження…",
"user_menu": "Меню користувача" "Yes, join call": "Так, приєднатися до виклику",
}, "Waiting for other participants…": "Очікування на інших учасників…",
"action": { "Video": "Відео",
"close": "Закрити", "Version: {{version}}": "Версія: {{version}}",
"copy": "Копіювати", "Username": "Ім'я користувача",
"copy_link": "Скопіювати посилання", "User menu": "Меню користувача",
"go": "Далі", "This call already exists, would you like to join?": "Цей виклик уже існує, бажаєте приєднатися?",
"invite": "Запросити", "Submit feedback": "Надіслати відгук",
"no": "Ні", "Spotlight": "У центрі уваги",
"register": "Зареєструватися", "Speaker": "Динамік",
"remove": "Вилучити", "Sign out": "Вийти",
"sign_in": "Увійти", "Sign in": "Увійти",
"sign_out": "Вийти", "Share screen": "Поділитися екраном",
"submit": "Надіслати" "Settings": "Налаштування",
}, "Sending…": "Надсилання…",
"analytics_notice": "Користуючись дочасним доступом, ви даєте згоду на збір анонімних даних, які ми використовуємо для вдосконалення продукту. Ви можете знайти більше інформації про те, які дані ми відстежуємо в нашій <2>Політиці Приватності</2> і нашій <5>Політиці про куки</5>.", "Sending debug logs…": "Надсилання журналу налагодження…",
"app_selection_modal": { "Send debug logs": "Надіслати журнал налагодження",
"continue_in_browser": "Продовжити у браузері", "Select an option": "Вибрати опцію",
"open_in_app": "Відкрити у застосунку", "Return to home screen": "Повернутися на екран домівки",
"text": "Готові приєднатися?", "Remove": "Вилучити",
"title": "Вибрати застосунок" "Registering…": "Реєстрація…",
}, "Register": "Зареєструватися",
"browser_media_e2ee_unsupported": "Ваш браузер не підтримує наскрізне шифрування мультимедійних даних. Підтримувані браузери: Chrome, Safari, Firefox >=117", "Recaptcha not loaded": "Recaptcha не завантажено",
"call_ended_view": { "Recaptcha dismissed": "Recaptcha не пройдено",
"body": "Вас від'єднано від виклику", "Profile": "Профіль",
"create_account_button": "Створити обліковий запис", "Passwords must match": "Паролі відрізняються",
"create_account_prompt": "<0>Чому б не завершити, налаштувавши пароль для збереження свого облікового запису?</0><1>Ви зможете зберегти своє ім'я та встановити аватарку для подальшого користування під час майбутніх викликів</1>", "Password": "Пароль",
"feedback_done": "<0>Дякуємо за ваш відгук!</0>", "Not registered yet? <2>Create an account</2>": "Ще не зареєстровані? <2>Створіть обліковий запис</2>",
"feedback_prompt": "<0>Ми будемо раді почути ваші відгуки, щоб поліпшити роботу застосунку.</0>", "Not now, return to home screen": "Не зараз, повернутися на екран домівки",
"headline": "{{displayName}}, ваш виклик завершено.", "No": "Ні",
"not_now_button": "Не зараз, повернутися на екран домівки", "More": "Докладніше",
"reconnect_button": "Під'єднати повторно", "Microphone": "Мікрофон",
"survey_prompt": "Вам усе сподобалось?" "Login to your account": "Увійдіть до свого облікового запису",
}, "Login": "Увійти",
"call_name": "Назва виклику", "Logging in…": "Вхід…",
"common": { "Local volume": "Локальна гучність",
"audio": "Звук", "Join existing call?": "Приєднатися до наявного виклику?",
"avatar": "Аватар", "Join call now": "Приєднатися до виклику зараз",
"camera": "Камера", "Join call": "Приєднатися до виклику",
"copied": "Скопійовано!", "Include debug logs": "Долучити журнали налагодження",
"display_name": "Псевдонім", "Home": "Домівка",
"encrypted": "Зашифровано", "Go": "Далі",
"home": "Домівка", "Full screen": "Повноекранний режим",
"loading": "Завантаження…", "Exit full screen": "Вийти з повноекранного режиму",
"microphone": "Мікрофон", "Display name": "Псевдонім",
"password": "Пароль", "Developer": "Розробнику",
"profile": "Профіль", "Debug log request": "Запит журналу налагодження",
"settings": "Налаштування", "Create account": "Створити обліковий запис",
"unencrypted": "Не зашифровано", "Copied!": "Скопійовано!",
"username": "Ім'я користувача", "Confirm password": "Підтвердити пароль",
"video": "Відео" "Close": "Закрити",
}, "Camera": "Камера",
"disconnected_banner": "Втрачено зв'язок з сервером.", "Avatar": "Аватар",
"exit_fullscreen_button_label": "Вийти з повноекранного режиму", "Audio": "Звук",
"full_screen_view_description": "<0>Надсилання журналів налагодження допоможе нам виявити проблему.</0>", "Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Інший користувач у цьому виклику має проблему. Щоб краще визначити ці проблеми, ми хотіли б зібрати журнал налагодження.",
"full_screen_view_h1": "<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>Ви зможете зберегти своє ім'я та встановити аватарку для подальшого користування під час майбутніх викликів</1>",
"fullscreen_button_label": "Повноекранний режим", "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>Створити обліковий запис</0> або <2>Отримати доступ як гість</2>",
"group_call_loader_failed_heading": "Виклик не знайдено", "<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>",
"group_call_loader_failed_text": "Відтепер виклики захищено наскрізним шифруванням, і їх потрібно створювати з домашньої сторінки. Це допомагає переконатися, що всі користувачі використовують один і той самий ключ шифрування.", "Element Call Home": "Домівка Element Call",
"hangup_button_label": "Завершити виклик", "Copy": "Копіювати",
"header_label": "Домівка Element Call", "<0>Submitting debug logs will help us track down the problem.</0>": "<0>Надсилання журналів налагодження допоможе нам виявити проблему.</0>",
"header_participants_label": "Учасники", "<0>Oops, something's gone wrong.</0>": "<0>Йой, щось пішло не за планом.</0>",
"invite_modal": { "Expose developer settings in the settings window.": "Відкрийте налаштування розробника у вікні налаштувань.",
"link_copied_toast": "Посилання скопійовано до буфера обміну", "Developer Settings": "Налаштування розробника",
"title": "Запросити до цього виклику" "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>Ви можете відкликати згоду, прибравши цей прапорець. Якщо ви зараз розмовляєте, це налаштування застосується після завершення виклику.",
"join_existing_call_modal": { "Your feedback": "Ваш відгук",
"join_button": "Так, приєднатися до виклику", "Thanks, we received your feedback!": "Дякуємо, ми отримали ваш відгук!",
"text": "Цей виклик уже існує, бажаєте приєднатися?", "Submitting…": "Надсилання…",
"title": "Приєднатися до наявного виклику?" "Submit": "Надіслати",
}, "If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "Якщо у вас виникли проблеми або ви просто хочете залишити відгук, надішліть нам короткий опис нижче.",
"layout_grid_label": "Сітка", "Feedback": "Відгук",
"layout_spotlight_label": "У центрі уваги", "<0>Thanks for your feedback!</0>": "<0>Дякуємо за ваш відгук!</0>",
"lobby": { "{{count}} stars|one": "{{count}} зірок",
"join_button": "Приєднатися до виклику", "{{count}} stars|other": "{{count}} зірок",
"leave_button": "Повернутися до недавніх" "{{displayName}}, your call has ended.": "{{displayName}}, ваш виклик завершено.",
}, "<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>Ми будемо раді почути ваші відгуки, щоб поліпшити роботу застосунку.</0>",
"local_volume_label": "Локальна гучність", "How did it go?": "Вам усе сподобалось?",
"logging_in": "Вхід…", "{{displayName}} is presenting": "{{displayName}} представляє",
"login_auth_links": "<0>Створити обліковий запис</0> або <2>Отримати доступ як гість</2>", "Show connection stats": "Показати стан з'єднання",
"login_title": "Увійти", "By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Натискаючи \"Далі\", ви погоджуєтеся з нашою <2>Ліцензійною угодою з кінцевим користувачем (EULA)</2>",
"microphone_off": "Мікрофон вимкнено", "By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "Натискаючи \"Приєднатися до виклику зараз\", ви погоджуєтеся з нашою <2>Ліцензійною угодою з кінцевим користувачем (EULA)</2>",
"microphone_on": "Мікрофон увімкнено", "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>",
"mute_microphone_button_label": "Вимкнути мікрофон", "Connectivity to the server has been lost.": "Втрачено зв'язок з сервером.",
"rageshake_button_error_caption": "Повторити надсилання журналів", "Reconnect": "Під'єднати повторно",
"rageshake_request_modal": { "Retry sending logs": "Повторити надсилання журналів",
"body": "Інший користувач у цьому виклику має проблему. Щоб краще визначити ці проблеми, ми хотіли б зібрати журнал налагодження.", "You were disconnected from the call": "Вас від'єднано від виклику",
"title": "Запит журналу налагодження" "Thanks!": "Дякуємо!",
}, "{{count, number}}|other": "{{count, number}}",
"rageshake_send_logs": "Надіслати журнал налагодження", "Encrypted": "Зашифровано",
"rageshake_sending": "Надсилання…", "Microphone on": "Мікрофон увімкнено",
"rageshake_sending_logs": "Надсилання журналу налагодження…", "Not encrypted": "Не зашифровано",
"rageshake_sent": "Дякуємо!", "Sharing screen": "Презентація екрана",
"recaptcha_caption": "Цей сайт захищений ReCAPTCHA і до нього застосовується <2>Політика приватності</2> і <6>Умови надання послуг</6> Google.<9></9>Натискаючи \"Зареєструватися\", ви погоджуєтеся з нашою <12>Ліцензійною угодою з кінцевим користувачем (EULA)</12>", "{{count, number}}|one": "{{count, number}}",
"recaptcha_dismissed": "Recaptcha не пройдено", "End call": "Завершити виклик",
"recaptcha_not_loaded": "Recaptcha не завантажено", "Grid": "Сітка",
"register": { "Microphone off": "Мікрофон вимкнено",
"passwords_must_match": "Паролі відрізняються", "You": "Ви",
"registering": "Реєстрація…" "Mute microphone": "Вимкнути мікрофон",
}, "Open in the app": "Відкрити у застосунку",
"register_auth_links": "<0>Уже маєте обліковий запис?</0><1><0>Увійти</0> Or <2>Отримати доступ як гість</2></1>", "Ready to join?": "Готові приєднатися?",
"register_confirm_password_label": "Підтвердити пароль", "Select app": "Вибрати застосунок",
"return_home_button": "Повернутися на екран домівки", "Start video": "Розпочати відео",
"room_auth_view_eula_caption": "Натискаючи \"Приєднатися до виклику зараз\", ви погоджуєтеся з нашою <2>Ліцензійною угодою з кінцевим користувачем (EULA)</2>", "Stop video": "Зупинити відео",
"room_auth_view_join_button": "Приєднатися до виклику зараз", "Unmute microphone": "Увімкнути мікрофон",
"screenshare_button_label": "Поділитися екраном", "Continue in browser": родовжити у браузері",
"select_input_unset_button": "Вибрати опцію", "Name of call": "Назва виклику",
"settings": { "Start new call": "Розпочати новий виклик",
"developer_settings_label": "Налаштування розробника", "Back to recents": "Повернутися до недавніх",
"developer_settings_label_description": "Відкрийте налаштування розробника у вікні налаштувань.", "Call not found": "Виклик не знайдено",
"developer_tab_title": "Розробнику", "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.": "Відтепер виклики захищено наскрізним шифруванням, і їх потрібно створювати з домашньої сторінки. Це допомагає переконатися, що всі користувачі використовують один і той самий ключ шифрування.",
"feedback_tab_body": "Якщо у вас виникли проблеми або ви просто хочете залишити відгук, надішліть нам короткий опис нижче.", "Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "Ваш браузер не підтримує наскрізне шифрування мультимедійних даних. Підтримувані браузери: Chrome, Safari, Firefox >=117",
"feedback_tab_description_label": "Ваш відгук", "Invite": "Запросити",
"feedback_tab_h4": "Надіслати відгук", "Link copied to clipboard": "Посилання скопійовано до буфера обміну",
"feedback_tab_send_logs_label": "Долучити журнали налагодження", "Participants": "Учасники",
"feedback_tab_thank_you": "Дякуємо, ми отримали ваш відгук!", "Copy link": "Скопіювати посилання",
"feedback_tab_title": "Відгук", "Invite to this call": "Запросити до цього виклику"
"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": "Очікування на інших учасників…"
} }

View File

@@ -1,80 +1,62 @@
{ {
"action": { "Login": "Đăng nhập",
"close": "Đóng", "Join call": "Tham gia cuộc gọi",
"copy": "Sao chép", "Password": "Mật khẩu",
"no": "Không", "Settings": "Cài đặt",
"register": ăng ", "Sending…": ang gửi…",
"sign_in": "Đăng nhập", "Sign in": "Đăng nhập",
"sign_out": "Đăng xuất", "Submit": "Gửi",
"submit": "Gửi" "Video": "Truyền hình",
}, "Username": "Tên người dùng",
"call_ended_view": { "Yes, join call": "Vâng, tham gia cuộc gọi",
"create_account_button": "Tạo tài khoản", "Your feedback": "Phản hồi của bạ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>", "Waiting for other participants…": "Đang đi những người khác…",
"feedback_done": "<0>Cảm hơn vì đã phản hồi!</0>", "Version: {{version}}": "Phiên bản: {{version}}",
"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>", "Submit feedback": "Gửi phản hồi",
"headline": "{{displayName}}, cuộc gọi đã kết thúc." "Speaker": "Loa",
}, "Sign out": "Đăng xuất",
"common": { "Share screen": "Chia sẻ màn hình",
"audio": "Âm thanh", "No": "Không",
"avatar": "Ảnh đại diện", "Join call now": "Tham gia cuộc gọi",
"camera": "Máy quay", "Create account": "Tạo tài khoản",
"copied": "Đã sao chép!", "<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>",
"display_name": "Tên hiển thị", "<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>",
"loading": "Đang tải…", "Avatar": "Ảnh đại diện",
"microphone": "Micrô", "Audio": "Âm thanh",
"password": "Mật khẩu", "Camera": "Máy quay",
"profile": "Hồ sơ", "Copied!": "Đã sao chép!",
"settings": "Cài đặt", "Confirm password": "Xác nhận mật khẩu",
"username": "Tên người dùng", "Close": "Đóng",
"video": "Truyền hình" "Copy": "Sao chép",
}, "Display name": "Tên hiển thị",
"exit_fullscreen_button_label": "Rời chế độ toàn màn hình", "Developer Settings": "Cài đặt phát triển",
"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>", "Developer": "Nhà phát triển",
"full_screen_view_h1": "<0>Ối, có cái gì đó sai.</0>", "Feedback": "Phản hồi",
"fullscreen_button_label": "Toàn màn hình", "Full screen": "Toàn màn hình",
"join_existing_call_modal": { "Include debug logs": "Kèm theo nhật ký gỡ lỗi",
"join_button": "Vâng, tham gia cuộc gọi", "Join existing call?": "Tham gia cuộc gọi?",
"text": "Cuộc gọi đã tồn tại, bạn có muốn tham gia không?", "Loading…": "Đang tải…",
"title": "Tham gia cuộc gọi?" "Logging in…": "Đang đăng nhập…",
}, "Login to your account": "Đăng nhập vào tài khoản của bạn",
"layout_spotlight_label": "Tiêu điểm", "Microphone": "Micrô",
"lobby": { "Not registered yet? <2>Create an account</2>": "Chưa đăng ký? <2>Tạo tài khoản</2>",
"join_button": "Tham gia cuộc gọi" "Passwords must match": "Mật khẩu phải khớp",
}, "Register": "Đăng ký",
"logging_in": "Đang đăng nhập…", "Spotlight": "Tiêu điểm",
"login_auth_links": "<0>Tạo tài khoản</0> Hay <2>Tham gia dưới tên khác</2>", "Submitting…": "Đang gửi…",
"login_title": "Đăng nhập", "Thanks, we received your feedback!": "Cảm ơn, chúng tôi đã nhận được phản hồi!",
"rageshake_request_modal": { "<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>",
"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.", "Exit full screen": "Rời chế độ toàn màn hình",
"title": "Yêu cầu nhật ký gỡ lỗi" "Profile": "Hồ sơ",
}, "Registering…": "Đang đăng ký…",
"rageshake_sending": "Đang gửi…", "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", "Recaptcha not loaded": "Chưa tải được Recaptcha",
"register": { "Debug log request": "Yêu cầu nhật ký gỡ lỗi",
"passwords_must_match": "Mt khẩu phải khớp", "Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "Mt 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.",
"registering": "Đang đăng ký…" "<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>",
"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>", "{{displayName}} is presenting": "{{displayName}} đang trình bày",
"register_confirm_password_label": "Xác nhận mật khẩu", "{{displayName}}, your call has ended.": "{{displayName}}, cuộc gọi đã kết thúc.",
"room_auth_view_join_button": "Tham gia cuộc gọi", "<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>",
"screenshare_button_label": "Chia sẻ màn hình", "<0>Thanks for your feedback!</0>": "<0>Cảm hơn vì đã phản hồi!</0>"
"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…"
} }

View File

@@ -1,135 +1,115 @@
{ {
"a11y": { "Yes, join call": "是,加入通话",
"user_menu": "用户菜单" "Waiting for other participants…": "等待其他参与者……",
}, "Video": "视频",
"action": { "Version: {{version}}": "版本:{{version}}",
"close": "关闭", "Username": "用户名",
"copy": "复制", "User menu": "用户菜单",
"go": "开始", "This call already exists, would you like to join?": "该通话已存在,你想加入吗?",
"no": "", "Submit feedback": "提交反馈",
"register": "注册", "Spotlight": "聚焦模式",
"remove": "移除", "Speaker": "发言人",
"sign_in": "登", "Sign out": "登",
"sign_out": "登", "Sign in": "登",
"submit": "提交" "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.": "这个通话中的另一个用户出现了问题。为了更好地诊断这些问题,我们想收集调试日志。",
"analytics_notice": "参与测试即表示您同意我们收集匿名数据,用于改进产品。您可以在我们的<2>隐私政策</2>和<5>Cookie政策</5>中找到有关我们跟踪哪些数据以及更多信息。", "<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>",
"app_selection_modal": { "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>创建账户</0> Or <2>以访客身份继续</2>",
"continue_in_browser": "在浏览器中继续", "<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>",
"open_in_app": "在应用中打开", "Share screen": "屏幕共享",
"text": "准备好加入了吗?", "Settings": "设置",
"title": "选择应用程序" "Sending…": "正在发送……",
}, "Sending debug logs…": "正在发送调试日志……",
"browser_media_e2ee_unsupported": "您的浏览器不支持媒体端对端加密。支持的浏览器有 Chrome、Safari、Firefox >=117", "Send debug logs": "发送调试日志",
"call_ended_view": { "Select an option": "选择一个选项",
"body": "通话已中断", "Return to home screen": "返回主页",
"create_account_button": "创建账户", "Remove": "移除",
"create_account_prompt": "<0>为何不设置密码来保留你的账户?</0><1>保留昵称并设置头像,以便在未来的通话中使用。</1>", "Registering…": "正在注册……",
"feedback_done": "<0>感谢反馈!</0>", "Register": "注册",
"feedback_prompt": "<0>我们需要您的反馈以提升用户体验。</0>", "Recaptcha not loaded": "recaptcha未加载",
"headline": "{{displayName}},通话已结束。", "Recaptcha dismissed": "人机验证失败",
"not_now_button": "暂不,返回主页", "Profile": "个人信息",
"reconnect_button": "重新连接", "Passwords must match": "密码必须匹配",
"survey_prompt": "进展如何?" "Password": "密码",
}, "Not registered yet? <2>Create an account</2>": "还没有注册? <2>创建账户<2>",
"call_name": "通话名称", "Not now, return to home screen": "暂不,返回主页",
"common": { "No": "否",
"audio": "音频", "More": "更多",
"avatar": "头像", "Microphone": "麦克风",
"camera": "摄像头", "Login to your account": "登录你的账户",
"copied": "已复制!", "Login": "登录",
"display_name": "显示名称", "Logging in…": "登录中……",
"encrypted": "已加密", "Local volume": "本地音量",
"home": "主页", "Loading…": "加载中……",
"loading": "加载中……", "Join existing call?": "是否加入现有的通话?",
"microphone": "麦克风", "Join call now": "现在加入通话",
"password": "密码", "Join call": "加入通话",
"profile": "个人信息", "Include debug logs": "包含调试日志",
"settings": "设置", "Home": "主页",
"unencrypted": "未加密", "Go": "开始",
"username": "用户名", "Full screen": "全屏",
"video": "视频" "Exit full screen": "退出全屏",
}, "Element Call Home": "Element Call主页",
"disconnected_banner": "与服务器的连接中断。", "Display name": "显示名称",
"exit_fullscreen_button_label": "退出全屏", "Developer": "开发者",
"full_screen_view_description": "<0>提交日志以帮助我们修复问题。</0>", "Debug log request": "调试日志请求",
"full_screen_view_h1": "<0>哎哟,出问题了。</0>", "Create account": "创建账户",
"fullscreen_button_label": "全屏", "Copy": "复制",
"group_call_loader_failed_heading": "未找到通话", "Copied!": "已复制!",
"group_call_loader_failed_text": "现在,通话是端对端加密的,需要从主页创建。这有助于确保每个人都使用相同的加密密钥。", "Confirm password": "确认密码",
"hangup_button_label": "通话结束", "Close": "关闭",
"header_label": "Element Call主页", "Camera": "摄像头",
"join_existing_call_modal": { "Avatar": "头像",
"join_button": "是,加入通话", "<0>Oops, something's gone wrong.</0>": "<0>哎哟,出问题了。</0>",
"text": "该通话已存在,你想加入吗?", "<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>您可以取消选中复选框来撤回同意。如果正在通话中,此设置将在通话结束时生效。",
"title": "是否加入现有的通话?" "Encrypted": "已加密",
}, "End call": "通话结束",
"layout_grid_label": "网格", "Grid": "网格",
"layout_spotlight_label": "聚焦模式", "Microphone off": "麦克风关闭",
"lobby": { "Microphone on": "麦克风开启",
"join_button": "加入通话", "Not encrypted": "未加密",
"leave_button": "返回最近通话" "{{count, number}}|one": "{{count, number}}",
}, "{{count, number}}|other": "{{count, number}}",
"local_volume_label": "本地音量", "Sharing screen": "屏幕共享",
"logging_in": "登录中……", "You": "",
"login_auth_links": "<0>创建账户</0> Or <2>以访客身份继续</2>", "Continue in browser": "在浏览器中继续",
"login_title": "登录", "Mute microphone": "静音麦克风",
"microphone_off": "麦克风关闭", "Name of call": "通话名称",
"microphone_on": "麦克风开启", "Open in the app": "在应用中打开",
"mute_microphone_button_label": "静音麦克风", "Ready to join?": "准备好加入了吗?",
"rageshake_button_error_caption": "重传日志", "Back to recents": "返回最近通话",
"rageshake_request_modal": { "Select app": "选择应用程序",
"body": "这个通话中的另一个用户出现了问题。为了更好地诊断这些问题,我们想收集调试日志。", "Start new call": "开始新通话",
"title": "调试日志请求" "Start video": "开始视频",
}, "Stop video": "停止视频",
"rageshake_send_logs": "发送调试日志", "Unmute microphone": "取消麦克风静音",
"rageshake_sending": "正在发送……", "Call not found": "未找到通话",
"rageshake_sending_logs": "正在发送调试日志……", "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.": "现在,通话是端对端加密的,需要从主页创建。这有助于确保每个人都使用相同的加密密钥。",
"rageshake_sent": "谢谢!", "Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "您的浏览器不支持媒体端对端加密。支持的浏览器有 Chrome、Safari、Firefox >=117",
"recaptcha_caption": "该站点受 ReCAPTCHA 保护适用于Google的 <2>隐私政策</2>和 <6>服务条款</6>。 <9></9>点击 \"注册\",即表示您同意我们的 <12>最终用户许可协议 (EULA)</12>", "{{count}} stars|other": "{{count}} 个星",
"recaptcha_dismissed": "人机验证失败", "{{displayName}} is presenting": "{{displayName}}正在展示",
"recaptcha_not_loaded": "recaptcha未加载", "{{displayName}}, your call has ended.": "{{displayName}},通话已结束。",
"register": { "<0>Submitting debug logs will help us track down the problem.</0>": "<0>提交日志以帮助我们修复问题。</0>",
"passwords_must_match": "密码必须匹配", "<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>我们需要您的反馈以提升用户体验。</0>",
"registering": "正在注册……" "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.": "在设置中显示开发者设置。",
"register_auth_links": "<0>已有账户?</0><1><0>登录</0> Or <2>以访客身份继续</2></1>", "Show connection stats": "显示连接统计信息",
"register_confirm_password_label": "确认密码", "Thanks, we received your feedback!": "谢谢,我们收到了反馈!",
"return_home_button": "返回主页", "By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "点击 \"开始\",即表示您同意我们的<2>最终用户许可协议 (EULA)</2>",
"room_auth_view_eula_caption": "点击 \"加入通话\",即表示您同意我们的<2>最终用户许可协议 (EULA)</2>", "By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "点击 \"加入通话\",即表示您同意我们的<2>最终用户许可协议 (EULA)</2>",
"room_auth_view_join_button": "现在加入通话", "{{count}} stars|one": "{{count}} 个星",
"screenshare_button_label": "屏幕共享", "<0>Thanks for your feedback!</0>": "<0>感谢反馈!</0>",
"select_input_unset_button": "选择一个选项", "Your feedback": "您的反馈",
"settings": { "Connectivity to the server has been lost.": "与服务器的连接中断。",
"developer_settings_label": "开发者设置", "Developer Settings": "开发者设置",
"developer_settings_label_description": "在设置中显示开发者设置。", "Feedback": "反馈",
"developer_tab_title": "开发者", "Submit": "提交",
"feedback_tab_body": "如果遇到问题或想提供一些反馈意见,请在下面向我们发送简短描述。", "Reconnect": "重新连接",
"feedback_tab_description_label": "您的反馈", "How did it go?": "进展如何?",
"feedback_tab_h4": "提交反馈", "If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "如果遇到问题或想提供一些反馈意见,请在下面向我们发送简短描述。",
"feedback_tab_send_logs_label": "包含调试日志", "Retry sending logs": "重传日志",
"feedback_tab_thank_you": "谢谢,我们收到了反馈!", "Submitting…": "提交中…",
"feedback_tab_title": "反馈", "Thanks!": "谢谢!",
"more_tab_title": "更多", "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>",
"opt_in_description": "<0></0><1></1>您可以取消选中复选框来撤回同意。如果正在通话中,此设置将在通话结束时生效。", "You were disconnected from the call": "通话已中断"
"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": "等待其他参与者……"
} }

View File

@@ -1,142 +1,120 @@
{ {
"a11y": { "<0>Create an account</0> Or <2>Access as a guest</2>": "<0>建立帳號</0> 或<2>以訪客身份登入</2>",
"user_menu": "使用者選單" "<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.": "在設定視窗中顯示開發者設定。",
"action": { "Developer Settings": "開發者設定",
"close": "關閉", "<0>Submitting debug logs will help us track down the problem.</0>": "<0>送出除錯紀錄,可幫助我們修正問題。</0>",
"copy": "複製", "<0>Oops, something's gone wrong.</0>": "<0>喔喔,有些地方怪怪的。</0>",
"copy_link": "複製連結", "Yes, join call": "是,加入對話",
"go": "前往", "Waiting for other participants…": "等待其他參加者…",
"invite": "邀請", "Video": "視訊",
"no": "否", "Version: {{version}}": "版本: {{version}}",
"register": "註冊", "Username": "使用者名稱",
"remove": "移除", "User menu": "使用者選單",
"sign_in": "登入", "This call already exists, would you like to join?": "通話已經開始,請問您要加入嗎?",
"sign_out": "登出", "Submit feedback": "遞交回覆",
"submit": "遞交" "Spotlight": "聚焦",
}, "Speaker": "發言者",
"analytics_notice": "參與此測試版即表示您同意蒐集匿名資料,我們使用這些資料來改進產品。您可以在我們的<2>隱私政策</2>與我們的 <5>Cookie 政策</5> 中找到關於我們追蹤哪些資料的更多資訊。", "Sign out": "登出",
"app_selection_modal": { "Sign in": "登入",
"continue_in_browser": "在瀏覽器中繼續", "Share screen": "分享畫面",
"open_in_app": "在應用程式中開啟", "Settings": "設定",
"text": "準備好加入了?", "Sending…": "傳送中…",
"title": "選取應用程式" "Sending debug logs…": "傳送除錯記錄檔中…",
}, "Send debug logs": "傳送除錯紀錄",
"browser_media_e2ee_unsupported": "您的網路瀏覽器不支援媒體端到端加密。支援的瀏覽器包含了 Chrome、Safari、Firefox >=117", "Select an option": "選擇一個選項",
"call_ended_view": { "Return to home screen": "回到首頁",
"body": "您已從通話斷線", "Remove": "移除",
"create_account_button": "建立帳號", "Registering…": "註冊中…",
"create_account_prompt": "<0>何不設定密碼以保留此帳號?</0><1>您可以保留暱稱並設定頭像,以便未來通話時使用</1>", "Register": "註冊",
"feedback_done": "<0>感謝您的回饋!</0>", "Recaptcha not loaded": "驗證碼未載入",
"feedback_prompt": "<0>我們想要聽到您的回饋,如此我們才能改善您的體驗。</0>", "Recaptcha dismissed": "略過驗證碼",
"headline": "{{displayName}},您的通話已結束。", "Profile": "個人檔案",
"not_now_button": "現在不行,回到首頁", "Passwords must match": "密碼必須相符",
"reconnect_button": "重新連線", "Password": "密碼",
"survey_prompt": "進展如何?" "Not registered yet? <2>Create an account</2>": "還沒註冊嗎?<2>建立帳號</2>",
}, "Not now, return to home screen": "現在不行,回到首頁",
"call_name": "通話名稱", "No": "",
"common": { "More": "更多",
"audio": "語音", "Microphone": "麥克風",
"avatar": "大頭照", "Login to your account": "登入您的帳號",
"camera": "相機", "Login": "登入",
"copied": "已複製!", "Logging in…": "登入中…",
"display_name": "顯示名稱", "Local volume": "您的音量",
"encrypted": "已加密", "Loading…": "載入中…",
"home": "首頁", "Join existing call?": "加入已開始的通話嗎?",
"loading": "載入中…", "Join call now": "現在加入通話",
"microphone": "麥克風", "Join call": "加入通話",
"password": "密碼", "Include debug logs": "包含除錯紀錄",
"profile": "個人檔案", "Home": "首頁",
"settings": "設定", "Go": "前往",
"unencrypted": "未加密", "Full screen": "全螢幕",
"username": "使用者名稱", "Exit full screen": "退出全螢幕",
"video": "視訊" "Element Call Home": "Element Call 首頁",
}, "Display name": "顯示名稱",
"disconnected_banner": "到伺服器的連線已遺失。", "Developer": "開發者",
"exit_fullscreen_button_label": "退出全螢幕", "Debug log request": "請求偵錯報告",
"full_screen_view_description": "<0>送出除錯紀錄,可幫助我們修正問題。</0>", "Create account": "建立帳號",
"full_screen_view_h1": "<0>喔喔,有些地方怪怪的。</0>", "Copy": "複製",
"fullscreen_button_label": "全螢幕", "Copied!": "已複製!",
"group_call_loader_failed_heading": "找不到通話", "Confirm password": "確認密碼",
"group_call_loader_failed_text": "通話現在是端對端加密的,必須從首頁建立。這有助於確保每個人都使用相同的加密金鑰。", "Close": "關閉",
"hangup_button_label": "結束通話", "Camera": "相機",
"header_label": "Element Call 首頁", "Avatar": "大頭照",
"header_participants_label": "參與者", "Audio": "語音",
"invite_modal": { "Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.": "這通對話中的另一位使用者遇到了某些問題。為了診斷問題,我們將會建立除錯紀錄。",
"link_copied_toast": "連結已複製到剪貼簿", "<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>",
"title": "邀請到此通話" "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>您可以透過取消核取此方塊來撤回同意。若您目前正在通話中,此設定將在通話結束時生效。",
"join_existing_call_modal": { "Your feedback": "您的回饋",
"join_button": "是,加入對話", "Thanks, we received your feedback!": "感謝,我們已經收到您的回饋了!",
"text": "通話已經開始,請問您要加入嗎?", "Submitting…": "正在遞交……",
"title": "加入已開始的通話嗎?" "Submit": "遞交",
}, "If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.": "若您遇到問題或只是想提供一些回饋,請在下方傳送簡短說明給我們。",
"layout_grid_label": "網格", "Feedback": "回饋",
"layout_spotlight_label": "聚焦", "{{count}} stars|other": "{{count}} 個星星",
"lobby": { "<0>Thanks for your feedback!</0>": "<0>感謝您的回饋!</0>",
"join_button": "加入通話", "<0>We'd love to hear your feedback so we can improve your experience.</0>": "<0>我們想要聽到您的回饋,如此我們才能改善您的體驗。</0>",
"leave_button": "回到最近的通話" "{{count}} stars|one": "{{count}} 個星星",
}, "{{displayName}}, your call has ended.": "{{displayName}},您的通話已結束。",
"local_volume_label": "您的音量", "How did it go?": "進展如何?",
"logging_in": "登入中…", "{{displayName}} is presenting": "{{displayName}} 正在展示",
"login_auth_links": "<0>建立帳號</0> 或<2>以訪客身份登入</2>", "Show connection stats": "顯示連線統計資料",
"login_title": "登入", "By clicking \"Go\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "點擊「前往」即表示您同意我們的<2>終端使用者授權協議 (EULA)</2>",
"microphone_off": "麥克風關閉", "By clicking \"Join call now\", you agree to our <2>End User Licensing Agreement (EULA)</2>": "點擊「立刻加入通話」即表示您同意我們的<2>終端使用者授權協議 (EULA)</2>",
"microphone_on": "麥克風開啟", "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>",
"mute_microphone_button_label": "將麥克風靜音", "Connectivity to the server has been lost.": "到伺服器的連線已遺失。",
"rageshake_button_error_caption": "重試傳送紀錄檔", "Reconnect": "重新連線",
"rageshake_request_modal": { "Retry sending logs": "重試傳送紀錄檔",
"body": "這通對話中的另一位使用者遇到了某些問題。為了診斷問題,我們將會建立除錯紀錄。", "Thanks!": "感謝!",
"title": "請求偵錯報告" "You were disconnected from the call": "您已從通話斷線",
}, "{{count, number}}|one": "{{count, number}}",
"rageshake_send_logs": "傳送除錯紀錄", "{{count, number}}|other": "{{count, number}}",
"rageshake_sending": "傳送中…", "Encrypted": "已加密",
"rageshake_sending_logs": "傳送除錯記錄檔中…", "End call": "結束通話",
"rageshake_sent": "感謝!", "Grid": "網格",
"recaptcha_caption": "此網站被 ReCAPTCHA 保護,並適用 Google 的<2>隱私權政策</2>與<6>服務條款</6>。<9></9>點擊「註冊」即表示您同意我們的<12>終端使用者授權協議 (EULA)</12>", "Microphone off": "麥克風關閉",
"recaptcha_dismissed": "略過驗證碼", "Microphone on": "麥克風開啟",
"recaptcha_not_loaded": "驗證碼未載入", "Not encrypted": "未加密",
"register": { "Sharing screen": "分享畫面",
"passwords_must_match": "密碼必須相符", "You": "",
"registering": "註冊中…" "Continue in browser": "在瀏覽器中繼續",
}, "Mute microphone": "將麥克風靜音",
"register_auth_links": "<0>已經有帳號?</0><1><0>登入</0> 或<2>以訪客身份登入</2></1>", "Name of call": "通話名稱",
"register_confirm_password_label": "確認密碼", "Open in the app": "在應用程式中開啟",
"return_home_button": "回到首頁", "Ready to join?": "準備好加入了?",
"room_auth_view_eula_caption": "點擊「立刻加入通話」即表示您同意我們的<2>終端使用者授權協議 (EULA)</2>", "Select app": "選取應用程式",
"room_auth_view_join_button": "現在加入通話", "Start new call": "開始新通話",
"screenshare_button_label": "分享畫面", "Start video": "開始影片",
"select_input_unset_button": "選擇一個選項", "Back to recents": "回到最近的通話",
"settings": { "Stop video": "停止影片",
"developer_settings_label": "開發者設定", "Unmute microphone": "將麥克風取消靜音",
"developer_settings_label_description": "在設定視窗中顯示開發者設定。", "Call not found": "找不到通話",
"developer_tab_title": "開發者", "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.": "通話現在是端對端加密的,必須從首頁建立。這有助於確保每個人都使用相同的加密金鑰。",
"feedback_tab_body": "若您遇到問題或只是想提供一些回饋,請在下方傳送簡短說明給我們。", "Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117": "您的網路瀏覽器不支援媒體端到端加密。支援的瀏覽器包含了 Chrome、Safari、Firefox >=117",
"feedback_tab_description_label": "您的回饋", "Copy link": "複製連結",
"feedback_tab_h4": "遞交回覆", "Invite": "邀請",
"feedback_tab_send_logs_label": "包含除錯紀錄", "Invite to this call": "邀請到此通話",
"feedback_tab_thank_you": "感謝,我們已經收到您的回饋了!", "Link copied to clipboard": "連結已複製到剪貼簿",
"feedback_tab_title": "回饋", "Participants": "參與者"
"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": "等待其他參加者…"
} }

View File

@@ -1,29 +0,0 @@
/*
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;
};
}
}

View File

@@ -257,7 +257,9 @@ export const ClientProvider: FC<Props> = ({ children }) => {
"message", "message",
useCallback(() => { useCallback(() => {
initClientState?.client.stopClient(); initClientState?.client.stopClient();
setAlreadyOpenedErr(translatedError("application_opened_another_tab", t)); setAlreadyOpenedErr(
translatedError("This application has been opened in another tab.", t),
);
}, [initClientState?.client, setAlreadyOpenedErr, t]), }, [initClientState?.client, setAlreadyOpenedErr, t]),
); );

View File

@@ -45,7 +45,7 @@ export const DisconnectedBanner: FC<Props> = ({
{shouldShowBanner && ( {shouldShowBanner && (
<div className={classNames(styles.banner, className)} {...rest}> <div className={classNames(styles.banner, className)} {...rest}>
{children} {children}
{t("disconnected_banner")} {t("Connectivity to the server has been lost.")}
</div> </div>
)} )}
</> </>

View File

@@ -71,7 +71,7 @@ export const ErrorView: FC<ErrorViewProps> = ({ error }) => {
return ( return (
<FullScreenView> <FullScreenView>
<h1>{t("common.error")}</h1> <h1>Error</h1>
<p> <p>
{error instanceof TranslatedError {error instanceof TranslatedError
? error.translatedMessage ? error.translatedMessage
@@ -85,7 +85,7 @@ export const ErrorView: FC<ErrorViewProps> = ({ error }) => {
className={styles.homeLink} className={styles.homeLink}
onPress={onReload} onPress={onReload}
> >
{t("return_home_button")} {t("Return to home screen")}
</Button> </Button>
) : ( ) : (
<LinkButton <LinkButton
@@ -94,7 +94,7 @@ export const ErrorView: FC<ErrorViewProps> = ({ error }) => {
className={styles.homeLink} className={styles.homeLink}
to="/" to="/"
> >
{t("return_home_button")} {t("Return to home screen")}
</LinkButton> </LinkButton>
)} )}
</FullScreenView> </FullScreenView>
@@ -110,11 +110,11 @@ export const CrashView: FC = () => {
return ( return (
<FullScreenView> <FullScreenView>
<Trans i18nKey="full_screen_view_h1"> <Trans>
<h1>Oops, something's gone wrong.</h1> <h1>Oops, something's gone wrong.</h1>
</Trans> </Trans>
{Config.get().rageshake?.submit_url && ( {Config.get().rageshake?.submit_url && (
<Trans i18nKey="full_screen_view_description"> <Trans>
<p>Submitting debug logs will help us track down the problem.</p> <p>Submitting debug logs will help us track down the problem.</p>
</Trans> </Trans>
)} )}
@@ -126,7 +126,7 @@ export const CrashView: FC = () => {
className={styles.wideButton} className={styles.wideButton}
onPress={onReload} onPress={onReload}
> >
{t("return_home_button")} {t("Return to home screen")}
</Button> </Button>
</FullScreenView> </FullScreenView>
); );
@@ -137,7 +137,7 @@ export const LoadingView: FC = () => {
return ( return (
<FullScreenView> <FullScreenView>
<h1>{t("common.loading")}</h1> <h1>{t("Loading")}</h1>
</FullScreenView> </FullScreenView>
); );
}; };

View File

@@ -105,7 +105,7 @@ export const HeaderLogo: FC<HeaderLogoProps> = ({ className }) => {
<Link <Link
className={classNames(styles.headerLogo, className)} className={classNames(styles.headerLogo, className)}
to="/" to="/"
aria-label={t("header_label")} aria-label={t("Element Call Home")}
> >
<Logo /> <Logo />
</Link> </Link>
@@ -155,10 +155,10 @@ export const RoomHeaderInfo: FC<RoomHeaderInfoProps> = ({
<UserProfileIcon <UserProfileIcon
width={20} width={20}
height={20} height={20}
aria-label={t("header_participants_label")} aria-label={t("Participants")}
/> />
<Text as="span" size="sm" weight="medium"> <Text as="span" size="sm" weight="medium">
{t("participant_count", { count: participantCount })} {t("{{count, number}}", { count: participantCount })}
</Text> </Text>
</div> </div>
)} )}

View File

@@ -136,7 +136,7 @@ export const Modal: FC<Props> = ({
<DialogClose <DialogClose
className={styles.close} className={styles.close}
data-testid="modal_close" data-testid="modal_close"
aria-label={t("action.close")} aria-label={t("Close")}
> >
<CloseIcon width={20} height={20} /> <CloseIcon width={20} height={20} />
</DialogClose> </DialogClose>

View File

@@ -16,9 +16,6 @@ limitations under the License.
import i18n from "i18next"; import i18n from "i18next";
import type { ParseKeys, TFunction } from "i18next/typescript/t";
import type { DefaultNamespace, TOptions } from "i18next/typescript/options";
/** /**
* An error with messages in both English and the user's preferred language. * An error with messages in both English and the user's preferred language.
*/ */
@@ -30,11 +27,8 @@ export abstract class TranslatedError extends Error {
*/ */
public readonly translatedMessage: string; public readonly translatedMessage: string;
public constructor( public constructor(messageKey: string, translationFn: typeof i18n.t) {
messageKey: ParseKeys<DefaultNamespace, TOptions>, super(translationFn(messageKey, { lng: "en-GB" }));
translationFn: TFunction<DefaultNamespace>,
) {
super(translationFn(messageKey, { lng: "en-GB" } as TOptions));
this.translatedMessage = translationFn(messageKey); this.translatedMessage = translationFn(messageKey);
} }
} }
@@ -44,6 +38,6 @@ class TranslatedErrorImpl extends TranslatedError {}
// i18next-parser can't detect calls to a constructor, so we expose a bare // i18next-parser can't detect calls to a constructor, so we expose a bare
// function instead // function instead
export const translatedError = ( export const translatedError = (
messageKey: ParseKeys<DefaultNamespace, TOptions>, messageKey: string,
t: typeof i18n.t, t: typeof i18n.t,
): TranslatedError => new TranslatedErrorImpl(messageKey, t); ): TranslatedError => new TranslatedErrorImpl(messageKey, t);

View File

@@ -32,7 +32,7 @@ interface RoomIdentifier {
// the situations that call for this behavior ('isEmbedded'). This makes it // the situations that call for this behavior ('isEmbedded'). This makes it
// clearer what each flag means, and helps us avoid coupling Element Call's // clearer what each flag means, and helps us avoid coupling Element Call's
// behavior to the needs of specific consumers. // behavior to the needs of specific consumers.
export interface UrlParams { interface UrlParams {
// Widget api related params // Widget api related params
widgetId: string | null; widgetId: string | null;
parentUrl: string | null; parentUrl: string | null;
@@ -115,10 +115,6 @@ export interface UrlParams {
* E2EE password * E2EE password
*/ */
password: string | null; password: string | null;
/**
* Whether we the app should use per participant keys for E2EE.
*/
perParticipantE2EE: boolean;
/** /**
* Setting this flag skips the lobby and brings you in the call directly. * Setting this flag skips the lobby and brings you in the call directly.
* In the widget this can be combined with preload to pass the device settings * In the widget this can be combined with preload to pass the device settings
@@ -221,7 +217,6 @@ export const getUrlParams = (
fontScale: Number.isNaN(fontScale) ? null : fontScale, fontScale: Number.isNaN(fontScale) ? null : fontScale,
analyticsID: parser.getParam("analyticsID"), analyticsID: parser.getParam("analyticsID"),
allowIceFallback: parser.getFlagParam("allowIceFallback"), allowIceFallback: parser.getFlagParam("allowIceFallback"),
perParticipantE2EE: parser.getFlagParam("perParticipantE2EE"),
skipLobby: parser.getFlagParam("skipLobby"), skipLobby: parser.getFlagParam("skipLobby"),
}; };
}; };

View File

@@ -66,13 +66,13 @@ export const UserMenu: FC<Props> = ({
arr.push({ arr.push({
key: "settings", key: "settings",
icon: SettingsIcon, icon: SettingsIcon,
label: t("common.settings"), label: t("Settings"),
}); });
if (isPasswordlessUser && !preventNavigation) { if (isPasswordlessUser && !preventNavigation) {
arr.push({ arr.push({
key: "login", key: "login",
label: t("action.sign_in"), label: t("Sign in"),
icon: LoginIcon, icon: LoginIcon,
dataTestid: "usermenu_login", dataTestid: "usermenu_login",
}); });
@@ -81,7 +81,7 @@ export const UserMenu: FC<Props> = ({
if (!isPasswordlessUser && !preventNavigation) { if (!isPasswordlessUser && !preventNavigation) {
arr.push({ arr.push({
key: "logout", key: "logout",
label: t("action.sign_out"), label: t("Sign out"),
icon: LogoutIcon, icon: LogoutIcon,
dataTestid: "usermenu_logout", dataTestid: "usermenu_logout",
}); });
@@ -91,12 +91,12 @@ export const UserMenu: FC<Props> = ({
return arr; return arr;
}, [isAuthenticated, isPasswordlessUser, displayName, preventNavigation, t]); }, [isAuthenticated, isPasswordlessUser, displayName, preventNavigation, t]);
const tooltip = useCallback(() => t("common.profile"), [t]); const tooltip = useCallback(() => t("Profile"), [t]);
if (!isAuthenticated) { if (!isAuthenticated) {
return ( return (
<LinkButton to={{ pathname: "/login", state: { from: location } }}> <LinkButton to={{ pathname: "/login", state: { from: location } }}>
{t("log_in")} Log in
</LinkButton> </LinkButton>
); );
} }
@@ -124,7 +124,7 @@ export const UserMenu: FC<Props> = ({
{ {
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
(props: any): ReactNode => ( (props: any): ReactNode => (
<Menu {...props} label={t("a11y.user_menu")} onAction={onAction}> <Menu {...props} label={t("User menu")} onAction={onAction}>
{items.map(({ key, icon: Icon, label, dataTestid }) => ( {items.map(({ key, icon: Icon, label, dataTestid }) => (
<Item key={key} textValue={label}> <Item key={key} textValue={label}>
<Icon <Icon

View File

@@ -20,7 +20,7 @@ import { Trans } from "react-i18next";
import { Link } from "../typography/Typography"; import { Link } from "../typography/Typography";
export const AnalyticsNotice: FC = () => ( export const AnalyticsNotice: FC = () => (
<Trans i18nKey="analytics_notice"> <Trans>
By participating in this beta, you consent to the collection of anonymous 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 data, which we use to improve the product. You can find more information
about which data we track in our{" "} about which data we track in our{" "}

View File

@@ -30,7 +30,7 @@ import { Config } from "../config/Config";
export const LoginPage: FC = () => { export const LoginPage: FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();
usePageTitle(t("login_title")); usePageTitle(t("Login"));
const { setClient } = useClient(); const { setClient } = useClient();
const login = useInteractiveLogin(); const login = useInteractiveLogin();
@@ -90,15 +90,15 @@ export const LoginPage: FC = () => {
<div className={styles.formContainer}> <div className={styles.formContainer}>
<Logo width="auto" height="auto" className={styles.logo} /> <Logo width="auto" height="auto" className={styles.logo} />
<h2>{t("log_in")}</h2> <h2>Log In</h2>
<h4>{t("login_subheading")}</h4> <h4>To continue to Element</h4>
<form onSubmit={onSubmitLoginForm}> <form onSubmit={onSubmitLoginForm}>
<FieldRow> <FieldRow>
<InputField <InputField
type="text" type="text"
ref={usernameRef} ref={usernameRef}
placeholder={t("common.username")} placeholder={t("Username")}
label={t("common.username")} label={t("Username")}
autoCorrect="off" autoCorrect="off"
autoCapitalize="none" autoCapitalize="none"
prefix="@" prefix="@"
@@ -110,8 +110,8 @@ export const LoginPage: FC = () => {
<InputField <InputField
type="password" type="password"
ref={passwordRef} ref={passwordRef}
placeholder={t("common.password")} placeholder={t("Password")}
label={t("common.password")} label={t("Password")}
data-testid="login_password" data-testid="login_password"
/> />
</FieldRow> </FieldRow>
@@ -126,15 +126,15 @@ export const LoginPage: FC = () => {
disabled={loading} disabled={loading}
data-testid="login_login" data-testid="login_login"
> >
{loading ? t("logging_in") : t("login_title")} {loading ? t("Logging in") : t("Login")}
</Button> </Button>
</FieldRow> </FieldRow>
</form> </form>
</div> </div>
<div className={styles.authLinks}> <div className={styles.authLinks}>
<p>{t("login_auth_links_prompt")}</p> <p>Not registered yet?</p>
<p> <p>
<Trans i18nKey="login_auth_links"> <Trans>
<Link to="/register">Create an account</Link> <Link to="/register">Create an account</Link>
{" Or "} {" Or "}
<Link to="/">Access as a guest</Link> <Link to="/">Access as a guest</Link>

View File

@@ -44,7 +44,7 @@ import { Config } from "../config/Config";
export const RegisterPage: FC = () => { export const RegisterPage: FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();
usePageTitle(t("action.register")); usePageTitle(t("Register"));
const { loading, authenticated, passwordlessUser, client, setClient } = const { loading, authenticated, passwordlessUser, client, setClient } =
useClientLegacy(); useClientLegacy();
@@ -140,9 +140,7 @@ export const RegisterPage: FC = () => {
useEffect(() => { useEffect(() => {
if (password && passwordConfirmation && password !== passwordConfirmation) { if (password && passwordConfirmation && password !== passwordConfirmation) {
confirmPasswordRef.current?.setCustomValidity( confirmPasswordRef.current?.setCustomValidity(t("Passwords must match"));
t("register.passwords_must_match"),
);
} else { } else {
confirmPasswordRef.current?.setCustomValidity(""); confirmPasswordRef.current?.setCustomValidity("");
} }
@@ -166,14 +164,14 @@ export const RegisterPage: FC = () => {
<div className={styles.content}> <div className={styles.content}>
<div className={styles.formContainer}> <div className={styles.formContainer}>
<Logo width="auto" height="auto" className={styles.logo} /> <Logo width="auto" height="auto" className={styles.logo} />
<h2>{t("register_heading")}</h2> <h2>Create your account</h2>
<form onSubmit={onSubmitRegisterForm}> <form onSubmit={onSubmitRegisterForm}>
<FieldRow> <FieldRow>
<InputField <InputField
type="text" type="text"
name="userName" name="userName"
placeholder={t("common.username")} placeholder={t("Username")}
label={t("common.username")} label={t("Username")}
autoCorrect="off" autoCorrect="off"
autoCapitalize="none" autoCapitalize="none"
prefix="@" prefix="@"
@@ -190,8 +188,8 @@ export const RegisterPage: FC = () => {
setPassword(e.target.value) setPassword(e.target.value)
} }
value={password} value={password}
placeholder={t("common.password")} placeholder={t("Password")}
label={t("common.password")} label={t("Password")}
data-testid="register_password" data-testid="register_password"
/> />
</FieldRow> </FieldRow>
@@ -204,14 +202,14 @@ export const RegisterPage: FC = () => {
setPasswordConfirmation(e.target.value) setPasswordConfirmation(e.target.value)
} }
value={passwordConfirmation} value={passwordConfirmation}
placeholder={t("register_confirm_password_label")} placeholder={t("Confirm password")}
label={t("register_confirm_password_label")} label={t("Confirm password")}
ref={confirmPasswordRef} ref={confirmPasswordRef}
data-testid="register_confirm_password" data-testid="register_confirm_password"
/> />
</FieldRow> </FieldRow>
<Caption> <Caption>
<Trans i18nKey="recaptcha_caption"> <Trans>
This site is protected by ReCAPTCHA and the Google{" "} This site is protected by ReCAPTCHA and the Google{" "}
<Link href="https://www.google.com/policies/privacy/"> <Link href="https://www.google.com/policies/privacy/">
Privacy Policy Privacy Policy
@@ -239,16 +237,14 @@ export const RegisterPage: FC = () => {
disabled={registering} disabled={registering}
data-testid="register_register" data-testid="register_register"
> >
{registering {registering ? t("Registering…") : t("Register")}
? t("register.registering")
: t("action.register")}
</Button> </Button>
</FieldRow> </FieldRow>
<div id={recaptchaId} /> <div id={recaptchaId} />
</form> </form>
</div> </div>
<div className={styles.authLinks}> <div className={styles.authLinks}>
<Trans i18nKey="register_auth_links"> <Trans>
<p>Already have an account?</p> <p>Already have an account?</p>
<p> <p>
<Link to="/login">Log in</Link> <Link to="/login">Log in</Link>

View File

@@ -80,14 +80,14 @@ export function useRecaptcha(sitekey?: string): {
if (!window.grecaptcha) { if (!window.grecaptcha) {
logger.log("Recaptcha not loaded"); 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) => { return new Promise((resolve, reject) => {
const observer = new MutationObserver((mutationsList) => { const observer = new MutationObserver((mutationsList) => {
for (const item of mutationsList) { for (const item of mutationsList) {
if ((item.target as HTMLElement)?.style?.visibility !== "visible") { if ((item.target as HTMLElement)?.style?.visibility !== "visible") {
reject(translatedError("recaptcha_dismissed", t)); reject(translatedError("Recaptcha dismissed", t));
observer.disconnect(); observer.disconnect();
return; return;
} }

View File

@@ -142,9 +142,7 @@ export const MicButton: FC<{
}> = ({ muted, ...rest }) => { }> = ({ muted, ...rest }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const Icon = muted ? MicOffSolidIcon : MicOnSolidIcon; const Icon = muted ? MicOffSolidIcon : MicOnSolidIcon;
const label = muted const label = muted ? t("Unmute microphone") : t("Mute microphone");
? t("unmute_microphone_button_label")
: t("mute_microphone_button_label");
return ( return (
<Tooltip label={label}> <Tooltip label={label}>
@@ -162,9 +160,7 @@ export const VideoButton: FC<{
}> = ({ muted, ...rest }) => { }> = ({ muted, ...rest }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const Icon = muted ? VideoCallOffSolidIcon : VideoCallSolidIcon; const Icon = muted ? VideoCallOffSolidIcon : VideoCallSolidIcon;
const label = muted const label = muted ? t("Start video") : t("Stop video");
? t("start_video_button_label")
: t("stop_video_button_label");
return ( return (
<Tooltip label={label}> <Tooltip label={label}>
@@ -182,9 +178,7 @@ export const ScreenshareButton: FC<{
[index: string]: unknown; [index: string]: unknown;
}> = ({ enabled, className, ...rest }) => { }> = ({ enabled, className, ...rest }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const label = enabled const label = enabled ? t("Sharing screen") : t("Share screen");
? t("stop_screenshare_button_label")
: t("screenshare_button_label");
return ( return (
<Tooltip label={label}> <Tooltip label={label}>
@@ -203,13 +197,13 @@ export const HangupButton: FC<{
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<Tooltip label={t("hangup_button_label")}> <Tooltip label={t("End call")}>
<Button <Button
variant="toolbar" variant="toolbar"
className={classNames(styles.hangupButton, className)} className={classNames(styles.hangupButton, className)}
{...rest} {...rest}
> >
<EndCallIcon aria-label={t("hangup_button_label")} /> <EndCallIcon aria-label={t("End call")} />
</Button> </Button>
</Tooltip> </Tooltip>
); );
@@ -223,9 +217,9 @@ export const SettingsButton: FC<{
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<Tooltip label={t("common.settings")}> <Tooltip label={t("Settings")}>
<Button variant="toolbar" {...rest}> <Button variant="toolbar" {...rest}>
<SettingsSolidIcon aria-label={t("common.settings")} /> <SettingsSolidIcon aria-label={t("Settings")} />
</Button> </Button>
</Tooltip> </Tooltip>
); );
@@ -242,9 +236,9 @@ export const AudioButton: FC<AudioButtonProps> = ({ volume, ...rest }) => {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<Tooltip label={t("local_volume_label")}> <Tooltip label={t("Local volume")}>
<Button variant="icon" {...rest}> <Button variant="icon" {...rest}>
<VolumeIcon volume={volume} aria-label={t("local_volume_label")} /> <VolumeIcon volume={volume} aria-label={t("Local volume")} />
</Button> </Button>
</Tooltip> </Tooltip>
); );
@@ -260,9 +254,7 @@ export const FullscreenButton: FC<FullscreenButtonProps> = ({
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const Icon = fullscreen ? FullscreenExit : Fullscreen; const Icon = fullscreen ? FullscreenExit : Fullscreen;
const label = fullscreen const label = fullscreen ? t("Exit full screen") : t("Full screen");
? t("exit_fullscreen_button_label")
: t("fullscreen_button_label");
return ( return (
<Tooltip label={label}> <Tooltip label={label}>

View File

@@ -49,13 +49,11 @@ export const CopyButton: FC<Props> = ({
className={className} className={className}
onPress={setCopied} onPress={setCopied}
iconStyle={isCopied ? "stroke" : "fill"} iconStyle={isCopied ? "stroke" : "fill"}
aria-label={t("action.copy")} aria-label={t("Copy")}
> >
{isCopied ? ( {isCopied ? (
<> <>
{variant !== "icon" && ( {variant !== "icon" && <span>{copiedMessage || t("Copied!")}</span>}
<span>{copiedMessage || t("common.copied")}</span>
)}
<CheckIcon /> <CheckIcon />
</> </>
) : ( ) : (

View File

@@ -25,7 +25,7 @@ export const InviteButton: FC<
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<Button kind="secondary" size="sm" Icon={UserAddIcon} {...props}> <Button kind="secondary" size="sm" Icon={UserAddIcon} {...props}>
{t("action.invite")} {t("Invite")}
</Button> </Button>
); );
}; };

View File

@@ -1,21 +0,0 @@
/*
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.
*/
export enum E2eeType {
NONE = 0,
PER_PARTICIPANT = 1,
SHARED_KEY = 2,
}

View File

@@ -1,73 +0,0 @@
/*
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 { BaseKeyProvider, createKeyMaterialFromBuffer } from "livekit-client";
import { logger } from "matrix-js-sdk/src/logger";
import {
MatrixRTCSession,
MatrixRTCSessionEvent,
} from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession";
export class MatrixKeyProvider extends BaseKeyProvider {
private rtcSession?: MatrixRTCSession;
public constructor() {
super({ ratchetWindowSize: 0 });
}
public setRTCSession(rtcSession: MatrixRTCSession): void {
if (this.rtcSession) {
this.rtcSession.off(
MatrixRTCSessionEvent.EncryptionKeyChanged,
this.onEncryptionKeyChanged,
);
}
this.rtcSession = rtcSession;
this.rtcSession.on(
MatrixRTCSessionEvent.EncryptionKeyChanged,
this.onEncryptionKeyChanged,
);
// The new session could be aware of keys of which the old session wasn't,
// so emit a key changed event.
for (const [
participant,
encryptionKeys,
] of this.rtcSession.getEncryptionKeys()) {
for (const [index, encryptionKey] of encryptionKeys.entries()) {
this.onEncryptionKeyChanged(encryptionKey, index, participant);
}
}
}
private onEncryptionKeyChanged = async (
encryptionKey: Uint8Array,
encryptionKeyIndex: number,
participantId: string,
): Promise<void> => {
this.onSetEncryptionKey(
await createKeyMaterialFromBuffer(encryptionKey),
participantId,
encryptionKeyIndex,
);
logger.debug(
`Sent new key to livekit room=${this.rtcSession?.room.roomId} participantId=${participantId} encryptionKeyIndex=${encryptionKeyIndex}`,
);
};
}

View File

@@ -15,18 +15,13 @@ limitations under the License.
*/ */
import { useEffect, useMemo } from "react"; import { useEffect, useMemo } from "react";
import { Room } from "matrix-js-sdk";
import { setLocalStorageItem, useLocalStorage } from "../useLocalStorage"; import { setLocalStorageItem, useLocalStorage } from "../useLocalStorage";
import { useClient } from "../ClientContext"; import { useClient } from "../ClientContext";
import { UrlParams, getUrlParams, useUrlParams } from "../UrlParams"; import { useUrlParams } from "../UrlParams";
import { widget } from "../widget"; import { widget } from "../widget";
export function saveKeyForRoom(roomId: string, password: string): void { export const getRoomSharedKeyLocalStorageKey = (roomId: string): string =>
setLocalStorageItem(getRoomSharedKeyLocalStorageKey(roomId), password);
}
const getRoomSharedKeyLocalStorageKey = (roomId: string): string =>
`room-shared-key-${roomId}`; `room-shared-key-${roomId}`;
const useInternalRoomSharedKey = (roomId: string): string | null => { const useInternalRoomSharedKey = (roomId: string): string | null => {
@@ -36,22 +31,6 @@ const useInternalRoomSharedKey = (roomId: string): string | null => {
return roomSharedKey; 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 * 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. * and returning it in a tuple with the corresponding room ID from the URL.
@@ -61,7 +40,18 @@ function saveKeyFromUrlParams(urlParams: UrlParams): void {
const useKeyFromUrl = (): [string, string] | [undefined, undefined] => { const useKeyFromUrl = (): [string, string] | [undefined, undefined] => {
const urlParams = useUrlParams(); const urlParams = useUrlParams();
useEffect(() => saveKeyFromUrlParams(urlParams), [urlParams]); 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]);
return urlParams.roomId && urlParams.password return urlParams.roomId && urlParams.password
? [urlParams.roomId, urlParams.password] ? [urlParams.roomId, urlParams.password]
@@ -84,14 +74,12 @@ export const useRoomSharedKey = (roomId: string): string | undefined => {
export const useIsRoomE2EE = (roomId: string): boolean | null => { export const useIsRoomE2EE = (roomId: string): boolean | null => {
const { client } = useClient(); const { client } = useClient();
const room = useMemo(() => client?.getRoom(roomId), [roomId, client]); const room = useMemo(() => client?.getRoom(roomId) ?? null, [roomId, client]);
return useMemo(() => !room || isRoomE2EE(room), [room]);
};
export function isRoomE2EE(room: Room): boolean {
// For now, rooms in widget mode are never considered encrypted. // For now, rooms in widget mode are never considered encrypted.
// In the future, when widget mode gains encryption support, then perhaps we // In the future, when widget mode gains encryption support, then perhaps we
// should inspect the e2eEnabled URL parameter here? // should inspect the e2eEnabled URL parameter here?
return widget === null && !room.getCanonicalAlias(); return useMemo(
} () => widget === null && (room === null || !room.getCanonicalAlias()),
[room],
);
};

View File

@@ -25,7 +25,7 @@ import { usePageTitle } from "../usePageTitle";
export const HomePage: FC = () => { export const HomePage: FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();
usePageTitle(t("common.home")); usePageTitle(t("Home"));
const clientState = useClientState(); const clientState = useClientState();

View File

@@ -37,16 +37,12 @@ export const JoinExistingCallModal: FC<Props> = ({
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<Modal <Modal title={t("Join existing call?")} open={open} onDismiss={onDismiss}>
title={t("join_existing_call_modal.title")} <p>{t("This call already exists, would you like to join?")}</p>
open={open}
onDismiss={onDismiss}
>
<p>{t("join_existing_call_modal.text")}</p>
<FieldRow rightAlign className={styles.buttons}> <FieldRow rightAlign className={styles.buttons}>
<Button onPress={onDismiss}>{t("action.no")}</Button> <Button onPress={onDismiss}>{t("No")}</Button>
<Button onPress={onJoin} data-testid="home_joinExistingRoom"> <Button onPress={onJoin} data-testid="home_joinExistingRoom">
{t("join_existing_call_modal.join_button")} {t("Yes, join call")}
</Button> </Button>
</FieldRow> </FieldRow>
</Modal> </Modal>

View File

@@ -40,7 +40,6 @@ import { Caption } from "../typography/Typography";
import { Form } from "../form/Form"; import { Form } from "../form/Form";
import { useOptInAnalytics } from "../settings/useSetting"; import { useOptInAnalytics } from "../settings/useSetting";
import { AnalyticsNotice } from "../analytics/AnalyticsNotice"; import { AnalyticsNotice } from "../analytics/AnalyticsNotice";
import { E2eeType } from "../e2ee/e2eeType";
interface Props { interface Props {
client: MatrixClient; client: MatrixClient;
@@ -73,11 +72,7 @@ export const RegisteredView: FC<Props> = ({ client }) => {
setError(undefined); setError(undefined);
setLoading(true); setLoading(true);
const createRoomResult = await createRoom( const createRoomResult = await createRoom(client, roomName, true);
client,
roomName,
E2eeType.SHARED_KEY,
);
history.push( history.push(
getRelativeRoomUrl( getRelativeRoomUrl(
@@ -125,15 +120,15 @@ export const RegisteredView: FC<Props> = ({ client }) => {
<main className={commonStyles.main}> <main className={commonStyles.main}>
<HeaderLogo className={commonStyles.logo} /> <HeaderLogo className={commonStyles.logo} />
<Heading size="lg" weight="semibold"> <Heading size="lg" weight="semibold">
{t("start_new_call")} {t("Start new call")}
</Heading> </Heading>
<Form className={styles.form} onSubmit={onSubmit}> <Form className={styles.form} onSubmit={onSubmit}>
<FieldRow className={styles.fieldRow}> <FieldRow className={styles.fieldRow}>
<InputField <InputField
id="callName" id="callName"
name="callName" name="callName"
label={t("call_name")} label={t("Name of call")}
placeholder={t("call_name")} placeholder={t("Name of call")}
type="text" type="text"
required required
autoComplete="off" autoComplete="off"
@@ -147,7 +142,7 @@ export const RegisteredView: FC<Props> = ({ client }) => {
disabled={loading} disabled={loading}
data-testid="home_go" data-testid="home_go"
> >
{loading ? t("common.loading") : t("action.go")} {loading ? t("Loading") : t("Go")}
</Button> </Button>
</FieldRow> </FieldRow>
{optInAnalytics === null && ( {optInAnalytics === null && (

View File

@@ -43,7 +43,6 @@ import { generateRandomName } from "../auth/generateRandomName";
import { AnalyticsNotice } from "../analytics/AnalyticsNotice"; import { AnalyticsNotice } from "../analytics/AnalyticsNotice";
import { useOptInAnalytics } from "../settings/useSetting"; import { useOptInAnalytics } from "../settings/useSetting";
import { Config } from "../config/Config"; import { Config } from "../config/Config";
import { E2eeType } from "../e2ee/e2eeType";
export const UnauthenticatedView: FC = () => { export const UnauthenticatedView: FC = () => {
const { setClient } = useClient(); const { setClient } = useClient();
@@ -85,11 +84,7 @@ export const UnauthenticatedView: FC = () => {
let createRoomResult; let createRoomResult;
try { try {
createRoomResult = await createRoom( createRoomResult = await createRoom(client, roomName, true);
client,
roomName,
E2eeType.SHARED_KEY,
);
} catch (error) { } catch (error) {
if (!setClient) { if (!setClient) {
throw error; throw error;
@@ -158,15 +153,15 @@ export const UnauthenticatedView: FC = () => {
<main className={commonStyles.main}> <main className={commonStyles.main}>
<HeaderLogo className={commonStyles.logo} /> <HeaderLogo className={commonStyles.logo} />
<Heading size="lg" weight="semibold"> <Heading size="lg" weight="semibold">
{t("start_new_call")} {t("Start new call")}
</Heading> </Heading>
<Form className={styles.form} onSubmit={onSubmit}> <Form className={styles.form} onSubmit={onSubmit}>
<FieldRow> <FieldRow>
<InputField <InputField
id="callName" id="callName"
name="callName" name="callName"
label={t("call_name")} label={t("Name of call")}
placeholder={t("call_name")} placeholder={t("Name of call")}
type="text" type="text"
required required
autoComplete="off" autoComplete="off"
@@ -177,8 +172,8 @@ export const UnauthenticatedView: FC = () => {
<InputField <InputField
id="displayName" id="displayName"
name="displayName" name="displayName"
label={t("common.display_name")} label={t("Display name")}
placeholder={t("common.display_name")} placeholder={t("Display name")}
type="text" type="text"
required required
data-testid="home_displayName" data-testid="home_displayName"
@@ -191,7 +186,7 @@ export const UnauthenticatedView: FC = () => {
</Caption> </Caption>
)} )}
<Caption className={styles.notice}> <Caption className={styles.notice}>
<Trans i18nKey="unauthenticated_view_eula_caption"> <Trans>
By clicking "Go", you agree to our{" "} By clicking "Go", you agree to our{" "}
<Link href={Config.get().eula}> <Link href={Config.get().eula}>
End User Licensing Agreement (EULA) End User Licensing Agreement (EULA)
@@ -209,7 +204,7 @@ export const UnauthenticatedView: FC = () => {
disabled={loading} disabled={loading}
data-testid="home_go" data-testid="home_go"
> >
{loading ? t("common.loading") : t("action.go")} {loading ? t("Loading") : t("Go")}
</Button> </Button>
<div id={recaptchaId} /> <div id={recaptchaId} />
</Form> </Form>
@@ -217,11 +212,11 @@ export const UnauthenticatedView: FC = () => {
<footer className={styles.footer}> <footer className={styles.footer}>
<Body className={styles.mobileLoginLink}> <Body className={styles.mobileLoginLink}>
<Link color="primary" to="/login" data-testid="home_login"> <Link color="primary" to="/login" data-testid="home_login">
{t("unauthenticated_view_login_button")} {t("Login to your account")}
</Link> </Link>
</Body> </Body>
<Body> <Body>
<Trans i18nKey="unauthenticated_view_body"> <Trans>
Not registered yet?{" "} Not registered yet?{" "}
<Link color="primary" to="/register" data-testid="home_register"> <Link color="primary" to="/register" data-testid="home_register">
Create an account Create an account

View File

@@ -21,8 +21,6 @@ import { RoomMember } from "matrix-js-sdk/src/models/room-member";
import { GroupCallEventHandlerEvent } from "matrix-js-sdk/src/webrtc/groupCallEventHandler"; import { GroupCallEventHandlerEvent } from "matrix-js-sdk/src/webrtc/groupCallEventHandler";
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { getKeyForRoom, isRoomE2EE } from "../e2ee/sharedKeyManagement";
export interface GroupCallRoom { export interface GroupCallRoom {
roomAlias?: string; roomAlias?: string;
roomName: string; roomName: string;
@@ -80,14 +78,6 @@ 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[] { export function useGroupCallRooms(client: MatrixClient): GroupCallRoom[] {
const [rooms, setRooms] = useState<GroupCallRoom[]>([]); const [rooms, setRooms] = useState<GroupCallRoom[]>([]);
@@ -98,9 +88,7 @@ export function useGroupCallRooms(client: MatrixClient): GroupCallRoom[] {
} }
const groupCalls = client.groupCallEventHandler.groupCalls.values(); const groupCalls = client.groupCallEventHandler.groupCalls.values();
const rooms = Array.from(groupCalls) const rooms = Array.from(groupCalls).map((groupCall) => groupCall.room);
.map((groupCall) => groupCall.room)
.filter(roomIsJoinable);
const sortedRooms = sortRooms(client, rooms); const sortedRooms = sortRooms(client, rooms);
const items = sortedRooms.map((room) => { const items = sortedRooms.map((room) => {
const groupCall = client.getGroupCallForRoom(room.roomId)!; const groupCall = client.getGroupCallForRoom(room.roomId)!;

View File

@@ -72,9 +72,9 @@ export class Initializer {
.init({ .init({
fallbackLng: "en-GB", fallbackLng: "en-GB",
defaultNS: "app", defaultNS: "app",
keySeparator: ".", keySeparator: false,
nsSeparator: false, nsSeparator: false,
pluralSeparator: "_", pluralSeparator: "|",
contextSeparator: "|", contextSeparator: "|",
interpolation: { interpolation: {
escapeValue: false, // React has built-in XSS protections escapeValue: false, // React has built-in XSS protections

View File

@@ -115,7 +115,7 @@ export const AvatarInputField = forwardRef<HTMLInputElement, Props>(
variant="icon" variant="icon"
onPress={onPressRemoveAvatar} onPress={onPressRemoveAvatar}
> >
{t("action.remove")} {t("Remove")}
</Button> </Button>
)} )}
</div> </div>

View File

@@ -58,7 +58,7 @@ export function SelectInput(props: Props): JSX.Element {
<span {...valueProps} className={styles.selectedItem}> <span {...valueProps} className={styles.selectedItem}>
{state.selectedItem {state.selectedItem
? state.selectedItem.rendered ? state.selectedItem.rendered
: t("select_input_unset_button")} : t("Select an option")}
</span> </span>
<ArrowDownIcon /> <ArrowDownIcon />
</button> </button>

View File

@@ -62,7 +62,7 @@ export function StarRatingInput({
id={"starInvisibleLabel" + String(index)} id={"starInvisibleLabel" + String(index)}
htmlFor={"starInput" + String(index)} htmlFor={"starInput" + String(index)}
> >
{t("star_rating_input_label", { {t("{{count}} stars", {
count: index, count: index,
})} })}
</label> </label>

View File

@@ -26,7 +26,6 @@ import {
} from "react"; } from "react";
import { createMediaDeviceObserver } from "@livekit/components-core"; import { createMediaDeviceObserver } from "@livekit/components-core";
import { Observable } from "rxjs"; import { Observable } from "rxjs";
import { logger } from "matrix-js-sdk/src/logger";
import { import {
isFirefox, isFirefox,
@@ -83,31 +82,21 @@ function useMediaDevice(
// Tragically, the only way to get device names out of LiveKit is to specify a // Tragically, the only way to get device names out of LiveKit is to specify a
// kind, which then results in multiple permissions requests. // kind, which then results in multiple permissions requests.
const deviceObserver = useMemo( const deviceObserver = useMemo(
() => () => createMediaDeviceObserver(kind, requestPermissions),
createMediaDeviceObserver(
kind,
() => {
logger.error("Error creating MediaDeviceObserver");
},
requestPermissions,
),
[kind, requestPermissions], [kind, requestPermissions],
); );
const available = useObservableState(deviceObserver, []); const available = useObservableState(deviceObserver, []);
const [selectedId, select] = useState(fallbackDevice); const [selectedId, select] = useState(fallbackDevice);
return useMemo(() => { return useMemo(() => {
let devId; const devId = available.some((d) => d.deviceId === selectedId)
if (available) { ? selectedId
devId = available.some((d) => d.deviceId === selectedId) : available.some((d) => d.deviceId === fallbackDevice)
? selectedId ? fallbackDevice
: available.some((d) => d.deviceId === fallbackDevice) : available.at(0)?.deviceId;
? fallbackDevice
: available.at(0)?.deviceId;
}
return { return {
available: available ?? [], available,
selectedId: alwaysDefault ? undefined : devId, selectedId: alwaysDefault ? undefined : devId,
select, select,
}; };

View File

@@ -17,7 +17,6 @@ limitations under the License.
import { import {
AudioCaptureOptions, AudioCaptureOptions,
ConnectionState, ConnectionState,
LocalTrack,
Room, Room,
RoomEvent, RoomEvent,
Track, Track,
@@ -56,6 +55,8 @@ async function doConnect(
audioEnabled: boolean, audioEnabled: boolean,
audioOptions: AudioCaptureOptions, audioOptions: AudioCaptureOptions,
): Promise<void> { ): Promise<void> {
await livekitRoom!.connect(sfuConfig!.url, sfuConfig!.jwt);
// Always create an audio track manually. // Always create an audio track manually.
// livekit (by default) keeps the mic track open when you mute, but if you start muted, // livekit (by default) keeps the mic track open when you mute, but if you start muted,
// doesn't publish it until you unmute. We want to publish it from the start so we're // doesn't publish it until you unmute. We want to publish it from the start so we're
@@ -72,71 +73,24 @@ async function doConnect(
} }
logger.info("Pre-creating microphone track"); logger.info("Pre-creating microphone track");
let preCreatedAudioTrack: LocalTrack | undefined; const audioTracks = await livekitRoom!.localParticipant.createTracks({
try { audio: audioOptions,
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");
if (audioTracks.length < 1) { return;
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();
if (!audioEnabled) await preCreatedAudioTrack?.mute();
// check again having awaited for the track to create // check again having awaited for the track to create
if (livekitRoom!.localParticipant.getTrack(Track.Source.Microphone)) { if (livekitRoom!.localParticipant.getTrack(Track.Source.Microphone)) {
logger.warn( logger.warn(
"Pre-created audio track but participant already appears to have an microphone track: this shouldn't happen!", "Publishing pre-created audio track but participant already appears to have an microphone track: this shouldn't happen!",
); );
preCreatedAudioTrack?.stop();
return; return;
} }
logger.info("Publishing pre-created mic track");
logger.info("Connecting & publishing"); await livekitRoom?.localParticipant.publishTrack(audioTracks[0]);
try {
await connectAndPublish(livekitRoom, sfuConfig, preCreatedAudioTrack, []);
} catch (e) {
preCreatedAudioTrack?.stop();
}
}
/**
* Connect to the SFU and publish specific tracks, if provided.
* This is very specific to what we need to do: for instance, we don't
* currently have a need to prepublish video tracks. We just prepublish
* a mic track at the start of a call and copy any srceenshare tracks over
* when switching focus (because we can't re-acquire them without the user
* going through the dialog to choose them again).
*/
async function connectAndPublish(
livekitRoom: Room,
sfuConfig: SFUConfig,
micTrack: LocalTrack | undefined,
screenshareTracks: MediaStreamTrack[],
): Promise<void> {
await livekitRoom!.connect(sfuConfig!.url, sfuConfig!.jwt);
if (micTrack) {
logger.info(`Publishing precreated mic track`);
await livekitRoom.localParticipant.publishTrack(micTrack, {
source: Track.Source.Microphone,
});
}
logger.info(
`Publishing ${screenshareTracks.length} precreated screenshare tracks`,
);
for (const st of screenshareTracks) {
livekitRoom.localParticipant.publishTrack(st, {
source: Track.Source.ScreenShare,
});
}
} }
export function useECConnectionState( export function useECConnectionState(
@@ -172,33 +126,6 @@ export function useECConnectionState(
}; };
}, [livekitRoom, onConnStateChanged]); }, [livekitRoom, onConnStateChanged]);
const doFocusSwitch = useCallback(async (): Promise<void> => {
const screenshareTracks: MediaStreamTrack[] = [];
for (const t of livekitRoom!.localParticipant.videoTracks.values()) {
if (t.track && t.source == Track.Source.ScreenShare) {
const newTrack = t.track.mediaStreamTrack.clone();
newTrack.enabled = true;
screenshareTracks.push(newTrack);
}
}
// Flag that we're currently switching focus. This will get reset when the
// connection state changes back to connected in onConnStateChanged above.
setSwitchingFocus(true);
await livekitRoom?.disconnect();
setIsInDoConnect(true);
try {
await connectAndPublish(
livekitRoom!,
sfuConfig!,
undefined,
screenshareTracks,
);
} finally {
setIsInDoConnect(false);
}
}, [livekitRoom, sfuConfig]);
const currentSFUConfig = useRef(Object.assign({}, sfuConfig)); const currentSFUConfig = useRef(Object.assign({}, sfuConfig));
// Id we are transitioning from a valid config to another valid one, we need // Id we are transitioning from a valid config to another valid one, we need
@@ -213,7 +140,21 @@ export function useECConnectionState(
`SFU config changed! URL was ${currentSFUConfig.current?.url} now ${sfuConfig?.url}`, `SFU config changed! URL was ${currentSFUConfig.current?.url} now ${sfuConfig?.url}`,
); );
doFocusSwitch(); (async (): Promise<void> => {
setSwitchingFocus(true);
await livekitRoom?.disconnect();
setIsInDoConnect(true);
try {
await doConnect(
livekitRoom!,
sfuConfig!,
initialAudioEnabled,
initialAudioOptions,
);
} finally {
setIsInDoConnect(false);
}
})();
} else if ( } else if (
!sfuConfigValid(currentSFUConfig.current) && !sfuConfigValid(currentSFUConfig.current) &&
sfuConfigValid(sfuConfig) sfuConfigValid(sfuConfig)
@@ -234,13 +175,7 @@ export function useECConnectionState(
} }
currentSFUConfig.current = Object.assign({}, sfuConfig); currentSFUConfig.current = Object.assign({}, sfuConfig);
}, [ }, [sfuConfig, livekitRoom, initialAudioOptions, initialAudioEnabled]);
sfuConfig,
livekitRoom,
initialAudioOptions,
initialAudioEnabled,
doFocusSwitch,
]);
// Because we create audio tracks by hand, there's more to connecting than // Because we create audio tracks by hand, there's more to connecting than
// just what LiveKit does in room.connect, and we should continue to return // just what LiveKit does in room.connect, and we should continue to return

View File

@@ -22,10 +22,10 @@ import {
RoomOptions, RoomOptions,
Track, Track,
} from "livekit-client"; } from "livekit-client";
import { useEffect, useMemo, useRef } from "react"; import { useLiveKitRoom } from "@livekit/components-react";
import { useEffect, useMemo, useRef, useState } from "react";
import E2EEWorker from "livekit-client/e2ee-worker?worker"; import E2EEWorker from "livekit-client/e2ee-worker?worker";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession";
import { defaultLiveKitOptions } from "./options"; import { defaultLiveKitOptions } from "./options";
import { SFUConfig } from "./openIDSFU"; import { SFUConfig } from "./openIDSFU";
@@ -39,12 +39,9 @@ import {
ECConnectionState, ECConnectionState,
useECConnectionState, useECConnectionState,
} from "./useECConnectionState"; } from "./useECConnectionState";
import { MatrixKeyProvider } from "../e2ee/matrixKeyProvider";
import { E2eeType } from "../e2ee/e2eeType";
export type E2EEConfig = { export type E2EEConfig = {
mode: E2eeType; sharedKey: string;
sharedKey?: string;
}; };
interface UseLivekitResult { interface UseLivekitResult {
@@ -53,44 +50,26 @@ interface UseLivekitResult {
} }
export function useLiveKit( export function useLiveKit(
rtcSession: MatrixRTCSession,
muteStates: MuteStates, muteStates: MuteStates,
sfuConfig: SFUConfig | undefined, sfuConfig?: SFUConfig,
e2eeConfig: E2EEConfig, e2eeConfig?: E2EEConfig,
): UseLivekitResult { ): UseLivekitResult {
const e2eeOptions = useMemo((): E2EEOptions | undefined => { const e2eeOptions = useMemo(() => {
if (e2eeConfig.mode === E2eeType.NONE) return undefined; if (!e2eeConfig?.sharedKey) return undefined;
if (e2eeConfig.mode === E2eeType.PER_PARTICIPANT) { return {
return { keyProvider: new ExternalE2EEKeyProvider(),
keyProvider: new MatrixKeyProvider(), worker: new E2EEWorker(),
worker: new E2EEWorker(), } as E2EEOptions;
};
} else if (
e2eeConfig.mode === E2eeType.SHARED_KEY &&
e2eeConfig.sharedKey
) {
return {
keyProvider: new ExternalE2EEKeyProvider(),
worker: new E2EEWorker(),
};
}
}, [e2eeConfig]); }, [e2eeConfig]);
useEffect(() => { useEffect(() => {
if (e2eeConfig.mode === E2eeType.NONE || !e2eeOptions) return; if (!e2eeConfig?.sharedKey || !e2eeOptions) return;
if (e2eeConfig.mode === E2eeType.PER_PARTICIPANT) { (e2eeOptions.keyProvider as ExternalE2EEKeyProvider).setKey(
(e2eeOptions.keyProvider as MatrixKeyProvider).setRTCSession(rtcSession); e2eeConfig?.sharedKey,
} else if ( );
e2eeConfig.mode === E2eeType.SHARED_KEY && }, [e2eeOptions, e2eeConfig?.sharedKey]);
e2eeConfig.sharedKey
) {
(e2eeOptions.keyProvider as ExternalE2EEKeyProvider).setKey(
e2eeConfig.sharedKey,
);
}
}, [e2eeOptions, e2eeConfig, rtcSession]);
const initialMuteStates = useRef<MuteStates>(muteStates); const initialMuteStates = useRef<MuteStates>(muteStates);
const devices = useMediaDevices(); const devices = useMediaDevices();
@@ -117,6 +96,11 @@ export function useLiveKit(
[e2eeOptions], [e2eeOptions],
); );
// useECConnectionState creates and publishes an audio track by hand. To keep
// this from racing with LiveKit's automatic creation of the audio track, we
// block audio from being enabled until the connection is finished.
const [blockAudio, setBlockAudio] = useState(true);
// Store if audio/video are currently updating. If to prohibit unnecessary calls // Store if audio/video are currently updating. If to prohibit unnecessary calls
// to setMicrophoneEnabled/setCameraEnabled // to setMicrophoneEnabled/setCameraEnabled
const audioMuteUpdating = useRef(false); const audioMuteUpdating = useRef(false);
@@ -131,11 +115,15 @@ export function useLiveKit(
// We have to create the room manually here due to a bug inside // We have to create the room manually here due to a bug inside
// @livekit/components-react. JSON.stringify() is used in deps of a // @livekit/components-react. JSON.stringify() is used in deps of a
// useEffect() with an argument that references itself, if E2EE is enabled // useEffect() with an argument that references itself, if E2EE is enabled
const room = useMemo(() => { const roomWithoutProps = useMemo(() => new Room(roomOptions), [roomOptions]);
const r = new Room(roomOptions); const { room } = useLiveKitRoom({
r.setE2EEEnabled(e2eeConfig.mode !== E2eeType.NONE); token: sfuConfig?.jwt,
return r; serverUrl: sfuConfig?.url,
}, [roomOptions, e2eeConfig]); audio: initialMuteStates.current.audio.enabled && !blockAudio,
video: initialMuteStates.current.video.enabled,
room: roomWithoutProps,
connect: false,
});
const connectionState = useECConnectionState( const connectionState = useECConnectionState(
{ {
@@ -146,6 +134,11 @@ export function useLiveKit(
sfuConfig, sfuConfig,
); );
// Unblock audio once the connection is finished
useEffect(() => {
if (connectionState === ConnectionState.Connected) setBlockAudio(false);
}, [connectionState, setBlockAudio]);
useEffect(() => { useEffect(() => {
// Sync the requested mute states with LiveKit's mute states. We do it this // Sync the requested mute states with LiveKit's mute states. We do it this
// way around rather than using LiveKit as the source of truth, so that the // way around rather than using LiveKit as the source of truth, so that the
@@ -245,25 +238,11 @@ export function useLiveKit(
); );
} }
} catch (e) { } catch (e) {
if ((e as DOMException).name === "NotAllowedError") { logger.error(
logger.error( "Failed to sync audio mute state with LiveKit (will retry to sync in 1s):",
"Fatal errror while syncing mute state: resetting", e,
e, );
); setTimeout(() => syncMuteState(iterCount + 1, type), 1000);
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);
}
} }
} }
}; };

View File

@@ -28,7 +28,6 @@ import {
GroupCallIntent, GroupCallIntent,
GroupCallType, GroupCallType,
} from "matrix-js-sdk/src/webrtc/groupCall"; } from "matrix-js-sdk/src/webrtc/groupCall";
import { secureRandomBase64Url } from "matrix-js-sdk/src/randomstring";
import type { MatrixClient } from "matrix-js-sdk/src/client"; import type { MatrixClient } from "matrix-js-sdk/src/client";
import type { Room } from "matrix-js-sdk/src/models/room"; import type { Room } from "matrix-js-sdk/src/models/room";
@@ -36,8 +35,8 @@ import IndexedDBWorker from "./IndexedDBWorker?worker";
import { getUrlParams, PASSWORD_STRING } from "./UrlParams"; import { getUrlParams, PASSWORD_STRING } from "./UrlParams";
import { loadOlm } from "./olm"; import { loadOlm } from "./olm";
import { Config } from "./config/Config"; import { Config } from "./config/Config";
import { E2eeType } from "./e2ee/e2eeType"; import { setLocalStorageItem } from "./useLocalStorage";
import { saveKeyForRoom } from "./e2ee/sharedKeyManagement"; import { getRoomSharedKeyLocalStorageKey } from "./e2ee/sharedKeyManagement";
export const fallbackICEServerAllowed = export const fallbackICEServerAllowed =
import.meta.env.VITE_FALLBACK_STUN_ALLOWED === "true"; import.meta.env.VITE_FALLBACK_STUN_ALLOWED === "true";
@@ -74,6 +73,23 @@ function waitForSync(client: MatrixClient): Promise<void> {
}); });
} }
function secureRandomString(entropyBytes: number): string {
const key = new Uint8Array(entropyBytes);
crypto.getRandomValues(key);
// encode to base64url as this value goes into URLs
// base64url is just base64 with thw two non-alphanum characters swapped out for
// ones that can be put in a URL without encoding. Browser JS has a native impl
// for base64 encoding but only a string (there isn't one that takes a UInt8Array
// yet) so just use the built-in one and convert, replace the chars and strip the
// padding from the end (otherwise we'd need to pull in another dependency).
return btoa(
key.reduce((acc, current) => acc + String.fromCharCode(current), ""),
)
.replace("+", "-")
.replace("/", "_")
.replace(/=*$/, "");
}
/** /**
* Initialises and returns a new standalone Matrix Client. * Initialises and returns a new standalone Matrix Client.
* If true is passed for the 'restore' parameter, a check will be made * If true is passed for the 'restore' parameter, a check will be made
@@ -278,20 +294,10 @@ interface CreateRoomResult {
password?: string; password?: string;
} }
/**
* Create a new room ready for calls
*
* @param client Matrix client to use
* @param name The name of the room
* @param e2ee The type of e2ee call to create. Note that we would currently never
* create a room for per-participant e2ee calls: since it's used in
* embedded mode, we use the existing room.
* @returns Object holding information about the new room
*/
export async function createRoom( export async function createRoom(
client: MatrixClient, client: MatrixClient,
name: string, name: string,
e2ee: E2eeType, e2ee: boolean,
): Promise<CreateRoomResult> { ): Promise<CreateRoomResult> {
logger.log(`Creating room for group call`); logger.log(`Creating room for group call`);
const createPromise = client.createRoom({ const createPromise = client.createRoom({
@@ -356,9 +362,12 @@ export async function createRoom(
); );
let password; let password;
if (e2ee == E2eeType.SHARED_KEY) { if (e2ee) {
password = secureRandomBase64Url(16); password = secureRandomString(16);
saveKeyForRoom(result.room_id, password); setLocalStorageItem(
getRoomSharedKeyLocalStorageKey(result.room_id),
password,
);
} }
return { return {

View File

@@ -76,19 +76,15 @@ export const AppSelectionModal: FC<Props> = ({ roomId }) => {
}, [roomId, roomSharedKey]); }, [roomId, roomSharedKey]);
return ( return (
<Modal <Modal className={styles.modal} title={t("Select app")} open={open}>
className={styles.modal}
title={t("app_selection_modal.title")}
open={open}
>
<Text size="md" weight="semibold"> <Text size="md" weight="semibold">
{t("app_selection_modal.text")} {t("Ready to join?")}
</Text> </Text>
<Button kind="secondary" onClick={onBrowserClick}> <Button kind="secondary" onClick={onBrowserClick}>
{t("app_selection_modal.continue_in_browser")} {t("Continue in browser")}
</Button> </Button>
<Button as="a" href={appUrl} Icon={PopOutIcon}> <Button as="a" href={appUrl} Icon={PopOutIcon}>
{t("app_selection_modal.open_in_app")} {t("Open in the app")}
</Button> </Button>
</Modal> </Modal>
); );

View File

@@ -88,7 +88,7 @@ export const CallEndedView: FC<Props> = ({
const createAccountDialog = isPasswordlessUser && ( const createAccountDialog = isPasswordlessUser && (
<div className={styles.callEndedContent}> <div className={styles.callEndedContent}>
<Trans i18nKey="call_ended_view.create_account_prompt"> <Trans>
<p>Why not finish by setting up a password to keep your account?</p> <p>Why not finish by setting up a password to keep your account?</p>
<p> <p>
You'll be able to keep your name and set an avatar for use on future 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" variant="default"
to="/register" to="/register"
> >
{t("call_ended_view.create_account_button")} {t("Create account")}
</LinkButton> </LinkButton>
</div> </div>
); );
const qualitySurveyDialog = ( const qualitySurveyDialog = (
<div className={styles.callEndedContent}> <div className={styles.callEndedContent}>
<Trans i18nKey="call_ended_view.feedback_prompt"> <Trans>
<p> <p>
We'd love to hear your feedback so we can improve your experience. We'd love to hear your feedback so we can improve your experience.
</p> </p>
@@ -122,14 +122,14 @@ export const CallEndedView: FC<Props> = ({
className={feedbackStyle.feedback} className={feedbackStyle.feedback}
id="feedbackText" id="feedbackText"
name="feedbackText" name="feedbackText"
label={t("settings.feedback_tab_description_label")} label={t("Your feedback")}
placeholder={t("settings.feedback_tab_description_label")} placeholder={t("Your feedback")}
type="textarea" type="textarea"
/> />
</FieldRow>{" "} </FieldRow>{" "}
<FieldRow> <FieldRow>
{submitDone ? ( {submitDone ? (
<Trans i18nKey="call_ended_view.feedback_done"> <Trans>
<p>Thanks for your feedback!</p> <p>Thanks for your feedback!</p>
</Trans> </Trans>
) : ( ) : (
@@ -140,7 +140,7 @@ export const CallEndedView: FC<Props> = ({
variant="default" variant="default"
data-testid="home_go" data-testid="home_go"
> >
{submitting ? t("submitting") : t("action.submit")} {submitting ? t("Submitting") : t("Submit")}
</Button> </Button>
)} )}
</FieldRow> </FieldRow>
@@ -154,13 +154,11 @@ export const CallEndedView: FC<Props> = ({
<> <>
<main className={styles.main}> <main className={styles.main}>
<Headline className={styles.headline}> <Headline className={styles.headline}>
<Trans i18nKey="call_ended_view.body"> <Trans>You were disconnected from the call</Trans>
You were disconnected from the call
</Trans>
</Headline> </Headline>
<div className={styles.disconnectedButtons}> <div className={styles.disconnectedButtons}>
<Button size="lg" variant="default" onClick={reconnect}> <Button size="lg" variant="default" onClick={reconnect}>
{t("call_ended_view.reconnect_button")} {t("Reconnect")}
</Button> </Button>
<div className={styles.rageshakeButton}> <div className={styles.rageshakeButton}>
<RageshakeButton description="***Call disconnected***" /> <RageshakeButton description="***Call disconnected***" />
@@ -170,7 +168,7 @@ export const CallEndedView: FC<Props> = ({
{!confineToRoom && ( {!confineToRoom && (
<Body className={styles.footer}> <Body className={styles.footer}>
<Link color="primary" to="/"> <Link color="primary" to="/">
{t("return_home_button")} {t("Return to home screen")}
</Link> </Link>
</Body> </Body>
)} )}
@@ -182,14 +180,14 @@ export const CallEndedView: FC<Props> = ({
<main className={styles.main}> <main className={styles.main}>
<Headline className={styles.headline}> <Headline className={styles.headline}>
{surveySubmitted {surveySubmitted
? t("call_ended_view.headline", { ? t("{{displayName}}, your call has ended.", {
displayName, displayName,
}) })
: t("call_ended_view.headline", { : t("{{displayName}}, your call has ended.", {
displayName, displayName,
}) + }) +
"\n" + "\n" +
t("call_ended_view.survey_prompt")} t("How did it go?")}
</Headline> </Headline>
{(!surveySubmitted || confineToRoom) && {(!surveySubmitted || confineToRoom) &&
PosthogAnalytics.instance.isEnabled() PosthogAnalytics.instance.isEnabled()
@@ -199,7 +197,7 @@ export const CallEndedView: FC<Props> = ({
{!confineToRoom && ( {!confineToRoom && (
<Body className={styles.footer}> <Body className={styles.footer}>
<Link color="primary" to="/"> <Link color="primary" to="/">
{t("call_ended_view.not_now_button")} {t("Not now, return to home screen")}
</Link> </Link>
</Body> </Body>
)} )}

View File

@@ -29,22 +29,17 @@ interface Props {
export const EncryptionLock: FC<Props> = ({ encrypted }) => { export const EncryptionLock: FC<Props> = ({ encrypted }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const Icon = encrypted ? LockIcon : LockOffIcon; const Icon = encrypted ? LockIcon : LockOffIcon;
const label = encrypted ? t("common.encrypted") : t("common.unencrypted");
return ( return (
<Tooltip label={label} side="right"> <Tooltip
label={encrypted ? t("Encrypted") : t("Not encrypted")}
side="right"
>
<Icon <Icon
width={16} width={16}
height={16} height={16}
className={styles.lock} className={styles.lock}
data-encrypted={encrypted} data-encrypted={encrypted}
aria-label={label}
// Make the icon focusable so that the tooltip can be opened
// with keyboard navigation
// TODO: Replace this with the solution from
// https://github.com/vector-im/compound-web/pull/130 once it
// lands
tabIndex={0}
/> />
</Tooltip> </Tooltip>
); );

View File

@@ -54,7 +54,7 @@ export function GroupCallLoader({
case "loading": case "loading":
return ( return (
<FullScreenView> <FullScreenView>
<h1>{t("common.loading")}</h1> <h1>{t("Loading")}</h1>
</FullScreenView> </FullScreenView>
); );
case "loaded": case "loaded":
@@ -63,12 +63,16 @@ export function GroupCallLoader({
if ((groupCallState.error as MatrixError).errcode === "M_NOT_FOUND") { if ((groupCallState.error as MatrixError).errcode === "M_NOT_FOUND") {
return ( return (
<FullScreenView> <FullScreenView>
<Heading>{t("group_call_loader_failed_heading")}</Heading> <Heading>{t("Call not found")}</Heading>
<Text>{t("group_call_loader_failed_text")}</Text> <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>
{/* XXX: A 'create it for me' button would be the obvious UX here. Two screens already have {/* 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. */} dupes of this flow, let's make a common component and put it here. */}
<Link href="/" onClick={onHomeClick}> <Link href="/" onClick={onHomeClick}>
{t("common.home")} {t("Home")}
</Link> </Link>
</FullScreenView> </FullScreenView>
); );

View File

@@ -44,9 +44,6 @@ import { useRoomAvatar } from "./useRoomAvatar";
import { useRoomName } from "./useRoomName"; import { useRoomName } from "./useRoomName";
import { useJoinRule } from "./useJoinRule"; import { useJoinRule } from "./useJoinRule";
import { InviteModal } from "./InviteModal"; import { InviteModal } from "./InviteModal";
import { E2EEConfig } from "../livekit/useLiveKit";
import { useUrlParams } from "../UrlParams";
import { E2eeType } from "../e2ee/e2eeType";
declare global { declare global {
interface Window { interface Window {
@@ -76,6 +73,9 @@ export const GroupCallView: FC<Props> = ({
const memberships = useMatrixRTCSessionMemberships(rtcSession); const memberships = useMatrixRTCSessionMemberships(rtcSession);
const isJoined = useMatrixRTCSessionJoinState(rtcSession); const isJoined = useMatrixRTCSessionJoinState(rtcSession);
const e2eeSharedKey = useRoomSharedKey(rtcSession.room.roomId);
const isRoomE2EE = useIsRoomE2EE(rtcSession.room.roomId);
useEffect(() => { useEffect(() => {
window.rtcSession = rtcSession; window.rtcSession = rtcSession;
return () => { return () => {
@@ -86,10 +86,7 @@ export const GroupCallView: FC<Props> = ({
const { displayName, avatarUrl } = useProfile(client); const { displayName, avatarUrl } = useProfile(client);
const roomName = useRoomName(rtcSession.room); const roomName = useRoomName(rtcSession.room);
const roomAvatar = useRoomAvatar(rtcSession.room); const roomAvatar = useRoomAvatar(rtcSession.room);
const e2eeSharedKey = useRoomSharedKey(rtcSession.room.roomId); const roomEncrypted = useIsRoomE2EE(rtcSession.room.roomId)!;
const { perParticipantE2EE } = useUrlParams();
const roomEncrypted =
useIsRoomE2EE(rtcSession.room.roomId) || perParticipantE2EE;
const matrixInfo = useMemo((): MatrixInfo => { const matrixInfo = useMemo((): MatrixInfo => {
return { return {
@@ -126,16 +123,6 @@ export const GroupCallView: FC<Props> = ({
const latestMuteStates = useRef<MuteStates>(); const latestMuteStates = useRef<MuteStates>();
latestMuteStates.current = 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(() => { useEffect(() => {
// this effect is only if we don't want to show the lobby (skipLobby = true) // this effect is only if we don't want to show the lobby (skipLobby = true)
if (!skipLobby) return; if (!skipLobby) return;
@@ -195,7 +182,7 @@ export const GroupCallView: FC<Props> = ({
ev: CustomEvent<IWidgetApiRequest>, ev: CustomEvent<IWidgetApiRequest>,
): Promise<void> => { ): Promise<void> => {
defaultDeviceSetup(ev.detail.data as unknown as JoinCallData); defaultDeviceSetup(ev.detail.data as unknown as JoinCallData);
enterRTCSession(rtcSession, perParticipantE2EE); enterRTCSession(rtcSession);
await Promise.all([ await Promise.all([
widget!.api.setAlwaysOnScreen(true), widget!.api.setAlwaysOnScreen(true),
widget!.api.transport.reply(ev.detail, {}), widget!.api.transport.reply(ev.detail, {}),
@@ -208,9 +195,9 @@ export const GroupCallView: FC<Props> = ({
} else { } else {
// if we don't use preload and only skipLobby we enter the rtc session right away // if we don't use preload and only skipLobby we enter the rtc session right away
defaultDeviceSetup({ audioInput: null, videoInput: null }); defaultDeviceSetup({ audioInput: null, videoInput: null });
enterRTCSession(rtcSession, perParticipantE2EE); enterRTCSession(rtcSession);
} }
}, [rtcSession, preload, skipLobby, perParticipantE2EE]); }, [rtcSession, preload, skipLobby]);
const [left, setLeft] = useState(false); const [left, setLeft] = useState(false);
const [leaveError, setLeaveError] = useState<Error | undefined>(undefined); const [leaveError, setLeaveError] = useState<Error | undefined>(undefined);
@@ -230,7 +217,6 @@ export const GroupCallView: FC<Props> = ({
sendInstantly, sendInstantly,
); );
// Only sends matrix leave event. The Livekit session will disconnect once the ActiveCall-view unmounts.
await leaveRTCSession(rtcSession); await leaveRTCSession(rtcSession);
if ( if (
@@ -250,7 +236,6 @@ export const GroupCallView: FC<Props> = ({
ev: CustomEvent<IWidgetApiRequest>, ev: CustomEvent<IWidgetApiRequest>,
): Promise<void> => { ): Promise<void> => {
widget!.api.transport.reply(ev.detail, {}); widget!.api.transport.reply(ev.detail, {});
// Only sends matrix leave event. The Livekit session will disconnect once the ActiveCall-view unmounts.
await leaveRTCSession(rtcSession); await leaveRTCSession(rtcSession);
}; };
widget.lazyActions.once(ElementWidgetActions.HangupCall, onHangup); widget.lazyActions.once(ElementWidgetActions.HangupCall, onHangup);
@@ -260,11 +245,16 @@ export const GroupCallView: FC<Props> = ({
} }
}, [isJoined, rtcSession]); }, [isJoined, rtcSession]);
const e2eeConfig = useMemo(
() => (e2eeSharedKey ? { sharedKey: e2eeSharedKey } : undefined),
[e2eeSharedKey],
);
const onReconnect = useCallback(() => { const onReconnect = useCallback(() => {
setLeft(false); setLeft(false);
setLeaveError(undefined); setLeaveError(undefined);
enterRTCSession(rtcSession, perParticipantE2EE); enterRTCSession(rtcSession);
}, [rtcSession, perParticipantE2EE]); }, [rtcSession]);
const joinRule = useJoinRule(rtcSession.room); const joinRule = useJoinRule(rtcSession.room);
@@ -290,7 +280,7 @@ export const GroupCallView: FC<Props> = ({
const { t } = useTranslation(); const { t } = useTranslation();
if (roomEncrypted && !perParticipantE2EE && !e2eeSharedKey) { if (isRoomE2EE && !e2eeSharedKey) {
return ( return (
<ErrorView <ErrorView
error={ error={
@@ -300,13 +290,17 @@ export const GroupCallView: FC<Props> = ({
} }
/> />
); );
} else if (!isE2EESupported() && roomEncrypted) { } else if (!isE2EESupported() && isRoomE2EE) {
return ( return (
<FullScreenView> <FullScreenView>
<Heading>{t("browser_media_e2ee_unsupported_heading")}</Heading> <Heading>Incompatible Browser</Heading>
<Text>{t("browser_media_e2ee_unsupported")}</Text> <Text>
{t(
"Your web browser does not support media end-to-end encryption. Supported Browsers are Chrome, Safari, Firefox >=117",
)}
</Text>
<Link href="/" onClick={onHomeClick}> <Link href="/" onClick={onHomeClick}>
{t("common.home")} {t("Home")}
</Link> </Link>
</FullScreenView> </FullScreenView>
); );
@@ -376,7 +370,7 @@ export const GroupCallView: FC<Props> = ({
client={client} client={client}
matrixInfo={matrixInfo} matrixInfo={matrixInfo}
muteStates={muteStates} muteStates={muteStates}
onEnter={(): void => enterRTCSession(rtcSession, perParticipantE2EE)} onEnter={(): void => enterRTCSession(rtcSession)}
confineToRoom={confineToRoom} confineToRoom={confineToRoom}
hideHeader={hideHeader} hideHeader={hideHeader}
participantCount={participantCount} participantCount={participantCount}

View File

@@ -95,26 +95,24 @@ const POST_FOCUS_PARTICIPANT_UPDATE_DELAY_MS = 3000;
export interface ActiveCallProps export interface ActiveCallProps
extends Omit<InCallViewProps, "livekitRoom" | "connState"> { extends Omit<InCallViewProps, "livekitRoom" | "connState"> {
e2eeConfig: E2EEConfig; e2eeConfig?: E2EEConfig;
} }
export const ActiveCall: FC<ActiveCallProps> = (props) => { export const ActiveCall: FC<ActiveCallProps> = (props) => {
const sfuConfig = useOpenIDSFU(props.client, props.rtcSession); const sfuConfig = useOpenIDSFU(props.client, props.rtcSession);
const { livekitRoom, connState } = useLiveKit( const { livekitRoom, connState } = useLiveKit(
props.rtcSession,
props.muteStates, props.muteStates,
sfuConfig, sfuConfig,
props.e2eeConfig, props.e2eeConfig,
); );
useEffect(() => { if (!livekitRoom) {
return () => { return null;
livekitRoom?.disconnect(); }
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
if (!livekitRoom) return null; if (props.e2eeConfig && !livekitRoom.isE2EEEnabled) {
livekitRoom.setE2EEEnabled(!!props.e2eeConfig);
}
return ( return (
<RoomContext.Provider value={livekitRoom}> <RoomContext.Provider value={livekitRoom}>
@@ -204,6 +202,10 @@ export const InCallView: FC<InCallViewProps> = ({
(muted) => muteStates.audio.setEnabled?.(!muted), (muted) => muteStates.audio.setEnabled?.(!muted),
); );
const onLeavePress = useCallback(() => {
onLeave();
}, [onLeave]);
useEffect(() => { useEffect(() => {
widget?.api.transport.send( widget?.api.transport.send(
layout === "grid" layout === "grid"
@@ -273,7 +275,7 @@ export const InCallView: FC<InCallViewProps> = ({
if (items.length === 0) { if (items.length === 0) {
return ( return (
<div className={styles.centerMessage}> <div className={styles.centerMessage}>
<p>{t("waiting_for_participants")}</p> <p>{t("Waiting for other participants")}</p>
</div> </div>
); );
} }
@@ -289,7 +291,6 @@ export const InCallView: FC<InCallViewProps> = ({
data={maximisedParticipant.data} data={maximisedParticipant.data}
showSpeakingIndicator={false} showSpeakingIndicator={false}
showConnectionStats={showConnectionStats} showConnectionStats={showConnectionStats}
matrixInfo={matrixInfo}
/> />
); );
} }
@@ -308,7 +309,6 @@ export const InCallView: FC<InCallViewProps> = ({
onToggleFullscreen={toggleFullscreen} onToggleFullscreen={toggleFullscreen}
showSpeakingIndicator={items.length > 2} showSpeakingIndicator={items.length > 2}
showConnectionStats={showConnectionStats} showConnectionStats={showConnectionStats}
matrixInfo={matrixInfo}
{...props} {...props}
ref={props.ref as Ref<HTMLDivElement>} ref={props.ref as Ref<HTMLDivElement>}
/> />
@@ -383,9 +383,7 @@ export const InCallView: FC<InCallViewProps> = ({
buttons.push( buttons.push(
<HangupButton <HangupButton
key="6" key="6"
onPress={function (): void { onPress={onLeavePress}
onLeave();
}}
data-testid="incall_leave" data-testid="incall_leave"
/>, />,
); );
@@ -490,6 +488,8 @@ function useParticipantTiles(
}); });
const items = useMemo(() => { const items = useMemo(() => {
const hasPresenter =
sfuParticipants.find((p) => p.isScreenShareEnabled) !== undefined;
let allGhosts = true; let allGhosts = true;
const speakActiveTime = new Date(); const speakActiveTime = new Date();
@@ -497,9 +497,10 @@ function useParticipantTiles(
// Iterate over SFU participants (those who actually are present from the SFU perspective) and create tiles for them. // Iterate over SFU participants (those who actually are present from the SFU perspective) and create tiles for them.
const tiles: TileDescriptor<ItemData>[] = sfuParticipants.flatMap( const tiles: TileDescriptor<ItemData>[] = sfuParticipants.flatMap(
(sfuParticipant) => { (sfuParticipant) => {
const spokeRecently = const hadSpokedInTime =
sfuParticipant.lastSpokeAt !== undefined && !hasPresenter && sfuParticipant.lastSpokeAt
sfuParticipant.lastSpokeAt > speakActiveTime; ? sfuParticipant.lastSpokeAt > speakActiveTime
: false;
const id = sfuParticipant.identity; const id = sfuParticipant.identity;
const member = findMatrixMember(matrixRoom, id); const member = findMatrixMember(matrixRoom, id);
@@ -517,7 +518,7 @@ function useParticipantTiles(
focused: false, focused: false,
isPresenter: sfuParticipant.isScreenShareEnabled, isPresenter: sfuParticipant.isScreenShareEnabled,
isSpeaker: isSpeaker:
(sfuParticipant.isSpeaking || spokeRecently) && (sfuParticipant.isSpeaking || hadSpokedInTime) &&
!sfuParticipant.isLocal, !sfuParticipant.isLocal,
hasVideo: sfuParticipant.isCameraEnabled, hasVideo: sfuParticipant.isCameraEnabled,
local: sfuParticipant.isLocal, local: sfuParticipant.isLocal,

View File

@@ -18,7 +18,6 @@ limitations under the License.
text-align: center; text-align: center;
color: var(--cpd-color-text-secondary); color: var(--cpd-color-text-secondary);
margin-block-end: var(--cpd-space-8x); margin-block-end: var(--cpd-space-8x);
overflow-wrap: break-word;
} }
.button { .button {

View File

@@ -58,7 +58,7 @@ export const InviteModal: FC<Props> = ({ room, open, onDismiss }) => {
return ( return (
<> <>
<Modal title={t("invite_modal.title")} open={open} onDismiss={onDismiss}> <Modal title={t("Invite to this call")} open={open} onDismiss={onDismiss}>
<Text className={styles.url} size="sm" weight="semibold"> <Text className={styles.url} size="sm" weight="semibold">
{url} {url}
</Text> </Text>
@@ -68,7 +68,7 @@ export const InviteModal: FC<Props> = ({ room, open, onDismiss }) => {
onClick={onButtonClick} onClick={onButtonClick}
data-testid="modal_inviteLink" data-testid="modal_inviteLink"
> >
{t("action.copy_link")} {t("Copy link")}
</Button> </Button>
</Modal> </Modal>
<Toast <Toast
@@ -77,7 +77,7 @@ export const InviteModal: FC<Props> = ({ room, open, onDismiss }) => {
autoDismiss={2000} autoDismiss={2000}
Icon={CheckIcon} Icon={CheckIcon}
> >
{t("invite_modal.link_copied_toast")} {t("Link copied to clipboard")}
</Toast> </Toast>
</> </>
); );

View File

@@ -52,9 +52,9 @@ export const LayoutToggle: FC<Props> = ({ layout, setLayout, className }) => {
checked={layout === "spotlight"} checked={layout === "spotlight"}
onChange={onChange} onChange={onChange}
/> />
<Tooltip label={t("layout_spotlight_label")}> <Tooltip label={t("Spotlight")}>
<label htmlFor={spotlightId}> <label htmlFor={spotlightId}>
<SpotlightIcon aria-label={t("layout_spotlight_label")} /> <SpotlightIcon aria-label={t("Spotlight")} />
</label> </label>
</Tooltip> </Tooltip>
<input <input
@@ -65,9 +65,9 @@ export const LayoutToggle: FC<Props> = ({ layout, setLayout, className }) => {
checked={layout === "grid"} checked={layout === "grid"}
onChange={onChange} onChange={onChange}
/> />
<Tooltip label={t("layout_grid_label")}> <Tooltip label={t("Grid")}>
<label htmlFor={gridId}> <label htmlFor={gridId}>
<GridIcon aria-label={t("layout_grid_label")} /> <GridIcon aria-label={t("Grid")} />
</label> </label>
</Tooltip> </Tooltip>
</div> </div>

View File

@@ -87,7 +87,7 @@ export const LobbyView: FC<Props> = ({
const recentsButtonInFooter = useMediaQuery("(max-height: 500px)"); const recentsButtonInFooter = useMediaQuery("(max-height: 500px)");
const recentsButton = !confineToRoom && ( const recentsButton = !confineToRoom && (
<Link className={styles.recents} href="#" onClick={onLeaveClick}> <Link className={styles.recents} href="#" onClick={onLeaveClick}>
{t("lobby.leave_button")} {t("Back to recents")}
</Link> </Link>
); );
@@ -120,7 +120,7 @@ export const LobbyView: FC<Props> = ({
onClick={onEnter} onClick={onEnter}
data-testid="lobby_joinCall" data-testid="lobby_joinCall"
> >
{t("lobby.join_button")} {t("Join call")}
</Button> </Button>
</VideoPreview> </VideoPreview>
{!recentsButtonInFooter && recentsButton} {!recentsButtonInFooter && recentsButton}

View File

@@ -44,12 +44,12 @@ export const RageshakeRequestModal: FC<Props> = ({
}, [sent, onDismiss]); }, [sent, onDismiss]);
return ( return (
<Modal <Modal title={t("Debug log request")} open={open} onDismiss={onDismiss}>
title={t("rageshake_request_modal.title")} <Body>
open={open} {t(
onDismiss={onDismiss} "Another user on this call is having an issue. In order to better diagnose these issues we'd like to collect a debug log.",
> )}
<Body>{t("rageshake_request_modal.body")}</Body> </Body>
<FieldRow> <FieldRow>
<Button <Button
onPress={(): void => onPress={(): void =>
@@ -61,7 +61,7 @@ export const RageshakeRequestModal: FC<Props> = ({
} }
disabled={sending} disabled={sending}
> >
{sending ? t("rageshake_sending_logs") : t("rageshake_send_logs")} {sending ? t("Sending debug logs") : t("Send debug logs")}
</Button> </Button>
</FieldRow> </FieldRow>
{error && ( {error && (

View File

@@ -70,16 +70,14 @@ export const RoomAuthView: FC = () => {
</Header> </Header>
<div className={styles.container}> <div className={styles.container}>
<main className={styles.main}> <main className={styles.main}>
<Headline className={styles.headline}> <Headline className={styles.headline}>{t("Join call")}</Headline>
{t("lobby.join_button")}
</Headline>
<Form className={styles.form} onSubmit={onSubmit}> <Form className={styles.form} onSubmit={onSubmit}>
<FieldRow> <FieldRow>
<InputField <InputField
id="displayName" id="displayName"
name="displayName" name="displayName"
label={t("common.display_name")} label={t("Display name")}
placeholder={t("common.display_name")} placeholder={t("Display name")}
data-testid="joincall_displayName" data-testid="joincall_displayName"
type="text" type="text"
required required
@@ -87,7 +85,7 @@ export const RoomAuthView: FC = () => {
/> />
</FieldRow> </FieldRow>
<Caption> <Caption>
<Trans i18nKey="room_auth_view_eula_caption"> <Trans>
By clicking "Join call now", you agree to our{" "} By clicking "Join call now", you agree to our{" "}
<Link href={Config.get().eula}> <Link href={Config.get().eula}>
End User Licensing Agreement (EULA) End User Licensing Agreement (EULA)
@@ -105,13 +103,13 @@ export const RoomAuthView: FC = () => {
disabled={loading} disabled={loading}
data-testid="joincall_joincall" data-testid="joincall_joincall"
> >
{loading ? t("common.loading") : t("room_auth_view_join_button")} {loading ? t("Loading") : t("Join call now")}
</Button> </Button>
<div id={recaptchaId} /> <div id={recaptchaId} />
</Form> </Form>
</main> </main>
<Body className={styles.footer}> <Body className={styles.footer}>
<Trans i18nKey="unauthenticated_view_body"> <Trans>
Not registered yet?{" "} Not registered yet?{" "}
<Link <Link
color="primary" color="primary"

View File

@@ -82,8 +82,6 @@ export const VideoPreview: FC<Props> = ({
}, },
(error) => { (error) => {
logger.error("Error while creating preview Tracks:", error); logger.error("Error while creating preview Tracks:", error);
muteStates.audio.setEnabled?.(false);
muteStates.video.setEnabled?.(false);
}, },
); );
const videoTrack = useMemo( const videoTrack = useMemo(
@@ -108,21 +106,7 @@ export const VideoPreview: FC<Props> = ({
const content = ( const content = (
<> <>
<video <video ref={videoEl} muted playsInline disablePictureInPicture />
ref={videoEl}
muted
playsInline
// There's no reason for this to be focusable
tabIndex={-1}
// React supports the disablePictureInPicture attribute, but Firefox
// only recognizes a value of "true", whereas React sets it to the empty
// string. So we need to bypass React and set it specifically to "true".
// https://bugzilla.mozilla.org/show_bug.cgi?id=1865748
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// eslint-disable-next-line react/no-unknown-property
disablepictureinpicture="true"
/>
{!muteStates.video.enabled && ( {!muteStates.video.enabled && (
<div className={styles.avatarContainer}> <div className={styles.avatarContainer}>
<Avatar <Avatar

View File

@@ -34,10 +34,7 @@ function makeFocus(livekitAlias: string): LivekitFocus {
}; };
} }
export function enterRTCSession( export function enterRTCSession(rtcSession: MatrixRTCSession): void {
rtcSession: MatrixRTCSession,
encryptMedia: boolean,
): void {
PosthogAnalytics.instance.eventCallEnded.cacheStartCall(new Date()); PosthogAnalytics.instance.eventCallEnded.cacheStartCall(new Date());
PosthogAnalytics.instance.eventCallStarted.track(rtcSession.room.roomId); PosthogAnalytics.instance.eventCallStarted.track(rtcSession.room.roomId);
@@ -48,7 +45,7 @@ export function enterRTCSession(
// right now we assume everything is a room-scoped call // right now we assume everything is a room-scoped call
const livekitAlias = rtcSession.room.roomId; const livekitAlias = rtcSession.room.roomId;
rtcSession.joinRoomSession([makeFocus(livekitAlias)], encryptMedia); rtcSession.joinRoomSession([makeFocus(livekitAlias)]);
} }
const widgetPostHangupProcedure = async ( const widgetPostHangupProcedure = async (

View File

@@ -62,28 +62,32 @@ export const FeedbackSettingsTab: FC<Props> = ({ roomId }) => {
return ( return (
<div> <div>
<h4 className={styles.label}>{t("settings.feedback_tab_h4")}</h4> <h4 className={styles.label}>{t("Submit feedback")}</h4>
<Body>{t("settings.feedback_tab_body")}</Body> <Body>
{t(
"If you are experiencing issues or simply would like to provide some feedback, please send us a short description below.",
)}
</Body>
<form onSubmit={onSubmitFeedback}> <form onSubmit={onSubmitFeedback}>
<FieldRow> <FieldRow>
<InputField <InputField
className={feedbackStyles.feedback} className={feedbackStyles.feedback}
id="description" id="description"
name="description" name="description"
label={t("settings.feedback_tab_description_label")} label={t("Your feedback")}
placeholder={t("settings.feedback_tab_description_label")} placeholder={t("Your feedback")}
type="textarea" type="textarea"
disabled={sending || sent} disabled={sending || sent}
/> />
</FieldRow> </FieldRow>
{sent ? ( {sent ? (
<Body> {t("settings.feedback_tab_thank_you")}</Body> <Body> {t("Thanks, we received your feedback!")}</Body>
) : ( ) : (
<FieldRow> <FieldRow>
<InputField <InputField
id="sendLogs" id="sendLogs"
name="sendLogs" name="sendLogs"
label={t("settings.feedback_tab_send_logs_label")} label={t("Include debug logs")}
type="checkbox" type="checkbox"
defaultChecked defaultChecked
/> />
@@ -93,7 +97,7 @@ export const FeedbackSettingsTab: FC<Props> = ({ roomId }) => {
</FieldRow> </FieldRow>
)} )}
<Button type="submit" disabled={sending}> <Button type="submit" disabled={sending}>
{sending ? t("submitting") : "action.submit"} {sending ? t("Submitting") : t("Submit")}
</Button> </Button>
</FieldRow> </FieldRow>
)} )}

View File

@@ -82,7 +82,7 @@ export const ProfileSettingsTab: FC<Props> = ({ client }) => {
<AvatarInputField <AvatarInputField
id="avatar" id="avatar"
name="avatar" name="avatar"
label={t("common.avatar")} label={t("Avatar")}
avatarUrl={avatarUrl} avatarUrl={avatarUrl}
userId={userId} userId={userId}
displayName={displayName} displayName={displayName}
@@ -94,7 +94,7 @@ export const ProfileSettingsTab: FC<Props> = ({ client }) => {
<InputField <InputField
id="userId" id="userId"
name="userId" name="userId"
label={t("common.username")} label={t("Username")}
type="text" type="text"
disabled disabled
value={client.getUserId()!} value={client.getUserId()!}
@@ -104,11 +104,11 @@ export const ProfileSettingsTab: FC<Props> = ({ client }) => {
<InputField <InputField
id="displayName" id="displayName"
name="displayName" name="displayName"
label={t("common.display_name")} label={t("Display name")}
type="text" type="text"
required required
autoComplete="off" autoComplete="off"
placeholder={t("common.display_name")} placeholder={t("Display name")}
defaultValue={displayName} defaultValue={displayName}
data-testid="profile_displayname" data-testid="profile_displayname"
/> />

View File

@@ -41,13 +41,13 @@ export const RageshakeButton: FC<Props> = ({ description }) => {
let logsComponent: JSX.Element | null = null; let logsComponent: JSX.Element | null = null;
if (sending) { if (sending) {
logsComponent = <span>{t("rageshake_sending")}</span>; logsComponent = <span>{t("Sending")}</span>;
} else if (sent) { } else if (sent) {
logsComponent = <div>{t("rageshake_sent")}</div>; logsComponent = <div>{t("Thanks!")}</div>;
} else { } else {
let caption = t("rageshake_send_logs"); let caption = t("Send debug logs");
if (error) { if (error) {
caption = t("rageshake_button_error_caption"); caption = t("Retry sending logs");
} }
logsComponent = ( logsComponent = (

View File

@@ -103,7 +103,7 @@ export const SettingsModal: FC<Props> = (props) => {
const optInDescription = ( const optInDescription = (
<Caption> <Caption>
<Trans i18nKey="settings.opt_in_description"> <Trans>
<AnalyticsNotice /> <AnalyticsNotice />
<br /> <br />
You may withdraw consent by unchecking this box. If you are currently in You may withdraw consent by unchecking this box. If you are currently in
@@ -121,16 +121,13 @@ export const SettingsModal: FC<Props> = (props) => {
title={ title={
<> <>
<AudioIcon width={16} height={16} /> <AudioIcon width={16} height={16} />
<span className={styles.tabLabel}>{t("common.audio")}</span> <span className={styles.tabLabel}>{t("Audio")}</span>
</> </>
} }
> >
{generateDeviceSelection(devices.audioInput, t("common.microphone"))} {generateDeviceSelection(devices.audioInput, t("Microphone"))}
{!isFirefox() && {!isFirefox() &&
generateDeviceSelection( generateDeviceSelection(devices.audioOutput, t("Speaker"))}
devices.audioOutput,
t("settings.speaker_device_selection_label"),
)}
</TabItem> </TabItem>
); );
@@ -140,11 +137,11 @@ export const SettingsModal: FC<Props> = (props) => {
title={ title={
<> <>
<VideoIcon width={16} height={16} /> <VideoIcon width={16} height={16} />
<span>{t("common.video")}</span> <span>{t("Video")}</span>
</> </>
} }
> >
{generateDeviceSelection(devices.videoInput, t("common.camera"))} {generateDeviceSelection(devices.videoInput, t("Camera"))}
</TabItem> </TabItem>
); );
@@ -154,7 +151,7 @@ export const SettingsModal: FC<Props> = (props) => {
title={ title={
<> <>
<UserIcon width={15} height={15} /> <UserIcon width={15} height={15} />
<span>{t("common.profile")}</span> <span>{t("Profile")}</span>
</> </>
} }
> >
@@ -168,7 +165,7 @@ export const SettingsModal: FC<Props> = (props) => {
title={ title={
<> <>
<FeedbackIcon width={16} height={16} /> <FeedbackIcon width={16} height={16} />
<span>{t("settings.feedback_tab_title")}</span> <span>{t("Feedback")}</span>
</> </>
} }
> >
@@ -182,29 +179,25 @@ export const SettingsModal: FC<Props> = (props) => {
title={ title={
<> <>
<OverflowIcon width={16} height={16} /> <OverflowIcon width={16} height={16} />
<span>{t("settings.more_tab_title")}</span> <span>{t("More")}</span>
</> </>
} }
> >
<h4>{t("settings.developer_tab_title")}</h4> <h4>Developer</h4>
<p> <p>Version: {(import.meta.env.VITE_APP_VERSION as string) || "dev"}</p>
{t("version", {
version: import.meta.env.VITE_APP_VERSION || "dev",
})}
</p>
<FieldRow> <FieldRow>
<InputField <InputField
id="developerSettingsTab" id="developerSettingsTab"
type="checkbox" type="checkbox"
checked={developerSettingsTab} checked={developerSettingsTab}
label={t("settings.developer_settings_label")} label={t("Developer Settings")}
description={t("settings.developer_settings_label_description")} description={t("Expose developer settings in the settings window.")}
onChange={(event: ChangeEvent<HTMLInputElement>): void => onChange={(event: ChangeEvent<HTMLInputElement>): void =>
setDeveloperSettingsTab(event.target.checked) setDeveloperSettingsTab(event.target.checked)
} }
/> />
</FieldRow> </FieldRow>
<h4>{t("common.analytics")}</h4> <h4>Analytics</h4>
<FieldRow> <FieldRow>
<InputField <InputField
id="optInAnalytics" id="optInAnalytics"
@@ -225,13 +218,13 @@ export const SettingsModal: FC<Props> = (props) => {
title={ title={
<> <>
<DeveloperIcon width={16} height={16} /> <DeveloperIcon width={16} height={16} />
<span>{t("settings.developer_tab_title")}</span> <span>{t("Developer")}</span>
</> </>
} }
> >
<FieldRow> <FieldRow>
<Body className={styles.fieldRowText}> <Body className={styles.fieldRowText}>
{t("version", { {t("Version: {{version}}", {
version: import.meta.env.VITE_APP_VERSION || "dev", version: import.meta.env.VITE_APP_VERSION || "dev",
})} })}
</Body> </Body>
@@ -240,7 +233,7 @@ export const SettingsModal: FC<Props> = (props) => {
<InputField <InputField
id="showConnectionStats" id="showConnectionStats"
name="connection-stats" name="connection-stats"
label={t("settings.show_connection_stats_label")} label={t("Show connection stats")}
type="checkbox" type="checkbox"
checked={showConnectionStats} checked={showConnectionStats}
onChange={(e: ChangeEvent<HTMLInputElement>): void => onChange={(e: ChangeEvent<HTMLInputElement>): void =>
@@ -258,7 +251,7 @@ export const SettingsModal: FC<Props> = (props) => {
return ( return (
<Modal <Modal
title={t("common.settings")} title={t("Settings")}
className={styles.settingsModal} className={styles.settingsModal}
open={props.open} open={props.open}
onDismiss={props.onDismiss} onDismiss={props.onDismiss}

View File

@@ -54,7 +54,7 @@ interface TilePosition {
zIndex: number; zIndex: number;
} }
export interface Tile<T> { interface Tile<T> {
key: string; key: string;
order: number; order: number;
item: TileDescriptor<T>; item: TileDescriptor<T>;
@@ -728,7 +728,7 @@ function displayedTileCount(
// Sets the 'order' property on tiles based on the layout param and // Sets the 'order' property on tiles based on the layout param and
// other properties of the tiles, eg. 'focused' and 'presenter' // other properties of the tiles, eg. 'focused' and 'presenter'
export function reorderTiles<T>( function reorderTiles<T>(
tiles: Tile<T>[], tiles: Tile<T>[],
layout: Layout, layout: Layout,
displayedTile = -1, displayedTile = -1,
@@ -750,6 +750,7 @@ export function reorderTiles<T>(
} else { } else {
const focusedTiles: Tile<T>[] = []; const focusedTiles: Tile<T>[] = [];
const presenterTiles: Tile<T>[] = []; const presenterTiles: Tile<T>[] = [];
const speakerTiles: Tile<T>[] = [];
const onlyVideoTiles: Tile<T>[] = []; const onlyVideoTiles: Tile<T>[] = [];
const otherTiles: Tile<T>[] = []; const otherTiles: Tile<T>[] = [];
@@ -762,6 +763,8 @@ export function reorderTiles<T>(
focusedTiles.push(tile); focusedTiles.push(tile);
} else if (tile.isPresenter) { } else if (tile.isPresenter) {
presenterTiles.push(tile); presenterTiles.push(tile);
} else if (tile.isSpeaker && displayedTile < tile.order) {
speakerTiles.push(tile);
} else if (tile.hasVideo) { } else if (tile.hasVideo) {
if (tile.order === 0 && tile.item.local) { if (tile.order === 0 && tile.item.local) {
firstLocalTile = tile; firstLocalTile = tile;
@@ -785,27 +788,13 @@ export function reorderTiles<T>(
} }
} }
const reorderedTiles = [ [
...focusedTiles, ...focusedTiles,
...presenterTiles, ...presenterTiles,
...speakerTiles,
...onlyVideoTiles, ...onlyVideoTiles,
...otherTiles, ...otherTiles,
]; ].forEach((tile, i) => (tile.order = i));
let nextSpeakerTileIndex = focusedTiles.length + presenterTiles.length;
reorderedTiles.forEach((tile, i) => {
// If a speaker's natural ordering would place it outside the default
// visible area, promote them to the section dedicated to speakers
if (tile.isSpeaker && displayedTile <= i && nextSpeakerTileIndex < i) {
// Remove the tile from its current section
reorderedTiles.splice(i, 1);
// Insert it into the speaker section
reorderedTiles.splice(nextSpeakerTileIndex, 0, tile);
nextSpeakerTileIndex++;
}
});
reorderedTiles.forEach((tile, i) => (tile.order = i));
} }
} }

View File

@@ -88,11 +88,11 @@ limitations under the License.
flex-shrink: 0; flex-shrink: 0;
} }
.muteIcon[data-muted="true"] { .nameTag > svg[data-muted="true"] {
color: var(--cpd-color-icon-secondary); color: var(--cpd-color-icon-secondary);
} }
.muteIcon[data-muted="false"] { .nameTag > svg[data-muted="false"] {
color: var(--cpd-color-icon-primary); color: var(--cpd-color-icon-primary);
} }
@@ -103,10 +103,6 @@ limitations under the License.
padding-inline: var(--cpd-space-2x); padding-inline: var(--cpd-space-2x);
} }
.errorIcon {
color: var(--cpd-color-icon-critical-primary);
}
.toolbar { .toolbar {
position: absolute; position: absolute;
top: 0; top: 0;

View File

@@ -36,15 +36,13 @@ import {
} from "matrix-js-sdk/src/models/room-member"; } from "matrix-js-sdk/src/models/room-member";
import MicOnSolidIcon from "@vector-im/compound-design-tokens/icons/mic-on-solid.svg?react"; import MicOnSolidIcon from "@vector-im/compound-design-tokens/icons/mic-on-solid.svg?react";
import MicOffSolidIcon from "@vector-im/compound-design-tokens/icons/mic-off-solid.svg?react"; import MicOffSolidIcon from "@vector-im/compound-design-tokens/icons/mic-off-solid.svg?react";
import ErrorIcon from "@vector-im/compound-design-tokens/icons/error.svg?react"; import { Text } from "@vector-im/compound-web";
import { Text, Tooltip } from "@vector-im/compound-web";
import { Avatar } from "../Avatar"; import { Avatar } from "../Avatar";
import styles from "./VideoTile.module.css"; import styles from "./VideoTile.module.css";
import { useReactiveState } from "../useReactiveState"; import { useReactiveState } from "../useReactiveState";
import { AudioButton, FullscreenButton } from "../button/Button"; import { AudioButton, FullscreenButton } from "../button/Button";
import { VideoTileSettingsModal } from "./VideoTileSettingsModal"; import { VideoTileSettingsModal } from "./VideoTileSettingsModal";
import { MatrixInfo } from "../room/VideoPreview";
export interface ItemData { export interface ItemData {
id: string; id: string;
@@ -70,9 +68,6 @@ interface Props {
style?: ComponentProps<typeof animated.div>["style"]; style?: ComponentProps<typeof animated.div>["style"];
showSpeakingIndicator: boolean; showSpeakingIndicator: boolean;
showConnectionStats: boolean; showConnectionStats: boolean;
// TODO: This dependency in particular should probably not be here. We can fix
// this with a view model.
matrixInfo: MatrixInfo;
} }
export const VideoTile = forwardRef<HTMLDivElement, Props>( export const VideoTile = forwardRef<HTMLDivElement, Props>(
@@ -88,7 +83,6 @@ export const VideoTile = forwardRef<HTMLDivElement, Props>(
targetHeight, targetHeight,
showSpeakingIndicator, showSpeakingIndicator,
showConnectionStats, showConnectionStats,
matrixInfo,
}, },
tileRef, tileRef,
) => { ) => {
@@ -114,22 +108,13 @@ export const VideoTile = forwardRef<HTMLDivElement, Props>(
} }
}, [member, setDisplayName]); }, [member, setDisplayName]);
const audioInfo = useMediaTrack( const muted =
content === TileContent.UserMedia useMediaTrack(
? Track.Source.Microphone content === TileContent.UserMedia
: Track.Source.ScreenShareAudio, ? Track.Source.Microphone
sfuParticipant, : Track.Source.ScreenShareAudio,
); sfuParticipant,
const videoInfo = useMediaTrack( ).isMuted !== false;
content === TileContent.UserMedia
? Track.Source.Camera
: Track.Source.ScreenShare,
sfuParticipant,
);
const muted = audioInfo.isMuted !== false;
const encrypted =
audioInfo.publication?.isEncrypted !== false &&
videoInfo.publication?.isEncrypted !== false;
const MicIcon = muted ? MicOffSolidIcon : MicOnSolidIcon; const MicIcon = muted ? MicOffSolidIcon : MicOnSolidIcon;
@@ -171,6 +156,9 @@ export const VideoTile = forwardRef<HTMLDivElement, Props>(
} }
} }
// Firefox doesn't respect the disablePictureInPicture attribute
// https://bugzilla.mozilla.org/show_bug.cgi?id=1611831
return ( return (
<animated.div <animated.div
className={classNames(styles.videoTile, className, { className={classNames(styles.videoTile, className, {
@@ -205,38 +193,19 @@ export const VideoTile = forwardRef<HTMLDivElement, Props>(
)} )}
{content === TileContent.ScreenShare ? ( {content === TileContent.ScreenShare ? (
<div className={styles.presenterLabel}> <div className={styles.presenterLabel}>
<span>{t("video_tile.presenter_label", { displayName })}</span> <span>{t("{{displayName}} is presenting", { displayName })}</span>
</div> </div>
) : ( ) : (
<div className={styles.nameTag}> <div className={styles.nameTag}>
<MicIcon <MicIcon
width={20} width={20}
height={20} height={20}
aria-label={muted ? t("microphone_off") : t("microphone_on")} aria-label={muted ? t("Microphone off") : t("Microphone on")}
data-muted={muted} data-muted={muted}
className={styles.muteIcon}
/> />
<Text as="span" size="sm" weight="medium"> <Text as="span" size="sm" weight="medium">
{sfuParticipant.isLocal {sfuParticipant.isLocal ? t("You") : displayName}
? t("video_tile.sfu_participant_local")
: displayName}
</Text> </Text>
{matrixInfo.roomEncrypted && !encrypted && (
<Tooltip label={t("common.unencrypted")} side="bottom">
<ErrorIcon
width={20}
height={20}
aria-label={t("common.unencrypted")}
className={styles.errorIcon}
// Make the icon focusable so that the tooltip can be opened
// with keyboard navigation
// TODO: Replace this with the solution from
// https://github.com/vector-im/compound-web/pull/130 once it
// lands
tabIndex={0}
/>
</Tooltip>
)}
{showConnectionStats && ( {showConnectionStats && (
<ConnectionQualityIndicator participant={sfuParticipant} /> <ConnectionQualityIndicator participant={sfuParticipant} />
)} )}
@@ -249,16 +218,6 @@ export const VideoTile = forwardRef<HTMLDivElement, Props>(
? Track.Source.Camera ? Track.Source.Camera
: Track.Source.ScreenShare : Track.Source.ScreenShare
} }
// There's no reason for this to be focusable
tabIndex={-1}
// React supports the disablePictureInPicture attribute, but Firefox
// only recognizes a value of "true", whereas React sets it to the empty
// string. So we need to bypass React and set it specifically to "true".
// https://bugzilla.mozilla.org/show_bug.cgi?id=1865748
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// eslint-disable-next-line react/no-unknown-property
disablepictureinpicture="true"
/> />
{!maximised && ( {!maximised && (
<VideoTileSettingsModal <VideoTileSettingsModal

View File

@@ -82,7 +82,7 @@ export const VideoTileSettingsModal: FC<Props> = ({
return ( return (
<Modal <Modal
className={styles.videoTileSettingsModal} className={styles.videoTileSettingsModal}
title={t("local_volume_label")} title={t("Local volume")}
open={open} open={open}
onDismiss={onDismiss} onDismiss={onDismiss}
> >

View File

@@ -77,8 +77,6 @@ export const widget = ((): WidgetHelpers | null => {
logger.info("Widget API is available"); logger.info("Widget API is available");
const api = new WidgetApi(widgetId, parentOrigin); const api = new WidgetApi(widgetId, parentOrigin);
api.requestCapability(MatrixCapabilities.AlwaysOnScreen); api.requestCapability(MatrixCapabilities.AlwaysOnScreen);
api.requestCapabilityToSendEvent(EventType.CallEncryptionKeysPrefix);
api.requestCapabilityToReceiveEvent(EventType.CallEncryptionKeysPrefix);
// Set up the lazy action emitter, but only for select actions that we // Set up the lazy action emitter, but only for select actions that we
// intend for the app to handle // intend for the app to handle

View File

@@ -1,72 +0,0 @@
/*
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 {
Tile,
TileDescriptor,
reorderTiles,
} from "../../src/video-grid/VideoGrid";
const alice: Tile<unknown> = {
key: "alice",
order: 0,
item: { local: false } as unknown as TileDescriptor<unknown>,
remove: false,
focused: false,
isPresenter: false,
isSpeaker: false,
hasVideo: true,
};
const bob: Tile<unknown> = {
key: "bob",
order: 1,
item: { local: false } as unknown as TileDescriptor<unknown>,
remove: false,
focused: false,
isPresenter: false,
isSpeaker: false,
hasVideo: false,
};
test("reorderTiles does not promote a non-speaker", () => {
const tiles = [{ ...alice }, { ...bob }];
reorderTiles(tiles, "spotlight", 1);
expect(tiles).toEqual([
expect.objectContaining({ key: "alice", order: 0 }),
expect.objectContaining({ key: "bob", order: 1 }),
]);
});
test("reorderTiles promotes a speaker into the visible area", () => {
const tiles = [{ ...alice }, { ...bob, isSpeaker: true }];
reorderTiles(tiles, "spotlight", 1);
expect(tiles).toEqual([
expect.objectContaining({ key: "alice", order: 1 }),
expect.objectContaining({ key: "bob", order: 0 }),
]);
});
test("reorderTiles keeps a promoted speaker in the visible area", () => {
const tiles = [
{ ...alice, order: 1 },
{ ...bob, isSpeaker: true, order: 0 },
];
reorderTiles(tiles, "spotlight", 1);
expect(tiles).toEqual([
expect.objectContaining({ key: "alice", order: 1 }),
expect.objectContaining({ key: "bob", order: 0 }),
]);
});

View File

@@ -14,7 +14,6 @@
"noUnusedLocals": true, "noUnusedLocals": true,
"moduleResolution": "node", "moduleResolution": "node",
"declaration": true, "declaration": true,
"resolveJsonModule": true,
// TODO: Enable the following options later. // TODO: Enable the following options later.
// "forceConsistentCasingInFileNames": true, // "forceConsistentCasingInFileNames": true,

576
yarn.lock
View File

@@ -28,20 +28,12 @@
"@babel/highlight" "^7.22.13" "@babel/highlight" "^7.22.13"
chalk "^2.4.2" chalk "^2.4.2"
"@babel/code-frame@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244"
integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
dependencies:
"@babel/highlight" "^7.23.4"
chalk "^2.4.2"
"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2":
version "7.23.2" version "7.23.2"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc"
integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==
"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.5", "@babel/core@^7.21.3": "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.5", "@babel/core@^7.21.3", "@babel/core@^7.23.2":
version "7.23.2" version "7.23.2"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94"
integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==
@@ -62,27 +54,6 @@
json5 "^2.2.3" json5 "^2.2.3"
semver "^6.3.1" semver "^6.3.1"
"@babel/core@^7.23.3":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.5.tgz#6e23f2acbcb77ad283c5ed141f824fd9f70101c7"
integrity sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==
dependencies:
"@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.23.5"
"@babel/generator" "^7.23.5"
"@babel/helper-compilation-targets" "^7.22.15"
"@babel/helper-module-transforms" "^7.23.3"
"@babel/helpers" "^7.23.5"
"@babel/parser" "^7.23.5"
"@babel/template" "^7.22.15"
"@babel/traverse" "^7.23.5"
"@babel/types" "^7.23.5"
convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
json5 "^2.2.3"
semver "^6.3.1"
"@babel/generator@^7.23.0": "@babel/generator@^7.23.0":
version "7.23.0" version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
@@ -93,16 +64,6 @@
"@jridgewell/trace-mapping" "^0.3.17" "@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1" jsesc "^2.5.1"
"@babel/generator@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755"
integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==
dependencies:
"@babel/types" "^7.23.5"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
"@babel/generator@^7.7.2": "@babel/generator@^7.7.2":
version "7.22.15" version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339"
@@ -218,17 +179,6 @@
"@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-split-export-declaration" "^7.22.6"
"@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-validator-identifier" "^7.22.20"
"@babel/helper-module-transforms@^7.23.3":
version "7.23.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1"
integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==
dependencies:
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-module-imports" "^7.22.15"
"@babel/helper-simple-access" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/helper-validator-identifier" "^7.22.20"
"@babel/helper-optimise-call-expression@^7.22.5": "@babel/helper-optimise-call-expression@^7.22.5":
version "7.22.5" version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
@@ -285,11 +235,6 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
"@babel/helper-string-parser@^7.23.4":
version "7.23.4"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83"
integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20": "@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20":
version "7.22.20" version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
@@ -318,15 +263,6 @@
"@babel/traverse" "^7.23.2" "@babel/traverse" "^7.23.2"
"@babel/types" "^7.23.0" "@babel/types" "^7.23.0"
"@babel/helpers@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.5.tgz#52f522840df8f1a848d06ea6a79b79eefa72401e"
integrity sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==
dependencies:
"@babel/template" "^7.22.15"
"@babel/traverse" "^7.23.5"
"@babel/types" "^7.23.5"
"@babel/highlight@^7.22.13": "@babel/highlight@^7.22.13":
version "7.22.20" version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
@@ -336,15 +272,6 @@
chalk "^2.4.2" chalk "^2.4.2"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/highlight@^7.23.4":
version "7.23.4"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
dependencies:
"@babel/helper-validator-identifier" "^7.22.20"
chalk "^2.4.2"
js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
version "7.23.0" version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
@@ -355,11 +282,6 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95"
integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==
"@babel/parser@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563"
integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15":
version "7.22.15" version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962"
@@ -849,17 +771,17 @@
dependencies: dependencies:
"@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx" "^7.22.5"
"@babel/plugin-transform-react-jsx-self@^7.23.3": "@babel/plugin-transform-react-jsx-self@^7.22.5":
version "7.23.3" version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz#ed3e7dadde046cce761a8e3cf003a13d1a7972d9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e"
integrity sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ== integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-transform-react-jsx-source@^7.23.3": "@babel/plugin-transform-react-jsx-source@^7.22.5":
version "7.23.3" version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz#03527006bdc8775247a78643c51d4e715fe39a3e" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz#49af1615bfdf6ed9d3e9e43e425e0b2b65d15b6c"
integrity sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g== integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5"
@@ -1157,22 +1079,6 @@
debug "^4.1.0" debug "^4.1.0"
globals "^11.1.0" globals "^11.1.0"
"@babel/traverse@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec"
integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==
dependencies:
"@babel/code-frame" "^7.23.5"
"@babel/generator" "^7.23.5"
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/parser" "^7.23.5"
"@babel/types" "^7.23.5"
debug "^4.1.0"
globals "^11.1.0"
"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4":
version "7.23.0" version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
@@ -1182,15 +1088,6 @@
"@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@babel/types@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602"
integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==
dependencies:
"@babel/helper-string-parser" "^7.23.4"
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
"@babel/types@^7.3.3": "@babel/types@^7.3.3":
version "7.22.19" version "7.22.19"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684"
@@ -1206,9 +1103,9 @@
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@bufbuild/protobuf@^1.3.0": "@bufbuild/protobuf@^1.3.0":
version "1.4.2" version "1.4.1"
resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-1.4.2.tgz#dc4faf21264a47b71a15806616043cb006e80ac8" resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-1.4.1.tgz#2a827da66aebe904edca21f7085724154aa7868d"
integrity sha512-JyEH8Z+OD5Sc2opSg86qMHn1EM1Sa+zj/Tc0ovxdwk56ByVNONJSabuCUbLQp+eKN3rWNfrho0X+3SEqEPXIow== integrity sha512-4dthhwBGD9nlpY35ic8dMQC5R0dsND2b2xyeVO3qf+hBk8m7Y9dUs+SmMh6rqO2pGLUTKHefGXLDW+z19hBPdQ==
"@csstools/cascade-layer-name-parser@^1.0.5": "@csstools/cascade-layer-name-parser@^1.0.5":
version "1.0.5" version "1.0.5"
@@ -2092,30 +1989,31 @@
resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
"@livekit/components-core@0.8.1": "@livekit/components-core@0.7.0":
version "0.8.1" version "0.7.0"
resolved "https://registry.yarnpkg.com/@livekit/components-core/-/components-core-0.8.1.tgz#40efb867c9fc5c9c3ee37055fb307a3ed41b24ed" resolved "https://registry.yarnpkg.com/@livekit/components-core/-/components-core-0.7.0.tgz#1283a34753c8f1bb805b987684a3e29d1bc2eb39"
integrity sha512-0pe+xRIuDObJNGv9Khn+RxHVGL2bit45ORLu+u3UoiAEt1V+pR2XldN6lW6pChuEBY1KLUuuS3h1EbcxrIkYOw== integrity sha512-KwzqnW8V9G+4fXc4gOxpXqQFLpL/kFBn82sYO10zHjHfNKSw4pRj1sDLTWc5UF22W2Z461/bqMtB+3WGB/3Dtg==
dependencies: dependencies:
"@floating-ui/dom" "^1.1.0" "@floating-ui/dom" "^1.1.0"
email-regex "^5.0.0" email-regex "^5.0.0"
global-tld-list "^0.0.1139"
loglevel "^1.8.1" loglevel "^1.8.1"
rxjs "^7.8.0" rxjs "^7.8.0"
"@livekit/components-react@^1.1.0": "@livekit/components-react@^1.1.0":
version "1.4.1" version "1.3.0"
resolved "https://registry.yarnpkg.com/@livekit/components-react/-/components-react-1.4.1.tgz#c17e2ad4162d492ebdb5827a9f9b71d908b61322" resolved "https://registry.yarnpkg.com/@livekit/components-react/-/components-react-1.3.0.tgz#4b55d04a1bd69849833fe9ecb715ad3020eb5515"
integrity sha512-k8zJhr9JfYqClhR6mifpH0z7pO1imKu3/ytjG2P6L1GM4SYT3GGOJV3TPwrNn35glHY2TveHvHjWLh7JHiNF3w== integrity sha512-9rOhsE6SfPTfa5PgwXJ9bW2Ya26Dnthwi/BLpwrGn00rUDMaAm9nRwnRiyGoXGrcJRwxhe15zCg+wx7k0TEOZA==
dependencies: dependencies:
"@livekit/components-core" "0.8.1" "@livekit/components-core" "0.7.0"
"@react-hook/latest" "^1.0.3" "@react-hook/latest" "^1.0.3"
clsx "^2.0.0" clsx "^2.0.0"
usehooks-ts "^2.9.1" usehooks-ts "^2.9.1"
"@matrix-org/matrix-sdk-crypto-wasm@^3.0.1": "@matrix-org/matrix-sdk-crypto-wasm@^1.2.3-alpha.0":
version "3.0.1" version "1.3.0"
resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-3.0.1.tgz#56a0376f8a389264bcf4d5325b378a71f18b7664" resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-1.3.0.tgz#f098c72701801334eeb7049ca7074fe6eb3686d6"
integrity sha512-r0PBfUKlLHm67+fpIV21netX5+DujbY2XjJy7JUGJ55oW4XWBNbSf9vElfaQkrdt/iDscL/8I5PoD5lCuVW6zA== integrity sha512-vQ5PVppKu1PY7xy7QDw+RJLYLGFKhJyxLqjXHr0uEUJwfvz2IH2njTLXzrz77dOo9qacxJ9/YNOTe0Hl+98N0A==
"@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz": "@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz":
version "3.2.14" version "3.2.14"
@@ -2142,10 +2040,10 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@opentelemetry/api-logs@0.45.1": "@opentelemetry/api-logs@0.45.0":
version "0.45.1" version "0.45.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.45.1.tgz#9e4f2c652dcce798c5627939b22304c2b5ce19c5" resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.45.0.tgz#d18ba361bbab77244cf3ec7bb14a5dfcb7a990f2"
integrity sha512-zVGq/k70l+kB/Wuv3O/zhptP2hvDhEbhDu9EtHde1iWZJf3FedeYS/nWVcMBkkyPAjS/JKNk86WN4CBQLGUuOw== integrity sha512-swhLdhH/nftC/bNhc3bQ7cn4XJvVO1n8aidDJ7fSw+5ostDLSurDdHS2bY8dxVmb+oHndgBlYOvrx7Jx4OPO6A==
dependencies: dependencies:
"@opentelemetry/api" "^1.0.0" "@opentelemetry/api" "^1.0.0"
@@ -2154,17 +2052,17 @@
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40"
integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw== integrity sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==
"@opentelemetry/context-zone-peer-dep@1.18.1": "@opentelemetry/context-zone-peer-dep@1.18.0":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/context-zone-peer-dep/-/context-zone-peer-dep-1.18.1.tgz#347edff8f23ad0751a304ec7dcebb0cff3859e93" resolved "https://registry.yarnpkg.com/@opentelemetry/context-zone-peer-dep/-/context-zone-peer-dep-1.18.0.tgz#db60a943cc9622fcc53844eb2aa385221c2160cd"
integrity sha512-0rqvBIW8+oMaWbVFTcEl96cpj3W3tuL4U9Mxf6PCtQctEPTGVzoFRYQ4gucYW29Ne7O2N7yit9rrrQuPja4rPA== integrity sha512-4q6AEuXm+ZudDT4CAkDz1yyFzIp6mzSJNHjOf1HR484TygnZ+fGZLFoCeNQ7ayPPHgTvcqJVKny5L7l5QxJbgQ==
"@opentelemetry/context-zone@^1.9.1": "@opentelemetry/context-zone@^1.9.1":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/context-zone/-/context-zone-1.18.1.tgz#1f0c4e618040875dfb120eadd1f2265160edac84" resolved "https://registry.yarnpkg.com/@opentelemetry/context-zone/-/context-zone-1.18.0.tgz#2cdd1b1885f54ff7065e387d237a9820574b2dd5"
integrity sha512-c/y2dyqlvMPMLFZL4oDJR87ayAt4otQy9W4pddrRrNPAq1mfG9z0GrS/nvDpK7qWK0ztqzFxis4rsmCl5arW3g== integrity sha512-unZGG2KCubQGwl6Z0VuWmOM4Q/Hc4RnCW7phl7EOlkQc6yyOlEulKtRU/NXMWhMVfztaIGXf62JW90e4hakkGw==
dependencies: dependencies:
"@opentelemetry/context-zone-peer-dep" "1.18.1" "@opentelemetry/context-zone-peer-dep" "1.18.0"
zone.js "^0.11.0" zone.js "^0.11.0"
"@opentelemetry/core@1.17.1", "@opentelemetry/core@^1.8.0": "@opentelemetry/core@1.17.1", "@opentelemetry/core@^1.8.0":
@@ -2174,33 +2072,33 @@
dependencies: dependencies:
"@opentelemetry/semantic-conventions" "1.17.1" "@opentelemetry/semantic-conventions" "1.17.1"
"@opentelemetry/core@1.18.1": "@opentelemetry/core@1.18.0":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.18.1.tgz#d2e45f6bd6be4f00d20d18d4f1b230ec33805ae9" resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.18.0.tgz#18d14d35352d7900c7785a769dc7fecf33c76f9c"
integrity sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg== integrity sha512-PCW0UCIazJRw4Q8m3Z1A20kJqKTCB4Ob02bFjov3sHozspHGnY21O7T8Q20XKe168N4Px+n7Mt4dkcay3fy92Q==
dependencies: dependencies:
"@opentelemetry/semantic-conventions" "1.18.1" "@opentelemetry/semantic-conventions" "1.18.0"
"@opentelemetry/exporter-jaeger@^1.9.1": "@opentelemetry/exporter-jaeger@^1.9.1":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.18.1.tgz#021be61114bdde9173e7a6faf8e0942f5a5f8ee1" resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.18.0.tgz#bf83c80e86f141f6ee502218d89a78c14ce1dcdf"
integrity sha512-bxkw0urKYdcuI9rkLar+POo50MZuWxsli4xBahitmWE0Dufz3UY7ZFWKcQfD+b+VBIJcyKKtSsIhWmBduGWmkg== integrity sha512-Tf16c/Oue5Tyq78eFMiicrI5FC/9QGhFMzjmEZjnyqz1/twaQM2DUcwC4syc3AMefLBBStwvw0b9JI2t7Q130w==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/sdk-trace-base" "1.18.1" "@opentelemetry/sdk-trace-base" "1.18.0"
"@opentelemetry/semantic-conventions" "1.18.1" "@opentelemetry/semantic-conventions" "1.18.0"
jaeger-client "^3.15.0" jaeger-client "^3.15.0"
"@opentelemetry/exporter-trace-otlp-http@^0.45.0": "@opentelemetry/exporter-trace-otlp-http@^0.45.0":
version "0.45.1" version "0.45.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.45.1.tgz#2265181bd4787dc6660bdac33d658490a883283a" resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.45.0.tgz#f783aa24b7ed9c5c1bb1b3091d43ec6394784b7e"
integrity sha512-a6CGqSG66n5R1mghzLMzyzn3iGap1b0v+0PjKFjfYuwLtpHQBxh2PHxItu+m2mXSwnM4R0GJlk9oUW5sQkCE0w== integrity sha512-wmnuyKZAMoJdNpdiUYuLLa8kUMVRTl4BQJ6zEb9HUkiusSQ8+h2q0s7rVtY2urvg2HxDjMrDdUgjFnRPmoyBkg==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/otlp-exporter-base" "0.45.1" "@opentelemetry/otlp-exporter-base" "0.45.0"
"@opentelemetry/otlp-transformer" "0.45.1" "@opentelemetry/otlp-transformer" "0.45.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.18.0"
"@opentelemetry/sdk-trace-base" "1.18.1" "@opentelemetry/sdk-trace-base" "1.18.0"
"@opentelemetry/instrumentation-document-load@^0.33.0": "@opentelemetry/instrumentation-document-load@^0.33.0":
version "0.33.2" version "0.33.2"
@@ -2233,24 +2131,24 @@
semver "^7.5.2" semver "^7.5.2"
shimmer "^1.2.1" shimmer "^1.2.1"
"@opentelemetry/otlp-exporter-base@0.45.1": "@opentelemetry/otlp-exporter-base@0.45.0":
version "0.45.1" version "0.45.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.45.1.tgz#7170ec200152f89d74b2cf82fcf21fd32deebf03" resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.45.0.tgz#7cd0c88d5b2253dd91c6f1a5e2cbfd778de83d2f"
integrity sha512-Jvd6x8EwWGKEPWF4tkP4LpTPXiIkkafMNMvMJUfJd5DyNAftL1vAz+48jmi3URL2LMPkGryrvWPz8Tdu917gQw== integrity sha512-K+zr7juzDCyokUfneI2ufr7HAUL+YaF1bQ5at+SkCIt9LGnIGMDJSAq/LBbd/DBl4Rlfi2dwcjzP7/+ycN5a9Q==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/otlp-transformer@0.45.1": "@opentelemetry/otlp-transformer@0.45.0":
version "0.45.1" version "0.45.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.45.1.tgz#8f6590b93f177510983bea3055e5a3f3d30faad2" resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.45.0.tgz#8c0563eaf15a7390d4f3349d067ee29cc31bd25f"
integrity sha512-FhIHgfC0b0XtoBrS5ISfva939yWffNl47ypXR8I7Ru+dunlySpmf2TLocKHYLHGcWiuoeSNO5O4dZCmSKOtpXw== integrity sha512-8nlKKDWB2Sp6GI+wZLlDhMl8leSJho1T59zFddyH3H9Mvqg3dycQnSrIzUVY7X0IiZaxAtZG2VJxMmuXwo49eg==
dependencies: dependencies:
"@opentelemetry/api-logs" "0.45.1" "@opentelemetry/api-logs" "0.45.0"
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.18.0"
"@opentelemetry/sdk-logs" "0.45.1" "@opentelemetry/sdk-logs" "0.45.0"
"@opentelemetry/sdk-metrics" "1.18.1" "@opentelemetry/sdk-metrics" "1.18.0"
"@opentelemetry/sdk-trace-base" "1.18.1" "@opentelemetry/sdk-trace-base" "1.18.0"
"@opentelemetry/resources@1.17.1": "@opentelemetry/resources@1.17.1":
version "1.17.1" version "1.17.1"
@@ -2260,29 +2158,29 @@
"@opentelemetry/core" "1.17.1" "@opentelemetry/core" "1.17.1"
"@opentelemetry/semantic-conventions" "1.17.1" "@opentelemetry/semantic-conventions" "1.17.1"
"@opentelemetry/resources@1.18.1": "@opentelemetry/resources@1.18.0":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.18.1.tgz#e27bdc4715bccc8cd4a72d4aca3995ad0a496fe7" resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.18.0.tgz#49c02edfd3d16524ead448288e5ed3bb8fa11391"
integrity sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA== integrity sha512-QXdqtTQRl3fVAMu5PSxIev73iaukww/7fW4656pF607ZMAXueRHfdxOBIpGrTvfnv9mcKC3ZwGsIb366JZ2LSQ==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/semantic-conventions" "1.18.1" "@opentelemetry/semantic-conventions" "1.18.0"
"@opentelemetry/sdk-logs@0.45.1": "@opentelemetry/sdk-logs@0.45.0":
version "0.45.1" version "0.45.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.45.1.tgz#d59a99147ab15eb36757932517dfc9a10e1645e9" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-logs/-/sdk-logs-0.45.0.tgz#9b4505199917eaf88b5c0fcaff9d046abe839162"
integrity sha512-z0RRgW4LeKEKnhXS4F/HnqB6+7gsy63YK47F4XAJYHs4s1KKg8XnQ2RkbuL31i/a9nXkylttYtvsT50CGr487g== integrity sha512-t9RA1hEa4NxYrL2VWL+f3EU8Gvdkv1aqPNmk27/vVHVfVFt2ym8hu4lqTf2hynWbzxmV1+bSMDq8Ar3LTrt0pA==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.18.0"
"@opentelemetry/sdk-metrics@1.18.1": "@opentelemetry/sdk-metrics@1.18.0":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.18.1.tgz#1dd334744a1e5d2eec27e9e9765c73cd2f43aef3" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.18.0.tgz#f84fffcabdb0e9504e3b219635c1099aabc9e207"
integrity sha512-TEFgeNFhdULBYiCoHbz31Y4PDsfjjxRp8Wmdp6ybLQZPqMNEb+dRq+XN8Xw3ivIgTaf9gYsomgV5ensX99RuEQ== integrity sha512-wK5zdNCo5cJvZog/lsqXCg9/Dt9UeNXQsskgqX8Yz+40t13Kb5CKFFkAMU8tNUxkvidHnD6G6sT6xeVCHQYe4A==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.18.0"
lodash.merge "^4.6.2" lodash.merge "^4.6.2"
"@opentelemetry/sdk-trace-base@1.17.1", "@opentelemetry/sdk-trace-base@^1.0.0": "@opentelemetry/sdk-trace-base@1.17.1", "@opentelemetry/sdk-trace-base@^1.0.0":
@@ -2294,14 +2192,14 @@
"@opentelemetry/resources" "1.17.1" "@opentelemetry/resources" "1.17.1"
"@opentelemetry/semantic-conventions" "1.17.1" "@opentelemetry/semantic-conventions" "1.17.1"
"@opentelemetry/sdk-trace-base@1.18.1": "@opentelemetry/sdk-trace-base@1.18.0":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz#256605d90b202002d5672305c66dbcf377132379" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.0.tgz#09e420d24465aaee8e21a8a9a3c4fa2e6f0fd08e"
integrity sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg== integrity sha512-OThpwn8JeU4q7exo0e8kQqs5BZGKQ9NNkes66RCs7yhUKShHEKQIYl/A3+xnGzMrbrtgogcf84brH8XD4ahjMg==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/resources" "1.18.1" "@opentelemetry/resources" "1.18.0"
"@opentelemetry/semantic-conventions" "1.18.1" "@opentelemetry/semantic-conventions" "1.18.0"
"@opentelemetry/sdk-trace-web@^1.15.0", "@opentelemetry/sdk-trace-web@^1.8.0": "@opentelemetry/sdk-trace-web@^1.15.0", "@opentelemetry/sdk-trace-web@^1.8.0":
version "1.17.1" version "1.17.1"
@@ -2313,23 +2211,23 @@
"@opentelemetry/semantic-conventions" "1.17.1" "@opentelemetry/semantic-conventions" "1.17.1"
"@opentelemetry/sdk-trace-web@^1.9.1": "@opentelemetry/sdk-trace-web@^1.9.1":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.18.1.tgz#31a765a920b1ff466b3b51a3885823f47b076486" resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.18.0.tgz#bf291a144382db068eabe06d7e29342c6ab82540"
integrity sha512-WN30vxy4NY8TqFWuICXaPXjBdy6A5kDhxOqp4NfhqXfpcWWT0GqSgv05Q42quWYOFgaulnmPRRJwxzAdhBliLQ== integrity sha512-ID/s4ajm8AoLFCLoLxweI6P1eg8qV6qi8ckPRH2eOwyyBQkQ/3oXyLo13muDqzdPzvBS/y/zYrXktOQ6btpHfA==
dependencies: dependencies:
"@opentelemetry/core" "1.18.1" "@opentelemetry/core" "1.18.0"
"@opentelemetry/sdk-trace-base" "1.18.1" "@opentelemetry/sdk-trace-base" "1.18.0"
"@opentelemetry/semantic-conventions" "1.18.1" "@opentelemetry/semantic-conventions" "1.18.0"
"@opentelemetry/semantic-conventions@1.17.1", "@opentelemetry/semantic-conventions@^1.0.0": "@opentelemetry/semantic-conventions@1.17.1", "@opentelemetry/semantic-conventions@^1.0.0":
version "1.17.1" version "1.17.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.17.1.tgz#93d219935e967fbb9aa0592cc96b2c0ec817a56f" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.17.1.tgz#93d219935e967fbb9aa0592cc96b2c0ec817a56f"
integrity sha512-xbR2U+2YjauIuo42qmE8XyJK6dYeRMLJuOlUP5SO4auET4VtOHOzgkRVOq+Ik18N+Xf3YPcqJs9dZMiDddz1eQ== integrity sha512-xbR2U+2YjauIuo42qmE8XyJK6dYeRMLJuOlUP5SO4auET4VtOHOzgkRVOq+Ik18N+Xf3YPcqJs9dZMiDddz1eQ==
"@opentelemetry/semantic-conventions@1.18.1": "@opentelemetry/semantic-conventions@1.18.0":
version "1.18.1" version "1.18.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz#8e47caf57a84b1dcc1722b2025693348cdf443b4" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.0.tgz#f38f457922f6e112569561c4515797a70eb5f9dd"
integrity sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA== integrity sha512-Bxtd+h2+rBv3XBHZaoXq133/hzgAQvbl2Kg5a9cG4ozfiUJHC9Xkblt7PrLc9CbzwWQpSxUxWoZJHXT3lUlkOw==
"@radix-ui/primitive@1.0.1": "@radix-ui/primitive@1.0.1":
version "1.0.1" version "1.0.1"
@@ -3365,10 +3263,10 @@
"@types/babel__template" "*" "@types/babel__template" "*"
"@types/babel__traverse" "*" "@types/babel__traverse" "*"
"@types/babel__core@^7.20.4": "@types/babel__core@^7.20.3":
version "7.20.5" version "7.20.3"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778"
integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==
dependencies: dependencies:
"@babel/parser" "^7.20.7" "@babel/parser" "^7.20.7"
"@babel/types" "^7.20.7" "@babel/types" "^7.20.7"
@@ -3406,19 +3304,19 @@
"@babel/types" "^7.20.7" "@babel/types" "^7.20.7"
"@types/caseless@*": "@types/caseless@*":
version "0.12.5" version "0.12.4"
resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.4.tgz#1326429a519cc077028150343fd502b04686bd6f"
integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== integrity sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g==
"@types/content-type@^1.1.5": "@types/content-type@^1.1.5":
version "1.1.8" version "1.1.7"
resolved "https://registry.yarnpkg.com/@types/content-type/-/content-type-1.1.8.tgz#319644d07ee6b4bfc734483008393b89b99f0219" resolved "https://registry.yarnpkg.com/@types/content-type/-/content-type-1.1.7.tgz#1e74d573f0d0bd5a6076ff44c6080212fca55a5b"
integrity sha512-1tBhmVUeso3+ahfyaKluXe38p+94lovUZdoVfQ3OnJo9uJC42JT7CBoN3k9HYhAae+GwiBYmHu+N9FZhOG+2Pg== integrity sha512-dSM/IQ1fgM1aSQ2PlHR4uWQGDjs9SY+/ilm228CIs9hwlyIfW+q5asThulBforWR6ktt/o8L8m6GPW/Fz1dk2A==
"@types/dom-screen-wake-lock@^1.0.1": "@types/dom-screen-wake-lock@^1.0.1":
version "1.0.3" version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/dom-screen-wake-lock/-/dom-screen-wake-lock-1.0.3.tgz#c3588a5f6f40fae957f9ce5be9bc4927a61bb9a0" resolved "https://registry.yarnpkg.com/@types/dom-screen-wake-lock/-/dom-screen-wake-lock-1.0.2.tgz#df0f77b1a653f66fba7ab38e962ff8440682fb61"
integrity sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw== integrity sha512-fgOIOXxoa3bHb4dPWrRA8xMCccrxRpqIOXBA0KAFR+/j11fYRGgJUh7qoyF38UAwn8//xwgUHKMvNKDfVGydAQ==
"@types/dompurify@^3.0.2": "@types/dompurify@^3.0.2":
version "3.0.5" version "3.0.5"
@@ -3445,9 +3343,9 @@
"@types/node" "*" "@types/node" "*"
"@types/grecaptcha@^3.0.4": "@types/grecaptcha@^3.0.4":
version "3.0.7" version "3.0.6"
resolved "https://registry.yarnpkg.com/@types/grecaptcha/-/grecaptcha-3.0.7.tgz#a74e987d4c550765fd805f091f62104c6c52a19a" resolved "https://registry.yarnpkg.com/@types/grecaptcha/-/grecaptcha-3.0.6.tgz#2b03c8afd0d9f0cc4a239a91ae57f11b329155f6"
integrity sha512-ah5GDQfsiK3dnkaCbYcDFZXkZCG3o90VRu9hzXHnSe4kACrRB1KUI/ZyWHvYmqm1W5Tl8B5YxxT98uGTlkbf2Q== integrity sha512-4BR/3v+pbiRt3cwRwibFnV4+LmuvRUjVVqgeCul9ODAyQhlPKE4tIIRJwZUeWWpmX8e9vo/xXuQTQl8FJPP7KA==
"@types/history@^4.7.11": "@types/history@^4.7.11":
version "4.7.11" version "4.7.11"
@@ -3455,28 +3353,28 @@
integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
version "2.0.6" version "2.0.5"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068"
integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==
"@types/istanbul-lib-report@*": "@types/istanbul-lib-report@*":
version "3.0.3" version "3.0.2"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1"
integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==
dependencies: dependencies:
"@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-coverage" "*"
"@types/istanbul-reports@^3.0.0": "@types/istanbul-reports@^3.0.0":
version "3.0.4" version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7"
integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==
dependencies: dependencies:
"@types/istanbul-lib-report" "*" "@types/istanbul-lib-report" "*"
"@types/jest@^29.5.5": "@types/jest@^29.5.5":
version "29.5.8" version "29.5.7"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.8.tgz#ed5c256fe2bc7c38b1915ee5ef1ff24a3427e120" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.7.tgz#2c0dafe2715dd958a455bc10e2ec3e1ec47b5036"
integrity sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g== integrity sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==
dependencies: dependencies:
expect "^29.0.0" expect "^29.0.0"
pretty-format "^29.0.0" pretty-format "^29.0.0"
@@ -3506,9 +3404,9 @@
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
"@types/lodash@^4.14.199": "@types/lodash@^4.14.199":
version "4.14.202" version "4.14.200"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149"
integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==
"@types/minimatch@^3.0.3": "@types/minimatch@^3.0.3":
version "3.0.5" version "3.0.5"
@@ -3516,9 +3414,9 @@
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/node@*", "@types/node@^20.0.0": "@types/node@*", "@types/node@^20.0.0":
version "20.10.0" version "20.8.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.10.tgz#a5448b895c753ae929c26ce85cab557c6d4a365e"
integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== integrity sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==
dependencies: dependencies:
undici-types "~5.26.4" undici-types "~5.26.4"
@@ -3571,9 +3469,9 @@
csstype "^3.0.2" csstype "^3.0.2"
"@types/request@^2.48.8": "@types/request@^2.48.8":
version "2.48.12" version "2.48.11"
resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.12.tgz#0f590f615a10f87da18e9790ac94c29ec4c5ef30" resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.11.tgz#04b597ea308418422f7901c9a52b24967a2c4ed2"
integrity sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw== integrity sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==
dependencies: dependencies:
"@types/caseless" "*" "@types/caseless" "*"
"@types/node" "*" "@types/node" "*"
@@ -3606,9 +3504,9 @@
integrity sha512-hsughtxFsdJ9+Gxd/qH8zHE+KT6YEAxx9hJLoSXhxTBKHMQ2NMhN23fRJ75M9RRn2hDMNn13H3gS1EktA9VgDA== integrity sha512-hsughtxFsdJ9+Gxd/qH8zHE+KT6YEAxx9hJLoSXhxTBKHMQ2NMhN23fRJ75M9RRn2hDMNn13H3gS1EktA9VgDA==
"@types/stack-utils@^2.0.0": "@types/stack-utils@^2.0.0":
version "2.0.3" version "2.0.2"
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b"
integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==
"@types/symlink-or-copy@^1.2.0": "@types/symlink-or-copy@^1.2.0":
version "1.2.1" version "1.2.1"
@@ -3616,9 +3514,9 @@
integrity sha512-8LQKxlJ8zXQ5U0wFXTSBXLHg8+oBbLMJXEC6vOqhL+iz8EfVvSxfdwtvq8ufkT9pumab0ntnvYXQBF/+cxzl9w== integrity sha512-8LQKxlJ8zXQ5U0wFXTSBXLHg8+oBbLMJXEC6vOqhL+iz8EfVvSxfdwtvq8ufkT9pumab0ntnvYXQBF/+cxzl9w==
"@types/tough-cookie@*": "@types/tough-cookie@*":
version "4.0.4" version "4.0.3"
resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.4.tgz#cf2f0c7c51b985b6afecea73eb2cd65421ecb717" resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90"
integrity sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A== integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==
"@types/trusted-types@*": "@types/trusted-types@*":
version "2.0.5" version "2.0.5"
@@ -3626,32 +3524,32 @@
integrity sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA== integrity sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==
"@types/uuid@9": "@types/uuid@9":
version "9.0.7" version "9.0.6"
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.7.tgz#b14cebc75455eeeb160d5fe23c2fcc0c64f724d8" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.6.tgz#c91ae743d8344a54b2b0c691195f5ff5265f6dfb"
integrity sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g== integrity sha512-BT2Krtx4xaO6iwzwMFUYvWBWkV2pr37zD68Vmp1CDV196MzczBRxuEpD6Pr395HAgebC/co7hOphs53r8V7jew==
"@types/yargs-parser@*": "@types/yargs-parser@*":
version "21.0.3" version "21.0.2"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b"
integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==
"@types/yargs@^17.0.8": "@types/yargs@^17.0.8":
version "17.0.31" version "17.0.29"
resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.31.tgz#8fd0089803fd55d8a285895a18b88cb71a99683c" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf"
integrity sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg== integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==
dependencies: dependencies:
"@types/yargs-parser" "*" "@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^6.1.0": "@typescript-eslint/eslint-plugin@^6.1.0":
version "6.10.0" version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz#cfe2bd34e26d2289212946b96ab19dcad64b661a" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz#d8ce497dc0ed42066e195c8ecc40d45c7b1254f4"
integrity sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg== integrity sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==
dependencies: dependencies:
"@eslint-community/regexpp" "^4.5.1" "@eslint-community/regexpp" "^4.5.1"
"@typescript-eslint/scope-manager" "6.10.0" "@typescript-eslint/scope-manager" "6.9.1"
"@typescript-eslint/type-utils" "6.10.0" "@typescript-eslint/type-utils" "6.9.1"
"@typescript-eslint/utils" "6.10.0" "@typescript-eslint/utils" "6.9.1"
"@typescript-eslint/visitor-keys" "6.10.0" "@typescript-eslint/visitor-keys" "6.9.1"
debug "^4.3.4" debug "^4.3.4"
graphemer "^1.4.0" graphemer "^1.4.0"
ignore "^5.2.4" ignore "^5.2.4"
@@ -3660,71 +3558,71 @@
ts-api-utils "^1.0.1" ts-api-utils "^1.0.1"
"@typescript-eslint/parser@^6.1.0": "@typescript-eslint/parser@^6.1.0":
version "6.10.0" version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.10.0.tgz#578af79ae7273193b0b6b61a742a2bc8e02f875a" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.9.1.tgz#4f685f672f8b9580beb38d5fb99d52fc3e34f7a3"
integrity sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog== integrity sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==
dependencies: dependencies:
"@typescript-eslint/scope-manager" "6.10.0" "@typescript-eslint/scope-manager" "6.9.1"
"@typescript-eslint/types" "6.10.0" "@typescript-eslint/types" "6.9.1"
"@typescript-eslint/typescript-estree" "6.10.0" "@typescript-eslint/typescript-estree" "6.9.1"
"@typescript-eslint/visitor-keys" "6.10.0" "@typescript-eslint/visitor-keys" "6.9.1"
debug "^4.3.4" debug "^4.3.4"
"@typescript-eslint/scope-manager@6.10.0": "@typescript-eslint/scope-manager@6.9.1":
version "6.10.0" version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz#b0276118b13d16f72809e3cecc86a72c93708540" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz#e96afeb9a68ad1cd816dba233351f61e13956b75"
integrity sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg== integrity sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==
dependencies: dependencies:
"@typescript-eslint/types" "6.10.0" "@typescript-eslint/types" "6.9.1"
"@typescript-eslint/visitor-keys" "6.10.0" "@typescript-eslint/visitor-keys" "6.9.1"
"@typescript-eslint/type-utils@6.10.0": "@typescript-eslint/type-utils@6.9.1":
version "6.10.0" version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz#1007faede067c78bdbcef2e8abb31437e163e2e1" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz#efd5db20ed35a74d3c7d8fba51b830ecba09ce32"
integrity sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg== integrity sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==
dependencies: dependencies:
"@typescript-eslint/typescript-estree" "6.10.0" "@typescript-eslint/typescript-estree" "6.9.1"
"@typescript-eslint/utils" "6.10.0" "@typescript-eslint/utils" "6.9.1"
debug "^4.3.4" debug "^4.3.4"
ts-api-utils "^1.0.1" ts-api-utils "^1.0.1"
"@typescript-eslint/types@6.10.0": "@typescript-eslint/types@6.9.1":
version "6.10.0" version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.10.0.tgz#f4f0a84aeb2ac546f21a66c6e0da92420e921367" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.9.1.tgz#a6cfc20db0fcedcb2f397ea728ef583e0ee72459"
integrity sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg== integrity sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==
"@typescript-eslint/typescript-estree@6.10.0": "@typescript-eslint/typescript-estree@6.9.1":
version "6.10.0" version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz#667381eed6f723a1a8ad7590a31f312e31e07697" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz#8c77910a49a04f0607ba94d78772da07dab275ad"
integrity sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg== integrity sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==
dependencies: dependencies:
"@typescript-eslint/types" "6.10.0" "@typescript-eslint/types" "6.9.1"
"@typescript-eslint/visitor-keys" "6.10.0" "@typescript-eslint/visitor-keys" "6.9.1"
debug "^4.3.4" debug "^4.3.4"
globby "^11.1.0" globby "^11.1.0"
is-glob "^4.0.3" is-glob "^4.0.3"
semver "^7.5.4" semver "^7.5.4"
ts-api-utils "^1.0.1" ts-api-utils "^1.0.1"
"@typescript-eslint/utils@6.10.0": "@typescript-eslint/utils@6.9.1":
version "6.10.0" version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.10.0.tgz#4d76062d94413c30e402c9b0df8c14aef8d77336" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.9.1.tgz#763da41281ef0d16974517b5f0d02d85897a1c1e"
integrity sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg== integrity sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==
dependencies: dependencies:
"@eslint-community/eslint-utils" "^4.4.0" "@eslint-community/eslint-utils" "^4.4.0"
"@types/json-schema" "^7.0.12" "@types/json-schema" "^7.0.12"
"@types/semver" "^7.5.0" "@types/semver" "^7.5.0"
"@typescript-eslint/scope-manager" "6.10.0" "@typescript-eslint/scope-manager" "6.9.1"
"@typescript-eslint/types" "6.10.0" "@typescript-eslint/types" "6.9.1"
"@typescript-eslint/typescript-estree" "6.10.0" "@typescript-eslint/typescript-estree" "6.9.1"
semver "^7.5.4" semver "^7.5.4"
"@typescript-eslint/visitor-keys@6.10.0": "@typescript-eslint/visitor-keys@6.9.1":
version "6.10.0" version "6.9.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz#b9eaf855a1ac7e95633ae1073af43d451e8f84e3" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz#6753a9225a0ba00459b15d6456b9c2780b66707d"
integrity sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg== integrity sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==
dependencies: dependencies:
"@typescript-eslint/types" "6.10.0" "@typescript-eslint/types" "6.9.1"
eslint-visitor-keys "^3.4.1" eslint-visitor-keys "^3.4.1"
"@ungap/structured-clone@^1.2.0": "@ungap/structured-clone@^1.2.0":
@@ -3744,10 +3642,10 @@
dependencies: dependencies:
"@use-gesture/core" "10.3.0" "@use-gesture/core" "10.3.0"
"@vector-im/compound-design-tokens@^0.1.0": "@vector-im/compound-design-tokens@^0.0.7":
version "0.1.0" version "0.0.7"
resolved "https://registry.yarnpkg.com/@vector-im/compound-design-tokens/-/compound-design-tokens-0.1.0.tgz#1a574fba872ff93b1de8490f475e30b922cd02a2" resolved "https://registry.yarnpkg.com/@vector-im/compound-design-tokens/-/compound-design-tokens-0.0.7.tgz#b0716dd4782dd95900491e45b003b58f93748024"
integrity sha512-vnDrd1CPPR7CwQLss/JnIE1ga6QwmCkhgBvXm1huMhCs7nIiqf90Sbgc0WugbHNaRXGEEhMVGrE69DaQIUcqOA== integrity sha512-RCQc6qr+s8cp4xKbNi/I3OL43uPCH+N4L9vYf0r+qwRy4WCKdI4QL0TBTV4bOo8hF49z8e+BgU5ZIu5TVQXNMQ==
dependencies: dependencies:
svg2vectordrawable "^2.9.1" svg2vectordrawable "^2.9.1"
@@ -3763,19 +3661,19 @@
graphemer "^1.4.0" graphemer "^1.4.0"
"@vitejs/plugin-basic-ssl@^1.0.1": "@vitejs/plugin-basic-ssl@^1.0.1":
version "1.0.2" version "1.0.1"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.2.tgz#bac6553842b215f17b052d27c82e2b2ef29236dc" resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz#48c46eab21e0730921986ce742563ae83fe7fe34"
integrity sha512-DKHKVtpI+eA5fvObVgQ3QtTGU70CcCnedalzqmGSR050AzKZMdUzgC8KmlOneHWH8dF2hJ3wkC9+8FDVAaDRCw== integrity sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==
"@vitejs/plugin-react@^4.0.1": "@vitejs/plugin-react@^4.0.1":
version "4.2.0" version "4.1.1"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.2.0.tgz#d71352b1a443c09c7aae8f278dd071ab3d9d8490" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz#a10254dc76778027407d01b6ddbca53b23852a72"
integrity sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ== integrity sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==
dependencies: dependencies:
"@babel/core" "^7.23.3" "@babel/core" "^7.23.2"
"@babel/plugin-transform-react-jsx-self" "^7.23.3" "@babel/plugin-transform-react-jsx-self" "^7.22.5"
"@babel/plugin-transform-react-jsx-source" "^7.23.3" "@babel/plugin-transform-react-jsx-source" "^7.22.5"
"@types/babel__core" "^7.20.4" "@types/babel__core" "^7.20.3"
react-refresh "^0.14.0" react-refresh "^0.14.0"
abab@^2.0.6: abab@^2.0.6:
@@ -5497,9 +5395,9 @@ fast-fifo@^1.1.0:
integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
fast-glob@^3.2.9: fast-glob@^3.2.9:
version "3.3.2" version "3.3.1"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
dependencies: dependencies:
"@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3" "@nodelib/fs.walk" "^1.2.3"
@@ -5797,6 +5695,11 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4:
once "^1.3.0" once "^1.3.0"
path-is-absolute "^1.0.0" path-is-absolute "^1.0.0"
global-tld-list@^0.0.1139:
version "0.0.1139"
resolved "https://registry.yarnpkg.com/global-tld-list/-/global-tld-list-0.0.1139.tgz#70400a3f3ccac1a19a8184274a1b117bc8a27969"
integrity sha512-TCWjAwHPzFV6zbQ5jnJvJTctesHGJr9BppxivRuIxTiIFUzaxy1F0674cxjoJecW5s8V32Q5i35dBFqvAy7eGQ==
globals@^11.1.0: globals@^11.1.0:
version "11.12.0" version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@@ -7068,16 +6971,15 @@ lines-and-columns@^1.1.6:
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
livekit-client@^1.12.3: livekit-client@^1.12.3:
version "1.15.2" version "1.14.4"
resolved "https://registry.yarnpkg.com/livekit-client/-/livekit-client-1.15.2.tgz#3b48931bf15213f78b832c786c584e8f43c4ac5f" resolved "https://registry.yarnpkg.com/livekit-client/-/livekit-client-1.14.4.tgz#7b1820bf622ba69517dea845ce475f6ea4aa97b8"
integrity sha512-TmdbPU5Dr6z0xqrg9Cb4NhT7epskYKxpogCBUOjgP8xKztPMW/rAFeFZR4MkYZD9d+2y6C5maB5a1ODsU6YaNA== integrity sha512-sXNH+qhqkmXeCVsw3hcEbUsh9QfguBIGgM3glM0v0+YW4C2LdeGWD4pQBLR7USbkwbbVMEHDmqr/iY6XvEIoeQ==
dependencies: dependencies:
"@bufbuild/protobuf" "^1.3.0" "@bufbuild/protobuf" "^1.3.0"
events "^3.3.0" events "^3.3.0"
loglevel "^1.8.0" loglevel "^1.8.0"
sdp-transform "^2.14.1" sdp-transform "^2.14.1"
ts-debounce "^4.0.0" ts-debounce "^4.0.0"
tslib "2.6.2"
typed-emitter "^2.1.0" typed-emitter "^2.1.0"
webrtc-adapter "^8.1.1" webrtc-adapter "^8.1.1"
@@ -7199,12 +7101,12 @@ matrix-events-sdk@0.0.1:
resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd"
integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==
"matrix-js-sdk@github:matrix-org/matrix-js-sdk#eca651c0c2ff0600bdae0bb6aba43485e48b69d5": "matrix-js-sdk@github:matrix-org/matrix-js-sdk#4ce837b20e638a185f9002b2388fbaf48975ee6e":
version "30.0.1" version "29.0.0"
resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/eca651c0c2ff0600bdae0bb6aba43485e48b69d5" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/4ce837b20e638a185f9002b2388fbaf48975ee6e"
dependencies: dependencies:
"@babel/runtime" "^7.12.5" "@babel/runtime" "^7.12.5"
"@matrix-org/matrix-sdk-crypto-wasm" "^3.0.1" "@matrix-org/matrix-sdk-crypto-wasm" "^1.2.3-alpha.0"
another-json "^0.2.0" another-json "^0.2.0"
bs58 "^5.0.0" bs58 "^5.0.0"
content-type "^1.0.4" content-type "^1.0.4"
@@ -7990,9 +7892,9 @@ postcss@^8.4.27:
source-map-js "^1.0.2" source-map-js "^1.0.2"
posthog-js@^1.29.0: posthog-js@^1.29.0:
version "1.88.3" version "1.88.1"
resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.88.3.tgz#5d4a6432eb10d60377073ee7ff52030df44dd021" resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.88.1.tgz#ab81f21ec158a9c57be0e696744a9c9f6967ba3b"
integrity sha512-6BLFTSWK8GrWfl5j9Ib+2w8YZKZfz2GqLMS7q4I93hbkknEMH5f1KaKDqPsGmGOM3SLQV0Cwd6nuCdFdqANS1w== integrity sha512-+8kFFU5KIcFSm8zB3tX8l0GSPyq/OtMtdrS9dYpMJk6nsEwXvOjkwFEpSrYzL5eGEpTPdbM65M52HvMqqsjpXw==
dependencies: dependencies:
fflate "^0.4.1" fflate "^0.4.1"
@@ -9119,7 +9021,7 @@ tsconfig-paths@^3.14.2:
minimist "^1.2.6" minimist "^1.2.6"
strip-bom "^3.0.0" strip-bom "^3.0.0"
tslib@2.6.2, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0:
version "2.6.2" version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==